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