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