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