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