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