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