RT#38217: Send email when logging conditions are met
[freeside.git] / FS / FS / Schema.pm
1 package FS::Schema;
2
3 use vars qw(@ISA @EXPORT_OK $DEBUG $setup_hack %dbdef_cache);
4 use subs qw(reload_dbdef);
5 use Exporter;
6 use DBIx::DBSchema 0.44; #for foreign keys with MATCH / ON DELETE/UPDATE
7 use DBIx::DBSchema::Table;
8 use DBIx::DBSchema::Column;
9 use DBIx::DBSchema::Index;
10 use DBIx::DBSchema::ForeignKey;
11 #can't use this yet, dependency bs #use FS::Conf;
12
13 @ISA = qw(Exporter);
14 @EXPORT_OK = qw( dbdef dbdef_dist reload_dbdef );
15
16 $DEBUG = 0;
17 $me = '[FS::Schema]';
18
19 =head1 NAME
20
21 FS::Schema - Freeside database schema
22
23 =head1 SYNOPSYS
24
25     use FS::Schema qw(dbdef dbdef_dist reload_dbdef);
26
27     $dbdef = reload_dbdef;
28     $dbdef = reload_dbdef "/non/standard/filename";
29     $dbdef = dbdef;
30     $dbdef_dist = dbdef_dist;
31
32 =head1 DESCRIPTION
33
34 This class represents the database schema.
35
36 =head1 METHODS
37
38 =over 4
39
40 =item reload_dbdef([FILENAME])
41
42 Load a database definition (see L<DBIx::DBSchema>), optionally from a
43 non-default filename.  This command is executed at startup unless
44 I<$FS::Schema::setup_hack> is true.  Returns a DBIx::DBSchema object.
45
46 =cut
47
48 sub reload_dbdef {
49   my $file = shift;
50
51   unless ( exists $dbdef_cache{$file} ) {
52     warn "[debug]$me loading dbdef for $file\n" if $DEBUG;
53     $dbdef_cache{$file} = DBIx::DBSchema->load( $file )
54       or die "can't load database schema from $file: $DBIx::DBSchema::errstr\n";
55   } else {
56     warn "[debug]$me re-using cached dbdef for $file\n" if $DEBUG;
57   }
58   $dbdef = $dbdef_cache{$file};
59 }
60
61 =item dbdef
62
63 Returns the current database definition (represents the current database,
64 assuming it is up-to-date).  See L<DBIx::DBSchema>.
65
66 =cut
67
68 sub dbdef { $dbdef; }
69
70 =item dbdef_dist [ DATASRC ]
71
72 Returns the current canoical database definition as defined in this file.
73
74 Optionally, pass a DBI data source to enable syntax specific to that database.
75 Currently, this enables "ENGINE=InnoDB" for MySQL databases.
76
77 =cut
78
79 sub dbdef_dist {
80   my $datasrc = @_ && !ref($_[0]) ? shift : '';
81   my $opt = @_ ? shift : {};
82   
83   my $local_options = '';
84   if ( $datasrc =~ /^dbi:mysql/i ) {
85     $local_options = 'ENGINE=InnoDB';
86   }
87
88   ###
89   # create a dbdef object from the old data structure
90   ###
91
92   my $tables_hashref = tables_hashref();
93
94   #turn it into objects
95   my $dbdef = new DBIx::DBSchema map {  
96
97     my $tablename = $_;
98     my $indexnum = 1;
99
100     my @columns;
101     while (@{$tables_hashref->{$tablename}{'columns'}}) {
102       #my($name, $type, $null, $length, $default, $local) =
103       my @coldef = 
104         splice @{$tables_hashref->{$tablename}{'columns'}}, 0, 6;
105       my %hash = map { $_ => shift @coldef }
106                      qw( name type null length default local );
107
108       #can be removed once we depend on DBIx::DBSchema 0.39;
109       $hash{'type'} = 'LONGTEXT'
110         if $hash{'type'} =~ /^TEXT$/i && $datasrc =~ /^dbi:mysql/i;
111
112       unless ( defined $hash{'default'} ) {
113         warn "$tablename:\n".
114              join('', map "$_ => $hash{$_}\n", keys %hash) ;# $stop = <STDIN>;
115       }
116
117       push @columns, new DBIx::DBSchema::Column ( \%hash );
118     }
119
120     #false laziness w/sub indices in DBIx::DBSchema::DBD (well, sorta)
121     #and sub sql_create_table in DBIx::DBSchema::Table (slighty more?)
122     my $unique = $tables_hashref->{$tablename}{'unique'};
123     warn "missing index for $tablename\n" unless defined $tables_hashref->{$tablename}{'index'};
124     my @index  = @{ $tables_hashref->{$tablename}{'index'} };
125
126     # kludge to avoid avoid "BLOB/TEXT column 'statustext' used in key
127     #  specification without a key length".
128     # better solution: teach DBIx::DBSchema to specify a default length for
129     #  MySQL indices on text columns, or just to support an index length at all
130     #  so we can pass something in.
131     # best solution: eliminate need for this index in cust_main::retry_realtime
132     @index = grep { @{$_}[0] ne 'statustext' } @index
133       if $datasrc =~ /^dbi:mysql/i;
134
135     my @indices = ();
136     push @indices, map {
137                          DBIx::DBSchema::Index->new({
138                            'name'    => $tablename. $indexnum++,
139                            'unique'  => 1,
140                            'columns' => $_,
141                          });
142                        }
143                        @$unique;
144     push @indices, map {
145                          DBIx::DBSchema::Index->new({
146                            'name'    => $tablename. $indexnum++,
147                            'unique'  => 0,
148                            'columns' => $_,
149                          });
150                        }
151                        @index;
152
153     my @foreign_keys =
154       map DBIx::DBSchema::ForeignKey->new($_),
155         @{ $tables_hashref->{$tablename}{'foreign_keys'} || [] };
156
157     DBIx::DBSchema::Table->new({
158       name          => $tablename,
159       primary_key   => $tables_hashref->{$tablename}{'primary_key'},
160       columns       => \@columns,
161       indices       => \@indices,
162       foreign_keys  => \@foreign_keys,
163       local_options => $local_options,
164     });
165
166   } keys %$tables_hashref;
167
168   if ( $DEBUG ) {
169     warn "[debug]$me initial dbdef_dist created ($dbdef) with tables:\n";
170     warn "[debug]$me   $_\n" foreach $dbdef->tables;
171   }
172   
173   #add radius attributes to svc_acct
174   #
175   #my($svc_acct)=$dbdef->table('svc_acct');
176   # 
177   #my($attribute);
178   #foreach $attribute (@attributes) {
179   #  $svc_acct->addcolumn ( new DBIx::DBSchema::Column (
180   #    'radius_'. $attribute,
181   #    'varchar',
182   #    'NULL',
183   #    $char_d,
184   #  ));
185   #}
186   # 
187   #foreach $attribute (@check_attributes) {
188   #  $svc_acct->addcolumn( new DBIx::DBSchema::Column (
189   #    'rc_'. $attribute,
190   #    'varchar',
191   #    'NULL',
192   #    $char_d,
193   #  ));
194   #}
195
196   my $tables_hashref_torrus = tables_hashref_torrus();
197
198   #create history tables
199   foreach my $table (
200     grep {    ! /^(clientapi|access_user)_session/
201            && ! /^h_/
202            && ! /^log(_context)?$/
203            && ! /^legacy_cust_history$/
204            && ( ! /^queue(_arg|_depend|_stat)?$/ || ! $opt->{'queue-no_history'} )
205            && ! $tables_hashref_torrus->{$_}
206            && ! /^cacti_page$/
207            && ! /^template_image$/
208          }
209       $dbdef->tables
210   ) {
211     my $tableobj = $dbdef->table($table)
212       or die "unknown table $table";
213
214     my %h_indices = ();
215
216     unless ( $table eq 'cust_event' || $table eq 'cdr' ) { #others?
217
218       my %indices = $tableobj->indices;
219     
220       %h_indices = map { 
221                          ( "h_$_" =>
222                              DBIx::DBSchema::Index->new({
223                                'name'    => 'h_'. $indices{$_}->name,
224                                'unique'  => 0,
225                                'columns' => [ @{$indices{$_}->columns} ],
226                              })
227                          );
228                        }
229                        keys %indices;
230
231       $h_indices{"h_${table}_srckey"} =
232         DBIx::DBSchema::Index->new({
233           'name'    => "h_${table}_srckey",
234           'unique'  => 0,
235           'columns' => [ 'history_action', #right?
236                          $tableobj->primary_key,
237                        ],
238         });
239
240       $h_indices{"h_${table}_srckey2"} =
241          DBIx::DBSchema::Index->new({
242            'name'    => "h_${table}_srckey2",
243            'unique'  => 0,
244            'columns' => [ 'history_date',
245                           $tableobj->primary_key,
246                         ],
247          });
248
249         #necessary for queries that want to look at *who* made changes
250       $h_indices{"h_${table}_usernum"} =
251          DBIx::DBSchema::Index->new({
252            'name'    => "h_${table}_usernum",
253            'unique'  => 0,
254            'columns' => [ 'history_usernum'],
255          });
256
257         # necessary because of the evil OR username for older data, be really nice if everything was just migrated to usernum and we could drop username
258         # This will not be helpful to mysql, but postgres smartly does a bitmap across both indexes, mysql will just use one
259
260       $h_indices{"h_${table}_user"} =
261          DBIx::DBSchema::Index->new({
262            'name'    => "h_${table}_user",
263            'unique'  => 0,
264            'columns' => [ 'history_user'],
265          });
266     }
267
268     my $primary_key_col = $tableobj->column($tableobj->primary_key)
269       or die "$table: primary key declared as ". $tableobj->primary_key.
270              ", but no column of that name\n";
271
272     my $historynum_type = ( $tableobj->column($tableobj->primary_key)->type
273                               =~ /^(bigserial|bigint|int8)$/i
274                                 ? 'bigserial'
275                                 : 'serial'
276                           );
277
278     my $h_tableobj = DBIx::DBSchema::Table->new( {
279       'name'          => "h_$table",
280       'primary_key'   => 'historynum',
281       'indices'       => \%h_indices,
282       'local_options' => $local_options,
283       'columns'       => [
284           DBIx::DBSchema::Column->new( {
285             'name'    => 'historynum',
286             'type'    => $historynum_type,
287             'null'    => 'NOT NULL',
288             'length'  => '',
289             'default' => '',
290             'local'   => '',
291           } ),
292           DBIx::DBSchema::Column->new( {
293             'name'    => 'history_date',
294             'type'    => 'int',
295             'null'    => 'NULL',
296             'length'  => '',
297             'default' => '',
298             'local'   => '',
299           } ),
300           DBIx::DBSchema::Column->new( {
301             'name'    => 'history_user',
302             'type'    => 'varchar',
303             'null'    => 'NULL',
304             'length'  => '80',
305             'default' => '',
306             'local'   => '',
307           } ),
308           DBIx::DBSchema::Column->new( {
309             'name'    => 'history_usernum',
310             'type'    => 'int',
311             'null'    => 'NULL',
312             'length'  => '',
313             'default' => '',
314             'local'   => '',
315           } ),
316           DBIx::DBSchema::Column->new( {
317             'name'    => 'history_action',
318             'type'    => 'varchar',
319             'null'    => 'NOT NULL',
320             'length'  => '80',
321             'default' => '',
322             'local'   => '',
323           } ),
324           map {
325             my $column = $tableobj->column($_);
326     
327             #clone so as to not disturb the original
328             $column = DBIx::DBSchema::Column->new( {
329               map { $_ => $column->$_() }
330                 qw( name type null length default local )
331             } );
332     
333             if ( $column->type =~ /^(\w*)SERIAL$/i ) {
334               $column->type(uc($1).'INT');
335               $column->null('NULL');
336             }
337             #$column->default('')
338             #  if $column->default =~ /^nextval\(/i;
339             #( my $local = $column->local ) =~ s/AUTO_INCREMENT//i;
340             #$column->local($local);
341             $column;
342           } $tableobj->columns
343       ],
344     } );
345     $dbdef->addtable($h_tableobj);
346   }
347
348   if ( $datasrc =~ /^dbi:mysql/i ) {
349
350     my $dup_lock_table = DBIx::DBSchema::Table->new( {
351       'name'          => 'duplicate_lock',
352       'primary_key'   => 'duplocknum',
353       'local_options' => $local_options,
354       'columns'       => [
355         DBIx::DBSchema::Column->new( {
356           'name'    => 'duplocknum',
357           'type'    => 'serial',
358           'null'    => 'NOT NULL',
359           'length'  => '',
360           'default' => '',
361           'local'   => '',
362         } ),
363         DBIx::DBSchema::Column->new( {
364           'name'    => 'lockname',
365           'type'    => 'varchar',
366           'null'    => 'NOT NULL',
367           'length'  => '80',
368           'default' => '',
369           'local'   => '',
370         } ),
371       ],
372       'indices' => { 'duplicate_lock1' =>
373                        DBIx::DBSchema::Index->new({
374                          'name'    => 'duplicate_lock1',
375                          'unique'  => 1,
376                          'columns' => [ 'lockname' ],
377                        })
378                    },
379     } );
380
381     $dbdef->addtable($dup_lock_table);
382
383   }
384
385   $dbdef;
386
387 }
388
389 #torrus tables http://torrus.org/reporting_setup.pod.html#create_sql_tables
390 sub tables_hashref_torrus {
391
392   return {
393
394     # Collector export table. It usually grows at several megabytes
395     # per month, and is updated every 5 minutes
396     'srvexport' => {
397       'columns' => [
398         'id',         'serial', '', '', '', '',
399         'srv_date',     'date', '', '', '', '',#date and time of the data sample
400         'srv_time',     'time', '', '', '', '',
401         'serviceid', 'varchar', '', 64, '', '',#unique service ID per counter
402         'value',     'double precision', '', '', '', '',#collected rate or gauge value
403         'intvl', 'int', '', '', '', '', # collection interval - for counter volume calculation
404       ],
405       'primary_key' => 'id',
406       'unique' => [],
407       'index'  => [ ['srv_date'], ['srv_date', 'srv_time'], ['serviceid'], ],
408     },
409
410     #Tables for (currently monthly only) report contents.
411     #These are updated usually once per month, and read at the moment of
412     #rendering the report output (HTML now, PDF or XML or Excel or whatever
413     #in the future)
414
415     #DBIx::Sequence backend, theplatform-independent inplementation
416     #of sequences
417     'dbix_sequence_state' => {
418       'columns' => [
419         'id',       'serial', '', '', '', '',
420         'dataset', 'varchar', '', 50, '', '',
421         'state_id',    'int', '', '', '', '',
422       ],
423       'primary_key' => 'id',
424       #CONSTRAINT pk_dbix_sequence PRIMARY KEY (dataset, state_id)
425       'unique' => [ [ 'dataset', 'state_id' ], ],
426       'index'  => [],
427     },
428
429     'dbix_sequence_release' => {
430       'columns' => [
431         'id',       'serial', '', '', '', '',
432         'dataset', 'varchar', '', 50, '', '',
433         'released_id', 'int', '', '', '', '',
434       ],
435       'primary_key' => 'id',
436       #CONSTRAINT pk_dbi_release PRIMARY KEY (dataset, released_id)
437       'unique' => [ [ 'dataset', 'released_id', ] ],
438       'index'  => [],
439     },
440
441     #Each report is characterized by name, date and time.
442     #Monthly reports are automatically assigned 00:00 of the 1st day
443     #in the month. The report contains fields for every service ID
444     #defined across all datasource trees.
445     'reports' => {
446       'columns' => [
447         'id',          'serial', '', '', '', '',
448         'rep_date',      'date', '', '', '', '',#Start date of the report
449         'rep_time',      'time', '', '', '', '',#Start time of the report
450         'reportname', 'varchar', '', 64, '', '',#Report name, such as
451                                                 # MonthlyUsage
452         'iscomplete',     'int', '', '', '', '',#0 when the report is in
453                                                 # progress, 1 when it is ready
454       ],
455       'primary_key' => 'id',
456       'unique' => [ [ qw(rep_date rep_time reportname) ] ],
457       'index'  => [ [ 'rep_date' ] ],
458     },
459
460     #Each report contains fields. For each service ID,
461     #the report may contain several fields for various statistics.
462     #Each field contains information about the units of the value it
463     #contains
464     'reportfields' => {
465       'columns' => [
466         'id',              'serial',     '', '',    '', '',
467         'rep_id',             'int', 'NULL', '',    '', '',
468         'name',           'varchar',     '', 64,    '', '',#name of the field,
469                                                            # such as AVG or MAX
470         'serviceid',      'varchar',     '', 64,    '', '',#service ID
471         'value', 'double precision',     '', '',    '', '',#Numeric value
472         'units',          'varchar',     '', 64, \"''", '',#Units, such as bytes
473                                                            # or Mbps
474       ],
475       'primary_key', => 'id',
476       'unique' => [ [ qw(rep_id name serviceid) ] ],
477       'index'  => [],
478     },
479
480   };
481
482 }
483
484 sub tables_hashref {
485
486   my $char_d = 80; #default maxlength for text fields
487
488   #my(@date_type)  = ( 'timestamp', '', ''     );
489   my @date_type = ( 'int', 'NULL', ''     );
490   my @perl_type = ( 'text', 'NULL', ''  ); 
491   my @money_type = ( 'decimal',   '', '10,2' );
492   my @money_typen = ( 'decimal',   'NULL', '10,2' );
493   my @taxrate_type  = ( 'decimal',   '',     '14,8' ); # requires pg 8 for 
494   my @taxrate_typen = ( 'decimal',   'NULL', '14,8' ); # fs-upgrade to work
495
496   my $username_len = 64; #usernamemax config file
497
498     # name type nullability length default local
499
500   return {
501
502     'agent' => {
503       'columns' => [
504         'agentnum',          'serial',    '',       '', '', '', 
505         'agent',            'varchar',    '',  $char_d, '', '', 
506         'typenum',              'int',    '',       '', '', '', 
507         'ticketing_queueid',    'int', 'NULL',      '', '', '', 
508         'invoice_template', 'varchar', 'NULL', $char_d, '', '',
509         'agent_custnum',        'int', 'NULL',      '', '', '',
510         'disabled',            'char', 'NULL',       1, '', '', 
511         'username',         'varchar', 'NULL', $char_d, '', '',
512         '_password',        'varchar', 'NULL', $char_d, '', '',
513         'freq',              'int', 'NULL', '', '', '', #deprecated (never used)
514         'prog',                     @perl_type, '', '', #deprecated (never used)
515       ],
516       'primary_key'  => 'agentnum',
517       #'unique' => [ [ 'agent_custnum' ] ], #one agent per customer?
518                                             #insert is giving it a value, tho..
519       #'index' => [ ['typenum'], ['disabled'] ],
520       'unique'       => [],
521       'index'        => [ ['typenum'], ['disabled'], ['agent_custnum'] ],
522       'foreign_keys' => [
523                           { columns    => [ 'typenum' ],
524                             table      => 'agent_type',
525                           },
526                           # 1. RT tables aren't part of our data structure, so
527                           #     we can't make sure Queue is created already
528                           # 2. Future ability to plug in other ticketing systems
529                           #{ columns    => [ 'ticketing_queueid' ],
530                           #  table      => 'Queue',
531                           #  references => [ 'id' ],
532                           #},
533                           { columns    => [ 'agent_custnum' ],
534                             table      => 'cust_main',
535                             references => [ 'custnum' ],
536                           },
537                         ],
538     },
539
540     'agent_pkg_class' => {
541       'columns' => [
542         'agentpkgclassnum',    'serial',     '',    '', '', '',
543         'agentnum',               'int',     '',    '', '', '',
544         'classnum',               'int', 'NULL',    '', '', '',
545         'commission_percent', 'decimal',     '', '7,4', '', '',
546       ],
547       'primary_key'  => 'agentpkgclassnum',
548       'unique'       => [ [ 'agentnum', 'classnum' ], ],
549       'index'        => [],
550       'foreign_keys' => [
551                           { columns    => [ 'agentnum' ],
552                             table      => 'agent',
553                           },
554                           { columns    => [ 'classnum' ],
555                             table      => 'pkg_class',
556                           },
557                         ],
558     },
559
560     'agent_type' => {
561       'columns' => [
562         'typenum',  'serial',      '',      '', '', '',
563         'atype',    'varchar',     '', $char_d, '', '',
564         'disabled',    'char', 'NULL',       1, '', '',
565       ],
566       'primary_key' => 'typenum',
567       'unique' => [],
568       'index' => [ ['disabled'] ],
569     },
570
571     'type_pkgs' => {
572       'columns' => [
573         'typepkgnum', 'serial', '', '', '', '', 
574         'typenum',   'int',  '', '', '', '', 
575         'pkgpart',   'int',  '', '', '', '', 
576       ],
577       'primary_key'  => 'typepkgnum',
578       'unique'       => [ ['typenum', 'pkgpart'] ],
579       'index'        => [ ['typenum'] ],
580       'foreign_keys' => [
581                           { columns    => [ 'typenum' ],
582                             table      => 'agent_type',
583                           },
584                           { columns    => [ 'pkgpart' ],
585                             table      => 'part_pkg',
586                           },
587                         ],
588     },
589
590     'agent_currency' => {
591       'columns' => [
592         'agentcurrencynum', 'serial', '', '', '', '',
593         'agentnum',            'int', '', '', '', '',
594         'currency',           'char', '',  3, '', '',
595       ],
596       'primary_key'  => 'agentcurrencynum',
597       'unique'       => [],
598       'index'        => [ ['agentnum'] ],
599       'foreign_keys' => [
600                           { columns    => [ 'agentnum' ],
601                             table      => 'agent',
602                           },
603                         ],
604     },
605
606     'sales' => {
607       'columns' => [
608         'salesnum',          'serial',    '',       '', '', '', 
609         'salesperson',      'varchar',    '',  $char_d, '', '', 
610         'agentnum',             'int', 'NULL',      '', '', '', 
611         'sales_custnum',        'int', 'NULL',      '', '', '',
612         'disabled',            'char', 'NULL',       1, '', '', 
613       ],
614       'primary_key'  => 'salesnum',
615       'unique'       => [],
616       'index'        => [ ['salesnum'], ['disabled'] ],
617       'foreign_keys' => [
618                           { columns    => [ 'agentnum' ],
619                             table      => 'agent',
620                           },
621                           { columns    => [ 'sales_custnum' ],
622                             table      => 'cust_main',
623                             references => [ 'custnum' ],
624                           },
625                         ],
626     },
627
628     'sales_pkg_class' => {
629       'columns' => [
630         'salespkgclassnum',    'serial',     '',    '', '', '',
631         'salesnum',               'int',     '',    '', '', '',
632         'classnum',               'int', 'NULL',    '', '', '',
633         'commission_percent', 'decimal',     '', '7,4', '', '',
634         'commission_duration',    'int', 'NULL',    '', '', '',
635       ],
636       'primary_key'  => 'salespkgclassnum',
637       'unique'       => [ [ 'salesnum', 'classnum' ], ],
638       'index'        => [],
639       'foreign_keys' => [
640                           { columns    => [ 'salesnum' ],
641                             table      => 'sales',
642                           },
643                           { columns    => [ 'classnum' ],
644                             table      => 'pkg_class',
645                           },
646                         ],
647     },
648
649     'cust_attachment' => {
650       'columns' => [
651         'attachnum', 'serial', '', '', '', '',
652         'custnum',   'int', '', '', '', '',
653         '_date',     @date_type, '', '',
654         'otaker',    'varchar', 'NULL', 32, '', '',
655         'usernum',   'int', 'NULL', '', '', '',
656         'filename',  'varchar', '', 255, '', '',
657         'mime_type', 'varchar', '', $char_d, '', '',
658         'title',     'varchar', 'NULL', $char_d, '', '',
659         'body',      'blob', 'NULL', '', '', '',
660         'disabled',  @date_type, '', '',
661       ],
662       'primary_key'  => 'attachnum',
663       'unique'       => [],
664       'index'        => [ ['custnum'], ['usernum'], ],
665       'foreign_keys' => [
666                           { columns    => [ 'custnum' ],
667                             table      => 'cust_main',
668                           },
669                           { columns    => [ 'usernum' ],
670                             table      => 'access_user',
671                           },
672                         ],
673    },
674
675     'cust_bill' => {
676       'columns' => [
677         #regular fields
678         'invnum',         'serial',     '',      '', '', '', 
679         'custnum',           'int',     '',      '', '', '', 
680         '_date',        @date_type,                  '', '', 
681         'charged',     @money_type,                  '', '', 
682         'currency',         'char', 'NULL',       3, '', '',
683         'invoice_terms', 'varchar', 'NULL', $char_d, '', '',
684
685         #customer balance info at invoice generation time
686         #(deprecated)
687         'previous_balance',   @money_typen, '', '',  #eventually not nullable
688         'billing_balance',    @money_typen, '', '',  #eventually not nullable
689
690         #deprecated (unused by now, right?)
691         'printed',      'int',     '', '', '', '', 
692
693         #specific use cases
694         'closed',      'char', 'NULL',  1, '', '', #not yet used much
695         'statementnum', 'int', 'NULL', '', '', '', #invoice aggregate statements
696         'agent_invid',  'int', 'NULL', '', '', '', #(varchar?) importing legacy
697         'promised_date', @date_type,       '', '',
698         
699         'pending',     'char', 'NULL',  1, '', '',
700       ],
701       'primary_key'  => 'invnum',
702       'unique'       => [ [ 'custnum', 'agent_invid' ] ], #agentnum?  huh
703       'index'        => [ ['custnum'], ['_date'], ['statementnum'],
704                           ['agent_invid'],
705                         ],
706       'foreign_keys' => [
707                           { columns    => [ 'custnum' ],
708                             table      => 'cust_main',
709                           },
710                           { columns    => [ 'statementnum' ],
711                             table      => 'cust_statement',
712                           },
713                         ],
714     },
715
716     'cust_bill_void' => {
717       'columns' => [
718         #regular fields
719         'invnum',            'int',     '',      '', '', '', 
720         'custnum',           'int',     '',      '', '', '', 
721         '_date',        @date_type,                  '', '', 
722         'charged',     @money_type,                  '', '', 
723         'currency',         'char', 'NULL',       3, '', '',
724         'invoice_terms', 'varchar', 'NULL', $char_d, '', '',
725
726         #customer balance info at invoice generation time
727         'previous_balance',   @money_typen, '', '',  #eventually not nullable
728         'billing_balance',    @money_typen, '', '',  #eventually not nullable
729
730         #specific use cases
731         'closed',      'char', 'NULL',  1, '', '', #not yet used much
732         'statementnum', 'int', 'NULL', '', '', '', #invoice aggregate statements
733         'agent_invid',  'int', 'NULL', '', '', '', #(varchar?) importing legacy
734         'promised_date', @date_type,       '', '',
735
736         #void fields
737         'void_date', @date_type, '', '', 
738         'reason',    'varchar',   'NULL', $char_d, '', '', 
739         'void_usernum',   'int', 'NULL', '', '', '',
740       ],
741       'primary_key'  => 'invnum',
742       'unique'       => [ [ 'custnum', 'agent_invid' ] ], #agentnum?  huh
743       'index'        => [ ['custnum'], ['_date'], ['statementnum'],
744                           ['agent_invid'], [ 'void_usernum' ],
745                         ],
746       'foreign_keys' => [
747                           { columns    => [ 'custnum' ],
748                             table      => 'cust_main',
749                           },
750                           { columns    => [ 'statementnum' ],
751                             table      => 'cust_statement', #_void? both?
752                           },
753                           { columns    => [ 'void_usernum' ],
754                             table      => 'access_user',
755                             references => [ 'usernum' ],
756                           },
757                         ],
758     },
759
760     #for importing invoices from a legacy system for display purposes only
761     # no effect upon balance
762     'legacy_cust_bill' => {
763       'columns' => [
764         'legacyinvnum',  'serial',     '',      '', '', '',
765         'legacyid',     'varchar', 'NULL', $char_d, '', '',
766         'custnum',          'int',     '',      '', '', '', 
767         '_date',       @date_type,                  '', '', 
768         'charged',    @money_type,                  '', '', 
769         'currency',        'char', 'NULL',       3, '', '',
770         'content_pdf',     'blob', 'NULL',      '', '', '',
771         'content_html',    'text', 'NULL',      '', '', '',
772         'locale',       'varchar', 'NULL',      16, '', '', 
773       ],
774       'primary_key'  => 'legacyinvnum',
775       'unique'       => [],
776       'index'        => [ ['legacyid', 'custnum', 'locale' ], ],
777       'foreign_keys' => [
778                           { columns    => [ 'custnum' ],
779                             table      => 'cust_main',
780                           },
781                         ],
782     },
783
784     'legacy_cust_history' => {
785       'columns' => [
786         'legacyhistorynum', 'serial',     '',        '', '', '',
787         'custnum',             'int',     '',        '', '', '',
788         'history_action',  'varchar',     '',   $char_d, '', '',
789         'history_date',           @date_type,            '', '',
790         'history_usernum',     'int', 'NULL',        '', '', '',
791         'item',            'varchar', 'NULL',   $char_d, '', '',
792         'description',     'varchar', 'NULL', 2*$char_d, '', '',
793         'change_data',        'text', 'NULL',        '', '', '',
794       ],
795       'primary_key'  => 'legacyhistorynum',
796       'unique'       => [],
797       'index'        => [ ['custnum'], ['history_date'], ],
798       'foreign_keys' => [
799                           { columns    => [ 'custnum' ],
800                             table      => 'cust_main',
801                           },
802                           { columns    => [ 'history_usernum' ],
803                             table      => 'access_user',
804                             references => [ 'usernum' ],
805                           },
806                         ],
807     },
808
809     'cust_statement' => {
810       'columns' => [
811         'statementnum', 'serial', '', '', '', '',
812         'custnum',         'int', '', '', '', '',
813         '_date',           @date_type,    '', '',
814       ],
815       'primary_key'  => 'statementnum',
816       'unique'       => [],
817       'index'        => [ ['custnum'], ['_date'], ],
818       'foreign_keys' => [
819                           { columns    => [ 'custnum' ],
820                             table      => 'cust_main',
821                           },
822                         ],
823     },
824
825     'part_event' => {
826       'columns' => [
827         'eventpart',   'serial',      '',      '', '', '', 
828         'agentnum',    'int',     'NULL',      '', '', '', 
829         'event',       'varchar',     '', $char_d, '', '', 
830         'eventtable',  'varchar',     '', $char_d, '', '',
831         'check_freq',  'varchar', 'NULL', $char_d, '', '', 
832         'weight',      'int',         '',      '', '', '', 
833         'action',      'varchar',     '', $char_d, '', '',
834         'disabled',     'char',   'NULL',       1, '', '', 
835       ],
836       'primary_key'  => 'eventpart',
837       'unique'       => [],
838       'index'        => [ ['agentnum'], ['eventtable'], ['check_freq'],
839                           ['disabled'],
840                         ],
841       'foreign_keys' => [
842                           { columns    => [ 'agentnum' ],
843                             table      => 'agent',
844                           },
845                         ],
846     },
847
848     'part_event_option' => {
849       'columns' => [
850         'optionnum', 'serial', '', '', '', '', 
851         'eventpart', 'int', '', '', '', '', 
852         'optionname', 'varchar', '', $char_d, '', '', 
853         'optionvalue', 'text', 'NULL', '', '', '', 
854       ],
855       'primary_key'  => 'optionnum',
856       'unique'       => [],
857       'index'        => [ [ 'eventpart' ], [ 'optionname' ] ],
858       'foreign_keys' => [
859                           { columns    => [ 'eventpart' ],
860                             table      => 'part_event',
861                           },
862                         ],
863     },
864
865     'part_event_condition' => {
866       'columns' => [
867         'eventconditionnum', 'serial', '', '', '', '', 
868         'eventpart', 'int', '', '', '', '', 
869         'conditionname', 'varchar', '', $char_d, '', '', 
870       ],
871       'primary_key'  => 'eventconditionnum',
872       'unique'       => [],
873       'index'        => [ [ 'eventpart' ], [ 'conditionname' ] ],
874       'foreign_keys' => [
875                           { columns    => [ 'eventpart' ],
876                             table      => 'part_event',
877                           },
878                         ],
879     },
880
881     'part_event_condition_option' => {
882       'columns' => [
883         'optionnum', 'serial', '', '', '', '', 
884         'eventconditionnum', 'int', '', '', '', '', 
885         'optionname', 'varchar', '', $char_d, '', '', 
886         'optionvalue', 'text', 'NULL', '', '', '', 
887       ],
888       'primary_key'  => 'optionnum',
889       'unique'       => [],
890       'index'        => [ [ 'eventconditionnum' ], [ 'optionname' ] ],
891       'foreign_keys' => [
892                           { columns    => [ 'eventconditionnum' ],
893                             table      => 'part_event_condition',
894                           },
895                         ],
896     },
897
898     'part_event_condition_option_option' => {
899       'columns' => [
900         'optionoptionnum', 'serial', '', '', '', '', 
901         'optionnum', 'int', '', '', '', '', 
902         'optionname', 'varchar', '', $char_d, '', '', 
903         'optionvalue', 'text', 'NULL', '', '', '', 
904       ],
905       'primary_key'  => 'optionoptionnum',
906       'unique'       => [],
907       'index'        => [ [ 'optionnum' ], [ 'optionname' ] ],
908       'foreign_keys' => [
909                           { columns    => [ 'optionnum' ],
910                             table      => 'part_event_condition_option',
911                           },
912                         ],
913     },
914
915     'cust_event' => {
916       'columns' => [
917         'eventnum',    'serial',  '', '', '', '', 
918         'eventpart',   'int',  '', '', '', '', 
919         'tablenum',   'int',  '', '', '', '', 
920         '_date',     @date_type, '', '', 
921         'status', 'varchar', '', $char_d, '', '', 
922         'statustext', 'text', 'NULL', '', '', '', 
923       ],
924       'primary_key'  => 'eventnum',
925       #no... there are retries now #'unique' => [ [ 'eventpart', 'invnum' ] ],
926       'unique'       => [],
927       'index'        => [ ['eventpart'], ['tablenum'], ['status'],
928                           ['statustext'], ['_date'],
929                         ],
930       'foreign_keys' => [
931                           { columns    => [ 'eventpart' ],
932                             table      => 'part_event',
933                           },
934                         ],
935     },
936
937     'cust_event_fee' => {
938       'columns' => [
939         'eventfeenum', 'serial', '', '', '', '',
940         'eventnum',       'int', '', '', '', '',
941         'billpkgnum',     'int', 'NULL', '', '', '',
942         'feepart',        'int', '', '', '', '',
943         'nextbill',      'char', 'NULL',  1, '', '',
944       ],
945       'primary_key'  => 'eventfeenum', # I'd rather just use eventnum
946       'unique' => [ [ 'billpkgnum' ], [ 'eventnum' ] ], # one-to-one link
947       'index'  => [ [ 'feepart' ] ],
948       'foreign_keys' => [
949                           { columns => [ 'eventnum' ],
950                             table   => 'cust_event',
951                           },
952                           #{ columns => [ 'billpkgnum' ],
953                           #  table   => 'cust_bill_pkg',
954                           #},
955                           { columns => [ 'feepart' ],
956                             table   => 'part_fee',
957                           },
958                         ],
959     },
960
961     'cust_bill_pkg' => {
962       'columns' => [
963         'billpkgnum',          'serial',     '',      '', '', '', 
964         'invnum',                 'int',     '',      '', '', '', 
965         'pkgnum',                 'int',     '',      '', '', '', 
966         'pkgpart_override',       'int', 'NULL',      '', '', '', 
967         'setup',                 @money_type,             '', '', 
968         'unitsetup',             @money_typen,            '', '', 
969         'setup_billed_currency', 'char', 'NULL',       3, '', '',
970         'setup_billed_amount',   @money_typen,            '', '',
971         'recur',                 @money_type,             '', '', 
972         'unitrecur',             @money_typen,            '', '', 
973         'recur_billed_currency', 'char', 'NULL',       3, '', '',
974         'recur_billed_amount',   @money_typen,            '', '',
975         'sdate',                 @date_type,              '', '', 
976         'edate',                 @date_type,              '', '', 
977         'itemdesc',           'varchar', 'NULL', $char_d, '', '', 
978         'itemcomment',        'varchar', 'NULL', $char_d, '', '', 
979         'section',            'varchar', 'NULL', $char_d, '', '', 
980         'freq',               'varchar', 'NULL', $char_d, '', '',
981         'quantity',               'int', 'NULL',      '', '', '',
982         'hidden',                'char', 'NULL',       1, '', '',
983         'feepart',                'int', 'NULL',      '', '', '',
984       ],
985       'primary_key'  => 'billpkgnum',
986       'unique'       => [],
987       'index'        => [ ['invnum'], [ 'pkgnum' ], [ 'itemdesc' ], ],
988       'foreign_keys' => [
989                           { columns    => [ 'invnum' ],
990                             table      => 'cust_bill',
991                           },
992                           #pkgnum 0 and -1 are used for special things
993                           #{ columns    => [ 'pkgnum' ],
994                           #  table      => 'cust_pkg',
995                           #},
996                           { columns    => [ 'pkgpart_override' ],
997                             table      => 'part_pkg',
998                             references => [ 'pkgpart' ],
999                           },
1000                           { columns    => [ 'feepart' ],
1001                             table      => 'part_fee',
1002                           },
1003                         ],
1004     },
1005
1006     'cust_bill_pkg_detail' => {
1007       'columns' => [
1008         'detailnum', 'serial', '', '', '', '', 
1009           # bigserial? this table will eventually be as big as cdr...
1010         'billpkgnum', 'int', 'NULL', '', '', '',        # should not be nullable
1011         'pkgnum',  'int', 'NULL', '', '', '',           # deprecated
1012         'invnum',  'int', 'NULL', '', '', '',           # deprecated
1013         'amount',  'decimal', 'NULL', '10,4', '', '',
1014         'format',  'char', 'NULL', 1, '', '',
1015         'classnum', 'int', 'NULL', '', '', '',
1016         'duration', 'int', 'NULL', '',  0, '',
1017         'phonenum', 'varchar', 'NULL', 255, '', '', # has to hold a service label
1018         'accountcode', 'varchar',  'NULL',      32, '', '',
1019         'startdate',  @date_type, '', '', 
1020         'regionname', 'varchar', 'NULL', $char_d, '', '',
1021         'detail',  'varchar', '', 255, '', '',
1022       ],
1023       'primary_key'  => 'detailnum',
1024       'unique'       => [],
1025       'index'        => [ [ 'billpkgnum' ], [ 'classnum' ],
1026                           [ 'pkgnum', 'invnum' ],
1027                         ],
1028       'foreign_keys' => [
1029                           { columns    => [ 'billpkgnum' ],
1030                             table      => 'cust_bill_pkg',
1031                           },
1032                           #{ columns    => [ 'pkgnum' ],
1033                           #  table      => 'cust_pkg',
1034                           #},
1035                           #{ columns    => [ 'invnum' ],
1036                           #  table      => 'cust_bill',
1037                           #},
1038                           { columns    => [ 'classnum' ],
1039                             table      => 'usage_class',
1040                           },
1041                         ],
1042     },
1043
1044     'cust_bill_pkg_display' => {
1045       'columns' => [
1046         'billpkgdisplaynum', 'serial', '', '', '', '',
1047         'billpkgnum', 'int', '', '', '', '', 
1048         'section',  'varchar', 'NULL', $char_d, '', '', 
1049         #'unitsetup', @money_typen, '', '',     #override the linked real one?
1050         #'unitrecur', @money_typen, '', '',     #this too?
1051         'post_total', 'char', 'NULL', 1, '', '',
1052         'type',       'char', 'NULL', 1, '', '',
1053         'summary',    'char', 'NULL', 1, '', '',
1054       ],
1055       'primary_key'  => 'billpkgdisplaynum',
1056       'unique'       => [],
1057       'index'        => [ ['billpkgnum'], ],
1058       'foreign_keys' => [
1059                           { columns    => [ 'billpkgnum' ],
1060                             table      => 'cust_bill_pkg',
1061                           },
1062                         ],
1063     },
1064
1065     'cust_bill_pkg_fee' => {
1066       'columns' => [
1067         'billpkgfeenum',    'serial', '', '', '', '',
1068         'billpkgnum',          'int', '', '', '', '',
1069         'base_invnum',       'int', '', '', '', '',
1070         'base_billpkgnum',   'int', 'NULL', '', '', '',
1071         'amount',        @money_type,         '', '',
1072       ],
1073       'primary_key' => 'billpkgfeenum',
1074       'unique'      => [],
1075       'index'       => [ ['billpkgnum'],
1076                          ['base_invnum'],
1077                          ['base_billpkgnum'],
1078                        ],
1079       'foreign_keys' => [
1080                           { columns     => [ 'billpkgnum' ],
1081                             table       => 'cust_bill_pkg',
1082                           },
1083                         ],
1084     },
1085
1086     'cust_bill_pkg_fee_void' => {
1087       'columns' => [
1088         'billpkgfeenum',    'serial', '', '', '', '',
1089         'billpkgnum',          'int', '', '', '', '',
1090         'base_invnum',       'int', '', '', '', '',
1091         'base_billpkgnum',   'int', 'NULL', '', '', '',
1092         'amount',        @money_type,         '', '',
1093       ],
1094       'primary_key' => 'billpkgfeenum',
1095       'unique'      => [],
1096       'index'       => [ ['billpkgnum'],
1097                          ['base_invnum'],
1098                          ['base_billpkgnum'],
1099                        ],
1100       'foreign_keys' => [
1101                           { columns     => [ 'billpkgnum' ],
1102                             table       => 'cust_bill_pkg_void',
1103                           },
1104                         ],
1105     },
1106
1107
1108     'cust_bill_pkg_tax_location' => {
1109       'columns' => [
1110         'billpkgtaxlocationnum', 'serial',     '',      '', '', '',
1111         'billpkgnum',               'int',     '',      '', '', '',
1112         'taxnum',                   'int',     '',      '', '', '',
1113         'taxtype',              'varchar',     '', $char_d, '', '',
1114         'pkgnum',                   'int',     '',      '', '', '', #redundant
1115         'locationnum',              'int',     '',      '', '', '', #redundant
1116         'amount',             @money_type,                  '', '',
1117         'currency',                'char', 'NULL',       3, '', '',
1118         'taxable_billpkgnum',       'int', 'NULL',      '', '', '',
1119       ],
1120       'primary_key'  => 'billpkgtaxlocationnum',
1121       'unique'       => [],
1122       'index'        => [ [ 'billpkgnum' ], 
1123                           [ 'taxnum' ],
1124                           [ 'pkgnum' ],
1125                           [ 'locationnum' ],
1126                           [ 'taxable_billpkgnum' ],
1127                         ],
1128       'foreign_keys' => [
1129                           { columns    => [ 'billpkgnum' ],
1130                             table      => 'cust_bill_pkg',
1131                           },
1132                           #{ columns    => [ 'pkgnum' ],
1133                           #  table      => 'cust_pkg',
1134                           #}, # taxes can apply to fees
1135                           { columns    => [ 'locationnum' ],
1136                             table      => 'cust_location',
1137                           },
1138                           #{ columns    => [ 'taxable_billpkgnum' ],
1139                           #  table      => 'cust_bill_pkg',
1140                           #  references => [ 'billpkgnum' ],
1141                           #},
1142                         ],
1143     },
1144
1145     'cust_bill_pkg_tax_rate_location' => {
1146       'columns' => [
1147         'billpkgtaxratelocationnum', 'serial',      '',      '', '', '',
1148         'billpkgnum',                   'int',      '',      '', '', '',
1149         'taxnum',                       'int',      '',      '', '', '',
1150         'taxtype',                  'varchar',      '', $char_d, '', '',
1151         'locationtaxid',            'varchar',  'NULL', $char_d, '', '',
1152         'taxratelocationnum',           'int',      '',      '', '', '',
1153         'amount',                 @money_type,                   '', '',
1154         'currency',                    'char', 'NULL',        3, '', '',
1155         'taxable_billpkgnum',           'int', 'NULL',       '', '', '',
1156         'taxclass',                 'varchar', 'NULL',       10, '', '',
1157       ],
1158       'primary_key'  => 'billpkgtaxratelocationnum',
1159       'unique'       => [],
1160       'index'        => [ ['billpkgnum'], ['taxnum'], ['taxratelocationnum'],
1161                           ['taxable_billpkgnum'],
1162                         ],
1163       'foreign_keys' => [
1164                           { columns    => [ 'billpkgnum' ],
1165                             table      => 'cust_bill_pkg',
1166                           },
1167                           { columns    => [ 'taxratelocationnum' ],
1168                             table      => 'tax_rate_location',
1169                           },
1170                           #{ columns    => [ 'taxable_billpkgnum' ],
1171                           #  table      => 'cust_bill_pkg',
1172                           #  references => [ 'billpkgnum' ],
1173                           #},
1174                         ],
1175     },
1176
1177     'cust_bill_pkg_void' => {
1178       'columns' => [
1179         'billpkgnum',           'int',     '',      '', '', '', 
1180         'invnum',               'int',     '',      '', '', '', 
1181         'pkgnum',               'int',     '',      '', '', '', 
1182         'pkgpart_override',     'int', 'NULL',      '', '', '', 
1183         'setup',               @money_type,             '', '', 
1184         'recur',               @money_type,             '', '', 
1185         #XXX a currency for a line item?  or just one for the entire invoice
1186         #'currency',            'char', 'NULL',       3, '', '',
1187         'sdate',               @date_type,              '', '', 
1188         'edate',               @date_type,              '', '', 
1189         'itemdesc',         'varchar', 'NULL', $char_d, '', '', 
1190         'itemcomment',      'varchar', 'NULL', $char_d, '', '', 
1191         'section',          'varchar', 'NULL', $char_d, '', '', 
1192         'freq',             'varchar', 'NULL', $char_d, '', '',
1193         'quantity',             'int', 'NULL',      '', '', '',
1194         'unitsetup',           @money_typen,            '', '', 
1195         'unitrecur',           @money_typen,            '', '', 
1196         'hidden',              'char', 'NULL',       1, '', '',
1197         'feepart',              'int', 'NULL',      '', '', '',
1198         #void fields
1199         'void_date', @date_type, '', '', 
1200         'reason',    'varchar',   'NULL', $char_d, '', '', 
1201         'void_usernum',   'int', 'NULL', '', '', '',
1202       ],
1203       'primary_key'  => 'billpkgnum',
1204       'unique'       => [],
1205       'index'        => [ ['invnum'], ['pkgnum'], ['itemdesc'],
1206                           ['void_usernum'],
1207                         ],
1208       'foreign_keys' => [
1209                           { columns    => [ 'invnum' ],
1210                             table      => 'cust_bill_void',
1211                           },
1212                           #pkgnum 0 and -1 are used for special things
1213                           #{ columns    => [ 'pkgnum' ],
1214                           #  table      => 'cust_pkg',
1215                           #},
1216                           { columns    => [ 'pkgpart_override' ],
1217                             table      => 'part_pkg',
1218                             references => [ 'pkgpart' ],
1219                           },
1220                           { columns    => [ 'void_usernum' ],
1221                             table      => 'access_user',
1222                             references => [ 'usernum' ],
1223                           },
1224                         ],
1225     },
1226
1227     'cust_bill_pkg_detail_void' => {
1228       'columns' => [
1229         'detailnum',  'int', '', '', '', '', 
1230         'billpkgnum', 'int', 'NULL', '', '', '',        # should not be nullable
1231         'pkgnum',  'int', 'NULL', '', '', '',           # deprecated
1232         'invnum',  'int', 'NULL', '', '', '',           # deprecated
1233         'amount',  'decimal', 'NULL', '10,4', '', '',
1234         'format',  'char', 'NULL', 1, '', '',
1235         'classnum', 'int', 'NULL', '', '', '',
1236         'duration', 'int', 'NULL', '',  0, '',
1237         'phonenum', 'varchar', 'NULL', 255, '', '',
1238         'accountcode', 'varchar',  'NULL',      32, '', '',
1239         'startdate',  @date_type, '', '', 
1240         'regionname', 'varchar', 'NULL', $char_d, '', '',
1241         'detail',  'varchar', '', 255, '', '', 
1242       ],
1243       'primary_key'  => 'detailnum',
1244       'unique'       => [],
1245       'index'        => [ ['billpkgnum'], ['classnum'], ['pkgnum', 'invnum'] ],
1246       'foreign_keys' => [
1247                           { columns    => [ 'billpkgnum' ],
1248                             table      => 'cust_bill_pkg_void',
1249                           },
1250                           #{ columns    => [ 'pkgnum' ],
1251                           #  table      => 'cust_pkg',
1252                           #},
1253                           #{ columns    => [ 'invnum' ],
1254                           #  table      => 'cust_bill',
1255                           #},
1256                           { columns    => [ 'classnum' ],
1257                             table      => 'usage_class',
1258                           },
1259                         ],
1260     },
1261
1262     'cust_bill_pkg_display_void' => {
1263       'columns' => [
1264         'billpkgdisplaynum',    'int', '', '', '', '', 
1265         'billpkgnum', 'int', '', '', '', '', 
1266         'section',  'varchar', 'NULL', $char_d, '', '', 
1267         #'unitsetup', @money_typen, '', '',     #override the linked real one?
1268         #'unitrecur', @money_typen, '', '',     #this too?
1269         'post_total', 'char', 'NULL', 1, '', '',
1270         'type',       'char', 'NULL', 1, '', '',
1271         'summary',    'char', 'NULL', 1, '', '',
1272       ],
1273       'primary_key'  => 'billpkgdisplaynum',
1274       'unique'       => [],
1275       'index'        => [ ['billpkgnum'], ],
1276       'foreign_keys' => [
1277                           { columns    => [ 'billpkgnum' ],
1278                             table      => 'cust_bill_pkg_void',
1279                           },
1280                         ],
1281     },
1282
1283     'cust_bill_pkg_tax_location_void' => {
1284       'columns' => [
1285         'billpkgtaxlocationnum',    'int',     '',      '', '', '',
1286         'billpkgnum',               'int',     '',      '', '', '',
1287         'taxnum',                   'int',     '',      '', '', '',
1288         'taxtype',              'varchar',     '', $char_d, '', '',
1289         'pkgnum',                   'int',     '',      '', '', '',
1290         'locationnum',              'int',     '',      '', '', '', #redundant?
1291         'amount',             @money_type,                  '', '',
1292         'currency',                'char', 'NULL',       3, '', '',
1293         'taxable_billpkgnum',       'int', 'NULL',      '', '', '',
1294       ],
1295       'primary_key'  => 'billpkgtaxlocationnum',
1296       'unique'       => [],
1297       'index'        => [ ['billpkgnum'], ['taxnum'], ['pkgnum'],
1298                           ['locationnum'],
1299                         ],
1300       'foreign_keys' => [
1301                           { columns    => [ 'billpkgnum' ],
1302                             table      => 'cust_bill_pkg_void',
1303                           },
1304                           { columns    => [ 'locationnum' ],
1305                             table      => 'cust_location',
1306                           },
1307                           #{ columns    => [ 'taxable_billpkgnum' ],
1308                           #  table      => 'cust_bill_pkg_void',
1309                           #  references => [ 'billpkgnum' ],
1310                           #},
1311                         ],
1312     },
1313
1314     'cust_bill_pkg_tax_rate_location_void' => {
1315       'columns' => [
1316         'billpkgtaxratelocationnum',    'int',     '',      '', '', '',
1317         'billpkgnum',                   'int',     '',      '', '', '',
1318         'taxnum',                       'int',     '',      '', '', '',
1319         'taxtype',                  'varchar',     '', $char_d, '', '',
1320         'locationtaxid',            'varchar', 'NULL', $char_d, '', '',
1321         'taxratelocationnum',           'int',     '',      '', '', '',
1322         'amount',                 @money_type,                  '', '',
1323         'currency',                    'char', 'NULL',       3, '', '',
1324       ],
1325       'primary_key'  => 'billpkgtaxratelocationnum',
1326       'unique'       => [],
1327       'index'        => [ ['billpkgnum'], ['taxnum'], ['taxratelocationnum'] ],
1328       'foreign_keys' => [
1329                           { columns    => [ 'billpkgnum' ],
1330                             table      => 'cust_bill_pkg_void',
1331                           },
1332                           { columns    => [ 'taxratelocationnum' ],
1333                             table      => 'tax_rate_location',
1334                           },
1335                         ],
1336     },
1337
1338     'cust_credit' => {
1339       'columns' => [
1340         'crednum',  'serial',     '', '', '', '', 
1341         'custnum',     'int',     '', '', '', '', 
1342         '_date',  @date_type,             '', '', 
1343         'amount',@money_type,             '', '', 
1344         'currency',   'char', 'NULL',  3, '', '',
1345         'otaker',  'varchar', 'NULL', 32, '', '', 
1346         'usernum',     'int', 'NULL', '', '', '',
1347         'reason',     'text', 'NULL', '', '', '', 
1348         'reasonnum',   'int', 'NULL', '', '', '', 
1349         'addlinfo',   'text', 'NULL', '', '', '',
1350         'closed',     'char', 'NULL',  1, '', '', 
1351         'pkgnum',      'int', 'NULL', '', '','',#desired pkgnum for pkg-balances
1352         'eventnum',    'int', 'NULL', '', '','',#triggering event for commission
1353         'commission_agentnum', 'int', 'NULL', '', '', '', #
1354         'commission_salesnum', 'int', 'NULL', '', '', '', #
1355         'commission_pkgnum',   'int', 'NULL', '', '', '', #
1356         'credbatch',    'varchar', 'NULL', $char_d, '', '',
1357       ],
1358       'primary_key'  => 'crednum',
1359       'unique'       => [],
1360       'index'        => [ ['custnum'], ['_date'], ['usernum'], ['eventnum'],
1361                           ['commission_salesnum'], ['credbatch'],
1362                         ],
1363       'foreign_keys' => [
1364                           { columns    => [ 'custnum' ],
1365                             table      => 'cust_main',
1366                           },
1367                           { columns    => [ 'usernum' ],
1368                             table      => 'access_user',
1369                           },
1370                           { columns    => [ 'reasonnum' ],
1371                             table      => 'reason',
1372                           },
1373                           { columns    => [ 'pkgnum' ],
1374                             table      => 'cust_pkg',
1375                           },
1376                           { columns    => [ 'eventnum' ],
1377                             table      => 'cust_event',
1378                           },
1379                           { columns    => [ 'commission_agentnum' ],
1380                             table      => 'agent',
1381                             references => [ 'agentnum' ],
1382                           },
1383                           { columns    => [ 'commission_salesnum' ],
1384                             table      => 'sales',
1385                             references => [ 'salesnum' ],
1386                           },
1387                           { columns    => [ 'commission_pkgnum' ],
1388                             table      => 'cust_pkg',
1389                             references => [ 'pkgnum' ],
1390                           },
1391                         ],
1392     },
1393
1394     'cust_credit_void' => {
1395       'columns' => [
1396         'crednum',  'serial',     '', '', '', '', 
1397         'custnum',     'int',     '', '', '', '', 
1398         '_date',  @date_type,             '', '', 
1399         'amount',@money_type,             '', '', 
1400         'currency',   'char', 'NULL',  3, '', '',
1401         'otaker',  'varchar', 'NULL', 32, '', '', 
1402         'usernum',     'int', 'NULL', '', '', '',
1403         'reason',     'text', 'NULL', '', '', '', 
1404         'reasonnum',   'int', 'NULL', '', '', '', 
1405         'addlinfo',   'text', 'NULL', '', '', '',
1406         'closed',     'char', 'NULL',  1, '', '', 
1407         'pkgnum',      'int', 'NULL', '', '','',
1408         'eventnum',    'int', 'NULL', '', '','',
1409         'commission_agentnum', 'int', 'NULL', '', '', '',
1410         'commission_salesnum', 'int', 'NULL', '', '', '',
1411         'commission_pkgnum',   'int', 'NULL', '', '', '',
1412         #void fields
1413         'void_date',  @date_type,                  '', '', 
1414         'void_reason', 'varchar', 'NULL', $char_d, '', '', 
1415         'void_reasonnum', 'int', 'NULL', '', '', '', 
1416         'void_usernum',    'int', 'NULL',      '', '', '',
1417       ],
1418       'primary_key'  => 'crednum',
1419       'unique'       => [],
1420       'index'        => [ ['custnum'], ['_date'], ['usernum'], ['eventnum'],
1421                           ['commission_salesnum'],
1422                         ],
1423       'foreign_keys' => [
1424                           { columns    => [ 'custnum' ],
1425                             table      => 'cust_main',
1426                           },
1427                           { columns    => [ 'usernum' ],
1428                             table      => 'access_user',
1429                           },
1430                           { columns    => [ 'reasonnum' ],
1431                             table      => 'reason',
1432                           },
1433                           { columns    => [ 'pkgnum' ],
1434                             table      => 'cust_pkg',
1435                           },
1436                           { columns    => [ 'eventnum' ],
1437                             table      => 'cust_event',
1438                           },
1439                           { columns    => [ 'commission_agentnum' ],
1440                             table      => 'agent',
1441                             references => [ 'agentnum' ],
1442                           },
1443                           { columns    => [ 'commission_salesnum' ],
1444                             table      => 'sales',
1445                             references => [ 'salesnum' ],
1446                           },
1447                           { columns    => [ 'commission_pkgnum' ],
1448                             table      => 'cust_pkg',
1449                             references => [ 'pkgnum' ],
1450                           },
1451                           { columns    => [ 'void_reasonnum' ],
1452                             table      => 'reason',
1453                             references => [ 'reasonnum' ],
1454                           },
1455                           { columns    => [ 'void_usernum' ],
1456                             table      => 'access_user',
1457                             references => [ 'usernum' ],
1458                           },
1459                         ],
1460     },
1461
1462
1463     'cust_credit_bill' => {
1464       'columns' => [
1465         'creditbillnum', 'serial', '', '', '', '', 
1466         'crednum',  'int', '', '', '', '', 
1467         'invnum',  'int', '', '', '', '', 
1468         '_date',    @date_type, '', '', 
1469         'amount',   @money_type, '', '', 
1470         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
1471       ],
1472       'primary_key'  => 'creditbillnum',
1473       'unique'       => [],
1474       'index'        => [ ['crednum'], ['invnum'] ],
1475       'foreign_keys' => [
1476                           { columns    => [ 'crednum' ],
1477                             table      => 'cust_credit',
1478                           },
1479                           { columns    => [ 'invnum' ],
1480                             table      => 'cust_bill',
1481                           },
1482                           { columns    => [ 'pkgnum' ],
1483                             table      => 'cust_pkg',
1484                           },
1485                         ],
1486     },
1487
1488     'cust_credit_bill_pkg' => {
1489       'columns' => [
1490         'creditbillpkgnum', 'serial', '',      '', '', '',
1491         'creditbillnum',       'int', '',      '', '', '',
1492         'billpkgnum',          'int', '',      '', '', '',
1493         'billpkgtaxlocationnum', 'int', 'NULL', '', '', '',
1494         'billpkgtaxratelocationnum', 'int', 'NULL', '', '', '',
1495         'amount',            @money_type,          '', '',
1496         'setuprecur',      'varchar', '', $char_d, '', '',
1497         'sdate',   @date_type, '', '', 
1498         'edate',   @date_type, '', '', 
1499       ],
1500       'primary_key'  => 'creditbillpkgnum',
1501       'unique'       => [],
1502       'index'        => [ [ 'creditbillnum' ],
1503                           [ 'billpkgnum' ], 
1504                           [ 'billpkgtaxlocationnum' ],
1505                           [ 'billpkgtaxratelocationnum' ],
1506                         ],
1507       'foreign_keys' => [
1508                           { columns    => [ 'creditbillnum' ],
1509                             table      => 'cust_credit_bill',
1510                           },
1511                           { columns    => [ 'billpkgnum' ],
1512                             table      => 'cust_bill_pkg',
1513                           },
1514                           { columns    => [ 'billpkgtaxlocationnum' ],
1515                             table      => 'cust_bill_pkg_tax_location',
1516                           },
1517                           { columns    => [ 'billpkgtaxratelocationnum' ],
1518                             table      => 'cust_bill_pkg_tax_rate_location',
1519                           },
1520                         ],
1521     },
1522
1523     'cust_credit_source_bill_pkg' => {
1524       'columns' => [
1525         'creditsourcebillpkgnum', 'serial',     '', '', '', '',
1526         'crednum',                   'int',     '', '', '', '',
1527         'billpkgnum',                'int',     '', '', '', '',
1528         'amount',              @money_type,             '', '',
1529         'currency',                 'char', 'NULL',  3, '', '',
1530       ],
1531       'primary_key'  => 'creditsourcebillpkgnum',
1532       'unique'       => [],
1533       'index'        => [ ['crednum'], ['billpkgnum'] ],
1534       'foreign_keys' => [
1535                           { columns => ['billpkgnum'],
1536                             table   => 'cust_bill_pkg',
1537                           },
1538                           { columns => ['crednum'],
1539                             table   => 'cust_credit',
1540                           },
1541                         ],
1542     },
1543
1544     'cust_main' => {
1545       'columns' => [
1546         'custnum',  'serial',  '',     '', '', '', 
1547         'agentnum', 'int',  '',     '', '', '', 
1548         'salesnum', 'int',  'NULL', '', '', '', 
1549         'agent_custid', 'varchar', 'NULL', $char_d, '', '',
1550         'classnum', 'int', 'NULL', '', '', '',
1551         'custbatch', 'varchar', 'NULL', $char_d, '', '',
1552 #        'titlenum', 'int',  'NULL',   '', '', '', 
1553         'last',     'varchar', '',   2*$char_d, '', '', 
1554 #        'middle',   'varchar', 'NULL', $char_d, '', '', 
1555         'first',    'varchar', '',     $char_d, '', '', 
1556         'ss',       'varchar', 'NULL', 11, '', '', 
1557         'stateid', 'varchar', 'NULL', $char_d, '', '', 
1558         'stateid_state', 'varchar', 'NULL', $char_d, '', '', 
1559         'national_id', 'varchar', 'NULL', $char_d, '', '',
1560         'birthdate' ,@date_type, '', '', 
1561         'spouse_last',  'varchar', 'NULL', 2*$char_d, '', '',
1562         'spouse_first', 'varchar', 'NULL', $char_d, '', '',
1563         'spouse_birthdate', @date_type, '', '', 
1564         'anniversary_date', @date_type, '', '', 
1565         'signupdate',@date_type, '', '', 
1566         'dundate',   @date_type, '', '', 
1567         'company',  'varchar', 'NULL', $char_d, '', '', 
1568         'address1', 'varchar', 'NULL', $char_d, '', '', 
1569         'address2', 'varchar', 'NULL', $char_d, '', '', 
1570         'city',     'varchar', 'NULL', $char_d, '', '', 
1571         'county',   'varchar', 'NULL', $char_d, '', '', 
1572         'state',    'varchar', 'NULL', $char_d, '', '', 
1573         'zip',      'varchar', 'NULL', 10, '', '', 
1574         'country',  'char',    'NULL',  2, '', '', 
1575         'latitude', 'decimal', 'NULL', '10,7', '', '', 
1576         'longitude','decimal', 'NULL', '10,7', '', '', 
1577         'coord_auto',  'char', 'NULL',  1, '', '',
1578         'addr_clean',  'char', 'NULL',  1, '', '',
1579         'daytime',  'varchar', 'NULL', 20, '', '', 
1580         'night',    'varchar', 'NULL', 20, '', '', 
1581         'fax',      'varchar', 'NULL', 12, '', '', 
1582         'mobile',   'varchar', 'NULL', 12, '', '', 
1583         'ship_last',     'varchar', 'NULL', 2*$char_d, '', '', 
1584 #        'ship_middle',   'varchar', 'NULL', $char_d, '', '', 
1585         'ship_first',    'varchar', 'NULL', $char_d, '', '', 
1586         'ship_company',  'varchar', 'NULL', $char_d, '', '', 
1587         'ship_address1', 'varchar', 'NULL', $char_d, '', '', 
1588         'ship_address2', 'varchar', 'NULL', $char_d, '', '', 
1589         'ship_city',     'varchar', 'NULL', $char_d, '', '', 
1590         'ship_county',   'varchar', 'NULL', $char_d, '', '', 
1591         'ship_state',    'varchar', 'NULL', $char_d, '', '', 
1592         'ship_zip',      'varchar', 'NULL', 10, '', '', 
1593         'ship_country',  'char', 'NULL', 2, '', '', 
1594         'ship_latitude', 'decimal', 'NULL', '10,7', '', '', 
1595         'ship_longitude','decimal', 'NULL', '10,7', '', '', 
1596         'ship_coord_auto',  'char', 'NULL',  1, '', '',
1597         'ship_addr_clean',  'char', 'NULL',  1, '', '',
1598         'ship_daytime',  'varchar', 'NULL', 20, '', '', 
1599         'ship_night',    'varchar', 'NULL', 20, '', '', 
1600         'ship_fax',      'varchar', 'NULL', 12, '', '', 
1601         'ship_mobile',   'varchar', 'NULL', 12, '', '', 
1602         'currency',         'char', 'NULL',  3, '', '',
1603
1604         #deprecated, info moved to cust_payby
1605         'payby',    'char', 'NULL',     4, '', '', 
1606         'payinfo',  'varchar', 'NULL', 512, '', '', 
1607         'paycvv',   'varchar', 'NULL', 512, '', '', 
1608         'paymask', 'varchar', 'NULL', $char_d, '', '', 
1609         #'paydate',  @date_type, '', '', 
1610         'paydate',  'varchar', 'NULL', 10, '', '', 
1611         'paystart_month', 'int', 'NULL', '', '', '', 
1612         'paystart_year',  'int', 'NULL', '', '', '', 
1613         'payissue', 'varchar', 'NULL', 2, '', '', 
1614         'payname',  'varchar', 'NULL', 2*$char_d, '', '', 
1615         'paystate', 'varchar', 'NULL', $char_d, '', '', 
1616         'paytype',  'varchar', 'NULL', $char_d, '', '', 
1617         'payip',    'varchar', 'NULL', 15, '', '', 
1618
1619         'geocode',  'varchar', 'NULL', 20,  '', '',
1620         'censustract', 'varchar', 'NULL', 20,  '', '', # 7 to save space?
1621         'censusyear', 'char', 'NULL', 4, '', '',
1622         'district', 'varchar', 'NULL', 20, '', '',
1623         'tax',      'char', 'NULL', 1, '', '', 
1624         'otaker',   'varchar', 'NULL',    32, '', '', 
1625         'usernum',   'int', 'NULL', '', '', '',
1626         'refnum',   'int',  '',     '', '', '', 
1627         'referral_custnum', 'int',  'NULL', '', '', '', 
1628         'comments', 'text', 'NULL', '', '', '', 
1629         'spool_cdr','char', 'NULL', 1, '', '', 
1630         'squelch_cdr','char', 'NULL', 1, '', '', 
1631         'cdr_termination_percentage', 'decimal', 'NULL', '7,4', '', '',
1632         'invoice_terms', 'varchar', 'NULL', $char_d, '', '',
1633         'credit_limit', @money_typen, '', '',
1634         'credit_limit_currency', 'char', 'NULL',  3, '', '',
1635         'archived', 'char', 'NULL', 1, '', '',
1636         'email_csv_cdr', 'char', 'NULL', 1, '', '',
1637         'accountcode_cdr', 'char', 'NULL', 1, '', '',
1638         'billday',   'int', 'NULL', '', '', '',
1639         'prorate_day',   'int', 'NULL', '', '', '',
1640         'edit_subject', 'char', 'NULL', 1, '', '',
1641         'locale', 'varchar', 'NULL', 16, '', '', 
1642         'calling_list_exempt', 'char', 'NULL', 1, '', '',
1643         'invoice_noemail', 'char', 'NULL', 1, '', '',
1644         'message_noemail', 'char', 'NULL', 1, '', '',
1645         'bill_locationnum', 'int', 'NULL', '', '', '',
1646         'ship_locationnum', 'int', 'NULL', '', '', '',
1647         'taxstatusnum',   'int', 'NULL', '', '', '',
1648         'complimentary', 'char', 'NULL', 1, '', '',
1649         'po_number', 'varchar', 'NULL', $char_d, '', '',
1650         'invoice_attn', 'varchar', 'NULL', $char_d, '', '',
1651         'invoice_ship_address', 'char', 'NULL', 1, '', '',
1652       ],
1653       'primary_key'  => 'custnum',
1654       'unique'       => [ [ 'agentnum', 'agent_custid' ] ],
1655       #'index'        => [ ['last'], ['company'] ],
1656       'index'        => [
1657                           ['agentnum'], ['refnum'], ['classnum'], ['usernum'],
1658                           [ 'custbatch' ],
1659                           [ 'referral_custnum' ],
1660                           [ 'payby' ], [ 'paydate' ],
1661                           [ 'archived' ],
1662                           [ 'ship_locationnum' ],
1663                           [ 'bill_locationnum' ],
1664                         ],
1665       'foreign_keys' => [
1666                           { columns    => [ 'agentnum' ],
1667                             table      => 'agent',
1668                           },
1669                           { columns    => [ 'salesnum' ],
1670                             table      => 'sales',
1671                           },
1672                           { columns    => [ 'refnum' ],
1673                             table      => 'part_referral',
1674                           },
1675                           { columns    => [ 'classnum' ],
1676                             table      => 'cust_class',
1677                           },
1678                           { columns    => [ 'usernum' ],
1679                             table      => 'access_user',
1680                           },
1681                           { columns    => [ 'referral_custnum' ],
1682                             table      => 'cust_main',
1683                             references => [ 'custnum' ],
1684                           },
1685                           { columns    => [ 'bill_locationnum' ],
1686                             table      => 'cust_location',
1687                             references => [ 'locationnum' ],
1688                           },
1689                           { columns    => [ 'ship_locationnum' ],
1690                             table      => 'cust_location',
1691                             references => [ 'locationnum' ],
1692                           },
1693                         ],
1694     },
1695
1696     'cust_payby' => {
1697       'columns' => [
1698         'custpaybynum', 'serial',     '',        '', '', '', 
1699         'custnum',         'int',     '',        '', '', '',
1700         'weight',          'int', 'NULL',        '', '', '', 
1701         'payby',          'char',     '',         4, '', '', 
1702         'payinfo',     'varchar', 'NULL',       512, '', '', 
1703         'cardtype',    'varchar', 'NULL',   $char_d, '', '',
1704         'paycvv',      'varchar', 'NULL',       512, '', '', 
1705         'paymask',     'varchar', 'NULL',   $char_d, '', '', 
1706         #'paydate',   @date_type, '', '', 
1707         'paydate',     'varchar', 'NULL',        10, '', '', 
1708         'paystart_month',  'int', 'NULL',        '', '', '', 
1709         'paystart_year',   'int', 'NULL',        '', '', '', 
1710         'payissue',    'varchar', 'NULL',         2, '', '', 
1711         'payname',     'varchar', 'NULL', 2*$char_d, '', '', 
1712         'paystate',    'varchar', 'NULL',   $char_d, '', '', 
1713         'paytype',     'varchar', 'NULL',   $char_d, '', '', 
1714         'payip',       'varchar', 'NULL',        15, '', '', 
1715         'locationnum',     'int', 'NULL',        '', '', '',
1716       ],
1717       'primary_key'  => 'custpaybynum',
1718       'unique'       => [],
1719       'index'        => [ [ 'custnum' ] ],
1720       'foreign_keys' => [
1721                           { columns    => [ 'custnum' ],
1722                             table      => 'cust_main',
1723                           },
1724                           { columns    => [ 'locationnum' ],
1725                             table      => 'cust_location',
1726                           },
1727                         ],
1728     },
1729
1730     'contact_class' => {
1731       'columns' => [
1732         'classnum',    'serial',   '',      '', '', '', 
1733         'classname',   'varchar',  '', $char_d, '', '', 
1734         'disabled',    'char', 'NULL',       1, '', '', 
1735       ],
1736       'primary_key' => 'classnum',
1737       'unique' => [],
1738       'index' => [ ['disabled'] ],
1739     },
1740
1741     'cust_contact' => {
1742       'columns' => [
1743         'custcontactnum',     'serial',     '',  '', '', '',
1744         'custnum',               'int',     '',  '', '', '',
1745         'contactnum',            'int',     '',  '', '', '',
1746         'classnum',              'int', 'NULL',  '', '', '',
1747         'comment',           'varchar', 'NULL', 255, '', '',
1748         'selfservice_access',   'char', 'NULL',   1, '', '',
1749       ],
1750       'primary_key'  => 'custcontactnum',
1751       'unique'       => [ [ 'custnum', 'contactnum' ], ],
1752       'index'        => [ [ 'custnum' ], [ 'contactnum' ], ],
1753       'foreign_keys' => [
1754                           { columns    => [ 'custnum' ],
1755                             table      => 'cust_main',
1756                           },
1757                           { columns    => [ 'contactnum' ],
1758                             table      => 'contact',
1759                           },
1760                           { columns    => [ 'classnum' ],
1761                             table      => 'contact_class',
1762                           },
1763                         ],
1764     },
1765
1766     'prospect_contact' => {
1767       'columns' => [
1768         'prospectcontactnum', 'serial',     '',  '', '', '',
1769         'prospectnum',       'int',     '',  '', '', '',
1770         'contactnum',        'int',     '',  '', '', '',
1771         'classnum',          'int', 'NULL',  '', '', '',
1772         'comment',       'varchar', 'NULL', 255, '', '',
1773       ],
1774       'primary_key'  => 'prospectcontactnum',
1775       'unique'       => [ [ 'prospectnum', 'contactnum' ], ],
1776       'index'        => [ [ 'prospectnum' ], [ 'contactnum' ], ],
1777       'foreign_keys' => [
1778                           { columns    => [ 'prospectnum' ],
1779                             table      => 'prospect_main',
1780                           },
1781                           { columns    => [ 'contactnum' ],
1782                             table      => 'contact',
1783                           },
1784                           { columns    => [ 'classnum' ],
1785                             table      => 'contact_class',
1786                           },
1787                         ],
1788     },
1789
1790     'contact' => {
1791       'columns' => [
1792         'contactnum', 'serial',     '',      '', '', '',
1793         'prospectnum',   'int', 'NULL',      '', '', '', #deprecated, now prospect_contact table
1794         'custnum',       'int', 'NULL',      '', '', '', #deprecated, now cust_contact table
1795         'locationnum',   'int', 'NULL',      '', '', '', #not yet
1796         'classnum',      'int', 'NULL',      '', '', '', #deprecated, now prospect_contact or cust_contact
1797 #        'titlenum',      'int', 'NULL',      '', '', '', #eg Mr. Mrs. Dr. Rev.
1798         'last',      'varchar',     '', $char_d, '', '', 
1799 #        'middle',    'varchar', 'NULL', $char_d, '', '', 
1800         'first',     'varchar',     '', $char_d, '', '', 
1801         'title',     'varchar', 'NULL', $char_d, '', '', #eg Head Bottle Washer
1802         'comment',   'varchar', 'NULL',     255, '', '',  #depredated, now prospect_contact or cust_contact
1803         'selfservice_access',    'char', 'NULL',       1, '', '', #deprecated, now cust_contact
1804         '_password',          'varchar', 'NULL', $char_d, '', '',
1805         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
1806         'disabled',              'char', 'NULL',       1, '', '', 
1807       ],
1808       'primary_key'  => 'contactnum',
1809       'unique'       => [],
1810       'index'        => [ [ 'prospectnum' ], [ 'custnum' ], [ 'locationnum' ],
1811                           [ 'last' ], [ 'first' ],
1812                         ],
1813       'foreign_keys' => [
1814                           { columns    => [ 'prospectnum' ],
1815                             table      => 'prospect_main',
1816                           },
1817                           { columns    => [ 'custnum' ],
1818                             table      => 'cust_main',
1819                           },
1820                           { columns    => [ 'locationnum' ],
1821                             table      => 'cust_location',
1822                           },
1823                           { columns    => [ 'classnum' ],
1824                             table      => 'contact_class',
1825                           },
1826                         ],
1827     },
1828
1829     'contact_phone' => {
1830       'columns' => [
1831         'contactphonenum', 'serial',     '', '', '', '',
1832         'contactnum',         'int',     '', '', '', '',
1833         'phonetypenum',       'int',     '', '', '', '',
1834         'countrycode',    'varchar',     '',  3, '', '', 
1835         'phonenum',       'varchar',     '', 14, '', '', 
1836         'extension',      'varchar', 'NULL',  7, '', '',
1837         #?#'comment',        'varchar',     '', $char_d, '', '', 
1838       ],
1839       'primary_key'  => 'contactphonenum',
1840       'unique'       => [],
1841       'index'        => [],
1842       'foreign_keys' => [
1843                           { columns    => [ 'contactnum' ],
1844                             table      => 'contact',
1845                           },
1846                           { columns    => [ 'phonetypenum' ],
1847                             table      => 'phone_type',
1848                           },
1849                         ],
1850     },
1851
1852     'phone_type' => {
1853       'columns' => [
1854         'phonetypenum',  'serial', '',      '', '', '',
1855         'typename',     'varchar', '', $char_d, '', '',
1856         'weight',           'int', '',      '', '', '', 
1857       ],
1858       'primary_key' => 'phonetypenum',
1859       'unique'      => [ [ 'typename' ], ],
1860       'index'       => [],
1861     },
1862
1863     'contact_email' => {
1864       'columns' => [
1865         'contactemailnum', 'serial', '',      '', '', '',
1866         'contactnum',         'int', '',      '', '', '',
1867         'emailaddress',   'varchar', '', $char_d, '', '',
1868       ],
1869       'primary_key'  => 'contactemailnum',
1870       #'unique'       => [ [ 'contactnum', 'emailaddress' ], ],
1871       'unique'       => [ [ 'emailaddress' ], ],
1872       'index'        => [],
1873       'foreign_keys' => [
1874                           { columns    => [ 'contactnum' ],
1875                             table      => 'contact',
1876                           },
1877                         ],
1878     },
1879
1880     'prospect_main' => {
1881       'columns' => [
1882         'prospectnum',  'serial',     '',      '', '', '',
1883         'agentnum',        'int',     '',      '', '', '',
1884         'company',     'varchar', 'NULL', $char_d, '', '',
1885         'add_date',   @date_type,                  '', '', 
1886         'disabled',       'char', 'NULL',       1, '', '', 
1887         'custnum',         'int', 'NULL',      '', '', '',
1888         'refnum',          'int', 'NULL',      '', '', '', 
1889         'taxstatusnum',    'int', 'NULL',      '', '', '',
1890       ],
1891       'primary_key'  => 'prospectnum',
1892       'unique'       => [],
1893       'index'        => [ ['company'], ['agentnum'], ['disabled'], ['refnum'] ],
1894       'foreign_keys' => [
1895                           { columns    => [ 'agentnum' ],
1896                             table      => 'agent',
1897                           },
1898                           { columns    => [ 'custnum' ],
1899                             table      => 'cust_main',
1900                           },
1901                           { columns    => [ 'refnum' ],
1902                             table      => 'part_referral',
1903                           },
1904                         ],
1905     },
1906
1907     'quotation' => {
1908       'columns' => [
1909         #regular fields
1910         'quotationnum',   'serial',     '', '', '', '', 
1911         'prospectnum',       'int', 'NULL', '', '', '',
1912         'custnum',           'int', 'NULL', '', '', '',
1913         '_date',        @date_type,             '', '', 
1914         'disabled',         'char', 'NULL',  1, '', '', 
1915         'usernum',           'int', 'NULL', '', '', '',
1916         #'total',      @money_type,       '', '', 
1917         #'quotation_term', 'varchar', 'NULL', $char_d, '', '',
1918       ],
1919       'primary_key'  => 'quotationnum',
1920       'unique'       => [],
1921       'index'        => [ [ 'prospectnum' ], ['custnum'], ['disabled'], ],
1922       'foreign_keys' => [
1923                           { columns    => [ 'prospectnum' ],
1924                             table      => 'prospect_main',
1925                           },
1926                           { columns    => [ 'custnum' ],
1927                             table      => 'cust_main',
1928                           },
1929                           { columns    => [ 'usernum' ],
1930                             table      => 'access_user',
1931                           },
1932                         ],
1933     },
1934
1935     'quotation_pkg' => {
1936       'columns' => [
1937         'quotationpkgnum',   'serial',     '', '', '', '', 
1938         'quotationnum',         'int', 'NULL', '', '', '', #shouldn't be null,
1939                                                            # but history...
1940         'pkgpart',              'int',     '', '', '', '', 
1941         'locationnum',          'int', 'NULL', '', '', '',
1942         'start_date',      @date_type,             '', '', 
1943         'contract_end',    @date_type,             '', '',
1944         'quantity',             'int', 'NULL', '', '', '',
1945         'waive_setup',         'char', 'NULL',  1, '', '', 
1946         'unitsetup',     @money_typen,             '', '',
1947         'unitrecur',     @money_typen,             '', '',
1948       ],
1949       'primary_key'  => 'quotationpkgnum',
1950       'unique'       => [],
1951       'index'        => [ ['pkgpart'], ],
1952       'foreign_keys' => [
1953                           { columns    => [ 'quotationnum' ],
1954                             table      => 'quotation',
1955                           },
1956                           { columns    => [ 'pkgpart' ],
1957                             table      => 'part_pkg',
1958                           },
1959                           { columns    => [ 'locationnum' ],
1960                             table      => 'cust_location',
1961                           },
1962                         ],
1963     },
1964
1965     'quotation_pkg_detail' => {
1966       'columns' => [
1967         'detailnum', 'serial', '', '', '', '', 
1968         'billpkgnum', 'int', '', '', '', '',        # actually links to quotationpkgnum
1969         'format',  'char', 'NULL', 1, '', '',       # not used for anything
1970         'detail',  'varchar', '', 255, '', '',
1971       ],
1972       'primary_key'  => 'detailnum',
1973       'unique'       => [],
1974       'index'        => [ [ 'billpkgnum' ] ],
1975       'foreign_keys' => [
1976                           { columns    => [ 'billpkgnum' ],
1977                             table      => 'quotation_pkg',
1978                             references => [ 'quotationpkgnum' ],
1979                           },
1980                         ],
1981     },
1982
1983     'quotation_pkg_discount' => {
1984       'columns' => [
1985         'quotationpkgdiscountnum', 'serial', '', '', '', '',
1986         'quotationpkgnum',            'int', '', '', '', '', 
1987         'discountnum',                'int', '', '', '', '',
1988         'setup_amount',        @money_typen,         '', '',
1989         'recur_amount',        @money_typen,         '', '',
1990         #'end_date',              @date_type,         '', '',
1991       ],
1992       'primary_key'  => 'quotationpkgdiscountnum',
1993       'unique'       => [],
1994       'index'        => [ [ 'quotationpkgnum' ], ], #[ 'discountnum' ] ],
1995       'foreign_keys' => [
1996                           { columns    => [ 'quotationpkgnum' ],
1997                             table      => 'quotation_pkg',
1998                           },
1999                           { columns    => [ 'discountnum' ],
2000                             table      => 'discount',
2001                           },
2002                         ],
2003     },
2004
2005     'quotation_pkg_tax' => {
2006       'columns' => [
2007         'quotationtaxnum',  'serial',     '',      '', '', '',
2008         'quotationpkgnum',     'int',     '',      '', '', '',
2009         'itemdesc',        'varchar',     '', $char_d, '', '',
2010         'setup_amount',    @money_type,                '', '',
2011         'recur_amount',    @money_type,                '', '',
2012       ],
2013       'primary_key' => 'quotationtaxnum',
2014       'unique' => [],
2015       'index'  => [ [ 'quotationpkgnum' ] ],
2016       'foreign_keys' => [
2017                           { columns    => [ 'quotationpkgnum' ],
2018                             table      => 'quotation_pkg',
2019                           },
2020                         ],
2021     },
2022
2023     'cust_location' => { #'location' now that its prospects too, but...
2024       'columns' => [
2025         'locationnum',      'serial',     '',      '', '', '',
2026         'prospectnum',         'int', 'NULL',      '', '', '',
2027         'custnum',             'int', 'NULL',      '', '', '',
2028         'locationname',    'varchar', 'NULL', $char_d, '', '',
2029         'address1',        'varchar',     '', $char_d, '', '', 
2030         'address2',        'varchar', 'NULL', $char_d, '', '', 
2031         'city',            'varchar', 'NULL', $char_d, '', '', 
2032         'county',          'varchar', 'NULL', $char_d, '', '', 
2033         'state',           'varchar', 'NULL', $char_d, '', '', 
2034         'zip',             'varchar', 'NULL',      10, '', '', 
2035         'latitude',        'decimal', 'NULL',  '10,7', '', '', 
2036         'longitude',       'decimal', 'NULL',  '10,7', '', '', 
2037         'coord_auto',         'char', 'NULL',       1, '', '',
2038         'addr_clean',         'char', 'NULL',       1, '', '',
2039         'country',            'char',     '',       2, '', '', 
2040         'geocode',         'varchar', 'NULL',      20, '', '',
2041         'district',        'varchar', 'NULL',      20, '', '',
2042         'censustract',     'varchar', 'NULL',      20, '', '',
2043         'censusyear',         'char', 'NULL',       4, '', '',
2044         'location_type',   'varchar', 'NULL',      20, '', '',
2045         'location_number', 'varchar', 'NULL',      20, '', '',
2046         'location_kind',      'char', 'NULL',       1, '', '',
2047         'incorporated',       'char', 'NULL',       1, '', '',
2048         'disabled',           'char', 'NULL',       1, '', '', 
2049       ],
2050       'primary_key'  => 'locationnum',
2051       'unique'       => [],
2052       'index'        => [ [ 'prospectnum' ], [ 'custnum' ],
2053                           [ 'county' ], [ 'state' ], [ 'country' ], [ 'zip' ],
2054                           [ 'city' ], [ 'district' ]
2055                         ],
2056       'foreign_keys' => [
2057                           { columns    => [ 'prospectnum' ],
2058                             table      => 'prospect_main',
2059                           },
2060                           { columns    => [ 'custnum' ],
2061                             table      => 'cust_main',
2062                           },
2063                         ],
2064     },
2065
2066     'cust_main_invoice' => {
2067       'columns' => [
2068         'destnum',  'serial',  '',     '', '', '', 
2069         'custnum',  'int',  '',     '', '', '', 
2070         'dest',     'varchar', '',  $char_d, '', '', 
2071       ],
2072       'primary_key'  => 'destnum',
2073       'unique'       => [],
2074       'index'        => [ ['custnum'], ],
2075       'foreign_keys' => [
2076                           { columns    => [ 'custnum' ],
2077                             table      => 'cust_main',
2078                           },
2079                         ],
2080     },
2081
2082     'cust_main_credit_limit' => {
2083       'columns' => [
2084         'creditlimitnum',   'serial', '', '', '', '',
2085         'custnum',             'int', '', '', '', '', 
2086         '_date',          @date_type,         '', '', 
2087         'amount',       @money_typen,         '', '',
2088         #'amount_currency', 'char', 'NULL',  3, '', '',
2089         'credit_limit', @money_typen,         '', '',
2090         #'credit_limit_currency', 'char', 'NULL',  3, '', '',
2091       ],
2092       'primary_key'  => 'creditlimitnum',
2093       'unique'       => [],
2094       'index'        => [ ['custnum'], ],
2095       'foreign_keys' => [
2096                           { columns    => [ 'custnum' ],
2097                             table      => 'cust_main',
2098                           },
2099                         ],
2100     },
2101
2102     'cust_main_note' => {
2103       'columns' => [
2104         'notenum',   'serial',    '',  '', '', '', 
2105         'custnum',      'int',    '',  '', '', '', 
2106         'classnum',     'int', 'NULL', '', '', '', 
2107         '_date',          @date_type,      '', '', 
2108         'otaker',   'varchar', 'NULL', 32, '', '', 
2109         'usernum',      'int', 'NULL', '', '', '',
2110         'comments',    'text', 'NULL', '', '', '', 
2111         'sticky',       'int',     '', '',  0, '',
2112       ],
2113       'primary_key'  => 'notenum',
2114       'unique'       => [],
2115       'index'        => [ [ 'custnum' ], [ '_date' ], [ 'usernum' ], ],
2116       'foreign_keys' => [
2117                           { columns    => [ 'custnum' ],
2118                             table      => 'cust_main',
2119                           },
2120                           { columns    => [ 'classnum' ],
2121                             table      => 'cust_note_class',
2122                           },
2123                           { columns    => [ 'usernum' ],
2124                             table      => 'access_user',
2125                           },
2126                         ],
2127     },
2128
2129     'cust_note_class' => {
2130       'columns' => [
2131         'classnum',    'serial',   '',      '', '', '', 
2132         'classname',   'varchar',  '', $char_d, '', '', 
2133         'disabled',    'char', 'NULL',       1, '', '', 
2134       ],
2135       'primary_key' => 'classnum',
2136       'unique' => [],
2137       'index' => [ ['disabled'] ],
2138     },
2139
2140     'cust_category' => {
2141       'columns' => [
2142         'categorynum',   'serial',  '', '', '', '', 
2143         'categoryname',  'varchar', '', $char_d, '', '', 
2144         'weight',         'int', 'NULL',  '', '', '',
2145         'disabled',      'char', 'NULL',   1, '', '', 
2146       ],
2147       'primary_key' => 'categorynum',
2148       'unique' => [],
2149       'index' => [ ['disabled'] ],
2150     },
2151
2152     'cust_class' => {
2153       'columns' => [
2154         'classnum',     'serial',     '',      '', '', '', 
2155         'classname',   'varchar',     '', $char_d, '', '', 
2156         'categorynum',     'int', 'NULL',      '', '', '', 
2157         'tax',            'char', 'NULL',       1, '', '', 
2158         'disabled',       'char', 'NULL',       1, '', '', 
2159       ],
2160       'primary_key'  => 'classnum',
2161       'unique'       => [],
2162       'index'        => [ ['disabled'] ],
2163       'foreign_keys' => [
2164                           { columns    => [ 'categorynum' ],
2165                             table      => 'cust_category',
2166                           },
2167                         ],
2168     },
2169  
2170     'cust_tag' => {
2171       'columns' => [
2172         'custtagnum', 'serial', '', '', '', '',
2173         'custnum',       'int', '', '', '', '',
2174         'tagnum',        'int', '', '', '', '',
2175       ],
2176       'primary_key'  => 'custtagnum',
2177       'unique'       => [ [ 'custnum', 'tagnum' ] ],
2178       'index'        => [ [ 'custnum' ] ],
2179       'foreign_keys' => [
2180                           { columns    => [ 'custnum' ],
2181                             table      => 'cust_main',
2182                           },
2183                           { columns    => [ 'tagnum' ],
2184                             table      => 'part_tag',
2185                           },
2186                         ],
2187     },
2188
2189     'part_tag' => {
2190       'columns' => [
2191         'tagnum',    'serial',     '',      '', '', '',
2192         'tagname',  'varchar',     '', $char_d, '', '',
2193         'tagdesc',  'varchar', 'NULL', $char_d, '', '',
2194         'tagcolor', 'varchar', 'NULL',       6, '', '',
2195         'by_default',  'char', 'NULL',       1, '', '',
2196         'disabled',    'char', 'NULL',       1, '', '', 
2197       ],
2198       'primary_key' => 'tagnum',
2199       'unique'      => [], #[ [ 'tagname' ] ], #?
2200       'index'       => [ [ 'disabled' ] ],
2201     },
2202
2203     'cust_main_exemption' => {
2204       'columns' => [
2205         'exemptionnum',   'serial',     '',      '', '', '',
2206         'custnum',           'int',     '',      '', '', '', 
2207         'taxname',       'varchar',     '', $char_d, '', '',
2208         'exempt_number', 'varchar', 'NULL', $char_d, '', '',
2209         #start/end dates?  for reporting?
2210       ],
2211       'primary_key'  => 'exemptionnum',
2212       'unique'       => [],
2213       'index'        => [ [ 'custnum' ] ],
2214       'foreign_keys' => [
2215                           { columns    => [ 'custnum' ],
2216                             table      => 'cust_main',
2217                           },
2218                         ],
2219     },
2220
2221     'cust_tax_adjustment' => {
2222       'columns' => [
2223         'adjustmentnum', 'serial',     '',      '', '', '',
2224         'custnum',          'int',     '',      '', '', '',
2225         'taxname',      'varchar',     '', $char_d, '', '',
2226         'amount',     @money_type,                  '', '', 
2227         'currency',        'char', 'NULL',       3, '', '',
2228         'comment',      'varchar', 'NULL', $char_d, '', '', 
2229         'billpkgnum',       'int', 'NULL',      '', '', '',
2230         #more?  no cust_bill_pkg_tax_location?
2231       ],
2232       'primary_key'  => 'adjustmentnum',
2233       'unique'       => [],
2234       'index'        => [ [ 'custnum' ], [ 'billpkgnum' ] ],
2235       'foreign_keys' => [
2236                           { columns    => [ 'custnum' ],
2237                             table      => 'cust_main',
2238                           },
2239                           { columns    => [ 'billpkgnum' ],
2240                             table      => 'cust_bill_pkg',
2241                           },
2242                         ],
2243     },
2244
2245     'cust_main_county' => { #district+city+county+state+country are checked 
2246                             #off the cust_main_county for validation and to 
2247                             #provide a tax rate.
2248       'columns' => [
2249         'taxnum',    'serial',     '',      '', '', '', 
2250         'district', 'varchar', 'NULL',      20, '', '',
2251         'city',     'varchar', 'NULL', $char_d, '', '',
2252         'county',   'varchar', 'NULL', $char_d, '', '', 
2253         'state',    'varchar', 'NULL', $char_d, '', '', 
2254         'country',     'char',     '',       2, '', '', 
2255         'taxclass', 'varchar', 'NULL', $char_d, '', '', 
2256         'exempt_amount', @money_type,            '', '', 
2257         'exempt_amount_currency', 'char', 'NULL', 3, '', '',
2258         'tax',         'real',     '',      '', '', '', #tax %
2259         'taxname',  'varchar', 'NULL', $char_d, '', '', 
2260         'setuptax',    'char', 'NULL',       1, '', '', # Y = setup tax exempt
2261         'recurtax',    'char', 'NULL',       1, '', '', # Y = recur tax exempt
2262       ],
2263       'primary_key' => 'taxnum',
2264       'unique' => [],
2265   #    'unique' => [ ['taxnum'], ['state', 'county'] ],
2266       'index' => [ [ 'district' ], [ 'city' ], [ 'county' ], [ 'state' ], 
2267                    [ 'country' ],
2268                    [ 'taxclass' ],
2269                  ],
2270     },
2271
2272     'tax_rate'    => {
2273       'columns' => [
2274         'taxnum',       'serial',     '',      '', '', '', 
2275         'geocode',     'varchar', 'NULL', $char_d, '', '',#cch provides 10 char
2276         'data_vendor', 'varchar', 'NULL', $char_d, '', '',#auto update source
2277         'location',    'varchar', 'NULL', $char_d, '', '',#provided by tax authority
2278         'taxclassnum', 'int',     'NULL',      '', '', '', 
2279         'effective_date', @date_type, '', '', 
2280         'tax',        @taxrate_type,      '', '',        # tax %
2281         'excessrate', @taxrate_typen,     '', '',        # second tax %
2282         'taxbase',    @money_typen, '', '',              # amount at first tax rate
2283         'taxmax',     @money_typen, '', '',              # maximum about at both rates
2284         'usetax',        @taxrate_typen,     '', '',     # tax % when non-local
2285         'useexcessrate', @taxrate_typen,     '', '',     # second tax % when non-local
2286         'unittype',    'int',  'NULL', '', '', '',      # for fee
2287         'fee',         @taxrate_typen,     '', '',      # amount tax per unit
2288         'excessfee',   @taxrate_typen,     '', '',      # second amount tax per unit
2289         'feebase',     @taxrate_typen,     '', '',      # units taxed at first rate
2290         'feemax',      @taxrate_typen,     '', '',      # maximum number of unit taxed
2291         'maxtype',     'int',  'NULL', '', '', '',      # indicator of how thresholds accumulate
2292         'taxname', 'varchar',  'NULL', $char_d, '', '', # may appear on invoice
2293         'taxauth',     'int',  'NULL', '', '', '',      # tax authority
2294         'basetype',    'int',  'NULL', '', '', '', # indicator of basis for tax
2295         'passtype',    'int',  'NULL', '', '', '', # indicator declaring how item should be shown
2296         'passflag',    'char', 'NULL', 1, '', '',  # Y = required to list as line item, N = Prohibited
2297         'setuptax',    'char', 'NULL', 1, '', '',  # Y = setup tax exempt
2298         'recurtax',    'char', 'NULL', 1, '', '',  # Y = recur tax exempt
2299         'inoutcity',   'char', 'NULL', 1, '', '',  # '', 'I', or 'O'
2300         'inoutlocal',  'char', 'NULL', 1, '', '',  # '', 'I', or 'O'
2301         'manual',      'char', 'NULL', 1, '', '',  # Y = manually edited
2302         'disabled',    'char', 'NULL', 1, '', '',  # Y = tax disabled
2303       ],
2304       'primary_key'  => 'taxnum',
2305       'unique'       => [],
2306       'index'        => [ ['taxclassnum'], ['data_vendor', 'geocode'] ],
2307       'foreign_keys' => [
2308                           { columns    => [ 'taxclassnum' ],
2309                             table      => 'tax_class',
2310                           },
2311                         ],
2312     },
2313
2314     'tax_rate_location' => { 
2315       'columns' => [
2316         'taxratelocationnum', 'serial',  '',     '', '', '', 
2317         'data_vendor',        'varchar', 'NULL', $char_d, '', '',
2318         'geocode',            'varchar', '',     20,      '', '', 
2319         'city',               'varchar', 'NULL', $char_d, '', '',
2320         'county',             'varchar', 'NULL', $char_d, '', '',
2321         'state',              'char',    'NULL',       2, '', '', 
2322         'country',            'char',    'NULL',       2, '', '',
2323         'disabled',           'char',    'NULL', 1, '', '',
2324       ],
2325       'primary_key' => 'taxratelocationnum',
2326       'unique' => [],
2327       'index' => [ [ 'data_vendor', 'geocode', 'disabled' ] ],
2328     },
2329
2330     'cust_tax_location' => { 
2331       'columns' => [
2332         'custlocationnum', 'serial',  '',     '', '', '', 
2333         'data_vendor',     'varchar', 'NULL', $char_d, '', '', # update source
2334         'city',            'varchar', 'NULL', $char_d, '', '',
2335         'postalcity',      'varchar', 'NULL', $char_d, '', '',
2336         'county',          'varchar', 'NULL', $char_d, '', '',
2337         'zip',             'char',    'NULL', 5,  '', '', 
2338         'state',           'char',    '',     2,  '', '', 
2339         'country',         'char',    'NULL', 2,  '', '', # should not actually be NULL, but cch...
2340         'ziphi',           'char',    'NULL', 10, '', '',
2341         'ziplo',           'char',    'NULL', 10, '', '',
2342         'plus4hi',         'char',    'NULL', 4,  '', '', 
2343         'plus4lo',         'char',    'NULL', 4,  '', '', 
2344         'default_location','char',    'NULL', 1,  '', '', # Y = default for zip
2345         'cityflag',        'char',    'NULL', 1,  '', '', # I(n)/O(out)/B(oth)/NULL
2346         'geocode',         'varchar', '',    20,  '', '', 
2347       ],
2348       'primary_key' => 'custlocationnum',
2349       'unique' => [],
2350       'index' => [ [ 'zip', 'plus4lo', 'plus4hi', 'ziphi', 'ziplo' ] ],
2351     },
2352
2353     'tax_class' => { 
2354       'columns' => [
2355         'taxclassnum',  'serial',  '',            '', '', '',
2356         'data_vendor',  'varchar', 'NULL',   $char_d, '', '',
2357         'taxclass',     'varchar', '',       $char_d, '', '',          
2358         'description',  'varchar', '',     2*$char_d, '', '',          
2359       ],
2360       'primary_key' => 'taxclassnum',
2361       'unique' => [ [ 'data_vendor', 'taxclass' ] ],
2362       'index' => [],
2363     },
2364
2365     'tax_status' => {
2366       'columns' => [
2367         'taxstatusnum', 'serial', '',             '', '', '',
2368         'data_vendor',  'varchar', 'NULL',   $char_d, '', '',
2369         'taxstatus',    'varchar', '',       $char_d, '', '',          
2370         'description',  'varchar', '',       $char_d, '', '',
2371       ],
2372       'primary_key' => 'taxstatusnum',
2373       'unique'      => [ [ 'data_vendor', 'taxstatus' ] ],
2374       'index' => [],
2375     },
2376
2377     'cust_pay_pending' => {
2378       'columns' => [
2379         'paypendingnum',      'serial',     '',      '', '', '',
2380         'custnum',               'int',     '',      '', '', '', 
2381         'paid',            @money_type,                  '', '', 
2382         'currency',             'char', 'NULL',       3, '', '',
2383         '_date',            @date_type,                  '', '', 
2384         'payby',                'char',     '',       4, '', '',
2385         'payinfo',           'varchar', 'NULL',     512, '', '',
2386         'paymask',           'varchar', 'NULL', $char_d, '', '', 
2387         'paydate',           'varchar', 'NULL',     10, '', '', 
2388         'recurring_billing', 'varchar', 'NULL', $char_d, '', '',
2389         'payunique',         'varchar', 'NULL', $char_d, '', '', #separate paybatch "unique" functions from current usage
2390
2391         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
2392         'status',       'varchar',     '', $char_d, '', '', 
2393         'session_id',   'varchar', 'NULL', 1024, '', '', # SHA-512-hex
2394         'statustext',   'text',    'NULL',  '', '', '', 
2395         'gatewaynum',   'int',     'NULL',  '', '', '',
2396         #'cust_balance', @money_type,            '', '',
2397         'paynum',       'int',     'NULL',  '', '', '',
2398         'void_paynum',  'int',     'NULL',  '', '', '',
2399         'jobnum',    'bigint',     'NULL',  '', '', '', 
2400         'invnum',       'int',     'NULL',  '', '', '',
2401         'manual',       'char',    'NULL',   1, '', '',
2402         'discount_term','int',     'NULL',  '', '', '',
2403         'failure_status','varchar','NULL',  16, '', '',
2404       ],
2405       'primary_key'  => 'paypendingnum',
2406       'unique'       => [ [ 'payunique' ] ],
2407       'index'        => [ [ 'custnum' ], [ 'status' ],
2408                           ['paynum'], ['void_paynum'], ['jobnum'], ['invnum'],
2409                         ],
2410       'foreign_keys' => [
2411                           { columns    => [ 'custnum' ],
2412                             table      => 'cust_main',
2413                           },
2414                           { columns    => [ 'pkgnum' ],
2415                             table      => 'cust_pkg',
2416                           },
2417                           { columns    => [ 'gatewaynum' ],
2418                             table      => 'payment_gateway',
2419                           },
2420                           { columns    => [ 'paynum' ],
2421                             table      => 'cust_pay',
2422                           },
2423                           { columns    => [ 'void_paynum' ],
2424                             table      => 'cust_pay_void',
2425                             references => [ 'paynum' ],
2426                           },
2427                           { columns    => [ 'jobnum' ],
2428                             table      => 'queue',
2429                           },
2430                           { columns    => [ 'invnum' ],
2431                             table      => 'cust_bill',
2432                           },
2433                         ],
2434     },
2435
2436     'cust_pay' => {
2437       'columns' => [
2438         'paynum',       'serial',    '',       '', '', '',
2439         'custnum',         'int',    '',       '', '', '', 
2440         '_date',     @date_type,                   '', '', 
2441         'paid',      @money_type,                  '', '', 
2442         'currency',       'char', 'NULL',       3, '', '',
2443         'otaker',      'varchar', 'NULL',      32, '', '',
2444         'usernum',         'int', 'NULL',      '', '', '',
2445         'payby',          'char',     '',       4, '', '',
2446         'payinfo',     'varchar', 'NULL',     512, '', '',
2447         'paymask',     'varchar', 'NULL', $char_d, '', '', 
2448         'paydate',     'varchar', 'NULL',      10, '', '', 
2449         'paybatch',    'varchar', 'NULL', $char_d, '', '',#for auditing purposes
2450         'payunique',   'varchar', 'NULL', $char_d, '', '',#separate paybatch "unique" functions from current usage
2451         'closed',         'char', 'NULL',       1, '', '', 
2452         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
2453         'no_auto_apply',  'char', 'NULL',       1, '', '', 
2454
2455         # cash/check deposit info fields
2456         'bank',        'varchar', 'NULL', $char_d, '', '',
2457         'depositor',   'varchar', 'NULL', $char_d, '', '',
2458         'account',     'varchar', 'NULL',      20, '', '',
2459         'teller',      'varchar', 'NULL',      20, '', '',
2460
2461         'batchnum',        'int', 'NULL',      '', '', '',#pay_batch foreign key
2462
2463         # credit card/EFT fields (formerly in paybatch)
2464         'gatewaynum',      'int', 'NULL',      '', '', '', # payment_gateway FK
2465         'processor',   'varchar', 'NULL', $char_d, '', '', # module name
2466         'auth',        'varchar', 'NULL',      16, '', '', # CC auth number
2467         'order_number','varchar', 'NULL', $char_d, '', '', # transaction number
2468       ],
2469       'primary_key'  => 'paynum',
2470       #i guess not now, with cust_pay_pending, if we actually make it here, we _do_ want to record it# 'unique' => [ [ 'payunique' ] ],
2471       'index'        => [ ['custnum'], ['paybatch'], ['payby'], ['_date'],
2472                           ['usernum'],
2473                         ],
2474       'foreign_keys' => [
2475                           { columns    => [ 'custnum' ],
2476                             table      => 'cust_main',
2477                           },
2478                           { columns    => [ 'usernum' ],
2479                             table      => 'access_user',
2480                           },
2481                           { columns    => [ 'pkgnum' ],
2482                             table      => 'cust_pkg',
2483                           },
2484                           { columns    => [ 'batchnum' ],
2485                             table      => 'pay_batch',
2486                           },
2487                           { columns    => [ 'gatewaynum' ],
2488                             table      => 'payment_gateway',
2489                           },
2490                         ],
2491     },
2492
2493     'cust_pay_void' => {
2494       'columns' => [
2495         'paynum',          'int',    '',       '', '', '', 
2496         'custnum',         'int',    '',       '', '', '', 
2497         '_date',      @date_type,                  '', '', 
2498         'paid',      @money_type,                  '', '', 
2499         'currency',       'char', 'NULL',       3, '', '',
2500         'otaker',      'varchar', 'NULL',      32, '', '', 
2501         'usernum',         'int', 'NULL',      '', '', '',
2502         'payby',          'char',     '',       4, '', '',
2503         'payinfo',     'varchar', 'NULL',     512, '', '',
2504         'paymask',     'varchar', 'NULL', $char_d, '', '', 
2505         #'paydate' ?
2506         'paybatch',    'varchar', 'NULL', $char_d, '', '', #for auditing purposes.
2507         'closed',        'char',  'NULL',       1, '', '', 
2508         'pkgnum', 'int',   'NULL', '', '', '', #desired pkgnum for pkg-balances
2509
2510         # cash/check deposit info fields
2511         'bank',       'varchar', 'NULL', $char_d, '', '',
2512         'depositor',  'varchar', 'NULL', $char_d, '', '',
2513         'account',    'varchar', 'NULL',      20, '', '',
2514         'teller',     'varchar', 'NULL',      20, '', '',
2515         'batchnum',       'int', 'NULL',      '', '', '', #pay_batch foreign key
2516
2517         # credit card/EFT fields (formerly in paybatch)
2518         'gatewaynum',      'int', 'NULL',      '', '', '', # payment_gateway FK
2519         'processor',   'varchar', 'NULL', $char_d, '', '', # module name
2520         'auth',        'varchar', 'NULL',      16, '', '', # CC auth number
2521         'order_number','varchar', 'NULL', $char_d, '', '', # transaction number
2522
2523         #void fields
2524         'void_date',  @date_type,                  '', '', 
2525         'reason',      'varchar', 'NULL', $char_d, '', '', 
2526         'void_usernum',    'int', 'NULL',      '', '', '',
2527       ],
2528       'primary_key'  => 'paynum',
2529       'unique'       => [],
2530       'index'        => [ ['custnum'], ['usernum'], ['void_usernum'] ],
2531       'foreign_keys' => [
2532                           { columns    => [ 'custnum' ],
2533                             table      => 'cust_main',
2534                           },
2535                           { columns    => [ 'usernum' ],
2536                             table      => 'access_user',
2537                           },
2538                           { columns    => [ 'pkgnum' ],
2539                             table      => 'cust_pkg',
2540                           },
2541                           { columns    => [ 'batchnum' ],
2542                             table      => 'pay_batch',
2543                           },
2544                           { columns    => [ 'gatewaynum' ],
2545                             table      => 'payment_gateway',
2546                           },
2547                           { columns    => [ 'void_usernum' ],
2548                             table      => 'access_user',
2549                             references => [ 'usernum' ],
2550                           },
2551                         ],
2552     },
2553
2554     'cust_bill_pay' => {
2555       'columns' => [
2556         'billpaynum', 'serial',     '',   '', '', '', 
2557         'invnum',  'int',     '',   '', '', '', 
2558         'paynum',  'int',     '',   '', '', '', 
2559         'amount',  @money_type, '', '', 
2560         '_date',   @date_type, '', '', 
2561         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
2562       ],
2563       'primary_key'  => 'billpaynum',
2564       'unique'       => [],
2565       'index'        => [ [ 'paynum' ], [ 'invnum' ] ],
2566       'foreign_keys' => [
2567                           { columns    => [ 'invnum' ],
2568                             table      => 'cust_bill',
2569                           },
2570                           { columns    => [ 'paynum' ],
2571                             table      => 'cust_pay',
2572                           },
2573                           { columns    => [ 'pkgnum' ],
2574                             table      => 'cust_pkg',
2575                           },
2576                         ],
2577     },
2578
2579     'cust_bill_pay_batch' => {
2580       'columns' => [
2581         'billpaynum', 'serial',     '',   '', '', '', 
2582         'invnum',  'int',     '',   '', '', '', 
2583         'paybatchnum',  'int',     '',   '', '', '', 
2584         'amount',  @money_type, '', '', 
2585         '_date',   @date_type, '', '', 
2586       ],
2587       'primary_key'  => 'billpaynum',
2588       'unique'       => [],
2589       'index'        => [ [ 'paybatchnum' ], [ 'invnum' ] ],
2590       'foreign_keys' => [
2591                           { columns    => [ 'invnum' ],
2592                             table      => 'cust_bill',
2593                           },
2594                           { columns    => [ 'paybatchnum' ],
2595                             table      => 'cust_pay_batch',
2596                           },
2597                         ],
2598     },
2599
2600     'cust_bill_pay_pkg' => {
2601       'columns' => [
2602         'billpaypkgnum', 'serial', '', '', '', '',
2603         'billpaynum',       'int', '', '', '', '',
2604         'billpkgnum',       'int', '', '', '', '',
2605         'billpkgtaxlocationnum', 'int', 'NULL', '', '', '',
2606         'billpkgtaxratelocationnum', 'int', 'NULL', '', '', '',
2607         'amount',         @money_type,     '', '',
2608         'setuprecur',      'varchar', '', $char_d, '', '',
2609         'sdate',   @date_type, '', '', 
2610         'edate',   @date_type, '', '', 
2611       ],
2612       'primary_key'  => 'billpaypkgnum',
2613       'unique'       => [],
2614       'index'        => [ [ 'billpaynum' ], [ 'billpkgnum' ], ],
2615       'foreign_keys' => [
2616                           { columns    => [ 'billpaynum' ],
2617                             table      => 'cust_bill_pay',
2618                           },
2619                           { columns    => [ 'billpkgnum' ],
2620                             table      => 'cust_bill_pkg',
2621                           },
2622                           { columns    => [ 'billpkgtaxlocationnum' ],
2623                             table      => 'cust_bill_pkg_tax_location',
2624                           },
2625                           { columns    => [ 'billpkgtaxratelocationnum' ],
2626                             table      => 'cust_bill_pkg_tax_rate_location',
2627                           },
2628                         ],
2629     },
2630
2631     'pay_batch' => { #batches of payments to an external processor
2632       'columns' => [
2633         'batchnum', 'serial',     '', '', '', '', 
2634         'agentnum',    'int', 'NULL', '', '', '', 
2635         'payby',      'char',     '',  4, '', '', # CARD/CHEK
2636         'status',     'char', 'NULL',  1, '', '', 
2637         'download',       @date_type,     '', '', 
2638         'upload',         @date_type,     '', '', 
2639         'title',   'varchar', 'NULL',255, '', '',
2640         'processor_id',   'varchar', 'NULL',255, '', '',
2641       ],
2642       'primary_key'  => 'batchnum',
2643       'unique'       => [],
2644       'index'        => [],
2645       'foreign_keys' => [
2646                           { columns    => [ 'agentnum' ],
2647                             table      => 'agent',
2648                           },
2649                         ],
2650     },
2651
2652     'cust_pay_batch' => { #list of customers in current CARD/CHEK batch
2653       'columns' => [
2654         'paybatchnum',    'serial',     '',      '', '', '', 
2655         'batchnum',          'int',     '',      '', '', '', 
2656         'invnum',            'int',     '',      '', '', '', 
2657         'custnum',           'int',     '',      '', '', '', 
2658         'last',          'varchar',     '', $char_d, '', '', 
2659         'first',         'varchar',     '', $char_d, '', '', 
2660         'address1',      'varchar',     '', $char_d, '', '', 
2661         'address2',      'varchar', 'NULL', $char_d, '', '', 
2662         'city',          'varchar', 'NULL', $char_d, '', '', 
2663         'state',         'varchar', 'NULL', $char_d, '', '', 
2664         'zip',           'varchar', 'NULL',      10, '', '', 
2665         'country',          'char',     '',       2, '', '', 
2666         'payby',            'char',     '',       4, '', '',
2667         'payinfo',       'varchar', 'NULL',     512, '', '', 
2668         #'exp',          @date_type,                  '', '',
2669         'exp',           'varchar', 'NULL',      11, '', '', 
2670         'payname',       'varchar', 'NULL', $char_d, '', '', 
2671         'amount',      @money_type,                  '', '', 
2672         'currency',         'char', 'NULL',       3, '', '',
2673         'status',        'varchar', 'NULL', $char_d, '', '', 
2674         'failure_status','varchar', 'NULL',      16, '', '',
2675         'error_message', 'varchar', 'NULL', $char_d, '', '',
2676       ],
2677       'primary_key'  => 'paybatchnum',
2678       'unique'       => [],
2679       'index'        => [ ['batchnum'], ['invnum'], ['custnum'] ],
2680       'foreign_keys' => [
2681                           { columns    => [ 'batchnum' ],
2682                             table      => 'pay_batch',
2683                           },
2684                           #{ columns    => [ 'invnum' ],
2685                           #  table      => 'cust_bill',
2686                           #},
2687                           { columns    => [ 'custnum' ],
2688                             table      => 'cust_main',
2689                           },
2690                         ],
2691     },
2692
2693     'fcc477map' => {
2694       'columns' => [
2695         'formkey',   'varchar',     '', 255, '', '',
2696         'formvalue',    'text', 'NULL',  '', '', '',
2697       ],
2698       'primary_key' => 'formkey',
2699       'unique'      => [],
2700       'index'       => [],
2701     },
2702
2703     'cust_pkg' => {
2704       'columns' => [
2705         'pkgnum',           'serial',     '', '', '', '', 
2706         'custnum',             'int',     '', '', '', '', 
2707         'pkgpart',             'int',     '', '', '', '', 
2708         'pkgbatch',        'varchar', 'NULL', $char_d, '', '',
2709         'contactnum',          'int', 'NULL', '', '', '', 
2710         'locationnum',         'int', 'NULL', '', '', '',
2711         'otaker',          'varchar', 'NULL', 32, '', '', 
2712         'usernum',             'int', 'NULL', '', '', '',
2713         'salesnum',            'int', 'NULL', '', '', '', 
2714         'order_date',     @date_type,             '', '', 
2715         'start_date',     @date_type,             '', '', 
2716         'setup',          @date_type,             '', '', 
2717         'bill',           @date_type,             '', '', 
2718         'last_bill',      @date_type,             '', '', 
2719         'susp',           @date_type,             '', '', 
2720         'adjourn',        @date_type,             '', '', 
2721         'resume',         @date_type,             '', '', 
2722         'cancel',         @date_type,             '', '', 
2723         'uncancel',       @date_type,             '', '', 
2724         'uncancel_pkgnum',     'int', 'NULL', '', '', '',
2725         'expire',         @date_type,             '', '', 
2726         'contract_end',   @date_type,             '', '',
2727         'dundate',        @date_type,             '', '',
2728         'change_date',    @date_type,             '', '',
2729         'change_pkgnum',       'int', 'NULL', '', '', '',
2730         'change_pkgpart',      'int', 'NULL', '', '', '',
2731         'change_locationnum',  'int', 'NULL', '', '', '',
2732         'change_custnum',      'int', 'NULL', '', '', '',
2733         'main_pkgnum',         'int', 'NULL', '', '', '',
2734         'pkglinknum',          'int', 'NULL', '', '', '',
2735         'manual_flag',        'char', 'NULL',  1, '', '', 
2736         'no_auto',            'char', 'NULL',  1, '', '', 
2737         'quantity',            'int', 'NULL', '', '', '',
2738         'agent_pkgid',     'varchar', 'NULL', $char_d, '', '',
2739         'waive_setup',        'char', 'NULL',  1, '', '', 
2740         'recur_show_zero',    'char', 'NULL',  1, '', '',
2741         'setup_show_zero',    'char', 'NULL',  1, '', '',
2742         'change_to_pkgnum',    'int', 'NULL', '', '', '',
2743         'separate_bill',      'char', 'NULL',  1, '', '',
2744       ],
2745       'primary_key'  => 'pkgnum',
2746       'unique'       => [],
2747       'index'        => [ ['custnum'], ['pkgpart'], ['pkgbatch'],
2748                           ['locationnum'], ['usernum'], ['agent_pkgid'],
2749                           ['order_date'], [ 'start_date' ], ['setup'], ['bill'],
2750                           ['last_bill'], ['susp'], ['adjourn'], ['resume'],
2751                           ['cancel'], ['expire'], ['contract_end'],
2752                           ['change_date'],
2753                           ['no_auto'],
2754                           #['contactnum'],
2755                           ['salesnum'],
2756                           #['uncancel_pkgnum'],
2757                           #['change_pkgnum'], ['change_locationnum'],
2758                           #['change_custnum'],
2759                           ['main_pkgnum'],
2760                           #['pkglinknum'], ['change_to_pkgnum'],
2761                         ],
2762       'foreign_keys' => [
2763                           { columns    => [ 'custnum' ],
2764                             table      => 'cust_main',
2765                           },
2766                           { columns    => [ 'pkgpart' ],
2767                             table      => 'part_pkg',
2768                           },
2769                           { columns    => [ 'contactnum' ],
2770                             table      => 'contact',
2771                           },
2772                           { columns    => [ 'locationnum' ],
2773                             table      => 'cust_location',
2774                           },
2775                           { columns    => [ 'usernum' ],
2776                             table      => 'access_user',
2777                           },
2778                           { columns    => [ 'salesnum' ],
2779                             table      => 'sales',
2780                           },
2781                           { columns    => [ 'uncancel_pkgnum' ],
2782                             table      => 'cust_pkg',
2783                             references => [ 'pkgnum' ],
2784                           },
2785                           { columns    => [ 'change_pkgnum' ],
2786                             table      => 'cust_pkg',
2787                             references => [ 'pkgnum' ],
2788                           },
2789                           { columns    => [ 'change_pkgpart' ],
2790                             table      => 'part_pkg',
2791                             references => [ 'pkgpart' ],
2792                           },
2793                           { columns    => [ 'change_locationnum' ],
2794                             table      => 'cust_location',
2795                             references => [ 'locationnum' ],
2796                           },
2797                           { columns    => [ 'change_custnum' ],
2798                             table      => 'cust_main',
2799                             references => [ 'custnum' ],
2800                           },
2801                           { columns    => [ 'main_pkgnum' ],
2802                             table      => 'cust_pkg',
2803                             references => [ 'pkgnum' ],
2804                           },
2805                           { columns    => [ 'pkglinknum' ],
2806                             table      => 'part_pkg_link',
2807                           },
2808                           { columns    => [ 'change_to_pkgnum' ],
2809                             table      => 'cust_pkg',
2810                             references => [ 'pkgnum' ],
2811                           },
2812                         ],
2813    },
2814
2815     'cust_pkg_option' => {
2816       'columns' => [
2817         'optionnum', 'serial', '', '', '', '', 
2818         'pkgnum', 'int', '', '', '', '', 
2819         'optionname', 'varchar', '', $char_d, '', '', 
2820         'optionvalue', 'text', 'NULL', '', '', '', 
2821       ],
2822       'primary_key'  => 'optionnum',
2823       'unique'       => [],
2824       'index'        => [ [ 'pkgnum' ], [ 'optionname' ] ],
2825       'foreign_keys' => [
2826                           { columns    => [ 'pkgnum' ],
2827                             table      => 'cust_pkg',
2828                           },
2829                         ],
2830     },
2831
2832     'cust_pkg_detail' => {
2833       'columns' => [
2834         'pkgdetailnum', 'serial', '',        '', '', '',
2835         'pkgnum',          'int', '',        '', '', '',
2836         'detail',      'varchar', '', 2*$char_d, '', '', 
2837         'detailtype',     'char', '',         1, '', '', #"I"nvoice or "C"omment
2838         'weight',          'int', '',        '', '', '',
2839       ],
2840       'primary_key'  => 'pkgdetailnum',
2841       'unique'       => [],
2842       'index'        => [ [ 'pkgnum', 'detailtype' ] ],
2843       'foreign_keys' => [
2844                           { columns    => [ 'pkgnum' ],
2845                             table      => 'cust_pkg',
2846                           },
2847                         ],
2848     },
2849
2850     'cust_pkg_reason' => {
2851       'columns' => [
2852         'num',      'serial',    '',   '', '', '', 
2853         'pkgnum',   'int',    '',   '', '', '', 
2854         'reasonnum','int',    '',   '', '', '', 
2855         'action',   'char', 'NULL', 1, '', '',     #should not be nullable
2856         'otaker',   'varchar', 'NULL', 32, '', '', 
2857         'usernum',   'int', 'NULL', '', '', '',
2858         'date',     @date_type, '', '', 
2859       ],
2860       'primary_key'  => 'num',
2861       'unique'       => [],
2862       'index'        => [ ['pkgnum'], ['reasonnum'], ['action'], ['usernum'], ],
2863       'foreign_keys' => [
2864                           { columns    => [ 'pkgnum' ],
2865                             table      => 'cust_pkg',
2866                           },
2867                           { columns    => [ 'reasonnum' ],
2868                             table      => 'reason',
2869                           },
2870                           { columns    => [ 'usernum' ],
2871                             table      => 'access_user',
2872                           },
2873                         ],
2874     },
2875
2876     'cust_pkg_reason_fee' => {
2877       'columns' => [
2878         'pkgreasonfeenum', 'serial', '', '', '', '',
2879         'pkgreasonnum',       'int', '', '', '', '',
2880         'billpkgnum',         'int', 'NULL', '', '', '',
2881         'feepart',            'int', '', '', '', '',
2882         'nextbill',          'char', 'NULL',  1, '', '',
2883       ],
2884       'primary_key'  => 'pkgreasonfeenum',
2885       'unique' => [ [ 'billpkgnum' ], [ 'pkgreasonnum' ] ], # one-to-one link
2886       'index'  => [ [ 'feepart' ] ],
2887       'foreign_keys' => [
2888                           { columns     => [ 'pkgreasonnum' ],
2889                             table       => 'cust_pkg_reason',
2890                             references  => [ 'num' ],
2891                           },
2892                           { columns     => [ 'feepart' ],
2893                             table       => 'part_fee',
2894                           },
2895                           # can't link billpkgnum, because of voids
2896       ],
2897     },
2898
2899     'cust_pkg_discount' => {
2900       'columns' => [
2901         'pkgdiscountnum', 'serial', '',        '', '', '',
2902         'pkgnum',            'int', '',        '', '', '', 
2903         'discountnum',       'int', '',        '', '', '',
2904         'months_used',   'decimal', 'NULL', '7,4', '', '',
2905         'end_date',     @date_type,                '', '',
2906         'otaker',        'varchar', 'NULL',    32, '', '', 
2907         'usernum',           'int', 'NULL',    '', '', '',
2908         'disabled',         'char', 'NULL',     1, '', '', 
2909         'setuprecur',       'char', 'NULL',     5, '', '',
2910       ],
2911       'primary_key'  => 'pkgdiscountnum',
2912       'unique'       => [],
2913       'index'        => [ [ 'pkgnum' ], [ 'discountnum' ], [ 'usernum' ], ],
2914       'foreign_keys' => [
2915                           { columns    => [ 'pkgnum' ],
2916                             table      => 'cust_pkg',
2917                           },
2918                           { columns    => [ 'discountnum' ],
2919                             table      => 'discount',
2920                           },
2921                           { columns    => [ 'usernum' ],
2922                             table      => 'access_user',
2923                           },
2924                         ],
2925     },
2926
2927     'cust_pkg_usage' => {
2928       'columns' => [
2929         'pkgusagenum', 'serial', '', '', '', '',
2930         'pkgnum',         'int', '', '', '', '',
2931         'minutes',        'double precision', '', '', '', '',
2932         'pkgusagepart',   'int', '', '', '', '',
2933       ],
2934       'primary_key'  => 'pkgusagenum',
2935       'unique'       => [],
2936       'index'        => [ [ 'pkgnum' ], [ 'pkgusagepart' ] ],
2937       'foreign_keys' => [
2938                           { columns    => [ 'pkgnum' ],
2939                             table      => 'cust_pkg',
2940                           },
2941                           { columns    => [ 'pkgusagepart' ],
2942                             table      => 'part_pkg_usage',
2943                           },
2944                         ],
2945     },
2946
2947     'cdr_cust_pkg_usage' => {
2948       'columns' => [
2949         'cdrusagenum', 'bigserial', '', '', '', '',
2950         'acctid',      'bigint',    '', '', '', '',
2951         'pkgusagenum', 'int',       '', '', '', '',
2952         'minutes',     'double precision',       '', '', '', '',
2953       ],
2954       'primary_key'  => 'cdrusagenum',
2955       'unique'       => [],
2956       'index'        => [ [ 'pkgusagenum' ], [ 'acctid' ] ],
2957       'foreign_keys' => [
2958                           { columns    => [ 'acctid' ],
2959                             table      => 'cdr',
2960                           },
2961                           { columns    => [ 'pkgusagenum' ],
2962                             table      => 'cust_pkg_usage',
2963                           },
2964                         ],
2965     },
2966
2967     'cust_bill_pkg_discount' => {
2968       'columns' => [
2969         'billpkgdiscountnum', 'serial',        '', '', '', '',
2970         'billpkgnum',            'int',        '', '', '', '', 
2971         'pkgdiscountnum',        'int',        '', '', '', '', 
2972         'amount',          @money_type,                '', '', 
2973         'months',            'decimal', 'NULL', '7,4', '', '',
2974       ],
2975       'primary_key'  => 'billpkgdiscountnum',
2976       'unique'       => [],
2977       'index'        => [ [ 'billpkgnum' ], [ 'pkgdiscountnum' ] ],
2978       'foreign_keys' => [
2979                           { columns    => [ 'billpkgnum' ],
2980                             table      => 'cust_bill_pkg',
2981                           },
2982                           { columns    => [ 'pkgdiscountnum' ],
2983                             table      => 'cust_pkg_discount',
2984                           },
2985                         ],
2986     },
2987
2988     'cust_bill_pkg_discount_void' => {
2989       'columns' => [
2990         'billpkgdiscountnum',    'int',        '', '', '', '',
2991         'billpkgnum',            'int',        '', '', '', '', 
2992         'pkgdiscountnum',        'int',        '', '', '', '', 
2993         'amount',          @money_type,                '', '', 
2994         'months',            'decimal', 'NULL', '7,4', '', '',
2995       ],
2996       'primary_key'  => 'billpkgdiscountnum',
2997       'unique'       => [],
2998       'index'        => [ [ 'billpkgnum' ], [ 'pkgdiscountnum' ] ],
2999       'foreign_keys' => [
3000                           { columns    => [ 'billpkgnum' ],
3001                             table      => 'cust_bill_pkg_void',
3002                           },
3003                           { columns    => [ 'pkgdiscountnum' ],
3004                             table      => 'cust_pkg_discount',
3005                           },
3006                         ],
3007     },
3008
3009     'discount' => {
3010       'columns' => [
3011         'discountnum', 'serial',     '',      '', '', '',
3012         #'agentnum',       'int', 'NULL',      '', '', '', 
3013         'classnum',       'int', 'NULL',      '', '', '',
3014         'name',       'varchar', 'NULL', $char_d, '', '',
3015         'amount',   @money_type,                  '', '', 
3016         'percent',    'decimal',     '',   '7,4', '', '',
3017         'months',     'decimal', 'NULL',   '7,4', '', '',
3018         'disabled',      'char', 'NULL',       1, '', '', 
3019         'setup',         'char', 'NULL',       1, '', '', 
3020         #'linked',        'char', 'NULL',       1, '', '',
3021       ],
3022       'primary_key'  => 'discountnum',
3023       'unique'       => [],
3024       'index'        => [], # [ 'agentnum' ], ],
3025       'foreign_keys' => [
3026                           { columns    => [ 'classnum' ],
3027                             table      => 'discount_class',
3028                           },
3029                         ],
3030     },
3031
3032     'discount_class' => {
3033       'columns' => [
3034         'classnum',    'serial',   '',      '', '', '', 
3035         'classname',   'varchar',  '', $char_d, '', '', 
3036         #'categorynum', 'int',  'NULL',      '', '', '', 
3037         'disabled',    'char', 'NULL',       1, '', '', 
3038       ],
3039       'primary_key' => 'classnum',
3040       'unique' => [],
3041       'index' => [ ['disabled'] ],
3042     },
3043
3044     'cust_refund' => {
3045       'columns' => [
3046         'refundnum',    'serial',    '',   '', '', '', 
3047         'custnum',  'int',    '',   '', '', '', 
3048         '_date',        @date_type, '', '', 
3049         'refund',       @money_type, '', '', 
3050         'currency',       'char', 'NULL',       3, '', '',
3051         'otaker',       'varchar',   'NULL',   32, '', '', 
3052         'usernum',   'int', 'NULL', '', '', '',
3053         'reason',       'varchar',   'NULL',   $char_d, '', '', 
3054         'reasonnum',   'int', 'NULL', '', '', '',
3055         'payby',        'char',   '',     4, '', '', # CARD/BILL/COMP, should
3056                                                      # be index into payby
3057                                                      # table eventually
3058         'payinfo',      'varchar',   'NULL', 512, '', '', #see cust_main above
3059         'paymask', 'varchar', 'NULL', $char_d, '', '', 
3060         'paybatch',     'varchar',   'NULL', $char_d, '', '', 
3061         'closed',    'char', 'NULL', 1, '', '', 
3062         # credit card/EFT fields (formerly in paybatch)
3063         'gatewaynum',     'int', 'NULL', '', '', '', # payment_gateway FK
3064         'processor',  'varchar', 'NULL', $char_d, '', '', # module name
3065         'auth',       'varchar','NULL',16, '', '', # CC auth number
3066         'order_number', 'varchar','NULL',$char_d, '', '', # transaction number
3067       ],
3068       'primary_key'  => 'refundnum',
3069       'unique'       => [],
3070       'index'        => [ ['custnum'], ['_date'], [ 'usernum' ], ],
3071       'foreign_keys' => [
3072                           { columns    => [ 'custnum' ],
3073                             table      => 'cust_main',
3074                           },
3075                           { columns    => [ 'usernum' ],
3076                             table      => 'access_user',
3077                           },
3078                           { columns    => [ 'reasonnum' ],
3079                             table      => 'reason',
3080                           },
3081                           { columns    => [ 'gatewaynum' ],
3082                             table      => 'payment_gateway',
3083                           },
3084                         ],
3085     },
3086
3087     'cust_credit_refund' => {
3088       'columns' => [
3089         'creditrefundnum', 'serial',     '',   '', '', '', 
3090         'crednum',  'int',     '',   '', '', '', 
3091         'refundnum',  'int',     '',   '', '', '', 
3092         'amount',  @money_type, '', '', 
3093         '_date',   @date_type, '', '', 
3094       ],
3095       'primary_key'  => 'creditrefundnum',
3096       'unique'       => [],
3097       'index'        => [ ['crednum'], ['refundnum'] ],
3098       'foreign_keys' => [
3099                           { columns    => [ 'crednum' ],
3100                             table      => 'cust_credit',
3101                           },
3102                           { columns    => [ 'refundnum' ],
3103                             table      => 'cust_refund',
3104                           },
3105                         ],
3106     },
3107
3108
3109     'cust_svc' => {
3110       'columns' => [
3111         'svcnum',      'serial',     '', '', '', '', 
3112         'pkgnum',         'int', 'NULL', '', '', '', 
3113         'svcpart',        'int',     '', '', '', '', 
3114         'agent_svcid',    'int', 'NULL', '', '', '',
3115         'overlimit',           @date_type,   '', '', 
3116       ],
3117       'primary_key'  => 'svcnum',
3118       'unique'       => [],
3119       'index'        => [ ['svcnum'], ['pkgnum'], ['svcpart'],
3120                           ['agent_svcid'],
3121                         ],
3122       'foreign_keys' => [
3123                           { columns    => [ 'pkgnum' ],
3124                             table      => 'cust_pkg',
3125                           },
3126                           { columns    => [ 'svcpart' ],
3127                             table      => 'part_svc',
3128                           },
3129                         ],
3130     },
3131
3132     'cust_svc_option' => {
3133       'columns' => [
3134         'optionnum',   'serial', '', '', '', '', 
3135         'svcnum',      'int', '', '', '', '', 
3136         'optionname',  'varchar', '', $char_d, '', '', 
3137         'optionvalue', 'text', 'NULL', '', '', '', 
3138       ],
3139       'primary_key'  => 'optionnum',
3140       'unique'       => [],
3141       'index'        => [ [ 'svcnum' ], [ 'optionname' ] ],
3142       'foreign_keys' => [
3143                           { columns    => [ 'svcnum' ],
3144                             table      => 'cust_svc',
3145                           },
3146                         ],
3147     },
3148
3149     'svc_export_machine' => {
3150       'columns' => [
3151         'svcexportmachinenum', 'serial', '', '', '', '',
3152         'svcnum',                 'int', '', '', '', '', 
3153         'exportnum',              'int', '', '', '', '', 
3154         'machinenum',             'int', '', '', '', '',
3155       ],
3156       'primary_key'  => 'svcexportmachinenum',
3157       'unique'       => [ ['svcnum', 'exportnum'] ],
3158       'index'        => [],
3159       'foreign_keys' => [
3160                           { columns    => [ 'svcnum' ],
3161                             table      => 'cust_svc',
3162                           },
3163                           { columns    => [ 'exportnum' ],
3164                             table      => 'part_export',
3165                           },
3166                           { columns    => [ 'machinenum' ],
3167                             table      => 'part_export_machine',
3168                           },
3169                         ],
3170     },
3171
3172     'part_export_machine' => {
3173       'columns' => [
3174         'machinenum', 'serial', '', '', '', '',
3175         'exportnum',     'int', '', '', '', '',
3176         'machine',    'varchar', 'NULL', $char_d, '', '', 
3177         'disabled',      'char', 'NULL',       1, '', '',
3178       ],
3179       'primary_key'  => 'machinenum',
3180       'unique'       => [ [ 'exportnum', 'machine' ] ],
3181       'index'        => [ [ 'exportnum' ] ],
3182       'foreign_keys' => [
3183                           { columns    => [ 'exportnum' ],
3184                             table      => 'part_export',
3185                           },
3186                         ],
3187     },
3188
3189     'part_pkg' => {
3190       'columns' => [
3191         'pkgpart',       'serial',    '',   '', '', '', 
3192         'pkgpartbatch',  'varchar', 'NULL', $char_d, '', '',
3193         'pkg',           'varchar',   '',   $char_d, '', '', 
3194         'comment',       'varchar', 'NULL', 2*$char_d, '', '', 
3195         'promo_code',    'varchar', 'NULL', $char_d, '', '', 
3196         'freq',          'varchar',   '',   $char_d, '', '', #billing frequency
3197         'setuptax',      'char', 'NULL', 1, '', '', 
3198         'recurtax',      'char', 'NULL', 1, '', '', 
3199         'plan',          'varchar', 'NULL', $char_d, '', '', 
3200         'disabled',      'char', 'NULL', 1, '', '', 
3201         'custom',        'char', 'NULL', 1, '', '', 
3202         'taxclass',      'varchar', 'NULL', $char_d, '', '', 
3203         'classnum',      'int',     'NULL', '', '', '', 
3204         'addon_classnum','int',     'NULL', '', '', '', 
3205         'taxproductnum', 'int',     'NULL', '', '', '', 
3206         'setup_cost',    @money_typen,          '', '',
3207         'recur_cost',    @money_typen,          '', '',
3208         'pay_weight',    'real',    'NULL', '', '', '',
3209         'credit_weight', 'real',    'NULL', '', '', '',
3210         'agentnum',      'int',     'NULL', '', '', '', 
3211         'fcc_ds0s',      'int',     'NULL', '', '', '', 
3212         'fcc_voip_class','char',    'NULL',  1, '', '',
3213         'no_auto',          'char', 'NULL',  1, '', '', 
3214         'recur_show_zero',  'char', 'NULL',  1, '', '',
3215         'setup_show_zero',  'char', 'NULL',  1, '', '',
3216         'successor',     'int',     'NULL', '', '', '',
3217         'family_pkgpart','int',     'NULL', '', '', '',
3218         'delay_start',   'int',     'NULL', '', '', '',
3219         'start_on_hold', 'char',    'NULL',  1, '', '',
3220         'agent_pkgpartid', 'varchar', 'NULL', 20, '', '',
3221         'expire_months', 'int',     'NULL', '', '', '',
3222         'adjourn_months', 'int',    'NULL', '', '', '',
3223         'contract_end_months','int','NULL', '', '', '',
3224         'change_to_pkgpart', 'int', 'NULL', '', '', '',
3225       ],
3226       'primary_key'  => 'pkgpart',
3227       'unique'       => [],
3228       'index'        => [ [ 'promo_code' ], [ 'disabled' ], [ 'classnum' ],
3229                           [ 'agentnum' ], ['no_auto'], ['agent_pkgpartid'],
3230                         ],
3231       'foreign_keys' => [
3232                           { columns    => [ 'classnum' ],
3233                             table      => 'pkg_class',
3234                           },
3235                           { columns    => [ 'addon_classnum' ],
3236                             table      => 'pkg_class',
3237                             references => [ 'classnum' ],
3238                           },
3239                           { columns    => [ 'taxproductnum' ],
3240                             table      => 'part_pkg_taxproduct',
3241                           },
3242                           { columns    => [ 'agentnum' ],
3243                             table      => 'agent',
3244                           },
3245                           { columns    => [ 'successor' ],
3246                             table      => 'part_pkg',
3247                             references => [ 'pkgpart' ],
3248                           },
3249                           { columns    => [ 'family_pkgpart' ],
3250                             table      => 'part_pkg',
3251                             references => [ 'pkgpart' ],
3252                           },
3253                           { columns    => [ 'change_to_pkgpart' ],
3254                             table      => 'part_pkg',
3255                             references => [ 'pkgpart' ],
3256                           },
3257                         ],
3258     },
3259
3260     'part_pkg_msgcat' => {
3261       'columns' => [
3262         'pkgpartmsgnum',  'serial',     '',        '', '', '',
3263         'pkgpart',           'int',     '',        '', '', '',
3264         'locale',        'varchar',     '',        16, '', '',
3265         'pkg',           'varchar',     '',   $char_d, '', '', #longer/no limit?
3266         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
3267       ],
3268       'primary_key'  => 'pkgpartmsgnum',
3269       'unique'       => [ [ 'pkgpart', 'locale' ] ],
3270       'index'        => [],
3271       'foreign_keys' => [
3272                           { columns    => [ 'pkgpart' ],
3273                             table      => 'part_pkg',
3274                           },
3275                         ],
3276     },
3277
3278     'part_pkg_currency' => {
3279       'columns' => [
3280         'pkgcurrencynum', 'serial', '',      '', '', '',
3281         'pkgpart',           'int', '',      '', '', '',
3282         'currency',         'char', '',       3, '', '',
3283         'optionname',    'varchar', '', $char_d, '', '', 
3284         'optionvalue',      'text', '',      '', '', '', 
3285       ],
3286       'primary_key'  => 'pkgcurrencynum',
3287       'unique'       => [ [ 'pkgpart', 'currency', 'optionname' ] ],
3288       'index'        => [ ['pkgpart'] ],
3289       'foreign_keys' => [
3290                           { columns    => [ 'pkgpart' ],
3291                             table      => 'part_pkg',
3292                           },
3293                         ],
3294     },
3295
3296     'currency_exchange' => {
3297       'columns' => [
3298         'currencyratenum', 'serial', '',    '', '', '',
3299         'from_currency',     'char', '',     3, '', '',
3300         'to_currency',       'char', '',     3, '', '',
3301         'rate',           'decimal', '', '7,6', '', '',
3302       ],
3303       'primary_key' => 'currencyratenum',
3304       'unique'      => [ [ 'from_currency', 'to_currency' ] ],
3305       'index'       => [],
3306     },
3307
3308     'part_pkg_usageprice' => {
3309       'columns' => [
3310         'usagepricepart', 'serial',      '',      '', '', '',
3311         'pkgpart',           'int',      '',      '', '', '',
3312         'price',          @money_type,                '', '', 
3313         'currency',         'char',  'NULL',       3, '', '',
3314         'action',        'varchar',      '', $char_d, '', '',
3315         'target',        'varchar',      '', $char_d, '', '',
3316         'amount',        'varchar',      '', $char_d, '', '',
3317       ],
3318       'primary_key'  => 'usagepricepart',
3319       'unique'       => [ [ 'pkgpart', 'currency', 'target' ] ],
3320       'index'        => [ [ 'pkgpart' ] ],
3321       'foreign_keys' => [
3322                           { columns    => [ 'pkgpart' ],
3323                             table      => 'part_pkg',
3324                           },
3325                         ],
3326     },
3327
3328     'cust_pkg_usageprice' => {
3329       'columns' => [
3330         'usagepricenum', 'serial',      '',      '', '', '',
3331         'pkgnum',           'int',      '',      '', '', '',
3332         'usagepricepart',   'int',      '',      '', '', '',
3333         'quantity',         'int',      '',      '', '', '',
3334       ],
3335       'primary_key'  => 'usagepricenum',
3336       'unique'       => [ [ 'pkgnum', 'usagepricepart' ] ],
3337       'index'        => [ [ 'pkgnum' ] ],
3338       'foreign_keys' => [
3339                           { columns    => [ 'pkgnum' ],
3340                             table      => 'cust_pkg',
3341                           },
3342                           { columns    => [ 'usagepricepart' ],
3343                             table      => 'part_pkg_usageprice',
3344                           },
3345                         ],
3346     },
3347
3348     'part_fee' => {
3349       'columns' => [
3350         'feepart',       'serial',    '',   '', '', '',
3351         'itemdesc',      'varchar',   '',   $char_d,   '', '',
3352         'comment',       'varchar', 'NULL', 2*$char_d, '', '',
3353         'disabled',      'char',    'NULL',  1, '', '',
3354         'classnum',      'int',     'NULL', '', '', '',
3355         'taxclass',      'varchar', 'NULL', $char_d, '', '',
3356         'taxproductnum', 'int',     'NULL', '', '', '',
3357         'pay_weight',    'real',    'NULL', '', '', '',
3358         'credit_weight', 'real',    'NULL', '', '', '',
3359         'agentnum',      'int',     'NULL', '', '', '',
3360         'amount',   @money_type,                '', '', 
3361         'percent',     'decimal',    '', '7,4', '', '',
3362         'basis',         'varchar',  '',    16, '', '',
3363         'minimum',    @money_typen,             '', '',
3364         'maximum',    @money_typen,             '', '',
3365         'limit_credit',  'char',    'NULL',  1, '', '',
3366         'setuprecur',    'char',     '',     5, '', '',
3367         'taxable',       'char',    'NULL',  1, '', '',
3368       ],
3369       'primary_key'  => 'feepart',
3370       'unique'       => [],
3371       'index'        => [ [ 'disabled' ], [ 'classnum' ], [ 'agentnum' ]
3372                         ],
3373       'foreign_keys' => [
3374                           { columns    => [ 'classnum' ],
3375                             table      => 'pkg_class',
3376                           },
3377                           { columns    => [ 'taxproductnum' ],
3378                             table      => 'part_pkg_taxproduct',
3379                           },
3380                           { columns    => [ 'agentnum' ],
3381                             table      => 'agent',
3382                           },
3383                         ],
3384     },
3385
3386     'part_fee_msgcat' => {
3387       'columns' => [
3388         'feepartmsgnum',  'serial',     '',        '', '', '',
3389         'feepart',           'int',     '',        '', '', '',
3390         'locale',        'varchar',     '',        16, '', '',
3391         'itemdesc',      'varchar',     '',   $char_d, '', '', #longer/no limit?
3392         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
3393       ],
3394       'primary_key'  => 'feepartmsgnum',
3395       'unique'       => [ [ 'feepart', 'locale' ] ],
3396       'index'        => [],
3397       'foreign_keys' => [
3398                           { columns    => [ 'feepart' ],
3399                             table      => 'part_fee',
3400                           },
3401                         ],
3402     },
3403
3404     'part_fee_usage' => {
3405       'columns' => [
3406         'feepartusagenum','serial',     '',        '', '', '',
3407         'feepart',           'int',     '',        '', '', '',
3408         'classnum',          'int',     '',        '', '', '',
3409         'amount',   @money_type,                '', '',
3410         'percent',     'decimal',    '', '7,4', '', '',
3411       ],
3412       'primary_key'  => 'feepartusagenum',
3413       'unique'       => [ [ 'feepart', 'classnum' ] ],
3414       'index'        => [],
3415       'foreign_keys' => [
3416                           { columns    => [ 'feepart' ],
3417                             table      => 'part_fee',
3418                           },
3419                           { columns    => [ 'classnum' ],
3420                             table      => 'usage_class',
3421                           },
3422                         ],
3423     },
3424
3425     'part_pkg_link' => {
3426       'columns' => [
3427         'pkglinknum',  'serial',   '',      '', '', '',
3428         'src_pkgpart', 'int',      '',      '', '', '',
3429         'dst_pkgpart', 'int',      '',      '', '', '', 
3430         'link_type',   'varchar',  '', $char_d, '', '',
3431         'hidden',      'char', 'NULL',       1, '', '',
3432       ],
3433       'primary_key'  => 'pkglinknum',
3434       'unique'       => [ ['src_pkgpart','dst_pkgpart','link_type','hidden'] ],
3435       'index'        => [ [ 'src_pkgpart' ] ],
3436       'foreign_keys' => [
3437                           { columns    => [ 'src_pkgpart' ],
3438                             table      => 'part_pkg',
3439                             references => [ 'pkgpart' ]
3440                           },
3441                           { columns    => [ 'dst_pkgpart' ],
3442                             table      => 'part_pkg',
3443                             references => [ 'pkgpart' ]
3444                           },
3445                         ],
3446     },
3447     # XXX somewhat borked unique: we don't really want a hidden and unhidden
3448     # it turns out we'd prefer to use svc, bill, and invisibill (or something)
3449
3450     'part_pkg_discount' => {
3451       'columns' => [
3452         'pkgdiscountnum', 'serial',   '',      '', '', '',
3453         'pkgpart',        'int',      '',      '', '', '',
3454         'discountnum',    'int',      '',      '', '', '', 
3455       ],
3456       'primary_key'  => 'pkgdiscountnum',
3457       'unique'       => [ [ 'pkgpart', 'discountnum' ] ],
3458       'index'        => [],
3459       'foreign_keys' => [
3460                           { columns    => [ 'pkgpart' ],
3461                             table      => 'part_pkg',
3462                           },
3463                           { columns    => [ 'discountnum' ],
3464                             table      => 'discount',
3465                           },
3466                         ],
3467     },
3468
3469     'part_pkg_taxclass' => {
3470       'columns' => [
3471         'taxclassnum',  'serial', '',       '', '', '',
3472         'taxclass',     'varchar', '', $char_d, '', '', 
3473         'disabled', 'char',   'NULL',         1, '', '', 
3474       ],
3475       'primary_key' => 'taxclassnum',
3476       'unique'      => [ [ 'taxclass' ] ],
3477       'index'       => [ [ 'disabled' ] ],
3478     },
3479
3480     'part_pkg_taxproduct' => {
3481       'columns' => [
3482         'taxproductnum', 'serial',      '',        '', '', '',
3483         'data_vendor',   'varchar', 'NULL',   $char_d, '', '', 
3484         'taxproduct',    'varchar',     '',   $char_d, '', '', 
3485         'description',   'varchar',     '', 3*$char_d, '', '', 
3486         'note',             'text', 'NULL',        '', '', '',
3487       ],
3488       'primary_key' => 'taxproductnum',
3489       'unique'      => [ [ 'data_vendor', 'taxproduct' ] ],
3490       'index'       => [],
3491     },
3492
3493     'part_pkg_taxrate' => { 
3494       'columns' => [
3495         'pkgtaxratenum', 'serial',  '',     '',      '', '',
3496         'data_vendor',   'varchar', 'NULL', $char_d, '', '', # update source
3497         'geocode',       'varchar', 'NULL', $char_d, '', '', # cch provides 10
3498         'taxproductnum', 'int',  '',     '',       '', '',          
3499         'city',             'varchar', 'NULL', $char_d, '', '', # tax_location?
3500         'county',           'varchar', 'NULL', $char_d, '', '', 
3501         'state',            'varchar', 'NULL', $char_d, '', '', 
3502         'local',            'varchar', 'NULL', $char_d, '', '', 
3503         'country',          'char',    'NULL', 2,       '', '',
3504         'taxclassnumtaxed', 'int',     'NULL', '',      '', '', 
3505         'taxcattaxed',      'varchar', 'NULL', $char_d, '', '', 
3506         'taxclassnum',      'int',     'NULL', '',      '', '', 
3507         'effdate',          @date_type, '', '', 
3508         'taxable',          'char',    'NULL', 1,       '', '', 
3509       ],
3510       'primary_key'  => 'pkgtaxratenum',
3511       'unique'       => [],
3512       'index'        => [ [ 'data_vendor', 'geocode', 'taxproductnum' ] ],
3513       'foreign_keys' => [
3514                           { columns    => [ 'taxproductnum' ],
3515                             table      => 'part_pkg_taxproduct',
3516                           },
3517                           { columns    => [ 'taxclassnumtaxed' ],
3518                             table      => 'tax_class',
3519                             references => [ 'taxclassnum' ],
3520                           },
3521                           { columns    => [ 'taxclassnum' ],
3522                             table      => 'tax_class',
3523                           },
3524                         ],
3525     },
3526
3527     'part_pkg_taxoverride' => { 
3528       'columns' => [
3529         'taxoverridenum', 'serial', '', '', '', '',
3530         'pkgpart',           'int', '', '', '', '',
3531         'taxclassnum',       'int', '', '', '', '',
3532         'usage_class',    'varchar', 'NULL', $char_d, '', '', 
3533       ],
3534       'primary_key'  => 'taxoverridenum',
3535       'unique'       => [],
3536       'index'        => [ [ 'pkgpart' ], [ 'taxclassnum' ] ],
3537       'foreign_keys' => [
3538                           { columns    => [ 'pkgpart' ],
3539                             table      => 'part_pkg',
3540                           },
3541                           { columns    => [ 'taxclassnum' ],
3542                             table      => 'tax_class',
3543                           },
3544                         ],
3545     },
3546
3547 #    'part_title' => {
3548 #      'columns' => [
3549 #        'titlenum',   'int',    '',   '',
3550 #        'title',      'varchar',   '',   $char_d,
3551 #      ],
3552 #      'primary_key' => 'titlenum',
3553 #      'unique' => [ [] ],
3554 #      'index' => [ [] ],
3555 #    },
3556
3557     'pkg_svc' => {
3558       'columns' => [
3559         'pkgsvcnum',   'serial',    '', '', '', '', 
3560         'pkgpart',        'int',    '', '', '', '', 
3561         'svcpart',        'int',    '', '', '', '', 
3562         'quantity',       'int',    '', '', '', '', 
3563         'primary_svc',   'char', 'NULL', 1, '', '', 
3564         'hidden',        'char', 'NULL', 1, '', '',
3565         'bulk_skip',     'char', 'NULL', 1, '', '',
3566         'provision_hold', 'char', 'NULL', 1, '', '',
3567       ],
3568       'primary_key'  => 'pkgsvcnum',
3569       'unique'       => [ ['pkgpart', 'svcpart'] ],
3570       'index'        => [ ['pkgpart'], ['quantity'] ],
3571       'foreign_keys' => [
3572                           { columns    => [ 'pkgpart' ],
3573                             table      => 'part_pkg',
3574                           },
3575                           { columns    => [ 'svcpart' ],
3576                             table      => 'part_svc',
3577                           },
3578                         ],
3579     },
3580
3581     'part_referral' => {
3582       'columns' => [
3583         'refnum',   'serial',     '',        '', '', '', 
3584         'referral', 'varchar',    '',   $char_d, '', '', 
3585         'disabled', 'char',   'NULL',         1, '', '', 
3586         'agentnum', 'int',    'NULL',        '', '', '', 
3587       ],
3588       'primary_key'  => 'refnum',
3589       'unique'       => [],
3590       'index'        => [ ['disabled'], ['agentnum'], ],
3591       'foreign_keys' => [
3592                           { columns    => [ 'agentnum' ],
3593                             table      => 'agent',
3594                           },
3595                         ],
3596     },
3597
3598     'part_svc' => {
3599       'columns' => [
3600         'svcpart',             'serial',     '',        '', '', '', 
3601         'svc',                'varchar',     '',   $char_d, '', '', 
3602         'svcdb',              'varchar',     '',   $char_d, '', '', 
3603         'disabled',              'char', 'NULL',         1, '', '', 
3604         'preserve',              'char', 'NULL',         1, '', '',
3605         'selfservice_access', 'varchar', 'NULL',   $char_d, '', '',
3606         'classnum',               'int', 'NULL',        '', '', '',
3607         'restrict_edit_password','char', 'NULL',         1, '', '',
3608         'has_router',            'char', 'NULL',         1, '', '',
3609 ],
3610       'primary_key'  => 'svcpart',
3611       'unique'       => [],
3612       'index'        => [ [ 'disabled' ] ],
3613       'foreign_keys' => [
3614                           { columns    => [ 'classnum' ],
3615                             table      => 'part_svc_class',
3616                           },
3617                         ],
3618     },
3619
3620     'part_svc_column' => {
3621       'columns' => [
3622         'columnnum',   'serial',      '',      '', '', '', 
3623         'svcpart',     'int',         '',      '', '', '', 
3624         'columnname',  'varchar',     '',      64, '', '', 
3625         'columnlabel', 'varchar', 'NULL', $char_d, '', '',
3626         'columnvalue', 'varchar', 'NULL',     512, '', '', 
3627         'columnflag',  'char',    'NULL',       1, '', '', 
3628         'required',    'char',    'NULL',       1, '', '', 
3629       ],
3630       'primary_key'  => 'columnnum',
3631       'unique'       => [ [ 'svcpart', 'columnname' ] ],
3632       'index'        => [ [ 'svcpart' ] ],
3633       'foreign_keys' => [
3634                           { columns    => [ 'svcpart' ],
3635                             table      => 'part_svc',
3636                           },
3637                         ],
3638     },
3639
3640     'part_svc_class' => {
3641       'columns' => [
3642         'classnum',    'serial',   '',      '', '', '', 
3643         'classname',   'varchar',  '', $char_d, '', '', 
3644         'disabled',    'char', 'NULL',       1, '', '', 
3645       ],
3646       'primary_key' => 'classnum',
3647       'unique' => [],
3648       'index' => [ ['disabled'] ],
3649     },
3650
3651     'part_svc_link' => {
3652       'columns' => [
3653         'svclinknum',  'serial',   '',      '', '', '',
3654         #'linkname',    'varchar', 'NULL', $char_d, '', '',
3655         'agentnum',    'int',     'NULL', '', '', '', 
3656         'src_svcpart', 'int',      '',      '', '', '',
3657         'dst_svcpart', 'int',      '',      '', '', '', 
3658         'link_type',   'varchar',  '', $char_d, '', '',
3659         'disabled',    'char', 'NULL',   1, '', '', 
3660       ],
3661       'primary_key'  => 'svclinknum',
3662       'unique'       => [ ['agentnum','src_svcpart','dst_svcpart','link_type'] ],
3663       'index'        => [ [ 'src_svcpart' ], [ 'src_svcpart', 'link_type' ], [ 'disabled' ] ],
3664       'foreign_keys' => [
3665                           { columns    => [ 'src_svcpart' ],
3666                             table      => 'part_svc',
3667                             references => [ 'svcpart' ]
3668                           },
3669                           { columns    => [ 'dst_svcpart' ],
3670                             table      => 'part_svc',
3671                             references => [ 'svcpart' ]
3672                           },
3673                         ],
3674     },
3675
3676     #(this should be renamed to part_pop)
3677     'svc_acct_pop' => {
3678       'columns' => [
3679         'popnum',    'serial',    '',   '', '', '', 
3680         'city',      'varchar',   '',   $char_d, '', '', 
3681         'state',     'varchar',   '',   $char_d, '', '', 
3682         'ac',        'char',   '',   3, '', '', 
3683         'exch',      'char',   '',   3, '', '', 
3684         'loc',       'char',   'NULL',   4, '', '', #NULL for legacy purposes
3685       ],
3686       'primary_key' => 'popnum',
3687       'unique' => [],
3688       'index' => [ [ 'state' ] ],
3689     },
3690
3691     'part_pop_local' => {
3692       'columns' => [
3693         'localnum',  'serial',     '',     '', '', '', 
3694         'popnum',    'int',     '',     '', '', '', 
3695         'city',      'varchar', 'NULL', $char_d, '', '', 
3696         'state',     'char',    'NULL', 2, '', '', 
3697         'npa',       'char',    '',     3, '', '', 
3698         'nxx',       'char',    '',     3, '', '', 
3699       ],
3700       'primary_key'  => 'localnum',
3701       'unique'       => [],
3702       'index'        => [ [ 'npa', 'nxx' ], [ 'popnum' ] ],
3703       'foreign_keys' => [
3704                          { columns    => [ 'popnum' ],
3705                            table      => 'svc_acct_pop',
3706                          },
3707                        ],
3708     },
3709
3710     'qual' => {
3711       'columns' => [
3712         'qualnum',  'serial',     '',     '', '', '', 
3713         'custnum',    'int',     'NULL',     '', '', '',
3714         'prospectnum',    'int',     'NULL',     '', '', '',
3715         'locationnum',    'int',     'NULL',     '', '', '',
3716         'phonenum',     'varchar', 'NULL',       24, '', '',
3717         'exportnum',      'int', 'NULL', '', '', '', 
3718         'vendor_qual_id',      'varchar', 'NULL', $char_d, '', '', 
3719         'status',      'char', '', 1, '', '', 
3720       ],
3721       'primary_key'  => 'qualnum',
3722       'unique'       => [],
3723       'index'        => [ ['locationnum'], ['custnum'], ['prospectnum'],
3724                           ['phonenum'], ['vendor_qual_id'],
3725                         ],
3726       'foreign_keys' => [
3727                           { columns    => [ 'custnum' ],
3728                             table      => 'cust_main',
3729                           },
3730                           { columns    => [ 'prospectnum' ],
3731                             table      => 'prospect_main',
3732                           },
3733                           { columns    => [ 'locationnum' ],
3734                             table      => 'cust_location',
3735                           },
3736                           { columns    => [ 'exportnum' ],
3737                             table      => 'part_export',
3738                           },
3739                         ],
3740     },
3741
3742     'qual_option' => {
3743       'columns' => [
3744         'optionnum', 'serial', '', '', '', '', 
3745         'qualnum',  'int',     '',     '', '', '', 
3746         'optionname', 'varchar', '', $char_d, '', '', 
3747         'optionvalue', 'text', 'NULL', '', '', '', 
3748       ],
3749       'primary_key'  => 'optionnum',
3750       'unique'       => [],
3751       'index'        => [],
3752       'foreign_keys' => [
3753                           { columns    => [ 'qualnum' ],
3754                             table      => 'qual',
3755                           },
3756                         ],
3757     },
3758
3759     'svc_acct' => {
3760       'columns' => [
3761         'svcnum',    'int',    '',   '', '', '', 
3762         'username',  'varchar',   '',   $username_len, '', '',
3763         '_password', 'varchar',   'NULL',  512, '', '',
3764         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
3765         'sec_phrase', 'varchar',  'NULL',   $char_d, '', '', 
3766         'popnum',    'int',    'NULL',   '', '', '', 
3767         'sectornum', 'int', 'NULL',      '', '', '',
3768         'uid',       'int', 'NULL',   '', '', '', 
3769         'gid',       'int', 'NULL',   '', '', '', 
3770         'finger',    'varchar',   'NULL',   2*$char_d, '', '', 
3771         'dir',       'varchar',   'NULL',   $char_d, '', '', 
3772         'shell',     'varchar',   'NULL',   $char_d, '', '', 
3773         'quota',     'varchar',   'NULL',   $char_d, '', '', 
3774         'slipip',    'varchar',   'NULL',   15, '', '', #four TINYINTs, bah.
3775         # IP address mgmt
3776         'routernum', 'int', 'NULL',      '', '', '',
3777         'blocknum',  'int', 'NULL',      '', '', '', 
3778         'seconds',   'int', 'NULL',   '', '', '', #uhhhh
3779         'seconds_threshold',   'int', 'NULL',   '', '', '',
3780         'upbytes',   'bigint', 'NULL',   '', '', '', 
3781         'upbytes_threshold',   'bigint', 'NULL',   '', '', '',
3782         'downbytes', 'bigint', 'NULL',   '', '', '',
3783         'downbytes_threshold',   'bigint', 'NULL',   '', '', '',
3784         'totalbytes','bigint', 'NULL',   '', '', '',
3785         'totalbytes_threshold',   'bigint', 'NULL',   '', '', '',
3786         'domsvc',    'int',     '', '', '', '', 
3787         'pbxsvc',    'int', 'NULL', '', '', '',
3788         'last_login',  @date_type, '', '', 
3789         'last_logout', @date_type, '', '', 
3790         #cardfortress field(s)
3791         'cf_privatekey',      'text', 'NULL',      '', '', '',
3792         #communigate pro fields (quota = MaxAccountSize)
3793         'cgp_aliases',     'varchar', 'NULL',     255, '', '',
3794         #settings
3795         'cgp_type',        'varchar', 'NULL', $char_d, '', '', #AccountType
3796         'file_quota',      'varchar', 'NULL', $char_d, '', '', #MaxWebSize
3797         'file_maxnum',     'varchar', 'NULL', $char_d, '', '', #MaxWebFiles
3798         'file_maxsize',    'varchar', 'NULL', $char_d, '', '', #MaxFileSize
3799         'cgp_accessmodes', 'varchar', 'NULL',     255, '', '', #AccessModes
3800         'password_selfchange','char', 'NULL',       1, '', '', #PWDAllowed
3801         'password_recover',   'char', 'NULL',       1, 'Y','', #PasswordRecovery
3802         'cgp_rulesallowed','varchar', 'NULL', $char_d, '', '', #RulesAllowed
3803         'cgp_rpopallowed',    'char', 'NULL',       1, '', '', #RPOPAllowed
3804         'cgp_mailtoall',      'char', 'NULL',       1, '', '', #MailToAll
3805         'cgp_addmailtrailer', 'char', 'NULL',       1, '', '', #AddMailTrailer
3806         'cgp_archiveafter',    'int', 'NULL',      '', '', '', #ArchiveMessagesAfter
3807         #XXX mailing lists
3808         #preferences
3809         'cgp_deletemode',     'varchar', 'NULL', $char_d, '', '',#DeleteMode
3810         'cgp_emptytrash',     'varchar', 'NULL', $char_d, '', '',#EmptyTrash
3811         'cgp_language',       'varchar', 'NULL', $char_d, '', '',#Language
3812         'cgp_timezone',       'varchar', 'NULL', $char_d, '', '',#TimeZone
3813         'cgp_skinname',       'varchar', 'NULL', $char_d, '', '',#SkinName
3814         'cgp_prontoskinname', 'varchar', 'NULL', $char_d, '', '',#ProntoSkinName
3815         'cgp_sendmdnmode',    'varchar', 'NULL', $char_d, '', '',#SendMDNMode
3816         #mail
3817         #XXX RPOP settings
3818         #
3819       ],
3820       'primary_key'  => 'svcnum',
3821       #'unique'       => [ [ 'username', 'domsvc' ] ],
3822       'unique'       => [],
3823       'index'        => [ ['username'], ['domsvc'], ['pbxsvc'] ],
3824       'foreign_keys' => [
3825                           { columns    => [ 'svcnum' ],
3826                             table      => 'cust_svc',
3827                           },
3828                           { columns    => [ 'popnum' ],
3829                             table      => 'svc_acct_pop',
3830                           },
3831                           { columns    => [ 'sectornum' ],
3832                             table      => 'tower_sector',
3833                           },
3834                           { columns    => [ 'routernum' ],
3835                             table      => 'router',
3836                           },
3837                           { columns    => [ 'blocknum' ],
3838                             table      => 'addr_block',
3839                           },
3840                           { columns    => [ 'domsvc' ],
3841                             table      => 'svc_domain', #'cust_svc',
3842                             references => [ 'svcnum' ],
3843                           },
3844                           { columns    => [ 'pbxsvc' ],
3845                             table      => 'svc_pbx', #'cust_svc',
3846                             references => [ 'svcnum' ],
3847                           },
3848                         ],
3849     },
3850
3851     'acct_rt_transaction' => {
3852       'columns' => [
3853         'svcrtid',   'int',    '',   '', '', '', #why am i not a serial
3854         'svcnum',    'int',    '',   '', '', '', 
3855         'transaction_id',       'int', '',   '', '', '', 
3856         '_date',   @date_type, '', '',
3857         'seconds',   'int', '',   '', '', '', #uhhhh
3858         'support',   'int', '',   '', '', '',
3859       ],
3860       'primary_key'  => 'svcrtid',
3861       'unique'       => [],
3862       'index'        => [ ['svcnum', 'transaction_id'] ],
3863       'foreign_keys' => [
3864                           { columns    => [ 'svcnum' ],
3865                             table      => 'svc_acct', #'cust_svc',
3866                           },
3867                           # 1. RT tables aren't part of our data structure, so
3868                           #     we can't make sure Queue is created already
3869                           # 2. This is our internal hack for time tracking, not
3870                           #     a user-facing feature
3871                           #{ columns    => [ 'transaction_id' ],
3872                           #  table      => 'Transaction',
3873                           #  references => [ 'id' ],
3874                           #},
3875                         ],
3876     },
3877
3878     #'svc_charge' => {
3879     #  'columns' => [
3880     #    'svcnum',    'int',    '',   '',
3881     #    'amount',    @money_type,
3882     #  ],
3883     #  'primary_key' => 'svcnum',
3884     #  'unique' => [ [] ],
3885     #  'index' => [ [] ],
3886     #},
3887
3888     'svc_domain' => {
3889       'columns' => [
3890         'svcnum',           'int',    '',        '', '', '',
3891         'domain',       'varchar',    '',   $char_d, '', '',
3892         'suffix',       'varchar', 'NULL',  $char_d, '', '',
3893         'catchall',         'int', 'NULL',       '', '', '',
3894         'parent_svcnum',    'int', 'NULL',       '', '', '',
3895         'quota',        'varchar', 'NULL',  $char_d, '', '', 
3896
3897         #registration info
3898         'registrarnum',     'int', 'NULL',       '', '', '',
3899         'registrarkey', 'varchar', 'NULL',      512, '', '',
3900         'setup_date',      @date_type, '', '',
3901         'renewal_interval', 'int', 'NULL',       '', '', '',
3902         'expiration_date', @date_type, '', '',
3903
3904         #some weird shit australia-specific shit?  yuck.. seems totally unused
3905         'au_registrant_name',       'varchar', 'NULL',  $char_d, '', '',
3906         'au_eligibility_type',      'varchar', 'NULL',  $char_d, '', '',
3907
3908         #communigate pro fields (quota = MaxAccountSize)
3909         'max_accounts',     'int', 'NULL',       '', '', '',
3910         'trailer',         'text', 'NULL',       '', '', '',
3911         'cgp_aliases',  'varchar', 'NULL',      255, '', '',
3912         'cgp_accessmodes','varchar','NULL',     255, '', '', #DomainAccessModes
3913         'cgp_certificatetype','varchar','NULL', $char_d, '', '',
3914
3915         #(account default) settings
3916         'acct_def_password_selfchange',   'char', 'NULL',       1,  '', '', 
3917         'acct_def_password_recover',      'char', 'NULL',       1, 'Y', '', 
3918         'acct_def_cgp_accessmodes',    'varchar', 'NULL',     255,  '', '',
3919         'acct_def_quota',              'varchar', 'NULL', $char_d,  '', '',
3920         'acct_def_file_quota',         'varchar', 'NULL', $char_d,  '', '',
3921         'acct_def_file_maxnum',        'varchar', 'NULL', $char_d,  '', '',
3922         'acct_def_file_maxsize',       'varchar', 'NULL', $char_d,  '', '',
3923         'acct_def_cgp_rulesallowed',   'varchar', 'NULL', $char_d,  '', '',
3924         'acct_def_cgp_rpopallowed',       'char', 'NULL',       1,  '', '', 
3925         'acct_def_cgp_mailtoall',         'char', 'NULL',       1,  '', '', 
3926         'acct_def_cgp_addmailtrailer',    'char', 'NULL',       1,  '', '', 
3927         'acct_def_cgp_archiveafter',       'int', 'NULL',      '',  '', '',
3928
3929         #(account default) preferences
3930         'acct_def_cgp_deletemode',     'varchar', 'NULL', $char_d,  '', '',
3931         'acct_def_cgp_emptytrash',     'varchar', 'NULL', $char_d,  '', '',
3932         'acct_def_cgp_language',       'varchar', 'NULL', $char_d,  '', '',
3933         'acct_def_cgp_timezone',       'varchar', 'NULL', $char_d,  '', '',
3934         'acct_def_cgp_skinname',       'varchar', 'NULL', $char_d,  '', '',
3935         'acct_def_cgp_prontoskinname', 'varchar', 'NULL', $char_d,  '', '',
3936         'acct_def_cgp_sendmdnmode',    'varchar', 'NULL', $char_d,  '', '',
3937       ],
3938       'primary_key'  => 'svcnum',
3939       'unique'       => [],
3940       'index'        => [ ['domain'] ],
3941       'foreign_keys' => [
3942                           { columns    => [ 'svcnum' ],
3943                             table      => 'cust_svc',
3944                           },
3945                           { columns    => [ 'catchall' ],
3946                             table      => 'svc_acct',
3947                             references => [ 'svcnum' ],
3948                           },
3949                           { columns    => [ 'parent_svcnum' ],
3950                             table      => 'cust_svc',
3951                             references => [ 'svcnum' ],
3952                           },
3953                           { columns    => [ 'registrarnum' ],
3954                             table      => 'registrar',
3955                           },
3956                         ],
3957     },
3958
3959     'svc_dsl' => {
3960       'columns' => [
3961         'svcnum',                    'int',    '',        '', '', '',
3962         'pushed',                    'int', 'NULL',       '', '', '',
3963         'desired_due_date',          'int', 'NULL',       '', '', '',
3964         'due_date',                  'int', 'NULL',       '', '', '',
3965         'vendor_order_id',       'varchar', 'NULL', $char_d,  '', '',
3966         'vendor_qual_id',        'varchar', 'NULL', $char_d,  '', '',
3967         'vendor_order_type',     'varchar', 'NULL', $char_d,  '', '',
3968         'vendor_order_status',   'varchar', 'NULL', $char_d,  '', '',
3969         'first',                 'varchar', 'NULL', $char_d,  '', '',
3970         'last',                  'varchar', 'NULL', $char_d,  '', '',
3971         'company',               'varchar', 'NULL', $char_d,  '', '',
3972         'phonenum',              'varchar', 'NULL',      24, '', '',
3973         'gateway_access_number', 'varchar', 'NULL',      24, '', '',
3974         'loop_type',                'char', 'NULL',       1, '', '', 
3975         'local_voice_provider',  'varchar', 'NULL', $char_d, '', '',
3976         'circuitnum',            'varchar', 'NULL', $char_d, '', '',
3977         'rate_band',             'varchar', 'NULL', $char_d, '', '',
3978         'vpi',                       'int', 'NULL',      '', '', '',
3979         'vci',                       'int', 'NULL',      '', '', '',
3980         'isp_chg',                  'char', 'NULL',       1, '', '', 
3981         'isp_prev',              'varchar', 'NULL', $char_d, '', '',
3982         'username',              'varchar', 'NULL', $char_d, '', '',
3983         'password',              'varchar', 'NULL', $char_d, '', '',
3984         'staticips',                'text', 'NULL',      '', '', '',
3985         'monitored',                'char', 'NULL',       1, '', '', 
3986         'last_pull',                 'int', 'NULL',      '', '', '',
3987       ],
3988       'primary_key'  => 'svcnum',
3989       'unique'       => [ ],
3990       'index'        => [ ['phonenum'], ['vendor_order_id'] ],
3991       'foreign_keys' => [
3992                           { columns    => [ 'svcnum' ],
3993                             table      => 'cust_svc',
3994                           },
3995                         ],
3996     },
3997
3998     'dsl_device' => {
3999       'columns' => [
4000         'devicenum', 'serial',     '', '', '', '',
4001         #part_device?  or our own part_dsl_device?
4002         #'devicepart',   'int',     '', '', '', '',
4003         'svcnum',       'int',     '', '', '', '', 
4004         'mac_addr', 'varchar',     '', 12, '', '', 
4005       ],
4006       'primary_key'  => 'devicenum',
4007       'unique'       => [ [ 'mac_addr' ], ],
4008       'index'        => [ [ 'svcnum' ], ], # [ 'devicepart' ] ],
4009       'foreign_keys' => [
4010                           { columns    => [ 'svcnum' ],
4011                             table      => 'svc_dsl',
4012                           },
4013                         ],
4014     },
4015
4016     'dsl_note' => {
4017       'columns' => [
4018         'notenum',           'serial',    '',        '', '', '',
4019         'svcnum',     'int', '',       '', '', '',
4020         'author',     'varchar', 'NULL', $char_d,  '', '',
4021         'priority',   'char', 'NULL',       1,  '', '', 
4022         '_date',     'int', 'NULL',       '', '', '',
4023         'note',     'text', '',       '', '', '',
4024       ],
4025       'primary_key'  => 'notenum',
4026       'unique'       => [],
4027       'index'        => [ ['svcnum'] ],
4028       'foreign_keys' => [
4029                           { columns    => [ 'svcnum' ],
4030                             table      => 'svc_dsl',
4031                           },
4032                         ],
4033     },
4034
4035     'svc_dish' => {
4036       'columns' => [
4037         'svcnum',   'int',     '',     '', '', '',
4038         'acctnum',  'varchar', '',     16, '', '',
4039         'installdate', @date_type,         '', '', 
4040         'note',     'text',    'NULL', '', '', '',
4041       ],
4042       'primary_key'  => 'svcnum',
4043       'unique'       => [],
4044       'index'        => [],
4045       'foreign_keys' => [
4046                           { columns    => [ 'svcnum' ],
4047                             table      => 'cust_svc',
4048                           },
4049                         ],
4050     },
4051
4052     'svc_hardware' => {
4053       'columns' => [
4054         'svcnum',   'int',     '',          '', '', '',
4055         'typenum',  'int',     '',          '', '', '',
4056         'serial',   'varchar', 'NULL', $char_d, '', '',
4057         'ip_addr',  'varchar', 'NULL',      40, '', '',
4058         'hw_addr',  'varchar', 'NULL',      12, '', '',
4059         'smartcard','varchar', 'NULL',      30, '', '',
4060         'statusnum','int',     'NULL',      '', '', '',
4061         'note',     'text',    'NULL',      '', '', '',
4062       ],
4063       'primary_key'  => 'svcnum',
4064       'unique'       => [],
4065       'index'        => [],
4066       'foreign_keys' => [
4067                           { columns    => [ 'svcnum' ],
4068                             table      => 'cust_svc',
4069                           },
4070                           { columns    => [ 'typenum' ],
4071                             table      => 'hardware_type',
4072                           },
4073                           { columns    => [ 'statusnum' ],
4074                             table      => 'hardware_status',
4075                           },
4076                         ],
4077     },
4078
4079     'hardware_class' => {
4080       'columns' => [
4081         'classnum',   'serial', '',      '', '', '',
4082         'classname', 'varchar', '', $char_d, '', '',
4083       ],
4084       'primary_key' => 'classnum',
4085       'unique' => [],
4086       'index'  => [],
4087     },
4088
4089     'hardware_type' => {
4090       'columns' => [
4091         'typenum',  'serial',     '',      '', '', '',
4092         'classnum',    'int',     '',      '', '', '',
4093         'model',   'varchar',     '', $char_d, '', '',
4094         'revision','varchar', 'NULL', $char_d, '', '',
4095       ],
4096       'primary_key'  => 'typenum',
4097       'unique'       => [ [ 'classnum', 'model', 'revision' ] ],
4098       'index'        => [],
4099       'foreign_keys' => [
4100                           { columns    => [ 'classnum' ],
4101                             table      => 'hardware_class',
4102                           },
4103                         ],
4104     },
4105
4106     'hardware_status' => {
4107       'columns' => [
4108         'statusnum', 'serial', '',      '', '', '',
4109         'label'    ,'varchar', '', $char_d, '', '',
4110         'disabled',    'char', 'NULL',   1, '', '', 
4111       ],
4112       'primary_key' => 'statusnum',
4113       'unique' => [],
4114       'index'  => [],
4115     },
4116
4117     'domain_record' => {
4118       'columns' => [
4119         'recnum',    'serial',     '',  '', '', '', 
4120         'svcnum',    'int',     '',  '', '', '', 
4121         'reczone',   'varchar', '',  255, '', '', 
4122         'recaf',     'char',    '',  2, '', '', 
4123         'rectype',   'varchar',    '',  5, '', '', 
4124         'recdata',   'varchar', '',  255, '', '', 
4125         'ttl',       'int',     'NULL', '', '', '',
4126       ],
4127       'primary_key'  => 'recnum',
4128       'unique'       => [],
4129       'index'        => [ ['svcnum'] ],
4130       'foreign_keys' => [
4131                           { columns    => [ 'svcnum' ],
4132                             table      => 'svc_domain',
4133                           },
4134                         ],
4135     },
4136
4137     'registrar' => {
4138       'columns' => [
4139         'registrarnum',   'serial', '',      '', '', '',
4140         'registrarname', 'varchar', '', $char_d, '', '',
4141       ],
4142       'primary_key' => 'registrarnum',
4143       'unique'      => [],
4144       'index'       => [],
4145     },
4146
4147     'cgp_rule' => {
4148       'columns' => [
4149         'rulenum',  'serial',     '',      '', '', '',
4150         'name',    'varchar',     '', $char_d, '', '',
4151         'comment', 'varchar', 'NULL', $char_d, '', '',
4152         'svcnum',      'int',     '',      '', '', '',
4153         'priority',    'int',     '',      '', '', '',
4154       ],
4155       'primary_key' => 'rulenum',
4156       'unique'      => [ [ 'svcnum', 'name' ] ],
4157       'index'       => [ [ 'svcnum' ] ],
4158       'foreign_keys' => [
4159                           { columns    => [ 'svcnum' ],
4160                             table      => 'cust_svc', #svc_acct / svc_domain
4161                           },
4162                         ],
4163     },
4164
4165     'cgp_rule_condition' => {
4166       'columns' => [
4167         'ruleconditionnum',  'serial',     '',      '', '', '',
4168         'conditionname',    'varchar',     '', $char_d, '', '',
4169         'op',               'varchar', 'NULL', $char_d, '', '',
4170         'params',           'varchar', 'NULL',     255, '', '',
4171         'rulenum',              'int',     '',      '', '', '',
4172       ],
4173       'primary_key'  => 'ruleconditionnum',
4174       'unique'       => [],
4175       'index'        => [ [ 'rulenum' ] ],
4176       'foreign_keys' => [
4177                           { columns    => [ 'rulenum' ],
4178                             table      => 'cgp_rule',
4179                           },
4180                         ],
4181     },
4182
4183     'cgp_rule_action' => {
4184        'columns' => [
4185         'ruleactionnum',  'serial',     '',      '', '', '',
4186         'action',        'varchar',     '', $char_d, '', '',
4187         'params',        'varchar', 'NULL',     255, '', '',
4188         'rulenum',           'int',     '',      '', '', '',
4189       ],
4190       'primary_key'  => 'ruleactionnum',
4191       'unique'       => [],
4192       'index'        => [ [ 'rulenum' ] ],
4193       'foreign_keys' => [
4194                           { columns    => [ 'rulenum' ],
4195                             table      => 'cgp_rule',
4196                           },
4197                         ],
4198    },
4199
4200     'svc_forward' => {
4201       'columns' => [
4202         'svcnum',   'int',            '',   '', '', '', 
4203         'srcsvc',   'int',        'NULL',   '', '', '', 
4204         'src',      'varchar',    'NULL',  255, '', '', 
4205         'dstsvc',   'int',        'NULL',   '', '', '', 
4206         'dst',      'varchar',    'NULL',  255, '', '', 
4207       ],
4208       'primary_key'  => 'svcnum',
4209       'unique'       => [],
4210       'index'        => [ ['srcsvc'], ['dstsvc'] ],
4211       'foreign_keys' => [
4212                           { columns    => [ 'svcnum' ],
4213                             table      => 'cust_svc',
4214                           },
4215                           { columns    => [ 'srcsvc' ],
4216                             table      => 'svc_acct',
4217                             references => [ 'svcnum' ]
4218                           },
4219                           { columns    => [ 'dstsvc' ],
4220                             table      => 'svc_acct',
4221                             references => [ 'svcnum' ]
4222                           },
4223                         ],
4224     },
4225
4226     'svc_www' => {
4227       'columns' => [
4228         'svcnum',   'int',      '',  '', '', '', 
4229         'recnum',   'int',      '',  '', '', '', 
4230         'usersvc',  'int',  'NULL',  '', '', '', 
4231         'config',   'text', 'NULL',  '', '', '', 
4232       ],
4233       'primary_key' => 'svcnum',
4234       'unique'      => [],
4235       'index'       => [],
4236       'foreign_keys' => [
4237                           { columns    => [ 'svcnum' ],
4238                             table      => 'cust_svc',
4239                           },
4240                           { columns    => [ 'recnum' ],
4241                             table      => 'domain_record',
4242                           },
4243                           { columns    => [ 'usersvc' ],
4244                             table      => 'svc_acct',
4245                             references => [ 'svcnum' ]
4246                           },
4247                         ],
4248     },
4249
4250     #'svc_wo' => {
4251     #  'columns' => [
4252     #    'svcnum',    'int',    '',   '',
4253     #    'svcnum',    'int',    '',   '',
4254     #    'svcnum',    'int',    '',   '',
4255     #    'worker',    'varchar',   '',   $char_d,
4256     #    '_date',     @date_type,
4257     #  ],
4258     #  'primary_key' => 'svcnum',
4259     #  'unique' => [ [] ],
4260     #  'index' => [ [] ],
4261     #},
4262
4263     'prepay_credit' => {
4264       'columns' => [
4265         'prepaynum',   'serial',     '',   '', '', '', 
4266         'identifier',  'varchar', '', $char_d, '', '', 
4267         'amount',      @money_type, '', '', 
4268         'seconds',     'int',     'NULL', '', '', '', 
4269         'upbytes',     'bigint',     'NULL', '', '', '', 
4270         'downbytes',   'bigint',     'NULL', '', '', '', 
4271         'totalbytes',  'bigint',     'NULL', '', '', '', 
4272         'agentnum',    'int',     'NULL', '', '', '', 
4273       ],
4274       'primary_key'  => 'prepaynum',
4275       'unique'       => [ ['identifier'] ],
4276       'index'        => [ ['agentnum'] ],
4277       'foreign_keys' => [
4278                           { columns    => [ 'agentnum' ],
4279                             table      => 'agent',
4280                           },
4281                         ],
4282     },
4283
4284     'port' => {
4285       'columns' => [
4286         'portnum',  'serial',     '',   '', '', '', 
4287         'ip',       'varchar', 'NULL', 15, '', '', 
4288         'nasport',  'int',     'NULL', '', '', '', 
4289         'nasnum',   'int',     '',   '', '', '', 
4290       ],
4291       'primary_key'  => 'portnum',
4292       'unique'       => [],
4293       'index'        => [],
4294       'foreign_keys' => [
4295                           { columns    => [ 'nasnum' ],
4296                             table      => 'nas',
4297                           },
4298                         ],
4299     },
4300
4301     'nas' => {
4302       'columns' => [
4303         'nasnum',       'serial',     '',  '',              '', '', 
4304         'nasname',     'varchar',     '', 128,              '', '',
4305         'shortname',   'varchar', 'NULL',  32,              '', '',
4306         'type',        'varchar',     '',  30,         'other', '',
4307         'ports',           'int', 'NULL',  '',              '', '',
4308         'secret',      'varchar',     '',  60,        'secret', '',
4309         'server',      'varchar', 'NULL',  64,              '', '',
4310         'community',   'varchar', 'NULL',  50,              '', '',
4311         'description', 'varchar',     '', 200, 'RADIUS Client', '',
4312         'svcnum',          'int', 'NULL',  '',              '', '',
4313       ],
4314       'primary_key'  => 'nasnum',
4315       'unique'       => [ [ 'nasname' ], ],
4316       'index'        => [],
4317       'foreign_keys' => [
4318                           { columns    => [ 'svcnum' ],
4319                             table      => 'svc_broadband',#no? could be _acct?
4320                                                           #remove or cust_svc?
4321                           },
4322                         ],
4323     },
4324
4325     'export_nas' => {
4326       'columns' => [
4327         'exportnasnum', 'serial', '', '', '', '', 
4328         'exportnum',       'int', '', '', '', '', 
4329         'nasnum',          'int', '', '', '', '', 
4330       ],
4331       'primary_key'  => 'exportnasnum',
4332       'unique'       => [ [ 'exportnum', 'nasnum' ] ],
4333       'index'        => [ [ 'exportnum' ], [ 'nasnum' ] ],
4334       'foreign_keys' => [
4335                           { columns    => [ 'exportnum' ],
4336                             table      => 'part_export',
4337                           },
4338                           { columns    => [ 'nasnum' ],
4339                             table      => 'nas',
4340                           },
4341                         ],
4342     },
4343
4344     'queue' => {
4345       'columns' => [
4346         'jobnum',   'bigserial',     '',      '', '', '', 
4347         'job',        'varchar',     '',     512, '', '', 
4348         '_date',          'int',     '',      '', '', '', 
4349         'status',     'varchar',     '', $char_d, '', '', 
4350         'statustext',    'text', 'NULL',      '', '', '', 
4351         'svcnum',         'int', 'NULL',      '', '', '', 
4352         'custnum',        'int', 'NULL',      '', '', '',
4353         'secure',        'char', 'NULL',       1, '', '',
4354         'priority',       'int', 'NULL',      '', '', '',
4355         'usernum',        'int', 'NULL',      '', '', '',
4356       ],
4357       'primary_key'  => 'jobnum',
4358       'unique'       => [],
4359       'index'        => [ [ 'secure' ], [ 'priority' ],
4360                           [ 'job' ], [ 'svcnum' ], [ 'custnum' ], [ 'status' ],
4361                         ],
4362       'foreign_keys' => [
4363 #                          { columns    => [ 'svcnum' ],
4364 #                            table      => 'cust_svc',
4365 #                          },
4366                           { columns    => [ 'custnum' ],
4367                             table      => 'cust_main',
4368                           },
4369                           { columns    => [ 'usernum' ],
4370                             table      => 'access_user',
4371                           },
4372                         ],
4373     },
4374
4375     'queue_arg' => {
4376       'columns' => [
4377         'argnum', 'bigserial',     '', '', '', '', 
4378         'jobnum',    'bigint',     '', '', '', '', 
4379         'frozen',      'char', 'NULL',  1, '', '',
4380         'arg',         'text', 'NULL', '', '', '', 
4381       ],
4382       'primary_key'  => 'argnum',
4383       'unique'       => [],
4384       'index'        => [ [ 'jobnum' ] ],
4385       'foreign_keys' => [
4386                           { columns    => [ 'jobnum' ],
4387                             table      => 'queue',
4388                             on_delete  => 'CASCADE',
4389                           },
4390                         ],
4391     },
4392
4393     'queue_depend' => {
4394       'columns' => [
4395         'dependnum',  'bigserial', '', '', '', '', 
4396         'jobnum',        'bigint', '', '', '', '', 
4397         'depend_jobnum', 'bigint', '', '', '', '', 
4398       ],
4399       'primary_key'  => 'dependnum',
4400       'unique'       => [],
4401       'index'        => [ [ 'jobnum' ], [ 'depend_jobnum' ] ],
4402       'foreign_keys' => [
4403                           { columns    => [ 'jobnum' ],
4404                             table      => 'queue',
4405                           },
4406                           { columns    => [ 'depend_jobnum' ],
4407                             table      => 'queue',
4408                             references => [ 'jobnum' ],
4409                             on_delete  => 'CASCADE',
4410                           },
4411                         ],
4412     },
4413
4414     'queue_stat' => {
4415       'columns' => [
4416         'statnum', 'bigserial',     '',  '', '', '',
4417         'jobnum',     'bigint',     '',  '', '', '',
4418         'job',       'varchar',     '', 512, '', '', 
4419         'custnum',       'int', 'NULL',  '', '', '',
4420         'insert_date', @date_type, '', '',
4421         'start_date',  @date_type, '', '', 
4422         'end_date',    @date_type, '', '', 
4423       ],
4424       'primary_key'  => 'statnum',
4425       'unique'       => [], #[ ['jobnum'] ],
4426       'index'        => [],
4427     },
4428
4429     'export_svc' => {
4430       'columns' => [
4431         'exportsvcnum' => 'serial', '', '', '', '', 
4432         'exportnum'    => 'int', '', '', '', '', 
4433         'svcpart'      => 'int', '', '', '', '', 
4434         'role'         => 'varchar', 'NULL', 16, '', '',
4435       ],
4436       'primary_key'  => 'exportsvcnum',
4437       'unique'       => [ [ 'exportnum', 'svcpart' ] ],
4438       'index'        => [ [ 'exportnum' ], [ 'svcpart' ] ],
4439       'foreign_keys' => [
4440                           { columns    => [ 'exportnum' ],
4441                             table      => 'part_export',
4442                           },
4443                           { columns    => [ 'svcpart' ],
4444                             table      => 'part_svc',
4445                           },
4446                         ],
4447     },
4448
4449     'export_device' => {
4450       'columns' => [
4451         'exportdevicenum' => 'serial', '', '', '', '', 
4452         'exportnum'       => 'int', '', '', '', '', 
4453         'devicepart'      => 'int', '', '', '', '', 
4454       ],
4455       'primary_key'  => 'exportdevicenum',
4456       'unique'       => [ [ 'exportnum', 'devicepart' ] ],
4457       'index'        => [ [ 'exportnum' ], [ 'devicepart' ] ],
4458       'foreign_keys' => [
4459                           { columns    => [ 'exportnum' ],
4460                             table      => 'part_export',
4461                           },
4462                           { columns    => [ 'devicepart' ],
4463                             table      => 'part_device',
4464                           },
4465                         ],
4466     },
4467
4468     'part_export' => {
4469       'columns' => [
4470         'exportnum',   'serial',     '',      '', '', '', 
4471         'exportname', 'varchar', 'NULL', $char_d, '', '',
4472         'machine',    'varchar', 'NULL', $char_d, '', '',
4473         'exporttype', 'varchar',     '', $char_d, '', '', 
4474         'nodomain',      'char', 'NULL',       1, '', '', 
4475         'default_machine','int', 'NULL',      '', '', '',
4476       ],
4477       'primary_key'  => 'exportnum',
4478       'unique'       => [],
4479       'index'        => [ [ 'machine' ], [ 'exporttype' ] ],
4480       'foreign_keys' => [
4481                           { columns    => [ 'default_machine' ],
4482                             table      => 'part_export_machine',
4483                             references => [ 'machinenum' ]
4484                           },
4485                         ],
4486     },
4487
4488     'part_export_option' => {
4489       'columns' => [
4490         'optionnum', 'serial', '', '', '', '', 
4491         'exportnum', 'int', '', '', '', '', 
4492         'optionname', 'varchar', '', $char_d, '', '', 
4493         'optionvalue', 'text', 'NULL', '', '', '', 
4494       ],
4495       'primary_key'  => 'optionnum',
4496       'unique'       => [],
4497       'index'        => [ [ 'exportnum' ], [ 'optionname' ] ],
4498       'foreign_keys' => [
4499                           { columns    => [ 'exportnum' ],
4500                             table      => 'part_export',
4501                           },
4502                         ],
4503     },
4504
4505     'radius_usergroup' => {
4506       'columns' => [
4507         'usergroupnum', 'serial', '', '', '', '', 
4508         'svcnum',       'int', '', '', '', '', 
4509         'groupname',    'varchar', 'NULL', $char_d, '', '', #deprecated
4510         'groupnum',     'int', 'NULL', '', '', '', 
4511       ],
4512       'primary_key'  => 'usergroupnum',
4513       'unique'       => [],
4514       'index'        => [ [ 'svcnum' ], [ 'groupname' ] ],
4515       'foreign_keys' => [
4516                           { columns    => [ 'svcnum' ],
4517                             table      => 'cust_svc', #svc_acct / svc_broadband
4518                           },
4519                           { columns    => [ 'groupnum' ],
4520                             table      => 'radius_group',
4521                           },
4522                         ],
4523     },
4524
4525     'radius_group' => {
4526       'columns' => [
4527         'groupnum', 'serial', '', '', '', '', 
4528         'groupname',    'varchar', '', $char_d, '', '', 
4529         'description',  'varchar', 'NULL', $char_d, '', '', 
4530         'priority', 'int', '', '', '1', '',
4531         'speed_up', 'int', 'NULL', '', '', '',
4532         'speed_down', 'int', 'NULL', '', '', '',
4533       ],
4534       'primary_key' => 'groupnum',
4535       'unique'      => [ ['groupname'] ],
4536       'index'       => [],
4537     },
4538
4539     'radius_attr' => {
4540       'columns' => [
4541         'attrnum',   'serial', '',      '', '', '',
4542         'groupnum',     'int', '',      '', '', '',
4543         'attrname', 'varchar', '', $char_d, '', '',
4544         'value',    'varchar', '',     255, '', '',
4545         'attrtype',    'char', '',       1, '', '',
4546         'op',          'char', '',       2, '', '',
4547       ],
4548       'primary_key'  => 'attrnum',
4549       'unique'       => [],
4550       'index'        => [ ['groupnum'], ],
4551       'foreign_keys' => [
4552                           { columns    => [ 'groupnum' ],
4553                             table      => 'radius_group',
4554                           },
4555                         ],
4556     },
4557
4558     'msgcat' => {
4559       'columns' => [
4560         'msgnum', 'serial', '', '', '', '', 
4561         'msgcode', 'varchar', '', 255, '', '', 
4562         'locale', 'varchar', '', 16, '', '', 
4563         'msg', 'text', '', '', '', '', 
4564       ],
4565       'primary_key' => 'msgnum',
4566       'unique'      => [ [ 'msgcode', 'locale' ] ],
4567       'index'       => [],
4568     },
4569
4570     'cust_tax_exempt' => {
4571       'columns' => [
4572         'exemptnum', 'serial', '', '', '', '', 
4573         'custnum',   'int', '', '', '', '', 
4574         'taxnum',    'int', '', '', '', '', 
4575         'year',      'int', '', '', '', '', 
4576         'month',     'int', '', '', '', '', 
4577         'amount',   @money_type, '', '', 
4578       ],
4579       'primary_key'  => 'exemptnum',
4580       'unique'       => [ [ 'custnum', 'taxnum', 'year', 'month' ] ],
4581       'index'        => [],
4582       'foreign_keys' => [
4583                           { columns    => [ 'custnum' ],
4584                             table      => 'cust_main',
4585                           },
4586                           { columns    => [ 'taxnum' ],
4587                             table      => 'cust_main_county',
4588                           },
4589                         ],
4590     },
4591
4592     'cust_tax_exempt_pkg' => {
4593       'columns' => [
4594         'exemptpkgnum',  'serial', '', '', '', '', 
4595         #'custnum',      'int', '', '', '', ''
4596         'billpkgnum',   'int', '', '', '', '', 
4597         'taxnum',       'int', '', '', '', '', 
4598         'taxtype',  'varchar', 'NULL', $char_d, '', '',
4599         'year',         'int', 'NULL', '', '', '', 
4600         'month',        'int', 'NULL', '', '', '', 
4601         'creditbillpkgnum', 'int', 'NULL', '', '', '',
4602         'amount',       @money_type, '', '', 
4603         # exemption type flags
4604         'exempt_cust',          'char', 'NULL', 1, '', '',
4605         'exempt_setup',         'char', 'NULL', 1, '', '',
4606         'exempt_recur',         'char', 'NULL', 1, '', '',
4607         'exempt_cust_taxname',  'char', 'NULL', 1, '', '',
4608         'exempt_monthly',       'char', 'NULL', 1, '', '',
4609       ],
4610       'primary_key'  => 'exemptpkgnum',
4611       'unique'       => [],
4612       'index'        => [ [ 'taxnum', 'year', 'month' ],
4613                           [ 'billpkgnum' ],
4614                           [ 'taxnum', 'taxtype' ],
4615                           [ 'creditbillpkgnum' ],
4616                         ],
4617       'foreign_keys' => [
4618                           { columns    => [ 'billpkgnum' ],
4619                             table      => 'cust_bill_pkg',
4620                           },
4621                           { columns    => [ 'creditbillpkgnum' ],
4622                             table      => 'cust_credit_bill_pkg',
4623                           },
4624                         ],
4625     },
4626
4627     'cust_tax_exempt_pkg_void' => {
4628       'columns' => [
4629         'exemptpkgnum',  'int', '', '', '', '', 
4630         #'custnum',      'int', '', '', '', ''
4631         'billpkgnum',   'int', '', '', '', '', 
4632         'taxnum',       'int', '', '', '', '', 
4633         'taxtype',  'varchar', 'NULL', $char_d, '', '',
4634         'year',         'int', 'NULL', '', '', '', 
4635         'month',        'int', 'NULL', '', '', '', 
4636         'creditbillpkgnum', 'int', 'NULL', '', '', '',
4637         'amount',       @money_type, '', '', 
4638         # exemption type flags
4639         'exempt_cust',          'char', 'NULL', 1, '', '',
4640         'exempt_setup',         'char', 'NULL', 1, '', '',
4641         'exempt_recur',         'char', 'NULL', 1, '', '',
4642         'exempt_cust_taxname',  'char', 'NULL', 1, '', '',
4643         'exempt_monthly',       'char', 'NULL', 1, '', '',
4644       ],
4645       'primary_key'  => 'exemptpkgnum',
4646       'unique'       => [],
4647       'index'        => [ [ 'taxnum', 'year', 'month' ],
4648                           [ 'billpkgnum' ],
4649                           [ 'taxnum', 'taxtype' ],
4650                           [ 'creditbillpkgnum' ],
4651                         ],
4652       'foreign_keys' => [
4653                           { columns    => [ 'billpkgnum' ],
4654                             table      => 'cust_bill_pkg_void',
4655                           },
4656                           { columns    => [ 'taxnum' ],
4657                             table      => 'cust_main_county',
4658                           },
4659                           { columns    => [ 'creditbillpkgnum' ],
4660                             table      => 'cust_credit_bill_pkg',
4661                           },
4662                         ],
4663     },
4664
4665     'router' => {
4666       'columns' => [
4667         'routernum', 'serial', '', '', '', '', 
4668         'routername', 'varchar', '', $char_d, '', '', 
4669         'svcnum', 'int', 'NULL', '', '', '', 
4670         'agentnum',   'int', 'NULL', '', '', '', 
4671         'manual_addr', 'char', 'NULL', 1, '', '',
4672       ],
4673       'primary_key'  => 'routernum',
4674       'unique'       => [],
4675       'index'        => [],
4676       'foreign_keys' => [
4677                           { columns    => [ 'svcnum' ],
4678                             table      => 'cust_svc', #svc_acct / svc_broadband
4679                           },
4680                           { columns    => [ 'agentnum' ],
4681                             table      => 'agent',
4682                           },
4683                         ],
4684     },
4685
4686     'part_svc_router' => {
4687       'columns' => [
4688         'svcrouternum', 'serial', '', '', '', '', 
4689         'svcpart', 'int', '', '', '', '', 
4690         'routernum', 'int', '', '', '', '', 
4691       ],
4692       'primary_key'  => 'svcrouternum',
4693       'unique'       => [],
4694       'index'        => [],
4695       'foreign_keys' => [
4696                           { columns    => [ 'svcpart' ],
4697                             table      => 'part_svc',
4698                           },
4699                           { columns    => [ 'routernum' ],
4700                             table      => 'router',
4701                           },
4702                         ],
4703     },
4704
4705     'addr_block' => {
4706       'columns' => [
4707         'blocknum', 'serial', '', '', '', '', 
4708         'routernum', 'int', '', '', '', '', 
4709         'ip_gateway', 'varchar', '', 15, '', '', 
4710         'ip_netmask', 'int', '', '', '', '', 
4711         'agentnum',   'int', 'NULL', '', '', '', 
4712         'manual_flag', 'char', 'NULL', 1, '', '', 
4713       ],
4714       'primary_key'  => 'blocknum',
4715       'unique'       => [ [ 'blocknum', 'routernum' ] ],
4716       'index'        => [],
4717       'foreign_keys' => [
4718                           #{ columns    => [ 'routernum' ],
4719                           #   table      => 'router',
4720                           #},
4721                           { columns    => [ 'agentnum' ],
4722                             table      => 'agent',
4723                           },
4724                         ],
4725     },
4726
4727     'addr_range' => {
4728       'columns' => [
4729         'rangenum', 'serial', '', '', '', '',
4730         'start',    'varchar', '', 15, '', '',
4731         'length',   'int', '', '', '', '',
4732         'status',   'varchar', 'NULL', 32, '', '',
4733       ],
4734       'primary_key' => 'rangenum',
4735       'unique'      => [],
4736       'index'       => [],
4737     },
4738
4739     'svc_broadband' => {
4740       'columns' => [
4741         'svcnum',                  'int',     '',        '', '', '', 
4742         'description',         'varchar', 'NULL',   $char_d, '', '', 
4743         'routernum',               'int', 'NULL',        '', '', '',
4744         'blocknum',                'int', 'NULL',        '', '', '', 
4745         'sectornum',               'int', 'NULL',        '', '', '',
4746         'speed_up',                'int', 'NULL',        '', '', '', 
4747         'speed_down',              'int', 'NULL',        '', '', '', 
4748         'ip_addr',             'varchar', 'NULL',        15, '', '', 
4749         'mac_addr',            'varchar', 'NULL',        12, '', '', 
4750         'authkey',             'varchar', 'NULL',        32, '', '', 
4751         'latitude',            'decimal', 'NULL',    '10,7', '', '', 
4752         'longitude',           'decimal', 'NULL',    '10,7', '', '', 
4753         'altitude',            'decimal', 'NULL',        '', '', '', 
4754         'vlan_profile',        'varchar', 'NULL',   $char_d, '', '', 
4755         'performance_profile', 'varchar', 'NULL',   $char_d, '', '',
4756         'plan_id',             'varchar', 'NULL',   $char_d, '', '',
4757         'radio_serialnum',     'varchar', 'NULL',   $char_d, '', '',
4758         'radio_location',      'varchar', 'NULL', 2*$char_d, '', '',
4759         'poe_location',        'varchar', 'NULL', 2*$char_d, '', '',
4760         'rssi',                    'int', 'NULL',        '', '', '',
4761         'suid',                    'int', 'NULL',        '', '', '',
4762         'shared_svcnum',           'int', 'NULL',        '', '', '',
4763         'serviceid',           'varchar', 'NULL',        64, '', '',#srvexport/reportfields
4764       ],
4765       'primary_key'  => 'svcnum',
4766       'unique'       => [ [ 'ip_addr' ], [ 'mac_addr' ] ],
4767       'index'        => [],
4768       'foreign_keys' => [
4769                           { columns    => [ 'svcnum' ],
4770                             table      => 'cust_svc',
4771                           },
4772                           { columns    => [ 'routernum' ],
4773                             table      => 'router',
4774                           },
4775                           { columns    => [ 'blocknum' ],
4776                             table      => 'addr_block',
4777                           },
4778                           { columns    => [ 'sectornum' ],
4779                             table      => 'tower_sector',
4780                           },
4781                           { columns    => [ 'shared_svcnum' ],
4782                             table      => 'svc_broadband',
4783                             references => [ 'svcnum' ],
4784                           },
4785                         ],
4786     },
4787
4788     'tower' => {
4789       'columns' => [
4790         'towernum',    'serial',     '',      '', '', '',
4791         #'agentnum',       'int', 'NULL',      '', '', '',
4792         'towername',  'varchar',     '', $char_d, '', '',
4793         'disabled',      'char', 'NULL',       1, '', '',
4794         'latitude',   'decimal', 'NULL',  '10,7', '', '', 
4795         'longitude',  'decimal', 'NULL',  '10,7', '', '', 
4796         'coord_auto',    'char', 'NULL',       1, '', '',
4797         'altitude',   'decimal', 'NULL',      '', '', '', 
4798         'height',     'decimal', 'NULL',      '', '', '', 
4799         'veg_height', 'decimal', 'NULL',      '', '', '', 
4800         'color',      'varchar', 'NULL',       6, '', '',
4801       ],
4802       'primary_key' => 'towernum',
4803       'unique'      => [ [ 'towername' ] ], # , 'agentnum' ] ],
4804       'index'       => [],
4805     },
4806
4807     'tower_sector' => {
4808       'columns' => [
4809         'sectornum',     'serial',     '',      '', '', '',
4810         'towernum',         'int',     '',      '', '', '',
4811         'sectorname',   'varchar',     '', $char_d, '', '',
4812         'ip_addr',      'varchar', 'NULL',      15, '', '',
4813         'height',       'decimal', 'NULL',      '', '', '', 
4814         'freq_mhz',         'int', 'NULL',      '', '', '',
4815         'direction',        'int', 'NULL',      '', '', '',
4816         'width',            'int', 'NULL',      '', '', '',
4817         #downtilt etc? rfpath has profile files for devices/antennas you upload?
4818         'sector_range', 'decimal', 'NULL',      '', '', '',  #?
4819       ],
4820       'primary_key'  => 'sectornum',
4821       'unique'       => [ [ 'towernum', 'sectorname' ], [ 'ip_addr' ], ],
4822       'index'        => [ [ 'towernum' ] ],
4823       'foreign_keys' => [
4824                           { columns    => [ 'towernum' ],
4825                             table      => 'tower',
4826                           },
4827                         ],
4828     },
4829
4830     'part_virtual_field' => {
4831       'columns' => [
4832         'vfieldpart', 'serial', '', '', '', '', 
4833         'dbtable', 'varchar', '', 32, '', '', 
4834         'name', 'varchar', '', 32, '', '', 
4835         'length', 'int', 'NULL', '', '', '', 
4836         'label', 'varchar', 'NULL', 80, '', '', 
4837       ],
4838       'primary_key' => 'vfieldpart',
4839       'unique' => [],
4840       'index' => [],
4841     },
4842
4843     'virtual_field' => {
4844       'columns' => [
4845         'vfieldnum', 'serial', '', '', '', '', 
4846         'recnum', 'int', '', '', '', '', 
4847         'vfieldpart', 'int', '', '', '', '', 
4848         'value', 'varchar', '', 128, '', '', 
4849       ],
4850       'primary_key'  => 'vfieldnum',
4851       'unique'       => [ [ 'vfieldpart', 'recnum' ] ],
4852       'index'        => [],
4853       'foreign_keys' => [
4854                           { columns    => [ 'vfieldpart' ],
4855                             table      => 'part_virtual_field',
4856                           },
4857                         ],
4858     },
4859
4860     'acct_snarf' => {
4861       'columns' => [
4862         'snarfnum',    'serial',     '',      '', '', '', 
4863         'snarfname',  'varchar', 'NULL', $char_d, '', '', 
4864         'svcnum',         'int',     '',      '', '', '', 
4865         'machine',    'varchar',     '',     255, '', '', 
4866         'protocol',   'varchar',     '', $char_d, '', '', 
4867         'username',   'varchar',     '', $char_d, '', '', 
4868         '_password',  'varchar',     '', $char_d, '', '', 
4869         'check_freq',     'int', 'NULL',      '', '', '', 
4870         'leavemail',     'char', 'NULL',       1, '', '', 
4871         'apop',          'char', 'NULL',       1, '', '', 
4872         'tls',           'char', 'NULL',       1, '', '', 
4873         'mailbox',    'varchar', 'NULL', $char_d, '', '', 
4874       ],
4875       'primary_key'  => 'snarfnum',
4876       'unique'       => [],
4877       'index'        => [ [ 'svcnum' ] ],
4878       'foreign_keys' => [
4879                           { columns    => [ 'svcnum' ],
4880                             table      => 'svc_acct',
4881                           },
4882                         ],
4883     },
4884
4885     'svc_external' => {
4886       'columns' => [
4887         'svcnum',     'int',     '',      '', '', '', 
4888         'id',      'bigint', 'NULL',      '', '', '', 
4889         'title',  'varchar', 'NULL', $char_d, '', '', 
4890       ],
4891       'primary_key'  => 'svcnum',
4892       'unique'       => [],
4893       'index'        => [],
4894       'foreign_keys' => [
4895                           { columns    => [ 'svcnum' ],
4896                             table      => 'cust_svc',
4897                           },
4898                         ],
4899     },
4900
4901     'cust_pay_refund' => {
4902       'columns' => [
4903         'payrefundnum', 'serial', '', '', '', '', 
4904         'paynum',  'int', '', '', '', '', 
4905         'refundnum',  'int', '', '', '', '', 
4906         '_date',    @date_type, '', '', 
4907         'amount',   @money_type, '', '', 
4908       ],
4909       'primary_key'  => 'payrefundnum',
4910       'unique'       => [],
4911       'index'        => [ ['paynum'], ['refundnum'] ],
4912       'foreign_keys' => [
4913                           { columns    => [ 'paynum' ],
4914                             table      => 'cust_pay',
4915                           },
4916                           { columns    => [ 'refundnum' ],
4917                             table      => 'cust_refund',
4918                           },
4919                         ],
4920     },
4921
4922     'part_pkg_option' => {
4923       'columns' => [
4924         'optionnum', 'serial', '', '', '', '', 
4925         'pkgpart', 'int', '', '', '', '', 
4926         'optionname', 'varchar', '', $char_d, '', '', 
4927         'optionvalue', 'text', 'NULL', '', '', '', 
4928       ],
4929       'primary_key'  => 'optionnum',
4930       'unique'       => [],
4931       'index'        => [ [ 'pkgpart' ], [ 'optionname' ] ],
4932       'foreign_keys' => [
4933                           { columns    => [ 'pkgpart' ],
4934                             table      => 'part_pkg',
4935                           },
4936                         ],
4937     },
4938
4939     'part_pkg_vendor' => {
4940       'columns' => [
4941         'num', 'serial', '', '', '', '', 
4942         'pkgpart', 'int', '', '', '', '', 
4943         'exportnum', 'int', '', '', '', '', 
4944         'vendor_pkg_id', 'varchar', '', $char_d, '', '', 
4945       ],
4946       'primary_key'  => 'num',
4947       'unique'       => [ [ 'pkgpart', 'exportnum' ] ],
4948       'index'        => [ [ 'pkgpart' ] ],
4949       'foreign_keys' => [
4950                           { columns    => [ 'pkgpart' ],
4951                             table      => 'part_pkg',
4952                           },
4953                           { columns    => [ 'exportnum' ],
4954                             table      => 'part_export',
4955                           },
4956                         ],
4957     },
4958
4959     'part_pkg_report_option' => {
4960       'columns' => [
4961         'num',      'serial',   '',      '', '', '', 
4962         'name',     'varchar',  '', $char_d, '', '', 
4963         'disabled', 'char', 'NULL',       1, '', '', 
4964       ],
4965       'primary_key' => 'num',
4966       'unique' => [ [ 'name' ] ],
4967       'index' => [ [ 'disabled' ] ],
4968     },
4969
4970     'part_pkg_usage' => {
4971       'columns' => [
4972         'pkgusagepart', 'serial',   '', '', '', '',
4973         'pkgpart',  'int',      '', '', '', '',
4974         'minutes',  'double precision',      '', '', '', '',
4975         'priority', 'int',  'NULL', '', '', '',
4976         'shared',   'char', 'NULL',  1, '', '',
4977         'rollover', 'char', 'NULL',  1, '', '',
4978         'description',  'varchar', 'NULL', $char_d, '', '',
4979       ],
4980       'primary_key'  => 'pkgusagepart',
4981       'unique'       => [],
4982       'index'        => [ [ 'pkgpart' ] ],
4983       'foreign_keys' => [
4984                           { columns    => [ 'pkgpart' ],
4985                             table      => 'part_pkg',
4986                           },
4987                         ],
4988     },
4989
4990     'part_pkg_usage_class' => {
4991       'columns' => [
4992         'num',       'serial',  '', '', '', '',
4993         'pkgusagepart', 'int',  '', '', '', '',
4994         'classnum',     'int','NULL', '', '', '',
4995       ],
4996       'primary_key'  => 'num',
4997       'unique'       => [ [ 'pkgusagepart', 'classnum' ] ],
4998       'index'        => [],
4999       'foreign_keys' => [
5000                           { columns    => [ 'pkgusagepart' ],
5001                             table      => 'part_pkg_usage',
5002                           },
5003                           { columns    => [ 'classnum' ],
5004                             table      => 'usage_class',
5005                           },
5006                         ],
5007     },
5008
5009     'part_pkg_fcc_option' => {
5010       'columns' => [
5011         'num',        'serial', '', '', '', '',
5012         'fccoptionname', 'varchar', '', $char_d, '', '',
5013         'pkgpart',       'int', '', '', '', '',
5014         'optionvalue',   'varchar', 'NULL', $char_d, '', '',
5015       ],
5016       'primary_key' => 'num',
5017       'unique'      => [ [ 'fccoptionname', 'pkgpart' ] ],
5018       'index'       => [],
5019     },
5020
5021     'rate' => {
5022       'columns' => [
5023         'ratenum',          'serial',     '', '', '', '', 
5024         'ratename',        'varchar', '',$char_d, '', '', 
5025         'agentnum',            'int', 'NULL', '', '', '',
5026         'default_detailnum',   'int', 'NULL', '', '', '',
5027       ],
5028       'primary_key' => 'ratenum',
5029       'unique'      => [],
5030       'index'       => [],
5031       'foreign_keys' => [
5032                           { columns    => [ 'agentnum' ],
5033                             table      => 'agent',
5034                           },
5035                         ],
5036     },
5037
5038     'rate_detail' => {
5039       'columns' => [
5040         'ratedetailnum',   'serial',  '',     '',      '', '', 
5041         'ratenum',         'int',     '',     '',      '', '', 
5042         'orig_regionnum',  'int', 'NULL',     '',      '', '', 
5043         'dest_regionnum',  'int', 'NULL',     '',      '', '', 
5044         'min_included',    'int',     '',     '',      '', '', 
5045         'conn_charge',     'decimal', '', '10,4', '0.0000', '',
5046         'conn_cost',       'decimal', '', '10,4', '0.0000', '',
5047         'conn_sec',        'int',     '',     '',      '0', '',
5048         'min_charge',      'decimal', '', '10,5',       '', '',
5049         'min_cost',        'decimal', '', '10,5','0.00000', '',
5050         'sec_granularity', 'int',     '',     '',       '', '', 
5051         'ratetimenum',     'int', 'NULL',     '',       '', '',
5052         'classnum',        'int', 'NULL',     '',       '', '', 
5053         'cdrtypenum',      'int', 'NULL',     '',       '', '',
5054         'region_group',   'char', 'NULL',      1,       '', '', 
5055         'upstream_mult_charge',  'decimal',  '', '10,4', '0.0000', '',
5056         'upstream_mult_cost',    'decimal',  '', '10,4', '0.0000', '',
5057       ],
5058       'primary_key'  => 'ratedetailnum',
5059       'unique'       => [ [ 'ratenum', 'orig_regionnum', 'dest_regionnum' ] ],
5060       'index'        => [ [ 'ratenum', 'dest_regionnum' ],
5061                           [ 'ratenum', 'ratetimenum' ]
5062                         ],
5063       'foreign_keys' => [
5064                           { columns    => [ 'ratenum' ],
5065                             table      => 'rate',
5066                           },
5067                           { columns    => [ 'orig_regionnum' ],
5068                             table      => 'rate_region',
5069                             references => [ 'regionnum' ],
5070                           },
5071                           { columns    => [ 'dest_regionnum' ],
5072                             table      => 'rate_region',
5073                             references => [ 'regionnum' ],
5074                           },
5075                           { columns    => [ 'ratetimenum' ],
5076                             table      => 'rate_time',
5077                           },
5078                           { columns    => [ 'classnum' ],
5079                             table      => 'usage_class',
5080                           },
5081                           { columns    => [ 'cdrtypenum' ],
5082                             table      => 'cdr_type',
5083                           },
5084                         ],
5085     },
5086
5087     'rate_region' => {
5088       'columns' => [
5089         'regionnum',   'serial',      '', '', '', '', 
5090         'regionname',  'varchar',     '', $char_d, '', '', 
5091         'exact_match', 'char',    'NULL',  1, '', '',
5092       ],
5093       'primary_key' => 'regionnum',
5094       'unique'      => [],
5095       'index'       => [],
5096     },
5097
5098     'rate_prefix' => {
5099       'columns' => [
5100         'prefixnum',   'serial',      '', '', '', '', 
5101         'regionnum',   'int',         '', '', '', '', 
5102         'countrycode', 'varchar',     '',  3, '', '', 
5103         'npa',         'varchar', 'NULL', 10, '', '', #actually the whole prefix
5104         'nxx',         'varchar', 'NULL',  3, '', '', #actually not used
5105         'latanum',     'int',     'NULL',      '', '', '',
5106         'state',       'char',    'NULL',       2, '', '', 
5107         'ocn',         'char',    'NULL',       4, '', '', 
5108       ],
5109       'primary_key'  => 'prefixnum',
5110       'unique'       => [],
5111       'index'        => [ [ 'countrycode' ], [ 'npa' ], [ 'regionnum' ] ],
5112       'foreign_keys' => [
5113                           { columns    => [ 'regionnum' ],
5114                             table      => 'rate_region',
5115                           },
5116                           { columns    => [ 'latanum' ],
5117                             table      => 'lata',
5118                           },
5119                         ],
5120     },
5121
5122     'rate_time' => {
5123       'columns' => [
5124         'ratetimenum', 'serial',      '',      '', '', '',
5125         'ratetimename',   'varchar',      '', $char_d, '', '',
5126       ],
5127       'primary_key' => 'ratetimenum',
5128       'unique'      => [],
5129       'index'       => [],
5130     },
5131
5132     'rate_time_interval' => {
5133       'columns' => [
5134         'intervalnum', 'serial', '', '', '', '',
5135         'stime',          'int', '', '', '', '',
5136         'etime',          'int', '', '', '', '',
5137         'ratetimenum',    'int', '', '', '', '',
5138       ],
5139       'primary_key'  => 'intervalnum',
5140       'unique'       => [],
5141       'index'        => [],
5142       'foreign_keys' => [
5143                           { columns    => [ 'ratetimenum' ],
5144                             table      => 'rate_time',
5145                           },
5146                         ],
5147      },
5148
5149     #not really part of the above rate_ stuff (used with flat rate rather than
5150     # rated billing), but could be eventually, and its a rate
5151     'rate_tier' => {
5152       'columns' => [
5153         'tiernum',   'serial', '',      '', '', '',
5154         'tiername', 'varchar', '', $char_d, '', '',
5155       ],
5156       'primary_key' => 'tiernum',
5157       'unique'      => [ [ 'tiername'], ],
5158       'index'       => [],
5159     },
5160
5161     'rate_tier_detail' => {
5162       'columns' => [
5163         'tierdetailnum', 'serial', '',     '', '', '',
5164         'tiernum',          'int', '',     '', '', '',
5165         'min_quan',         'int', '',     '', '', '',
5166         'min_charge',   'decimal', '', '10,4', '', '',
5167       ],
5168       'primary_key'  => 'tierdetailnum',
5169       'unique'       => [],
5170       'index'        => [ ['tiernum'], ],
5171       'foreign_keys' => [
5172                           { columns    => [ 'tiernum' ],
5173                             table      => 'rate_tier',
5174                           },
5175                         ],
5176     },
5177
5178     'usage_class' => {
5179       'columns' => [
5180         'classnum',    'serial',      '',      '', '', '', 
5181         'weight',      'int',     'NULL',      '', '', '',
5182         'classname',   'varchar',     '', $char_d, '', '', 
5183         'format',      'varchar', 'NULL', $char_d, '', '', 
5184         'disabled',    'char',    'NULL',       1, '', '', 
5185       ],
5186       'primary_key' => 'classnum',
5187       'unique' => [],
5188       'index' => [ ['disabled'] ],
5189     },
5190
5191     'reg_code' => {
5192       'columns' => [
5193         'codenum',   'serial',    '', '', '', '', 
5194         'code',      'varchar',   '', $char_d, '', '', 
5195         'agentnum',  'int',       '', '', '', '', 
5196       ],
5197       'primary_key'  => 'codenum',
5198       'unique'       => [ [ 'agentnum', 'code' ] ],
5199       'index'        => [ [ 'agentnum' ] ],
5200       'foreign_keys' => [
5201                           { columns    => [ 'agentnum' ],
5202                             table      => 'agent',
5203                           },
5204                         ],
5205      },
5206
5207     'reg_code_pkg' => {
5208       'columns' => [
5209         'codepkgnum', 'serial', '', '', '', '', 
5210         'codenum',   'int',    '', '', '', '', 
5211         'pkgpart',   'int',    '', '', '', '', 
5212       ],
5213       'primary_key'  => 'codepkgnum',
5214       'unique'       => [ [ 'codenum', 'pkgpart' ] ],
5215       'index'        => [ [ 'codenum' ] ],
5216       'foreign_keys' => [
5217                           { columns    => [ 'codenum' ],
5218                             table      => 'reg_code',
5219                           },
5220                           { columns    => [ 'pkgpart' ],
5221                             table      => 'part_pkg',
5222                           },
5223                         ],
5224     },
5225
5226     'clientapi_session' => {
5227       'columns' => [
5228         'sessionnum',  'serial',  '', '', '', '', 
5229         'sessionid',  'varchar',  '', $char_d, '', '', 
5230         'namespace',  'varchar',  '', $char_d, '', '', 
5231       ],
5232       'primary_key' => 'sessionnum',
5233       'unique'      => [ [ 'sessionid', 'namespace' ] ],
5234       'index'       => [],
5235     },
5236
5237     'clientapi_session_field' => {
5238       'columns' => [
5239         'fieldnum',    'serial',     '', '', '', '', 
5240         'sessionnum',     'int',     '', '', '', '', 
5241         'fieldname',  'varchar',     '', $char_d, '', '', 
5242         'fieldvalue',    'text', 'NULL', '', '', '', 
5243       ],
5244       'primary_key'  => 'fieldnum',
5245       'unique'       => [ [ 'sessionnum', 'fieldname' ] ],
5246       'index'        => [],
5247       'foreign_keys' => [
5248                           { columns    => [ 'sessionnum' ],
5249                             table      => 'clientapi_session',
5250                           },
5251                         ],
5252     },
5253
5254     'payment_gateway' => {
5255       'columns' => [
5256         'gatewaynum',       'serial',   '',     '', '', '', 
5257         'gateway_namespace','varchar',  'NULL', $char_d, '', '', 
5258         'gateway_module',   'varchar',  '',     $char_d, '', '', 
5259         'gateway_username', 'varchar',  'NULL', $char_d, '', '', 
5260         'gateway_password', 'varchar',  'NULL', $char_d, '', '', 
5261         'gateway_action',   'varchar',  'NULL', $char_d, '', '', 
5262         'gateway_callback_url', 'varchar',  'NULL', 255, '', '', 
5263         'gateway_cancel_url',   'varchar',  'NULL', 255, '', '',
5264         'disabled',   'char',  'NULL',   1, '', '', 
5265       ],
5266       'primary_key' => 'gatewaynum',
5267       'unique' => [],
5268       'index'  => [ [ 'disabled' ] ],
5269     },
5270
5271     'payment_gateway_option' => {
5272       'columns' => [
5273         'optionnum',   'serial',  '',     '', '', '', 
5274         'gatewaynum',  'int',     '',     '', '', '', 
5275         'optionname',  'varchar', '',     $char_d, '', '', 
5276         'optionvalue', 'text',    'NULL', '', '', '', 
5277       ],
5278       'primary_key'  => 'optionnum',
5279       'unique'       => [],
5280       'index'        => [ [ 'gatewaynum' ], [ 'optionname' ] ],
5281       'foreign_keys' => [
5282                           { columns    => [ 'gatewaynum' ],
5283                             table      => 'payment_gateway',
5284                           },
5285                         ],
5286     },
5287
5288     'agent_payment_gateway' => {
5289       'columns' => [
5290         'agentgatewaynum', 'serial', '', '', '', '', 
5291         'agentnum',        'int', '', '', '', '', 
5292         'gatewaynum',      'int', '', '', '', '', 
5293         'cardtype',        'varchar', 'NULL', $char_d, '', '', 
5294         'taxclass',        'varchar', 'NULL', $char_d, '', '', 
5295       ],
5296       'primary_key'  => 'agentgatewaynum',
5297       'unique'       => [],
5298       'index'        => [ [ 'agentnum', 'cardtype' ], ],
5299
5300       'foreign_keys' => [
5301
5302                           { columns    => [ 'agentnum' ],
5303                             table      => 'agent',
5304                           },
5305                           { columns    => [ 'gatewaynum' ],
5306                             table      => 'payment_gateway',
5307                           },
5308                         ],
5309     },
5310
5311     'banned_pay' => {
5312       'columns' => [
5313         'bannum',        'serial',     '',      '', '', '', 
5314         'payby',           'char',     '',       4, '', '', 
5315         'payinfo',      'varchar',     '',     128, '', '', #say, a 512-big digest _hex encoded
5316         'payinfo_hash', 'varchar', 'NULL',      32, '', '',
5317         #'paymask',      'varchar',  'NULL', $char_d, '', ''
5318         '_date',                @date_type,         '', '', 
5319         'end_date',             @date_type,         '', '', 
5320         'otaker',       'varchar', 'NULL',      32, '', '', 
5321         'usernum',          'int', 'NULL',      '', '', '',
5322         'bantype',      'varchar', 'NULL', $char_d, '', '',
5323         'reason',       'varchar', 'NULL', $char_d, '', '', 
5324       ],
5325       'primary_key'  => 'bannum',
5326       'unique'       => [],
5327       'index'        => [ [ 'payby', 'payinfo' ], [ 'usernum' ], ],
5328       'foreign_keys' => [
5329                           { columns    => [ 'usernum' ],
5330                             table      => 'access_user',
5331                           },
5332                         ],
5333     },
5334
5335     'pkg_category' => {
5336       'columns' => [
5337         'categorynum',        'serial',     '',      '', '', '', 
5338         'categoryname',      'varchar',     '', $char_d, '', '', 
5339         'weight',                'int', 'NULL',      '', '', '',
5340         'ticketing_queueid',     'int', 'NULL',      '', '', '', 
5341         'condense',             'char', 'NULL',       1, '', '', 
5342         'disabled',             'char', 'NULL',       1, '', '', 
5343       ],
5344       'primary_key' => 'categorynum',
5345       'unique' => [],
5346       'index' => [ ['disabled'] ],
5347     },
5348
5349     'pkg_class' => {
5350       'columns' => [
5351         'classnum',    'serial',   '',      '', '', '', 
5352         'classname',   'varchar',  '', $char_d, '', '', 
5353         'categorynum', 'int',  'NULL',      '', '', '', 
5354         'disabled',    'char', 'NULL',       1, '', '', 
5355         'fcc_ds0s',      'int',     'NULL', '', '', '', 
5356       ],
5357       'primary_key'  => 'classnum',
5358       'unique'       => [],
5359       'index'        => [ ['disabled'] ],
5360       'foreign_keys' => [
5361                           { columns    => [ 'categorynum' ],
5362                             table      => 'pkg_category',
5363                           },
5364                         ],
5365     },
5366
5367     'cdr' => {
5368       'columns' => [
5369         # qw( name type null length default local );
5370
5371         ###
5372         #asterisk fields
5373         ###
5374
5375         'acctid',   'bigserial',  '', '', '', '', 
5376         #'calldate', 'TIMESTAMP with time zone', '', '', \'now()', '',
5377         'calldate', 'timestamp',   '',      '', \'now()', '',
5378         'clid',        'varchar',  '', $char_d, \"''", '', 
5379         'src',         'varchar',  '', $char_d, \"''", '', 
5380         'dst',         'varchar',  '', $char_d, \"''", '', 
5381         'dcontext',    'varchar',  '', $char_d, \"''", '', 
5382         'channel',     'varchar',  '', $char_d, \"''", '', 
5383         'dstchannel',  'varchar',  '', $char_d, \"''", '', 
5384         'lastapp',     'varchar',  '', $char_d, \"''", '', 
5385         'lastdata',    'varchar',  '',     255, \"''", '', 
5386
5387         #currently only opensips & voipswitch
5388         'src_ip_addr', 'varchar',  'NULL',  15,    '', '',
5389
5390         #currently only opensips
5391         'dst_ip_addr', 'varchar',  'NULL',  15,    '', '',
5392
5393         #currently only u4:
5394         # terminating number (as opposed to dialed destination)
5395         'dst_term',    'varchar',  'NULL', $char_d, '', '',
5396
5397         #these don't seem to be logged by most of the SQL cdr_* modules
5398         #except tds under sql-illegal names, so;
5399         # ... don't rely on them for rating?
5400         # and, what they hey, i went ahead and changed the names and data types
5401         # to freeside-style dates...
5402           #'start',  'timestamp', 'NULL',  '',    '', '',
5403           #'answer', 'timestamp', 'NULL',  '',    '', '',
5404           #'end',    'timestamp', 'NULL',  '',    '', '',
5405         'startdate',  @date_type, '', '', 
5406         'answerdate', @date_type, '', '', 
5407         'enddate',    @date_type, '', '', 
5408         #
5409
5410         'duration',    'int',      '',      '',     0, '',
5411         'billsec',     'int',      '',      '',     0, '', 
5412         'disposition', 'varchar',  '',      45, \"''", '',
5413         'amaflags',    'int',      '',      '',     0, '',
5414         'accountcode', 'varchar',  '',      32, \"''", '',
5415         'uniqueid',    'varchar',  '', $char_d, \"''", '',
5416         'userfield',   'varchar',  '',     512, \"''", '',
5417
5418         'max_callers', 'int',  'NULL',      '',    '', '',
5419
5420         ###
5421         # old fields for unitel/RSLCOM/convergent that don't map to asterisk
5422         # ones we adoped moved to "own fields" section below
5423         # charged_party, upstream_price, rated_price, carrierid, cdrtypenum
5424         ###
5425
5426         'upstream_currency',      'char', 'NULL',       3, '', '',
5427         'upstream_rateplanid',     'int', 'NULL',      '', '', '', #?
5428
5429         # how it was rated internally...
5430         'ratedetailnum',           'int', 'NULL',      '', '', '',
5431
5432         'distance',            'decimal', 'NULL',      '', '', '',
5433         'islocal',                 'int', 'NULL',      '', '', '', # '',  '', 0, '' instead?
5434
5435         #cdr_calltype: the big list in appendix 2
5436         'calltypenum',             'int', 'NULL',      '', '', '',
5437
5438         'description',         'varchar', 'NULL', $char_d, '', '',
5439         'quantity',                'int', 'NULL',      '', '', '', 
5440
5441         'upstream_rateid',         'int', 'NULL',      '', '', '',
5442
5443         ###
5444         # more fields, for GSM imports
5445         ###
5446         'servicecode',             'int', 'NULL',      '', '', '',
5447         'quantity_able',           'int', 'NULL',      '', '', '', 
5448
5449         ###
5450         #and now for our own fields
5451         ###
5452
5453         'cdrtypenum',              'int', 'NULL',      '', '', '',
5454
5455         'charged_party',       'varchar', 'NULL', $char_d, '', '',
5456         'charged_party_imsi',  'varchar', 'NULL', $char_d, '', '',
5457
5458         'upstream_price',      'decimal', 'NULL',  '10,5', '', '', 
5459
5460         #currently only voipswitch
5461         #'upstream_rate',      'decimal', 'NULL',  '10,5', '', '', 
5462
5463         'upstream_src_regionname', 'varchar', 'NULL', $char_d, '', '',
5464         'upstream_dst_regionname', 'varchar', 'NULL', $char_d, '', '',
5465
5466         # how it was rated internally...
5467         'rated_pretty_dst',       'varchar', 'NULL', $char_d, '', '',
5468         'rated_regionname',       'varchar', 'NULL', $char_d, '', '',
5469         'rated_price',            'decimal', 'NULL',  '10,4', '', '',
5470         'rated_seconds',              'int', 'NULL',      '', '', '',
5471         'rated_minutes', 'double precision', 'NULL',      '', '', '',
5472         'rated_granularity',          'int', 'NULL',      '', '', '',
5473         'rated_ratedetailnum',        'int', 'NULL',      '', '', '',
5474         'rated_classnum',             'int', 'NULL',      '', '', '', 
5475         'rated_ratename',         'varchar', 'NULL', $char_d, '', '', 
5476
5477         'carrierid',               'bigint', 'NULL',      '', '', '',
5478
5479         # service it was matched to
5480         'svcnum',             'int',   'NULL',     '',   '', '', 
5481
5482         #NULL, done (or something)
5483         'freesidestatus', 'varchar',   'NULL',     32,   '', '', 
5484
5485         #NULL, done (or something)
5486         'freesiderewritestatus', 'varchar',   'NULL',     32,   '', '', 
5487
5488         #an indexed place to put big numbers
5489         'cdrid',         'bigint',     'NULL',     '',  '', '', 
5490
5491         #for taqua accountcode rewriting, for starters
5492         'sessionnum',       'int',    'NULL',      '', '', '',
5493         'subscriber',   'varchar',    'NULL', $char_d, '', '',
5494
5495         #old
5496         'cdrbatch',     'varchar',    'NULL',     255, '', '',
5497         #new
5498         'cdrbatchnum',      'int',    'NULL',      '', '', '',
5499
5500         # FK to cust_bill_pkg_detail; having a value here absolutely means
5501         # that the CDR appears on an invoice
5502         'detailnum',     'bigint',    'NULL',      '', '', '',
5503       ],
5504       'primary_key' => 'acctid',
5505       'unique' => [],
5506       'index' => [ [ 'calldate' ],
5507                    [ 'src' ], [ 'dst' ], [ 'dcontext' ], [ 'charged_party' ],
5508                    [ 'lastapp' ],
5509                    ['accountcode'], ['uniqueid'], ['carrierid'], ['cdrid'],
5510                    [ 'sessionnum' ], [ 'subscriber' ],
5511                    [ 'freesidestatus' ], [ 'freesiderewritestatus' ],
5512                    [ 'cdrbatch' ], [ 'cdrbatchnum' ],
5513                    [ 'src_ip_addr' ], [ 'dst_ip_addr' ], [ 'dst_term' ],
5514                  ],
5515       #no FKs on cdr table... choosing not to throw errors no matter what's
5516       # thrown in here.  better to have the data.
5517     },
5518
5519     'cdr_batch' => {
5520       'columns' => [
5521         'cdrbatchnum',   'serial',    '',   '', '', '', 
5522         'cdrbatch', 'varchar', 'NULL', 255, '', '',
5523         '_date',     @date_type, '', '', 
5524       ],
5525       'primary_key' => 'cdrbatchnum',
5526       'unique' => [ [ 'cdrbatch' ] ],
5527       'index' => [],
5528     },
5529
5530     'cdr_termination' => {
5531       'columns' => [
5532         'cdrtermnum', 'bigserial',     '',      '', '', '',
5533         'acctid',        'bigint',     '',      '', '', '', 
5534         'termpart',         'int',     '',      '', '', '',#future use see below
5535         'rated_price',  'decimal', 'NULL',  '10,4', '', '',
5536         'rated_seconds',    'int', 'NULL',      '', '', '',
5537         'rated_minutes', 'double precision', 'NULL',   '', '', '',
5538         'status',       'varchar', 'NULL',      32, '', '',
5539         'svcnum',           'int', 'NULL',      '', '', '',
5540       ],
5541       'primary_key'  => 'cdrtermnum',
5542       'unique'       => [ [ 'acctid', 'termpart' ] ],
5543       'index'        => [ [ 'acctid' ], [ 'status' ], ],
5544       'foreign_keys' => [
5545                           { columns    => [ 'acctid' ],
5546                             table      => 'cdr',
5547                           },
5548                           { columns    => [ 'svcnum' ],
5549                             table      => 'cust_svc',
5550                           },
5551                         ],
5552     },
5553
5554     #to handle multiple termination/settlement passes...
5555    # 'part_termination' => {
5556    #   'columns' => [
5557    #     'termpart',       'int', '',      '', '', '',
5558    #     'termname',   'varchar', '', $char_d, '', '',
5559    #     'cdr_column', 'varchar', '', $char_d, '', '', #maybe set it here instead of in the price plan?
5560    #   ],
5561    #   'primary_key' => 'termpart',
5562    #   'unique' => [],
5563    #   'index'  => [],
5564    # },
5565
5566     #the remaining cdr_ tables are not really used
5567     'cdr_calltype' => {
5568       'columns' => [
5569         'calltypenum',   'serial',  '', '', '', '', 
5570         'calltypename',  'varchar', '', $char_d, '', '', 
5571       ],
5572       'primary_key' => 'calltypenum',
5573       'unique'      => [],
5574       'index'       => [],
5575     },
5576
5577     'cdr_type' => {
5578       'columns' => [
5579         'cdrtypenum'  => 'serial',  '', '', '', '',
5580         'cdrtypename' => 'varchar', '', $char_d, '', '',
5581       ],
5582       'primary_key' => 'cdrtypenum',
5583       'unique'      => [],
5584       'index'       => [],
5585     },
5586
5587     'cdr_carrier' => {
5588       'columns' => [
5589         'carrierid'   =>  'serial',     '',      '', '', '',
5590         'carriername' => 'varchar',     '', $char_d, '', '',
5591         'disabled'    =>    'char', 'NULL',       1, '', '', 
5592       ],
5593       'primary_key' => 'carrierid',
5594       'unique'      => [],
5595       'index'       => [],
5596     },
5597
5598     #'cdr_file' => {
5599     #  'columns' => [
5600     #    'filenum',    'serial',     '', '', '', '',
5601     #    'filename',  'varchar',     '', '', '', '',
5602     #    'status',    'varchar', 'NULL', '', '', '',
5603     #  ],
5604     #  'primary_key' => 'filenum',
5605     #  'unique' => [ [ 'filename' ], ], #just change the index if we need to
5606     #                                   # agent-virtualize or have a customer
5607     #                                   # with dup-filename needs or something
5608     #                                   # (only used by cdr.http_and_import for
5609     #                                   #  chrissakes)
5610     #  'index'  => [],
5611     #},
5612
5613     'inventory_item' => {
5614       'columns' => [
5615         'itemnum',   'serial',      '',      '', '', '',
5616         'classnum',  'int',         '',      '', '', '',
5617         'agentnum',  'int',     'NULL',      '', '', '',
5618         'item',      'varchar',     '', $char_d, '', '',
5619         'svcnum',    'int',     'NULL',      '', '', '',
5620         'svc_field', 'varchar', 'NULL', $char_d, '', '',
5621       ],
5622       'primary_key'  => 'itemnum',
5623       'unique'       => [ [ 'classnum', 'item' ] ],
5624       'index'        => [ [ 'classnum' ], [ 'agentnum' ], [ 'svcnum' ] ],
5625       'foreign_keys' => [
5626                           { columns    => [ 'classnum' ],
5627                             table      => 'inventory_class',
5628                           },
5629                           { columns    => [ 'agentnum' ],
5630                             table      => 'agent',
5631                           },
5632                           { columns    => [ 'svcnum' ],
5633                             table      => 'cust_svc',
5634                           },
5635                         ],
5636     },
5637
5638     'inventory_class' => {
5639       'columns' => [
5640         'classnum',  'serial',       '',      '', '', '',
5641         'classname', 'varchar',      '', $char_d, '', '',
5642       ],
5643       'primary_key' => 'classnum',
5644       'unique' => [],
5645       'index'  => [],
5646     },
5647
5648     'access_user_session' => {
5649       'columns' => [
5650         'sessionnum',   'serial',  '',      '', '', '', 
5651         'sessionkey',  'varchar',  '', $char_d, '', '',
5652         'usernum',         'int',  '',      '', '', '',
5653         'start_date', @date_type,               '', '',
5654         'last_date',  @date_type,               '', '',
5655       ],
5656       'primary_key'  => 'sessionnum',
5657       'unique'       => [ [ 'sessionkey' ] ],
5658       'index'        => [],
5659       'foreign_keys' => [
5660                           { columns    => [ 'usernum' ],
5661                             table      => 'access_user',
5662                           },
5663                         ],
5664     },
5665
5666     'access_user' => {
5667       'columns' => [
5668         'usernum',             'serial',     '',      '', '', '',
5669         'username',           'varchar',     '', $char_d, '', '',
5670         '_password',          'varchar', 'NULL', $char_d, '', '',
5671         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
5672         'last',               'varchar', 'NULL', $char_d, '', '', 
5673         'first',              'varchar', 'NULL', $char_d, '', '', 
5674         'user_custnum',           'int', 'NULL',      '', '', '',
5675         'report_salesnum',        'int', 'NULL',      '', '', '',
5676         'disabled',              'char', 'NULL',       1, '', '', 
5677       ],
5678       'primary_key'  => 'usernum',
5679       'unique'       => [ [ 'username' ] ],
5680       'index'        => [ [ 'user_custnum' ] ],
5681       'foreign_keys' => [
5682                           { columns    => [ 'user_custnum' ],
5683                             table      => 'cust_main',
5684                             references => [ 'custnum' ],
5685                           },
5686                           { columns    => [ 'report_salesnum' ],
5687                             table      => 'sales',
5688                             references => [ 'salesnum' ],
5689                           },
5690                         ],
5691     },
5692
5693     'access_user_pref' => {
5694       'columns' => [
5695         'prefnum',    'serial',       '', '', '', '',
5696         'usernum',     'int',       '', '', '', '',
5697         'prefname', 'varchar', '', $char_d, '', '', 
5698         'prefvalue', 'text', 'NULL', '', '', '', 
5699         'expiration', @date_type, '', '',
5700       ],
5701       'primary_key'  => 'prefnum',
5702       'unique'       => [],
5703       'index'        => [ [ 'usernum' ] ],
5704       'foreign_keys' => [
5705                           { columns    => [ 'usernum' ],
5706                             table      => 'access_user',
5707                           },
5708                         ],
5709     },
5710
5711     'access_group' => {
5712       'columns' => [
5713         'groupnum',   'serial', '',      '', '', '',
5714         'groupname', 'varchar', '', $char_d, '', '',
5715       ],
5716       'primary_key' => 'groupnum',
5717       'unique' => [ [ 'groupname' ] ],
5718       'index'  => [],
5719     },
5720
5721     'access_usergroup' => {
5722       'columns' => [
5723         'usergroupnum', 'serial', '', '', '', '',
5724         'usernum',         'int', '', '', '', '',
5725         'groupnum',        'int', '', '', '', '',
5726       ],
5727       'primary_key'  => 'usergroupnum',
5728       'unique'       => [ [ 'usernum', 'groupnum' ] ],
5729       'index'        => [ [ 'usernum' ] ],
5730       'foreign_keys' => [
5731                           { columns    => [ 'usernum' ],
5732                             table      => 'access_user',
5733                           },
5734                           { columns    => [ 'groupnum' ],
5735                             table      => 'access_group',
5736                           },
5737                         ],
5738      },
5739
5740     'access_groupagent' => {
5741       'columns' => [
5742         'groupagentnum', 'serial', '', '', '', '',
5743         'groupnum',         'int', '', '', '', '',
5744         'agentnum',         'int', '', '', '', '',
5745       ],
5746       'primary_key'  => 'groupagentnum',
5747       'unique'       => [ [ 'groupnum', 'agentnum' ] ],
5748       'index'        => [ [ 'groupnum' ] ],
5749       'foreign_keys' => [
5750                           { columns    => [ 'groupnum' ],
5751                             table      => 'access_group',
5752                           },
5753                           { columns    => [ 'agentnum' ],
5754                             table      => 'agent',
5755                           },
5756                         ],
5757     },
5758
5759     'access_right' => {
5760       'columns' => [
5761         'rightnum',   'serial', '',      '', '', '',
5762         'righttype', 'varchar', '', $char_d, '', '',
5763         'rightobjnum',   'int', '',      '', '', '',
5764         'rightname', 'varchar', '', $char_d, '', '',
5765       ],
5766       'primary_key' => 'rightnum',
5767       'unique' => [ [ 'righttype', 'rightobjnum', 'rightname' ] ],
5768       'index'  => [],
5769     },
5770
5771     'access_user_log' => {
5772       'columns'      => [
5773         'lognum',  'serial', '',        '', '', '',
5774         'usernum',    'int', '',        '', '', '',
5775         'path',   'varchar', '', 2*$char_d, '', '',
5776         '_date',         @date_type,        '', '',
5777       ],
5778       'primary_key'  => 'lognum',
5779       'unique'       => [],
5780       'index'        => [ ['usernum'], ['path'], ['_date'] ],
5781     },
5782
5783     'sched_item' => {
5784       'columns' => [
5785         'itemnum',   'serial',      '', '', '', '', 
5786         'usernum',      'int',  'NULL', '', '', '', 
5787         #'itemname', 'varchar', $char_d, '', '', '',
5788         'disabled',    'char',  'NULL',  1, '', '', 
5789       ],
5790       'primary_key'  => 'itemnum',
5791       'unique'       => [ [ 'usernum' ] ],
5792       'index'        => [],
5793       'foreign_keys' => [
5794                           { columns    => [ 'usernum' ],
5795                             table      => 'access_user',
5796                           },
5797                         ],
5798     },
5799
5800     #'sched_item_class'
5801
5802     'sched_avail' => {
5803       'columns' => [
5804         'availnum',      'serial', '', '', '', '', 
5805         'itemnum',          'int', '', '', '', '',
5806         'wday',             'int', '', '', '', '',
5807         'stime',            'int', '', '', '', '',
5808         'etime',            'int', '', '', '', '',
5809         'override_date',    @date_type,    '', '',
5810       ],
5811       'primary_key'  => 'availnum',
5812       'unique'       => [],
5813       'index'        => [],
5814       'foreign_keys' => [
5815                           { columns    => [ 'itemnum' ],
5816                             table      => 'sched_item',
5817                           },
5818                         ],
5819     },
5820
5821     'svc_phone' => {
5822       'columns' => [
5823         'svcnum',                         'int',     '',      '', '', '', 
5824         'countrycode',                'varchar',     '',       3, '', '', 
5825         'phonenum',                   'varchar',     '',      25, '', '', #12 ?
5826         'sim_imsi',                   'varchar', 'NULL',      15, '', '',
5827         'pin',                        'varchar', 'NULL', $char_d, '', '',
5828         'sip_password',               'varchar', 'NULL', $char_d, '', '',
5829         'phone_name',                 'varchar', 'NULL', $char_d, '', '',
5830         'pbxsvc',                         'int', 'NULL',      '', '', '',
5831         'domsvc',                         'int', 'NULL',      '', '', '', 
5832         'locationnum',                    'int', 'NULL',      '', '', '',
5833         'forwarddst',                 'varchar', 'NULL',      15, '', '', 
5834         'email',                      'varchar', 'NULL',     255, '', '', 
5835         'lnp_status',                 'varchar', 'NULL', $char_d, '', '',
5836         'portable',                      'char', 'NULL',       1, '', '', 
5837         'lrn',                           'char', 'NULL',      10, '', '', 
5838         'lnp_desired_due_date',           'int', 'NULL',      '', '', '',
5839         'lnp_due_date',                   'int', 'NULL',      '', '', '',
5840         'lnp_other_provider',         'varchar', 'NULL', $char_d, '', '',
5841         'lnp_other_provider_account', 'varchar', 'NULL', $char_d, '', '',
5842         'lnp_reject_reason',          'varchar', 'NULL', $char_d, '', '',
5843         'sms_carrierid',                  'int', 'NULL',      '', '', '',
5844         'sms_account',                'varchar', 'NULL', $char_d, '', '',
5845         'max_simultaneous',               'int', 'NULL',      '', '', '',
5846         'e911_class',                    'char', 'NULL',       1, '', '',
5847         'e911_type',                     'char', 'NULL',       1, '', '', 
5848         'circuit_svcnum',                 'int', 'NULL',      '', '', '',
5849         'sip_server',                 'varchar', 'NULL', $char_d, '', '',
5850       ],
5851       'primary_key'  => 'svcnum',
5852       'unique'       => [ [ 'sms_carrierid', 'sms_account'] ],
5853       'index'        => [ ['countrycode', 'phonenum'], ['pbxsvc'], ['domsvc'],
5854                           ['locationnum'], ['sms_carrierid'],
5855                         ],
5856       'foreign_keys' => [
5857                           { columns    => [ 'svcnum' ],
5858                             table      => 'cust_svc',
5859                           },
5860                           { columns    => [ 'pbxsvc' ],
5861                             table      => 'svc_pbx', #'cust_svc',
5862                             references => [ 'svcnum' ],
5863                           },
5864                           { columns    => [ 'domsvc' ],
5865                             table      => 'svc_domain', #'cust_svc',
5866                             references => [ 'svcnum' ],
5867                           },
5868                           { columns    => [ 'locationnum' ],
5869                             table      => 'cust_location',
5870                           },
5871                           { columns    => [ 'sms_carrierid' ],
5872                             table      => 'cdr_carrier',
5873                             references => [ 'carrierid' ],
5874                           },
5875                           { columns    => [ 'circuit_svcnum' ],
5876                             table      => 'svc_circuit',
5877                             references => [ 'svcnum' ],
5878                           },
5879                         ],
5880     },
5881
5882     'phone_device' => {
5883       'columns' => [
5884         'devicenum', 'serial',     '', '', '', '',
5885         'devicepart',   'int',     '', '', '', '',
5886         'svcnum',       'int',     '', '', '', '', 
5887         'mac_addr', 'varchar', 'NULL', 12, '', '', 
5888       ],
5889       'primary_key'  => 'devicenum',
5890       'unique'       => [ [ 'mac_addr' ], ],
5891       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
5892       'foreign_keys' => [
5893                           { columns    => [ 'devicepart' ],
5894                             table      => 'part_device',
5895                           },
5896                           { columns    => [ 'svcnum' ],
5897                             table      => 'svc_phone',
5898                           },
5899                         ],
5900     },
5901
5902     'part_device' => {
5903       'columns' => [
5904         'devicepart', 'serial',  '',      '', '', '',
5905         'devicename', 'varchar', '', $char_d, '', '',
5906         'inventory_classnum', 'int', 'NULL', '', '', '',
5907         'title',      'varchar', 'NULL', $char_d, '', '',
5908       ],
5909       'primary_key'  => 'devicepart',
5910       'unique'       => [ [ 'devicename' ] ], #?
5911       'index'        => [],
5912       'foreign_keys' => [
5913                           { columns    => [ 'inventory_classnum' ],
5914                             table      => 'inventory_class',
5915                             references => [ 'classnum' ],
5916                           },
5917                         ],
5918     },
5919
5920     'phone_avail' => {
5921       'columns' => [
5922         'availnum',    'serial',      '',      '', '', '', 
5923         'exportnum',   'int',         '',      '', '', '', 
5924         'countrycode', 'varchar',     '',       3, '', '', 
5925         'state',       'char',    'NULL',       2, '', '', 
5926         'npa',         'char',        '',       3, '', '', 
5927         'nxx',         'char',    'NULL',       3, '', '', 
5928         'station',     'char',    'NULL',       4, '', '',
5929         'name',        'varchar', 'NULL', $char_d, '', '',
5930         'rate_center_abbrev', 'varchar', 'NULL', $char_d, '', '',
5931         'latanum',      'int',     'NULL',      '', '', '',
5932         'msanum',       'int', 'NULL', '', '', '',
5933         'ordernum',      'int',     'NULL',      '', '', '',
5934         'svcnum',      'int',     'NULL',      '', '', '',
5935         'availbatch', 'varchar',  'NULL', $char_d, '', '',
5936       ],
5937       'primary_key'  => 'availnum',
5938       'unique'       => [],
5939       'index'        => [ ['exportnum','countrycode','state'],    #npa search
5940                           ['exportnum','countrycode','npa'],      #nxx search
5941                           ['exportnum','countrycode','npa','nxx'],#station srch
5942                           [ 'exportnum','countrycode','npa','nxx','station'], #
5943                           [ 'svcnum' ],
5944                           [ 'availbatch' ],
5945                           [ 'latanum' ],
5946                         ],
5947       'foreign_keys' => [
5948                           { columns    => [ 'exportnum' ],
5949                             table      => 'part_export',
5950                           },
5951                           { columns    => [ 'latanum' ],
5952                             table      => 'lata',
5953                           },
5954                           { columns    => [ 'msanum' ],
5955                             table      => 'msa',
5956                           },
5957                           { columns    => [ 'ordernum' ],
5958                             table      => 'did_order',
5959                           },
5960                           { columns    => [ 'svcnum' ],
5961                             table      => 'svc_phone',
5962                           },
5963                         ],
5964     },
5965
5966     'lata' => {
5967       'columns' => [
5968         'latanum',    'int',      '',      '', '', '', 
5969         'description',   'varchar',    '',      $char_d, '', '', 
5970         'have_usage',   'int',    'NULL',      '', '', '', 
5971       ],
5972       'primary_key' => 'latanum',
5973       'unique' => [],
5974       'index'  => [],
5975     },
5976
5977     'msa' => {
5978       'columns' => [
5979         'msanum',    'int',      '',      '', '', '', 
5980         'description',   'varchar',    '',      $char_d, '', '', 
5981       ],
5982       'primary_key' => 'msanum',
5983       'unique' => [],
5984       'index'  => [],
5985     },
5986
5987     'rate_center' => {
5988       'columns' => [
5989         'ratecenternum',    'serial',      '',      '', '', '', 
5990         'description',   'varchar',    '',      $char_d, '', '', 
5991       ],
5992       'primary_key' => 'ratecenternum',
5993       'unique' => [],
5994       'index'  => [],
5995     },
5996
5997     'did_vendor' => {
5998       'columns' => [
5999         'vendornum',    'serial',      '',      '', '', '', 
6000         'vendorname',   'varchar',        '',     $char_d, '', '', 
6001       ],
6002       'primary_key' => 'vendornum',
6003       'unique' => [],
6004       'index'  => [],
6005     },
6006
6007     'did_order_item' => {
6008       'columns' => [
6009         'orderitemnum',    'serial',      '',      '', '', '', 
6010         'ordernum',    'int',      '',      '', '', '', 
6011         'msanum',      'int',     'NULL',      '', '', '',
6012         'npa',      'int',     'NULL',      '', '', '',
6013         'latanum',      'int',     'NULL',      '', '', '',
6014         'ratecenternum',      'int',     'NULL',      '', '', '',
6015         'state',       'char',    'NULL',       2, '', '', 
6016         'quantity',      'int',     '',      '', '', '',
6017         'custnum',   'int', 'NULL', '', '', '',
6018       ],
6019       'primary_key'  => 'orderitemnum',
6020       'unique'       => [],
6021       'index'        => [],
6022       'foreign_keys' => [
6023                           { columns    => [ 'ordernum' ],
6024                             table      => 'did_order',
6025                           },
6026                           { columns    => [ 'msanum' ],
6027                             table      => 'msa',
6028                           },
6029                           { columns    => [ 'latanum' ],
6030                             table      => 'lata',
6031                           },
6032                           { columns    => [ 'ratecenternum' ],
6033                             table      => 'rate_center',
6034                           },
6035                           { columns    => [ 'custnum' ],
6036                             table      => 'cust_main',
6037                           },
6038                         ],
6039     },
6040
6041     'did_order' => {
6042       'columns' => [
6043         'ordernum',    'serial',      '',      '', '', '', 
6044         'vendornum',   'int',       '',      '', '', '', 
6045         'vendor_order_id',   'varchar',  'NULL',   $char_d, '', '', 
6046         'custnum',   'int', 'NULL', '', '', '',
6047         'submitted',      'int',     '',      '', '', '',
6048         'confirmed',      'int',     'NULL',      '', '', '',
6049         'received',      'int',     'NULL',      '', '', '',
6050       ],
6051       'primary_key'  => 'ordernum',
6052       'unique'       => [ [ 'vendornum', 'vendor_order_id' ] ],
6053       'index'        => [],
6054       'foreign_keys' => [
6055                           { columns    => [ 'vendornum' ],
6056                             table      => 'did_vendor',
6057                           },
6058                           { columns    => [ 'custnum' ],
6059                             table      => 'cust_main',
6060                           },
6061                         ],
6062     },
6063
6064     'reason_type' => {
6065       'columns' => [
6066         'typenum',   'serial',  '', '', '', '', 
6067         'class',     'char', '', 1, '', '', 
6068         'type',     'varchar', '', $char_d, '', '', 
6069       ],
6070       'primary_key' => 'typenum',
6071       'unique' => [],
6072       'index' => [],
6073     },
6074
6075     'reason' => {
6076       'columns' => [
6077         'reasonnum',     'serial',  '', '', '', '', 
6078         'reason_type',   'int',  '', '', '', '', 
6079         'reason',        'text', '', '', '', '', 
6080         'disabled',      'char',    'NULL', 1, '', '', 
6081         'unsuspend_pkgpart', 'int',  'NULL', '', '', '',
6082         'unsuspend_hold','char',    'NULL', 1, '', '',
6083         'unused_credit', 'char',    'NULL', 1, '', '',
6084         'feepart',        'int', 'NULL', '', '', '',
6085         'fee_on_unsuspend','char',  'NULL', 1, '', '',
6086         'fee_hold',      'char',    'NULL', 1, '', '',
6087       ],
6088       'primary_key'  => 'reasonnum',
6089       'unique'       => [],
6090       'index'        => [],
6091       'foreign_keys' => [
6092                           { columns    => [ 'reason_type' ],
6093                             table      => 'reason_type',
6094                             references => [ 'typenum' ],
6095                           },
6096                           { columns    => [ 'unsuspend_pkgpart' ],
6097                             table      => 'part_pkg',
6098                             references => [ 'pkgpart' ],
6099                           },
6100                         ],
6101     },
6102
6103     'conf' => {
6104       'columns' => [
6105         'confnum',  'serial',     '',      '', '', '', 
6106         'agentnum', 'int',    'NULL',      '', '', '', 
6107         'locale',   'varchar','NULL',      16, '', '',
6108         'name',     'varchar',    '', $char_d, '', '', 
6109         'value',    'text',   'NULL',      '', '', '',
6110       ],
6111       'primary_key'  => 'confnum',
6112       'unique'       => [ [ 'agentnum', 'locale', 'name' ] ],
6113       'index'        => [],
6114       'foreign_keys' => [
6115                           { columns    => [ 'agentnum' ],
6116                             table      => 'agent',
6117                           },
6118                         ],
6119     },
6120
6121     'pkg_referral' => {
6122       'columns' => [
6123         'pkgrefnum',     'serial', '', '', '', '',
6124         'pkgnum',        'int',    '', '', '', '',
6125         'refnum',        'int',    '', '', '', '',
6126       ],
6127       'primary_key'  => 'pkgrefnum',
6128       'unique'       => [ [ 'pkgnum', 'refnum' ] ],
6129       'index'        => [ [ 'pkgnum' ], [ 'refnum' ] ],
6130       'foreign_keys' => [
6131                           { columns    => [ 'pkgnum' ],
6132                             table      => 'cust_pkg',
6133                           },
6134                           { columns    => [ 'refnum' ],
6135                             table      => 'part_referral',
6136                           },
6137                         ],
6138     },
6139
6140     'svc_pbx' => {
6141       'columns' => [
6142         'svcnum',           'int',     '',      '', '', '', 
6143         'id',               'int', 'NULL',      '', '', '', 
6144         'uuid',            'char', 'NULL',      36, '', '',
6145         'title',        'varchar', 'NULL', $char_d, '', '', 
6146         'max_extensions',   'int', 'NULL',      '', '', '',
6147         'max_simultaneous', 'int', 'NULL',      '', '', '',
6148         'ip_addr',      'varchar', 'NULL',      40, '', '',
6149       ],
6150       'primary_key'  => 'svcnum',
6151       'unique'       => [],
6152       'index'        => [ [ 'id' ], [ 'uuid' ] ],
6153       'foreign_keys' => [
6154                           { columns    => [ 'svcnum' ],
6155                             table      => 'cust_svc',
6156                           },
6157                         ],
6158     },
6159
6160     'pbx_extension' => {
6161       'columns' => [
6162         'extensionnum',  'serial',     '',      '', '', '',
6163         'svcnum',           'int',     '',      '', '', '',
6164         'extension',    'varchar',     '', $char_d, '', '',
6165         'pin',          'varchar', 'NULL', $char_d, '', '',
6166         'sip_password', 'varchar', 'NULL', $char_d, '', '',
6167         'phone_name',   'varchar', 'NULL', $char_d, '', '',
6168       ],
6169       'primary_key'  => 'extensionnum',
6170       'unique'       => [ [ 'svcnum', 'extension' ] ],
6171       'index'        => [ [ 'svcnum' ] ],
6172       'foreign_keys' => [
6173                           { columns    => [ 'svcnum' ],
6174                             table      => 'svc_pbx',
6175                           },
6176                         ],
6177     },
6178
6179     'pbx_device' => {
6180       'columns' => [
6181         'devicenum', 'serial',     '', '', '', '',
6182         'devicepart',   'int',     '', '', '', '',
6183         'svcnum',       'int',     '', '', '', '', 
6184         'mac_addr', 'varchar', 'NULL', 12, '', '', 
6185       ],
6186       'primary_key'  => 'devicenum',
6187       'unique'       => [ [ 'mac_addr' ], ],
6188       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
6189       'foreign_keys' => [
6190                           { columns    => [ 'devicepart' ],
6191                             table      => 'part_device',
6192                           },
6193                           { columns    => [ 'svcnum' ],
6194                             table      => 'svc_pbx',
6195                           },
6196                         ],
6197     },
6198
6199     'extension_device' => {
6200       'columns' => [
6201         'extensiondevicenum', 'serial', '', '', '', '',
6202         'extensionnum',          'int', '', '', '', '',
6203         'devicenum',             'int', '', '', '', '',
6204       ],
6205       'primary_key'  => 'extensiondevicenum',
6206       'unique'       => [ [ 'extensionnum', 'devicenum' ] ],
6207       'index'        => [],#both?  which way do we need to query?
6208       'foreign_keys' => [
6209                           { columns  => [ 'extensionnum' ],
6210                             table    => 'pbx_extension',
6211                           },
6212                           { columns  => [ 'devicenum' ],
6213                             table    => 'pbx_device',
6214                           },
6215                         ],
6216     },
6217
6218     'svc_mailinglist' => { #svc_group?
6219       'columns' => [
6220         'svcnum',            'int',     '',            '', '', '', 
6221         'username',      'varchar',     '', $username_len, '', '',
6222         'domsvc',            'int',     '',            '', '', '', 
6223         'listnum',           'int',     '',            '', '', '',
6224         'reply_to',         'char', 'NULL',             1, '', '',#SetReplyTo
6225         'remove_from',      'char', 'NULL',             1, '', '',#RemoveAuthor
6226         'reject_auto',      'char', 'NULL',             1, '', '',#RejectAuto
6227         'remove_to_and_cc', 'char', 'NULL',             1, '', '',#RemoveToAndCc
6228       ],
6229       'primary_key'  => 'svcnum',
6230       'unique'       => [],
6231       'index'        => [ ['username'], ['domsvc'], ['listnum'] ],
6232       'foreign_keys' => [
6233                           { columns    => [ 'svcnum' ],
6234                             table      => 'cust_svc',
6235                           },
6236                           { columns    => [ 'domsvc' ],
6237                             table      => 'svc_domain', #'cust_svc',
6238                             references => [ 'svcnum' ],
6239                           },
6240                           { columns    => [ 'listnum' ],
6241                             table      => 'mailinglist',
6242                           },
6243                         ],
6244     },
6245
6246     'mailinglist' => {
6247       'columns' => [
6248         'listnum',   'serial', '',      '', '', '',
6249         'listname', 'varchar', '', $char_d, '', '',
6250       ],
6251       'primary_key' => 'listnum',
6252       'unique' => [],
6253       'index'  => [],
6254     },
6255
6256     'mailinglistmember' => {
6257       'columns' => [
6258         'membernum',        'serial',     '',   '', '', '',
6259         'listnum',             'int',     '',   '', '', '',
6260         'svcnum',              'int', 'NULL',   '', '', '', 
6261         'contactemailnum',     'int', 'NULL',   '', '', '', 
6262         'email',           'varchar', 'NULL',  255, '', '', 
6263       ],
6264       'primary_key'  => 'membernum',
6265       'unique'       => [],
6266       'index'        => [['listnum'],['svcnum'],['contactemailnum'],['email']],
6267       'foreign_keys' => [
6268                           { columns    => [ 'listnum' ],
6269                             table      => 'mailinglist',
6270                           },
6271                           { columns    => [ 'svcnum' ],
6272                             table      => 'svc_acct',
6273                           },
6274                           { columns    => [ 'contactemailnum' ],
6275                             table      => 'contact_email',
6276                           },
6277                         ],
6278     },
6279
6280     'bill_batch' => {
6281       'columns' => [
6282         'batchnum',         'serial',     '',  '', '', '',
6283         'agentnum',            'int', 'NULL',  '', '', '',
6284         'status',             'char', 'NULL', '1', '', '',
6285         'pdf',                'blob', 'NULL',  '', '', '',
6286       ],
6287       'primary_key'  => 'batchnum',
6288       'unique'       => [],
6289       'index'        => [ ['agentnum'] ],
6290       'foreign_keys' => [
6291                           { columns    => [ 'agentnum' ],
6292                             table      => 'agent',
6293                           },
6294                         ],
6295     },
6296
6297     'cust_bill_batch' => {
6298       'columns' => [
6299         'billbatchnum',     'serial',     '', '', '', '',
6300         'batchnum',            'int',     '', '', '', '',
6301         'invnum',              'int',     '', '', '', '',
6302       ],
6303       'primary_key'  => 'billbatchnum',
6304       'unique'       => [],
6305       'index'        => [ [ 'batchnum' ], [ 'invnum' ] ],
6306       'foreign_keys' => [
6307                           { columns    => [ 'batchnum' ],
6308                             table      => 'bill_batch',
6309                           },
6310                           { columns    => [ 'invnum' ],
6311                             table      => 'cust_bill',
6312                           },
6313                         ],
6314     },
6315
6316     'cust_bill_batch_option' => {
6317       'columns' => [
6318         'optionnum', 'serial', '', '', '', '', 
6319         'billbatchnum', 'int', '', '', '', '', 
6320         'optionname', 'varchar', '', $char_d, '', '', 
6321         'optionvalue', 'text', 'NULL', '', '', '', 
6322       ],
6323       'primary_key'  => 'optionnum',
6324       'unique'       => [],
6325       'index'        => [ [ 'billbatchnum' ], [ 'optionname' ] ],
6326       'foreign_keys' => [
6327                           { columns    => [ 'billbatchnum' ],
6328                             table      => 'cust_bill_batch',
6329                           },
6330                         ],
6331      },
6332
6333     'msg_template' => {
6334       'columns' => [
6335         'msgnum',     'serial',     '',      '', '', '',
6336         'msgname',   'varchar',     '', $char_d, '', '',
6337         'agentnum',      'int', 'NULL',      '', '', '',
6338         'subject',   'varchar', 'NULL',     512, '', '',
6339         'mime_type', 'varchar',     '', $char_d, '', '',
6340         'body',         'blob', 'NULL',      '', '', '',
6341         'disabled',     'char', 'NULL',       1, '', '', 
6342           # migrate these to msg_template_email
6343         'from_addr', 'varchar', 'NULL',     255, '', '',
6344         'bcc_addr',  'varchar', 'NULL',     255, '', '',
6345           # change to not null on v5
6346         'msgclass',  'varchar', 'NULL',      16, '', '',
6347       ],
6348       'primary_key'  => 'msgnum',
6349       'unique'       => [ ],
6350       'index'        => [ ['agentnum'], ],
6351       'foreign_keys' => [
6352                           { columns    => [ 'agentnum' ],
6353                             table      => 'agent',
6354                           },
6355                         ],
6356     },
6357
6358     'msg_template_http' => {
6359       'columns' => [
6360         'num',          'serial',     '',      '', '', '',
6361         'msgnum',          'int',     '',      '', '', '',
6362         'prepare_url', 'varchar', 'NULL',     255, '', '',
6363         'send_url',    'varchar', 'NULL',     255, '', '',
6364         'username',    'varchar', 'NULL', $char_d, '', '',
6365         'password',    'varchar', 'NULL', $char_d, '', '',
6366         'content',        'text', 'NULL',      '', '', '',
6367       ],
6368       'primary_key'  => 'num',
6369       'unique'       => [ [ 'msgnum' ], ],
6370       'index'        => [ ],
6371       'foreign_keys' => [
6372                           { columns    => [ 'msgnum' ],
6373                             table      => 'msg_template',
6374                           },
6375                         ],
6376     },
6377
6378     'template_content' => {
6379       'columns' => [
6380         'contentnum', 'serial',     '',      '', '', '',
6381         'msgnum',        'int',     '',      '', '', '',
6382         'locale',    'varchar', 'NULL',      16, '', '',
6383         'subject',   'varchar', 'NULL',     512, '', '',
6384         'body',         'text', 'NULL',      '', '', '',
6385       ],
6386       'primary_key'  => 'contentnum',
6387       'unique'       => [ ['msgnum', 'locale'] ],
6388       'index'        => [ ],
6389       'foreign_keys' => [
6390                           { columns    => [ 'msgnum' ],
6391                             table      => 'msg_template',
6392                           },
6393                         ],
6394     },
6395
6396     'template_image' => {
6397       'columns' => [
6398         'imgnum',     'serial',     '',      '', '', '',
6399         'name',      'varchar',     '', $char_d, '', '',
6400         'agentnum',      'int', 'NULL',      '', '', '',
6401         'mime_type', 'varchar',     '', $char_d, '', '',
6402         'base64',       'text',     '',      '', '', '',
6403       ],
6404       'primary_key'  => 'imgnum',
6405       'unique'       => [ ],
6406       'index'        => [ ['name'], ['agentnum'] ],
6407     },
6408
6409     'cust_msg' => {
6410       'columns' => [
6411         'custmsgnum', 'serial',     '',     '', '', '',
6412         'custnum',       'int', 'NULL',     '', '', '',
6413         'msgnum',        'int', 'NULL',     '', '', '',
6414         '_date',    @date_type,                 '', '',
6415         'env_from',  'varchar', 'NULL',    255, '', '',
6416         'env_to',    'varchar', 'NULL',    255, '', '',
6417         'header',       'blob', 'NULL',     '', '', '',
6418         'body',         'blob', 'NULL',     '', '', '',
6419         'error',     'varchar', 'NULL',    255, '', '',
6420         'status',    'varchar',     '',$char_d, '', '',
6421         'msgtype',   'varchar', 'NULL',     16, '', '',
6422         'preview',      'text', 'NULL',     '', '', '',
6423       ],
6424       'primary_key'  => 'custmsgnum',
6425       'unique'       => [ ],
6426       'index'        => [ ['custnum'], ],
6427       'foreign_keys' => [
6428                           { columns    => [ 'custnum' ],
6429                             table      => 'cust_main',
6430                           },
6431                           { columns    => [ 'msgnum' ],
6432                             table      => 'msg_template',
6433                           },
6434                         ],
6435     },
6436
6437     'svc_cert' => {
6438       'columns' => [
6439         'svcnum',                'int',     '',      '', '', '', 
6440         'recnum',                'int', 'NULL',      '', '', '',
6441         'privatekey',           'text', 'NULL',      '', '', '',
6442         'csr',                  'text', 'NULL',      '', '', '',
6443         'certificate',          'text', 'NULL',      '', '', '',
6444         'cacert',               'text', 'NULL',      '', '', '',
6445         'common_name',       'varchar', 'NULL', $char_d, '', '',
6446         'organization',      'varchar', 'NULL', $char_d, '', '',
6447         'organization_unit', 'varchar', 'NULL', $char_d, '', '',
6448         'city',              'varchar', 'NULL', $char_d, '', '',
6449         'state',             'varchar', 'NULL', $char_d, '', '',
6450         'country',              'char', 'NULL',       2, '', '',
6451         'cert_contact',      'varchar', 'NULL', $char_d, '', '',
6452       ],
6453       'primary_key'  => 'svcnum',
6454       'unique'       => [],
6455       'index'        => [], #recnum
6456       'foreign_keys' => [
6457                           { columns    => [ 'svcnum' ],
6458                             table      => 'cust_svc',
6459                           },
6460                           { columns    => [ 'recnum' ],
6461                             table      => 'domain_record',
6462                           },
6463                         ],
6464     },
6465
6466     'svc_port' => {
6467       'columns' => [
6468         'svcnum',                'int',     '',      '', '', '', 
6469         'serviceid', 'varchar', '', 64, '', '', #srvexport / reportfields
6470       ],
6471       'primary_key'  => 'svcnum',
6472       'unique'       => [],
6473       'index'        => [], #recnum
6474       'foreign_keys' => [
6475                           { columns    => [ 'svcnum' ],
6476                             table      => 'cust_svc',
6477                           },
6478                         ],
6479     },
6480
6481     'areacode'  => {
6482       'columns' => [
6483         'areanum',   'serial',        '',      '', '', '',
6484         'code',        'char',        '',       3, '', '', 
6485         'country',     'char',    'NULL',       2, '', '',
6486         'state',       'char',    'NULL',       2, '', '', 
6487         'description','varchar',  'NULL',     255, '', '',
6488       ], 
6489       'primary_key' => 'areanum',
6490       'unique' => [ [ 'areanum' ] ],
6491       'index'  => [],
6492     },
6493
6494     'upgrade_journal' => {
6495       'columns' => [
6496         'upgradenum', 'serial', '', '', '', '',
6497         '_date', 'int', '', '', '', '',
6498         'upgrade', 'varchar', '', $char_d, '', '',
6499         'status', 'varchar', '', $char_d, '', '',
6500         'statustext', 'varchar', 'NULL', $char_d, '', '',
6501       ],
6502       'primary_key' => 'upgradenum',
6503       'unique' => [],
6504       'index' => [ [ 'upgrade' ] ],
6505     },
6506
6507     'upload_target' => {
6508       'columns' => [
6509         'targetnum', 'serial', '', '', '', '',
6510         'agentnum', 'int', 'NULL', '', '', '',
6511         'protocol', 'varchar', '', 10, '', '',
6512         'hostname', 'varchar', '', $char_d, '', '',
6513         'port', 'int', 'NULL', '', '', '',
6514         'username', 'varchar', '', $char_d, '', '',
6515         'password', 'varchar', 'NULL', $char_d, '', '',
6516         'path', 'varchar', 'NULL', $char_d, '', '',
6517         'subject', 'varchar', 'NULL', '255', '', '',
6518         'handling', 'varchar', 'NULL', $char_d, '', '',
6519       ],
6520       'primary_key'   => 'targetnum',
6521       'unique'        => [ [ 'targetnum' ] ],
6522       'index'         => [],
6523       'foreign_keys' => [
6524                           { columns    => [ 'agentnum' ],
6525                             table      => 'agent',
6526                           },
6527                         ],
6528     },
6529
6530     'log' => {
6531       'columns' => [
6532         'lognum',     'serial', '', '', '', '',
6533         '_date',      'int', '', '', '', '',
6534         'agentnum',   'int', 'NULL', '', '', '',
6535         'tablename',  'varchar', 'NULL', $char_d, '', '',
6536         'tablenum',   'int',  'NULL', '', '', '', 
6537         'level',      'int',  '', '', '', '',
6538         'message',    'text', '', '', '', '',
6539       ],
6540       'primary_key'  => 'lognum',
6541       'unique'       => [],
6542       'index'        => [ ['_date'], ['level'] ],
6543       'foreign_keys' => [
6544                           { columns    => [ 'agentnum' ],
6545                             table      => 'agent',
6546                           },
6547                         ],
6548     },
6549
6550     'log_context' => {
6551       'columns' => [
6552         'logcontextnum', 'serial', '', '', '', '',
6553         'lognum', 'int', '', '', '', '',
6554         'context', 'varchar', '', $char_d, '', '',
6555       ],
6556       'primary_key'  => 'logcontextnum',
6557       'unique'       => [ [ 'lognum', 'context' ] ],
6558       'index'        => [],
6559       'foreign_keys' => [
6560                           { columns    => [ 'lognum' ],
6561                             table      => 'log',
6562                           },
6563                         ],
6564     },
6565
6566     'log_email' => {
6567       'columns' => [
6568         'logemailnum', 'serial', '', '', '', '',
6569         'context', 'varchar', 'NULL', $char_d, '', '',
6570         'min_level', 'int',  'NULL', '', '', '',
6571         'msgnum', 'int', '',  '', '', '',
6572         'to_addr', 'varchar', 'NULL',     255, '', '',
6573       ],
6574       'primary_key'  => 'logemailnum',
6575       'unique'       => [],
6576       'index'        => [ ['context'], ['min_level'] ],
6577       'foreign_keys' => [
6578                           { columns    => [ 'msgnum' ],
6579                             table      => 'msg_template',
6580                             references => [ 'msgnum' ],
6581                           },
6582                         ],
6583     },
6584
6585     'svc_alarm' => {
6586       'columns' => [
6587 #       name               type        null   length   default local
6588         'svcnum',          'int',      '',    '',      '',     '', 
6589         'alarmsystemnum',  'int',      '',    '',      '',     '',
6590         'alarmtypenum',    'int',      '',    '',      '',     '',
6591         'alarmstationnum', 'int',      '',    '',      '',     '',
6592         'acctnum',         'varchar',  '',    $char_d, '',     '',
6593         '_password',       'varchar',  '',    $char_d, '',     '',
6594         'location',        'varchar', 'NULL', $char_d, '',     '',
6595         'cs_receiver',     'int',     'NULL', '',      '',     '',
6596         'cs_phonenum',     'varchar', 'NULL', $char_d, '',     '',
6597         'serialnum',       'varchar', 'NULL', $char_d, '',     '',
6598         #installer (rep)
6599       ],
6600       'primary_key'  => 'svcnum',
6601       'unique'       => [],
6602       'index'        => [],
6603       'foreign_keys' => [
6604                           { columns    => [ 'svcnum' ],
6605                             table      => 'cust_svc',
6606                           },
6607                           { columns    => [ 'alarmsystemnum' ],
6608                             table      => 'alarm_system',
6609                           },
6610                           { columns    => [ 'alarmtypenum' ],
6611                             table      => 'alarm_type',
6612                           },
6613                           { columns    => [ 'alarmstationnum' ],
6614                             table      => 'alarm_station',
6615                           },
6616                         ],
6617     },
6618
6619     'alarm_system' => { #vendors
6620       'columns' => [
6621         'alarmsystemnum',  'serial',     '',      '', '', '',
6622         'agentnum',           'int', 'NULL',      '', '', '',
6623         'systemname',     'varchar',     '', $char_d, '', '',
6624         'disabled',          'char', 'NULL',       1, '', '', 
6625       ],
6626       'primary_key' => 'alarmsystemnum',
6627       'unique'      => [ ['agentnum', 'systemname'] ],
6628       'index'       => [ ['agentnum'], ['disabled'] ],
6629       'foreign_keys' => [
6630                           { columns    => [ 'agentnum' ],
6631                             table      => 'agent',
6632                           },
6633                         ],
6634     },
6635
6636     'alarm_type' => { #inputs and outputs
6637       'columns' => [
6638         'alarmtypenum', 'serial',     '',      '', '', '',
6639         'agentnum',        'int', 'NULL',      '', '', '',
6640         'inputs',          'int',     '', '', '', '',
6641         'outputs',         'int',     '', '', '', '',
6642         'disabled',       'char', 'NULL',       1, '', '', 
6643       ],
6644       'primary_key' => 'alarmtypenum',
6645       'unique'      => [ ['agentnum', 'inputs', 'outputs'] ],
6646       'index'       => [ ['agentnum'], ['disabled'] ],
6647       'foreign_keys' => [
6648                           { columns    => [ 'agentnum' ],
6649                             table      => 'agent',
6650                           },
6651                         ],
6652     },
6653
6654     'alarm_station' => { #central station (where the alarm reports to)
6655       'columns' => [
6656         'alarmstationnum', 'serial',     '',      '', '', '',
6657         'agentnum',           'int', 'NULL',      '', '', '',
6658         'stationname',    'varchar',     '', $char_d, '', '',
6659         'disabled',          'char', 'NULL',       1, '', '', 
6660       ],
6661       'primary_key' => 'alarmstationnum',
6662       'unique'      => [ ['agentnum', 'stationname'], ],
6663       'index'       => [ ['agentnum'], ['disabled'] ],
6664       'foreign_keys' => [
6665                           { columns    => [ 'agentnum' ],
6666                             table      => 'agent',
6667                           },
6668                         ],
6669     },
6670
6671     'svc_cable' => {
6672       'columns' => [
6673         'svcnum',        'int',     '',      '', '', '', 
6674         'providernum',   'int', 'NULL',      '', '', '',
6675         'ordernum',  'varchar', 'NULL', $char_d, '', '',
6676         'modelnum',      'int', 'NULL',      '', '', '',
6677         'serialnum', 'varchar', 'NULL', $char_d, '', '',
6678         'mac_addr',  'varchar', 'NULL',      12, '', '', 
6679       ],
6680       'primary_key'  => 'svcnum',
6681       'unique'       => [ ['serialnum'] , ['mac_addr'] ],
6682       'index'        => [],
6683       'foreign_keys' => [
6684                           { columns    => [ 'svcnum' ],
6685                             table      => 'cust_svc',
6686                           },
6687                           { columns    => [ 'providernum' ],
6688                             table      => 'cable_provider',
6689                           },
6690                           { columns    => [ 'modelnum' ],
6691                             table      => 'cable_model',
6692                           },
6693                         ],
6694     },
6695
6696     'cable_model' => {
6697       'columns' => [
6698         'modelnum',    'serial',     '',      '', '', '',
6699         'model_name', 'varchar',     '', $char_d, '', '',
6700         'disabled',      'char', 'NULL',       1, '', '', 
6701       ],
6702       'primary_key' => 'modelnum',
6703       'unique' => [ [ 'model_name' ], ],
6704       'index'  => [],
6705     },
6706
6707     'cable_provider' => {
6708       'columns' => [
6709         'providernum', 'serial',     '',      '', '', '',
6710         'provider',   'varchar',     '', $char_d, '', '',
6711         'disabled',      'char', 'NULL',       1, '', '', 
6712       ],
6713       'primary_key' => 'providernum',
6714       'unique' => [ [ 'provider' ], ],
6715       'index'  => [],
6716     },
6717
6718     'svc_conferencing' => {
6719       'columns' => [
6720         'svcnum',            'int',     '',      '', '', '',
6721         'conf_id',           'int', 'NULL',      '', '', '', #"system assigned"
6722         'conf_name',     'varchar',     '', $char_d, '', '',
6723         'conf_password', 'varchar',     '', $char_d, '', '',
6724         'access_code',   'varchar',     '',      16, '', '',
6725         'duration',          'int',     '',      '', '', '',
6726         'participants',      'int',     '',      '', '', '',
6727         'conftypenum',       'int',     '',      '', '', '',
6728         'confqualitynum',    'int',     '',      '', '', '',
6729         'opt_recording',    'char', 'NULL',       1, '', '',
6730         'opt_sip',          'char', 'NULL',       1, '', '',
6731         'opt_phone',        'char', 'NULL',       1, '', '',
6732       ],
6733       'primary_key' => 'svcnum',
6734       'unique' => [],
6735       'index'  => [],
6736       'foreign_keys' => [
6737                           { columns => [ 'svcnum' ],
6738                             table   => 'cust_svc',
6739                           },
6740                           { columns => [ 'conftypenum' ],
6741                             table   => 'conferencing_type',
6742                           },
6743                           { columns => [ 'confqualitynum' ],
6744                             table   => 'conferencing_quality',
6745                           },
6746                         ],
6747     },
6748
6749     'conferencing_type' => {
6750       'columns' => [
6751         'conftypenum',  'int',     '',      '', '', '',
6752         'typeid'      , 'int',     '',      '', '', '',
6753         'typename', 'varchar',     '', $char_d, '', '',
6754         'disabled',    'char', 'NULL',       1, '', '', 
6755       ],
6756       'primary_key' => 'conftypenum',
6757       'unique'      => [ [ 'typeid', 'disabled' ], [ 'typename', 'disabled' ] ],
6758       'index'       => [],
6759     },
6760
6761     'conferencing_quality' => {
6762       'columns' => [
6763         'confqualitynum',  'int',     '',      '', '', '',
6764         'qualityid'      , 'int',     '',      '', '', '',
6765         'qualityname', 'varchar',     '', $char_d, '', '',
6766         'disabled',       'char', 'NULL',       1, '', '', 
6767       ],
6768       'primary_key' => 'confqualitynum',
6769       'unique'      => [ [ 'qualityid', 'disabled' ], [ 'qualityname', 'disabled' ] ],
6770       'index'       => [],
6771     },
6772
6773     'svc_video' => {
6774       'columns' => [
6775         'svcnum',            'int', '', '', '', '',
6776         'smartcard_num', 'varchar', '', 16, '', '',
6777         'mac_addr',      'varchar', '', 12, '', '', 
6778         'duration',          'int', '', '', '', '',
6779       ],
6780       'primary_key' => 'svcnum',
6781       'unique' => [], # [ 'smartcard_num' ], [ 'mac_addr' ], ],
6782       'index'  => [],
6783       'foreign_keys' => [
6784                           { columns => [ 'svcnum' ],
6785                             table   => 'cust_svc',
6786                           },
6787                         ],
6788     },
6789
6790     'circuit_type' => {
6791       'columns' => [
6792         'typenum',     'serial',     '',      '', '', '',
6793         'typename',   'varchar',     '', $char_d, '', '',
6794         'disabled',      'char', 'NULL',       1, '', '',
6795         # speed? number of voice lines? anything else?
6796       ],
6797       'primary_key' => 'typenum',
6798       'unique' => [ [ 'typename' ] ],
6799       'index'  => [],
6800     },
6801
6802     'circuit_provider' => {
6803       'columns' => [
6804         'providernum', 'serial',     '',      '', '', '',
6805         'provider',   'varchar',     '', $char_d, '', '',
6806         'disabled',      'char', 'NULL',       1, '', '', 
6807       ],
6808       'primary_key' => 'providernum',
6809       'unique' => [ [ 'provider' ], ],
6810       'index'  => [],
6811     },
6812
6813     'circuit_termination' => {
6814       'columns' => [
6815         'termnum',     'serial',     '',      '', '', '',
6816         'termination','varchar',     '', $char_d, '', '',
6817         'disabled',      'char', 'NULL',       1, '', '',
6818       ],
6819       'primary_key' => 'termnum',
6820       'unique' => [ [ 'termination' ] ],
6821       'index' => [],
6822     },
6823
6824     'svc_circuit' => {
6825       'columns' => [
6826         'svcnum',                   'int',     '', '', '', '',
6827         'typenum',                  'int',     '', '', '', '',
6828         'providernum',              'int',     '', '', '', '',
6829         'termnum',                  'int',     '', '', '', '',
6830         'circuit_id',           'varchar',     '', 64, '', '',
6831         'desired_due_date',         'int', 'NULL', '', '', '',
6832         'due_date',                 'int', 'NULL', '', '', '',
6833         'vendor_order_id',      'varchar', 'NULL', $char_d,  '', '',
6834         'vendor_qual_id',       'varchar', 'NULL', $char_d,  '', '',
6835         'vendor_order_type',    'varchar', 'NULL', $char_d,  '', '',
6836         'vendor_order_status',  'varchar', 'NULL', $char_d,  '', '',
6837         'endpoint_ip_addr',     'varchar', 'NULL', 40, '', '',
6838         'endpoint_mac_addr',    'varchar', 'NULL', 12, '', '',
6839       ],
6840       'primary_key' => 'svcnum',
6841       'unique'      => [],
6842       'index'       => [ [ 'providernum' ], [ 'typenum' ] ],
6843       'foreign_keys' => [
6844                           { columns => [ 'svcnum' ],
6845                             table   => 'cust_svc',
6846                           },
6847                           { columns => [ 'typenum' ],
6848                             table   => 'circuit_type',
6849                           },
6850                           { columns => [ 'providernum' ],
6851                             table   => 'circuit_provider',
6852                           },
6853                           { columns => [ 'termnum' ],
6854                             table   => 'circuit_termination',
6855                           },
6856       ],
6857     },
6858
6859     'vend_main' => {
6860       'columns' => [
6861         'vendnum',   'serial',     '',      '', '', '',
6862         'vendname', 'varchar',     '', $char_d, '', '',
6863         'classnum',     'int',     '',      '', '', '',
6864         'disabled',    'char', 'NULL',       1, '', '', 
6865       ],
6866       'primary_key'  => 'vendnum',
6867       'unique'       => [ ['vendname', 'disabled'] ],
6868       'index'        => [],
6869       'foreign_keys' => [
6870                           { columns    => [ 'classnum' ],
6871                             table      => 'vend_class',
6872                           },
6873                         ],
6874     },
6875
6876     'vend_class' => {
6877       'columns' => [
6878         'classnum',     'serial',     '',      '', '', '', 
6879         'classname',   'varchar',     '', $char_d, '', '', 
6880         'disabled',       'char', 'NULL',       1, '', '', 
6881       ],
6882       'primary_key' => 'classnum',
6883       'unique'      => [],
6884       'index'       => [ ['disabled'] ],
6885     },
6886
6887     'vend_bill' => {
6888       'columns' => [
6889         'vendbillnum',    'serial',     '',      '', '', '', 
6890         'vendnum',           'int',     '',      '', '', '', 
6891         #'_date',        @date_type,                  '', '', 
6892         '_date',     'int', '', '',                   '', '', 
6893         'charged',     @money_type,                  '', '', 
6894       ],
6895       'primary_key'  => 'vendbillnum',
6896       'unique'       => [],
6897       'index'        => [ ['vendnum'], ['_date'], ],
6898       'foreign_keys' => [
6899                           { columns    => [ 'vendnum' ],
6900                             table      => 'vend_main',
6901                           },
6902                         ],
6903     },
6904
6905     'vend_pay' => {
6906       'columns' => [
6907         'vendpaynum',   'serial',    '',       '', '', '',
6908         'vendnum',         'int',    '',       '', '', '', 
6909         #'_date',     @date_type,                   '', '', 
6910         '_date',     'int', '', '',                   '', '', 
6911         'paid',      @money_type,                  '', '', 
6912       ],
6913       'primary_key'  => 'vendpaynum',
6914       'unique'       => [],
6915       'index'        => [ [ 'vendnum' ], [ '_date' ], ],
6916       'foreign_keys' => [
6917                           { columns    => [ 'vendnum' ],
6918                             table      => 'vend_main',
6919                           },
6920                         ],
6921     },
6922
6923     'vend_bill_pay' => {
6924       'columns' => [
6925         'vendbillpaynum', 'serial',     '',   '', '', '', 
6926         'vendbillnum',       'int',     '',   '', '', '', 
6927         'vendpaynum',        'int',     '',   '', '', '', 
6928         'amount',  @money_type, '', '', 
6929         #? '_date',   @date_type, '', '', 
6930       ],
6931       'primary_key'  => 'vendbillpaynum',
6932       'unique'       => [],
6933       'index'        => [ [ 'vendbillnum' ], [ 'vendpaynum' ] ],
6934       'foreign_keys' => [
6935                           { columns    => [ 'vendbillnum' ],
6936                             table      => 'vend_bill',
6937                           },
6938                           { columns    => [ 'vendpaynum' ],
6939                             table      => 'vend_pay',
6940                           },
6941                         ],
6942     },
6943
6944     %{ tables_hashref_torrus() },
6945
6946     # tables of ours for doing torrus virtual port combining
6947     'torrus_srvderive' => {
6948       'columns' => [
6949         'derivenum',     'serial',     '', '', '', '',
6950         'serviceid',    'varchar',     '', 64, '', '', #srvexport / reportfields
6951         'last_srv_date',   'date', 'NULL', '', '', '',
6952       ],
6953       'primary_key' => 'derivenum',
6954       'unique' => [ ['serviceid'] ],
6955       'index'  => [],
6956     },
6957
6958     'torrus_srvderive_component' => {
6959       'columns' => [
6960         'componentnum', 'serial', '', '', '', '',
6961         'derivenum',       'int', '', '', '', '',
6962         'serviceid',   'varchar', '', 64, '', '', #srvexport / reportfields
6963       ],
6964       'primary_key'  => 'componentnum',
6965       'unique'       => [ [ 'derivenum', 'serviceid' ], ],
6966       'index'        => [ [ 'derivenum', ], ],
6967       'foreign_keys' => [
6968                           { columns    => [ 'derivenum' ],
6969                             table      => 'torrus_srvderive',
6970                           },
6971                         ],
6972     },
6973
6974     'invoice_mode' => {
6975       'columns' => [
6976         'modenum',      'serial', '', '', '', '',
6977         'agentnum',        'int', 'NULL', '', '', '',
6978         'modename',    'varchar', '', 32, '', '',
6979       ],
6980       'primary_key' => 'modenum',
6981       'unique'      => [ ],
6982       'index'       => [ ],
6983       'foreign_keys' => [
6984                           { columns    => [ 'agentnum' ],
6985                             table      => 'agent',
6986                           },
6987                         ],
6988     },
6989
6990     'invoice_conf' => {
6991       'columns' => [
6992         'confnum',              'serial',   '', '', '', '',
6993         'modenum',              'int',      '', '', '', '',
6994         'locale',               'varchar',  'NULL', 16, '', '',
6995         'notice_name',          'varchar',  'NULL', 64, '', '',
6996         'subject',              'varchar',  'NULL', 64, '', '',
6997         'htmlnotes',            'text',     'NULL', '', '', '',
6998         'htmlfooter',           'text',     'NULL', '', '', '',
6999         'htmlsummary',          'text',     'NULL', '', '', '',
7000         'htmlreturnaddress',    'text',     'NULL', '', '', '',
7001         'latexnotes',           'text',     'NULL', '', '', '',
7002         'latexfooter',          'text',     'NULL', '', '', '',
7003         'latexsummary',         'text',     'NULL', '', '', '',
7004         'latexsmallfooter',     'text',     'NULL', '', '', '',
7005         'latexreturnaddress',   'text',     'NULL', '', '', '',
7006         'with_latexcoupon',     'char',     'NULL', '1', '', '',
7007         'htmlwatermark',        'text',     'NULL', '', '', '',
7008         'latexwatermark',       'text',     'NULL', '', '', '',
7009         'lpr',                  'varchar',  'NULL', $char_d, '', '',
7010       ],
7011       'primary_key'  => 'confnum',
7012       'unique'       => [ [ 'modenum', 'locale' ] ],
7013       'index'        => [ ],
7014       'foreign_keys' => [
7015                           { columns    => [ 'modenum' ],
7016                             table      => 'invoice_mode',
7017                           },
7018                         ],
7019     },
7020
7021     'export_batch' => {
7022       'columns' => [
7023         'batchnum',    'serial',     '',      '', '', '',
7024         'exportnum',      'int',     '',      '', '', '',
7025         '_date',          'int',     '',      '', '', '',
7026         'status',     'varchar', 'NULL',      32, '', '',
7027         'statustext',    'text', 'NULL',      '', '', '',
7028       ],
7029       'primary_key'  => 'batchnum',
7030       'unique'       => [],
7031       'index'        => [ [ 'exportnum' ], [ 'status' ] ],
7032       'foreign_keys' => [
7033                           { columns    => [ 'exportnum' ],
7034                             table      => 'part_export',
7035                             references => [ 'exportnum' ]
7036                           },
7037                         ],
7038     },
7039
7040     'export_batch_item' => {
7041       'columns' => [
7042         'itemnum',     'serial',     '',      '', '', '',
7043         'batchnum',       'int',     '',      '', '', '',
7044         'svcnum',         'int',     '',      '', '', '',
7045         'action',     'varchar',     '',      32, '', '',
7046         'data',          'text', 'NULL',      '', '', '',
7047         'frozen',        'char', 'NULL',       1, '', '',
7048       ],
7049       'primary_key'  => 'itemnum',
7050       'unique'       => [],
7051       'index'        => [ [ 'batchnum' ], [ 'svcnum' ] ],
7052       'foreign_keys' => [
7053                           { columns    => [ 'batchnum' ],
7054                             table      => 'export_batch',
7055                             references => [ 'batchnum' ]
7056                           },
7057                         ],
7058     },
7059
7060     # lookup table for states, similar to msa and lata
7061     'state' => {
7062       'columns' => [
7063         'statenum', 'int',  '', '', '', '', 
7064         'country',  'char', '',  2, '', '',
7065         'state',    'char', '', $char_d, '', '', 
7066         'fips',     'char', '',  3, '', '',
7067       ],
7068       'primary_key' => 'statenum',
7069       'unique' => [ [ 'country', 'state' ], ],
7070       'index' => [],
7071     },
7072
7073     # eventually link to tower/sector?
7074     'deploy_zone' => {
7075       'columns' => [
7076         'zonenum',        'serial',  '',     '',      '', '',
7077         'description',    'char',    'NULL', $char_d, '', '',
7078         'agentnum',       'int',     '',     '',      '', '',
7079         'censusyear',     'char',    'NULL', 4,      '', '',
7080         'dbaname',        'char',    'NULL', $char_d, '', '',
7081         'zonetype',       'char',    '',     1,       '', '',
7082         'technology',     'int',     '',     '',      '', '',
7083         'spectrum',       'int',     'NULL', '',      '', '',
7084         'adv_speed_up',   'decimal', '',     '10,3', '0', '',
7085         'adv_speed_down', 'decimal', '',     '10,3', '0', '',
7086         'cir_speed_up',   'decimal', '',     '10,3', '0', '',
7087         'cir_speed_down', 'decimal', '',     '10,3', '0', '',
7088         'is_broadband',   'char',    'NULL', 1,       '', '',
7089         'is_voice',       'char',    'NULL', 1,       '', '',
7090         'is_consumer',    'char',    'NULL', 1,       '', '',
7091         'is_business',    'char',    'NULL', 1,       '', '',
7092         'active_date',    @date_type,                 '', '',
7093         'expire_date',    @date_type,                 '', '',
7094       ],
7095       'primary_key' => 'zonenum',
7096       'unique' => [],
7097       'index'  => [ [ 'agentnum' ] ],
7098       'foreign_keys' => [
7099                           { columns     => [ 'agentnum' ],
7100                             table       => 'agent',
7101                             references  => [ 'agentnum' ],
7102                           },
7103                         ],
7104     },
7105
7106     'deploy_zone_block' => {
7107       'columns' => [
7108         'blocknum',       'serial',  '',     '',      '', '',
7109         'zonenum',        'int',     '',     '',      '', '',
7110         'censusblock',    'char',    '',     15,      '', '',
7111         'censusyear',     'char','NULL',      4,      '', '',
7112       ],
7113       'primary_key' => 'blocknum',
7114       'unique' => [],
7115       'index'  => [ [ 'zonenum' ] ],
7116       'foreign_keys' => [
7117                           { columns     => [ 'zonenum' ],
7118                             table       => 'deploy_zone',
7119                             references  => [ 'zonenum' ],
7120                           },
7121                         ],
7122     },
7123
7124     'deploy_zone_vertex' => {
7125       'columns' => [
7126         'vertexnum',      'serial',  '',     '',      '', '',
7127         'zonenum',        'int',     '',     '',      '', '',
7128         'latitude',       'decimal', '',     '10,7',  '', '', 
7129         'longitude',      'decimal', '',     '10,7',  '', '', 
7130       ],
7131       'primary_key' => 'vertexnum',
7132       'unique' => [ ],
7133       'index'  => [ ],
7134       'foreign_keys' => [
7135                           { columns     => [ 'zonenum' ],
7136                             table       => 'deploy_zone',
7137                             references  => [ 'zonenum' ],
7138                           },
7139                         ],
7140     },
7141
7142     'cacti_page' => {
7143       'columns' => [
7144         'cacti_pagenum',  'serial',   '',     '', '', '',
7145         'exportnum',      'int',      'NULL', '', '', '',
7146         'svcnum',         'int',      'NULL', '', '', '', 
7147         'graphnum',       'int',      'NULL', '', '', '', 
7148         'imported',       @date_type,             '', '',
7149         'content',        'text',     'NULL', '', '', '',
7150       ],
7151       'primary_key' => 'cacti_pagenum',
7152       'unique'  => [ ],
7153       'index'   => [ ['svcnum'], ['imported'] ],
7154       'foreign_keys' => [
7155                           { columns    => [ 'svcnum' ],
7156                             table      => 'cust_svc',
7157                             references => [ 'svcnum' ],
7158                           },
7159                           { columns    => [ 'exportnum' ],
7160                             table      => 'part_export',
7161                             references => [ 'exportnum' ],
7162                           },
7163                         ],
7164     },
7165
7166     'report_batch' => {
7167       'columns' => [
7168         'reportbatchnum', 'serial',      '',  '', '', '',
7169         'reportname',     'varchar',     '', 255, '', '',
7170         'agentnum',           'int', 'NULL',  '', '', '',
7171         'send_date',     @date_type,              '', '',
7172         'sdate',         @date_type,              '', '',
7173         'edate',         @date_type,              '', '',
7174         'usernum',            'int', 'NULL',  '', '', '',
7175         'msgnum',             'int', 'NULL',  '', '', '',
7176         # add report params here as necessary
7177       ],
7178       'primary_key' => 'reportbatchnum',
7179       'unique' => [],
7180       'index'  => [],
7181       'foreign_keys' => [
7182                           { columns    => [ 'agentnum' ],
7183                             table      => 'agent',
7184                             references => [ 'agentnum' ],
7185                           },
7186                           { columns    => [ 'usernum' ],
7187                             table      => 'access_user',
7188                             references => [ 'usernum' ],
7189                           },
7190                           { columns    => [ 'msgnum' ],
7191                             table      => 'msg_template',
7192                             references => [ 'msgnum' ],
7193                           },
7194                         ],
7195     },
7196
7197     # name type nullability length default local
7198
7199     #'new_table' => {
7200     #  'columns' => [
7201     #    'num', 'serial',       '', '', '', '',
7202     #  ],
7203     #  'primary_key' => 'num',
7204     #  'unique' => [],
7205     #  'index'  => [],
7206     #},
7207
7208   };
7209
7210 }
7211
7212 =back
7213
7214 =head1 BUGS
7215
7216 =head1 SEE ALSO
7217
7218 L<DBIx::DBSchema>
7219
7220 =cut
7221
7222 1;
7223