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