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