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