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