invalidate foreign key cache during reload_dbdef, fixes upgrade problem on #25536
[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       ],
1984       'primary_key'  => 'detailnum',
1985       'unique'       => [],
1986       'index'        => [ [ 'quotationpkgnum' ] ],
1987       'foreign_keys' => [
1988                           { columns    => [ 'quotationpkgnum' ],
1989                             table      => 'quotation_pkg',
1990                             references => [ 'quotationpkgnum' ],
1991                           },
1992                         ],
1993     },
1994
1995     'quotation_pkg_discount' => {
1996       'columns' => [
1997         'quotationpkgdiscountnum', 'serial', '', '', '', '',
1998         'quotationpkgnum',            'int', '', '', '', '', 
1999         'discountnum',                'int', '', '', '', '',
2000         'setuprecur',             'varchar', 'NULL', $char_d, '', '',
2001         'amount',              @money_typen, '', '',
2002         #'end_date',              @date_type,         '', '',
2003       ],
2004       'primary_key'  => 'quotationpkgdiscountnum',
2005       'unique'       => [],
2006       'index'        => [ [ 'quotationpkgnum' ], ], #[ 'discountnum' ] ],
2007       'foreign_keys' => [
2008                           { columns    => [ 'quotationpkgnum' ],
2009                             table      => 'quotation_pkg',
2010                           },
2011                           { columns    => [ 'discountnum' ],
2012                             table      => 'discount',
2013                           },
2014                         ],
2015     },
2016
2017     'quotation_pkg_tax' => {
2018       'columns' => [
2019         'quotationtaxnum',  'serial',     '',      '', '', '',
2020         'quotationpkgnum',     'int',     '',      '', '', '',
2021         'itemdesc',        'varchar',     '', $char_d, '', '',
2022         'setup_amount',    @money_type,                '', '',
2023         'recur_amount',    @money_type,                '', '',
2024       ],
2025       'primary_key' => 'quotationtaxnum',
2026       'unique' => [],
2027       'index'  => [ [ 'quotationpkgnum' ] ],
2028       'foreign_keys' => [
2029                           { columns    => [ 'quotationpkgnum' ],
2030                             table      => 'quotation_pkg',
2031                           },
2032                         ],
2033     },
2034
2035     'cust_location' => { #'location' now that its prospects too, but...
2036       'columns' => [
2037         'locationnum',      'serial',     '',      '', '', '',
2038         'prospectnum',         'int', 'NULL',      '', '', '',
2039         'custnum',             'int', 'NULL',      '', '', '',
2040         'locationname',    'varchar', 'NULL', $char_d, '', '',
2041         'address1',        'varchar',     '', $char_d, '', '', 
2042         'address2',        'varchar', 'NULL', $char_d, '', '', 
2043         'city',            'varchar', 'NULL', $char_d, '', '', 
2044         'county',          'varchar', 'NULL', $char_d, '', '', 
2045         'state',           'varchar', 'NULL', $char_d, '', '', 
2046         'zip',             'varchar', 'NULL',      10, '', '', 
2047         'latitude',        'decimal', 'NULL',  '10,7', '', '', 
2048         'longitude',       'decimal', 'NULL',  '10,7', '', '', 
2049         'coord_auto',         'char', 'NULL',       1, '', '',
2050         'addr_clean',         'char', 'NULL',       1, '', '',
2051         'country',            'char',     '',       2, '', '', 
2052         'geocode',         'varchar', 'NULL',      20, '', '',
2053         'district',        'varchar', 'NULL',      20, '', '',
2054         'censustract',     'varchar', 'NULL',      20, '', '',
2055         'censusyear',         'char', 'NULL',       4, '', '',
2056         'location_type',   'varchar', 'NULL',      20, '', '',
2057         'location_number', 'varchar', 'NULL',      20, '', '',
2058         'location_kind',      'char', 'NULL',       1, '', '',
2059         'incorporated',       'char', 'NULL',       1, '', '',
2060         'disabled',           'char', 'NULL',       1, '', '', 
2061       ],
2062       'primary_key'  => 'locationnum',
2063       'unique'       => [],
2064       'index'        => [ [ 'prospectnum' ], [ 'custnum' ],
2065                           [ 'county' ], [ 'state' ], [ 'country' ], [ 'zip' ],
2066                           [ 'city' ], [ 'district' ]
2067                         ],
2068       'foreign_keys' => [
2069                           { columns    => [ 'prospectnum' ],
2070                             table      => 'prospect_main',
2071                           },
2072                           { columns    => [ 'custnum' ],
2073                             table      => 'cust_main',
2074                           },
2075                         ],
2076     },
2077
2078     'cust_main_invoice' => {
2079       'columns' => [
2080         'destnum',  'serial',  '',     '', '', '', 
2081         'custnum',  'int',  '',     '', '', '', 
2082         'dest',     'varchar', '',  $char_d, '', '', 
2083       ],
2084       'primary_key'  => 'destnum',
2085       'unique'       => [],
2086       'index'        => [ ['custnum'], ],
2087       'foreign_keys' => [
2088                           { columns    => [ 'custnum' ],
2089                             table      => 'cust_main',
2090                           },
2091                         ],
2092     },
2093
2094     'cust_main_credit_limit' => {
2095       'columns' => [
2096         'creditlimitnum',   'serial', '', '', '', '',
2097         'custnum',             'int', '', '', '', '', 
2098         '_date',          @date_type,         '', '', 
2099         'amount',       @money_typen,         '', '',
2100         #'amount_currency', 'char', 'NULL',  3, '', '',
2101         'credit_limit', @money_typen,         '', '',
2102         #'credit_limit_currency', 'char', 'NULL',  3, '', '',
2103       ],
2104       'primary_key'  => 'creditlimitnum',
2105       'unique'       => [],
2106       'index'        => [ ['custnum'], ],
2107       'foreign_keys' => [
2108                           { columns    => [ 'custnum' ],
2109                             table      => 'cust_main',
2110                           },
2111                         ],
2112     },
2113
2114     'cust_main_note' => {
2115       'columns' => [
2116         'notenum',   'serial',    '',  '', '', '', 
2117         'custnum',      'int',    '',  '', '', '', 
2118         'classnum',     'int', 'NULL', '', '', '', 
2119         '_date',          @date_type,      '', '', 
2120         'otaker',   'varchar', 'NULL', 32, '', '', 
2121         'usernum',      'int', 'NULL', '', '', '',
2122         'comments',    'text', 'NULL', '', '', '', 
2123         'sticky',       'int',     '', '',  0, '',
2124       ],
2125       'primary_key'  => 'notenum',
2126       'unique'       => [],
2127       'index'        => [ [ 'custnum' ], [ '_date' ], [ 'usernum' ], ],
2128       'foreign_keys' => [
2129                           { columns    => [ 'custnum' ],
2130                             table      => 'cust_main',
2131                           },
2132                           { columns    => [ 'classnum' ],
2133                             table      => 'cust_note_class',
2134                           },
2135                           { columns    => [ 'usernum' ],
2136                             table      => 'access_user',
2137                           },
2138                         ],
2139     },
2140
2141     'cust_note_class' => {
2142       'columns' => [
2143         'classnum',    'serial',   '',      '', '', '', 
2144         'classname',   'varchar',  '', $char_d, '', '', 
2145         'disabled',    'char', 'NULL',       1, '', '', 
2146       ],
2147       'primary_key' => 'classnum',
2148       'unique' => [],
2149       'index' => [ ['disabled'] ],
2150     },
2151
2152     'cust_category' => {
2153       'columns' => [
2154         'categorynum',   'serial',  '', '', '', '', 
2155         'categoryname',  'varchar', '', $char_d, '', '', 
2156         'weight',         'int', 'NULL',  '', '', '',
2157         'disabled',      'char', 'NULL',   1, '', '', 
2158       ],
2159       'primary_key' => 'categorynum',
2160       'unique' => [],
2161       'index' => [ ['disabled'] ],
2162     },
2163
2164     'cust_class' => {
2165       'columns' => [
2166         'classnum',     'serial',     '',      '', '', '', 
2167         'classname',   'varchar',     '', $char_d, '', '', 
2168         'categorynum',     'int', 'NULL',      '', '', '', 
2169         'tax',            'char', 'NULL',       1, '', '', 
2170         'disabled',       'char', 'NULL',       1, '', '', 
2171       ],
2172       'primary_key'  => 'classnum',
2173       'unique'       => [],
2174       'index'        => [ ['disabled'] ],
2175       'foreign_keys' => [
2176                           { columns    => [ 'categorynum' ],
2177                             table      => 'cust_category',
2178                           },
2179                         ],
2180     },
2181  
2182     'cust_tag' => {
2183       'columns' => [
2184         'custtagnum', 'serial', '', '', '', '',
2185         'custnum',       'int', '', '', '', '',
2186         'tagnum',        'int', '', '', '', '',
2187       ],
2188       'primary_key'  => 'custtagnum',
2189       'unique'       => [ [ 'custnum', 'tagnum' ] ],
2190       'index'        => [ [ 'custnum' ] ],
2191       'foreign_keys' => [
2192                           { columns    => [ 'custnum' ],
2193                             table      => 'cust_main',
2194                           },
2195                           { columns    => [ 'tagnum' ],
2196                             table      => 'part_tag',
2197                           },
2198                         ],
2199     },
2200
2201     'part_tag' => {
2202       'columns' => [
2203         'tagnum',    'serial',     '',      '', '', '',
2204         'tagname',  'varchar',     '', $char_d, '', '',
2205         'tagdesc',  'varchar', 'NULL', $char_d, '', '',
2206         'tagcolor', 'varchar', 'NULL',       6, '', '',
2207         'by_default',  'char', 'NULL',       1, '', '',
2208         'disabled',    'char', 'NULL',       1, '', '', 
2209       ],
2210       'primary_key' => 'tagnum',
2211       'unique'      => [], #[ [ 'tagname' ] ], #?
2212       'index'       => [ [ 'disabled' ] ],
2213     },
2214
2215     'cust_main_exemption' => {
2216       'columns' => [
2217         'exemptionnum',   'serial',     '',      '', '', '',
2218         'custnum',           'int',     '',      '', '', '', 
2219         'taxname',       'varchar',     '', $char_d, '', '',
2220         'exempt_number', 'varchar', 'NULL', $char_d, '', '',
2221         #start/end dates?  for reporting?
2222       ],
2223       'primary_key'  => 'exemptionnum',
2224       'unique'       => [],
2225       'index'        => [ [ 'custnum' ] ],
2226       'foreign_keys' => [
2227                           { columns    => [ 'custnum' ],
2228                             table      => 'cust_main',
2229                           },
2230                         ],
2231     },
2232
2233     'cust_tax_adjustment' => {
2234       'columns' => [
2235         'adjustmentnum', 'serial',     '',      '', '', '',
2236         'custnum',          'int',     '',      '', '', '',
2237         'taxname',      'varchar',     '', $char_d, '', '',
2238         'amount',     @money_type,                  '', '', 
2239         'currency',        'char', 'NULL',       3, '', '',
2240         'comment',      'varchar', 'NULL', $char_d, '', '', 
2241         'billpkgnum',       'int', 'NULL',      '', '', '',
2242         #more?  no cust_bill_pkg_tax_location?
2243       ],
2244       'primary_key'  => 'adjustmentnum',
2245       'unique'       => [],
2246       'index'        => [ [ 'custnum' ], [ 'billpkgnum' ] ],
2247       'foreign_keys' => [
2248                           { columns    => [ 'custnum' ],
2249                             table      => 'cust_main',
2250                           },
2251                           { columns    => [ 'billpkgnum' ],
2252                             table      => 'cust_bill_pkg',
2253                           },
2254                         ],
2255     },
2256
2257     'cust_main_county' => { #district+city+county+state+country are checked 
2258                             #off the cust_main_county for validation and to 
2259                             #provide a tax rate.
2260       'columns' => [
2261         'taxnum',    'serial',     '',      '', '', '', 
2262         'district', 'varchar', 'NULL',      20, '', '',
2263         'city',     'varchar', 'NULL', $char_d, '', '',
2264         'county',   'varchar', 'NULL', $char_d, '', '', 
2265         'state',    'varchar', 'NULL', $char_d, '', '', 
2266         'country',     'char',     '',       2, '', '', 
2267         'taxclass', 'varchar', 'NULL', $char_d, '', '', 
2268         'exempt_amount', @money_type,            '', '', 
2269         'exempt_amount_currency', 'char', 'NULL', 3, '', '',
2270         'tax',         'real',     '',      '', '', '', #tax %
2271         'taxname',  'varchar', 'NULL', $char_d, '', '', 
2272         'setuptax',    'char', 'NULL',       1, '', '', # Y = setup tax exempt
2273         'recurtax',    'char', 'NULL',       1, '', '', # Y = recur tax exempt
2274       ],
2275       'primary_key' => 'taxnum',
2276       'unique' => [],
2277   #    'unique' => [ ['taxnum'], ['state', 'county'] ],
2278       'index' => [ [ 'district' ], [ 'city' ], [ 'county' ], [ 'state' ], 
2279                    [ 'country' ],
2280                    [ 'taxclass' ],
2281                  ],
2282     },
2283
2284     'tax_rate'    => {
2285       'columns' => [
2286         'taxnum',       'serial',     '',      '', '', '', 
2287         'geocode',     'varchar', 'NULL', $char_d, '', '',#cch provides 10 char
2288         'data_vendor', 'varchar', 'NULL', $char_d, '', '',#auto update source
2289         'location',    'varchar', 'NULL', $char_d, '', '',#provided by tax authority
2290         'taxclassnum', 'int',     'NULL',      '', '', '', 
2291         'effective_date', @date_type, '', '', 
2292         'tax',        @taxrate_type,      '', '',        # tax %
2293         'excessrate', @taxrate_typen,     '', '',        # second tax %
2294         'taxbase',    @money_typen, '', '',              # amount at first tax rate
2295         'taxmax',     @money_typen, '', '',              # maximum about at both rates
2296         'usetax',        @taxrate_typen,     '', '',     # tax % when non-local
2297         'useexcessrate', @taxrate_typen,     '', '',     # second tax % when non-local
2298         'unittype',    'int',  'NULL', '', '', '',      # for fee
2299         'fee',         @taxrate_typen,     '', '',      # amount tax per unit
2300         'excessfee',   @taxrate_typen,     '', '',      # second amount tax per unit
2301         'feebase',     @taxrate_typen,     '', '',      # units taxed at first rate
2302         'feemax',      @taxrate_typen,     '', '',      # maximum number of unit taxed
2303         'maxtype',     'int',  'NULL', '', '', '',      # indicator of how thresholds accumulate
2304         'taxname', 'varchar',  'NULL', $char_d, '', '', # may appear on invoice
2305         'taxauth',     'int',  'NULL', '', '', '',      # tax authority
2306         'basetype',    'int',  'NULL', '', '', '', # indicator of basis for tax
2307         'passtype',    'int',  'NULL', '', '', '', # indicator declaring how item should be shown
2308         'passflag',    'char', 'NULL', 1, '', '',  # Y = required to list as line item, N = Prohibited
2309         'setuptax',    'char', 'NULL', 1, '', '',  # Y = setup tax exempt
2310         'recurtax',    'char', 'NULL', 1, '', '',  # Y = recur tax exempt
2311         'inoutcity',   'char', 'NULL', 1, '', '',  # '', 'I', or 'O'
2312         'inoutlocal',  'char', 'NULL', 1, '', '',  # '', 'I', or 'O'
2313         'manual',      'char', 'NULL', 1, '', '',  # Y = manually edited
2314         'disabled',    'char', 'NULL', 1, '', '',  # Y = tax disabled
2315       ],
2316       'primary_key'  => 'taxnum',
2317       'unique'       => [],
2318       'index'        => [ ['taxclassnum'], ['data_vendor', 'geocode'] ],
2319       'foreign_keys' => [
2320                           { columns    => [ 'taxclassnum' ],
2321                             table      => 'tax_class',
2322                           },
2323                         ],
2324     },
2325
2326     'tax_rate_location' => { 
2327       'columns' => [
2328         'taxratelocationnum', 'serial',  '',     '', '', '', 
2329         'data_vendor',        'varchar', 'NULL', $char_d, '', '',
2330         'geocode',            'varchar', '',     20,      '', '', 
2331         'city',               'varchar', 'NULL', $char_d, '', '',
2332         'county',             'varchar', 'NULL', $char_d, '', '',
2333         'state',              'char',    'NULL',       2, '', '', 
2334         'country',            'char',    'NULL',       2, '', '',
2335         'disabled',           'char',    'NULL', 1, '', '',
2336       ],
2337       'primary_key' => 'taxratelocationnum',
2338       'unique' => [],
2339       'index' => [ [ 'data_vendor', 'geocode', 'disabled' ] ],
2340     },
2341
2342     'cust_tax_location' => { 
2343       'columns' => [
2344         'custlocationnum', 'serial',  '',     '', '', '', 
2345         'data_vendor',     'varchar', 'NULL', $char_d, '', '', # update source
2346         'city',            'varchar', 'NULL', $char_d, '', '',
2347         'postalcity',      'varchar', 'NULL', $char_d, '', '',
2348         'county',          'varchar', 'NULL', $char_d, '', '',
2349         'zip',             'char',    'NULL', 5,  '', '', 
2350         'state',           'char',    '',     2,  '', '', 
2351         'country',         'char',    'NULL', 2,  '', '', # should not actually be NULL, but cch...
2352         'ziphi',           'char',    'NULL', 10, '', '',
2353         'ziplo',           'char',    'NULL', 10, '', '',
2354         'plus4hi',         'char',    'NULL', 4,  '', '', 
2355         'plus4lo',         'char',    'NULL', 4,  '', '', 
2356         'default_location','char',    'NULL', 1,  '', '', # Y = default for zip
2357         'cityflag',        'char',    'NULL', 1,  '', '', # I(n)/O(out)/B(oth)/NULL
2358         'geocode',         'varchar', '',    20,  '', '', 
2359       ],
2360       'primary_key' => 'custlocationnum',
2361       'unique' => [],
2362       'index' => [ [ 'zip', 'plus4lo', 'plus4hi', 'ziphi', 'ziplo' ] ],
2363     },
2364
2365     'tax_class' => { 
2366       'columns' => [
2367         'taxclassnum',  'serial',  '',            '', '', '',
2368         'data_vendor',  'varchar', 'NULL',   $char_d, '', '',
2369         'taxclass',     'varchar', '',       $char_d, '', '',          
2370         'description',  'varchar', '',     2*$char_d, '', '',          
2371       ],
2372       'primary_key' => 'taxclassnum',
2373       'unique' => [ [ 'data_vendor', 'taxclass' ] ],
2374       'index' => [],
2375     },
2376
2377     'tax_status' => {
2378       'columns' => [
2379         'taxstatusnum', 'serial', '',             '', '', '',
2380         'data_vendor',  'varchar', 'NULL',   $char_d, '', '',
2381         'taxstatus',    'varchar', '',       $char_d, '', '',          
2382         'description',  'varchar', '',       $char_d, '', '',
2383       ],
2384       'primary_key' => 'taxstatusnum',
2385       'unique'      => [ [ 'data_vendor', 'taxstatus' ] ],
2386       'index' => [],
2387     },
2388
2389     'cust_pay_pending' => {
2390       'columns' => [
2391         'paypendingnum',      'serial',     '',      '', '', '',
2392         'custnum',               'int',     '',      '', '', '', 
2393         'paid',            @money_type,                  '', '', 
2394         'currency',             'char', 'NULL',       3, '', '',
2395         '_date',            @date_type,                  '', '', 
2396         'payby',                'char',     '',       4, '', '',
2397         'payinfo',           'varchar', 'NULL',     512, '', '',
2398         'paymask',           'varchar', 'NULL', $char_d, '', '', 
2399         'paydate',           'varchar', 'NULL',     10, '', '', 
2400         'recurring_billing', 'varchar', 'NULL', $char_d, '', '',
2401         'payunique',         'varchar', 'NULL', $char_d, '', '', #separate paybatch "unique" functions from current usage
2402
2403         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
2404         'status',       'varchar',     '', $char_d, '', '', 
2405         'session_id',   'varchar', 'NULL', 1024, '', '', # SHA-512-hex
2406         'statustext',   'text',    'NULL',  '', '', '', 
2407         'gatewaynum',   'int',     'NULL',  '', '', '',
2408         #'cust_balance', @money_type,            '', '',
2409         'paynum',       'int',     'NULL',  '', '', '',
2410         'void_paynum',  'int',     'NULL',  '', '', '',
2411         'jobnum',    'bigint',     'NULL',  '', '', '', 
2412         'invnum',       'int',     'NULL',  '', '', '',
2413         'manual',       'char',    'NULL',   1, '', '',
2414         'discount_term','int',     'NULL',  '', '', '',
2415         'failure_status','varchar','NULL',  16, '', '',
2416       ],
2417       'primary_key'  => 'paypendingnum',
2418       'unique'       => [ [ 'payunique' ] ],
2419       'index'        => [ [ 'custnum' ], [ 'status' ],
2420                           ['paynum'], ['void_paynum'], ['jobnum'], ['invnum'],
2421                         ],
2422       'foreign_keys' => [
2423                           { columns    => [ 'custnum' ],
2424                             table      => 'cust_main',
2425                           },
2426                           { columns    => [ 'pkgnum' ],
2427                             table      => 'cust_pkg',
2428                           },
2429                           { columns    => [ 'gatewaynum' ],
2430                             table      => 'payment_gateway',
2431                           },
2432                           { columns    => [ 'paynum' ],
2433                             table      => 'cust_pay',
2434                           },
2435                           { columns    => [ 'void_paynum' ],
2436                             table      => 'cust_pay_void',
2437                             references => [ 'paynum' ],
2438                           },
2439                           { columns    => [ 'jobnum' ],
2440                             table      => 'queue',
2441                           },
2442                           { columns    => [ 'invnum' ],
2443                             table      => 'cust_bill',
2444                           },
2445                         ],
2446     },
2447
2448     'cust_pay' => {
2449       'columns' => [
2450         'paynum',       'serial',    '',       '', '', '',
2451         'custnum',         'int',    '',       '', '', '', 
2452         '_date',     @date_type,                   '', '', 
2453         'paid',      @money_type,                  '', '', 
2454         'currency',       'char', 'NULL',       3, '', '',
2455         'otaker',      'varchar', 'NULL',      32, '', '',
2456         'usernum',         'int', 'NULL',      '', '', '',
2457         'payby',          'char',     '',       4, '', '',
2458         'payinfo',     'varchar', 'NULL',     512, '', '',
2459         'paymask',     'varchar', 'NULL', $char_d, '', '', 
2460         'paydate',     'varchar', 'NULL',      10, '', '', 
2461         'paybatch',    'varchar', 'NULL', $char_d, '', '',#for auditing purposes
2462         'payunique',   'varchar', 'NULL', $char_d, '', '',#separate paybatch "unique" functions from current usage
2463         'closed',         'char', 'NULL',       1, '', '', 
2464         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
2465         'no_auto_apply',  'char', 'NULL',       1, '', '', 
2466
2467         # cash/check deposit info fields
2468         'bank',        'varchar', 'NULL', $char_d, '', '',
2469         'depositor',   'varchar', 'NULL', $char_d, '', '',
2470         'account',     'varchar', 'NULL',      20, '', '',
2471         'teller',      'varchar', 'NULL',      20, '', '',
2472
2473         'batchnum',        'int', 'NULL',      '', '', '',#pay_batch foreign key
2474
2475         # credit card/EFT fields (formerly in paybatch)
2476         'gatewaynum',      'int', 'NULL',      '', '', '', # payment_gateway FK
2477         'processor',   'varchar', 'NULL', $char_d, '', '', # module name
2478         'auth',        'varchar', 'NULL',      16, '', '', # CC auth number
2479         'order_number','varchar', 'NULL', $char_d, '', '', # transaction number
2480       ],
2481       'primary_key'  => 'paynum',
2482       #i guess not now, with cust_pay_pending, if we actually make it here, we _do_ want to record it# 'unique' => [ [ 'payunique' ] ],
2483       'index'        => [ ['custnum'], ['paybatch'], ['payby'], ['_date'],
2484                           ['usernum'],
2485                         ],
2486       'foreign_keys' => [
2487                           { columns    => [ 'custnum' ],
2488                             table      => 'cust_main',
2489                           },
2490                           { columns    => [ 'usernum' ],
2491                             table      => 'access_user',
2492                           },
2493                           { columns    => [ 'pkgnum' ],
2494                             table      => 'cust_pkg',
2495                           },
2496                           { columns    => [ 'batchnum' ],
2497                             table      => 'pay_batch',
2498                           },
2499                           { columns    => [ 'gatewaynum' ],
2500                             table      => 'payment_gateway',
2501                           },
2502                         ],
2503     },
2504
2505     'cust_pay_void' => {
2506       'columns' => [
2507         'paynum',          'int',    '',       '', '', '', 
2508         'custnum',         'int',    '',       '', '', '', 
2509         '_date',      @date_type,                  '', '', 
2510         'paid',      @money_type,                  '', '', 
2511         'currency',       'char', 'NULL',       3, '', '',
2512         'otaker',      'varchar', 'NULL',      32, '', '', 
2513         'usernum',         'int', 'NULL',      '', '', '',
2514         'payby',          'char',     '',       4, '', '',
2515         'payinfo',     'varchar', 'NULL',     512, '', '',
2516         'paymask',     'varchar', 'NULL', $char_d, '', '', 
2517         #'paydate' ?
2518         'paybatch',    'varchar', 'NULL', $char_d, '', '', #for auditing purposes.
2519         'closed',        'char',  'NULL',       1, '', '', 
2520         'pkgnum', 'int',   'NULL', '', '', '', #desired pkgnum for pkg-balances
2521
2522         # cash/check deposit info fields
2523         'bank',       'varchar', 'NULL', $char_d, '', '',
2524         'depositor',  'varchar', 'NULL', $char_d, '', '',
2525         'account',    'varchar', 'NULL',      20, '', '',
2526         'teller',     'varchar', 'NULL',      20, '', '',
2527         'batchnum',       'int', 'NULL',      '', '', '', #pay_batch foreign key
2528
2529         # credit card/EFT fields (formerly in paybatch)
2530         'gatewaynum',      'int', 'NULL',      '', '', '', # payment_gateway FK
2531         'processor',   'varchar', 'NULL', $char_d, '', '', # module name
2532         'auth',        'varchar', 'NULL',      16, '', '', # CC auth number
2533         'order_number','varchar', 'NULL', $char_d, '', '', # transaction number
2534
2535         #void fields
2536         'void_date',  @date_type,                  '', '', 
2537         'reason',      'varchar', 'NULL', $char_d, '', '', 
2538         'reasonnum',       'int', 'NULL',      '', '', '', 
2539         'void_usernum',    'int', 'NULL',      '', '', '',
2540       ],
2541       'primary_key'  => 'paynum',
2542       'unique'       => [],
2543       'index'        => [ ['custnum'], ['usernum'], ['void_usernum'] ],
2544       'foreign_keys' => [
2545                           { columns    => [ 'custnum' ],
2546                             table      => 'cust_main',
2547                           },
2548                           { columns    => [ 'usernum' ],
2549                             table      => 'access_user',
2550                           },
2551                           { columns    => [ 'pkgnum' ],
2552                             table      => 'cust_pkg',
2553                           },
2554                           { columns    => [ 'batchnum' ],
2555                             table      => 'pay_batch',
2556                           },
2557                           { columns    => [ 'gatewaynum' ],
2558                             table      => 'payment_gateway',
2559                           },
2560                           { columns    => [ 'reasonnum' ],
2561                             table      => 'reason',
2562                           },
2563                           { columns    => [ 'void_usernum' ],
2564                             table      => 'access_user',
2565                             references => [ 'usernum' ],
2566                           },
2567                         ],
2568     },
2569
2570     'cust_bill_pay' => {
2571       'columns' => [
2572         'billpaynum', 'serial',     '',   '', '', '', 
2573         'invnum',  'int',     '',   '', '', '', 
2574         'paynum',  'int',     '',   '', '', '', 
2575         'amount',  @money_type, '', '', 
2576         '_date',   @date_type, '', '', 
2577         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
2578       ],
2579       'primary_key'  => 'billpaynum',
2580       'unique'       => [],
2581       'index'        => [ [ 'paynum' ], [ 'invnum' ] ],
2582       'foreign_keys' => [
2583                           { columns    => [ 'invnum' ],
2584                             table      => 'cust_bill',
2585                           },
2586                           { columns    => [ 'paynum' ],
2587                             table      => 'cust_pay',
2588                           },
2589                           { columns    => [ 'pkgnum' ],
2590                             table      => 'cust_pkg',
2591                           },
2592                         ],
2593     },
2594
2595     'cust_bill_pay_batch' => {
2596       'columns' => [
2597         'billpaynum', 'serial',     '',   '', '', '', 
2598         'invnum',  'int',     '',   '', '', '', 
2599         'paybatchnum',  'int',     '',   '', '', '', 
2600         'amount',  @money_type, '', '', 
2601         '_date',   @date_type, '', '', 
2602       ],
2603       'primary_key'  => 'billpaynum',
2604       'unique'       => [],
2605       'index'        => [ [ 'paybatchnum' ], [ 'invnum' ] ],
2606       'foreign_keys' => [
2607                           { columns    => [ 'invnum' ],
2608                             table      => 'cust_bill',
2609                           },
2610                           { columns    => [ 'paybatchnum' ],
2611                             table      => 'cust_pay_batch',
2612                           },
2613                         ],
2614     },
2615
2616     'cust_bill_pay_pkg' => {
2617       'columns' => [
2618         'billpaypkgnum', 'serial', '', '', '', '',
2619         'billpaynum',       'int', '', '', '', '',
2620         'billpkgnum',       'int', '', '', '', '',
2621         'billpkgtaxlocationnum', 'int', 'NULL', '', '', '',
2622         'billpkgtaxratelocationnum', 'int', 'NULL', '', '', '',
2623         'amount',         @money_type,     '', '',
2624         'setuprecur',      'varchar', '', $char_d, '', '',
2625         'sdate',   @date_type, '', '', 
2626         'edate',   @date_type, '', '', 
2627       ],
2628       'primary_key'  => 'billpaypkgnum',
2629       'unique'       => [],
2630       'index'        => [ [ 'billpaynum' ], [ 'billpkgnum' ], ],
2631       'foreign_keys' => [
2632                           { columns    => [ 'billpaynum' ],
2633                             table      => 'cust_bill_pay',
2634                           },
2635                           { columns    => [ 'billpkgnum' ],
2636                             table      => 'cust_bill_pkg',
2637                           },
2638                           { columns    => [ 'billpkgtaxlocationnum' ],
2639                             table      => 'cust_bill_pkg_tax_location',
2640                           },
2641                           { columns    => [ 'billpkgtaxratelocationnum' ],
2642                             table      => 'cust_bill_pkg_tax_rate_location',
2643                           },
2644                         ],
2645     },
2646
2647     'pay_batch' => { #batches of payments to an external processor
2648       'columns' => [
2649         'batchnum', 'serial',     '', '', '', '', 
2650         'agentnum',    'int', 'NULL', '', '', '', 
2651         'payby',      'char',     '',  4, '', '', # CARD/CHEK
2652         'status',     'char', 'NULL',  1, '', '', 
2653         'download',       @date_type,     '', '', 
2654         'upload',         @date_type,     '', '', 
2655         'title',   'varchar', 'NULL',255, '', '',
2656         'processor_id',   'varchar', 'NULL',255, '', '',
2657       ],
2658       'primary_key'  => 'batchnum',
2659       'unique'       => [],
2660       'index'        => [],
2661       'foreign_keys' => [
2662                           { columns    => [ 'agentnum' ],
2663                             table      => 'agent',
2664                           },
2665                         ],
2666     },
2667
2668     'cust_pay_batch' => { #list of customers in current CARD/CHEK batch
2669       'columns' => [
2670         'paybatchnum',    'serial',     '',      '', '', '', 
2671         'batchnum',          'int',     '',      '', '', '', 
2672         'invnum',            'int',     '',      '', '', '', 
2673         'custnum',           'int',     '',      '', '', '', 
2674         'last',          'varchar',     '', $char_d, '', '', 
2675         'first',         'varchar',     '', $char_d, '', '', 
2676         'address1',      'varchar',     '', $char_d, '', '', 
2677         'address2',      'varchar', 'NULL', $char_d, '', '', 
2678         'city',          'varchar', 'NULL', $char_d, '', '', 
2679         'state',         'varchar', 'NULL', $char_d, '', '', 
2680         'zip',           'varchar', 'NULL',      10, '', '', 
2681         'country',          'char',     '',       2, '', '', 
2682         'payby',            'char',     '',       4, '', '',
2683         'payinfo',       'varchar', 'NULL',     512, '', '', 
2684         #'exp',          @date_type,                  '', '',
2685         'exp',           'varchar', 'NULL',      11, '', '', 
2686         'payname',       'varchar', 'NULL', $char_d, '', '', 
2687         'paytype',       'varchar', 'NULL', $char_d, '', '', 
2688         'amount',      @money_type,                  '', '', 
2689         'currency',         'char', 'NULL',       3, '', '',
2690         'status',        'varchar', 'NULL', $char_d, '', '', 
2691         'failure_status','varchar', 'NULL',      16, '', '',
2692         'error_message', 'varchar', 'NULL', $char_d, '', '',
2693       ],
2694       'primary_key'  => 'paybatchnum',
2695       'unique'       => [],
2696       'index'        => [ ['batchnum'], ['invnum'], ['custnum'] ],
2697       'foreign_keys' => [
2698                           { columns    => [ 'batchnum' ],
2699                             table      => 'pay_batch',
2700                           },
2701                           #{ columns    => [ 'invnum' ],
2702                           #  table      => 'cust_bill',
2703                           #},
2704                           { columns    => [ 'custnum' ],
2705                             table      => 'cust_main',
2706                           },
2707                         ],
2708     },
2709
2710     'fcc477map' => {
2711       'columns' => [
2712         'formkey',   'varchar',     '', 255, '', '',
2713         'formvalue',    'text', 'NULL',  '', '', '',
2714       ],
2715       'primary_key' => 'formkey',
2716       'unique'      => [],
2717       'index'       => [],
2718     },
2719
2720     'cust_pkg' => {
2721       'columns' => [
2722         'pkgnum',           'serial',     '', '', '', '', 
2723         'custnum',             'int',     '', '', '', '', 
2724         'pkgpart',             'int',     '', '', '', '', 
2725         'pkgbatch',        'varchar', 'NULL', $char_d, '', '',
2726         'contactnum',          'int', 'NULL', '', '', '', 
2727         'locationnum',         'int', 'NULL', '', '', '',
2728         'otaker',          'varchar', 'NULL', 32, '', '', 
2729         'usernum',             'int', 'NULL', '', '', '',
2730         'salesnum',            'int', 'NULL', '', '', '', 
2731         'order_date',     @date_type,             '', '', 
2732         'start_date',     @date_type,             '', '', 
2733         'setup',          @date_type,             '', '', 
2734         'bill',           @date_type,             '', '', 
2735         'last_bill',      @date_type,             '', '', 
2736         'susp',           @date_type,             '', '', 
2737         'adjourn',        @date_type,             '', '', 
2738         'resume',         @date_type,             '', '', 
2739         'cancel',         @date_type,             '', '', 
2740         'uncancel',       @date_type,             '', '', 
2741         'uncancel_pkgnum',     'int', 'NULL', '', '', '',
2742         'expire',         @date_type,             '', '', 
2743         'contract_end',   @date_type,             '', '',
2744         'dundate',        @date_type,             '', '',
2745         'change_date',    @date_type,             '', '',
2746         'change_pkgnum',       'int', 'NULL', '', '', '',
2747         'change_pkgpart',      'int', 'NULL', '', '', '',
2748         'change_locationnum',  'int', 'NULL', '', '', '',
2749         'change_custnum',      'int', 'NULL', '', '', '',
2750         'main_pkgnum',         'int', 'NULL', '', '', '',
2751         'pkglinknum',          'int', 'NULL', '', '', '',
2752         'manual_flag',        'char', 'NULL',  1, '', '', 
2753         'no_auto',            'char', 'NULL',  1, '', '', 
2754         'quantity',            'int', 'NULL', '', '', '',
2755         'agent_pkgid',     'varchar', 'NULL', $char_d, '', '',
2756         'waive_setup',        'char', 'NULL',  1, '', '', 
2757         'recur_show_zero',    'char', 'NULL',  1, '', '',
2758         'setup_show_zero',    'char', 'NULL',  1, '', '',
2759         'change_to_pkgnum',    'int', 'NULL', '', '', '',
2760         'separate_bill',      'char', 'NULL',  1, '', '',
2761       ],
2762       'primary_key'  => 'pkgnum',
2763       'unique'       => [],
2764       'index'        => [ ['custnum'], ['pkgpart'], ['pkgbatch'],
2765                           ['locationnum'], ['usernum'], ['agent_pkgid'],
2766                           ['order_date'], [ 'start_date' ], ['setup'], ['bill'],
2767                           ['last_bill'], ['susp'], ['adjourn'], ['resume'],
2768                           ['cancel'], ['expire'], ['contract_end'],
2769                           ['change_date'],
2770                           ['no_auto'],
2771                           #['contactnum'],
2772                           ['salesnum'],
2773                           #['uncancel_pkgnum'],
2774                           #['change_pkgnum'], ['change_locationnum'],
2775                           #['change_custnum'],
2776                           ['main_pkgnum'],
2777                           #['pkglinknum'], ['change_to_pkgnum'],
2778                         ],
2779       'foreign_keys' => [
2780                           { columns    => [ 'custnum' ],
2781                             table      => 'cust_main',
2782                           },
2783                           { columns    => [ 'pkgpart' ],
2784                             table      => 'part_pkg',
2785                           },
2786                           { columns    => [ 'contactnum' ],
2787                             table      => 'contact',
2788                           },
2789                           { columns    => [ 'locationnum' ],
2790                             table      => 'cust_location',
2791                           },
2792                           { columns    => [ 'usernum' ],
2793                             table      => 'access_user',
2794                           },
2795                           { columns    => [ 'salesnum' ],
2796                             table      => 'sales',
2797                           },
2798                           { columns    => [ 'uncancel_pkgnum' ],
2799                             table      => 'cust_pkg',
2800                             references => [ 'pkgnum' ],
2801                           },
2802                           { columns    => [ 'change_pkgnum' ],
2803                             table      => 'cust_pkg',
2804                             references => [ 'pkgnum' ],
2805                           },
2806                           { columns    => [ 'change_pkgpart' ],
2807                             table      => 'part_pkg',
2808                             references => [ 'pkgpart' ],
2809                           },
2810                           { columns    => [ 'change_locationnum' ],
2811                             table      => 'cust_location',
2812                             references => [ 'locationnum' ],
2813                           },
2814                           { columns    => [ 'change_custnum' ],
2815                             table      => 'cust_main',
2816                             references => [ 'custnum' ],
2817                           },
2818                           { columns    => [ 'main_pkgnum' ],
2819                             table      => 'cust_pkg',
2820                             references => [ 'pkgnum' ],
2821                           },
2822                           { columns    => [ 'pkglinknum' ],
2823                             table      => 'part_pkg_link',
2824                           },
2825                           { columns    => [ 'change_to_pkgnum' ],
2826                             table      => 'cust_pkg',
2827                             references => [ 'pkgnum' ],
2828                           },
2829                         ],
2830    },
2831
2832     'cust_pkg_option' => {
2833       'columns' => [
2834         'optionnum', 'serial', '', '', '', '', 
2835         'pkgnum', 'int', '', '', '', '', 
2836         'optionname', 'varchar', '', $char_d, '', '', 
2837         'optionvalue', 'text', 'NULL', '', '', '', 
2838       ],
2839       'primary_key'  => 'optionnum',
2840       'unique'       => [],
2841       'index'        => [ [ 'pkgnum' ], [ 'optionname' ] ],
2842       'foreign_keys' => [
2843                           { columns    => [ 'pkgnum' ],
2844                             table      => 'cust_pkg',
2845                           },
2846                         ],
2847     },
2848
2849     'cust_pkg_detail' => {
2850       'columns' => [
2851         'pkgdetailnum', 'serial', '',        '', '', '',
2852         'pkgnum',          'int', '',        '', '', '',
2853         'detail',      'varchar', '', 2*$char_d, '', '', 
2854         'detailtype',     'char', '',         1, '', '', #"I"nvoice or "C"omment
2855         'weight',          'int', '',        '', '', '',
2856       ],
2857       'primary_key'  => 'pkgdetailnum',
2858       'unique'       => [],
2859       'index'        => [ [ 'pkgnum', 'detailtype' ] ],
2860       'foreign_keys' => [
2861                           { columns    => [ 'pkgnum' ],
2862                             table      => 'cust_pkg',
2863                           },
2864                         ],
2865     },
2866
2867     'cust_pkg_reason' => {
2868       'columns' => [
2869         'num',      'serial',    '',   '', '', '', 
2870         'pkgnum',   'int',    '',   '', '', '', 
2871         'reasonnum','int',    '',   '', '', '', 
2872         'action',   'char', 'NULL', 1, '', '',     #should not be nullable
2873         'otaker',   'varchar', 'NULL', 32, '', '', 
2874         'usernum',   'int', 'NULL', '', '', '',
2875         'date',     @date_type, '', '', 
2876       ],
2877       'primary_key'  => 'num',
2878       'unique'       => [],
2879       'index'        => [ ['pkgnum'], ['reasonnum'], ['action'], ['usernum'], ],
2880       'foreign_keys' => [
2881                           { columns    => [ 'pkgnum' ],
2882                             table      => 'cust_pkg',
2883                           },
2884                           { columns    => [ 'reasonnum' ],
2885                             table      => 'reason',
2886                           },
2887                           { columns    => [ 'usernum' ],
2888                             table      => 'access_user',
2889                           },
2890                         ],
2891     },
2892
2893     'cust_pkg_reason_fee' => {
2894       'columns' => [
2895         'pkgreasonfeenum', 'serial', '', '', '', '',
2896         'pkgreasonnum',       'int', '', '', '', '',
2897         'billpkgnum',         'int', 'NULL', '', '', '',
2898         'feepart',            'int', '', '', '', '',
2899         'nextbill',          'char', 'NULL',  1, '', '',
2900       ],
2901       'primary_key'  => 'pkgreasonfeenum',
2902       'unique' => [ [ 'billpkgnum' ], [ 'pkgreasonnum' ] ], # one-to-one link
2903       'index'  => [ [ 'feepart' ] ],
2904       'foreign_keys' => [
2905                           { columns     => [ 'pkgreasonnum' ],
2906                             table       => 'cust_pkg_reason',
2907                             references  => [ 'num' ],
2908                           },
2909                           { columns     => [ 'feepart' ],
2910                             table       => 'part_fee',
2911                           },
2912                           # can't link billpkgnum, because of voids
2913       ],
2914     },
2915
2916     'cust_pkg_discount' => {
2917       'columns' => [
2918         'pkgdiscountnum', 'serial', '',        '', '', '',
2919         'pkgnum',            'int', '',        '', '', '', 
2920         'discountnum',       'int', '',        '', '', '',
2921         'months_used',   'decimal', 'NULL', '7,4', '', '',
2922         'end_date',     @date_type,                '', '',
2923         'otaker',        'varchar', 'NULL',    32, '', '', 
2924         'usernum',           'int', 'NULL',    '', '', '',
2925         'disabled',         'char', 'NULL',     1, '', '', 
2926         'setuprecur',       'char', 'NULL',     5, '', '',
2927       ],
2928       'primary_key'  => 'pkgdiscountnum',
2929       'unique'       => [],
2930       'index'        => [ [ 'pkgnum' ], [ 'discountnum' ], [ 'usernum' ], ],
2931       'foreign_keys' => [
2932                           { columns    => [ 'pkgnum' ],
2933                             table      => 'cust_pkg',
2934                           },
2935                           { columns    => [ 'discountnum' ],
2936                             table      => 'discount',
2937                           },
2938                           { columns    => [ 'usernum' ],
2939                             table      => 'access_user',
2940                           },
2941                         ],
2942     },
2943
2944     'cust_pkg_usage' => {
2945       'columns' => [
2946         'pkgusagenum', 'serial', '', '', '', '',
2947         'pkgnum',         'int', '', '', '', '',
2948         'minutes',        'double precision', '', '', '', '',
2949         'pkgusagepart',   'int', '', '', '', '',
2950       ],
2951       'primary_key'  => 'pkgusagenum',
2952       'unique'       => [],
2953       'index'        => [ [ 'pkgnum' ], [ 'pkgusagepart' ] ],
2954       'foreign_keys' => [
2955                           { columns    => [ 'pkgnum' ],
2956                             table      => 'cust_pkg',
2957                           },
2958                           { columns    => [ 'pkgusagepart' ],
2959                             table      => 'part_pkg_usage',
2960                           },
2961                         ],
2962     },
2963
2964     'cdr_cust_pkg_usage' => {
2965       'columns' => [
2966         'cdrusagenum', 'bigserial', '', '', '', '',
2967         'acctid',      'bigint',    '', '', '', '',
2968         'pkgusagenum', 'int',       '', '', '', '',
2969         'minutes',     'double precision',       '', '', '', '',
2970       ],
2971       'primary_key'  => 'cdrusagenum',
2972       'unique'       => [],
2973       'index'        => [ [ 'pkgusagenum' ], [ 'acctid' ] ],
2974       'foreign_keys' => [
2975                           { columns    => [ 'acctid' ],
2976                             table      => 'cdr',
2977                           },
2978                           { columns    => [ 'pkgusagenum' ],
2979                             table      => 'cust_pkg_usage',
2980                           },
2981                         ],
2982     },
2983
2984     'cust_bill_pkg_discount' => {
2985       'columns' => [
2986         'billpkgdiscountnum', 'serial',        '', '', '', '',
2987         'billpkgnum',            'int',        '', '', '', '', 
2988         'pkgdiscountnum',        'int',        '', '', '', '', 
2989         'amount',          @money_type,                '', '', 
2990         'months',            'decimal', 'NULL', '7,4', '', '',
2991       ],
2992       'primary_key'  => 'billpkgdiscountnum',
2993       'unique'       => [],
2994       'index'        => [ [ 'billpkgnum' ], [ 'pkgdiscountnum' ] ],
2995       'foreign_keys' => [
2996                           { columns    => [ 'billpkgnum' ],
2997                             table      => 'cust_bill_pkg',
2998                           },
2999                           { columns    => [ 'pkgdiscountnum' ],
3000                             table      => 'cust_pkg_discount',
3001                           },
3002                         ],
3003     },
3004
3005     'cust_bill_pkg_discount_void' => {
3006       'columns' => [
3007         'billpkgdiscountnum',    'int',        '', '', '', '',
3008         'billpkgnum',            'int',        '', '', '', '', 
3009         'pkgdiscountnum',        'int',        '', '', '', '', 
3010         'amount',          @money_type,                '', '', 
3011         'months',            'decimal', 'NULL', '7,4', '', '',
3012       ],
3013       'primary_key'  => 'billpkgdiscountnum',
3014       'unique'       => [],
3015       'index'        => [ [ 'billpkgnum' ], [ 'pkgdiscountnum' ] ],
3016       'foreign_keys' => [
3017                           { columns    => [ 'billpkgnum' ],
3018                             table      => 'cust_bill_pkg_void',
3019                           },
3020                           { columns    => [ 'pkgdiscountnum' ],
3021                             table      => 'cust_pkg_discount',
3022                           },
3023                         ],
3024     },
3025
3026     'discount' => {
3027       'columns' => [
3028         'discountnum', 'serial',     '',      '', '', '',
3029         #'agentnum',       'int', 'NULL',      '', '', '', 
3030         'classnum',       'int', 'NULL',      '', '', '',
3031         'name',       'varchar', 'NULL', $char_d, '', '',
3032         'amount',   @money_type,                  '', '', 
3033         'percent',    'decimal',     '',   '7,4', '', '',
3034         'months',     'decimal', 'NULL',   '7,4', '', '',
3035         'disabled',      'char', 'NULL',       1, '', '', 
3036         'setup',         'char', 'NULL',       1, '', '', 
3037         #'linked',        'char', 'NULL',       1, '', '',
3038       ],
3039       'primary_key'  => 'discountnum',
3040       'unique'       => [],
3041       'index'        => [], # [ 'agentnum' ], ],
3042       'foreign_keys' => [
3043                           { columns    => [ 'classnum' ],
3044                             table      => 'discount_class',
3045                           },
3046                         ],
3047     },
3048
3049     'discount_class' => {
3050       'columns' => [
3051         'classnum',    'serial',   '',      '', '', '', 
3052         'classname',   'varchar',  '', $char_d, '', '', 
3053         #'categorynum', 'int',  'NULL',      '', '', '', 
3054         'disabled',    'char', 'NULL',       1, '', '', 
3055       ],
3056       'primary_key' => 'classnum',
3057       'unique' => [],
3058       'index' => [ ['disabled'] ],
3059     },
3060
3061     'cust_refund' => {
3062       'columns' => [
3063         'refundnum',    'serial',    '',   '', '', '', 
3064         'custnum',  'int',    '',   '', '', '', 
3065         '_date',        @date_type, '', '', 
3066         'refund',       @money_type, '', '', 
3067         'currency',       'char', 'NULL',       3, '', '',
3068         'otaker',       'varchar',   'NULL',   32, '', '', 
3069         'usernum',   'int', 'NULL', '', '', '',
3070         'reason',       'varchar',   'NULL',   $char_d, '', '', 
3071         'reasonnum',   'int', 'NULL', '', '', '',
3072         'payby',        'char',   '',     4, '', '', # CARD/BILL/COMP, should
3073                                                      # be index into payby
3074                                                      # table eventually
3075         'payinfo',      'varchar',   'NULL', 512, '', '', #see cust_main above
3076         'paymask', 'varchar', 'NULL', $char_d, '', '', 
3077         'paybatch',     'varchar',   'NULL', $char_d, '', '', 
3078         'closed',    'char', 'NULL', 1, '', '', 
3079         # credit card/EFT fields (formerly in paybatch)
3080         'gatewaynum',     'int', 'NULL', '', '', '', # payment_gateway FK
3081         'processor',  'varchar', 'NULL', $char_d, '', '', # module name
3082         'auth',       'varchar','NULL',16, '', '', # CC auth number
3083         'order_number', 'varchar','NULL',$char_d, '', '', # transaction number
3084       ],
3085       'primary_key'  => 'refundnum',
3086       'unique'       => [],
3087       'index'        => [ ['custnum'], ['_date'], [ 'usernum' ], ],
3088       'foreign_keys' => [
3089                           { columns    => [ 'custnum' ],
3090                             table      => 'cust_main',
3091                           },
3092                           { columns    => [ 'usernum' ],
3093                             table      => 'access_user',
3094                           },
3095                           { columns    => [ 'reasonnum' ],
3096                             table      => 'reason',
3097                           },
3098                           { columns    => [ 'gatewaynum' ],
3099                             table      => 'payment_gateway',
3100                           },
3101                         ],
3102     },
3103
3104     'cust_credit_refund' => {
3105       'columns' => [
3106         'creditrefundnum', 'serial',     '',   '', '', '', 
3107         'crednum',  'int',     '',   '', '', '', 
3108         'refundnum',  'int',     '',   '', '', '', 
3109         'amount',  @money_type, '', '', 
3110         '_date',   @date_type, '', '', 
3111       ],
3112       'primary_key'  => 'creditrefundnum',
3113       'unique'       => [],
3114       'index'        => [ ['crednum'], ['refundnum'] ],
3115       'foreign_keys' => [
3116                           { columns    => [ 'crednum' ],
3117                             table      => 'cust_credit',
3118                           },
3119                           { columns    => [ 'refundnum' ],
3120                             table      => 'cust_refund',
3121                           },
3122                         ],
3123     },
3124
3125
3126     'cust_svc' => {
3127       'columns' => [
3128         'svcnum',      'serial',     '', '', '', '', 
3129         'pkgnum',         'int', 'NULL', '', '', '', 
3130         'svcpart',        'int',     '', '', '', '', 
3131         'agent_svcid',    'int', 'NULL', '', '', '',
3132         'overlimit',           @date_type,   '', '', 
3133       ],
3134       'primary_key'  => 'svcnum',
3135       'unique'       => [],
3136       'index'        => [ ['svcnum'], ['pkgnum'], ['svcpart'],
3137                           ['agent_svcid'],
3138                         ],
3139       'foreign_keys' => [
3140                           { columns    => [ 'pkgnum' ],
3141                             table      => 'cust_pkg',
3142                           },
3143                           { columns    => [ 'svcpart' ],
3144                             table      => 'part_svc',
3145                           },
3146                         ],
3147     },
3148
3149     'cust_svc_option' => {
3150       'columns' => [
3151         'optionnum',   'serial', '', '', '', '', 
3152         'svcnum',      'int', '', '', '', '', 
3153         'optionname',  'varchar', '', $char_d, '', '', 
3154         'optionvalue', 'text', 'NULL', '', '', '', 
3155       ],
3156       'primary_key'  => 'optionnum',
3157       'unique'       => [],
3158       'index'        => [ [ 'svcnum' ], [ 'optionname' ] ],
3159       'foreign_keys' => [
3160                           { columns    => [ 'svcnum' ],
3161                             table      => 'cust_svc',
3162                           },
3163                         ],
3164     },
3165
3166     'svc_export_machine' => {
3167       'columns' => [
3168         'svcexportmachinenum', 'serial', '', '', '', '',
3169         'svcnum',                 'int', '', '', '', '', 
3170         'exportnum',              'int', '', '', '', '', 
3171         'machinenum',             'int', '', '', '', '',
3172       ],
3173       'primary_key'  => 'svcexportmachinenum',
3174       'unique'       => [ ['svcnum', 'exportnum'] ],
3175       'index'        => [],
3176       'foreign_keys' => [
3177                           { columns    => [ 'svcnum' ],
3178                             table      => 'cust_svc',
3179                           },
3180                           { columns    => [ 'exportnum' ],
3181                             table      => 'part_export',
3182                           },
3183                           { columns    => [ 'machinenum' ],
3184                             table      => 'part_export_machine',
3185                           },
3186                         ],
3187     },
3188
3189     'part_export_machine' => {
3190       'columns' => [
3191         'machinenum', 'serial', '', '', '', '',
3192         'exportnum',     'int', '', '', '', '',
3193         'machine',    'varchar', 'NULL', $char_d, '', '', 
3194         'disabled',      'char', 'NULL',       1, '', '',
3195       ],
3196       'primary_key'  => 'machinenum',
3197       'unique'       => [ [ 'exportnum', 'machine' ] ],
3198       'index'        => [ [ 'exportnum' ] ],
3199       'foreign_keys' => [
3200                           { columns    => [ 'exportnum' ],
3201                             table      => 'part_export',
3202                           },
3203                         ],
3204     },
3205
3206     'part_pkg' => {
3207       'columns' => [
3208         'pkgpart',       'serial',    '',   '', '', '', 
3209         'pkgpartbatch',  'varchar', 'NULL', $char_d, '', '',
3210         'pkg',           'varchar',   '',   $char_d, '', '', 
3211         'comment',       'varchar', 'NULL', 2*$char_d, '', '', 
3212         'promo_code',    'varchar', 'NULL', $char_d, '', '', 
3213         'freq',          'varchar',   '',   $char_d, '', '', #billing frequency
3214         'setuptax',      'char', 'NULL', 1, '', '', 
3215         'recurtax',      'char', 'NULL', 1, '', '', 
3216         'plan',          'varchar', 'NULL', $char_d, '', '', 
3217         'disabled',      'char', 'NULL', 1, '', '', 
3218         'custom',        'char', 'NULL', 1, '', '', 
3219         'taxclass',      'varchar', 'NULL', $char_d, '', '', 
3220         'classnum',      'int',     'NULL', '', '', '', 
3221         'addon_classnum','int',     'NULL', '', '', '', 
3222         'taxproductnum', 'int',     'NULL', '', '', '', 
3223         'setup_cost',    @money_typen,          '', '',
3224         'recur_cost',    @money_typen,          '', '',
3225         'pay_weight',    'real',    'NULL', '', '', '',
3226         'credit_weight', 'real',    'NULL', '', '', '',
3227         'agentnum',      'int',     'NULL', '', '', '', 
3228         'fcc_ds0s',      'int',     'NULL', '', '', '', 
3229         'fcc_voip_class','char',    'NULL',  1, '', '',
3230         'no_auto',          'char', 'NULL',  1, '', '', 
3231         'recur_show_zero',  'char', 'NULL',  1, '', '',
3232         'setup_show_zero',  'char', 'NULL',  1, '', '',
3233         'successor',     'int',     'NULL', '', '', '',
3234         'family_pkgpart','int',     'NULL', '', '', '',
3235         'delay_start',   'int',     'NULL', '', '', '',
3236         'start_on_hold', 'char',    'NULL',  1, '', '',
3237         'agent_pkgpartid', 'varchar', 'NULL', 20, '', '',
3238         'expire_months', 'int',     'NULL', '', '', '',
3239         'adjourn_months', 'int',    'NULL', '', '', '',
3240         'contract_end_months','int','NULL', '', '', '',
3241         'change_to_pkgpart', 'int', 'NULL', '', '', '',
3242       ],
3243       'primary_key'  => 'pkgpart',
3244       'unique'       => [],
3245       'index'        => [ [ 'promo_code' ], [ 'disabled' ], [ 'classnum' ],
3246                           [ 'agentnum' ], ['no_auto'], ['agent_pkgpartid'],
3247                         ],
3248       'foreign_keys' => [
3249                           { columns    => [ 'classnum' ],
3250                             table      => 'pkg_class',
3251                           },
3252                           { columns    => [ 'addon_classnum' ],
3253                             table      => 'pkg_class',
3254                             references => [ 'classnum' ],
3255                           },
3256                           { columns    => [ 'taxproductnum' ],
3257                             table      => 'part_pkg_taxproduct',
3258                           },
3259                           { columns    => [ 'agentnum' ],
3260                             table      => 'agent',
3261                           },
3262                           { columns    => [ 'successor' ],
3263                             table      => 'part_pkg',
3264                             references => [ 'pkgpart' ],
3265                           },
3266                           { columns    => [ 'family_pkgpart' ],
3267                             table      => 'part_pkg',
3268                             references => [ 'pkgpart' ],
3269                           },
3270                           { columns    => [ 'change_to_pkgpart' ],
3271                             table      => 'part_pkg',
3272                             references => [ 'pkgpart' ],
3273                           },
3274                         ],
3275     },
3276
3277     'part_pkg_msgcat' => {
3278       'columns' => [
3279         'pkgpartmsgnum',  'serial',     '',        '', '', '',
3280         'pkgpart',           'int',     '',        '', '', '',
3281         'locale',        'varchar',     '',        16, '', '',
3282         'pkg',           'varchar',     '',   $char_d, '', '', #longer/no limit?
3283         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
3284       ],
3285       'primary_key'  => 'pkgpartmsgnum',
3286       'unique'       => [ [ 'pkgpart', 'locale' ] ],
3287       'index'        => [],
3288       'foreign_keys' => [
3289                           { columns    => [ 'pkgpart' ],
3290                             table      => 'part_pkg',
3291                           },
3292                         ],
3293     },
3294
3295     'part_pkg_currency' => {
3296       'columns' => [
3297         'pkgcurrencynum', 'serial', '',      '', '', '',
3298         'pkgpart',           'int', '',      '', '', '',
3299         'currency',         'char', '',       3, '', '',
3300         'optionname',    'varchar', '', $char_d, '', '', 
3301         'optionvalue',      'text', '',      '', '', '', 
3302       ],
3303       'primary_key'  => 'pkgcurrencynum',
3304       'unique'       => [ [ 'pkgpart', 'currency', 'optionname' ] ],
3305       'index'        => [ ['pkgpart'] ],
3306       'foreign_keys' => [
3307                           { columns    => [ 'pkgpart' ],
3308                             table      => 'part_pkg',
3309                           },
3310                         ],
3311     },
3312
3313     'currency_exchange' => {
3314       'columns' => [
3315         'currencyratenum', 'serial', '',    '', '', '',
3316         'from_currency',     'char', '',     3, '', '',
3317         'to_currency',       'char', '',     3, '', '',
3318         'rate',           'decimal', '', '7,6', '', '',
3319       ],
3320       'primary_key' => 'currencyratenum',
3321       'unique'      => [ [ 'from_currency', 'to_currency' ] ],
3322       'index'       => [],
3323     },
3324
3325     'part_pkg_usageprice' => {
3326       'columns' => [
3327         'usagepricepart', 'serial',      '',      '', '', '',
3328         'pkgpart',           'int',      '',      '', '', '',
3329         'price',          @money_type,                '', '', 
3330         'currency',         'char',  'NULL',       3, '', '',
3331         'action',        'varchar',      '', $char_d, '', '',
3332         'target',        'varchar',      '', $char_d, '', '',
3333         'amount',        'varchar',      '', $char_d, '', '',
3334       ],
3335       'primary_key'  => 'usagepricepart',
3336       'unique'       => [ [ 'pkgpart', 'currency', 'target' ] ],
3337       'index'        => [ [ 'pkgpart' ] ],
3338       'foreign_keys' => [
3339                           { columns    => [ 'pkgpart' ],
3340                             table      => 'part_pkg',
3341                           },
3342                         ],
3343     },
3344
3345     'cust_pkg_usageprice' => {
3346       'columns' => [
3347         'usagepricenum', 'serial',      '',      '', '', '',
3348         'pkgnum',           'int',      '',      '', '', '',
3349         'usagepricepart',   'int',      '',      '', '', '',
3350         'quantity',         'int',      '',      '', '', '',
3351       ],
3352       'primary_key'  => 'usagepricenum',
3353       'unique'       => [ [ 'pkgnum', 'usagepricepart' ] ],
3354       'index'        => [ [ 'pkgnum' ] ],
3355       'foreign_keys' => [
3356                           { columns    => [ 'pkgnum' ],
3357                             table      => 'cust_pkg',
3358                           },
3359                           { columns    => [ 'usagepricepart' ],
3360                             table      => 'part_pkg_usageprice',
3361                           },
3362                         ],
3363     },
3364
3365     'part_fee' => {
3366       'columns' => [
3367         'feepart',       'serial',    '',   '', '', '',
3368         'itemdesc',      'varchar',   '',   $char_d,   '', '',
3369         'comment',       'varchar', 'NULL', 2*$char_d, '', '',
3370         'disabled',      'char',    'NULL',  1, '', '',
3371         'classnum',      'int',     'NULL', '', '', '',
3372         'taxclass',      'varchar', 'NULL', $char_d, '', '',
3373         'taxproductnum', 'int',     'NULL', '', '', '',
3374         'pay_weight',    'real',    'NULL', '', '', '',
3375         'credit_weight', 'real',    'NULL', '', '', '',
3376         'agentnum',      'int',     'NULL', '', '', '',
3377         'amount',   @money_type,                '', '', 
3378         'percent',     'decimal',    '', '7,4', '', '',
3379         'basis',         'varchar',  '',    16, '', '',
3380         'minimum',    @money_typen,             '', '',
3381         'maximum',    @money_typen,             '', '',
3382         'limit_credit',  'char',    'NULL',  1, '', '',
3383         'setuprecur',    'char',     '',     5, '', '',
3384         'taxable',       'char',    'NULL',  1, '', '',
3385       ],
3386       'primary_key'  => 'feepart',
3387       'unique'       => [],
3388       'index'        => [ [ 'disabled' ], [ 'classnum' ], [ 'agentnum' ]
3389                         ],
3390       'foreign_keys' => [
3391                           { columns    => [ 'classnum' ],
3392                             table      => 'pkg_class',
3393                           },
3394                           { columns    => [ 'taxproductnum' ],
3395                             table      => 'part_pkg_taxproduct',
3396                           },
3397                           { columns    => [ 'agentnum' ],
3398                             table      => 'agent',
3399                           },
3400                         ],
3401     },
3402
3403     'part_fee_msgcat' => {
3404       'columns' => [
3405         'feepartmsgnum',  'serial',     '',        '', '', '',
3406         'feepart',           'int',     '',        '', '', '',
3407         'locale',        'varchar',     '',        16, '', '',
3408         'itemdesc',      'varchar',     '',   $char_d, '', '', #longer/no limit?
3409         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
3410       ],
3411       'primary_key'  => 'feepartmsgnum',
3412       'unique'       => [ [ 'feepart', 'locale' ] ],
3413       'index'        => [],
3414       'foreign_keys' => [
3415                           { columns    => [ 'feepart' ],
3416                             table      => 'part_fee',
3417                           },
3418                         ],
3419     },
3420
3421     'part_fee_usage' => {
3422       'columns' => [
3423         'feepartusagenum','serial',     '',        '', '', '',
3424         'feepart',           'int',     '',        '', '', '',
3425         'classnum',          'int',     '',        '', '', '',
3426         'amount',   @money_type,                '', '',
3427         'percent',     'decimal',    '', '7,4', '', '',
3428       ],
3429       'primary_key'  => 'feepartusagenum',
3430       'unique'       => [ [ 'feepart', 'classnum' ] ],
3431       'index'        => [],
3432       'foreign_keys' => [
3433                           { columns    => [ 'feepart' ],
3434                             table      => 'part_fee',
3435                           },
3436                           { columns    => [ 'classnum' ],
3437                             table      => 'usage_class',
3438                           },
3439                         ],
3440     },
3441
3442     'part_pkg_link' => {
3443       'columns' => [
3444         'pkglinknum',  'serial',   '',      '', '', '',
3445         'src_pkgpart', 'int',      '',      '', '', '',
3446         'dst_pkgpart', 'int',      '',      '', '', '', 
3447         'link_type',   'varchar',  '', $char_d, '', '',
3448         'hidden',      'char', 'NULL',       1, '', '',
3449       ],
3450       'primary_key'  => 'pkglinknum',
3451       'unique'       => [ ['src_pkgpart','dst_pkgpart','link_type','hidden'] ],
3452       'index'        => [ [ 'src_pkgpart' ] ],
3453       'foreign_keys' => [
3454                           { columns    => [ 'src_pkgpart' ],
3455                             table      => 'part_pkg',
3456                             references => [ 'pkgpart' ]
3457                           },
3458                           { columns    => [ 'dst_pkgpart' ],
3459                             table      => 'part_pkg',
3460                             references => [ 'pkgpart' ]
3461                           },
3462                         ],
3463     },
3464     # XXX somewhat borked unique: we don't really want a hidden and unhidden
3465     # it turns out we'd prefer to use svc, bill, and invisibill (or something)
3466
3467     'part_pkg_discount' => {
3468       'columns' => [
3469         'pkgdiscountnum', 'serial',   '',      '', '', '',
3470         'pkgpart',        'int',      '',      '', '', '',
3471         'discountnum',    'int',      '',      '', '', '', 
3472       ],
3473       'primary_key'  => 'pkgdiscountnum',
3474       'unique'       => [ [ 'pkgpart', 'discountnum' ] ],
3475       'index'        => [],
3476       'foreign_keys' => [
3477                           { columns    => [ 'pkgpart' ],
3478                             table      => 'part_pkg',
3479                           },
3480                           { columns    => [ 'discountnum' ],
3481                             table      => 'discount',
3482                           },
3483                         ],
3484     },
3485
3486     'part_pkg_taxclass' => {
3487       'columns' => [
3488         'taxclassnum',  'serial', '',       '', '', '',
3489         'taxclass',     'varchar', '', $char_d, '', '', 
3490         'disabled', 'char',   'NULL',         1, '', '', 
3491       ],
3492       'primary_key' => 'taxclassnum',
3493       'unique'      => [ [ 'taxclass' ] ],
3494       'index'       => [ [ 'disabled' ] ],
3495     },
3496
3497     'part_pkg_taxproduct' => {
3498       'columns' => [
3499         'taxproductnum', 'serial',      '',        '', '', '',
3500         'data_vendor',   'varchar', 'NULL',   $char_d, '', '', 
3501         'taxproduct',    'varchar',     '',   $char_d, '', '', 
3502         'description',   'varchar',     '', 3*$char_d, '', '', 
3503         'note',             'text', 'NULL',        '', '', '',
3504       ],
3505       'primary_key' => 'taxproductnum',
3506       'unique'      => [ [ 'data_vendor', 'taxproduct' ] ],
3507       'index'       => [],
3508     },
3509
3510     'part_pkg_taxrate' => { 
3511       'columns' => [
3512         'pkgtaxratenum', 'serial',  '',     '',      '', '',
3513         'data_vendor',   'varchar', 'NULL', $char_d, '', '', # update source
3514         'geocode',       'varchar', 'NULL', $char_d, '', '', # cch provides 10
3515         'taxproductnum', 'int',  '',     '',       '', '',          
3516         'city',             'varchar', 'NULL', $char_d, '', '', # tax_location?
3517         'county',           'varchar', 'NULL', $char_d, '', '', 
3518         'state',            'varchar', 'NULL', $char_d, '', '', 
3519         'local',            'varchar', 'NULL', $char_d, '', '', 
3520         'country',          'char',    'NULL', 2,       '', '',
3521         'taxclassnumtaxed', 'int',     'NULL', '',      '', '', 
3522         'taxcattaxed',      'varchar', 'NULL', $char_d, '', '', 
3523         'taxclassnum',      'int',     'NULL', '',      '', '', 
3524         'effdate',          @date_type, '', '', 
3525         'taxable',          'char',    'NULL', 1,       '', '', 
3526       ],
3527       'primary_key'  => 'pkgtaxratenum',
3528       'unique'       => [],
3529       'index'        => [ [ 'data_vendor', 'geocode', 'taxproductnum' ] ],
3530       'foreign_keys' => [
3531                           { columns    => [ 'taxproductnum' ],
3532                             table      => 'part_pkg_taxproduct',
3533                           },
3534                           { columns    => [ 'taxclassnumtaxed' ],
3535                             table      => 'tax_class',
3536                             references => [ 'taxclassnum' ],
3537                           },
3538                           { columns    => [ 'taxclassnum' ],
3539                             table      => 'tax_class',
3540                           },
3541                         ],
3542     },
3543
3544     'part_pkg_taxoverride' => { 
3545       'columns' => [
3546         'taxoverridenum', 'serial', '', '', '', '',
3547         'pkgpart',           'int', '', '', '', '',
3548         'taxclassnum',       'int', '', '', '', '',
3549         'usage_class',    'varchar', 'NULL', $char_d, '', '', 
3550       ],
3551       'primary_key'  => 'taxoverridenum',
3552       'unique'       => [],
3553       'index'        => [ [ 'pkgpart' ], [ 'taxclassnum' ] ],
3554       'foreign_keys' => [
3555                           { columns    => [ 'pkgpart' ],
3556                             table      => 'part_pkg',
3557                           },
3558                           { columns    => [ 'taxclassnum' ],
3559                             table      => 'tax_class',
3560                           },
3561                         ],
3562     },
3563
3564 #    'part_title' => {
3565 #      'columns' => [
3566 #        'titlenum',   'int',    '',   '',
3567 #        'title',      'varchar',   '',   $char_d,
3568 #      ],
3569 #      'primary_key' => 'titlenum',
3570 #      'unique' => [ [] ],
3571 #      'index' => [ [] ],
3572 #    },
3573
3574     'pkg_svc' => {
3575       'columns' => [
3576         'pkgsvcnum',   'serial',    '', '', '', '', 
3577         'pkgpart',        'int',    '', '', '', '', 
3578         'svcpart',        'int',    '', '', '', '', 
3579         'quantity',       'int',    '', '', '', '', 
3580         'primary_svc',   'char', 'NULL', 1, '', '', 
3581         'hidden',        'char', 'NULL', 1, '', '',
3582         'bulk_skip',     'char', 'NULL', 1, '', '',
3583         'provision_hold', 'char', 'NULL', 1, '', '',
3584       ],
3585       'primary_key'  => 'pkgsvcnum',
3586       'unique'       => [ ['pkgpart', 'svcpart'] ],
3587       'index'        => [ ['pkgpart'], ['quantity'] ],
3588       'foreign_keys' => [
3589                           { columns    => [ 'pkgpart' ],
3590                             table      => 'part_pkg',
3591                           },
3592                           { columns    => [ 'svcpart' ],
3593                             table      => 'part_svc',
3594                           },
3595                         ],
3596     },
3597
3598     'part_referral' => {
3599       'columns' => [
3600         'refnum',   'serial',     '',        '', '', '', 
3601         'referral', 'varchar',    '',   $char_d, '', '', 
3602         'disabled', 'char',   'NULL',         1, '', '', 
3603         'agentnum', 'int',    'NULL',        '', '', '', 
3604       ],
3605       'primary_key'  => 'refnum',
3606       'unique'       => [],
3607       'index'        => [ ['disabled'], ['agentnum'], ],
3608       'foreign_keys' => [
3609                           { columns    => [ 'agentnum' ],
3610                             table      => 'agent',
3611                           },
3612                         ],
3613     },
3614
3615     'part_svc' => {
3616       'columns' => [
3617         'svcpart',             'serial',     '',        '', '', '', 
3618         'svc',                'varchar',     '',   $char_d, '', '', 
3619         'svcdb',              'varchar',     '',   $char_d, '', '', 
3620         'disabled',              'char', 'NULL',         1, '', '', 
3621         'preserve',              'char', 'NULL',         1, '', '',
3622         'selfservice_access', 'varchar', 'NULL',   $char_d, '', '',
3623         'classnum',               'int', 'NULL',        '', '', '',
3624         'restrict_edit_password','char', 'NULL',         1, '', '',
3625         'has_router',            'char', 'NULL',         1, '', '',
3626 ],
3627       'primary_key'  => 'svcpart',
3628       'unique'       => [],
3629       'index'        => [ [ 'disabled' ] ],
3630       'foreign_keys' => [
3631                           { columns    => [ 'classnum' ],
3632                             table      => 'part_svc_class',
3633                           },
3634                         ],
3635     },
3636
3637     'part_svc_column' => {
3638       'columns' => [
3639         'columnnum',   'serial',      '',      '', '', '', 
3640         'svcpart',     'int',         '',      '', '', '', 
3641         'columnname',  'varchar',     '',      64, '', '', 
3642         'columnlabel', 'varchar', 'NULL', $char_d, '', '',
3643         'columnvalue', 'varchar', 'NULL',     512, '', '', 
3644         'columnflag',  'char',    'NULL',       1, '', '', 
3645         'required',    'char',    'NULL',       1, '', '', 
3646       ],
3647       'primary_key'  => 'columnnum',
3648       'unique'       => [ [ 'svcpart', 'columnname' ] ],
3649       'index'        => [ [ 'svcpart' ] ],
3650       'foreign_keys' => [
3651                           { columns    => [ 'svcpart' ],
3652                             table      => 'part_svc',
3653                           },
3654                         ],
3655     },
3656
3657     'part_svc_class' => {
3658       'columns' => [
3659         'classnum',    'serial',   '',      '', '', '', 
3660         'classname',   'varchar',  '', $char_d, '', '', 
3661         'disabled',    'char', 'NULL',       1, '', '', 
3662       ],
3663       'primary_key' => 'classnum',
3664       'unique' => [],
3665       'index' => [ ['disabled'] ],
3666     },
3667
3668     'part_svc_link' => {
3669       'columns' => [
3670         'svclinknum',  'serial',   '',      '', '', '',
3671         #'linkname',    'varchar', 'NULL', $char_d, '', '',
3672         'agentnum',    'int',     'NULL', '', '', '', 
3673         'src_svcpart', 'int',      '',      '', '', '',
3674         'dst_svcpart', 'int',      '',      '', '', '', 
3675         'link_type',   'varchar',  '', $char_d, '', '',
3676         'disabled',    'char', 'NULL',   1, '', '', 
3677       ],
3678       'primary_key'  => 'svclinknum',
3679       'unique'       => [ ['agentnum','src_svcpart','dst_svcpart','link_type'] ],
3680       'index'        => [ [ 'src_svcpart' ], [ 'src_svcpart', 'link_type' ], [ 'disabled' ] ],
3681       'foreign_keys' => [
3682                           { columns    => [ 'src_svcpart' ],
3683                             table      => 'part_svc',
3684                             references => [ 'svcpart' ]
3685                           },
3686                           { columns    => [ 'dst_svcpart' ],
3687                             table      => 'part_svc',
3688                             references => [ 'svcpart' ]
3689                           },
3690                         ],
3691     },
3692
3693     #(this should be renamed to part_pop)
3694     'svc_acct_pop' => {
3695       'columns' => [
3696         'popnum',    'serial',    '',   '', '', '', 
3697         'city',      'varchar',   '',   $char_d, '', '', 
3698         'state',     'varchar',   '',   $char_d, '', '', 
3699         'ac',        'char',   '',   3, '', '', 
3700         'exch',      'char',   '',   3, '', '', 
3701         'loc',       'char',   'NULL',   4, '', '', #NULL for legacy purposes
3702       ],
3703       'primary_key' => 'popnum',
3704       'unique' => [],
3705       'index' => [ [ 'state' ] ],
3706     },
3707
3708     'part_pop_local' => {
3709       'columns' => [
3710         'localnum',  'serial',     '',     '', '', '', 
3711         'popnum',    'int',     '',     '', '', '', 
3712         'city',      'varchar', 'NULL', $char_d, '', '', 
3713         'state',     'char',    'NULL', 2, '', '', 
3714         'npa',       'char',    '',     3, '', '', 
3715         'nxx',       'char',    '',     3, '', '', 
3716       ],
3717       'primary_key'  => 'localnum',
3718       'unique'       => [],
3719       'index'        => [ [ 'npa', 'nxx' ], [ 'popnum' ] ],
3720       'foreign_keys' => [
3721                          { columns    => [ 'popnum' ],
3722                            table      => 'svc_acct_pop',
3723                          },
3724                        ],
3725     },
3726
3727     'qual' => {
3728       'columns' => [
3729         'qualnum',  'serial',     '',     '', '', '', 
3730         'custnum',    'int',     'NULL',     '', '', '',
3731         'prospectnum',    'int',     'NULL',     '', '', '',
3732         'locationnum',    'int',     'NULL',     '', '', '',
3733         'phonenum',     'varchar', 'NULL',       24, '', '',
3734         'exportnum',      'int', 'NULL', '', '', '', 
3735         'vendor_qual_id',      'varchar', 'NULL', $char_d, '', '', 
3736         'status',      'char', '', 1, '', '', 
3737       ],
3738       'primary_key'  => 'qualnum',
3739       'unique'       => [],
3740       'index'        => [ ['locationnum'], ['custnum'], ['prospectnum'],
3741                           ['phonenum'], ['vendor_qual_id'],
3742                         ],
3743       'foreign_keys' => [
3744                           { columns    => [ 'custnum' ],
3745                             table      => 'cust_main',
3746                           },
3747                           { columns    => [ 'prospectnum' ],
3748                             table      => 'prospect_main',
3749                           },
3750                           { columns    => [ 'locationnum' ],
3751                             table      => 'cust_location',
3752                           },
3753                           { columns    => [ 'exportnum' ],
3754                             table      => 'part_export',
3755                           },
3756                         ],
3757     },
3758
3759     'qual_option' => {
3760       'columns' => [
3761         'optionnum', 'serial', '', '', '', '', 
3762         'qualnum',  'int',     '',     '', '', '', 
3763         'optionname', 'varchar', '', $char_d, '', '', 
3764         'optionvalue', 'text', 'NULL', '', '', '', 
3765       ],
3766       'primary_key'  => 'optionnum',
3767       'unique'       => [],
3768       'index'        => [],
3769       'foreign_keys' => [
3770                           { columns    => [ 'qualnum' ],
3771                             table      => 'qual',
3772                           },
3773                         ],
3774     },
3775
3776     'svc_acct' => {
3777       'columns' => [
3778         'svcnum',    'int',    '',   '', '', '', 
3779         'username',  'varchar',   '',   $username_len, '', '',
3780         '_password', 'varchar',   'NULL',  512, '', '',
3781         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
3782         'sec_phrase', 'varchar',  'NULL',   $char_d, '', '', 
3783         'popnum',    'int',    'NULL',   '', '', '', 
3784         'sectornum', 'int', 'NULL',      '', '', '',
3785         'uid',       'int', 'NULL',   '', '', '', 
3786         'gid',       'int', 'NULL',   '', '', '', 
3787         'finger',    'varchar',   'NULL',   2*$char_d, '', '', 
3788         'dir',       'varchar',   'NULL',   $char_d, '', '', 
3789         'shell',     'varchar',   'NULL',   $char_d, '', '', 
3790         'quota',     'varchar',   'NULL',   $char_d, '', '', 
3791         'slipip',    'varchar',   'NULL',   15, '', '', #four TINYINTs, bah.
3792         # IP address mgmt
3793         'routernum', 'int', 'NULL',      '', '', '',
3794         'blocknum',  'int', 'NULL',      '', '', '', 
3795         'seconds',   'int', 'NULL',   '', '', '', #uhhhh
3796         'seconds_threshold',   'int', 'NULL',   '', '', '',
3797         'upbytes',   'bigint', 'NULL',   '', '', '', 
3798         'upbytes_threshold',   'bigint', 'NULL',   '', '', '',
3799         'downbytes', 'bigint', 'NULL',   '', '', '',
3800         'downbytes_threshold',   'bigint', 'NULL',   '', '', '',
3801         'totalbytes','bigint', 'NULL',   '', '', '',
3802         'totalbytes_threshold',   'bigint', 'NULL',   '', '', '',
3803         'domsvc',    'int',     '', '', '', '', 
3804         'pbxsvc',    'int', 'NULL', '', '', '',
3805         'last_login',  @date_type, '', '', 
3806         'last_logout', @date_type, '', '', 
3807         #cardfortress field(s)
3808         'cf_privatekey',      'text', 'NULL',      '', '', '',
3809         #communigate pro fields (quota = MaxAccountSize)
3810         'cgp_aliases',     'varchar', 'NULL',     255, '', '',
3811         #settings
3812         'cgp_type',        'varchar', 'NULL', $char_d, '', '', #AccountType
3813         'file_quota',      'varchar', 'NULL', $char_d, '', '', #MaxWebSize
3814         'file_maxnum',     'varchar', 'NULL', $char_d, '', '', #MaxWebFiles
3815         'file_maxsize',    'varchar', 'NULL', $char_d, '', '', #MaxFileSize
3816         'cgp_accessmodes', 'varchar', 'NULL',     255, '', '', #AccessModes
3817         'password_selfchange','char', 'NULL',       1, '', '', #PWDAllowed
3818         'password_recover',   'char', 'NULL',       1, 'Y','', #PasswordRecovery
3819         'cgp_rulesallowed','varchar', 'NULL', $char_d, '', '', #RulesAllowed
3820         'cgp_rpopallowed',    'char', 'NULL',       1, '', '', #RPOPAllowed
3821         'cgp_mailtoall',      'char', 'NULL',       1, '', '', #MailToAll
3822         'cgp_addmailtrailer', 'char', 'NULL',       1, '', '', #AddMailTrailer
3823         'cgp_archiveafter',    'int', 'NULL',      '', '', '', #ArchiveMessagesAfter
3824         #XXX mailing lists
3825         #preferences
3826         'cgp_deletemode',     'varchar', 'NULL', $char_d, '', '',#DeleteMode
3827         'cgp_emptytrash',     'varchar', 'NULL', $char_d, '', '',#EmptyTrash
3828         'cgp_language',       'varchar', 'NULL', $char_d, '', '',#Language
3829         'cgp_timezone',       'varchar', 'NULL', $char_d, '', '',#TimeZone
3830         'cgp_skinname',       'varchar', 'NULL', $char_d, '', '',#SkinName
3831         'cgp_prontoskinname', 'varchar', 'NULL', $char_d, '', '',#ProntoSkinName
3832         'cgp_sendmdnmode',    'varchar', 'NULL', $char_d, '', '',#SendMDNMode
3833         #mail
3834         #XXX RPOP settings
3835         #
3836       ],
3837       'primary_key'  => 'svcnum',
3838       #'unique'       => [ [ 'username', 'domsvc' ] ],
3839       'unique'       => [],
3840       'index'        => [ ['username'], ['domsvc'], ['pbxsvc'] ],
3841       'foreign_keys' => [
3842                           { columns    => [ 'svcnum' ],
3843                             table      => 'cust_svc',
3844                           },
3845                           { columns    => [ 'popnum' ],
3846                             table      => 'svc_acct_pop',
3847                           },
3848                           { columns    => [ 'sectornum' ],
3849                             table      => 'tower_sector',
3850                           },
3851                           { columns    => [ 'routernum' ],
3852                             table      => 'router',
3853                           },
3854                           { columns    => [ 'blocknum' ],
3855                             table      => 'addr_block',
3856                           },
3857                           { columns    => [ 'domsvc' ],
3858                             table      => 'svc_domain', #'cust_svc',
3859                             references => [ 'svcnum' ],
3860                           },
3861                           { columns    => [ 'pbxsvc' ],
3862                             table      => 'svc_pbx', #'cust_svc',
3863                             references => [ 'svcnum' ],
3864                           },
3865                         ],
3866     },
3867
3868     'acct_rt_transaction' => {
3869       'columns' => [
3870         'svcrtid',   'int',    '',   '', '', '', #why am i not a serial
3871         'svcnum',    'int',    '',   '', '', '', 
3872         'transaction_id',       'int', '',   '', '', '', 
3873         '_date',   @date_type, '', '',
3874         'seconds',   'int', '',   '', '', '', #uhhhh
3875         'support',   'int', '',   '', '', '',
3876       ],
3877       'primary_key'  => 'svcrtid',
3878       'unique'       => [],
3879       'index'        => [ ['svcnum', 'transaction_id'] ],
3880       'foreign_keys' => [
3881                           { columns    => [ 'svcnum' ],
3882                             table      => 'svc_acct', #'cust_svc',
3883                           },
3884                           # 1. RT tables aren't part of our data structure, so
3885                           #     we can't make sure Queue is created already
3886                           # 2. This is our internal hack for time tracking, not
3887                           #     a user-facing feature
3888                           #{ columns    => [ 'transaction_id' ],
3889                           #  table      => 'Transaction',
3890                           #  references => [ 'id' ],
3891                           #},
3892                         ],
3893     },
3894
3895     #'svc_charge' => {
3896     #  'columns' => [
3897     #    'svcnum',    'int',    '',   '',
3898     #    'amount',    @money_type,
3899     #  ],
3900     #  'primary_key' => 'svcnum',
3901     #  'unique' => [ [] ],
3902     #  'index' => [ [] ],
3903     #},
3904
3905     'svc_domain' => {
3906       'columns' => [
3907         'svcnum',           'int',    '',        '', '', '',
3908         'domain',       'varchar',    '',   $char_d, '', '',
3909         'suffix',       'varchar', 'NULL',  $char_d, '', '',
3910         'catchall',         'int', 'NULL',       '', '', '',
3911         'parent_svcnum',    'int', 'NULL',       '', '', '',
3912         'quota',        'varchar', 'NULL',  $char_d, '', '', 
3913
3914         #registration info
3915         'registrarnum',     'int', 'NULL',       '', '', '',
3916         'registrarkey', 'varchar', 'NULL',      512, '', '',
3917         'setup_date',      @date_type, '', '',
3918         'renewal_interval', 'int', 'NULL',       '', '', '',
3919         'expiration_date', @date_type, '', '',
3920
3921         #some weird shit australia-specific shit?  yuck.. seems totally unused
3922         'au_registrant_name',       'varchar', 'NULL',  $char_d, '', '',
3923         'au_eligibility_type',      'varchar', 'NULL',  $char_d, '', '',
3924
3925         #communigate pro fields (quota = MaxAccountSize)
3926         'max_accounts',     'int', 'NULL',       '', '', '',
3927         'trailer',         'text', 'NULL',       '', '', '',
3928         'cgp_aliases',  'varchar', 'NULL',      255, '', '',
3929         'cgp_accessmodes','varchar','NULL',     255, '', '', #DomainAccessModes
3930         'cgp_certificatetype','varchar','NULL', $char_d, '', '',
3931
3932         #(account default) settings
3933         'acct_def_password_selfchange',   'char', 'NULL',       1,  '', '', 
3934         'acct_def_password_recover',      'char', 'NULL',       1, 'Y', '', 
3935         'acct_def_cgp_accessmodes',    'varchar', 'NULL',     255,  '', '',
3936         'acct_def_quota',              'varchar', 'NULL', $char_d,  '', '',
3937         'acct_def_file_quota',         'varchar', 'NULL', $char_d,  '', '',
3938         'acct_def_file_maxnum',        'varchar', 'NULL', $char_d,  '', '',
3939         'acct_def_file_maxsize',       'varchar', 'NULL', $char_d,  '', '',
3940         'acct_def_cgp_rulesallowed',   'varchar', 'NULL', $char_d,  '', '',
3941         'acct_def_cgp_rpopallowed',       'char', 'NULL',       1,  '', '', 
3942         'acct_def_cgp_mailtoall',         'char', 'NULL',       1,  '', '', 
3943         'acct_def_cgp_addmailtrailer',    'char', 'NULL',       1,  '', '', 
3944         'acct_def_cgp_archiveafter',       'int', 'NULL',      '',  '', '',
3945
3946         #(account default) preferences
3947         'acct_def_cgp_deletemode',     'varchar', 'NULL', $char_d,  '', '',
3948         'acct_def_cgp_emptytrash',     'varchar', 'NULL', $char_d,  '', '',
3949         'acct_def_cgp_language',       'varchar', 'NULL', $char_d,  '', '',
3950         'acct_def_cgp_timezone',       'varchar', 'NULL', $char_d,  '', '',
3951         'acct_def_cgp_skinname',       'varchar', 'NULL', $char_d,  '', '',
3952         'acct_def_cgp_prontoskinname', 'varchar', 'NULL', $char_d,  '', '',
3953         'acct_def_cgp_sendmdnmode',    'varchar', 'NULL', $char_d,  '', '',
3954       ],
3955       'primary_key'  => 'svcnum',
3956       'unique'       => [],
3957       'index'        => [ ['domain'] ],
3958       'foreign_keys' => [
3959                           { columns    => [ 'svcnum' ],
3960                             table      => 'cust_svc',
3961                           },
3962                           { columns    => [ 'catchall' ],
3963                             table      => 'svc_acct',
3964                             references => [ 'svcnum' ],
3965                           },
3966                           { columns    => [ 'parent_svcnum' ],
3967                             table      => 'cust_svc',
3968                             references => [ 'svcnum' ],
3969                           },
3970                           { columns    => [ 'registrarnum' ],
3971                             table      => 'registrar',
3972                           },
3973                         ],
3974     },
3975
3976     'svc_dsl' => {
3977       'columns' => [
3978         'svcnum',                    'int',    '',        '', '', '',
3979         'pushed',                    'int', 'NULL',       '', '', '',
3980         'desired_due_date',          'int', 'NULL',       '', '', '',
3981         'due_date',                  'int', 'NULL',       '', '', '',
3982         'vendor_order_id',       'varchar', 'NULL', $char_d,  '', '',
3983         'vendor_qual_id',        'varchar', 'NULL', $char_d,  '', '',
3984         'vendor_order_type',     'varchar', 'NULL', $char_d,  '', '',
3985         'vendor_order_status',   'varchar', 'NULL', $char_d,  '', '',
3986         'first',                 'varchar', 'NULL', $char_d,  '', '',
3987         'last',                  'varchar', 'NULL', $char_d,  '', '',
3988         'company',               'varchar', 'NULL', $char_d,  '', '',
3989         'phonenum',              'varchar', 'NULL',      24, '', '',
3990         'gateway_access_number', 'varchar', 'NULL',      24, '', '',
3991         'loop_type',                'char', 'NULL',       1, '', '', 
3992         'local_voice_provider',  'varchar', 'NULL', $char_d, '', '',
3993         'circuitnum',            'varchar', 'NULL', $char_d, '', '',
3994         'rate_band',             'varchar', 'NULL', $char_d, '', '',
3995         'vpi',                       'int', 'NULL',      '', '', '',
3996         'vci',                       'int', 'NULL',      '', '', '',
3997         'isp_chg',                  'char', 'NULL',       1, '', '', 
3998         'isp_prev',              'varchar', 'NULL', $char_d, '', '',
3999         'username',              'varchar', 'NULL', $char_d, '', '',
4000         'password',              'varchar', 'NULL', $char_d, '', '',
4001         'staticips',                'text', 'NULL',      '', '', '',
4002         'monitored',                'char', 'NULL',       1, '', '', 
4003         'last_pull',                 'int', 'NULL',      '', '', '',
4004       ],
4005       'primary_key'  => 'svcnum',
4006       'unique'       => [ ],
4007       'index'        => [ ['phonenum'], ['vendor_order_id'] ],
4008       'foreign_keys' => [
4009                           { columns    => [ 'svcnum' ],
4010                             table      => 'cust_svc',
4011                           },
4012                         ],
4013     },
4014
4015     'dsl_device' => {
4016       'columns' => [
4017         'devicenum', 'serial',     '', '', '', '',
4018         #part_device?  or our own part_dsl_device?
4019         #'devicepart',   'int',     '', '', '', '',
4020         'svcnum',       'int',     '', '', '', '', 
4021         'mac_addr', 'varchar',     '', 12, '', '', 
4022       ],
4023       'primary_key'  => 'devicenum',
4024       'unique'       => [ [ 'mac_addr' ], ],
4025       'index'        => [ [ 'svcnum' ], ], # [ 'devicepart' ] ],
4026       'foreign_keys' => [
4027                           { columns    => [ 'svcnum' ],
4028                             table      => 'svc_dsl',
4029                           },
4030                         ],
4031     },
4032
4033     'dsl_note' => {
4034       'columns' => [
4035         'notenum',           'serial',    '',        '', '', '',
4036         'svcnum',     'int', '',       '', '', '',
4037         'author',     'varchar', 'NULL', $char_d,  '', '',
4038         'priority',   'char', 'NULL',       1,  '', '', 
4039         '_date',     'int', 'NULL',       '', '', '',
4040         'note',     'text', '',       '', '', '',
4041       ],
4042       'primary_key'  => 'notenum',
4043       'unique'       => [],
4044       'index'        => [ ['svcnum'] ],
4045       'foreign_keys' => [
4046                           { columns    => [ 'svcnum' ],
4047                             table      => 'svc_dsl',
4048                           },
4049                         ],
4050     },
4051
4052     'svc_dish' => {
4053       'columns' => [
4054         'svcnum',   'int',     '',     '', '', '',
4055         'acctnum',  'varchar', '',     16, '', '',
4056         'installdate', @date_type,         '', '', 
4057         'note',     'text',    'NULL', '', '', '',
4058       ],
4059       'primary_key'  => 'svcnum',
4060       'unique'       => [],
4061       'index'        => [],
4062       'foreign_keys' => [
4063                           { columns    => [ 'svcnum' ],
4064                             table      => 'cust_svc',
4065                           },
4066                         ],
4067     },
4068
4069     'svc_hardware' => {
4070       'columns' => [
4071         'svcnum',   'int',     '',          '', '', '',
4072         'typenum',  'int',     '',          '', '', '',
4073         'serial',   'varchar', 'NULL', $char_d, '', '',
4074         'ip_addr',  'varchar', 'NULL',      40, '', '',
4075         'hw_addr',  'varchar', 'NULL',      12, '', '',
4076         'smartcard','varchar', 'NULL',      30, '', '',
4077         'statusnum','int',     'NULL',      '', '', '',
4078         'note',     'text',    'NULL',      '', '', '',
4079       ],
4080       'primary_key'  => 'svcnum',
4081       'unique'       => [],
4082       'index'        => [],
4083       'foreign_keys' => [
4084                           { columns    => [ 'svcnum' ],
4085                             table      => 'cust_svc',
4086                           },
4087                           { columns    => [ 'typenum' ],
4088                             table      => 'hardware_type',
4089                           },
4090                           { columns    => [ 'statusnum' ],
4091                             table      => 'hardware_status',
4092                           },
4093                         ],
4094     },
4095
4096     'hardware_class' => {
4097       'columns' => [
4098         'classnum',   'serial', '',      '', '', '',
4099         'classname', 'varchar', '', $char_d, '', '',
4100       ],
4101       'primary_key' => 'classnum',
4102       'unique' => [],
4103       'index'  => [],
4104     },
4105
4106     'hardware_type' => {
4107       'columns' => [
4108         'typenum',  'serial',     '',      '', '', '',
4109         'classnum',    'int',     '',      '', '', '',
4110         'model',   'varchar',     '', $char_d, '', '',
4111         'revision','varchar', 'NULL', $char_d, '', '',
4112       ],
4113       'primary_key'  => 'typenum',
4114       'unique'       => [ [ 'classnum', 'model', 'revision' ] ],
4115       'index'        => [],
4116       'foreign_keys' => [
4117                           { columns    => [ 'classnum' ],
4118                             table      => 'hardware_class',
4119                           },
4120                         ],
4121     },
4122
4123     'hardware_status' => {
4124       'columns' => [
4125         'statusnum', 'serial', '',      '', '', '',
4126         'label'    ,'varchar', '', $char_d, '', '',
4127         'disabled',    'char', 'NULL',   1, '', '', 
4128       ],
4129       'primary_key' => 'statusnum',
4130       'unique' => [],
4131       'index'  => [],
4132     },
4133
4134     'domain_record' => {
4135       'columns' => [
4136         'recnum',    'serial',     '',  '', '', '', 
4137         'svcnum',    'int',     '',  '', '', '', 
4138         'reczone',   'varchar', '',  255, '', '', 
4139         'recaf',     'char',    '',  2, '', '', 
4140         'rectype',   'varchar',    '',  5, '', '', 
4141         'recdata',   'varchar', '',  255, '', '', 
4142         'ttl',       'int',     'NULL', '', '', '',
4143       ],
4144       'primary_key'  => 'recnum',
4145       'unique'       => [],
4146       'index'        => [ ['svcnum'] ],
4147       'foreign_keys' => [
4148                           { columns    => [ 'svcnum' ],
4149                             table      => 'svc_domain',
4150                           },
4151                         ],
4152     },
4153
4154     'registrar' => {
4155       'columns' => [
4156         'registrarnum',   'serial', '',      '', '', '',
4157         'registrarname', 'varchar', '', $char_d, '', '',
4158       ],
4159       'primary_key' => 'registrarnum',
4160       'unique'      => [],
4161       'index'       => [],
4162     },
4163
4164     'cgp_rule' => {
4165       'columns' => [
4166         'rulenum',  'serial',     '',      '', '', '',
4167         'name',    'varchar',     '', $char_d, '', '',
4168         'comment', 'varchar', 'NULL', $char_d, '', '',
4169         'svcnum',      'int',     '',      '', '', '',
4170         'priority',    'int',     '',      '', '', '',
4171       ],
4172       'primary_key' => 'rulenum',
4173       'unique'      => [ [ 'svcnum', 'name' ] ],
4174       'index'       => [ [ 'svcnum' ] ],
4175       'foreign_keys' => [
4176                           { columns    => [ 'svcnum' ],
4177                             table      => 'cust_svc', #svc_acct / svc_domain
4178                           },
4179                         ],
4180     },
4181
4182     'cgp_rule_condition' => {
4183       'columns' => [
4184         'ruleconditionnum',  'serial',     '',      '', '', '',
4185         'conditionname',    'varchar',     '', $char_d, '', '',
4186         'op',               'varchar', 'NULL', $char_d, '', '',
4187         'params',           'varchar', 'NULL',     255, '', '',
4188         'rulenum',              'int',     '',      '', '', '',
4189       ],
4190       'primary_key'  => 'ruleconditionnum',
4191       'unique'       => [],
4192       'index'        => [ [ 'rulenum' ] ],
4193       'foreign_keys' => [
4194                           { columns    => [ 'rulenum' ],
4195                             table      => 'cgp_rule',
4196                           },
4197                         ],
4198     },
4199
4200     'cgp_rule_action' => {
4201        'columns' => [
4202         'ruleactionnum',  'serial',     '',      '', '', '',
4203         'action',        'varchar',     '', $char_d, '', '',
4204         'params',        'varchar', 'NULL',     255, '', '',
4205         'rulenum',           'int',     '',      '', '', '',
4206       ],
4207       'primary_key'  => 'ruleactionnum',
4208       'unique'       => [],
4209       'index'        => [ [ 'rulenum' ] ],
4210       'foreign_keys' => [
4211                           { columns    => [ 'rulenum' ],
4212                             table      => 'cgp_rule',
4213                           },
4214                         ],
4215    },
4216
4217     'svc_forward' => {
4218       'columns' => [
4219         'svcnum',   'int',            '',   '', '', '', 
4220         'srcsvc',   'int',        'NULL',   '', '', '', 
4221         'src',      'varchar',    'NULL',  255, '', '', 
4222         'dstsvc',   'int',        'NULL',   '', '', '', 
4223         'dst',      'varchar',    'NULL',  255, '', '', 
4224       ],
4225       'primary_key'  => 'svcnum',
4226       'unique'       => [],
4227       'index'        => [ ['srcsvc'], ['dstsvc'] ],
4228       'foreign_keys' => [
4229                           { columns    => [ 'svcnum' ],
4230                             table      => 'cust_svc',
4231                           },
4232                           { columns    => [ 'srcsvc' ],
4233                             table      => 'svc_acct',
4234                             references => [ 'svcnum' ]
4235                           },
4236                           { columns    => [ 'dstsvc' ],
4237                             table      => 'svc_acct',
4238                             references => [ 'svcnum' ]
4239                           },
4240                         ],
4241     },
4242
4243     'svc_www' => {
4244       'columns' => [
4245         'svcnum',   'int',      '',  '', '', '', 
4246         'recnum',   'int',      '',  '', '', '', 
4247         'usersvc',  'int',  'NULL',  '', '', '', 
4248         'config',   'text', 'NULL',  '', '', '', 
4249       ],
4250       'primary_key' => 'svcnum',
4251       'unique'      => [],
4252       'index'       => [],
4253       'foreign_keys' => [
4254                           { columns    => [ 'svcnum' ],
4255                             table      => 'cust_svc',
4256                           },
4257                           { columns    => [ 'recnum' ],
4258                             table      => 'domain_record',
4259                           },
4260                           { columns    => [ 'usersvc' ],
4261                             table      => 'svc_acct',
4262                             references => [ 'svcnum' ]
4263                           },
4264                         ],
4265     },
4266
4267     #'svc_wo' => {
4268     #  'columns' => [
4269     #    'svcnum',    'int',    '',   '',
4270     #    'svcnum',    'int',    '',   '',
4271     #    'svcnum',    'int',    '',   '',
4272     #    'worker',    'varchar',   '',   $char_d,
4273     #    '_date',     @date_type,
4274     #  ],
4275     #  'primary_key' => 'svcnum',
4276     #  'unique' => [ [] ],
4277     #  'index' => [ [] ],
4278     #},
4279
4280     'prepay_credit' => {
4281       'columns' => [
4282         'prepaynum',   'serial',     '',   '', '', '', 
4283         'identifier',  'varchar', '', $char_d, '', '', 
4284         'amount',      @money_type, '', '', 
4285         'seconds',     'int',     'NULL', '', '', '', 
4286         'upbytes',     'bigint',     'NULL', '', '', '', 
4287         'downbytes',   'bigint',     'NULL', '', '', '', 
4288         'totalbytes',  'bigint',     'NULL', '', '', '', 
4289         'agentnum',    'int',     'NULL', '', '', '', 
4290       ],
4291       'primary_key'  => 'prepaynum',
4292       'unique'       => [ ['identifier'] ],
4293       'index'        => [ ['agentnum'] ],
4294       'foreign_keys' => [
4295                           { columns    => [ 'agentnum' ],
4296                             table      => 'agent',
4297                           },
4298                         ],
4299     },
4300
4301     'port' => {
4302       'columns' => [
4303         'portnum',  'serial',     '',   '', '', '', 
4304         'ip',       'varchar', 'NULL', 15, '', '', 
4305         'nasport',  'int',     'NULL', '', '', '', 
4306         'nasnum',   'int',     '',   '', '', '', 
4307       ],
4308       'primary_key'  => 'portnum',
4309       'unique'       => [],
4310       'index'        => [],
4311       'foreign_keys' => [
4312                           { columns    => [ 'nasnum' ],
4313                             table      => 'nas',
4314                           },
4315                         ],
4316     },
4317
4318     'nas' => {
4319       'columns' => [
4320         'nasnum',       'serial',     '',  '',              '', '', 
4321         'nasname',     'varchar',     '', 128,              '', '',
4322         'shortname',   'varchar', 'NULL',  32,              '', '',
4323         'type',        'varchar',     '',  30,         'other', '',
4324         'ports',           'int', 'NULL',  '',              '', '',
4325         'secret',      'varchar',     '',  60,        'secret', '',
4326         'server',      'varchar', 'NULL',  64,              '', '',
4327         'community',   'varchar', 'NULL',  50,              '', '',
4328         'description', 'varchar',     '', 200, 'RADIUS Client', '',
4329         'svcnum',          'int', 'NULL',  '',              '', '',
4330       ],
4331       'primary_key'  => 'nasnum',
4332       'unique'       => [ [ 'nasname' ], ],
4333       'index'        => [],
4334       'foreign_keys' => [
4335                           { columns    => [ 'svcnum' ],
4336                             table      => 'svc_broadband',#no? could be _acct?
4337                                                           #remove or cust_svc?
4338                           },
4339                         ],
4340     },
4341
4342     'export_nas' => {
4343       'columns' => [
4344         'exportnasnum', 'serial', '', '', '', '', 
4345         'exportnum',       'int', '', '', '', '', 
4346         'nasnum',          'int', '', '', '', '', 
4347       ],
4348       'primary_key'  => 'exportnasnum',
4349       'unique'       => [ [ 'exportnum', 'nasnum' ] ],
4350       'index'        => [ [ 'exportnum' ], [ 'nasnum' ] ],
4351       'foreign_keys' => [
4352                           { columns    => [ 'exportnum' ],
4353                             table      => 'part_export',
4354                           },
4355                           { columns    => [ 'nasnum' ],
4356                             table      => 'nas',
4357                           },
4358                         ],
4359     },
4360
4361     'queue' => {
4362       'columns' => [
4363         'jobnum',   'bigserial',     '',      '', '', '', 
4364         'job',        'varchar',     '',     512, '', '', 
4365         '_date',          'int',     '',      '', '', '', 
4366         'status',     'varchar',     '', $char_d, '', '', 
4367         'statustext',    'text', 'NULL',      '', '', '', 
4368         'svcnum',         'int', 'NULL',      '', '', '', 
4369         'custnum',        'int', 'NULL',      '', '', '',
4370         'secure',        'char', 'NULL',       1, '', '',
4371         'priority',       'int', 'NULL',      '', '', '',
4372         'usernum',        'int', 'NULL',      '', '', '',
4373       ],
4374       'primary_key'  => 'jobnum',
4375       'unique'       => [],
4376       'index'        => [ [ 'secure' ], [ 'priority' ],
4377                           [ 'job' ], [ 'svcnum' ], [ 'custnum' ], [ 'status' ],
4378                         ],
4379       'foreign_keys' => [
4380 #                          { columns    => [ 'svcnum' ],
4381 #                            table      => 'cust_svc',
4382 #                          },
4383                           { columns    => [ 'custnum' ],
4384                             table      => 'cust_main',
4385                           },
4386                           { columns    => [ 'usernum' ],
4387                             table      => 'access_user',
4388                           },
4389                         ],
4390     },
4391
4392     'queue_arg' => {
4393       'columns' => [
4394         'argnum', 'bigserial',     '', '', '', '', 
4395         'jobnum',    'bigint',     '', '', '', '', 
4396         'frozen',      'char', 'NULL',  1, '', '',
4397         'arg',         'text', 'NULL', '', '', '', 
4398       ],
4399       'primary_key'  => 'argnum',
4400       'unique'       => [],
4401       'index'        => [ [ 'jobnum' ] ],
4402       'foreign_keys' => [
4403                           { columns    => [ 'jobnum' ],
4404                             table      => 'queue',
4405                             on_delete  => 'CASCADE',
4406                           },
4407                         ],
4408     },
4409
4410     'queue_depend' => {
4411       'columns' => [
4412         'dependnum',  'bigserial', '', '', '', '', 
4413         'jobnum',        'bigint', '', '', '', '', 
4414         'depend_jobnum', 'bigint', '', '', '', '', 
4415       ],
4416       'primary_key'  => 'dependnum',
4417       'unique'       => [],
4418       'index'        => [ [ 'jobnum' ], [ 'depend_jobnum' ] ],
4419       'foreign_keys' => [
4420                           { columns    => [ 'jobnum' ],
4421                             table      => 'queue',
4422                           },
4423                           { columns    => [ 'depend_jobnum' ],
4424                             table      => 'queue',
4425                             references => [ 'jobnum' ],
4426                             on_delete  => 'CASCADE',
4427                           },
4428                         ],
4429     },
4430
4431     'queue_stat' => {
4432       'columns' => [
4433         'statnum', 'bigserial',     '',  '', '', '',
4434         'jobnum',     'bigint',     '',  '', '', '',
4435         'job',       'varchar',     '', 512, '', '', 
4436         'custnum',       'int', 'NULL',  '', '', '',
4437         'insert_date', @date_type, '', '',
4438         'start_date',  @date_type, '', '', 
4439         'end_date',    @date_type, '', '', 
4440       ],
4441       'primary_key'  => 'statnum',
4442       'unique'       => [], #[ ['jobnum'] ],
4443       'index'        => [],
4444     },
4445
4446     'export_svc' => {
4447       'columns' => [
4448         'exportsvcnum' => 'serial', '', '', '', '', 
4449         'exportnum'    => 'int', '', '', '', '', 
4450         'svcpart'      => 'int', '', '', '', '', 
4451         'role'         => 'varchar', 'NULL', 16, '', '',
4452       ],
4453       'primary_key'  => 'exportsvcnum',
4454       'unique'       => [ [ 'exportnum', 'svcpart' ] ],
4455       'index'        => [ [ 'exportnum' ], [ 'svcpart' ] ],
4456       'foreign_keys' => [
4457                           { columns    => [ 'exportnum' ],
4458                             table      => 'part_export',
4459                           },
4460                           { columns    => [ 'svcpart' ],
4461                             table      => 'part_svc',
4462                           },
4463                         ],
4464     },
4465
4466     'export_device' => {
4467       'columns' => [
4468         'exportdevicenum' => 'serial', '', '', '', '', 
4469         'exportnum'       => 'int', '', '', '', '', 
4470         'devicepart'      => 'int', '', '', '', '', 
4471       ],
4472       'primary_key'  => 'exportdevicenum',
4473       'unique'       => [ [ 'exportnum', 'devicepart' ] ],
4474       'index'        => [ [ 'exportnum' ], [ 'devicepart' ] ],
4475       'foreign_keys' => [
4476                           { columns    => [ 'exportnum' ],
4477                             table      => 'part_export',
4478                           },
4479                           { columns    => [ 'devicepart' ],
4480                             table      => 'part_device',
4481                           },
4482                         ],
4483     },
4484
4485     'part_export' => {
4486       'columns' => [
4487         'exportnum',   'serial',     '',      '', '', '', 
4488         'exportname', 'varchar', 'NULL', $char_d, '', '',
4489         'machine',    'varchar', 'NULL', $char_d, '', '',
4490         'exporttype', 'varchar',     '', $char_d, '', '', 
4491         'nodomain',      'char', 'NULL',       1, '', '', 
4492         'default_machine','int', 'NULL',      '', '', '',
4493         'no_suspend',    'char', 'NULL',       1, '', '',
4494         # could also have 'no_insert', 'no_replace', etc.
4495       ],
4496       'primary_key'  => 'exportnum',
4497       'unique'       => [],
4498       'index'        => [ [ 'machine' ], [ 'exporttype' ] ],
4499       'foreign_keys' => [
4500                           { columns    => [ 'default_machine' ],
4501                             table      => 'part_export_machine',
4502                             references => [ 'machinenum' ]
4503                           },
4504                         ],
4505     },
4506
4507     'part_export_option' => {
4508       'columns' => [
4509         'optionnum', 'serial', '', '', '', '', 
4510         'exportnum', 'int', '', '', '', '', 
4511         'optionname', 'varchar', '', $char_d, '', '', 
4512         'optionvalue', 'text', 'NULL', '', '', '', 
4513       ],
4514       'primary_key'  => 'optionnum',
4515       'unique'       => [],
4516       'index'        => [ [ 'exportnum' ], [ 'optionname' ] ],
4517       'foreign_keys' => [
4518                           { columns    => [ 'exportnum' ],
4519                             table      => 'part_export',
4520                           },
4521                         ],
4522     },
4523
4524     'radius_usergroup' => {
4525       'columns' => [
4526         'usergroupnum', 'serial', '', '', '', '', 
4527         'svcnum',       'int', '', '', '', '', 
4528         'groupname',    'varchar', 'NULL', $char_d, '', '', #deprecated
4529         'groupnum',     'int', 'NULL', '', '', '', 
4530       ],
4531       'primary_key'  => 'usergroupnum',
4532       'unique'       => [],
4533       'index'        => [ [ 'svcnum' ], [ 'groupname' ] ],
4534       'foreign_keys' => [
4535                           { columns    => [ 'svcnum' ],
4536                             table      => 'cust_svc', #svc_acct / svc_broadband
4537                           },
4538                           { columns    => [ 'groupnum' ],
4539                             table      => 'radius_group',
4540                           },
4541                         ],
4542     },
4543
4544     'radius_group' => {
4545       'columns' => [
4546         'groupnum', 'serial', '', '', '', '', 
4547         'groupname',    'varchar', '', $char_d, '', '', 
4548         'description',  'varchar', 'NULL', $char_d, '', '', 
4549         'priority', 'int', '', '', '1', '',
4550         'speed_up', 'int', 'NULL', '', '', '',
4551         'speed_down', 'int', 'NULL', '', '', '',
4552       ],
4553       'primary_key' => 'groupnum',
4554       'unique'      => [ ['groupname'] ],
4555       'index'       => [],
4556     },
4557
4558     'radius_attr' => {
4559       'columns' => [
4560         'attrnum',   'serial', '',      '', '', '',
4561         'groupnum',     'int', '',      '', '', '',
4562         'attrname', 'varchar', '', $char_d, '', '',
4563         'value',    'varchar', '',     255, '', '',
4564         'attrtype',    'char', '',       1, '', '',
4565         'op',          'char', '',       2, '', '',
4566       ],
4567       'primary_key'  => 'attrnum',
4568       'unique'       => [],
4569       'index'        => [ ['groupnum'], ],
4570       'foreign_keys' => [
4571                           { columns    => [ 'groupnum' ],
4572                             table      => 'radius_group',
4573                           },
4574                         ],
4575     },
4576
4577     'msgcat' => {
4578       'columns' => [
4579         'msgnum', 'serial', '', '', '', '', 
4580         'msgcode', 'varchar', '', 255, '', '', 
4581         'locale', 'varchar', '', 16, '', '', 
4582         'msg', 'text', '', '', '', '', 
4583       ],
4584       'primary_key' => 'msgnum',
4585       'unique'      => [ [ 'msgcode', 'locale' ] ],
4586       'index'       => [],
4587     },
4588
4589     'cust_tax_exempt' => {
4590       'columns' => [
4591         'exemptnum', 'serial', '', '', '', '', 
4592         'custnum',   'int', '', '', '', '', 
4593         'taxnum',    'int', '', '', '', '', 
4594         'year',      'int', '', '', '', '', 
4595         'month',     'int', '', '', '', '', 
4596         'amount',   @money_type, '', '', 
4597       ],
4598       'primary_key'  => 'exemptnum',
4599       'unique'       => [ [ 'custnum', 'taxnum', 'year', 'month' ] ],
4600       'index'        => [],
4601       'foreign_keys' => [
4602                           { columns    => [ 'custnum' ],
4603                             table      => 'cust_main',
4604                           },
4605                           { columns    => [ 'taxnum' ],
4606                             table      => 'cust_main_county',
4607                           },
4608                         ],
4609     },
4610
4611     'cust_tax_exempt_pkg' => {
4612       'columns' => [
4613         'exemptpkgnum',  'serial', '', '', '', '', 
4614         #'custnum',      'int', '', '', '', ''
4615         'billpkgnum',   'int', '', '', '', '', 
4616         'taxnum',       'int', '', '', '', '', 
4617         'taxtype',  'varchar', 'NULL', $char_d, '', '',
4618         'year',         'int', 'NULL', '', '', '', 
4619         'month',        'int', 'NULL', '', '', '', 
4620         'creditbillpkgnum', 'int', 'NULL', '', '', '',
4621         'amount',       @money_type, '', '', 
4622         # exemption type flags
4623         'exempt_cust',          'char', 'NULL', 1, '', '',
4624         'exempt_setup',         'char', 'NULL', 1, '', '',
4625         'exempt_recur',         'char', 'NULL', 1, '', '',
4626         'exempt_cust_taxname',  'char', 'NULL', 1, '', '',
4627         'exempt_monthly',       'char', 'NULL', 1, '', '',
4628       ],
4629       'primary_key'  => 'exemptpkgnum',
4630       'unique'       => [],
4631       'index'        => [ [ 'taxnum', 'year', 'month' ],
4632                           [ 'billpkgnum' ],
4633                           [ 'taxnum', 'taxtype' ],
4634                           [ 'creditbillpkgnum' ],
4635                         ],
4636       'foreign_keys' => [
4637                           { columns    => [ 'billpkgnum' ],
4638                             table      => 'cust_bill_pkg',
4639                           },
4640                           { columns    => [ 'creditbillpkgnum' ],
4641                             table      => 'cust_credit_bill_pkg',
4642                           },
4643                         ],
4644     },
4645
4646     'cust_tax_exempt_pkg_void' => {
4647       'columns' => [
4648         'exemptpkgnum',  'int', '', '', '', '', 
4649         #'custnum',      'int', '', '', '', ''
4650         'billpkgnum',   'int', '', '', '', '', 
4651         'taxnum',       'int', '', '', '', '', 
4652         'taxtype',  'varchar', 'NULL', $char_d, '', '',
4653         'year',         'int', 'NULL', '', '', '', 
4654         'month',        'int', 'NULL', '', '', '', 
4655         'creditbillpkgnum', 'int', 'NULL', '', '', '',
4656         'amount',       @money_type, '', '', 
4657         # exemption type flags
4658         'exempt_cust',          'char', 'NULL', 1, '', '',
4659         'exempt_setup',         'char', 'NULL', 1, '', '',
4660         'exempt_recur',         'char', 'NULL', 1, '', '',
4661         'exempt_cust_taxname',  'char', 'NULL', 1, '', '',
4662         'exempt_monthly',       'char', 'NULL', 1, '', '',
4663       ],
4664       'primary_key'  => 'exemptpkgnum',
4665       'unique'       => [],
4666       'index'        => [ [ 'taxnum', 'year', 'month' ],
4667                           [ 'billpkgnum' ],
4668                           [ 'taxnum', 'taxtype' ],
4669                           [ 'creditbillpkgnum' ],
4670                         ],
4671       'foreign_keys' => [
4672                           { columns    => [ 'billpkgnum' ],
4673                             table      => 'cust_bill_pkg_void',
4674                           },
4675                           { columns    => [ 'taxnum' ],
4676                             table      => 'cust_main_county',
4677                           },
4678                           { columns    => [ 'creditbillpkgnum' ],
4679                             table      => 'cust_credit_bill_pkg',
4680                           },
4681                         ],
4682     },
4683
4684     'router' => {
4685       'columns' => [
4686         'routernum', 'serial', '', '', '', '', 
4687         'routername', 'varchar', '', $char_d, '', '', 
4688         'svcnum', 'int', 'NULL', '', '', '', 
4689         'agentnum',   'int', 'NULL', '', '', '', 
4690         'manual_addr', 'char', 'NULL', 1, '', '',
4691       ],
4692       'primary_key'  => 'routernum',
4693       'unique'       => [],
4694       'index'        => [],
4695       'foreign_keys' => [
4696                           { columns    => [ 'svcnum' ],
4697                             table      => 'cust_svc', #svc_acct / svc_broadband
4698                           },
4699                           { columns    => [ 'agentnum' ],
4700                             table      => 'agent',
4701                           },
4702                         ],
4703     },
4704
4705     'part_svc_router' => {
4706       'columns' => [
4707         'svcrouternum', 'serial', '', '', '', '', 
4708         'svcpart', 'int', '', '', '', '', 
4709         'routernum', 'int', '', '', '', '', 
4710       ],
4711       'primary_key'  => 'svcrouternum',
4712       'unique'       => [],
4713       'index'        => [],
4714       'foreign_keys' => [
4715                           { columns    => [ 'svcpart' ],
4716                             table      => 'part_svc',
4717                           },
4718                           { columns    => [ 'routernum' ],
4719                             table      => 'router',
4720                           },
4721                         ],
4722     },
4723
4724     'addr_block' => {
4725       'columns' => [
4726         'blocknum', 'serial', '', '', '', '', 
4727         'routernum', 'int', '', '', '', '', 
4728         'ip_gateway', 'varchar', '', 15, '', '', 
4729         'ip_netmask', 'int', '', '', '', '', 
4730         'agentnum',   'int', 'NULL', '', '', '', 
4731         'manual_flag', 'char', 'NULL', 1, '', '', 
4732       ],
4733       'primary_key'  => 'blocknum',
4734       'unique'       => [ [ 'blocknum', 'routernum' ] ],
4735       'index'        => [],
4736       'foreign_keys' => [
4737                           #{ columns    => [ 'routernum' ],
4738                           #   table      => 'router',
4739                           #},
4740                           { columns    => [ 'agentnum' ],
4741                             table      => 'agent',
4742                           },
4743                         ],
4744     },
4745
4746     'addr_range' => {
4747       'columns' => [
4748         'rangenum', 'serial', '', '', '', '',
4749         'start',    'varchar', '', 15, '', '',
4750         'length',   'int', '', '', '', '',
4751         'status',   'varchar', 'NULL', 32, '', '',
4752       ],
4753       'primary_key' => 'rangenum',
4754       'unique'      => [],
4755       'index'       => [],
4756     },
4757
4758     'svc_broadband' => {
4759       'columns' => [
4760         'svcnum',                  'int',     '',        '', '', '', 
4761         'description',         'varchar', 'NULL',   $char_d, '', '', 
4762         'routernum',               'int', 'NULL',        '', '', '',
4763         'blocknum',                'int', 'NULL',        '', '', '', 
4764         'sectornum',               'int', 'NULL',        '', '', '',
4765         'speed_up',                'int', 'NULL',        '', '', '', 
4766         'speed_down',              'int', 'NULL',        '', '', '', 
4767         'ip_addr',             'varchar', 'NULL',        15, '', '', 
4768         'mac_addr',            'varchar', 'NULL',        12, '', '', 
4769         'authkey',             'varchar', 'NULL',        32, '', '', 
4770         'latitude',            'decimal', 'NULL',    '10,7', '', '', 
4771         'longitude',           'decimal', 'NULL',    '10,7', '', '', 
4772         'altitude',            'decimal', 'NULL',        '', '', '', 
4773         'vlan_profile',        'varchar', 'NULL',   $char_d, '', '', 
4774         'performance_profile', 'varchar', 'NULL',   $char_d, '', '',
4775         'plan_id',             'varchar', 'NULL',   $char_d, '', '',
4776         'radio_serialnum',     'varchar', 'NULL',   $char_d, '', '',
4777         'radio_location',      'varchar', 'NULL', 2*$char_d, '', '',
4778         'poe_location',        'varchar', 'NULL', 2*$char_d, '', '',
4779         'rssi',                    'int', 'NULL',        '', '', '',
4780         'suid',                    'int', 'NULL',        '', '', '',
4781         'shared_svcnum',           'int', 'NULL',        '', '', '',
4782         'serviceid',           'varchar', 'NULL',        64, '', '',#srvexport/reportfields
4783       ],
4784       'primary_key'  => 'svcnum',
4785       'unique'       => [ [ 'ip_addr' ], [ 'mac_addr' ] ],
4786       'index'        => [],
4787       'foreign_keys' => [
4788                           { columns    => [ 'svcnum' ],
4789                             table      => 'cust_svc',
4790                           },
4791                           { columns    => [ 'routernum' ],
4792                             table      => 'router',
4793                           },
4794                           { columns    => [ 'blocknum' ],
4795                             table      => 'addr_block',
4796                           },
4797                           { columns    => [ 'sectornum' ],
4798                             table      => 'tower_sector',
4799                           },
4800                           { columns    => [ 'shared_svcnum' ],
4801                             table      => 'svc_broadband',
4802                             references => [ 'svcnum' ],
4803                           },
4804                         ],
4805     },
4806
4807     'tower' => {
4808       'columns' => [
4809         'towernum',    'serial',     '',      '', '', '',
4810         #'agentnum',       'int', 'NULL',      '', '', '',
4811         'towername',  'varchar',     '', $char_d, '', '',
4812         'disabled',      'char', 'NULL',       1, '', '',
4813         'latitude',   'decimal', 'NULL',  '10,7', '', '', 
4814         'longitude',  'decimal', 'NULL',  '10,7', '', '', 
4815         'coord_auto',    'char', 'NULL',       1, '', '',
4816         'altitude',   'decimal', 'NULL',      '', '', '', 
4817         'height',     'decimal', 'NULL',      '', '', '', 
4818         'veg_height', 'decimal', 'NULL',      '', '', '', 
4819         'color',      'varchar', 'NULL',       6, '', '',
4820       ],
4821       'primary_key' => 'towernum',
4822       'unique'      => [ [ 'towername' ] ], # , 'agentnum' ] ],
4823       'index'       => [],
4824     },
4825
4826     'tower_sector' => {
4827       'columns' => [
4828         'sectornum',     'serial',     '',      '', '', '',
4829         'towernum',         'int',     '',      '', '', '',
4830         'sectorname',   'varchar',     '', $char_d, '', '',
4831         'ip_addr',      'varchar', 'NULL',      15, '', '',
4832         'height',       'decimal', 'NULL',      '', '', '', 
4833         'freq_mhz',         'int', 'NULL',      '', '', '',
4834         'direction',        'int', 'NULL',      '', '', '',
4835         'width',            'int', 'NULL',      '', '', '',
4836         #downtilt etc? rfpath has profile files for devices/antennas you upload?
4837         'sector_range', 'decimal', 'NULL',      '', '', '',  #?
4838       ],
4839       'primary_key'  => 'sectornum',
4840       'unique'       => [ [ 'towernum', 'sectorname' ], [ 'ip_addr' ], ],
4841       'index'        => [ [ 'towernum' ] ],
4842       'foreign_keys' => [
4843                           { columns    => [ 'towernum' ],
4844                             table      => 'tower',
4845                           },
4846                         ],
4847     },
4848
4849     'part_virtual_field' => {
4850       'columns' => [
4851         'vfieldpart', 'serial', '', '', '', '', 
4852         'dbtable', 'varchar', '', 32, '', '', 
4853         'name', 'varchar', '', 32, '', '', 
4854         'length', 'int', 'NULL', '', '', '', 
4855         'label', 'varchar', 'NULL', 80, '', '', 
4856       ],
4857       'primary_key' => 'vfieldpart',
4858       'unique' => [],
4859       'index' => [],
4860     },
4861
4862     'virtual_field' => {
4863       'columns' => [
4864         'vfieldnum', 'serial', '', '', '', '', 
4865         'recnum', 'int', '', '', '', '', 
4866         'vfieldpart', 'int', '', '', '', '', 
4867         'value', 'varchar', '', 128, '', '', 
4868       ],
4869       'primary_key'  => 'vfieldnum',
4870       'unique'       => [ [ 'vfieldpart', 'recnum' ] ],
4871       'index'        => [],
4872       'foreign_keys' => [
4873                           { columns    => [ 'vfieldpart' ],
4874                             table      => 'part_virtual_field',
4875                           },
4876                         ],
4877     },
4878
4879     'acct_snarf' => {
4880       'columns' => [
4881         'snarfnum',    'serial',     '',      '', '', '', 
4882         'snarfname',  'varchar', 'NULL', $char_d, '', '', 
4883         'svcnum',         'int',     '',      '', '', '', 
4884         'machine',    'varchar',     '',     255, '', '', 
4885         'protocol',   'varchar',     '', $char_d, '', '', 
4886         'username',   'varchar',     '', $char_d, '', '', 
4887         '_password',  'varchar',     '', $char_d, '', '', 
4888         'check_freq',     'int', 'NULL',      '', '', '', 
4889         'leavemail',     'char', 'NULL',       1, '', '', 
4890         'apop',          'char', 'NULL',       1, '', '', 
4891         'tls',           'char', 'NULL',       1, '', '', 
4892         'mailbox',    'varchar', 'NULL', $char_d, '', '', 
4893       ],
4894       'primary_key'  => 'snarfnum',
4895       'unique'       => [],
4896       'index'        => [ [ 'svcnum' ] ],
4897       'foreign_keys' => [
4898                           { columns    => [ 'svcnum' ],
4899                             table      => 'svc_acct',
4900                           },
4901                         ],
4902     },
4903
4904     'svc_external' => {
4905       'columns' => [
4906         'svcnum',     'int',     '',      '', '', '', 
4907         'id',      'bigint', 'NULL',      '', '', '', 
4908         'title',  'varchar', 'NULL', $char_d, '', '', 
4909       ],
4910       'primary_key'  => 'svcnum',
4911       'unique'       => [],
4912       'index'        => [],
4913       'foreign_keys' => [
4914                           { columns    => [ 'svcnum' ],
4915                             table      => 'cust_svc',
4916                           },
4917                         ],
4918     },
4919
4920     'cust_pay_refund' => {
4921       'columns' => [
4922         'payrefundnum', 'serial', '', '', '', '', 
4923         'paynum',  'int', '', '', '', '', 
4924         'refundnum',  'int', '', '', '', '', 
4925         '_date',    @date_type, '', '', 
4926         'amount',   @money_type, '', '', 
4927       ],
4928       'primary_key'  => 'payrefundnum',
4929       'unique'       => [],
4930       'index'        => [ ['paynum'], ['refundnum'] ],
4931       'foreign_keys' => [
4932                           { columns    => [ 'paynum' ],
4933                             table      => 'cust_pay',
4934                           },
4935                           { columns    => [ 'refundnum' ],
4936                             table      => 'cust_refund',
4937                           },
4938                         ],
4939     },
4940
4941     'part_pkg_option' => {
4942       'columns' => [
4943         'optionnum', 'serial', '', '', '', '', 
4944         'pkgpart', 'int', '', '', '', '', 
4945         'optionname', 'varchar', '', $char_d, '', '', 
4946         'optionvalue', 'text', 'NULL', '', '', '', 
4947       ],
4948       'primary_key'  => 'optionnum',
4949       'unique'       => [],
4950       'index'        => [ [ 'pkgpart' ], [ 'optionname' ] ],
4951       'foreign_keys' => [
4952                           { columns    => [ 'pkgpart' ],
4953                             table      => 'part_pkg',
4954                           },
4955                         ],
4956     },
4957
4958     'part_pkg_vendor' => {
4959       'columns' => [
4960         'num', 'serial', '', '', '', '', 
4961         'pkgpart', 'int', '', '', '', '', 
4962         'exportnum', 'int', '', '', '', '', 
4963         'vendor_pkg_id', 'varchar', '', $char_d, '', '', 
4964       ],
4965       'primary_key'  => 'num',
4966       'unique'       => [ [ 'pkgpart', 'exportnum' ] ],
4967       'index'        => [ [ 'pkgpart' ] ],
4968       'foreign_keys' => [
4969                           { columns    => [ 'pkgpart' ],
4970                             table      => 'part_pkg',
4971                           },
4972                           { columns    => [ 'exportnum' ],
4973                             table      => 'part_export',
4974                           },
4975                         ],
4976     },
4977
4978     'part_pkg_report_option' => {
4979       'columns' => [
4980         'num',      'serial',   '',      '', '', '', 
4981         'name',     'varchar',  '', $char_d, '', '', 
4982         'disabled', 'char', 'NULL',       1, '', '', 
4983       ],
4984       'primary_key' => 'num',
4985       'unique' => [ [ 'name' ] ],
4986       'index' => [ [ 'disabled' ] ],
4987     },
4988
4989     'part_pkg_usage' => {
4990       'columns' => [
4991         'pkgusagepart', 'serial',   '', '', '', '',
4992         'pkgpart',  'int',      '', '', '', '',
4993         'minutes',  'double precision',      '', '', '', '',
4994         'priority', 'int',  'NULL', '', '', '',
4995         'shared',   'char', 'NULL',  1, '', '',
4996         'rollover', 'char', 'NULL',  1, '', '',
4997         'description',  'varchar', 'NULL', $char_d, '', '',
4998       ],
4999       'primary_key'  => 'pkgusagepart',
5000       'unique'       => [],
5001       'index'        => [ [ 'pkgpart' ] ],
5002       'foreign_keys' => [
5003                           { columns    => [ 'pkgpart' ],
5004                             table      => 'part_pkg',
5005                           },
5006                         ],
5007     },
5008
5009     'part_pkg_usage_class' => {
5010       'columns' => [
5011         'num',       'serial',  '', '', '', '',
5012         'pkgusagepart', 'int',  '', '', '', '',
5013         'classnum',     'int','NULL', '', '', '',
5014       ],
5015       'primary_key'  => 'num',
5016       'unique'       => [ [ 'pkgusagepart', 'classnum' ] ],
5017       'index'        => [],
5018       'foreign_keys' => [
5019                           { columns    => [ 'pkgusagepart' ],
5020                             table      => 'part_pkg_usage',
5021                           },
5022                           { columns    => [ 'classnum' ],
5023                             table      => 'usage_class',
5024                           },
5025                         ],
5026     },
5027
5028     'part_pkg_fcc_option' => {
5029       'columns' => [
5030         'num',        'serial', '', '', '', '',
5031         'fccoptionname', 'varchar', '', $char_d, '', '',
5032         'pkgpart',       'int', '', '', '', '',
5033         'optionvalue',   'varchar', 'NULL', $char_d, '', '',
5034       ],
5035       'primary_key' => 'num',
5036       'unique'      => [ [ 'fccoptionname', 'pkgpart' ] ],
5037       'index'       => [],
5038     },
5039
5040     'rate' => {
5041       'columns' => [
5042         'ratenum',          'serial',     '', '', '', '', 
5043         'ratename',        'varchar', '',$char_d, '', '', 
5044         'agentnum',            'int', 'NULL', '', '', '',
5045         'default_detailnum',   'int', 'NULL', '', '', '',
5046       ],
5047       'primary_key' => 'ratenum',
5048       'unique'      => [],
5049       'index'       => [],
5050       'foreign_keys' => [
5051                           { columns    => [ 'agentnum' ],
5052                             table      => 'agent',
5053                           },
5054                         ],
5055     },
5056
5057     'rate_detail' => {
5058       'columns' => [
5059         'ratedetailnum',   'serial',  '',     '',      '', '', 
5060         'ratenum',         'int',     '',     '',      '', '', 
5061         'orig_regionnum',  'int', 'NULL',     '',      '', '', 
5062         'dest_regionnum',  'int', 'NULL',     '',      '', '', 
5063         'min_included',    'int',     '',     '',      '', '', 
5064         'conn_charge',     'decimal', '', '10,4', '0.0000', '',
5065         'conn_cost',       'decimal', '', '10,4', '0.0000', '',
5066         'conn_sec',        'int',     '',     '',      '0', '',
5067         'min_charge',      'decimal', '', '10,5',       '', '',
5068         'min_cost',        'decimal', '', '10,5','0.00000', '',
5069         'sec_granularity', 'int',     '',     '',       '', '', 
5070         'ratetimenum',     'int', 'NULL',     '',       '', '',
5071         'classnum',        'int', 'NULL',     '',       '', '', 
5072         'cdrtypenum',      'int', 'NULL',     '',       '', '',
5073         'region_group',   'char', 'NULL',      1,       '', '', 
5074         'upstream_mult_charge',  'decimal',  '', '10,4', '0.0000', '',
5075         'upstream_mult_cost',    'decimal',  '', '10,4', '0.0000', '',
5076       ],
5077       'primary_key'  => 'ratedetailnum',
5078       'unique'       => [ [ 'ratenum', 'orig_regionnum', 'dest_regionnum' ] ],
5079       'index'        => [ [ 'ratenum', 'dest_regionnum' ],
5080                           [ 'ratenum', 'ratetimenum' ]
5081                         ],
5082       'foreign_keys' => [
5083                           { columns    => [ 'ratenum' ],
5084                             table      => 'rate',
5085                           },
5086                           { columns    => [ 'orig_regionnum' ],
5087                             table      => 'rate_region',
5088                             references => [ 'regionnum' ],
5089                           },
5090                           { columns    => [ 'dest_regionnum' ],
5091                             table      => 'rate_region',
5092                             references => [ 'regionnum' ],
5093                           },
5094                           { columns    => [ 'ratetimenum' ],
5095                             table      => 'rate_time',
5096                           },
5097                           { columns    => [ 'classnum' ],
5098                             table      => 'usage_class',
5099                           },
5100                           { columns    => [ 'cdrtypenum' ],
5101                             table      => 'cdr_type',
5102                           },
5103                         ],
5104     },
5105
5106     'rate_region' => {
5107       'columns' => [
5108         'regionnum',   'serial',      '', '', '', '', 
5109         'regionname',  'varchar',     '', $char_d, '', '', 
5110         'exact_match', 'char',    'NULL',  1, '', '',
5111       ],
5112       'primary_key' => 'regionnum',
5113       'unique'      => [],
5114       'index'       => [],
5115     },
5116
5117     'rate_prefix' => {
5118       'columns' => [
5119         'prefixnum',   'serial',      '', '', '', '', 
5120         'regionnum',   'int',         '', '', '', '', 
5121         'countrycode', 'varchar',     '',  3, '', '', 
5122         'npa',         'varchar', 'NULL', 10, '', '', #actually the whole prefix
5123         'nxx',         'varchar', 'NULL',  3, '', '', #actually not used
5124         'latanum',     'int',     'NULL',      '', '', '',
5125         'state',       'char',    'NULL',       2, '', '', 
5126         'ocn',         'char',    'NULL',       4, '', '', 
5127       ],
5128       'primary_key'  => 'prefixnum',
5129       'unique'       => [],
5130       'index'        => [ [ 'countrycode' ], [ 'npa' ], [ 'regionnum' ] ],
5131       'foreign_keys' => [
5132                           { columns    => [ 'regionnum' ],
5133                             table      => 'rate_region',
5134                           },
5135                           { columns    => [ 'latanum' ],
5136                             table      => 'lata',
5137                           },
5138                         ],
5139     },
5140
5141     'rate_time' => {
5142       'columns' => [
5143         'ratetimenum', 'serial',      '',      '', '', '',
5144         'ratetimename',   'varchar',      '', $char_d, '', '',
5145       ],
5146       'primary_key' => 'ratetimenum',
5147       'unique'      => [],
5148       'index'       => [],
5149     },
5150
5151     'rate_time_interval' => {
5152       'columns' => [
5153         'intervalnum', 'serial', '', '', '', '',
5154         'stime',          'int', '', '', '', '',
5155         'etime',          'int', '', '', '', '',
5156         'ratetimenum',    'int', '', '', '', '',
5157       ],
5158       'primary_key'  => 'intervalnum',
5159       'unique'       => [],
5160       'index'        => [],
5161       'foreign_keys' => [
5162                           { columns    => [ 'ratetimenum' ],
5163                             table      => 'rate_time',
5164                           },
5165                         ],
5166      },
5167
5168     #not really part of the above rate_ stuff (used with flat rate rather than
5169     # rated billing), but could be eventually, and its a rate
5170     'rate_tier' => {
5171       'columns' => [
5172         'tiernum',   'serial', '',      '', '', '',
5173         'tiername', 'varchar', '', $char_d, '', '',
5174       ],
5175       'primary_key' => 'tiernum',
5176       'unique'      => [ [ 'tiername'], ],
5177       'index'       => [],
5178     },
5179
5180     'rate_tier_detail' => {
5181       'columns' => [
5182         'tierdetailnum', 'serial', '',     '', '', '',
5183         'tiernum',          'int', '',     '', '', '',
5184         'min_quan',         'int', '',     '', '', '',
5185         'min_charge',   'decimal', '', '10,4', '', '',
5186       ],
5187       'primary_key'  => 'tierdetailnum',
5188       'unique'       => [],
5189       'index'        => [ ['tiernum'], ],
5190       'foreign_keys' => [
5191                           { columns    => [ 'tiernum' ],
5192                             table      => 'rate_tier',
5193                           },
5194                         ],
5195     },
5196
5197     'usage_class' => {
5198       'columns' => [
5199         'classnum',    'serial',      '',      '', '', '', 
5200         'weight',      'int',     'NULL',      '', '', '',
5201         'classname',   'varchar',     '', $char_d, '', '', 
5202         'format',      'varchar', 'NULL', $char_d, '', '', 
5203         'disabled',    'char',    'NULL',       1, '', '', 
5204       ],
5205       'primary_key' => 'classnum',
5206       'unique' => [],
5207       'index' => [ ['disabled'] ],
5208     },
5209
5210     'reg_code' => {
5211       'columns' => [
5212         'codenum',   'serial',    '', '', '', '', 
5213         'code',      'varchar',   '', $char_d, '', '', 
5214         'agentnum',  'int',       '', '', '', '', 
5215       ],
5216       'primary_key'  => 'codenum',
5217       'unique'       => [ [ 'agentnum', 'code' ] ],
5218       'index'        => [ [ 'agentnum' ] ],
5219       'foreign_keys' => [
5220                           { columns    => [ 'agentnum' ],
5221                             table      => 'agent',
5222                           },
5223                         ],
5224      },
5225
5226     'reg_code_pkg' => {
5227       'columns' => [
5228         'codepkgnum', 'serial', '', '', '', '', 
5229         'codenum',   'int',    '', '', '', '', 
5230         'pkgpart',   'int',    '', '', '', '', 
5231       ],
5232       'primary_key'  => 'codepkgnum',
5233       'unique'       => [ [ 'codenum', 'pkgpart' ] ],
5234       'index'        => [ [ 'codenum' ] ],
5235       'foreign_keys' => [
5236                           { columns    => [ 'codenum' ],
5237                             table      => 'reg_code',
5238                           },
5239                           { columns    => [ 'pkgpart' ],
5240                             table      => 'part_pkg',
5241                           },
5242                         ],
5243     },
5244
5245     'clientapi_session' => {
5246       'columns' => [
5247         'sessionnum',  'serial',  '', '', '', '', 
5248         'sessionid',  'varchar',  '', $char_d, '', '', 
5249         'namespace',  'varchar',  '', $char_d, '', '', 
5250       ],
5251       'primary_key' => 'sessionnum',
5252       'unique'      => [ [ 'sessionid', 'namespace' ] ],
5253       'index'       => [],
5254     },
5255
5256     'clientapi_session_field' => {
5257       'columns' => [
5258         'fieldnum',    'serial',     '', '', '', '', 
5259         'sessionnum',     'int',     '', '', '', '', 
5260         'fieldname',  'varchar',     '', $char_d, '', '', 
5261         'fieldvalue',    'text', 'NULL', '', '', '', 
5262       ],
5263       'primary_key'  => 'fieldnum',
5264       'unique'       => [ [ 'sessionnum', 'fieldname' ] ],
5265       'index'        => [],
5266       'foreign_keys' => [
5267                           { columns    => [ 'sessionnum' ],
5268                             table      => 'clientapi_session',
5269                           },
5270                         ],
5271     },
5272
5273     'payment_gateway' => {
5274       'columns' => [
5275         'gatewaynum',       'serial',   '',     '', '', '', 
5276         'gateway_namespace','varchar',  'NULL', $char_d, '', '', 
5277         'gateway_module',   'varchar',  '',     $char_d, '', '', 
5278         'gateway_username', 'varchar',  'NULL', $char_d, '', '', 
5279         'gateway_password', 'varchar',  'NULL', $char_d, '', '', 
5280         'gateway_action',   'varchar',  'NULL', $char_d, '', '', 
5281         'gateway_callback_url', 'varchar',  'NULL', 255, '', '', 
5282         'gateway_cancel_url',   'varchar',  'NULL', 255, '', '',
5283         'disabled',   'char',  'NULL',   1, '', '', 
5284       ],
5285       'primary_key' => 'gatewaynum',
5286       'unique' => [],
5287       'index'  => [ [ 'disabled' ] ],
5288     },
5289
5290     'payment_gateway_option' => {
5291       'columns' => [
5292         'optionnum',   'serial',  '',     '', '', '', 
5293         'gatewaynum',  'int',     '',     '', '', '', 
5294         'optionname',  'varchar', '',     $char_d, '', '', 
5295         'optionvalue', 'text',    'NULL', '', '', '', 
5296       ],
5297       'primary_key'  => 'optionnum',
5298       'unique'       => [],
5299       'index'        => [ [ 'gatewaynum' ], [ 'optionname' ] ],
5300       'foreign_keys' => [
5301                           { columns    => [ 'gatewaynum' ],
5302                             table      => 'payment_gateway',
5303                           },
5304                         ],
5305     },
5306
5307     'agent_payment_gateway' => {
5308       'columns' => [
5309         'agentgatewaynum', 'serial', '', '', '', '', 
5310         'agentnum',        'int', '', '', '', '', 
5311         'gatewaynum',      'int', '', '', '', '', 
5312         'cardtype',        'varchar', 'NULL', $char_d, '', '', 
5313         'taxclass',        'varchar', 'NULL', $char_d, '', '', 
5314       ],
5315       'primary_key'  => 'agentgatewaynum',
5316       'unique'       => [],
5317       'index'        => [ [ 'agentnum', 'cardtype' ], ],
5318
5319       'foreign_keys' => [
5320
5321                           { columns    => [ 'agentnum' ],
5322                             table      => 'agent',
5323                           },
5324                           { columns    => [ 'gatewaynum' ],
5325                             table      => 'payment_gateway',
5326                           },
5327                         ],
5328     },
5329
5330     'banned_pay' => {
5331       'columns' => [
5332         'bannum',        'serial',     '',      '', '', '', 
5333         'payby',           'char',     '',       4, '', '', 
5334         'payinfo',      'varchar',     '',     128, '', '', #say, a 512-big digest _hex encoded
5335         'payinfo_hash', 'varchar', 'NULL',      32, '', '',
5336         #'paymask',      'varchar',  'NULL', $char_d, '', ''
5337         '_date',                @date_type,         '', '', 
5338         'end_date',             @date_type,         '', '', 
5339         'otaker',       'varchar', 'NULL',      32, '', '', 
5340         'usernum',          'int', 'NULL',      '', '', '',
5341         'bantype',      'varchar', 'NULL', $char_d, '', '',
5342         'reason',       'varchar', 'NULL', $char_d, '', '', 
5343       ],
5344       'primary_key'  => 'bannum',
5345       'unique'       => [],
5346       'index'        => [ [ 'payby', 'payinfo' ], [ 'usernum' ], ],
5347       'foreign_keys' => [
5348                           { columns    => [ 'usernum' ],
5349                             table      => 'access_user',
5350                           },
5351                         ],
5352     },
5353
5354     'pkg_category' => {
5355       'columns' => [
5356         'categorynum',        'serial',     '',      '', '', '', 
5357         'categoryname',      'varchar',     '', $char_d, '', '', 
5358         'weight',                'int', 'NULL',      '', '', '',
5359         'ticketing_queueid',     'int', 'NULL',      '', '', '', 
5360         'condense',             'char', 'NULL',       1, '', '', 
5361         'disabled',             'char', 'NULL',       1, '', '', 
5362       ],
5363       'primary_key' => 'categorynum',
5364       'unique' => [],
5365       'index' => [ ['disabled'] ],
5366     },
5367
5368     'pkg_class' => {
5369       'columns' => [
5370         'classnum',    'serial',   '',      '', '', '', 
5371         'classname',   'varchar',  '', $char_d, '', '', 
5372         'categorynum', 'int',  'NULL',      '', '', '', 
5373         'disabled',    'char', 'NULL',       1, '', '', 
5374         'fcc_ds0s',      'int',     'NULL', '', '', '', 
5375       ],
5376       'primary_key'  => 'classnum',
5377       'unique'       => [],
5378       'index'        => [ ['disabled'] ],
5379       'foreign_keys' => [
5380                           { columns    => [ 'categorynum' ],
5381                             table      => 'pkg_category',
5382                           },
5383                         ],
5384     },
5385
5386     'cdr' => {
5387       'columns' => [
5388         # qw( name type null length default local );
5389
5390         ###
5391         #asterisk fields
5392         ###
5393
5394         'acctid',   'bigserial',  '', '', '', '', 
5395         #'calldate', 'TIMESTAMP with time zone', '', '', \'now()', '',
5396         'calldate', 'timestamp',   '',      '', \'now()', '',
5397         'clid',        'varchar',  '', $char_d, \"''", '', 
5398         'src',         'varchar',  '', $char_d, \"''", '', 
5399         'dst',         'varchar',  '', $char_d, \"''", '', 
5400         'dcontext',    'varchar',  '', $char_d, \"''", '', 
5401         'channel',     'varchar',  '', $char_d, \"''", '', 
5402         'dstchannel',  'varchar',  '', $char_d, \"''", '', 
5403         'lastapp',     'varchar',  '', $char_d, \"''", '', 
5404         'lastdata',    'varchar',  '',     255, \"''", '', 
5405
5406         #currently only opensips & voipswitch
5407         'src_ip_addr', 'varchar',  'NULL',  15,    '', '',
5408
5409         #currently only opensips
5410         'dst_ip_addr', 'varchar',  'NULL',  15,    '', '',
5411
5412         #currently only u4:
5413         # terminating number (as opposed to dialed destination)
5414         'dst_term',    'varchar',  'NULL', $char_d, '', '',
5415
5416         #these don't seem to be logged by most of the SQL cdr_* modules
5417         #except tds under sql-illegal names, so;
5418         # ... don't rely on them for rating?
5419         # and, what they hey, i went ahead and changed the names and data types
5420         # to freeside-style dates...
5421           #'start',  'timestamp', 'NULL',  '',    '', '',
5422           #'answer', 'timestamp', 'NULL',  '',    '', '',
5423           #'end',    'timestamp', 'NULL',  '',    '', '',
5424         'startdate',  @date_type, '', '', 
5425         'answerdate', @date_type, '', '', 
5426         'enddate',    @date_type, '', '', 
5427         #
5428
5429         'duration',    'int',      '',      '',     0, '',
5430         'billsec',     'int',      '',      '',     0, '', 
5431         'disposition', 'varchar',  '',      45, \"''", '',
5432         'amaflags',    'int',      '',      '',     0, '',
5433         'accountcode', 'varchar',  '',      32, \"''", '',
5434         'uniqueid',    'varchar',  '', $char_d, \"''", '',
5435         'userfield',   'varchar',  '',     512, \"''", '',
5436
5437         'max_callers', 'int',  'NULL',      '',    '', '',
5438
5439         ###
5440         # old fields for unitel/RSLCOM/convergent that don't map to asterisk
5441         # ones we adoped moved to "own fields" section below
5442         # charged_party, upstream_price, rated_price, carrierid, cdrtypenum
5443         ###
5444
5445         'upstream_currency',      'char', 'NULL',       3, '', '',
5446         'upstream_rateplanid',     'int', 'NULL',      '', '', '', #?
5447
5448         # how it was rated internally...
5449         'ratedetailnum',           'int', 'NULL',      '', '', '',
5450
5451         'distance',            'decimal', 'NULL',      '', '', '',
5452         'islocal',                 'int', 'NULL',      '', '', '', # '',  '', 0, '' instead?
5453
5454         #cdr_calltype: the big list in appendix 2
5455         'calltypenum',             'int', 'NULL',      '', '', '',
5456
5457         'description',         'varchar', 'NULL', $char_d, '', '',
5458         'quantity',                'int', 'NULL',      '', '', '', 
5459
5460         'upstream_rateid',         'int', 'NULL',      '', '', '',
5461
5462         ###
5463         # more fields, for GSM imports
5464         ###
5465         'servicecode',             'int', 'NULL',      '', '', '',
5466         'quantity_able',           'int', 'NULL',      '', '', '', 
5467
5468         ###
5469         #and now for our own fields
5470         ###
5471
5472         'cdrtypenum',              'int', 'NULL',      '', '', '',
5473
5474         'charged_party',       'varchar', 'NULL', $char_d, '', '',
5475         'charged_party_imsi',  'varchar', 'NULL', $char_d, '', '',
5476
5477         'upstream_price',      'decimal', 'NULL',  '10,5', '', '', 
5478
5479         #currently only voipswitch
5480         #'upstream_rate',      'decimal', 'NULL',  '10,5', '', '', 
5481
5482         'upstream_src_regionname', 'varchar', 'NULL', $char_d, '', '',
5483         'upstream_dst_regionname', 'varchar', 'NULL', $char_d, '', '',
5484
5485         # how it was rated internally...
5486         'rated_pretty_dst',       'varchar', 'NULL', $char_d, '', '',
5487         'rated_regionname',       'varchar', 'NULL', $char_d, '', '',
5488         'rated_price',            'decimal', 'NULL',  '10,4', '', '',
5489         'rated_seconds',              'int', 'NULL',      '', '', '',
5490         'rated_minutes', 'double precision', 'NULL',      '', '', '',
5491         'rated_granularity',          'int', 'NULL',      '', '', '',
5492         'rated_ratedetailnum',        'int', 'NULL',      '', '', '',
5493         'rated_classnum',             'int', 'NULL',      '', '', '', 
5494         'rated_ratename',         'varchar', 'NULL', $char_d, '', '', 
5495         'rated_cost',            'decimal', 'NULL',  '10,4', '', '',
5496
5497         'carrierid',               'bigint', 'NULL',      '', '', '',
5498
5499         # service it was matched to
5500         'svcnum',             'int',   'NULL',     '',   '', '', 
5501
5502         #NULL, done (or something)
5503         'freesidestatus', 'varchar',   'NULL',     32,   '', '', 
5504
5505         #NULL, done (or something)
5506         'freesiderewritestatus', 'varchar',   'NULL',     32,   '', '', 
5507
5508         #an indexed place to put big numbers
5509         'cdrid',         'bigint',     'NULL',     '',  '', '', 
5510
5511         #for taqua accountcode rewriting, for starters
5512         'sessionnum',       'int',    'NULL',      '', '', '',
5513         'subscriber',   'varchar',    'NULL', $char_d, '', '',
5514
5515         #old
5516         'cdrbatch',     'varchar',    'NULL',     255, '', '',
5517         #new
5518         'cdrbatchnum',      'int',    'NULL',      '', '', '',
5519
5520         # FK to cust_bill_pkg_detail; having a value here absolutely means
5521         # that the CDR appears on an invoice
5522         'detailnum',     'bigint',    'NULL',      '', '', '',
5523       ],
5524       'primary_key' => 'acctid',
5525       'unique' => [],
5526       'index' => [ [ 'calldate' ],
5527                    [ 'src' ], [ 'dst' ], [ 'dcontext' ], [ 'charged_party' ],
5528                    [ 'lastapp' ],
5529                    ['accountcode'], ['uniqueid'], ['carrierid'], ['cdrid'],
5530                    [ 'sessionnum' ], [ 'subscriber' ],
5531                    [ 'freesidestatus' ], [ 'freesiderewritestatus' ],
5532                    [ 'cdrbatch' ], [ 'cdrbatchnum' ],
5533                    [ 'src_ip_addr' ], [ 'dst_ip_addr' ], [ 'dst_term' ],
5534                  ],
5535       #no FKs on cdr table... choosing not to throw errors no matter what's
5536       # thrown in here.  better to have the data.
5537     },
5538
5539     'cdr_batch' => {
5540       'columns' => [
5541         'cdrbatchnum',   'serial',    '',   '', '', '', 
5542         'cdrbatch', 'varchar', 'NULL', 255, '', '',
5543         '_date',     @date_type, '', '', 
5544       ],
5545       'primary_key' => 'cdrbatchnum',
5546       'unique' => [ [ 'cdrbatch' ] ],
5547       'index' => [],
5548     },
5549
5550     'cdr_termination' => {
5551       'columns' => [
5552         'cdrtermnum', 'bigserial',     '',      '', '', '',
5553         'acctid',        'bigint',     '',      '', '', '', 
5554         'termpart',         'int',     '',      '', '', '',#future use see below
5555         'rated_price',  'decimal', 'NULL',  '10,4', '', '',
5556         'rated_seconds',    'int', 'NULL',      '', '', '',
5557         'rated_minutes', 'double precision', 'NULL',   '', '', '',
5558         'status',       'varchar', 'NULL',      32, '', '',
5559         'svcnum',           'int', 'NULL',      '', '', '',
5560       ],
5561       'primary_key'  => 'cdrtermnum',
5562       'unique'       => [ [ 'acctid', 'termpart' ] ],
5563       'index'        => [ [ 'acctid' ], [ 'status' ], ],
5564       'foreign_keys' => [
5565                           { columns    => [ 'acctid' ],
5566                             table      => 'cdr',
5567                           },
5568                           { columns    => [ 'svcnum' ],
5569                             table      => 'cust_svc',
5570                           },
5571                         ],
5572     },
5573
5574     #to handle multiple termination/settlement passes...
5575    # 'part_termination' => {
5576    #   'columns' => [
5577    #     'termpart',       'int', '',      '', '', '',
5578    #     'termname',   'varchar', '', $char_d, '', '',
5579    #     'cdr_column', 'varchar', '', $char_d, '', '', #maybe set it here instead of in the price plan?
5580    #   ],
5581    #   'primary_key' => 'termpart',
5582    #   'unique' => [],
5583    #   'index'  => [],
5584    # },
5585
5586     #the remaining cdr_ tables are not really used
5587     'cdr_calltype' => {
5588       'columns' => [
5589         'calltypenum',   'serial',  '', '', '', '', 
5590         'calltypename',  'varchar', '', $char_d, '', '', 
5591       ],
5592       'primary_key' => 'calltypenum',
5593       'unique'      => [],
5594       'index'       => [],
5595     },
5596
5597     'cdr_type' => {
5598       'columns' => [
5599         'cdrtypenum'  => 'serial',  '', '', '', '',
5600         'cdrtypename' => 'varchar', '', $char_d, '', '',
5601       ],
5602       'primary_key' => 'cdrtypenum',
5603       'unique'      => [],
5604       'index'       => [],
5605     },
5606
5607     'cdr_carrier' => {
5608       'columns' => [
5609         'carrierid'   =>  'serial',     '',      '', '', '',
5610         'carriername' => 'varchar',     '', $char_d, '', '',
5611         'disabled'    =>    'char', 'NULL',       1, '', '', 
5612       ],
5613       'primary_key' => 'carrierid',
5614       'unique'      => [],
5615       'index'       => [],
5616     },
5617
5618     #'cdr_file' => {
5619     #  'columns' => [
5620     #    'filenum',    'serial',     '', '', '', '',
5621     #    'filename',  'varchar',     '', '', '', '',
5622     #    'status',    'varchar', 'NULL', '', '', '',
5623     #  ],
5624     #  'primary_key' => 'filenum',
5625     #  'unique' => [ [ 'filename' ], ], #just change the index if we need to
5626     #                                   # agent-virtualize or have a customer
5627     #                                   # with dup-filename needs or something
5628     #                                   # (only used by cdr.http_and_import for
5629     #                                   #  chrissakes)
5630     #  'index'  => [],
5631     #},
5632
5633     'inventory_item' => {
5634       'columns' => [
5635         'itemnum',   'serial',      '',      '', '', '',
5636         'classnum',  'int',         '',      '', '', '',
5637         'agentnum',  'int',     'NULL',      '', '', '',
5638         'item',      'varchar',     '', $char_d, '', '',
5639         'svcnum',    'int',     'NULL',      '', '', '',
5640         'svc_field', 'varchar', 'NULL', $char_d, '', '',
5641       ],
5642       'primary_key'  => 'itemnum',
5643       'unique'       => [ [ 'classnum', 'item' ] ],
5644       'index'        => [ [ 'classnum' ], [ 'agentnum' ], [ 'svcnum' ] ],
5645       'foreign_keys' => [
5646                           { columns    => [ 'classnum' ],
5647                             table      => 'inventory_class',
5648                           },
5649                           { columns    => [ 'agentnum' ],
5650                             table      => 'agent',
5651                           },
5652                           { columns    => [ 'svcnum' ],
5653                             table      => 'cust_svc',
5654                           },
5655                         ],
5656     },
5657
5658     'inventory_class' => {
5659       'columns' => [
5660         'classnum',  'serial',       '',      '', '', '',
5661         'classname', 'varchar',      '', $char_d, '', '',
5662       ],
5663       'primary_key' => 'classnum',
5664       'unique' => [],
5665       'index'  => [],
5666     },
5667
5668     'access_user_session' => {
5669       'columns' => [
5670         'sessionnum',   'serial',  '',      '', '', '', 
5671         'sessionkey',  'varchar',  '', $char_d, '', '',
5672         'usernum',         'int',  '',      '', '', '',
5673         'start_date', @date_type,               '', '',
5674         'last_date',  @date_type,               '', '',
5675       ],
5676       'primary_key'  => 'sessionnum',
5677       'unique'       => [ [ 'sessionkey' ] ],
5678       'index'        => [],
5679       'foreign_keys' => [
5680                           { columns    => [ 'usernum' ],
5681                             table      => 'access_user',
5682                           },
5683                         ],
5684     },
5685
5686     'access_user' => {
5687       'columns' => [
5688         'usernum',             'serial',     '',      '', '', '',
5689         'username',           'varchar',     '', $char_d, '', '',
5690         '_password',          'varchar', 'NULL', $char_d, '', '',
5691         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
5692         'last',               'varchar', 'NULL', $char_d, '', '', 
5693         'first',              'varchar', 'NULL', $char_d, '', '', 
5694         'user_custnum',           'int', 'NULL',      '', '', '',
5695         'report_salesnum',        'int', 'NULL',      '', '', '',
5696         'disabled',              'char', 'NULL',       1, '', '', 
5697       ],
5698       'primary_key'  => 'usernum',
5699       'unique'       => [ [ 'username' ] ],
5700       'index'        => [ [ 'user_custnum' ] ],
5701       'foreign_keys' => [
5702                           { columns    => [ 'user_custnum' ],
5703                             table      => 'cust_main',
5704                             references => [ 'custnum' ],
5705                           },
5706                           { columns    => [ 'report_salesnum' ],
5707                             table      => 'sales',
5708                             references => [ 'salesnum' ],
5709                           },
5710                         ],
5711     },
5712
5713     'access_user_pref' => {
5714       'columns' => [
5715         'prefnum',    'serial',       '', '', '', '',
5716         'usernum',     'int',       '', '', '', '',
5717         'prefname', 'varchar', '', $char_d, '', '', 
5718         'prefvalue', 'text', 'NULL', '', '', '', 
5719         'expiration', @date_type, '', '',
5720       ],
5721       'primary_key'  => 'prefnum',
5722       'unique'       => [],
5723       'index'        => [ [ 'usernum' ] ],
5724       'foreign_keys' => [
5725                           { columns    => [ 'usernum' ],
5726                             table      => 'access_user',
5727                           },
5728                         ],
5729     },
5730
5731     'access_group' => {
5732       'columns' => [
5733         'groupnum',   'serial', '',      '', '', '',
5734         'groupname', 'varchar', '', $char_d, '', '',
5735       ],
5736       'primary_key' => 'groupnum',
5737       'unique' => [ [ 'groupname' ] ],
5738       'index'  => [],
5739     },
5740
5741     'access_usergroup' => {
5742       'columns' => [
5743         'usergroupnum', 'serial', '', '', '', '',
5744         'usernum',         'int', '', '', '', '',
5745         'groupnum',        'int', '', '', '', '',
5746       ],
5747       'primary_key'  => 'usergroupnum',
5748       'unique'       => [ [ 'usernum', 'groupnum' ] ],
5749       'index'        => [ [ 'usernum' ] ],
5750       'foreign_keys' => [
5751                           { columns    => [ 'usernum' ],
5752                             table      => 'access_user',
5753                           },
5754                           { columns    => [ 'groupnum' ],
5755                             table      => 'access_group',
5756                           },
5757                         ],
5758      },
5759
5760     'access_groupagent' => {
5761       'columns' => [
5762         'groupagentnum', 'serial', '', '', '', '',
5763         'groupnum',         'int', '', '', '', '',
5764         'agentnum',         'int', '', '', '', '',
5765       ],
5766       'primary_key'  => 'groupagentnum',
5767       'unique'       => [ [ 'groupnum', 'agentnum' ] ],
5768       'index'        => [ [ 'groupnum' ] ],
5769       'foreign_keys' => [
5770                           { columns    => [ 'groupnum' ],
5771                             table      => 'access_group',
5772                           },
5773                           { columns    => [ 'agentnum' ],
5774                             table      => 'agent',
5775                           },
5776                         ],
5777     },
5778
5779     'access_right' => {
5780       'columns' => [
5781         'rightnum',   'serial', '',      '', '', '',
5782         'righttype', 'varchar', '', $char_d, '', '',
5783         'rightobjnum',   'int', '',      '', '', '',
5784         'rightname', 'varchar', '', $char_d, '', '',
5785       ],
5786       'primary_key' => 'rightnum',
5787       'unique' => [ [ 'righttype', 'rightobjnum', 'rightname' ] ],
5788       'index'  => [],
5789     },
5790
5791     'access_user_log' => {
5792       'columns'      => [
5793         'lognum',  'serial', '',        '', '', '',
5794         'usernum',    'int', '',        '', '', '',
5795         'path',   'varchar', '', 2*$char_d, '', '',
5796         '_date',         @date_type,        '', '',
5797       ],
5798       'primary_key'  => 'lognum',
5799       'unique'       => [],
5800       'index'        => [ ['usernum'], ['path'], ['_date'] ],
5801     },
5802
5803     'sched_item' => {
5804       'columns' => [
5805         'itemnum',   'serial',      '', '', '', '', 
5806         'usernum',      'int',  'NULL', '', '', '', 
5807         #'itemname', 'varchar', $char_d, '', '', '',
5808         'disabled',    'char',  'NULL',  1, '', '', 
5809       ],
5810       'primary_key'  => 'itemnum',
5811       'unique'       => [ [ 'usernum' ] ],
5812       'index'        => [],
5813       'foreign_keys' => [
5814                           { columns    => [ 'usernum' ],
5815                             table      => 'access_user',
5816                           },
5817                         ],
5818     },
5819
5820     #'sched_item_class'
5821
5822     'sched_avail' => {
5823       'columns' => [
5824         'availnum',      'serial', '', '', '', '', 
5825         'itemnum',          'int', '', '', '', '',
5826         'wday',             'int', '', '', '', '',
5827         'stime',            'int', '', '', '', '',
5828         'etime',            'int', '', '', '', '',
5829         'override_date',    @date_type,    '', '',
5830       ],
5831       'primary_key'  => 'availnum',
5832       'unique'       => [],
5833       'index'        => [],
5834       'foreign_keys' => [
5835                           { columns    => [ 'itemnum' ],
5836                             table      => 'sched_item',
5837                           },
5838                         ],
5839     },
5840
5841     'svc_phone' => {
5842       'columns' => [
5843         'svcnum',                         'int',     '',      '', '', '', 
5844         'countrycode',                'varchar',     '',       3, '', '', 
5845         'phonenum',                   'varchar',     '',      25, '', '', #12 ?
5846         'sim_imsi',                   'varchar', 'NULL',      15, '', '',
5847         'pin',                        'varchar', 'NULL', $char_d, '', '',
5848         'sip_password',               'varchar', 'NULL', $char_d, '', '',
5849         'phone_name',                 'varchar', 'NULL', $char_d, '', '',
5850         'pbxsvc',                         'int', 'NULL',      '', '', '',
5851         'domsvc',                         'int', 'NULL',      '', '', '', 
5852         'locationnum',                    'int', 'NULL',      '', '', '',
5853         'forwarddst',                 'varchar', 'NULL',      15, '', '', 
5854         'email',                      'varchar', 'NULL',     255, '', '', 
5855         'lnp_status',                 'varchar', 'NULL', $char_d, '', '',
5856         'portable',                      'char', 'NULL',       1, '', '', 
5857         'lrn',                           'char', 'NULL',      10, '', '', 
5858         'lnp_desired_due_date',           'int', 'NULL',      '', '', '',
5859         'lnp_due_date',                   'int', 'NULL',      '', '', '',
5860         'lnp_other_provider',         'varchar', 'NULL', $char_d, '', '',
5861         'lnp_other_provider_account', 'varchar', 'NULL', $char_d, '', '',
5862         'lnp_reject_reason',          'varchar', 'NULL', $char_d, '', '',
5863         'sms_carrierid',                  'int', 'NULL',      '', '', '',
5864         'sms_account',                'varchar', 'NULL', $char_d, '', '',
5865         'max_simultaneous',               'int', 'NULL',      '', '', '',
5866         'e911_class',                    'char', 'NULL',       1, '', '',
5867         'e911_type',                     'char', 'NULL',       1, '', '', 
5868         'circuit_svcnum',                 'int', 'NULL',      '', '', '',
5869         'sip_server',                 'varchar', 'NULL', $char_d, '', '',
5870       ],
5871       'primary_key'  => 'svcnum',
5872       'unique'       => [ [ 'sms_carrierid', 'sms_account'] ],
5873       'index'        => [ ['countrycode', 'phonenum'], ['pbxsvc'], ['domsvc'],
5874                           ['locationnum'], ['sms_carrierid'],
5875                         ],
5876       'foreign_keys' => [
5877                           { columns    => [ 'svcnum' ],
5878                             table      => 'cust_svc',
5879                           },
5880                           { columns    => [ 'pbxsvc' ],
5881                             table      => 'svc_pbx', #'cust_svc',
5882                             references => [ 'svcnum' ],
5883                           },
5884                           { columns    => [ 'domsvc' ],
5885                             table      => 'svc_domain', #'cust_svc',
5886                             references => [ 'svcnum' ],
5887                           },
5888                           { columns    => [ 'locationnum' ],
5889                             table      => 'cust_location',
5890                           },
5891                           { columns    => [ 'sms_carrierid' ],
5892                             table      => 'cdr_carrier',
5893                             references => [ 'carrierid' ],
5894                           },
5895                           { columns    => [ 'circuit_svcnum' ],
5896                             table      => 'svc_circuit',
5897                             references => [ 'svcnum' ],
5898                           },
5899                         ],
5900     },
5901
5902     'phone_device' => {
5903       'columns' => [
5904         'devicenum', 'serial',     '', '', '', '',
5905         'devicepart',   'int',     '', '', '', '',
5906         'svcnum',       'int',     '', '', '', '', 
5907         'mac_addr', 'varchar', 'NULL', 12, '', '', 
5908       ],
5909       'primary_key'  => 'devicenum',
5910       'unique'       => [ [ 'mac_addr' ], ],
5911       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
5912       'foreign_keys' => [
5913                           { columns    => [ 'devicepart' ],
5914                             table      => 'part_device',
5915                           },
5916                           { columns    => [ 'svcnum' ],
5917                             table      => 'svc_phone',
5918                           },
5919                         ],
5920     },
5921
5922     'part_device' => {
5923       'columns' => [
5924         'devicepart', 'serial',  '',      '', '', '',
5925         'devicename', 'varchar', '', $char_d, '', '',
5926         'inventory_classnum', 'int', 'NULL', '', '', '',
5927         'title',      'varchar', 'NULL', $char_d, '', '',
5928       ],
5929       'primary_key'  => 'devicepart',
5930       'unique'       => [ [ 'devicename' ] ], #?
5931       'index'        => [],
5932       'foreign_keys' => [
5933                           { columns    => [ 'inventory_classnum' ],
5934                             table      => 'inventory_class',
5935                             references => [ 'classnum' ],
5936                           },
5937                         ],
5938     },
5939
5940     'phone_avail' => {
5941       'columns' => [
5942         'availnum',    'serial',      '',      '', '', '', 
5943         'exportnum',   'int',         '',      '', '', '', 
5944         'countrycode', 'varchar',     '',       3, '', '', 
5945         'state',       'char',    'NULL',       2, '', '', 
5946         'npa',         'char',        '',       3, '', '', 
5947         'nxx',         'char',    'NULL',       3, '', '', 
5948         'station',     'char',    'NULL',       4, '', '',
5949         'name',        'varchar', 'NULL', $char_d, '', '',
5950         'rate_center_abbrev', 'varchar', 'NULL', $char_d, '', '',
5951         'latanum',      'int',     'NULL',      '', '', '',
5952         'msanum',       'int', 'NULL', '', '', '',
5953         'ordernum',      'int',     'NULL',      '', '', '',
5954         'svcnum',      'int',     'NULL',      '', '', '',
5955         'availbatch', 'varchar',  'NULL', $char_d, '', '',
5956       ],
5957       'primary_key'  => 'availnum',
5958       'unique'       => [],
5959       'index'        => [ ['exportnum','countrycode','state'],    #npa search
5960                           ['exportnum','countrycode','npa'],      #nxx search
5961                           ['exportnum','countrycode','npa','nxx'],#station srch
5962                           [ 'exportnum','countrycode','npa','nxx','station'], #
5963                           [ 'svcnum' ],
5964                           [ 'availbatch' ],
5965                           [ 'latanum' ],
5966                         ],
5967       'foreign_keys' => [
5968                           { columns    => [ 'exportnum' ],
5969                             table      => 'part_export',
5970                           },
5971                           { columns    => [ 'latanum' ],
5972                             table      => 'lata',
5973                           },
5974                           { columns    => [ 'msanum' ],
5975                             table      => 'msa',
5976                           },
5977                           { columns    => [ 'ordernum' ],
5978                             table      => 'did_order',
5979                           },
5980                           { columns    => [ 'svcnum' ],
5981                             table      => 'svc_phone',
5982                           },
5983                         ],
5984     },
5985
5986     'lata' => {
5987       'columns' => [
5988         'latanum',    'int',      '',      '', '', '', 
5989         'description',   'varchar',    '',      $char_d, '', '', 
5990         'have_usage',   'int',    'NULL',      '', '', '', 
5991       ],
5992       'primary_key' => 'latanum',
5993       'unique' => [],
5994       'index'  => [],
5995     },
5996
5997     'msa' => {
5998       'columns' => [
5999         'msanum',    'int',      '',      '', '', '', 
6000         'description',   'varchar',    '',      $char_d, '', '', 
6001       ],
6002       'primary_key' => 'msanum',
6003       'unique' => [],
6004       'index'  => [],
6005     },
6006
6007     'rate_center' => {
6008       'columns' => [
6009         'ratecenternum',    'serial',      '',      '', '', '', 
6010         'description',   'varchar',    '',      $char_d, '', '', 
6011       ],
6012       'primary_key' => 'ratecenternum',
6013       'unique' => [],
6014       'index'  => [],
6015     },
6016
6017     'did_vendor' => {
6018       'columns' => [
6019         'vendornum',    'serial',      '',      '', '', '', 
6020         'vendorname',   'varchar',        '',     $char_d, '', '', 
6021       ],
6022       'primary_key' => 'vendornum',
6023       'unique' => [],
6024       'index'  => [],
6025     },
6026
6027     'did_order_item' => {
6028       'columns' => [
6029         'orderitemnum',    'serial',      '',      '', '', '', 
6030         'ordernum',    'int',      '',      '', '', '', 
6031         'msanum',      'int',     'NULL',      '', '', '',
6032         'npa',      'int',     'NULL',      '', '', '',
6033         'latanum',      'int',     'NULL',      '', '', '',
6034         'ratecenternum',      'int',     'NULL',      '', '', '',
6035         'state',       'char',    'NULL',       2, '', '', 
6036         'quantity',      'int',     '',      '', '', '',
6037         'custnum',   'int', 'NULL', '', '', '',
6038       ],
6039       'primary_key'  => 'orderitemnum',
6040       'unique'       => [],
6041       'index'        => [],
6042       'foreign_keys' => [
6043                           { columns    => [ 'ordernum' ],
6044                             table      => 'did_order',
6045                           },
6046                           { columns    => [ 'msanum' ],
6047                             table      => 'msa',
6048                           },
6049                           { columns    => [ 'latanum' ],
6050                             table      => 'lata',
6051                           },
6052                           { columns    => [ 'ratecenternum' ],
6053                             table      => 'rate_center',
6054                           },
6055                           { columns    => [ 'custnum' ],
6056                             table      => 'cust_main',
6057                           },
6058                         ],
6059     },
6060
6061     'did_order' => {
6062       'columns' => [
6063         'ordernum',    'serial',      '',      '', '', '', 
6064         'vendornum',   'int',       '',      '', '', '', 
6065         'vendor_order_id',   'varchar',  'NULL',   $char_d, '', '', 
6066         'custnum',   'int', 'NULL', '', '', '',
6067         'submitted',      'int',     '',      '', '', '',
6068         'confirmed',      'int',     'NULL',      '', '', '',
6069         'received',      'int',     'NULL',      '', '', '',
6070       ],
6071       'primary_key'  => 'ordernum',
6072       'unique'       => [ [ 'vendornum', 'vendor_order_id' ] ],
6073       'index'        => [],
6074       'foreign_keys' => [
6075                           { columns    => [ 'vendornum' ],
6076                             table      => 'did_vendor',
6077                           },
6078                           { columns    => [ 'custnum' ],
6079                             table      => 'cust_main',
6080                           },
6081                         ],
6082     },
6083
6084     'reason_type' => {
6085       'columns' => [
6086         'typenum',   'serial',  '', '', '', '', 
6087         'class',     'char', '', 1, '', '', 
6088         'type',     'varchar', '', $char_d, '', '', 
6089       ],
6090       'primary_key' => 'typenum',
6091       'unique' => [],
6092       'index' => [],
6093     },
6094
6095     'reason' => {
6096       'columns' => [
6097         'reasonnum',     'serial',  '', '', '', '', 
6098         'reason_type',   'int',  '', '', '', '', 
6099         'reason',        'text', '', '', '', '', 
6100         'disabled',      'char',    'NULL', 1, '', '', 
6101         'unsuspend_pkgpart', 'int',  'NULL', '', '', '',
6102         'unsuspend_hold','char',    'NULL', 1, '', '',
6103         'unused_credit', 'char',    'NULL', 1, '', '',
6104         'feepart',        'int', 'NULL', '', '', '',
6105         'fee_on_unsuspend','char',  'NULL', 1, '', '',
6106         'fee_hold',      'char',    'NULL', 1, '', '',
6107       ],
6108       'primary_key'  => 'reasonnum',
6109       'unique'       => [],
6110       'index'        => [],
6111       'foreign_keys' => [
6112                           { columns    => [ 'reason_type' ],
6113                             table      => 'reason_type',
6114                             references => [ 'typenum' ],
6115                           },
6116                           { columns    => [ 'unsuspend_pkgpart' ],
6117                             table      => 'part_pkg',
6118                             references => [ 'pkgpart' ],
6119                           },
6120                         ],
6121     },
6122
6123     'conf' => {
6124       'columns' => [
6125         'confnum',  'serial',     '',      '', '', '', 
6126         'agentnum', 'int',    'NULL',      '', '', '', 
6127         'locale',   'varchar','NULL',      16, '', '',
6128         'name',     'varchar',    '', $char_d, '', '', 
6129         'value',    'text',   'NULL',      '', '', '',
6130       ],
6131       'primary_key'  => 'confnum',
6132       'unique'       => [ [ 'agentnum', 'locale', 'name' ] ],
6133       'index'        => [],
6134       'foreign_keys' => [
6135                           { columns    => [ 'agentnum' ],
6136                             table      => 'agent',
6137                           },
6138                         ],
6139     },
6140
6141     'pkg_referral' => {
6142       'columns' => [
6143         'pkgrefnum',     'serial', '', '', '', '',
6144         'pkgnum',        'int',    '', '', '', '',
6145         'refnum',        'int',    '', '', '', '',
6146       ],
6147       'primary_key'  => 'pkgrefnum',
6148       'unique'       => [ [ 'pkgnum', 'refnum' ] ],
6149       'index'        => [ [ 'pkgnum' ], [ 'refnum' ] ],
6150       'foreign_keys' => [
6151                           { columns    => [ 'pkgnum' ],
6152                             table      => 'cust_pkg',
6153                           },
6154                           { columns    => [ 'refnum' ],
6155                             table      => 'part_referral',
6156                           },
6157                         ],
6158     },
6159
6160     'svc_pbx' => {
6161       'columns' => [
6162         'svcnum',           'int',     '',      '', '', '', 
6163         'id',               'int', 'NULL',      '', '', '', 
6164         'uuid',            'char', 'NULL',      36, '', '',
6165         'title',        'varchar', 'NULL', $char_d, '', '', 
6166         'max_extensions',   'int', 'NULL',      '', '', '',
6167         'max_simultaneous', 'int', 'NULL',      '', '', '',
6168         'ip_addr',      'varchar', 'NULL',      40, '', '',
6169       ],
6170       'primary_key'  => 'svcnum',
6171       'unique'       => [],
6172       'index'        => [ [ 'id' ], [ 'uuid' ] ],
6173       'foreign_keys' => [
6174                           { columns    => [ 'svcnum' ],
6175                             table      => 'cust_svc',
6176                           },
6177                         ],
6178     },
6179
6180     'pbx_extension' => {
6181       'columns' => [
6182         'extensionnum',  'serial',     '',      '', '', '',
6183         'svcnum',           'int',     '',      '', '', '',
6184         'extension',    'varchar',     '', $char_d, '', '',
6185         'pin',          'varchar', 'NULL', $char_d, '', '',
6186         'sip_password', 'varchar', 'NULL', $char_d, '', '',
6187         'phone_name',   'varchar', 'NULL', $char_d, '', '',
6188       ],
6189       'primary_key'  => 'extensionnum',
6190       'unique'       => [ [ 'svcnum', 'extension' ] ],
6191       'index'        => [ [ 'svcnum' ] ],
6192       'foreign_keys' => [
6193                           { columns    => [ 'svcnum' ],
6194                             table      => 'svc_pbx',
6195                           },
6196                         ],
6197     },
6198
6199     'pbx_device' => {
6200       'columns' => [
6201         'devicenum', 'serial',     '', '', '', '',
6202         'devicepart',   'int',     '', '', '', '',
6203         'svcnum',       'int',     '', '', '', '', 
6204         'mac_addr', 'varchar', 'NULL', 12, '', '', 
6205       ],
6206       'primary_key'  => 'devicenum',
6207       'unique'       => [ [ 'mac_addr' ], ],
6208       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
6209       'foreign_keys' => [
6210                           { columns    => [ 'devicepart' ],
6211                             table      => 'part_device',
6212                           },
6213                           { columns    => [ 'svcnum' ],
6214                             table      => 'svc_pbx',
6215                           },
6216                         ],
6217     },
6218
6219     'extension_device' => {
6220       'columns' => [
6221         'extensiondevicenum', 'serial', '', '', '', '',
6222         'extensionnum',          'int', '', '', '', '',
6223         'devicenum',             'int', '', '', '', '',
6224       ],
6225       'primary_key'  => 'extensiondevicenum',
6226       'unique'       => [ [ 'extensionnum', 'devicenum' ] ],
6227       'index'        => [],#both?  which way do we need to query?
6228       'foreign_keys' => [
6229                           { columns  => [ 'extensionnum' ],
6230                             table    => 'pbx_extension',
6231                           },
6232                           { columns  => [ 'devicenum' ],
6233                             table    => 'pbx_device',
6234                           },
6235                         ],
6236     },
6237
6238     'svc_mailinglist' => { #svc_group?
6239       'columns' => [
6240         'svcnum',            'int',     '',            '', '', '', 
6241         'username',      'varchar',     '', $username_len, '', '',
6242         'domsvc',            'int',     '',            '', '', '', 
6243         'listnum',           'int',     '',            '', '', '',
6244         'reply_to',         'char', 'NULL',             1, '', '',#SetReplyTo
6245         'remove_from',      'char', 'NULL',             1, '', '',#RemoveAuthor
6246         'reject_auto',      'char', 'NULL',             1, '', '',#RejectAuto
6247         'remove_to_and_cc', 'char', 'NULL',             1, '', '',#RemoveToAndCc
6248       ],
6249       'primary_key'  => 'svcnum',
6250       'unique'       => [],
6251       'index'        => [ ['username'], ['domsvc'], ['listnum'] ],
6252       'foreign_keys' => [
6253                           { columns    => [ 'svcnum' ],
6254                             table      => 'cust_svc',
6255                           },
6256                           { columns    => [ 'domsvc' ],
6257                             table      => 'svc_domain', #'cust_svc',
6258                             references => [ 'svcnum' ],
6259                           },
6260                           { columns    => [ 'listnum' ],
6261                             table      => 'mailinglist',
6262                           },
6263                         ],
6264     },
6265
6266     'mailinglist' => {
6267       'columns' => [
6268         'listnum',   'serial', '',      '', '', '',
6269         'listname', 'varchar', '', $char_d, '', '',
6270       ],
6271       'primary_key' => 'listnum',
6272       'unique' => [],
6273       'index'  => [],
6274     },
6275
6276     'mailinglistmember' => {
6277       'columns' => [
6278         'membernum',        'serial',     '',   '', '', '',
6279         'listnum',             'int',     '',   '', '', '',
6280         'svcnum',              'int', 'NULL',   '', '', '', 
6281         'contactemailnum',     'int', 'NULL',   '', '', '', 
6282         'email',           'varchar', 'NULL',  255, '', '', 
6283       ],
6284       'primary_key'  => 'membernum',
6285       'unique'       => [],
6286       'index'        => [['listnum'],['svcnum'],['contactemailnum'],['email']],
6287       'foreign_keys' => [
6288                           { columns    => [ 'listnum' ],
6289                             table      => 'mailinglist',
6290                           },
6291                           { columns    => [ 'svcnum' ],
6292                             table      => 'svc_acct',
6293                           },
6294                           { columns    => [ 'contactemailnum' ],
6295                             table      => 'contact_email',
6296                           },
6297                         ],
6298     },
6299
6300     'bill_batch' => {
6301       'columns' => [
6302         'batchnum',         'serial',     '',  '', '', '',
6303         'agentnum',            'int', 'NULL',  '', '', '',
6304         'status',             'char', 'NULL', '1', '', '',
6305         'pdf',                'blob', 'NULL',  '', '', '',
6306       ],
6307       'primary_key'  => 'batchnum',
6308       'unique'       => [],
6309       'index'        => [ ['agentnum'] ],
6310       'foreign_keys' => [
6311                           { columns    => [ 'agentnum' ],
6312                             table      => 'agent',
6313                           },
6314                         ],
6315     },
6316
6317     'cust_bill_batch' => {
6318       'columns' => [
6319         'billbatchnum',     'serial',     '', '', '', '',
6320         'batchnum',            'int',     '', '', '', '',
6321         'invnum',              'int',     '', '', '', '',
6322       ],
6323       'primary_key'  => 'billbatchnum',
6324       'unique'       => [],
6325       'index'        => [ [ 'batchnum' ], [ 'invnum' ] ],
6326       'foreign_keys' => [
6327                           { columns    => [ 'batchnum' ],
6328                             table      => 'bill_batch',
6329                           },
6330                           { columns    => [ 'invnum' ],
6331                             table      => 'cust_bill',
6332                           },
6333                         ],
6334     },
6335
6336     'cust_bill_batch_option' => {
6337       'columns' => [
6338         'optionnum', 'serial', '', '', '', '', 
6339         'billbatchnum', 'int', '', '', '', '', 
6340         'optionname', 'varchar', '', $char_d, '', '', 
6341         'optionvalue', 'text', 'NULL', '', '', '', 
6342       ],
6343       'primary_key'  => 'optionnum',
6344       'unique'       => [],
6345       'index'        => [ [ 'billbatchnum' ], [ 'optionname' ] ],
6346       'foreign_keys' => [
6347                           { columns    => [ 'billbatchnum' ],
6348                             table      => 'cust_bill_batch',
6349                           },
6350                         ],
6351      },
6352
6353     'msg_template' => {
6354       'columns' => [
6355         'msgnum',     'serial',     '',      '', '', '',
6356         'msgname',   'varchar',     '', $char_d, '', '',
6357         'agentnum',      'int', 'NULL',      '', '', '',
6358         'subject',   'varchar', 'NULL',     512, '', '',
6359         'mime_type', 'varchar',     '', $char_d, '', '',
6360         'body',         'blob', 'NULL',      '', '', '',
6361         'disabled',     'char', 'NULL',       1, '', '', 
6362           # migrate these to msg_template_email
6363         'from_addr', 'varchar', 'NULL',     255, '', '',
6364         'bcc_addr',  'varchar', 'NULL',     255, '', '',
6365           # change to not null on v5
6366         'msgclass',  'varchar', 'NULL',      16, '', '',
6367       ],
6368       'primary_key'  => 'msgnum',
6369       'unique'       => [ ],
6370       'index'        => [ ['agentnum'], ],
6371       'foreign_keys' => [
6372                           { columns    => [ 'agentnum' ],
6373                             table      => 'agent',
6374                           },
6375                         ],
6376     },
6377
6378     'msg_template_http' => {
6379       'columns' => [
6380         'num',          'serial',     '',      '', '', '',
6381         'msgnum',          'int',     '',      '', '', '',
6382         'prepare_url', 'varchar', 'NULL',     255, '', '',
6383         'send_url',    'varchar', 'NULL',     255, '', '',
6384         'username',    'varchar', 'NULL', $char_d, '', '',
6385         'password',    'varchar', 'NULL', $char_d, '', '',
6386         'content',        'text', 'NULL',      '', '', '',
6387       ],
6388       'primary_key'  => 'num',
6389       'unique'       => [ [ 'msgnum' ], ],
6390       'index'        => [ ],
6391       'foreign_keys' => [
6392                           { columns    => [ 'msgnum' ],
6393                             table      => 'msg_template',
6394                           },
6395                         ],
6396     },
6397
6398     'template_content' => {
6399       'columns' => [
6400         'contentnum', 'serial',     '',      '', '', '',
6401         'msgnum',        'int',     '',      '', '', '',
6402         'locale',    'varchar', 'NULL',      16, '', '',
6403         'subject',   'varchar', 'NULL',     512, '', '',
6404         'body',         'text', 'NULL',      '', '', '',
6405       ],
6406       'primary_key'  => 'contentnum',
6407       'unique'       => [ ['msgnum', 'locale'] ],
6408       'index'        => [ ],
6409       'foreign_keys' => [
6410                           { columns    => [ 'msgnum' ],
6411                             table      => 'msg_template',
6412                           },
6413                         ],
6414     },
6415
6416     'template_image' => {
6417       'columns' => [
6418         'imgnum',     'serial',     '',      '', '', '',
6419         'name',      'varchar',     '', $char_d, '', '',
6420         'agentnum',      'int', 'NULL',      '', '', '',
6421         'mime_type', 'varchar',     '', $char_d, '', '',
6422         'base64',       'text',     '',      '', '', '',
6423       ],
6424       'primary_key'  => 'imgnum',
6425       'unique'       => [ ],
6426       'index'        => [ ['name'], ['agentnum'] ],
6427     },
6428
6429     'cust_msg' => {
6430       'columns' => [
6431         'custmsgnum', 'serial',     '',     '', '', '',
6432         'custnum',       'int', 'NULL',     '', '', '',
6433         'msgnum',        'int', 'NULL',     '', '', '',
6434         '_date',    @date_type,                 '', '',
6435         'env_from',  'varchar', 'NULL',    255, '', '',
6436         'env_to',    'varchar', 'NULL',    255, '', '',
6437         'header',       'blob', 'NULL',     '', '', '',
6438         'body',         'blob', 'NULL',     '', '', '',
6439         'error',     'varchar', 'NULL',    255, '', '',
6440         'status',    'varchar',     '',$char_d, '', '',
6441         'msgtype',   'varchar', 'NULL',     16, '', '',
6442         'preview',      'text', 'NULL',     '', '', '',
6443       ],
6444       'primary_key'  => 'custmsgnum',
6445       'unique'       => [ ],
6446       'index'        => [ ['custnum'], ],
6447       'foreign_keys' => [
6448                           { columns    => [ 'custnum' ],
6449                             table      => 'cust_main',
6450                           },
6451                           { columns    => [ 'msgnum' ],
6452                             table      => 'msg_template',
6453                           },
6454                         ],
6455     },
6456
6457     'svc_cert' => {
6458       'columns' => [
6459         'svcnum',                'int',     '',      '', '', '', 
6460         'recnum',                'int', 'NULL',      '', '', '',
6461         'privatekey',           'text', 'NULL',      '', '', '',
6462         'csr',                  'text', 'NULL',      '', '', '',
6463         'certificate',          'text', 'NULL',      '', '', '',
6464         'cacert',               'text', 'NULL',      '', '', '',
6465         'common_name',       'varchar', 'NULL', $char_d, '', '',
6466         'organization',      'varchar', 'NULL', $char_d, '', '',
6467         'organization_unit', 'varchar', 'NULL', $char_d, '', '',
6468         'city',              'varchar', 'NULL', $char_d, '', '',
6469         'state',             'varchar', 'NULL', $char_d, '', '',
6470         'country',              'char', 'NULL',       2, '', '',
6471         'cert_contact',      'varchar', 'NULL', $char_d, '', '',
6472       ],
6473       'primary_key'  => 'svcnum',
6474       'unique'       => [],
6475       'index'        => [], #recnum
6476       'foreign_keys' => [
6477                           { columns    => [ 'svcnum' ],
6478                             table      => 'cust_svc',
6479                           },
6480                           { columns    => [ 'recnum' ],
6481                             table      => 'domain_record',
6482                           },
6483                         ],
6484     },
6485
6486     'svc_port' => {
6487       'columns' => [
6488         'svcnum',                'int',     '',      '', '', '', 
6489         'serviceid', 'varchar', '', 64, '', '', #srvexport / reportfields
6490       ],
6491       'primary_key'  => 'svcnum',
6492       'unique'       => [],
6493       'index'        => [], #recnum
6494       'foreign_keys' => [
6495                           { columns    => [ 'svcnum' ],
6496                             table      => 'cust_svc',
6497                           },
6498                         ],
6499     },
6500
6501     'areacode'  => {
6502       'columns' => [
6503         'areanum',   'serial',        '',      '', '', '',
6504         'code',        'char',        '',       3, '', '', 
6505         'country',     'char',    'NULL',       2, '', '',
6506         'state',       'char',    'NULL',       2, '', '', 
6507         'description','varchar',  'NULL',     255, '', '',
6508       ], 
6509       'primary_key' => 'areanum',
6510       'unique' => [ [ 'areanum' ] ],
6511       'index'  => [],
6512     },
6513
6514     'upgrade_journal' => {
6515       'columns' => [
6516         'upgradenum', 'serial', '', '', '', '',
6517         '_date', 'int', '', '', '', '',
6518         'upgrade', 'varchar', '', $char_d, '', '',
6519         'status', 'varchar', '', $char_d, '', '',
6520         'statustext', 'varchar', 'NULL', $char_d, '', '',
6521       ],
6522       'primary_key' => 'upgradenum',
6523       'unique' => [],
6524       'index' => [ [ 'upgrade' ] ],
6525     },
6526
6527     'upload_target' => {
6528       'columns' => [
6529         'targetnum', 'serial', '', '', '', '',
6530         'agentnum', 'int', 'NULL', '', '', '',
6531         'protocol', 'varchar', '', 10, '', '',
6532         'hostname', 'varchar', '', $char_d, '', '',
6533         'port', 'int', 'NULL', '', '', '',
6534         'username', 'varchar', '', $char_d, '', '',
6535         'password', 'varchar', 'NULL', $char_d, '', '',
6536         'path', 'varchar', 'NULL', $char_d, '', '',
6537         'subject', 'varchar', 'NULL', '255', '', '',
6538         'handling', 'varchar', 'NULL', $char_d, '', '',
6539       ],
6540       'primary_key'   => 'targetnum',
6541       'unique'        => [ [ 'targetnum' ] ],
6542       'index'         => [],
6543       'foreign_keys' => [
6544                           { columns    => [ 'agentnum' ],
6545                             table      => 'agent',
6546                           },
6547                         ],
6548     },
6549
6550     'log' => {
6551       'columns' => [
6552         'lognum',     'serial', '', '', '', '',
6553         '_date',      'int', '', '', '', '',
6554         'agentnum',   'int', 'NULL', '', '', '',
6555         'tablename',  'varchar', 'NULL', $char_d, '', '',
6556         'tablenum',   'int',  'NULL', '', '', '', 
6557         'level',      'int',  '', '', '', '',
6558         'message',    'text', '', '', '', '',
6559       ],
6560       'primary_key'  => 'lognum',
6561       'unique'       => [],
6562       'index'        => [ ['_date'], ['level'] ],
6563       'foreign_keys' => [
6564                           { columns    => [ 'agentnum' ],
6565                             table      => 'agent',
6566                           },
6567                         ],
6568     },
6569
6570     'log_context' => {
6571       'columns' => [
6572         'logcontextnum', 'serial', '', '', '', '',
6573         'lognum', 'int', '', '', '', '',
6574         'context', 'varchar', '', $char_d, '', '',
6575       ],
6576       'primary_key'  => 'logcontextnum',
6577       'unique'       => [ [ 'lognum', 'context' ] ],
6578       'index'        => [],
6579       'foreign_keys' => [
6580                           { columns    => [ 'lognum' ],
6581                             table      => 'log',
6582                           },
6583                         ],
6584     },
6585
6586     'log_email' => {
6587       'columns' => [
6588         'logemailnum', 'serial', '', '', '', '',
6589         'context', 'varchar', 'NULL', $char_d, '', '',
6590         'min_level', 'int',  'NULL', '', '', '',
6591         'msgnum', 'int', '',  '', '', '',
6592         'to_addr', 'varchar', 'NULL',     255, '', '',
6593       ],
6594       'primary_key'  => 'logemailnum',
6595       'unique'       => [],
6596       'index'        => [ ['context'], ['min_level'] ],
6597       'foreign_keys' => [
6598                           { columns    => [ 'msgnum' ],
6599                             table      => 'msg_template',
6600                             references => [ 'msgnum' ],
6601                           },
6602                         ],
6603     },
6604
6605     'svc_alarm' => {
6606       'columns' => [
6607 #       name               type        null   length   default local
6608         'svcnum',          'int',      '',    '',      '',     '', 
6609         'alarmsystemnum',  'int',      '',    '',      '',     '',
6610         'alarmtypenum',    'int',      '',    '',      '',     '',
6611         'alarmstationnum', 'int',      '',    '',      '',     '',
6612         'acctnum',         'varchar',  '',    $char_d, '',     '',
6613         '_password',       'varchar',  '',    $char_d, '',     '',
6614         'location',        'varchar', 'NULL', $char_d, '',     '',
6615         'cs_receiver',     'int',     'NULL', '',      '',     '',
6616         'cs_phonenum',     'varchar', 'NULL', $char_d, '',     '',
6617         'serialnum',       'varchar', 'NULL', $char_d, '',     '',
6618         #installer (rep)
6619       ],
6620       'primary_key'  => 'svcnum',
6621       'unique'       => [],
6622       'index'        => [],
6623       'foreign_keys' => [
6624                           { columns    => [ 'svcnum' ],
6625                             table      => 'cust_svc',
6626                           },
6627                           { columns    => [ 'alarmsystemnum' ],
6628                             table      => 'alarm_system',
6629                           },
6630                           { columns    => [ 'alarmtypenum' ],
6631                             table      => 'alarm_type',
6632                           },
6633                           { columns    => [ 'alarmstationnum' ],
6634                             table      => 'alarm_station',
6635                           },
6636                         ],
6637     },
6638
6639     'alarm_system' => { #vendors
6640       'columns' => [
6641         'alarmsystemnum',  'serial',     '',      '', '', '',
6642         'agentnum',           'int', 'NULL',      '', '', '',
6643         'systemname',     'varchar',     '', $char_d, '', '',
6644         'disabled',          'char', 'NULL',       1, '', '', 
6645       ],
6646       'primary_key' => 'alarmsystemnum',
6647       'unique'      => [ ['agentnum', 'systemname'] ],
6648       'index'       => [ ['agentnum'], ['disabled'] ],
6649       'foreign_keys' => [
6650                           { columns    => [ 'agentnum' ],
6651                             table      => 'agent',
6652                           },
6653                         ],
6654     },
6655
6656     'alarm_type' => { #inputs and outputs
6657       'columns' => [
6658         'alarmtypenum', 'serial',     '',      '', '', '',
6659         'agentnum',        'int', 'NULL',      '', '', '',
6660         'inputs',          'int',     '', '', '', '',
6661         'outputs',         'int',     '', '', '', '',
6662         'disabled',       'char', 'NULL',       1, '', '', 
6663       ],
6664       'primary_key' => 'alarmtypenum',
6665       'unique'      => [ ['agentnum', 'inputs', 'outputs'] ],
6666       'index'       => [ ['agentnum'], ['disabled'] ],
6667       'foreign_keys' => [
6668                           { columns    => [ 'agentnum' ],
6669                             table      => 'agent',
6670                           },
6671                         ],
6672     },
6673
6674     'alarm_station' => { #central station (where the alarm reports to)
6675       'columns' => [
6676         'alarmstationnum', 'serial',     '',      '', '', '',
6677         'agentnum',           'int', 'NULL',      '', '', '',
6678         'stationname',    'varchar',     '', $char_d, '', '',
6679         'disabled',          'char', 'NULL',       1, '', '', 
6680       ],
6681       'primary_key' => 'alarmstationnum',
6682       'unique'      => [ ['agentnum', 'stationname'], ],
6683       'index'       => [ ['agentnum'], ['disabled'] ],
6684       'foreign_keys' => [
6685                           { columns    => [ 'agentnum' ],
6686                             table      => 'agent',
6687                           },
6688                         ],
6689     },
6690
6691     'svc_cable' => {
6692       'columns' => [
6693         'svcnum',        'int',     '',      '', '', '', 
6694         'providernum',   'int', 'NULL',      '', '', '',
6695         'ordernum',  'varchar', 'NULL', $char_d, '', '',
6696         'modelnum',      'int', 'NULL',      '', '', '',
6697         'serialnum', 'varchar', 'NULL', $char_d, '', '',
6698         'mac_addr',  'varchar', 'NULL',      12, '', '', 
6699       ],
6700       'primary_key'  => 'svcnum',
6701       'unique'       => [ ['serialnum'] , ['mac_addr'] ],
6702       'index'        => [],
6703       'foreign_keys' => [
6704                           { columns    => [ 'svcnum' ],
6705                             table      => 'cust_svc',
6706                           },
6707                           { columns    => [ 'providernum' ],
6708                             table      => 'cable_provider',
6709                           },
6710                           { columns    => [ 'modelnum' ],
6711                             table      => 'cable_model',
6712                           },
6713                         ],
6714     },
6715
6716     'cable_model' => {
6717       'columns' => [
6718         'modelnum',    'serial',     '',      '', '', '',
6719         'model_name', 'varchar',     '', $char_d, '', '',
6720         'disabled',      'char', 'NULL',       1, '', '', 
6721       ],
6722       'primary_key' => 'modelnum',
6723       'unique' => [ [ 'model_name' ], ],
6724       'index'  => [],
6725     },
6726
6727     'cable_provider' => {
6728       'columns' => [
6729         'providernum', 'serial',     '',      '', '', '',
6730         'provider',   'varchar',     '', $char_d, '', '',
6731         'disabled',      'char', 'NULL',       1, '', '', 
6732       ],
6733       'primary_key' => 'providernum',
6734       'unique' => [ [ 'provider' ], ],
6735       'index'  => [],
6736     },
6737
6738     'svc_conferencing' => {
6739       'columns' => [
6740         'svcnum',            'int',     '',      '', '', '',
6741         'conf_id',           'int', 'NULL',      '', '', '', #"system assigned"
6742         'conf_name',     'varchar',     '', $char_d, '', '',
6743         'conf_password', 'varchar',     '', $char_d, '', '',
6744         'access_code',   'varchar',     '',      16, '', '',
6745         'duration',          'int',     '',      '', '', '',
6746         'participants',      'int',     '',      '', '', '',
6747         'conftypenum',       'int',     '',      '', '', '',
6748         'confqualitynum',    'int',     '',      '', '', '',
6749         'opt_recording',    'char', 'NULL',       1, '', '',
6750         'opt_sip',          'char', 'NULL',       1, '', '',
6751         'opt_phone',        'char', 'NULL',       1, '', '',
6752       ],
6753       'primary_key' => 'svcnum',
6754       'unique' => [],
6755       'index'  => [],
6756       'foreign_keys' => [
6757                           { columns => [ 'svcnum' ],
6758                             table   => 'cust_svc',
6759                           },
6760                           { columns => [ 'conftypenum' ],
6761                             table   => 'conferencing_type',
6762                           },
6763                           { columns => [ 'confqualitynum' ],
6764                             table   => 'conferencing_quality',
6765                           },
6766                         ],
6767     },
6768
6769     'conferencing_type' => {
6770       'columns' => [
6771         'conftypenum',  'int',     '',      '', '', '',
6772         'typeid'      , 'int',     '',      '', '', '',
6773         'typename', 'varchar',     '', $char_d, '', '',
6774         'disabled',    'char', 'NULL',       1, '', '', 
6775       ],
6776       'primary_key' => 'conftypenum',
6777       'unique'      => [ [ 'typeid', 'disabled' ], [ 'typename', 'disabled' ] ],
6778       'index'       => [],
6779     },
6780
6781     'conferencing_quality' => {
6782       'columns' => [
6783         'confqualitynum',  'int',     '',      '', '', '',
6784         'qualityid'      , 'int',     '',      '', '', '',
6785         'qualityname', 'varchar',     '', $char_d, '', '',
6786         'disabled',       'char', 'NULL',       1, '', '', 
6787       ],
6788       'primary_key' => 'confqualitynum',
6789       'unique'      => [ [ 'qualityid', 'disabled' ], [ 'qualityname', 'disabled' ] ],
6790       'index'       => [],
6791     },
6792
6793     'svc_video' => {
6794       'columns' => [
6795         'svcnum',            'int', '', '', '', '',
6796         'smartcard_num', 'varchar', '', 16, '', '',
6797         'mac_addr',      'varchar', '', 12, '', '', 
6798         'duration',          'int', '', '', '', '',
6799       ],
6800       'primary_key' => 'svcnum',
6801       'unique' => [], # [ 'smartcard_num' ], [ 'mac_addr' ], ],
6802       'index'  => [],
6803       'foreign_keys' => [
6804                           { columns => [ 'svcnum' ],
6805                             table   => 'cust_svc',
6806                           },
6807                         ],
6808     },
6809
6810     'circuit_type' => {
6811       'columns' => [
6812         'typenum',     'serial',     '',      '', '', '',
6813         'typename',   'varchar',     '', $char_d, '', '',
6814         'disabled',      'char', 'NULL',       1, '', '',
6815         # speed? number of voice lines? anything else?
6816       ],
6817       'primary_key' => 'typenum',
6818       'unique' => [ [ 'typename' ] ],
6819       'index'  => [],
6820     },
6821
6822     'circuit_provider' => {
6823       'columns' => [
6824         'providernum', 'serial',     '',      '', '', '',
6825         'provider',   'varchar',     '', $char_d, '', '',
6826         'disabled',      'char', 'NULL',       1, '', '', 
6827       ],
6828       'primary_key' => 'providernum',
6829       'unique' => [ [ 'provider' ], ],
6830       'index'  => [],
6831     },
6832
6833     'circuit_termination' => {
6834       'columns' => [
6835         'termnum',     'serial',     '',      '', '', '',
6836         'termination','varchar',     '', $char_d, '', '',
6837         'disabled',      'char', 'NULL',       1, '', '',
6838       ],
6839       'primary_key' => 'termnum',
6840       'unique' => [ [ 'termination' ] ],
6841       'index' => [],
6842     },
6843
6844     'svc_circuit' => {
6845       'columns' => [
6846         'svcnum',                   'int',     '', '', '', '',
6847         'typenum',                  'int',     '', '', '', '',
6848         'providernum',              'int',     '', '', '', '',
6849         'termnum',                  'int',     '', '', '', '',
6850         'circuit_id',           'varchar',     '', 64, '', '',
6851         'desired_due_date',         'int', 'NULL', '', '', '',
6852         'due_date',                 'int', 'NULL', '', '', '',
6853         'vendor_order_id',      'varchar', 'NULL', $char_d,  '', '',
6854         'vendor_qual_id',       'varchar', 'NULL', $char_d,  '', '',
6855         'vendor_order_type',    'varchar', 'NULL', $char_d,  '', '',
6856         'vendor_order_status',  'varchar', 'NULL', $char_d,  '', '',
6857         'endpoint_ip_addr',     'varchar', 'NULL', 40, '', '',
6858         'endpoint_mac_addr',    'varchar', 'NULL', 12, '', '',
6859       ],
6860       'primary_key' => 'svcnum',
6861       'unique'      => [],
6862       'index'       => [ [ 'providernum' ], [ 'typenum' ] ],
6863       'foreign_keys' => [
6864                           { columns => [ 'svcnum' ],
6865                             table   => 'cust_svc',
6866                           },
6867                           { columns => [ 'typenum' ],
6868                             table   => 'circuit_type',
6869                           },
6870                           { columns => [ 'providernum' ],
6871                             table   => 'circuit_provider',
6872                           },
6873                           { columns => [ 'termnum' ],
6874                             table   => 'circuit_termination',
6875                           },
6876       ],
6877     },
6878
6879     'svc_fiber' => {
6880       'columns' => [
6881         'svcnum',         'int',     '',      '', '', '',
6882         'oltnum',         'int', 'NULL',      '', '', '',
6883         'shelf',          'int', 'NULL',      '', '', '',
6884         'card',           'int', 'NULL',      '', '', '',
6885         'olt_port',       'int', 'NULL',      '', '', '',
6886         'ont_id',         'int', 'NULL',      '', '', '',
6887         'ont_typenum',    'int', 'NULL',      '', '', '',
6888         'ont_serial', 'varchar', 'NULL', $char_d, '', '',
6889         'ont_port',   'varchar', 'NULL',      16, '', '',
6890         'vlan',           'int', 'NULL',      '', '', '',
6891         'signal',         'int', 'NULL',      '', '', '',
6892         'speed_up',       'int', 'NULL',      '', '', '',
6893         'speed_down',     'int', 'NULL',      '', '', '',
6894         'ont_install','varchar', 'NULL', $char_d, '', '',
6895       ],
6896       'primary_key' => 'svcnum',
6897       'unique'      => [ ],
6898       'index'       => [ [ 'ont_serial' ] ],
6899       'foreign_keys' => [
6900                           { columns => [ 'svcnum' ],
6901                             table   => 'cust_svc',
6902                           },
6903                           { columns => [ 'oltnum' ],
6904                             table   => 'fiber_olt',
6905                           },
6906                           { columns => [ 'ont_typenum' ],
6907                             table   => 'hardware_type',
6908                             references => [ 'typenum' ],
6909                           },
6910                         ],
6911     },
6912
6913     'fiber_olt' => {
6914       'columns' => [
6915         'oltnum',   'serial', '',       '', '', '',
6916         'oltname', 'varchar', '',  $char_d, '', '',
6917         'serial',  'varchar', '',  $char_d, '', '',
6918         'disabled',   'char', 'NULL',    1, '', '',
6919       ],
6920       'primary_key' => 'oltnum',
6921       'unique' => [ ],
6922       'index'  => [ ],
6923     },
6924
6925     'vend_main' => {
6926       'columns' => [
6927         'vendnum',   'serial',     '',      '', '', '',
6928         'vendname', 'varchar',     '', $char_d, '', '',
6929         'classnum',     'int',     '',      '', '', '',
6930         'disabled',    'char', 'NULL',       1, '', '', 
6931       ],
6932       'primary_key'  => 'vendnum',
6933       'unique'       => [ ['vendname', 'disabled'] ],
6934       'index'        => [],
6935       'foreign_keys' => [
6936                           { columns    => [ 'classnum' ],
6937                             table      => 'vend_class',
6938                           },
6939                         ],
6940     },
6941
6942     'vend_class' => {
6943       'columns' => [
6944         'classnum',     'serial',     '',      '', '', '', 
6945         'classname',   'varchar',     '', $char_d, '', '', 
6946         'disabled',       'char', 'NULL',       1, '', '', 
6947       ],
6948       'primary_key' => 'classnum',
6949       'unique'      => [],
6950       'index'       => [ ['disabled'] ],
6951     },
6952
6953     'vend_bill' => {
6954       'columns' => [
6955         'vendbillnum',    'serial',     '',      '', '', '', 
6956         'vendnum',           'int',     '',      '', '', '', 
6957         #'_date',        @date_type,                  '', '', 
6958         '_date',     'int', '', '',                   '', '', 
6959         'charged',     @money_type,                  '', '', 
6960       ],
6961       'primary_key'  => 'vendbillnum',
6962       'unique'       => [],
6963       'index'        => [ ['vendnum'], ['_date'], ],
6964       'foreign_keys' => [
6965                           { columns    => [ 'vendnum' ],
6966                             table      => 'vend_main',
6967                           },
6968                         ],
6969     },
6970
6971     'vend_pay' => {
6972       'columns' => [
6973         'vendpaynum',   'serial',    '',       '', '', '',
6974         'vendnum',         'int',    '',       '', '', '', 
6975         #'_date',     @date_type,                   '', '', 
6976         '_date',     'int', '', '',                   '', '', 
6977         'paid',      @money_type,                  '', '', 
6978       ],
6979       'primary_key'  => 'vendpaynum',
6980       'unique'       => [],
6981       'index'        => [ [ 'vendnum' ], [ '_date' ], ],
6982       'foreign_keys' => [
6983                           { columns    => [ 'vendnum' ],
6984                             table      => 'vend_main',
6985                           },
6986                         ],
6987     },
6988
6989     'vend_bill_pay' => {
6990       'columns' => [
6991         'vendbillpaynum', 'serial',     '',   '', '', '', 
6992         'vendbillnum',       'int',     '',   '', '', '', 
6993         'vendpaynum',        'int',     '',   '', '', '', 
6994         'amount',  @money_type, '', '', 
6995         #? '_date',   @date_type, '', '', 
6996       ],
6997       'primary_key'  => 'vendbillpaynum',
6998       'unique'       => [],
6999       'index'        => [ [ 'vendbillnum' ], [ 'vendpaynum' ] ],
7000       'foreign_keys' => [
7001                           { columns    => [ 'vendbillnum' ],
7002                             table      => 'vend_bill',
7003                           },
7004                           { columns    => [ 'vendpaynum' ],
7005                             table      => 'vend_pay',
7006                           },
7007                         ],
7008     },
7009
7010     %{ tables_hashref_torrus() },
7011
7012     # tables of ours for doing torrus virtual port combining
7013     'torrus_srvderive' => {
7014       'columns' => [
7015         'derivenum',     'serial',     '', '', '', '',
7016         'serviceid',    'varchar',     '', 64, '', '', #srvexport / reportfields
7017         'last_srv_date',   'date', 'NULL', '', '', '',
7018       ],
7019       'primary_key' => 'derivenum',
7020       'unique' => [ ['serviceid'] ],
7021       'index'  => [],
7022     },
7023
7024     'torrus_srvderive_component' => {
7025       'columns' => [
7026         'componentnum', 'serial', '', '', '', '',
7027         'derivenum',       'int', '', '', '', '',
7028         'serviceid',   'varchar', '', 64, '', '', #srvexport / reportfields
7029       ],
7030       'primary_key'  => 'componentnum',
7031       'unique'       => [ [ 'derivenum', 'serviceid' ], ],
7032       'index'        => [ [ 'derivenum', ], ],
7033       'foreign_keys' => [
7034                           { columns    => [ 'derivenum' ],
7035                             table      => 'torrus_srvderive',
7036                           },
7037                         ],
7038     },
7039
7040     'invoice_mode' => {
7041       'columns' => [
7042         'modenum',      'serial', '', '', '', '',
7043         'agentnum',        'int', 'NULL', '', '', '',
7044         'modename',    'varchar', '', 32, '', '',
7045       ],
7046       'primary_key' => 'modenum',
7047       'unique'      => [ ],
7048       'index'       => [ ],
7049       'foreign_keys' => [
7050                           { columns    => [ 'agentnum' ],
7051                             table      => 'agent',
7052                           },
7053                         ],
7054     },
7055
7056     'invoice_conf' => {
7057       'columns' => [
7058         'confnum',              'serial',   '', '', '', '',
7059         'modenum',              'int',      '', '', '', '',
7060         'locale',               'varchar',  'NULL', 16, '', '',
7061         'notice_name',          'varchar',  'NULL', 64, '', '',
7062         'subject',              'varchar',  'NULL', 64, '', '',
7063         'htmlnotes',            'text',     'NULL', '', '', '',
7064         'htmlfooter',           'text',     'NULL', '', '', '',
7065         'htmlsummary',          'text',     'NULL', '', '', '',
7066         'htmlreturnaddress',    'text',     'NULL', '', '', '',
7067         'latexnotes',           'text',     'NULL', '', '', '',
7068         'latexfooter',          'text',     'NULL', '', '', '',
7069         'latexsummary',         'text',     'NULL', '', '', '',
7070         'latexsmallfooter',     'text',     'NULL', '', '', '',
7071         'latexreturnaddress',   'text',     'NULL', '', '', '',
7072         'with_latexcoupon',     'char',     'NULL', '1', '', '',
7073         'htmlwatermark',        'text',     'NULL', '', '', '',
7074         'latexwatermark',       'text',     'NULL', '', '', '',
7075         'lpr',                  'varchar',  'NULL', $char_d, '', '',
7076       ],
7077       'primary_key'  => 'confnum',
7078       'unique'       => [ [ 'modenum', 'locale' ] ],
7079       'index'        => [ ],
7080       'foreign_keys' => [
7081                           { columns    => [ 'modenum' ],
7082                             table      => 'invoice_mode',
7083                           },
7084                         ],
7085     },
7086
7087     'export_batch' => {
7088       'columns' => [
7089         'batchnum',    'serial',     '',      '', '', '',
7090         'exportnum',      'int',     '',      '', '', '',
7091         '_date',          'int',     '',      '', '', '',
7092         'status',     'varchar', 'NULL',      32, '', '',
7093         'statustext',    'text', 'NULL',      '', '', '',
7094       ],
7095       'primary_key'  => 'batchnum',
7096       'unique'       => [],
7097       'index'        => [ [ 'exportnum' ], [ 'status' ] ],
7098       'foreign_keys' => [
7099                           { columns    => [ 'exportnum' ],
7100                             table      => 'part_export',
7101                             references => [ 'exportnum' ]
7102                           },
7103                         ],
7104     },
7105
7106     'export_batch_item' => {
7107       'columns' => [
7108         'itemnum',     'serial',     '',      '', '', '',
7109         'batchnum',       'int',     '',      '', '', '',
7110         'svcnum',         'int',     '',      '', '', '',
7111         'action',     'varchar',     '',      32, '', '',
7112         'data',          'text', 'NULL',      '', '', '',
7113         'frozen',        'char', 'NULL',       1, '', '',
7114       ],
7115       'primary_key'  => 'itemnum',
7116       'unique'       => [],
7117       'index'        => [ [ 'batchnum' ], [ 'svcnum' ] ],
7118       'foreign_keys' => [
7119                           { columns    => [ 'batchnum' ],
7120                             table      => 'export_batch',
7121                             references => [ 'batchnum' ]
7122                           },
7123                         ],
7124     },
7125
7126     # lookup table for states, similar to msa and lata
7127     'state' => {
7128       'columns' => [
7129         'statenum', 'int',  '', '', '', '', 
7130         'country',  'char', '',  2, '', '',
7131         'state',    'char', '', $char_d, '', '', 
7132         'fips',     'char', '',  3, '', '',
7133       ],
7134       'primary_key' => 'statenum',
7135       'unique' => [ [ 'country', 'state' ], ],
7136       'index' => [],
7137     },
7138
7139     # eventually link to tower/sector?
7140     'deploy_zone' => {
7141       'columns' => [
7142         'zonenum',        'serial',  '',     '',      '', '',
7143         'description',    'char',    'NULL', $char_d, '', '',
7144         'agentnum',       'int',     '',     '',      '', '',
7145         'censusyear',     'char',    'NULL', 4,      '', '',
7146         'dbaname',        'char',    'NULL', $char_d, '', '',
7147         'zonetype',       'char',    '',     1,       '', '',
7148         'technology',     'int',     '',     '',      '', '',
7149         'spectrum',       'int',     'NULL', '',      '', '',
7150         'adv_speed_up',   'decimal', '',     '10,3', '0', '',
7151         'adv_speed_down', 'decimal', '',     '10,3', '0', '',
7152         'cir_speed_up',   'decimal', '',     '10,3', '0', '',
7153         'cir_speed_down', 'decimal', '',     '10,3', '0', '',
7154         'is_broadband',   'char',    'NULL', 1,       '', '',
7155         'is_voice',       'char',    'NULL', 1,       '', '',
7156         'is_consumer',    'char',    'NULL', 1,       '', '',
7157         'is_business',    'char',    'NULL', 1,       '', '',
7158         'active_date',    @date_type,                 '', '',
7159         'expire_date',    @date_type,                 '', '',
7160       ],
7161       'primary_key' => 'zonenum',
7162       'unique' => [],
7163       'index'  => [ [ 'agentnum' ] ],
7164       'foreign_keys' => [
7165                           { columns     => [ 'agentnum' ],
7166                             table       => 'agent',
7167                             references  => [ 'agentnum' ],
7168                           },
7169                         ],
7170     },
7171
7172     'deploy_zone_block' => {
7173       'columns' => [
7174         'blocknum',       'serial',  '',     '',      '', '',
7175         'zonenum',        'int',     '',     '',      '', '',
7176         'censusblock',    'char',    '',     15,      '', '',
7177         'censusyear',     'char','NULL',      4,      '', '',
7178       ],
7179       'primary_key' => 'blocknum',
7180       'unique' => [],
7181       'index'  => [ [ 'zonenum' ] ],
7182       'foreign_keys' => [
7183                           { columns     => [ 'zonenum' ],
7184                             table       => 'deploy_zone',
7185                             references  => [ 'zonenum' ],
7186                           },
7187                         ],
7188     },
7189
7190     'deploy_zone_vertex' => {
7191       'columns' => [
7192         'vertexnum',      'serial',  '',     '',      '', '',
7193         'zonenum',        'int',     '',     '',      '', '',
7194         'latitude',       'decimal', '',     '10,7',  '', '', 
7195         'longitude',      'decimal', '',     '10,7',  '', '', 
7196       ],
7197       'primary_key' => 'vertexnum',
7198       'unique' => [ ],
7199       'index'  => [ ],
7200       'foreign_keys' => [
7201                           { columns     => [ 'zonenum' ],
7202                             table       => 'deploy_zone',
7203                             references  => [ 'zonenum' ],
7204                           },
7205                         ],
7206     },
7207
7208     'cacti_page' => {
7209       'columns' => [
7210         'cacti_pagenum',  'serial',   '',     '', '', '',
7211         'exportnum',      'int',      'NULL', '', '', '',
7212         'svcnum',         'int',      'NULL', '', '', '', 
7213         'graphnum',       'int',      'NULL', '', '', '', 
7214         'imported',       @date_type,             '', '',
7215         'content',        'text',     'NULL', '', '', '',
7216       ],
7217       'primary_key' => 'cacti_pagenum',
7218       'unique'  => [ ],
7219       'index'   => [ ['svcnum'], ['imported'] ],
7220       'foreign_keys' => [
7221                           { columns    => [ 'svcnum' ],
7222                             table      => 'cust_svc',
7223                             references => [ 'svcnum' ],
7224                           },
7225                           { columns    => [ 'exportnum' ],
7226                             table      => 'part_export',
7227                             references => [ 'exportnum' ],
7228                           },
7229                         ],
7230     },
7231
7232     'report_batch' => {
7233       'columns' => [
7234         'reportbatchnum', 'serial',      '',  '', '', '',
7235         'reportname',     'varchar',     '', 255, '', '',
7236         'agentnum',           'int', 'NULL',  '', '', '',
7237         'send_date',     @date_type,              '', '',
7238         'sdate',         @date_type,              '', '',
7239         'edate',         @date_type,              '', '',
7240         'usernum',            'int', 'NULL',  '', '', '',
7241         'msgnum',             'int', 'NULL',  '', '', '',
7242         # add report params here as necessary
7243       ],
7244       'primary_key' => 'reportbatchnum',
7245       'unique' => [],
7246       'index'  => [],
7247       'foreign_keys' => [
7248                           { columns    => [ 'agentnum' ],
7249                             table      => 'agent',
7250                             references => [ 'agentnum' ],
7251                           },
7252                           { columns    => [ 'usernum' ],
7253                             table      => 'access_user',
7254                             references => [ 'usernum' ],
7255                           },
7256                           { columns    => [ 'msgnum' ],
7257                             table      => 'msg_template',
7258                             references => [ 'msgnum' ],
7259                           },
7260                         ],
7261     },
7262
7263     'password_history' => {
7264       'columns' => [
7265         'passwordnum',        'serial',  '',          '', '', '',
7266         '_password',          'varchar', 'NULL', $char_d, '', '',
7267         'encryption_method',  'varchar', 'NULL', $char_d, '', '',
7268         'created',   @date_type,   '', '',
7269         # each table that needs password history gets a column here, and
7270         # an entry in foreign_keys.
7271         'svc_acct__svcnum',     'int', 'NULL', '', '', '',
7272         'svc_dsl__svcnum',      'int', 'NULL', '', '', '',
7273         'svc_alarm__svcnum',    'int', 'NULL', '', '', '',
7274         'agent__agentnum',      'int', 'NULL', '', '', '',
7275         'contact__contactnum',  'int', 'NULL', '', '', '',
7276         'access_user__usernum', 'int', 'NULL', '', '', '',
7277       ],
7278       'primary_key' => 'passwordnum',
7279       'unique' => [],
7280       'index'  => [],
7281       'foreign_keys' => [
7282                           { columns     => [ 'svc_acct__svcnum' ],
7283                             table       => 'svc_acct',
7284                             references  => [ 'svcnum' ],
7285                           },
7286                           { columns     => [ 'svc_dsl__svcnum' ],
7287                             table       => 'svc_dsl',
7288                             references  => [ 'svcnum' ],
7289                           },
7290                           { columns     => [ 'svc_alarm__svcnum' ],
7291                             table       => 'svc_alarm',
7292                             references  => [ 'svcnum' ],
7293                           },
7294                           { columns    => [ 'agent__agentnum' ],
7295                             table      => 'agent',
7296                             references => [ 'agentnum' ],
7297                           },
7298                           { columns    => [ 'contact__contactnum' ],
7299                             table      => 'contact',
7300                             references => [ 'contactnum' ],
7301                           },
7302                           { columns    => [ 'access_user__usernum' ],
7303                             table      => 'access_user',
7304                             references => [ 'usernum' ],
7305                           },
7306                         ],
7307     },
7308
7309     # name type nullability length default local
7310
7311     #'new_table' => {
7312     #  'columns' => [
7313     #    'num', 'serial',       '', '', '', '',
7314     #  ],
7315     #  'primary_key' => 'num',
7316     #  'unique' => [],
7317     #  'index'  => [],
7318     #},
7319
7320   };
7321
7322 }
7323
7324 =back
7325
7326 =head1 BUGS
7327
7328 =head1 SEE ALSO
7329
7330 L<DBIx::DBSchema>
7331
7332 =cut
7333
7334 1;
7335