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