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