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