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