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