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