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
5496         'carrierid',               'bigint', 'NULL',      '', '', '',
5497
5498         # service it was matched to
5499         'svcnum',             'int',   'NULL',     '',   '', '', 
5500
5501         #NULL, done (or something)
5502         'freesidestatus', 'varchar',   'NULL',     32,   '', '', 
5503
5504         #NULL, done (or something)
5505         'freesiderewritestatus', 'varchar',   'NULL',     32,   '', '', 
5506
5507         #an indexed place to put big numbers
5508         'cdrid',         'bigint',     'NULL',     '',  '', '', 
5509
5510         #for taqua accountcode rewriting, for starters
5511         'sessionnum',       'int',    'NULL',      '', '', '',
5512         'subscriber',   'varchar',    'NULL', $char_d, '', '',
5513
5514         #old
5515         'cdrbatch',     'varchar',    'NULL',     255, '', '',
5516         #new
5517         'cdrbatchnum',      'int',    'NULL',      '', '', '',
5518
5519         # FK to cust_bill_pkg_detail; having a value here absolutely means
5520         # that the CDR appears on an invoice
5521         'detailnum',     'bigint',    'NULL',      '', '', '',
5522       ],
5523       'primary_key' => 'acctid',
5524       'unique' => [],
5525       'index' => [ [ 'calldate' ],
5526                    [ 'src' ], [ 'dst' ], [ 'dcontext' ], [ 'charged_party' ],
5527                    [ 'lastapp' ],
5528                    ['accountcode'], ['uniqueid'], ['carrierid'], ['cdrid'],
5529                    [ 'sessionnum' ], [ 'subscriber' ],
5530                    [ 'freesidestatus' ], [ 'freesiderewritestatus' ],
5531                    [ 'cdrbatch' ], [ 'cdrbatchnum' ],
5532                    [ 'src_ip_addr' ], [ 'dst_ip_addr' ], [ 'dst_term' ],
5533                  ],
5534       #no FKs on cdr table... choosing not to throw errors no matter what's
5535       # thrown in here.  better to have the data.
5536     },
5537
5538     'cdr_batch' => {
5539       'columns' => [
5540         'cdrbatchnum',   'serial',    '',   '', '', '', 
5541         'cdrbatch', 'varchar', 'NULL', 255, '', '',
5542         '_date',     @date_type, '', '', 
5543       ],
5544       'primary_key' => 'cdrbatchnum',
5545       'unique' => [ [ 'cdrbatch' ] ],
5546       'index' => [],
5547     },
5548
5549     'cdr_termination' => {
5550       'columns' => [
5551         'cdrtermnum', 'bigserial',     '',      '', '', '',
5552         'acctid',        'bigint',     '',      '', '', '', 
5553         'termpart',         'int',     '',      '', '', '',#future use see below
5554         'rated_price',  'decimal', 'NULL',  '10,4', '', '',
5555         'rated_seconds',    'int', 'NULL',      '', '', '',
5556         'rated_minutes', 'double precision', 'NULL',   '', '', '',
5557         'status',       'varchar', 'NULL',      32, '', '',
5558         'svcnum',           'int', 'NULL',      '', '', '',
5559       ],
5560       'primary_key'  => 'cdrtermnum',
5561       'unique'       => [ [ 'acctid', 'termpart' ] ],
5562       'index'        => [ [ 'acctid' ], [ 'status' ], ],
5563       'foreign_keys' => [
5564                           { columns    => [ 'acctid' ],
5565                             table      => 'cdr',
5566                           },
5567                           { columns    => [ 'svcnum' ],
5568                             table      => 'cust_svc',
5569                           },
5570                         ],
5571     },
5572
5573     #to handle multiple termination/settlement passes...
5574    # 'part_termination' => {
5575    #   'columns' => [
5576    #     'termpart',       'int', '',      '', '', '',
5577    #     'termname',   'varchar', '', $char_d, '', '',
5578    #     'cdr_column', 'varchar', '', $char_d, '', '', #maybe set it here instead of in the price plan?
5579    #   ],
5580    #   'primary_key' => 'termpart',
5581    #   'unique' => [],
5582    #   'index'  => [],
5583    # },
5584
5585     #the remaining cdr_ tables are not really used
5586     'cdr_calltype' => {
5587       'columns' => [
5588         'calltypenum',   'serial',  '', '', '', '', 
5589         'calltypename',  'varchar', '', $char_d, '', '', 
5590       ],
5591       'primary_key' => 'calltypenum',
5592       'unique'      => [],
5593       'index'       => [],
5594     },
5595
5596     'cdr_type' => {
5597       'columns' => [
5598         'cdrtypenum'  => 'serial',  '', '', '', '',
5599         'cdrtypename' => 'varchar', '', $char_d, '', '',
5600       ],
5601       'primary_key' => 'cdrtypenum',
5602       'unique'      => [],
5603       'index'       => [],
5604     },
5605
5606     'cdr_carrier' => {
5607       'columns' => [
5608         'carrierid'   =>  'serial',     '',      '', '', '',
5609         'carriername' => 'varchar',     '', $char_d, '', '',
5610         'disabled'    =>    'char', 'NULL',       1, '', '', 
5611       ],
5612       'primary_key' => 'carrierid',
5613       'unique'      => [],
5614       'index'       => [],
5615     },
5616
5617     #'cdr_file' => {
5618     #  'columns' => [
5619     #    'filenum',    'serial',     '', '', '', '',
5620     #    'filename',  'varchar',     '', '', '', '',
5621     #    'status',    'varchar', 'NULL', '', '', '',
5622     #  ],
5623     #  'primary_key' => 'filenum',
5624     #  'unique' => [ [ 'filename' ], ], #just change the index if we need to
5625     #                                   # agent-virtualize or have a customer
5626     #                                   # with dup-filename needs or something
5627     #                                   # (only used by cdr.http_and_import for
5628     #                                   #  chrissakes)
5629     #  'index'  => [],
5630     #},
5631
5632     'inventory_item' => {
5633       'columns' => [
5634         'itemnum',   'serial',      '',      '', '', '',
5635         'classnum',  'int',         '',      '', '', '',
5636         'agentnum',  'int',     'NULL',      '', '', '',
5637         'item',      'varchar',     '', $char_d, '', '',
5638         'svcnum',    'int',     'NULL',      '', '', '',
5639         'svc_field', 'varchar', 'NULL', $char_d, '', '',
5640       ],
5641       'primary_key'  => 'itemnum',
5642       'unique'       => [ [ 'classnum', 'item' ] ],
5643       'index'        => [ [ 'classnum' ], [ 'agentnum' ], [ 'svcnum' ] ],
5644       'foreign_keys' => [
5645                           { columns    => [ 'classnum' ],
5646                             table      => 'inventory_class',
5647                           },
5648                           { columns    => [ 'agentnum' ],
5649                             table      => 'agent',
5650                           },
5651                           { columns    => [ 'svcnum' ],
5652                             table      => 'cust_svc',
5653                           },
5654                         ],
5655     },
5656
5657     'inventory_class' => {
5658       'columns' => [
5659         'classnum',  'serial',       '',      '', '', '',
5660         'classname', 'varchar',      '', $char_d, '', '',
5661       ],
5662       'primary_key' => 'classnum',
5663       'unique' => [],
5664       'index'  => [],
5665     },
5666
5667     'access_user_session' => {
5668       'columns' => [
5669         'sessionnum',   'serial',  '',      '', '', '', 
5670         'sessionkey',  'varchar',  '', $char_d, '', '',
5671         'usernum',         'int',  '',      '', '', '',
5672         'start_date', @date_type,               '', '',
5673         'last_date',  @date_type,               '', '',
5674       ],
5675       'primary_key'  => 'sessionnum',
5676       'unique'       => [ [ 'sessionkey' ] ],
5677       'index'        => [],
5678       'foreign_keys' => [
5679                           { columns    => [ 'usernum' ],
5680                             table      => 'access_user',
5681                           },
5682                         ],
5683     },
5684
5685     'access_user' => {
5686       'columns' => [
5687         'usernum',             'serial',     '',      '', '', '',
5688         'username',           'varchar',     '', $char_d, '', '',
5689         '_password',          'varchar', 'NULL', $char_d, '', '',
5690         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
5691         'last',               'varchar', 'NULL', $char_d, '', '', 
5692         'first',              'varchar', 'NULL', $char_d, '', '', 
5693         'user_custnum',           'int', 'NULL',      '', '', '',
5694         'report_salesnum',        'int', 'NULL',      '', '', '',
5695         'disabled',              'char', 'NULL',       1, '', '', 
5696       ],
5697       'primary_key'  => 'usernum',
5698       'unique'       => [ [ 'username' ] ],
5699       'index'        => [ [ 'user_custnum' ] ],
5700       'foreign_keys' => [
5701                           { columns    => [ 'user_custnum' ],
5702                             table      => 'cust_main',
5703                             references => [ 'custnum' ],
5704                           },
5705                           { columns    => [ 'report_salesnum' ],
5706                             table      => 'sales',
5707                             references => [ 'salesnum' ],
5708                           },
5709                         ],
5710     },
5711
5712     'access_user_pref' => {
5713       'columns' => [
5714         'prefnum',    'serial',       '', '', '', '',
5715         'usernum',     'int',       '', '', '', '',
5716         'prefname', 'varchar', '', $char_d, '', '', 
5717         'prefvalue', 'text', 'NULL', '', '', '', 
5718         'expiration', @date_type, '', '',
5719       ],
5720       'primary_key'  => 'prefnum',
5721       'unique'       => [],
5722       'index'        => [ [ 'usernum' ] ],
5723       'foreign_keys' => [
5724                           { columns    => [ 'usernum' ],
5725                             table      => 'access_user',
5726                           },
5727                         ],
5728     },
5729
5730     'access_group' => {
5731       'columns' => [
5732         'groupnum',   'serial', '',      '', '', '',
5733         'groupname', 'varchar', '', $char_d, '', '',
5734       ],
5735       'primary_key' => 'groupnum',
5736       'unique' => [ [ 'groupname' ] ],
5737       'index'  => [],
5738     },
5739
5740     'access_usergroup' => {
5741       'columns' => [
5742         'usergroupnum', 'serial', '', '', '', '',
5743         'usernum',         'int', '', '', '', '',
5744         'groupnum',        'int', '', '', '', '',
5745       ],
5746       'primary_key'  => 'usergroupnum',
5747       'unique'       => [ [ 'usernum', 'groupnum' ] ],
5748       'index'        => [ [ 'usernum' ] ],
5749       'foreign_keys' => [
5750                           { columns    => [ 'usernum' ],
5751                             table      => 'access_user',
5752                           },
5753                           { columns    => [ 'groupnum' ],
5754                             table      => 'access_group',
5755                           },
5756                         ],
5757      },
5758
5759     'access_groupagent' => {
5760       'columns' => [
5761         'groupagentnum', 'serial', '', '', '', '',
5762         'groupnum',         'int', '', '', '', '',
5763         'agentnum',         'int', '', '', '', '',
5764       ],
5765       'primary_key'  => 'groupagentnum',
5766       'unique'       => [ [ 'groupnum', 'agentnum' ] ],
5767       'index'        => [ [ 'groupnum' ] ],
5768       'foreign_keys' => [
5769                           { columns    => [ 'groupnum' ],
5770                             table      => 'access_group',
5771                           },
5772                           { columns    => [ 'agentnum' ],
5773                             table      => 'agent',
5774                           },
5775                         ],
5776     },
5777
5778     'access_right' => {
5779       'columns' => [
5780         'rightnum',   'serial', '',      '', '', '',
5781         'righttype', 'varchar', '', $char_d, '', '',
5782         'rightobjnum',   'int', '',      '', '', '',
5783         'rightname', 'varchar', '', $char_d, '', '',
5784       ],
5785       'primary_key' => 'rightnum',
5786       'unique' => [ [ 'righttype', 'rightobjnum', 'rightname' ] ],
5787       'index'  => [],
5788     },
5789
5790     'access_user_log' => {
5791       'columns'      => [
5792         'lognum',  'serial', '',        '', '', '',
5793         'usernum',    'int', '',        '', '', '',
5794         'path',   'varchar', '', 2*$char_d, '', '',
5795         '_date',         @date_type,        '', '',
5796       ],
5797       'primary_key'  => 'lognum',
5798       'unique'       => [],
5799       'index'        => [ ['usernum'], ['path'], ['_date'] ],
5800     },
5801
5802     'sched_item' => {
5803       'columns' => [
5804         'itemnum',   'serial',      '', '', '', '', 
5805         'usernum',      'int',  'NULL', '', '', '', 
5806         #'itemname', 'varchar', $char_d, '', '', '',
5807         'disabled',    'char',  'NULL',  1, '', '', 
5808       ],
5809       'primary_key'  => 'itemnum',
5810       'unique'       => [ [ 'usernum' ] ],
5811       'index'        => [],
5812       'foreign_keys' => [
5813                           { columns    => [ 'usernum' ],
5814                             table      => 'access_user',
5815                           },
5816                         ],
5817     },
5818
5819     #'sched_item_class'
5820
5821     'sched_avail' => {
5822       'columns' => [
5823         'availnum',      'serial', '', '', '', '', 
5824         'itemnum',          'int', '', '', '', '',
5825         'wday',             'int', '', '', '', '',
5826         'stime',            'int', '', '', '', '',
5827         'etime',            'int', '', '', '', '',
5828         'override_date',    @date_type,    '', '',
5829       ],
5830       'primary_key'  => 'availnum',
5831       'unique'       => [],
5832       'index'        => [],
5833       'foreign_keys' => [
5834                           { columns    => [ 'itemnum' ],
5835                             table      => 'sched_item',
5836                           },
5837                         ],
5838     },
5839
5840     'svc_phone' => {
5841       'columns' => [
5842         'svcnum',                         'int',     '',      '', '', '', 
5843         'countrycode',                'varchar',     '',       3, '', '', 
5844         'phonenum',                   'varchar',     '',      25, '', '', #12 ?
5845         'sim_imsi',                   'varchar', 'NULL',      15, '', '',
5846         'pin',                        'varchar', 'NULL', $char_d, '', '',
5847         'sip_password',               'varchar', 'NULL', $char_d, '', '',
5848         'phone_name',                 'varchar', 'NULL', $char_d, '', '',
5849         'pbxsvc',                         'int', 'NULL',      '', '', '',
5850         'domsvc',                         'int', 'NULL',      '', '', '', 
5851         'locationnum',                    'int', 'NULL',      '', '', '',
5852         'forwarddst',                 'varchar', 'NULL',      15, '', '', 
5853         'email',                      'varchar', 'NULL',     255, '', '', 
5854         'lnp_status',                 'varchar', 'NULL', $char_d, '', '',
5855         'portable',                      'char', 'NULL',       1, '', '', 
5856         'lrn',                           'char', 'NULL',      10, '', '', 
5857         'lnp_desired_due_date',           'int', 'NULL',      '', '', '',
5858         'lnp_due_date',                   'int', 'NULL',      '', '', '',
5859         'lnp_other_provider',         'varchar', 'NULL', $char_d, '', '',
5860         'lnp_other_provider_account', 'varchar', 'NULL', $char_d, '', '',
5861         'lnp_reject_reason',          'varchar', 'NULL', $char_d, '', '',
5862         'sms_carrierid',                  'int', 'NULL',      '', '', '',
5863         'sms_account',                'varchar', 'NULL', $char_d, '', '',
5864         'max_simultaneous',               'int', 'NULL',      '', '', '',
5865         'e911_class',                    'char', 'NULL',       1, '', '',
5866         'e911_type',                     'char', 'NULL',       1, '', '', 
5867         'circuit_svcnum',                 'int', 'NULL',      '', '', '',
5868         'sip_server',                 'varchar', 'NULL', $char_d, '', '',
5869       ],
5870       'primary_key'  => 'svcnum',
5871       'unique'       => [ [ 'sms_carrierid', 'sms_account'] ],
5872       'index'        => [ ['countrycode', 'phonenum'], ['pbxsvc'], ['domsvc'],
5873                           ['locationnum'], ['sms_carrierid'],
5874                         ],
5875       'foreign_keys' => [
5876                           { columns    => [ 'svcnum' ],
5877                             table      => 'cust_svc',
5878                           },
5879                           { columns    => [ 'pbxsvc' ],
5880                             table      => 'svc_pbx', #'cust_svc',
5881                             references => [ 'svcnum' ],
5882                           },
5883                           { columns    => [ 'domsvc' ],
5884                             table      => 'svc_domain', #'cust_svc',
5885                             references => [ 'svcnum' ],
5886                           },
5887                           { columns    => [ 'locationnum' ],
5888                             table      => 'cust_location',
5889                           },
5890                           { columns    => [ 'sms_carrierid' ],
5891                             table      => 'cdr_carrier',
5892                             references => [ 'carrierid' ],
5893                           },
5894                           { columns    => [ 'circuit_svcnum' ],
5895                             table      => 'svc_circuit',
5896                             references => [ 'svcnum' ],
5897                           },
5898                         ],
5899     },
5900
5901     'phone_device' => {
5902       'columns' => [
5903         'devicenum', 'serial',     '', '', '', '',
5904         'devicepart',   'int',     '', '', '', '',
5905         'svcnum',       'int',     '', '', '', '', 
5906         'mac_addr', 'varchar', 'NULL', 12, '', '', 
5907       ],
5908       'primary_key'  => 'devicenum',
5909       'unique'       => [ [ 'mac_addr' ], ],
5910       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
5911       'foreign_keys' => [
5912                           { columns    => [ 'devicepart' ],
5913                             table      => 'part_device',
5914                           },
5915                           { columns    => [ 'svcnum' ],
5916                             table      => 'svc_phone',
5917                           },
5918                         ],
5919     },
5920
5921     'part_device' => {
5922       'columns' => [
5923         'devicepart', 'serial',  '',      '', '', '',
5924         'devicename', 'varchar', '', $char_d, '', '',
5925         'inventory_classnum', 'int', 'NULL', '', '', '',
5926         'title',      'varchar', 'NULL', $char_d, '', '',
5927       ],
5928       'primary_key'  => 'devicepart',
5929       'unique'       => [ [ 'devicename' ] ], #?
5930       'index'        => [],
5931       'foreign_keys' => [
5932                           { columns    => [ 'inventory_classnum' ],
5933                             table      => 'inventory_class',
5934                             references => [ 'classnum' ],
5935                           },
5936                         ],
5937     },
5938
5939     'phone_avail' => {
5940       'columns' => [
5941         'availnum',    'serial',      '',      '', '', '', 
5942         'exportnum',   'int',         '',      '', '', '', 
5943         'countrycode', 'varchar',     '',       3, '', '', 
5944         'state',       'char',    'NULL',       2, '', '', 
5945         'npa',         'char',        '',       3, '', '', 
5946         'nxx',         'char',    'NULL',       3, '', '', 
5947         'station',     'char',    'NULL',       4, '', '',
5948         'name',        'varchar', 'NULL', $char_d, '', '',
5949         'rate_center_abbrev', 'varchar', 'NULL', $char_d, '', '',
5950         'latanum',      'int',     'NULL',      '', '', '',
5951         'msanum',       'int', 'NULL', '', '', '',
5952         'ordernum',      'int',     'NULL',      '', '', '',
5953         'svcnum',      'int',     'NULL',      '', '', '',
5954         'availbatch', 'varchar',  'NULL', $char_d, '', '',
5955       ],
5956       'primary_key'  => 'availnum',
5957       'unique'       => [],
5958       'index'        => [ ['exportnum','countrycode','state'],    #npa search
5959                           ['exportnum','countrycode','npa'],      #nxx search
5960                           ['exportnum','countrycode','npa','nxx'],#station srch
5961                           [ 'exportnum','countrycode','npa','nxx','station'], #
5962                           [ 'svcnum' ],
5963                           [ 'availbatch' ],
5964                           [ 'latanum' ],
5965                         ],
5966       'foreign_keys' => [
5967                           { columns    => [ 'exportnum' ],
5968                             table      => 'part_export',
5969                           },
5970                           { columns    => [ 'latanum' ],
5971                             table      => 'lata',
5972                           },
5973                           { columns    => [ 'msanum' ],
5974                             table      => 'msa',
5975                           },
5976                           { columns    => [ 'ordernum' ],
5977                             table      => 'did_order',
5978                           },
5979                           { columns    => [ 'svcnum' ],
5980                             table      => 'svc_phone',
5981                           },
5982                         ],
5983     },
5984
5985     'lata' => {
5986       'columns' => [
5987         'latanum',    'int',      '',      '', '', '', 
5988         'description',   'varchar',    '',      $char_d, '', '', 
5989         'have_usage',   'int',    'NULL',      '', '', '', 
5990       ],
5991       'primary_key' => 'latanum',
5992       'unique' => [],
5993       'index'  => [],
5994     },
5995
5996     'msa' => {
5997       'columns' => [
5998         'msanum',    'int',      '',      '', '', '', 
5999         'description',   'varchar',    '',      $char_d, '', '', 
6000       ],
6001       'primary_key' => 'msanum',
6002       'unique' => [],
6003       'index'  => [],
6004     },
6005
6006     'rate_center' => {
6007       'columns' => [
6008         'ratecenternum',    'serial',      '',      '', '', '', 
6009         'description',   'varchar',    '',      $char_d, '', '', 
6010       ],
6011       'primary_key' => 'ratecenternum',
6012       'unique' => [],
6013       'index'  => [],
6014     },
6015
6016     'did_vendor' => {
6017       'columns' => [
6018         'vendornum',    'serial',      '',      '', '', '', 
6019         'vendorname',   'varchar',        '',     $char_d, '', '', 
6020       ],
6021       'primary_key' => 'vendornum',
6022       'unique' => [],
6023       'index'  => [],
6024     },
6025
6026     'did_order_item' => {
6027       'columns' => [
6028         'orderitemnum',    'serial',      '',      '', '', '', 
6029         'ordernum',    'int',      '',      '', '', '', 
6030         'msanum',      'int',     'NULL',      '', '', '',
6031         'npa',      'int',     'NULL',      '', '', '',
6032         'latanum',      'int',     'NULL',      '', '', '',
6033         'ratecenternum',      'int',     'NULL',      '', '', '',
6034         'state',       'char',    'NULL',       2, '', '', 
6035         'quantity',      'int',     '',      '', '', '',
6036         'custnum',   'int', 'NULL', '', '', '',
6037       ],
6038       'primary_key'  => 'orderitemnum',
6039       'unique'       => [],
6040       'index'        => [],
6041       'foreign_keys' => [
6042                           { columns    => [ 'ordernum' ],
6043                             table      => 'did_order',
6044                           },
6045                           { columns    => [ 'msanum' ],
6046                             table      => 'msa',
6047                           },
6048                           { columns    => [ 'latanum' ],
6049                             table      => 'lata',
6050                           },
6051                           { columns    => [ 'ratecenternum' ],
6052                             table      => 'rate_center',
6053                           },
6054                           { columns    => [ 'custnum' ],
6055                             table      => 'cust_main',
6056                           },
6057                         ],
6058     },
6059
6060     'did_order' => {
6061       'columns' => [
6062         'ordernum',    'serial',      '',      '', '', '', 
6063         'vendornum',   'int',       '',      '', '', '', 
6064         'vendor_order_id',   'varchar',  'NULL',   $char_d, '', '', 
6065         'custnum',   'int', 'NULL', '', '', '',
6066         'submitted',      'int',     '',      '', '', '',
6067         'confirmed',      'int',     'NULL',      '', '', '',
6068         'received',      'int',     'NULL',      '', '', '',
6069       ],
6070       'primary_key'  => 'ordernum',
6071       'unique'       => [ [ 'vendornum', 'vendor_order_id' ] ],
6072       'index'        => [],
6073       'foreign_keys' => [
6074                           { columns    => [ 'vendornum' ],
6075                             table      => 'did_vendor',
6076                           },
6077                           { columns    => [ 'custnum' ],
6078                             table      => 'cust_main',
6079                           },
6080                         ],
6081     },
6082
6083     'reason_type' => {
6084       'columns' => [
6085         'typenum',   'serial',  '', '', '', '', 
6086         'class',     'char', '', 1, '', '', 
6087         'type',     'varchar', '', $char_d, '', '', 
6088       ],
6089       'primary_key' => 'typenum',
6090       'unique' => [],
6091       'index' => [],
6092     },
6093
6094     'reason' => {
6095       'columns' => [
6096         'reasonnum',     'serial',  '', '', '', '', 
6097         'reason_type',   'int',  '', '', '', '', 
6098         'reason',        'text', '', '', '', '', 
6099         'disabled',      'char',    'NULL', 1, '', '', 
6100         'unsuspend_pkgpart', 'int',  'NULL', '', '', '',
6101         'unsuspend_hold','char',    'NULL', 1, '', '',
6102         'unused_credit', 'char',    'NULL', 1, '', '',
6103         'feepart',        'int', 'NULL', '', '', '',
6104         'fee_on_unsuspend','char',  'NULL', 1, '', '',
6105         'fee_hold',      'char',    'NULL', 1, '', '',
6106       ],
6107       'primary_key'  => 'reasonnum',
6108       'unique'       => [],
6109       'index'        => [],
6110       'foreign_keys' => [
6111                           { columns    => [ 'reason_type' ],
6112                             table      => 'reason_type',
6113                             references => [ 'typenum' ],
6114                           },
6115                           { columns    => [ 'unsuspend_pkgpart' ],
6116                             table      => 'part_pkg',
6117                             references => [ 'pkgpart' ],
6118                           },
6119                         ],
6120     },
6121
6122     'conf' => {
6123       'columns' => [
6124         'confnum',  'serial',     '',      '', '', '', 
6125         'agentnum', 'int',    'NULL',      '', '', '', 
6126         'locale',   'varchar','NULL',      16, '', '',
6127         'name',     'varchar',    '', $char_d, '', '', 
6128         'value',    'text',   'NULL',      '', '', '',
6129       ],
6130       'primary_key'  => 'confnum',
6131       'unique'       => [ [ 'agentnum', 'locale', 'name' ] ],
6132       'index'        => [],
6133       'foreign_keys' => [
6134                           { columns    => [ 'agentnum' ],
6135                             table      => 'agent',
6136                           },
6137                         ],
6138     },
6139
6140     'pkg_referral' => {
6141       'columns' => [
6142         'pkgrefnum',     'serial', '', '', '', '',
6143         'pkgnum',        'int',    '', '', '', '',
6144         'refnum',        'int',    '', '', '', '',
6145       ],
6146       'primary_key'  => 'pkgrefnum',
6147       'unique'       => [ [ 'pkgnum', 'refnum' ] ],
6148       'index'        => [ [ 'pkgnum' ], [ 'refnum' ] ],
6149       'foreign_keys' => [
6150                           { columns    => [ 'pkgnum' ],
6151                             table      => 'cust_pkg',
6152                           },
6153                           { columns    => [ 'refnum' ],
6154                             table      => 'part_referral',
6155                           },
6156                         ],
6157     },
6158
6159     'svc_pbx' => {
6160       'columns' => [
6161         'svcnum',           'int',     '',      '', '', '', 
6162         'id',               'int', 'NULL',      '', '', '', 
6163         'uuid',            'char', 'NULL',      36, '', '',
6164         'title',        'varchar', 'NULL', $char_d, '', '', 
6165         'max_extensions',   'int', 'NULL',      '', '', '',
6166         'max_simultaneous', 'int', 'NULL',      '', '', '',
6167         'ip_addr',      'varchar', 'NULL',      40, '', '',
6168       ],
6169       'primary_key'  => 'svcnum',
6170       'unique'       => [],
6171       'index'        => [ [ 'id' ], [ 'uuid' ] ],
6172       'foreign_keys' => [
6173                           { columns    => [ 'svcnum' ],
6174                             table      => 'cust_svc',
6175                           },
6176                         ],
6177     },
6178
6179     'pbx_extension' => {
6180       'columns' => [
6181         'extensionnum',  'serial',     '',      '', '', '',
6182         'svcnum',           'int',     '',      '', '', '',
6183         'extension',    'varchar',     '', $char_d, '', '',
6184         'pin',          'varchar', 'NULL', $char_d, '', '',
6185         'sip_password', 'varchar', 'NULL', $char_d, '', '',
6186         'phone_name',   'varchar', 'NULL', $char_d, '', '',
6187       ],
6188       'primary_key'  => 'extensionnum',
6189       'unique'       => [ [ 'svcnum', 'extension' ] ],
6190       'index'        => [ [ 'svcnum' ] ],
6191       'foreign_keys' => [
6192                           { columns    => [ 'svcnum' ],
6193                             table      => 'svc_pbx',
6194                           },
6195                         ],
6196     },
6197
6198     'pbx_device' => {
6199       'columns' => [
6200         'devicenum', 'serial',     '', '', '', '',
6201         'devicepart',   'int',     '', '', '', '',
6202         'svcnum',       'int',     '', '', '', '', 
6203         'mac_addr', 'varchar', 'NULL', 12, '', '', 
6204       ],
6205       'primary_key'  => 'devicenum',
6206       'unique'       => [ [ 'mac_addr' ], ],
6207       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
6208       'foreign_keys' => [
6209                           { columns    => [ 'devicepart' ],
6210                             table      => 'part_device',
6211                           },
6212                           { columns    => [ 'svcnum' ],
6213                             table      => 'svc_pbx',
6214                           },
6215                         ],
6216     },
6217
6218     'extension_device' => {
6219       'columns' => [
6220         'extensiondevicenum', 'serial', '', '', '', '',
6221         'extensionnum',          'int', '', '', '', '',
6222         'devicenum',             'int', '', '', '', '',
6223       ],
6224       'primary_key'  => 'extensiondevicenum',
6225       'unique'       => [ [ 'extensionnum', 'devicenum' ] ],
6226       'index'        => [],#both?  which way do we need to query?
6227       'foreign_keys' => [
6228                           { columns  => [ 'extensionnum' ],
6229                             table    => 'pbx_extension',
6230                           },
6231                           { columns  => [ 'devicenum' ],
6232                             table    => 'pbx_device',
6233                           },
6234                         ],
6235     },
6236
6237     'svc_mailinglist' => { #svc_group?
6238       'columns' => [
6239         'svcnum',            'int',     '',            '', '', '', 
6240         'username',      'varchar',     '', $username_len, '', '',
6241         'domsvc',            'int',     '',            '', '', '', 
6242         'listnum',           'int',     '',            '', '', '',
6243         'reply_to',         'char', 'NULL',             1, '', '',#SetReplyTo
6244         'remove_from',      'char', 'NULL',             1, '', '',#RemoveAuthor
6245         'reject_auto',      'char', 'NULL',             1, '', '',#RejectAuto
6246         'remove_to_and_cc', 'char', 'NULL',             1, '', '',#RemoveToAndCc
6247       ],
6248       'primary_key'  => 'svcnum',
6249       'unique'       => [],
6250       'index'        => [ ['username'], ['domsvc'], ['listnum'] ],
6251       'foreign_keys' => [
6252                           { columns    => [ 'svcnum' ],
6253                             table      => 'cust_svc',
6254                           },
6255                           { columns    => [ 'domsvc' ],
6256                             table      => 'svc_domain', #'cust_svc',
6257                             references => [ 'svcnum' ],
6258                           },
6259                           { columns    => [ 'listnum' ],
6260                             table      => 'mailinglist',
6261                           },
6262                         ],
6263     },
6264
6265     'mailinglist' => {
6266       'columns' => [
6267         'listnum',   'serial', '',      '', '', '',
6268         'listname', 'varchar', '', $char_d, '', '',
6269       ],
6270       'primary_key' => 'listnum',
6271       'unique' => [],
6272       'index'  => [],
6273     },
6274
6275     'mailinglistmember' => {
6276       'columns' => [
6277         'membernum',        'serial',     '',   '', '', '',
6278         'listnum',             'int',     '',   '', '', '',
6279         'svcnum',              'int', 'NULL',   '', '', '', 
6280         'contactemailnum',     'int', 'NULL',   '', '', '', 
6281         'email',           'varchar', 'NULL',  255, '', '', 
6282       ],
6283       'primary_key'  => 'membernum',
6284       'unique'       => [],
6285       'index'        => [['listnum'],['svcnum'],['contactemailnum'],['email']],
6286       'foreign_keys' => [
6287                           { columns    => [ 'listnum' ],
6288                             table      => 'mailinglist',
6289                           },
6290                           { columns    => [ 'svcnum' ],
6291                             table      => 'svc_acct',
6292                           },
6293                           { columns    => [ 'contactemailnum' ],
6294                             table      => 'contact_email',
6295                           },
6296                         ],
6297     },
6298
6299     'bill_batch' => {
6300       'columns' => [
6301         'batchnum',         'serial',     '',  '', '', '',
6302         'agentnum',            'int', 'NULL',  '', '', '',
6303         'status',             'char', 'NULL', '1', '', '',
6304         'pdf',                'blob', 'NULL',  '', '', '',
6305       ],
6306       'primary_key'  => 'batchnum',
6307       'unique'       => [],
6308       'index'        => [ ['agentnum'] ],
6309       'foreign_keys' => [
6310                           { columns    => [ 'agentnum' ],
6311                             table      => 'agent',
6312                           },
6313                         ],
6314     },
6315
6316     'cust_bill_batch' => {
6317       'columns' => [
6318         'billbatchnum',     'serial',     '', '', '', '',
6319         'batchnum',            'int',     '', '', '', '',
6320         'invnum',              'int',     '', '', '', '',
6321       ],
6322       'primary_key'  => 'billbatchnum',
6323       'unique'       => [],
6324       'index'        => [ [ 'batchnum' ], [ 'invnum' ] ],
6325       'foreign_keys' => [
6326                           { columns    => [ 'batchnum' ],
6327                             table      => 'bill_batch',
6328                           },
6329                           { columns    => [ 'invnum' ],
6330                             table      => 'cust_bill',
6331                           },
6332                         ],
6333     },
6334
6335     'cust_bill_batch_option' => {
6336       'columns' => [
6337         'optionnum', 'serial', '', '', '', '', 
6338         'billbatchnum', 'int', '', '', '', '', 
6339         'optionname', 'varchar', '', $char_d, '', '', 
6340         'optionvalue', 'text', 'NULL', '', '', '', 
6341       ],
6342       'primary_key'  => 'optionnum',
6343       'unique'       => [],
6344       'index'        => [ [ 'billbatchnum' ], [ 'optionname' ] ],
6345       'foreign_keys' => [
6346                           { columns    => [ 'billbatchnum' ],
6347                             table      => 'cust_bill_batch',
6348                           },
6349                         ],
6350      },
6351
6352     'msg_template' => {
6353       'columns' => [
6354         'msgnum',     'serial',     '',      '', '', '',
6355         'msgname',   'varchar',     '', $char_d, '', '',
6356         'agentnum',      'int', 'NULL',      '', '', '',
6357         'subject',   'varchar', 'NULL',     512, '', '',
6358         'mime_type', 'varchar',     '', $char_d, '', '',
6359         'body',         'blob', 'NULL',      '', '', '',
6360         'disabled',     'char', 'NULL',       1, '', '', 
6361           # migrate these to msg_template_email
6362         'from_addr', 'varchar', 'NULL',     255, '', '',
6363         'bcc_addr',  'varchar', 'NULL',     255, '', '',
6364           # change to not null on v5
6365         'msgclass',  'varchar', 'NULL',      16, '', '',
6366       ],
6367       'primary_key'  => 'msgnum',
6368       'unique'       => [ ],
6369       'index'        => [ ['agentnum'], ],
6370       'foreign_keys' => [
6371                           { columns    => [ 'agentnum' ],
6372                             table      => 'agent',
6373                           },
6374                         ],
6375     },
6376
6377     'msg_template_http' => {
6378       'columns' => [
6379         'num',          'serial',     '',      '', '', '',
6380         'msgnum',          'int',     '',      '', '', '',
6381         'prepare_url', 'varchar', 'NULL',     255, '', '',
6382         'send_url',    'varchar', 'NULL',     255, '', '',
6383         'username',    'varchar', 'NULL', $char_d, '', '',
6384         'password',    'varchar', 'NULL', $char_d, '', '',
6385         'content',        'text', 'NULL',      '', '', '',
6386       ],
6387       'primary_key'  => 'num',
6388       'unique'       => [ [ 'msgnum' ], ],
6389       'index'        => [ ],
6390       'foreign_keys' => [
6391                           { columns    => [ 'msgnum' ],
6392                             table      => 'msg_template',
6393                           },
6394                         ],
6395     },
6396
6397     'template_content' => {
6398       'columns' => [
6399         'contentnum', 'serial',     '',      '', '', '',
6400         'msgnum',        'int',     '',      '', '', '',
6401         'locale',    'varchar', 'NULL',      16, '', '',
6402         'subject',   'varchar', 'NULL',     512, '', '',
6403         'body',         'text', 'NULL',      '', '', '',
6404       ],
6405       'primary_key'  => 'contentnum',
6406       'unique'       => [ ['msgnum', 'locale'] ],
6407       'index'        => [ ],
6408       'foreign_keys' => [
6409                           { columns    => [ 'msgnum' ],
6410                             table      => 'msg_template',
6411                           },
6412                         ],
6413     },
6414
6415     'template_image' => {
6416       'columns' => [
6417         'imgnum',     'serial',     '',      '', '', '',
6418         'name',      'varchar',     '', $char_d, '', '',
6419         'agentnum',      'int', 'NULL',      '', '', '',
6420         'mime_type', 'varchar',     '', $char_d, '', '',
6421         'base64',       'text',     '',      '', '', '',
6422       ],
6423       'primary_key'  => 'imgnum',
6424       'unique'       => [ ],
6425       'index'        => [ ['name'], ['agentnum'] ],
6426     },
6427
6428     'cust_msg' => {
6429       'columns' => [
6430         'custmsgnum', 'serial',     '',     '', '', '',
6431         'custnum',       'int', 'NULL',     '', '', '',
6432         'msgnum',        'int', 'NULL',     '', '', '',
6433         '_date',    @date_type,                 '', '',
6434         'env_from',  'varchar', 'NULL',    255, '', '',
6435         'env_to',    'varchar', 'NULL',    255, '', '',
6436         'header',       'blob', 'NULL',     '', '', '',
6437         'body',         'blob', 'NULL',     '', '', '',
6438         'error',     'varchar', 'NULL',    255, '', '',
6439         'status',    'varchar',     '',$char_d, '', '',
6440         'msgtype',   'varchar', 'NULL',     16, '', '',
6441         'preview',      'text', 'NULL',     '', '', '',
6442       ],
6443       'primary_key'  => 'custmsgnum',
6444       'unique'       => [ ],
6445       'index'        => [ ['custnum'], ],
6446       'foreign_keys' => [
6447                           { columns    => [ 'custnum' ],
6448                             table      => 'cust_main',
6449                           },
6450                           { columns    => [ 'msgnum' ],
6451                             table      => 'msg_template',
6452                           },
6453                         ],
6454     },
6455
6456     'svc_cert' => {
6457       'columns' => [
6458         'svcnum',                'int',     '',      '', '', '', 
6459         'recnum',                'int', 'NULL',      '', '', '',
6460         'privatekey',           'text', 'NULL',      '', '', '',
6461         'csr',                  'text', 'NULL',      '', '', '',
6462         'certificate',          'text', 'NULL',      '', '', '',
6463         'cacert',               'text', 'NULL',      '', '', '',
6464         'common_name',       'varchar', 'NULL', $char_d, '', '',
6465         'organization',      'varchar', 'NULL', $char_d, '', '',
6466         'organization_unit', 'varchar', 'NULL', $char_d, '', '',
6467         'city',              'varchar', 'NULL', $char_d, '', '',
6468         'state',             'varchar', 'NULL', $char_d, '', '',
6469         'country',              'char', 'NULL',       2, '', '',
6470         'cert_contact',      'varchar', 'NULL', $char_d, '', '',
6471       ],
6472       'primary_key'  => 'svcnum',
6473       'unique'       => [],
6474       'index'        => [], #recnum
6475       'foreign_keys' => [
6476                           { columns    => [ 'svcnum' ],
6477                             table      => 'cust_svc',
6478                           },
6479                           { columns    => [ 'recnum' ],
6480                             table      => 'domain_record',
6481                           },
6482                         ],
6483     },
6484
6485     'svc_port' => {
6486       'columns' => [
6487         'svcnum',                'int',     '',      '', '', '', 
6488         'serviceid', 'varchar', '', 64, '', '', #srvexport / reportfields
6489       ],
6490       'primary_key'  => 'svcnum',
6491       'unique'       => [],
6492       'index'        => [], #recnum
6493       'foreign_keys' => [
6494                           { columns    => [ 'svcnum' ],
6495                             table      => 'cust_svc',
6496                           },
6497                         ],
6498     },
6499
6500     'areacode'  => {
6501       'columns' => [
6502         'areanum',   'serial',        '',      '', '', '',
6503         'code',        'char',        '',       3, '', '', 
6504         'country',     'char',    'NULL',       2, '', '',
6505         'state',       'char',    'NULL',       2, '', '', 
6506         'description','varchar',  'NULL',     255, '', '',
6507       ], 
6508       'primary_key' => 'areanum',
6509       'unique' => [ [ 'areanum' ] ],
6510       'index'  => [],
6511     },
6512
6513     'upgrade_journal' => {
6514       'columns' => [
6515         'upgradenum', 'serial', '', '', '', '',
6516         '_date', 'int', '', '', '', '',
6517         'upgrade', 'varchar', '', $char_d, '', '',
6518         'status', 'varchar', '', $char_d, '', '',
6519         'statustext', 'varchar', 'NULL', $char_d, '', '',
6520       ],
6521       'primary_key' => 'upgradenum',
6522       'unique' => [],
6523       'index' => [ [ 'upgrade' ] ],
6524     },
6525
6526     'upload_target' => {
6527       'columns' => [
6528         'targetnum', 'serial', '', '', '', '',
6529         'agentnum', 'int', 'NULL', '', '', '',
6530         'protocol', 'varchar', '', 10, '', '',
6531         'hostname', 'varchar', '', $char_d, '', '',
6532         'port', 'int', 'NULL', '', '', '',
6533         'username', 'varchar', '', $char_d, '', '',
6534         'password', 'varchar', 'NULL', $char_d, '', '',
6535         'path', 'varchar', 'NULL', $char_d, '', '',
6536         'subject', 'varchar', 'NULL', '255', '', '',
6537         'handling', 'varchar', 'NULL', $char_d, '', '',
6538       ],
6539       'primary_key'   => 'targetnum',
6540       'unique'        => [ [ 'targetnum' ] ],
6541       'index'         => [],
6542       'foreign_keys' => [
6543                           { columns    => [ 'agentnum' ],
6544                             table      => 'agent',
6545                           },
6546                         ],
6547     },
6548
6549     'log' => {
6550       'columns' => [
6551         'lognum',     'serial', '', '', '', '',
6552         '_date',      'int', '', '', '', '',
6553         'agentnum',   'int', 'NULL', '', '', '',
6554         'tablename',  'varchar', 'NULL', $char_d, '', '',
6555         'tablenum',   'int',  'NULL', '', '', '', 
6556         'level',      'int',  '', '', '', '',
6557         'message',    'text', '', '', '', '',
6558       ],
6559       'primary_key'  => 'lognum',
6560       'unique'       => [],
6561       'index'        => [ ['_date'], ['level'] ],
6562       'foreign_keys' => [
6563                           { columns    => [ 'agentnum' ],
6564                             table      => 'agent',
6565                           },
6566                         ],
6567     },
6568
6569     'log_context' => {
6570       'columns' => [
6571         'logcontextnum', 'serial', '', '', '', '',
6572         'lognum', 'int', '', '', '', '',
6573         'context', 'varchar', '', $char_d, '', '',
6574       ],
6575       'primary_key'  => 'logcontextnum',
6576       'unique'       => [ [ 'lognum', 'context' ] ],
6577       'index'        => [],
6578       'foreign_keys' => [
6579                           { columns    => [ 'lognum' ],
6580                             table      => 'log',
6581                           },
6582                         ],
6583     },
6584
6585     'log_email' => {
6586       'columns' => [
6587         'logemailnum', 'serial', '', '', '', '',
6588         'context', 'varchar', 'NULL', $char_d, '', '',
6589         'min_level', 'int',  'NULL', '', '', '',
6590         'msgnum', 'int', '',  '', '', '',
6591         'to_addr', 'varchar', 'NULL',     255, '', '',
6592       ],
6593       'primary_key'  => 'logemailnum',
6594       'unique'       => [],
6595       'index'        => [ ['context'], ['min_level'] ],
6596       'foreign_keys' => [
6597                           { columns    => [ 'msgnum' ],
6598                             table      => 'msg_template',
6599                             references => [ 'msgnum' ],
6600                           },
6601                         ],
6602     },
6603
6604     'svc_alarm' => {
6605       'columns' => [
6606 #       name               type        null   length   default local
6607         'svcnum',          'int',      '',    '',      '',     '', 
6608         'alarmsystemnum',  'int',      '',    '',      '',     '',
6609         'alarmtypenum',    'int',      '',    '',      '',     '',
6610         'alarmstationnum', 'int',      '',    '',      '',     '',
6611         'acctnum',         'varchar',  '',    $char_d, '',     '',
6612         '_password',       'varchar',  '',    $char_d, '',     '',
6613         'location',        'varchar', 'NULL', $char_d, '',     '',
6614         'cs_receiver',     'int',     'NULL', '',      '',     '',
6615         'cs_phonenum',     'varchar', 'NULL', $char_d, '',     '',
6616         'serialnum',       'varchar', 'NULL', $char_d, '',     '',
6617         #installer (rep)
6618       ],
6619       'primary_key'  => 'svcnum',
6620       'unique'       => [],
6621       'index'        => [],
6622       'foreign_keys' => [
6623                           { columns    => [ 'svcnum' ],
6624                             table      => 'cust_svc',
6625                           },
6626                           { columns    => [ 'alarmsystemnum' ],
6627                             table      => 'alarm_system',
6628                           },
6629                           { columns    => [ 'alarmtypenum' ],
6630                             table      => 'alarm_type',
6631                           },
6632                           { columns    => [ 'alarmstationnum' ],
6633                             table      => 'alarm_station',
6634                           },
6635                         ],
6636     },
6637
6638     'alarm_system' => { #vendors
6639       'columns' => [
6640         'alarmsystemnum',  'serial',     '',      '', '', '',
6641         'agentnum',           'int', 'NULL',      '', '', '',
6642         'systemname',     'varchar',     '', $char_d, '', '',
6643         'disabled',          'char', 'NULL',       1, '', '', 
6644       ],
6645       'primary_key' => 'alarmsystemnum',
6646       'unique'      => [ ['agentnum', 'systemname'] ],
6647       'index'       => [ ['agentnum'], ['disabled'] ],
6648       'foreign_keys' => [
6649                           { columns    => [ 'agentnum' ],
6650                             table      => 'agent',
6651                           },
6652                         ],
6653     },
6654
6655     'alarm_type' => { #inputs and outputs
6656       'columns' => [
6657         'alarmtypenum', 'serial',     '',      '', '', '',
6658         'agentnum',        'int', 'NULL',      '', '', '',
6659         'inputs',          'int',     '', '', '', '',
6660         'outputs',         'int',     '', '', '', '',
6661         'disabled',       'char', 'NULL',       1, '', '', 
6662       ],
6663       'primary_key' => 'alarmtypenum',
6664       'unique'      => [ ['agentnum', 'inputs', 'outputs'] ],
6665       'index'       => [ ['agentnum'], ['disabled'] ],
6666       'foreign_keys' => [
6667                           { columns    => [ 'agentnum' ],
6668                             table      => 'agent',
6669                           },
6670                         ],
6671     },
6672
6673     'alarm_station' => { #central station (where the alarm reports to)
6674       'columns' => [
6675         'alarmstationnum', 'serial',     '',      '', '', '',
6676         'agentnum',           'int', 'NULL',      '', '', '',
6677         'stationname',    'varchar',     '', $char_d, '', '',
6678         'disabled',          'char', 'NULL',       1, '', '', 
6679       ],
6680       'primary_key' => 'alarmstationnum',
6681       'unique'      => [ ['agentnum', 'stationname'], ],
6682       'index'       => [ ['agentnum'], ['disabled'] ],
6683       'foreign_keys' => [
6684                           { columns    => [ 'agentnum' ],
6685                             table      => 'agent',
6686                           },
6687                         ],
6688     },
6689
6690     'svc_cable' => {
6691       'columns' => [
6692         'svcnum',        'int',     '',      '', '', '', 
6693         'providernum',   'int', 'NULL',      '', '', '',
6694         'ordernum',  'varchar', 'NULL', $char_d, '', '',
6695         'modelnum',      'int', 'NULL',      '', '', '',
6696         'serialnum', 'varchar', 'NULL', $char_d, '', '',
6697         'mac_addr',  'varchar', 'NULL',      12, '', '', 
6698       ],
6699       'primary_key'  => 'svcnum',
6700       'unique'       => [ ['serialnum'] , ['mac_addr'] ],
6701       'index'        => [],
6702       'foreign_keys' => [
6703                           { columns    => [ 'svcnum' ],
6704                             table      => 'cust_svc',
6705                           },
6706                           { columns    => [ 'providernum' ],
6707                             table      => 'cable_provider',
6708                           },
6709                           { columns    => [ 'modelnum' ],
6710                             table      => 'cable_model',
6711                           },
6712                         ],
6713     },
6714
6715     'cable_model' => {
6716       'columns' => [
6717         'modelnum',    'serial',     '',      '', '', '',
6718         'model_name', 'varchar',     '', $char_d, '', '',
6719         'disabled',      'char', 'NULL',       1, '', '', 
6720       ],
6721       'primary_key' => 'modelnum',
6722       'unique' => [ [ 'model_name' ], ],
6723       'index'  => [],
6724     },
6725
6726     'cable_provider' => {
6727       'columns' => [
6728         'providernum', 'serial',     '',      '', '', '',
6729         'provider',   'varchar',     '', $char_d, '', '',
6730         'disabled',      'char', 'NULL',       1, '', '', 
6731       ],
6732       'primary_key' => 'providernum',
6733       'unique' => [ [ 'provider' ], ],
6734       'index'  => [],
6735     },
6736
6737     'svc_conferencing' => {
6738       'columns' => [
6739         'svcnum',            'int',     '',      '', '', '',
6740         'conf_id',           'int', 'NULL',      '', '', '', #"system assigned"
6741         'conf_name',     'varchar',     '', $char_d, '', '',
6742         'conf_password', 'varchar',     '', $char_d, '', '',
6743         'access_code',   'varchar',     '',      16, '', '',
6744         'duration',          'int',     '',      '', '', '',
6745         'participants',      'int',     '',      '', '', '',
6746         'conftypenum',       'int',     '',      '', '', '',
6747         'confqualitynum',    'int',     '',      '', '', '',
6748         'opt_recording',    'char', 'NULL',       1, '', '',
6749         'opt_sip',          'char', 'NULL',       1, '', '',
6750         'opt_phone',        'char', 'NULL',       1, '', '',
6751       ],
6752       'primary_key' => 'svcnum',
6753       'unique' => [],
6754       'index'  => [],
6755       'foreign_keys' => [
6756                           { columns => [ 'svcnum' ],
6757                             table   => 'cust_svc',
6758                           },
6759                           { columns => [ 'conftypenum' ],
6760                             table   => 'conferencing_type',
6761                           },
6762                           { columns => [ 'confqualitynum' ],
6763                             table   => 'conferencing_quality',
6764                           },
6765                         ],
6766     },
6767
6768     'conferencing_type' => {
6769       'columns' => [
6770         'conftypenum',  'int',     '',      '', '', '',
6771         'typeid'      , 'int',     '',      '', '', '',
6772         'typename', 'varchar',     '', $char_d, '', '',
6773         'disabled',    'char', 'NULL',       1, '', '', 
6774       ],
6775       'primary_key' => 'conftypenum',
6776       'unique'      => [ [ 'typeid', 'disabled' ], [ 'typename', 'disabled' ] ],
6777       'index'       => [],
6778     },
6779
6780     'conferencing_quality' => {
6781       'columns' => [
6782         'confqualitynum',  'int',     '',      '', '', '',
6783         'qualityid'      , 'int',     '',      '', '', '',
6784         'qualityname', 'varchar',     '', $char_d, '', '',
6785         'disabled',       'char', 'NULL',       1, '', '', 
6786       ],
6787       'primary_key' => 'confqualitynum',
6788       'unique'      => [ [ 'qualityid', 'disabled' ], [ 'qualityname', 'disabled' ] ],
6789       'index'       => [],
6790     },
6791
6792     'svc_video' => {
6793       'columns' => [
6794         'svcnum',            'int', '', '', '', '',
6795         'smartcard_num', 'varchar', '', 16, '', '',
6796         'mac_addr',      'varchar', '', 12, '', '', 
6797         'duration',          'int', '', '', '', '',
6798       ],
6799       'primary_key' => 'svcnum',
6800       'unique' => [], # [ 'smartcard_num' ], [ 'mac_addr' ], ],
6801       'index'  => [],
6802       'foreign_keys' => [
6803                           { columns => [ 'svcnum' ],
6804                             table   => 'cust_svc',
6805                           },
6806                         ],
6807     },
6808
6809     'circuit_type' => {
6810       'columns' => [
6811         'typenum',     'serial',     '',      '', '', '',
6812         'typename',   'varchar',     '', $char_d, '', '',
6813         'disabled',      'char', 'NULL',       1, '', '',
6814         # speed? number of voice lines? anything else?
6815       ],
6816       'primary_key' => 'typenum',
6817       'unique' => [ [ 'typename' ] ],
6818       'index'  => [],
6819     },
6820
6821     'circuit_provider' => {
6822       'columns' => [
6823         'providernum', 'serial',     '',      '', '', '',
6824         'provider',   'varchar',     '', $char_d, '', '',
6825         'disabled',      'char', 'NULL',       1, '', '', 
6826       ],
6827       'primary_key' => 'providernum',
6828       'unique' => [ [ 'provider' ], ],
6829       'index'  => [],
6830     },
6831
6832     'circuit_termination' => {
6833       'columns' => [
6834         'termnum',     'serial',     '',      '', '', '',
6835         'termination','varchar',     '', $char_d, '', '',
6836         'disabled',      'char', 'NULL',       1, '', '',
6837       ],
6838       'primary_key' => 'termnum',
6839       'unique' => [ [ 'termination' ] ],
6840       'index' => [],
6841     },
6842
6843     'svc_circuit' => {
6844       'columns' => [
6845         'svcnum',                   'int',     '', '', '', '',
6846         'typenum',                  'int',     '', '', '', '',
6847         'providernum',              'int',     '', '', '', '',
6848         'termnum',                  'int',     '', '', '', '',
6849         'circuit_id',           'varchar',     '', 64, '', '',
6850         'desired_due_date',         'int', 'NULL', '', '', '',
6851         'due_date',                 'int', 'NULL', '', '', '',
6852         'vendor_order_id',      'varchar', 'NULL', $char_d,  '', '',
6853         'vendor_qual_id',       'varchar', 'NULL', $char_d,  '', '',
6854         'vendor_order_type',    'varchar', 'NULL', $char_d,  '', '',
6855         'vendor_order_status',  'varchar', 'NULL', $char_d,  '', '',
6856         'endpoint_ip_addr',     'varchar', 'NULL', 40, '', '',
6857         'endpoint_mac_addr',    'varchar', 'NULL', 12, '', '',
6858       ],
6859       'primary_key' => 'svcnum',
6860       'unique'      => [],
6861       'index'       => [ [ 'providernum' ], [ 'typenum' ] ],
6862       'foreign_keys' => [
6863                           { columns => [ 'svcnum' ],
6864                             table   => 'cust_svc',
6865                           },
6866                           { columns => [ 'typenum' ],
6867                             table   => 'circuit_type',
6868                           },
6869                           { columns => [ 'providernum' ],
6870                             table   => 'circuit_provider',
6871                           },
6872                           { columns => [ 'termnum' ],
6873                             table   => 'circuit_termination',
6874                           },
6875       ],
6876     },
6877
6878     'svc_fiber' => {
6879       'columns' => [
6880         'svcnum',         'int',     '',      '', '', '',
6881         'oltnum',         'int', 'NULL',      '', '', '',
6882         'shelf',          'int', 'NULL',      '', '', '',
6883         'card',           'int', 'NULL',      '', '', '',
6884         'olt_port',       'int', 'NULL',      '', '', '',
6885         'ont_id',         'int', 'NULL',      '', '', '',
6886         'ont_typenum',    'int', 'NULL',      '', '', '',
6887         'ont_serial', 'varchar', 'NULL', $char_d, '', '',
6888         'ont_port',   'varchar', 'NULL',      16, '', '',
6889         'vlan',           'int', 'NULL',      '', '', '',
6890         'signal',         'int', 'NULL',      '', '', '',
6891         'speed_up',       'int', 'NULL',      '', '', '',
6892         'speed_down',     'int', 'NULL',      '', '', '',
6893         'ont_install','varchar', 'NULL', $char_d, '', '',
6894       ],
6895       'primary_key' => 'svcnum',
6896       'unique'      => [ ],
6897       'index'       => [ [ 'ont_serial' ] ],
6898       'foreign_keys' => [
6899                           { columns => [ 'svcnum' ],
6900                             table   => 'cust_svc',
6901                           },
6902                           { columns => [ 'oltnum' ],
6903                             table   => 'fiber_olt',
6904                           },
6905                           { columns => [ 'ont_typenum' ],
6906                             table   => 'hardware_type',
6907                             references => [ 'typenum' ],
6908                           },
6909                         ],
6910     },
6911
6912     'fiber_olt' => {
6913       'columns' => [
6914         'oltnum',   'serial', '',       '', '', '',
6915         'oltname', 'varchar', '',  $char_d, '', '',
6916         'serial',  'varchar', '',  $char_d, '', '',
6917         'disabled',   'char', 'NULL',    1, '', '',
6918       ],
6919       'primary_key' => 'oltnum',
6920       'unique' => [ ],
6921       'index'  => [ ],
6922     },
6923
6924     'vend_main' => {
6925       'columns' => [
6926         'vendnum',   'serial',     '',      '', '', '',
6927         'vendname', 'varchar',     '', $char_d, '', '',
6928         'classnum',     'int',     '',      '', '', '',
6929         'disabled',    'char', 'NULL',       1, '', '', 
6930       ],
6931       'primary_key'  => 'vendnum',
6932       'unique'       => [ ['vendname', 'disabled'] ],
6933       'index'        => [],
6934       'foreign_keys' => [
6935                           { columns    => [ 'classnum' ],
6936                             table      => 'vend_class',
6937                           },
6938                         ],
6939     },
6940
6941     'vend_class' => {
6942       'columns' => [
6943         'classnum',     'serial',     '',      '', '', '', 
6944         'classname',   'varchar',     '', $char_d, '', '', 
6945         'disabled',       'char', 'NULL',       1, '', '', 
6946       ],
6947       'primary_key' => 'classnum',
6948       'unique'      => [],
6949       'index'       => [ ['disabled'] ],
6950     },
6951
6952     'vend_bill' => {
6953       'columns' => [
6954         'vendbillnum',    'serial',     '',      '', '', '', 
6955         'vendnum',           'int',     '',      '', '', '', 
6956         #'_date',        @date_type,                  '', '', 
6957         '_date',     'int', '', '',                   '', '', 
6958         'charged',     @money_type,                  '', '', 
6959       ],
6960       'primary_key'  => 'vendbillnum',
6961       'unique'       => [],
6962       'index'        => [ ['vendnum'], ['_date'], ],
6963       'foreign_keys' => [
6964                           { columns    => [ 'vendnum' ],
6965                             table      => 'vend_main',
6966                           },
6967                         ],
6968     },
6969
6970     'vend_pay' => {
6971       'columns' => [
6972         'vendpaynum',   'serial',    '',       '', '', '',
6973         'vendnum',         'int',    '',       '', '', '', 
6974         #'_date',     @date_type,                   '', '', 
6975         '_date',     'int', '', '',                   '', '', 
6976         'paid',      @money_type,                  '', '', 
6977       ],
6978       'primary_key'  => 'vendpaynum',
6979       'unique'       => [],
6980       'index'        => [ [ 'vendnum' ], [ '_date' ], ],
6981       'foreign_keys' => [
6982                           { columns    => [ 'vendnum' ],
6983                             table      => 'vend_main',
6984                           },
6985                         ],
6986     },
6987
6988     'vend_bill_pay' => {
6989       'columns' => [
6990         'vendbillpaynum', 'serial',     '',   '', '', '', 
6991         'vendbillnum',       'int',     '',   '', '', '', 
6992         'vendpaynum',        'int',     '',   '', '', '', 
6993         'amount',  @money_type, '', '', 
6994         #? '_date',   @date_type, '', '', 
6995       ],
6996       'primary_key'  => 'vendbillpaynum',
6997       'unique'       => [],
6998       'index'        => [ [ 'vendbillnum' ], [ 'vendpaynum' ] ],
6999       'foreign_keys' => [
7000                           { columns    => [ 'vendbillnum' ],
7001                             table      => 'vend_bill',
7002                           },
7003                           { columns    => [ 'vendpaynum' ],
7004                             table      => 'vend_pay',
7005                           },
7006                         ],
7007     },
7008
7009     %{ tables_hashref_torrus() },
7010
7011     # tables of ours for doing torrus virtual port combining
7012     'torrus_srvderive' => {
7013       'columns' => [
7014         'derivenum',     'serial',     '', '', '', '',
7015         'serviceid',    'varchar',     '', 64, '', '', #srvexport / reportfields
7016         'last_srv_date',   'date', 'NULL', '', '', '',
7017       ],
7018       'primary_key' => 'derivenum',
7019       'unique' => [ ['serviceid'] ],
7020       'index'  => [],
7021     },
7022
7023     'torrus_srvderive_component' => {
7024       'columns' => [
7025         'componentnum', 'serial', '', '', '', '',
7026         'derivenum',       'int', '', '', '', '',
7027         'serviceid',   'varchar', '', 64, '', '', #srvexport / reportfields
7028       ],
7029       'primary_key'  => 'componentnum',
7030       'unique'       => [ [ 'derivenum', 'serviceid' ], ],
7031       'index'        => [ [ 'derivenum', ], ],
7032       'foreign_keys' => [
7033                           { columns    => [ 'derivenum' ],
7034                             table      => 'torrus_srvderive',
7035                           },
7036                         ],
7037     },
7038
7039     'invoice_mode' => {
7040       'columns' => [
7041         'modenum',      'serial', '', '', '', '',
7042         'agentnum',        'int', 'NULL', '', '', '',
7043         'modename',    'varchar', '', 32, '', '',
7044       ],
7045       'primary_key' => 'modenum',
7046       'unique'      => [ ],
7047       'index'       => [ ],
7048       'foreign_keys' => [
7049                           { columns    => [ 'agentnum' ],
7050                             table      => 'agent',
7051                           },
7052                         ],
7053     },
7054
7055     'invoice_conf' => {
7056       'columns' => [
7057         'confnum',              'serial',   '', '', '', '',
7058         'modenum',              'int',      '', '', '', '',
7059         'locale',               'varchar',  'NULL', 16, '', '',
7060         'notice_name',          'varchar',  'NULL', 64, '', '',
7061         'subject',              'varchar',  'NULL', 64, '', '',
7062         'htmlnotes',            'text',     'NULL', '', '', '',
7063         'htmlfooter',           'text',     'NULL', '', '', '',
7064         'htmlsummary',          'text',     'NULL', '', '', '',
7065         'htmlreturnaddress',    'text',     'NULL', '', '', '',
7066         'latexnotes',           'text',     'NULL', '', '', '',
7067         'latexfooter',          'text',     'NULL', '', '', '',
7068         'latexsummary',         'text',     'NULL', '', '', '',
7069         'latexsmallfooter',     'text',     'NULL', '', '', '',
7070         'latexreturnaddress',   'text',     'NULL', '', '', '',
7071         'with_latexcoupon',     'char',     'NULL', '1', '', '',
7072         'htmlwatermark',        'text',     'NULL', '', '', '',
7073         'latexwatermark',       'text',     'NULL', '', '', '',
7074         'lpr',                  'varchar',  'NULL', $char_d, '', '',
7075       ],
7076       'primary_key'  => 'confnum',
7077       'unique'       => [ [ 'modenum', 'locale' ] ],
7078       'index'        => [ ],
7079       'foreign_keys' => [
7080                           { columns    => [ 'modenum' ],
7081                             table      => 'invoice_mode',
7082                           },
7083                         ],
7084     },
7085
7086     'export_batch' => {
7087       'columns' => [
7088         'batchnum',    'serial',     '',      '', '', '',
7089         'exportnum',      'int',     '',      '', '', '',
7090         '_date',          'int',     '',      '', '', '',
7091         'status',     'varchar', 'NULL',      32, '', '',
7092         'statustext',    'text', 'NULL',      '', '', '',
7093       ],
7094       'primary_key'  => 'batchnum',
7095       'unique'       => [],
7096       'index'        => [ [ 'exportnum' ], [ 'status' ] ],
7097       'foreign_keys' => [
7098                           { columns    => [ 'exportnum' ],
7099                             table      => 'part_export',
7100                             references => [ 'exportnum' ]
7101                           },
7102                         ],
7103     },
7104
7105     'export_batch_item' => {
7106       'columns' => [
7107         'itemnum',     'serial',     '',      '', '', '',
7108         'batchnum',       'int',     '',      '', '', '',
7109         'svcnum',         'int',     '',      '', '', '',
7110         'action',     'varchar',     '',      32, '', '',
7111         'data',          'text', 'NULL',      '', '', '',
7112         'frozen',        'char', 'NULL',       1, '', '',
7113       ],
7114       'primary_key'  => 'itemnum',
7115       'unique'       => [],
7116       'index'        => [ [ 'batchnum' ], [ 'svcnum' ] ],
7117       'foreign_keys' => [
7118                           { columns    => [ 'batchnum' ],
7119                             table      => 'export_batch',
7120                             references => [ 'batchnum' ]
7121                           },
7122                         ],
7123     },
7124
7125     # lookup table for states, similar to msa and lata
7126     'state' => {
7127       'columns' => [
7128         'statenum', 'int',  '', '', '', '', 
7129         'country',  'char', '',  2, '', '',
7130         'state',    'char', '', $char_d, '', '', 
7131         'fips',     'char', '',  3, '', '',
7132       ],
7133       'primary_key' => 'statenum',
7134       'unique' => [ [ 'country', 'state' ], ],
7135       'index' => [],
7136     },
7137
7138     # eventually link to tower/sector?
7139     'deploy_zone' => {
7140       'columns' => [
7141         'zonenum',        'serial',  '',     '',      '', '',
7142         'description',    'char',    'NULL', $char_d, '', '',
7143         'agentnum',       'int',     '',     '',      '', '',
7144         'censusyear',     'char',    'NULL', 4,      '', '',
7145         'dbaname',        'char',    'NULL', $char_d, '', '',
7146         'zonetype',       'char',    '',     1,       '', '',
7147         'technology',     'int',     '',     '',      '', '',
7148         'spectrum',       'int',     'NULL', '',      '', '',
7149         'adv_speed_up',   'decimal', '',     '10,3', '0', '',
7150         'adv_speed_down', 'decimal', '',     '10,3', '0', '',
7151         'cir_speed_up',   'decimal', '',     '10,3', '0', '',
7152         'cir_speed_down', 'decimal', '',     '10,3', '0', '',
7153         'is_broadband',   'char',    'NULL', 1,       '', '',
7154         'is_voice',       'char',    'NULL', 1,       '', '',
7155         'is_consumer',    'char',    'NULL', 1,       '', '',
7156         'is_business',    'char',    'NULL', 1,       '', '',
7157         'active_date',    @date_type,                 '', '',
7158         'expire_date',    @date_type,                 '', '',
7159       ],
7160       'primary_key' => 'zonenum',
7161       'unique' => [],
7162       'index'  => [ [ 'agentnum' ] ],
7163       'foreign_keys' => [
7164                           { columns     => [ 'agentnum' ],
7165                             table       => 'agent',
7166                             references  => [ 'agentnum' ],
7167                           },
7168                         ],
7169     },
7170
7171     'deploy_zone_block' => {
7172       'columns' => [
7173         'blocknum',       'serial',  '',     '',      '', '',
7174         'zonenum',        'int',     '',     '',      '', '',
7175         'censusblock',    'char',    '',     15,      '', '',
7176         'censusyear',     'char','NULL',      4,      '', '',
7177       ],
7178       'primary_key' => 'blocknum',
7179       'unique' => [],
7180       'index'  => [ [ 'zonenum' ] ],
7181       'foreign_keys' => [
7182                           { columns     => [ 'zonenum' ],
7183                             table       => 'deploy_zone',
7184                             references  => [ 'zonenum' ],
7185                           },
7186                         ],
7187     },
7188
7189     'deploy_zone_vertex' => {
7190       'columns' => [
7191         'vertexnum',      'serial',  '',     '',      '', '',
7192         'zonenum',        'int',     '',     '',      '', '',
7193         'latitude',       'decimal', '',     '10,7',  '', '', 
7194         'longitude',      'decimal', '',     '10,7',  '', '', 
7195       ],
7196       'primary_key' => 'vertexnum',
7197       'unique' => [ ],
7198       'index'  => [ ],
7199       'foreign_keys' => [
7200                           { columns     => [ 'zonenum' ],
7201                             table       => 'deploy_zone',
7202                             references  => [ 'zonenum' ],
7203                           },
7204                         ],
7205     },
7206
7207     'cacti_page' => {
7208       'columns' => [
7209         'cacti_pagenum',  'serial',   '',     '', '', '',
7210         'exportnum',      'int',      'NULL', '', '', '',
7211         'svcnum',         'int',      'NULL', '', '', '', 
7212         'graphnum',       'int',      'NULL', '', '', '', 
7213         'imported',       @date_type,             '', '',
7214         'content',        'text',     'NULL', '', '', '',
7215       ],
7216       'primary_key' => 'cacti_pagenum',
7217       'unique'  => [ ],
7218       'index'   => [ ['svcnum'], ['imported'] ],
7219       'foreign_keys' => [
7220                           { columns    => [ 'svcnum' ],
7221                             table      => 'cust_svc',
7222                             references => [ 'svcnum' ],
7223                           },
7224                           { columns    => [ 'exportnum' ],
7225                             table      => 'part_export',
7226                             references => [ 'exportnum' ],
7227                           },
7228                         ],
7229     },
7230
7231     'report_batch' => {
7232       'columns' => [
7233         'reportbatchnum', 'serial',      '',  '', '', '',
7234         'reportname',     'varchar',     '', 255, '', '',
7235         'agentnum',           'int', 'NULL',  '', '', '',
7236         'send_date',     @date_type,              '', '',
7237         'sdate',         @date_type,              '', '',
7238         'edate',         @date_type,              '', '',
7239         'usernum',            'int', 'NULL',  '', '', '',
7240         'msgnum',             'int', 'NULL',  '', '', '',
7241         # add report params here as necessary
7242       ],
7243       'primary_key' => 'reportbatchnum',
7244       'unique' => [],
7245       'index'  => [],
7246       'foreign_keys' => [
7247                           { columns    => [ 'agentnum' ],
7248                             table      => 'agent',
7249                             references => [ 'agentnum' ],
7250                           },
7251                           { columns    => [ 'usernum' ],
7252                             table      => 'access_user',
7253                             references => [ 'usernum' ],
7254                           },
7255                           { columns    => [ 'msgnum' ],
7256                             table      => 'msg_template',
7257                             references => [ 'msgnum' ],
7258                           },
7259                         ],
7260     },
7261
7262     'password_history' => {
7263       'columns' => [
7264         'passwordnum',        'serial',  '',          '', '', '',
7265         '_password',          'varchar', 'NULL', $char_d, '', '',
7266         'encryption_method',  'varchar', 'NULL', $char_d, '', '',
7267         'created',   @date_type,   '', '',
7268         # each table that needs password history gets a column here, and
7269         # an entry in foreign_keys.
7270         'svc_acct__svcnum',     'int', 'NULL', '', '', '',
7271         'svc_dsl__svcnum',      'int', 'NULL', '', '', '',
7272         'svc_alarm__svcnum',    'int', 'NULL', '', '', '',
7273         'agent__agentnum',      'int', 'NULL', '', '', '',
7274         'contact__contactnum',  'int', 'NULL', '', '', '',
7275         'access_user__usernum', 'int', 'NULL', '', '', '',
7276       ],
7277       'primary_key' => 'passwordnum',
7278       'unique' => [],
7279       'index'  => [],
7280       'foreign_keys' => [
7281                           { columns     => [ 'svc_acct__svcnum' ],
7282                             table       => 'svc_acct',
7283                             references  => [ 'svcnum' ],
7284                           },
7285                           { columns     => [ 'svc_dsl__svcnum' ],
7286                             table       => 'svc_dsl',
7287                             references  => [ 'svcnum' ],
7288                           },
7289                           { columns     => [ 'svc_alarm__svcnum' ],
7290                             table       => 'svc_alarm',
7291                             references  => [ 'svcnum' ],
7292                           },
7293                           { columns    => [ 'agent__agentnum' ],
7294                             table      => 'agent',
7295                             references => [ 'agentnum' ],
7296                           },
7297                           { columns    => [ 'contact__contactnum' ],
7298                             table      => 'contact',
7299                             references => [ 'contactnum' ],
7300                           },
7301                           { columns    => [ 'access_user__usernum' ],
7302                             table      => 'access_user',
7303                             references => [ 'usernum' ],
7304                           },
7305                         ],
7306     },
7307
7308     # name type nullability length default local
7309
7310     #'new_table' => {
7311     #  'columns' => [
7312     #    'num', 'serial',       '', '', '', '',
7313     #  ],
7314     #  'primary_key' => 'num',
7315     #  'unique' => [],
7316     #  'index'  => [],
7317     #},
7318
7319   };
7320
7321 }
7322
7323 =back
7324
7325 =head1 BUGS
7326
7327 =head1 SEE ALSO
7328
7329 L<DBIx::DBSchema>
7330
7331 =cut
7332
7333 1;
7334