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