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