Adding line 246 "edit global pockage definitions costs" back in
[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',   'NULL',   $char_d, '', '', 
2851         'reasonnum',   'int', 'NULL', '', '', '',
2852         'payby',        'char',   '',     4, '', '', # CARD/BILL/COMP, should
2853                                                      # be index into payby
2854                                                      # table eventually
2855         'payinfo',      'varchar',   'NULL', 512, '', '', #see cust_main above
2856         'paymask', 'varchar', 'NULL', $char_d, '', '', 
2857         'paybatch',     'varchar',   'NULL', $char_d, '', '', 
2858         'closed',    'char', 'NULL', 1, '', '', 
2859         # credit card/EFT fields (formerly in paybatch)
2860         'gatewaynum',     'int', 'NULL', '', '', '', # payment_gateway FK
2861         'processor',  'varchar', 'NULL', $char_d, '', '', # module name
2862         'auth',       'varchar','NULL',16, '', '', # CC auth number
2863         'order_number', 'varchar','NULL',$char_d, '', '', # transaction number
2864       ],
2865       'primary_key'  => 'refundnum',
2866       'unique'       => [],
2867       'index'        => [ ['custnum'], ['_date'], [ 'usernum' ], ],
2868       'foreign_keys' => [
2869                           { columns    => [ 'custnum' ],
2870                             table      => 'cust_main',
2871                           },
2872                           { columns    => [ 'usernum' ],
2873                             table      => 'access_user',
2874                           },
2875                           { columns    => [ 'reasonnum' ],
2876                             table      => 'reason',
2877                           },
2878                           { columns    => [ 'gatewaynum' ],
2879                             table      => 'payment_gateway',
2880                           },
2881                         ],
2882     },
2883
2884     'cust_credit_refund' => {
2885       'columns' => [
2886         'creditrefundnum', 'serial',     '',   '', '', '', 
2887         'crednum',  'int',     '',   '', '', '', 
2888         'refundnum',  'int',     '',   '', '', '', 
2889         'amount',  @money_type, '', '', 
2890         '_date',   @date_type, '', '', 
2891       ],
2892       'primary_key'  => 'creditrefundnum',
2893       'unique'       => [],
2894       'index'        => [ ['crednum'], ['refundnum'] ],
2895       'foreign_keys' => [
2896                           { columns    => [ 'crednum' ],
2897                             table      => 'cust_credit',
2898                           },
2899                           { columns    => [ 'refundnum' ],
2900                             table      => 'cust_refund',
2901                           },
2902                         ],
2903     },
2904
2905
2906     'cust_svc' => {
2907       'columns' => [
2908         'svcnum',      'serial',     '', '', '', '', 
2909         'pkgnum',         'int', 'NULL', '', '', '', 
2910         'svcpart',        'int',     '', '', '', '', 
2911         'agent_svcid',    'int', 'NULL', '', '', '',
2912         'overlimit',           @date_type,   '', '', 
2913       ],
2914       'primary_key'  => 'svcnum',
2915       'unique'       => [],
2916       'index'        => [ ['svcnum'], ['pkgnum'], ['svcpart'],
2917                           ['agent_svcid'],
2918                         ],
2919       'foreign_keys' => [
2920                           { columns    => [ 'pkgnum' ],
2921                             table      => 'cust_pkg',
2922                           },
2923                           { columns    => [ 'svcpart' ],
2924                             table      => 'part_svc',
2925                           },
2926                         ],
2927     },
2928
2929     'cust_svc_option' => {
2930       'columns' => [
2931         'optionnum',   'serial', '', '', '', '', 
2932         'svcnum',      'int', '', '', '', '', 
2933         'optionname',  'varchar', '', $char_d, '', '', 
2934         'optionvalue', 'text', 'NULL', '', '', '', 
2935       ],
2936       'primary_key'  => 'optionnum',
2937       'unique'       => [],
2938       'index'        => [ [ 'svcnum' ], [ 'optionname' ] ],
2939       'foreign_keys' => [
2940                           { columns    => [ 'svcnum' ],
2941                             table      => 'cust_svc',
2942                           },
2943                         ],
2944     },
2945
2946     'svc_export_machine' => {
2947       'columns' => [
2948         'svcexportmachinenum', 'serial', '', '', '', '',
2949         'svcnum',                 'int', '', '', '', '', 
2950         'exportnum',              'int', '', '', '', '', 
2951         'machinenum',             'int', '', '', '', '',
2952       ],
2953       'primary_key'  => 'svcexportmachinenum',
2954       'unique'       => [ ['svcnum', 'exportnum'] ],
2955       'index'        => [],
2956       'foreign_keys' => [
2957                           { columns    => [ 'svcnum' ],
2958                             table      => 'cust_svc',
2959                           },
2960                           { columns    => [ 'exportnum' ],
2961                             table      => 'part_export',
2962                           },
2963                           { columns    => [ 'machinenum' ],
2964                             table      => 'part_export_machine',
2965                           },
2966                         ],
2967     },
2968
2969     'part_export_machine' => {
2970       'columns' => [
2971         'machinenum', 'serial', '', '', '', '',
2972         'exportnum',     'int', '', '', '', '',
2973         'machine',    'varchar', 'NULL', $char_d, '', '', 
2974         'disabled',      'char', 'NULL',       1, '', '',
2975       ],
2976       'primary_key'  => 'machinenum',
2977       'unique'       => [ [ 'exportnum', 'machine' ] ],
2978       'index'        => [ [ 'exportnum' ] ],
2979       'foreign_keys' => [
2980                           { columns    => [ 'exportnum' ],
2981                             table      => 'part_export',
2982                           },
2983                         ],
2984     },
2985
2986     'part_pkg' => {
2987       'columns' => [
2988         'pkgpart',       'serial',    '',   '', '', '', 
2989         'pkg',           'varchar',   '',   $char_d, '', '', 
2990         'comment',       'varchar', 'NULL', 2*$char_d, '', '', 
2991         'promo_code',    'varchar', 'NULL', $char_d, '', '', 
2992         'freq',          'varchar',   '',   $char_d, '', '', #billing frequency
2993         'setuptax',      'char', 'NULL', 1, '', '', 
2994         'recurtax',      'char', 'NULL', 1, '', '', 
2995         'plan',          'varchar', 'NULL', $char_d, '', '', 
2996         'disabled',      'char', 'NULL', 1, '', '', 
2997         'custom',        'char', 'NULL', 1, '', '', 
2998         'taxclass',      'varchar', 'NULL', $char_d, '', '', 
2999         'classnum',      'int',     'NULL', '', '', '', 
3000         'addon_classnum','int',     'NULL', '', '', '', 
3001         'taxproductnum', 'int',     'NULL', '', '', '', 
3002         'setup_cost',    @money_typen,          '', '',
3003         'recur_cost',    @money_typen,          '', '',
3004         'pay_weight',    'real',    'NULL', '', '', '',
3005         'credit_weight', 'real',    'NULL', '', '', '',
3006         'agentnum',      'int',     'NULL', '', '', '', 
3007         'fcc_ds0s',      'int',     'NULL', '', '', '', 
3008         'fcc_voip_class','char',    'NULL',  1, '', '',
3009         'no_auto',          'char', 'NULL',  1, '', '', 
3010         'recur_show_zero',  'char', 'NULL',  1, '', '',
3011         'setup_show_zero',  'char', 'NULL',  1, '', '',
3012         'successor',     'int',     'NULL', '', '', '',
3013         'family_pkgpart','int',     'NULL', '', '', '',
3014         'delay_start',   'int',     'NULL', '', '', '',
3015         'agent_pkgpartid', 'varchar', 'NULL', 20, '', '',
3016       ],
3017       'primary_key'  => 'pkgpart',
3018       'unique'       => [],
3019       'index'        => [ [ 'promo_code' ], [ 'disabled' ], [ 'classnum' ],
3020                           [ 'agentnum' ], ['no_auto'], ['agent_pkgpartid'],
3021                         ],
3022       'foreign_keys' => [
3023                           { columns    => [ 'classnum' ],
3024                             table      => 'pkg_class',
3025                           },
3026                           { columns    => [ 'addon_classnum' ],
3027                             table      => 'pkg_class',
3028                             references => [ 'classnum' ],
3029                           },
3030                           { columns    => [ 'taxproductnum' ],
3031                             table      => 'part_pkg_taxproduct',
3032                           },
3033                           { columns    => [ 'agentnum' ],
3034                             table      => 'agent',
3035                           },
3036                           { columns    => [ 'successor' ],
3037                             table      => 'part_pkg',
3038                             references => [ 'pkgpart' ],
3039                           },
3040                           { columns    => [ 'family_pkgpart' ],
3041                             table      => 'part_pkg',
3042                             references => [ 'pkgpart' ],
3043                           },
3044                         ],
3045     },
3046
3047     'part_pkg_msgcat' => {
3048       'columns' => [
3049         'pkgpartmsgnum',  'serial',     '',        '', '', '',
3050         'pkgpart',           'int',     '',        '', '', '',
3051         'locale',        'varchar',     '',        16, '', '',
3052         'pkg',           'varchar',     '',   $char_d, '', '', #longer/no limit?
3053         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
3054       ],
3055       'primary_key'  => 'pkgpartmsgnum',
3056       'unique'       => [ [ 'pkgpart', 'locale' ] ],
3057       'index'        => [],
3058       'foreign_keys' => [
3059                           { columns    => [ 'pkgpart' ],
3060                             table      => 'part_pkg',
3061                           },
3062                         ],
3063     },
3064
3065     'part_pkg_currency' => {
3066       'columns' => [
3067         'pkgcurrencynum', 'serial', '',      '', '', '',
3068         'pkgpart',           'int', '',      '', '', '',
3069         'currency',         'char', '',       3, '', '',
3070         'optionname',    'varchar', '', $char_d, '', '', 
3071         'optionvalue',      'text', '',      '', '', '', 
3072       ],
3073       'primary_key'  => 'pkgcurrencynum',
3074       'unique'       => [ [ 'pkgpart', 'currency', 'optionname' ] ],
3075       'index'        => [ ['pkgpart'] ],
3076       'foreign_keys' => [
3077                           { columns    => [ 'pkgpart' ],
3078                             table      => 'part_pkg',
3079                           },
3080                         ],
3081     },
3082
3083     'currency_exchange' => {
3084       'columns' => [
3085         'currencyratenum', 'serial', '',    '', '', '',
3086         'from_currency',     'char', '',     3, '', '',
3087         'to_currency',       'char', '',     3, '', '',
3088         'rate',           'decimal', '', '7,6', '', '',
3089       ],
3090       'primary_key' => 'currencyratenum',
3091       'unique'      => [ [ 'from_currency', 'to_currency' ] ],
3092       'index'       => [],
3093     },
3094
3095     'part_pkg_usageprice' => {
3096       'columns' => [
3097         'usagepricepart', 'serial',      '',      '', '', '',
3098         'pkgpart',           'int',      '',      '', '', '',
3099         'price',          @money_type,                '', '', 
3100         'currency',         'char',  'NULL',       3, '', '',
3101         'action',        'varchar',      '', $char_d, '', '',
3102         'target',        'varchar',      '', $char_d, '', '',
3103         'amount',        'varchar',      '', $char_d, '', '',
3104       ],
3105       'primary_key'  => 'usagepricepart',
3106       'unique'       => [ [ 'pkgpart', 'currency', 'target' ] ],
3107       'index'        => [ [ 'pkgpart' ] ],
3108       'foreign_keys' => [
3109                           { columns    => [ 'pkgpart' ],
3110                             table      => 'part_pkg',
3111                           },
3112                         ],
3113     },
3114
3115     'cust_pkg_usageprice' => {
3116       'columns' => [
3117         'usagepricenum', 'serial',      '',      '', '', '',
3118         'pkgnum',           'int',      '',      '', '', '',
3119         'usagepricepart',   'int',      '',      '', '', '',
3120         'quantity',         'int',      '',      '', '', '',
3121       ],
3122       'primary_key'  => 'usagepricenum',
3123       'unique'       => [ [ 'pkgnum', 'usagepricepart' ] ],
3124       'index'        => [ [ 'pkgnum' ] ],
3125       'foreign_keys' => [
3126                           { columns    => [ 'pkgnum' ],
3127                             table      => 'cust_pkg',
3128                           },
3129                           { columns    => [ 'usagepricepart' ],
3130                             table      => 'part_pkg_usageprice',
3131                           },
3132                         ],
3133     },
3134
3135     'part_fee' => {
3136       'columns' => [
3137         'feepart',       'serial',    '',   '', '', '',
3138         'itemdesc',      'varchar',   '',   $char_d,   '', '',
3139         'comment',       'varchar', 'NULL', 2*$char_d, '', '',
3140         'disabled',      'char',    'NULL',  1, '', '',
3141         'classnum',      'int',     'NULL', '', '', '',
3142         'taxclass',      'varchar', 'NULL', $char_d, '', '',
3143         'taxproductnum', 'int',     'NULL', '', '', '',
3144         'pay_weight',    'real',    'NULL', '', '', '',
3145         'credit_weight', 'real',    'NULL', '', '', '',
3146         'agentnum',      'int',     'NULL', '', '', '',
3147         'amount',   @money_type,                '', '', 
3148         'percent',     'decimal',    '', '7,4', '', '',
3149         'basis',         'varchar',  '',    16, '', '',
3150         'minimum',    @money_typen,             '', '',
3151         'maximum',    @money_typen,             '', '',
3152         'limit_credit',  'char',    'NULL',  1, '', '',
3153         'setuprecur',    'char',     '',     5, '', '',
3154         'taxable',       'char',    'NULL',  1, '', '',
3155       ],
3156       'primary_key'  => 'feepart',
3157       'unique'       => [],
3158       'index'        => [ [ 'disabled' ], [ 'classnum' ], [ 'agentnum' ]
3159                         ],
3160       'foreign_keys' => [
3161                           { columns    => [ 'classnum' ],
3162                             table      => 'pkg_class',
3163                           },
3164                           { columns    => [ 'taxproductnum' ],
3165                             table      => 'part_pkg_taxproduct',
3166                           },
3167                           { columns    => [ 'agentnum' ],
3168                             table      => 'agent',
3169                           },
3170                         ],
3171     },
3172
3173     'part_fee_msgcat' => {
3174       'columns' => [
3175         'feepartmsgnum',  'serial',     '',        '', '', '',
3176         'feepart',           'int',     '',        '', '', '',
3177         'locale',        'varchar',     '',        16, '', '',
3178         'itemdesc',      'varchar',     '',   $char_d, '', '', #longer/no limit?
3179         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
3180       ],
3181       'primary_key'  => 'feepartmsgnum',
3182       'unique'       => [ [ 'feepart', 'locale' ] ],
3183       'index'        => [],
3184       'foreign_keys' => [
3185                           { columns    => [ 'feepart' ],
3186                             table      => 'part_fee',
3187                           },
3188                         ],
3189     },
3190
3191
3192     'part_pkg_link' => {
3193       'columns' => [
3194         'pkglinknum',  'serial',   '',      '', '', '',
3195         'src_pkgpart', 'int',      '',      '', '', '',
3196         'dst_pkgpart', 'int',      '',      '', '', '', 
3197         'link_type',   'varchar',  '', $char_d, '', '',
3198         'hidden',      'char', 'NULL',       1, '', '',
3199       ],
3200       'primary_key'  => 'pkglinknum',
3201       'unique'       => [ ['src_pkgpart','dst_pkgpart','link_type','hidden'] ],
3202       'index'        => [ [ 'src_pkgpart' ] ],
3203       'foreign_keys' => [
3204                           { columns    => [ 'src_pkgpart' ],
3205                             table      => 'part_pkg',
3206                             references => [ 'pkgpart' ]
3207                           },
3208                           { columns    => [ 'dst_pkgpart' ],
3209                             table      => 'part_pkg',
3210                             references => [ 'pkgpart' ]
3211                           },
3212                         ],
3213     },
3214     # XXX somewhat borked unique: we don't really want a hidden and unhidden
3215     # it turns out we'd prefer to use svc, bill, and invisibill (or something)
3216
3217     'part_pkg_discount' => {
3218       'columns' => [
3219         'pkgdiscountnum', 'serial',   '',      '', '', '',
3220         'pkgpart',        'int',      '',      '', '', '',
3221         'discountnum',    'int',      '',      '', '', '', 
3222       ],
3223       'primary_key'  => 'pkgdiscountnum',
3224       'unique'       => [ [ 'pkgpart', 'discountnum' ] ],
3225       'index'        => [],
3226       'foreign_keys' => [
3227                           { columns    => [ 'pkgpart' ],
3228                             table      => 'part_pkg',
3229                           },
3230                           { columns    => [ 'discountnum' ],
3231                             table      => 'discount',
3232                           },
3233                         ],
3234     },
3235
3236     'part_pkg_taxclass' => {
3237       'columns' => [
3238         'taxclassnum',  'serial', '',       '', '', '',
3239         'taxclass',     'varchar', '', $char_d, '', '', 
3240         'disabled', 'char',   'NULL',         1, '', '', 
3241       ],
3242       'primary_key' => 'taxclassnum',
3243       'unique'      => [ [ 'taxclass' ] ],
3244       'index'       => [ [ 'disabled' ] ],
3245     },
3246
3247     'part_pkg_taxproduct' => {
3248       'columns' => [
3249         'taxproductnum', 'serial',      '',        '', '', '',
3250         'data_vendor',   'varchar', 'NULL',   $char_d, '', '', 
3251         'taxproduct',    'varchar',     '',   $char_d, '', '', 
3252         'description',   'varchar',     '', 3*$char_d, '', '', 
3253       ],
3254       'primary_key' => 'taxproductnum',
3255       'unique'      => [ [ 'data_vendor', 'taxproduct' ] ],
3256       'index'       => [],
3257     },
3258
3259     'part_pkg_taxrate' => { 
3260       'columns' => [
3261         'pkgtaxratenum', 'serial',  '',     '',      '', '',
3262         'data_vendor',   'varchar', 'NULL', $char_d, '', '', # update source
3263         'geocode',       'varchar', 'NULL', $char_d, '', '', # cch provides 10
3264         'taxproductnum', 'int',  '',     '',       '', '',          
3265         'city',             'varchar', 'NULL', $char_d, '', '', # tax_location?
3266         'county',           'varchar', 'NULL', $char_d, '', '', 
3267         'state',            'varchar', 'NULL', $char_d, '', '', 
3268         'local',            'varchar', 'NULL', $char_d, '', '', 
3269         'country',          'char',    'NULL', 2,       '', '',
3270         'taxclassnumtaxed', 'int',     'NULL', '',      '', '', 
3271         'taxcattaxed',      'varchar', 'NULL', $char_d, '', '', 
3272         'taxclassnum',      'int',     'NULL', '',      '', '', 
3273         'effdate',          @date_type, '', '', 
3274         'taxable',          'char',    'NULL', 1,       '', '', 
3275       ],
3276       'primary_key'  => 'pkgtaxratenum',
3277       'unique'       => [],
3278       'index'        => [ [ 'data_vendor', 'geocode', 'taxproductnum' ] ],
3279       'foreign_keys' => [
3280                           { columns    => [ 'taxproductnum' ],
3281                             table      => 'part_pkg_taxproduct',
3282                           },
3283                           { columns    => [ 'taxclassnumtaxed' ],
3284                             table      => 'tax_class',
3285                             references => [ 'taxclassnum' ],
3286                           },
3287                           { columns    => [ 'taxclassnum' ],
3288                             table      => 'tax_class',
3289                           },
3290                         ],
3291     },
3292
3293     'part_pkg_taxoverride' => { 
3294       'columns' => [
3295         'taxoverridenum', 'serial', '', '', '', '',
3296         'pkgpart',           'int', '', '', '', '',
3297         'taxclassnum',       'int', '', '', '', '',
3298         'usage_class',    'varchar', 'NULL', $char_d, '', '', 
3299       ],
3300       'primary_key'  => 'taxoverridenum',
3301       'unique'       => [],
3302       'index'        => [ [ 'pkgpart' ], [ 'taxclassnum' ] ],
3303       'foreign_keys' => [
3304                           { columns    => [ 'pkgpart' ],
3305                             table      => 'part_pkg',
3306                           },
3307                           { columns    => [ 'taxclassnum' ],
3308                             table      => 'tax_class',
3309                           },
3310                         ],
3311     },
3312
3313 #    'part_title' => {
3314 #      'columns' => [
3315 #        'titlenum',   'int',    '',   '',
3316 #        'title',      'varchar',   '',   $char_d,
3317 #      ],
3318 #      'primary_key' => 'titlenum',
3319 #      'unique' => [ [] ],
3320 #      'index' => [ [] ],
3321 #    },
3322
3323     'pkg_svc' => {
3324       'columns' => [
3325         'pkgsvcnum',   'serial',    '', '', '', '', 
3326         'pkgpart',        'int',    '', '', '', '', 
3327         'svcpart',        'int',    '', '', '', '', 
3328         'quantity',       'int',    '', '', '', '', 
3329         'primary_svc',   'char', 'NULL', 1, '', '', 
3330         'hidden',        'char', 'NULL', 1, '', '',
3331         'bulk_skip',     'char', 'NULL', 1, '', '',
3332       ],
3333       'primary_key'  => 'pkgsvcnum',
3334       'unique'       => [ ['pkgpart', 'svcpart'] ],
3335       'index'        => [ ['pkgpart'], ['quantity'] ],
3336       'foreign_keys' => [
3337                           { columns    => [ 'pkgpart' ],
3338                             table      => 'part_pkg',
3339                           },
3340                           { columns    => [ 'svcpart' ],
3341                             table      => 'part_svc',
3342                           },
3343                         ],
3344     },
3345
3346     'part_referral' => {
3347       'columns' => [
3348         'refnum',   'serial',     '',        '', '', '', 
3349         'referral', 'varchar',    '',   $char_d, '', '', 
3350         'disabled', 'char',   'NULL',         1, '', '', 
3351         'agentnum', 'int',    'NULL',        '', '', '', 
3352       ],
3353       'primary_key'  => 'refnum',
3354       'unique'       => [],
3355       'index'        => [ ['disabled'], ['agentnum'], ],
3356       'foreign_keys' => [
3357                           { columns    => [ 'agentnum' ],
3358                             table      => 'agent',
3359                           },
3360                         ],
3361     },
3362
3363     'part_svc' => {
3364       'columns' => [
3365         'svcpart',             'serial',     '',        '', '', '', 
3366         'svc',                'varchar',     '',   $char_d, '', '', 
3367         'svcdb',              'varchar',     '',   $char_d, '', '', 
3368         'disabled',              'char', 'NULL',         1, '', '', 
3369         'preserve',              'char', 'NULL',         1, '', '',
3370         'selfservice_access', 'varchar', 'NULL',   $char_d, '', '',
3371         'classnum',               'int', 'NULL',        '', '', '',
3372         'restrict_edit_password','char', 'NULL',         1, '', '',
3373         'has_router',            'char', 'NULL',         1, '', '',
3374 ],
3375       'primary_key'  => 'svcpart',
3376       'unique'       => [],
3377       'index'        => [ [ 'disabled' ] ],
3378       'foreign_keys' => [
3379                           { columns    => [ 'classnum' ],
3380                             table      => 'part_svc_class',
3381                           },
3382                         ],
3383     },
3384
3385     'part_svc_column' => {
3386       'columns' => [
3387         'columnnum',   'serial',      '',      '', '', '', 
3388         'svcpart',     'int',         '',      '', '', '', 
3389         'columnname',  'varchar',     '',      64, '', '', 
3390         'columnlabel', 'varchar', 'NULL', $char_d, '', '',
3391         'columnvalue', 'varchar', 'NULL',     512, '', '', 
3392         'columnflag',  'char',    'NULL',       1, '', '', 
3393       ],
3394       'primary_key'  => 'columnnum',
3395       'unique'       => [ [ 'svcpart', 'columnname' ] ],
3396       'index'        => [ [ 'svcpart' ] ],
3397       'foreign_keys' => [
3398                           { columns    => [ 'svcpart' ],
3399                             table      => 'part_svc',
3400                           },
3401                         ],
3402     },
3403
3404     'part_svc_class' => {
3405       'columns' => [
3406         'classnum',    'serial',   '',      '', '', '', 
3407         'classname',   'varchar',  '', $char_d, '', '', 
3408         'disabled',    'char', 'NULL',       1, '', '', 
3409       ],
3410       'primary_key' => 'classnum',
3411       'unique' => [],
3412       'index' => [ ['disabled'] ],
3413     },
3414
3415     #(this should be renamed to part_pop)
3416     'svc_acct_pop' => {
3417       'columns' => [
3418         'popnum',    'serial',    '',   '', '', '', 
3419         'city',      'varchar',   '',   $char_d, '', '', 
3420         'state',     'varchar',   '',   $char_d, '', '', 
3421         'ac',        'char',   '',   3, '', '', 
3422         'exch',      'char',   '',   3, '', '', 
3423         'loc',       'char',   'NULL',   4, '', '', #NULL for legacy purposes
3424       ],
3425       'primary_key' => 'popnum',
3426       'unique' => [],
3427       'index' => [ [ 'state' ] ],
3428     },
3429
3430     'part_pop_local' => {
3431       'columns' => [
3432         'localnum',  'serial',     '',     '', '', '', 
3433         'popnum',    'int',     '',     '', '', '', 
3434         'city',      'varchar', 'NULL', $char_d, '', '', 
3435         'state',     'char',    'NULL', 2, '', '', 
3436         'npa',       'char',    '',     3, '', '', 
3437         'nxx',       'char',    '',     3, '', '', 
3438       ],
3439       'primary_key'  => 'localnum',
3440       'unique'       => [],
3441       'index'        => [ [ 'npa', 'nxx' ], [ 'popnum' ] ],
3442       'foreign_keys' => [
3443                          { columns    => [ 'popnum' ],
3444                            table      => 'svc_acct_pop',
3445                          },
3446                        ],
3447     },
3448
3449     'qual' => {
3450       'columns' => [
3451         'qualnum',  'serial',     '',     '', '', '', 
3452         'custnum',    'int',     'NULL',     '', '', '',
3453         'prospectnum',    'int',     'NULL',     '', '', '',
3454         'locationnum',    'int',     'NULL',     '', '', '',
3455         'phonenum',     'varchar', 'NULL',       24, '', '',
3456         'exportnum',      'int', 'NULL', '', '', '', 
3457         'vendor_qual_id',      'varchar', 'NULL', $char_d, '', '', 
3458         'status',      'char', '', 1, '', '', 
3459       ],
3460       'primary_key'  => 'qualnum',
3461       'unique'       => [],
3462       'index'        => [ ['locationnum'], ['custnum'], ['prospectnum'],
3463                           ['phonenum'], ['vendor_qual_id'],
3464                         ],
3465       'foreign_keys' => [
3466                           { columns    => [ 'custnum' ],
3467                             table      => 'cust_main',
3468                           },
3469                           { columns    => [ 'prospectnum' ],
3470                             table      => 'prospect_main',
3471                           },
3472                           { columns    => [ 'locationnum' ],
3473                             table      => 'cust_location',
3474                           },
3475                           { columns    => [ 'exportnum' ],
3476                             table      => 'part_export',
3477                           },
3478                         ],
3479     },
3480
3481     'qual_option' => {
3482       'columns' => [
3483         'optionnum', 'serial', '', '', '', '', 
3484         'qualnum',  'int',     '',     '', '', '', 
3485         'optionname', 'varchar', '', $char_d, '', '', 
3486         'optionvalue', 'text', 'NULL', '', '', '', 
3487       ],
3488       'primary_key'  => 'optionnum',
3489       'unique'       => [],
3490       'index'        => [],
3491       'foreign_keys' => [
3492                           { columns    => [ 'qualnum' ],
3493                             table      => 'qual',
3494                           },
3495                         ],
3496     },
3497
3498     'svc_acct' => {
3499       'columns' => [
3500         'svcnum',    'int',    '',   '', '', '', 
3501         'username',  'varchar',   '',   $username_len, '', '',
3502         '_password', 'varchar',   'NULL',  512, '', '',
3503         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
3504         'sec_phrase', 'varchar',  'NULL',   $char_d, '', '', 
3505         'popnum',    'int',    'NULL',   '', '', '', 
3506         'sectornum', 'int', 'NULL',      '', '', '',
3507         'uid',       'int', 'NULL',   '', '', '', 
3508         'gid',       'int', 'NULL',   '', '', '', 
3509         'finger',    'varchar',   'NULL',   2*$char_d, '', '', 
3510         'dir',       'varchar',   'NULL',   $char_d, '', '', 
3511         'shell',     'varchar',   'NULL',   $char_d, '', '', 
3512         'quota',     'varchar',   'NULL',   $char_d, '', '', 
3513         'slipip',    'varchar',   'NULL',   15, '', '', #four TINYINTs, bah.
3514         # IP address mgmt
3515         'routernum', 'int', 'NULL',      '', '', '',
3516         'blocknum',  'int', 'NULL',      '', '', '', 
3517         'seconds',   'int', 'NULL',   '', '', '', #uhhhh
3518         'seconds_threshold',   'int', 'NULL',   '', '', '',
3519         'upbytes',   'bigint', 'NULL',   '', '', '', 
3520         'upbytes_threshold',   'bigint', 'NULL',   '', '', '',
3521         'downbytes', 'bigint', 'NULL',   '', '', '',
3522         'downbytes_threshold',   'bigint', 'NULL',   '', '', '',
3523         'totalbytes','bigint', 'NULL',   '', '', '',
3524         'totalbytes_threshold',   'bigint', 'NULL',   '', '', '',
3525         'domsvc',    'int',     '', '', '', '', 
3526         'pbxsvc',    'int', 'NULL', '', '', '',
3527         'last_login',  @date_type, '', '', 
3528         'last_logout', @date_type, '', '', 
3529         #cardfortress field(s)
3530         'cf_privatekey',      'text', 'NULL',      '', '', '',
3531         #communigate pro fields (quota = MaxAccountSize)
3532         'cgp_aliases',     'varchar', 'NULL',     255, '', '',
3533         #settings
3534         'cgp_type',        'varchar', 'NULL', $char_d, '', '', #AccountType
3535         'file_quota',      'varchar', 'NULL', $char_d, '', '', #MaxWebSize
3536         'file_maxnum',     'varchar', 'NULL', $char_d, '', '', #MaxWebFiles
3537         'file_maxsize',    'varchar', 'NULL', $char_d, '', '', #MaxFileSize
3538         'cgp_accessmodes', 'varchar', 'NULL',     255, '', '', #AccessModes
3539         'password_selfchange','char', 'NULL',       1, '', '', #PWDAllowed
3540         'password_recover',   'char', 'NULL',       1, 'Y','', #PasswordRecovery
3541         'cgp_rulesallowed','varchar', 'NULL', $char_d, '', '', #RulesAllowed
3542         'cgp_rpopallowed',    'char', 'NULL',       1, '', '', #RPOPAllowed
3543         'cgp_mailtoall',      'char', 'NULL',       1, '', '', #MailToAll
3544         'cgp_addmailtrailer', 'char', 'NULL',       1, '', '', #AddMailTrailer
3545         'cgp_archiveafter',    'int', 'NULL',      '', '', '', #ArchiveMessagesAfter
3546         #XXX mailing lists
3547         #preferences
3548         'cgp_deletemode',     'varchar', 'NULL', $char_d, '', '',#DeleteMode
3549         'cgp_emptytrash',     'varchar', 'NULL', $char_d, '', '',#EmptyTrash
3550         'cgp_language',       'varchar', 'NULL', $char_d, '', '',#Language
3551         'cgp_timezone',       'varchar', 'NULL', $char_d, '', '',#TimeZone
3552         'cgp_skinname',       'varchar', 'NULL', $char_d, '', '',#SkinName
3553         'cgp_prontoskinname', 'varchar', 'NULL', $char_d, '', '',#ProntoSkinName
3554         'cgp_sendmdnmode',    'varchar', 'NULL', $char_d, '', '',#SendMDNMode
3555         #mail
3556         #XXX RPOP settings
3557         #
3558       ],
3559       'primary_key'  => 'svcnum',
3560       #'unique'       => [ [ 'username', 'domsvc' ] ],
3561       'unique'       => [],
3562       'index'        => [ ['username'], ['domsvc'], ['pbxsvc'] ],
3563       'foreign_keys' => [
3564                           { columns    => [ 'svcnum' ],
3565                             table      => 'cust_svc',
3566                           },
3567                           { columns    => [ 'popnum' ],
3568                             table      => 'svc_acct_pop',
3569                           },
3570                           { columns    => [ 'sectornum' ],
3571                             table      => 'tower_sector',
3572                           },
3573                           { columns    => [ 'routernum' ],
3574                             table      => 'router',
3575                           },
3576                           { columns    => [ 'blocknum' ],
3577                             table      => 'addr_block',
3578                           },
3579                           { columns    => [ 'domsvc' ],
3580                             table      => 'svc_domain', #'cust_svc',
3581                             references => [ 'svcnum' ],
3582                           },
3583                           { columns    => [ 'pbxsvc' ],
3584                             table      => 'svc_pbx', #'cust_svc',
3585                             references => [ 'svcnum' ],
3586                           },
3587                         ],
3588     },
3589
3590     'acct_rt_transaction' => {
3591       'columns' => [
3592         'svcrtid',   'int',    '',   '', '', '', #why am i not a serial
3593         'svcnum',    'int',    '',   '', '', '', 
3594         'transaction_id',       'int', '',   '', '', '', 
3595         '_date',   @date_type, '', '',
3596         'seconds',   'int', '',   '', '', '', #uhhhh
3597         'support',   'int', '',   '', '', '',
3598       ],
3599       'primary_key'  => 'svcrtid',
3600       'unique'       => [],
3601       'index'        => [ ['svcnum', 'transaction_id'] ],
3602       'foreign_keys' => [
3603                           { columns    => [ 'svcnum' ],
3604                             table      => 'svc_acct', #'cust_svc',
3605                           },
3606                           # 1. RT tables aren't part of our data structure, so
3607                           #     we can't make sure Queue is created already
3608                           # 2. This is our internal hack for time tracking, not
3609                           #     a user-facing feature
3610                           #{ columns    => [ 'transaction_id' ],
3611                           #  table      => 'Transaction',
3612                           #  references => [ 'id' ],
3613                           #},
3614                         ],
3615     },
3616
3617     #'svc_charge' => {
3618     #  'columns' => [
3619     #    'svcnum',    'int',    '',   '',
3620     #    'amount',    @money_type,
3621     #  ],
3622     #  'primary_key' => 'svcnum',
3623     #  'unique' => [ [] ],
3624     #  'index' => [ [] ],
3625     #},
3626
3627     'svc_domain' => {
3628       'columns' => [
3629         'svcnum',           'int',    '',        '', '', '',
3630         'domain',       'varchar',    '',   $char_d, '', '',
3631         'suffix',       'varchar', 'NULL',  $char_d, '', '',
3632         'catchall',         'int', 'NULL',       '', '', '',
3633         'parent_svcnum',    'int', 'NULL',       '', '', '',
3634         'registrarnum',     'int', 'NULL',       '', '', '',
3635         'registrarkey', 'varchar', 'NULL',      512, '', '',
3636         'setup_date',      @date_type, '', '',
3637         'renewal_interval', 'int', 'NULL',       '', '', '',
3638         'expiration_date', @date_type, '', '',
3639         'au_registrant_name',       'varchar', 'NULL',  $char_d, '', '',
3640         'au_eligibility_type',      'varchar', 'NULL',  $char_d, '', '',
3641         #communigate pro fields (quota = MaxAccountSize)
3642         'max_accounts',     'int', 'NULL',       '', '', '',
3643         'trailer',         'text', 'NULL',       '', '', '',
3644         'cgp_aliases',  'varchar', 'NULL',      255, '', '',
3645         'cgp_accessmodes','varchar','NULL',     255, '', '', #DomainAccessModes
3646         'cgp_certificatetype','varchar','NULL', $char_d, '', '',
3647         #settings
3648         'acct_def_password_selfchange',   'char', 'NULL',       1,  '', '', 
3649         'acct_def_password_recover',      'char', 'NULL',       1, 'Y', '', 
3650         'acct_def_cgp_accessmodes',    'varchar', 'NULL',     255,  '', '',
3651         'acct_def_quota',              'varchar', 'NULL', $char_d,  '', '',
3652         'acct_def_file_quota',         'varchar', 'NULL', $char_d,  '', '',
3653         'acct_def_file_maxnum',        'varchar', 'NULL', $char_d,  '', '',
3654         'acct_def_file_maxsize',       'varchar', 'NULL', $char_d,  '', '',
3655         'acct_def_cgp_rulesallowed',   'varchar', 'NULL', $char_d,  '', '',
3656         'acct_def_cgp_rpopallowed',       'char', 'NULL',       1,  '', '', 
3657         'acct_def_cgp_mailtoall',         'char', 'NULL',       1,  '', '', 
3658         'acct_def_cgp_addmailtrailer',    'char', 'NULL',       1,  '', '', 
3659         'acct_def_cgp_archiveafter',       'int', 'NULL',      '',  '', '',
3660         #preferences
3661         'acct_def_cgp_deletemode',     'varchar', 'NULL', $char_d,  '', '',
3662         'acct_def_cgp_emptytrash',     'varchar', 'NULL', $char_d,  '', '',
3663         'acct_def_cgp_language',       'varchar', 'NULL', $char_d,  '', '',
3664         'acct_def_cgp_timezone',       'varchar', 'NULL', $char_d,  '', '',
3665         'acct_def_cgp_skinname',       'varchar', 'NULL', $char_d,  '', '',
3666         'acct_def_cgp_prontoskinname', 'varchar', 'NULL', $char_d,  '', '',
3667         'acct_def_cgp_sendmdnmode',    'varchar', 'NULL', $char_d,  '', '',
3668       ],
3669       'primary_key'  => 'svcnum',
3670       'unique'       => [],
3671       'index'        => [ ['domain'] ],
3672       'foreign_keys' => [
3673                           { columns    => [ 'svcnum' ],
3674                             table      => 'cust_svc',
3675                           },
3676                           { columns    => [ 'catchall' ],
3677                             table      => 'svc_acct',
3678                             references => [ 'svcnum' ],
3679                           },
3680                           { columns    => [ 'parent_svcnum' ],
3681                             table      => 'cust_svc',
3682                             references => [ 'svcnum' ],
3683                           },
3684                           { columns    => [ 'registrarnum' ],
3685                             table      => 'registrar',
3686                           },
3687                         ],
3688     },
3689
3690     'svc_dsl' => {
3691       'columns' => [
3692         'svcnum',                    'int',    '',        '', '', '',
3693         'pushed',                    'int', 'NULL',       '', '', '',
3694         'desired_due_date',          'int', 'NULL',       '', '', '',
3695         'due_date',                  'int', 'NULL',       '', '', '',
3696         'vendor_order_id',       'varchar', 'NULL', $char_d,  '', '',
3697         'vendor_qual_id',        'varchar', 'NULL', $char_d,  '', '',
3698         'vendor_order_type',     'varchar', 'NULL', $char_d,  '', '',
3699         'vendor_order_status',   'varchar', 'NULL', $char_d,  '', '',
3700         'first',                 'varchar', 'NULL', $char_d,  '', '',
3701         'last',                  'varchar', 'NULL', $char_d,  '', '',
3702         'company',               'varchar', 'NULL', $char_d,  '', '',
3703         'phonenum',              'varchar', 'NULL',      24, '', '',
3704         'gateway_access_number', 'varchar', 'NULL',      24, '', '',
3705         'loop_type',                'char', 'NULL',       1, '', '', 
3706         'local_voice_provider',  'varchar', 'NULL', $char_d, '', '',
3707         'circuitnum',            'varchar', 'NULL', $char_d, '', '',
3708         'rate_band',             'varchar', 'NULL', $char_d, '', '',
3709         'vpi',                       'int', 'NULL',      '', '', '',
3710         'vci',                       'int', 'NULL',      '', '', '',
3711         'isp_chg',                  'char', 'NULL',       1, '', '', 
3712         'isp_prev',              'varchar', 'NULL', $char_d, '', '',
3713         'username',              'varchar', 'NULL', $char_d, '', '',
3714         'password',              'varchar', 'NULL', $char_d, '', '',
3715         'staticips',                'text', 'NULL',      '', '', '',
3716         'monitored',                'char', 'NULL',       1, '', '', 
3717         'last_pull',                 'int', 'NULL',      '', '', '',
3718       ],
3719       'primary_key'  => 'svcnum',
3720       'unique'       => [ ],
3721       'index'        => [ ['phonenum'], ['vendor_order_id'] ],
3722       'foreign_keys' => [
3723                           { columns    => [ 'svcnum' ],
3724                             table      => 'cust_svc',
3725                           },
3726                         ],
3727     },
3728
3729     'dsl_device' => {
3730       'columns' => [
3731         'devicenum', 'serial',     '', '', '', '',
3732         #part_device?  or our own part_dsl_device?
3733         #'devicepart',   'int',     '', '', '', '',
3734         'svcnum',       'int',     '', '', '', '', 
3735         'mac_addr', 'varchar',     '', 12, '', '', 
3736       ],
3737       'primary_key'  => 'devicenum',
3738       'unique'       => [ [ 'mac_addr' ], ],
3739       'index'        => [ [ 'svcnum' ], ], # [ 'devicepart' ] ],
3740       'foreign_keys' => [
3741                           { columns    => [ 'svcnum' ],
3742                             table      => 'svc_dsl',
3743                           },
3744                         ],
3745     },
3746
3747     'dsl_note' => {
3748       'columns' => [
3749         'notenum',           'serial',    '',        '', '', '',
3750         'svcnum',     'int', '',       '', '', '',
3751         'author',     'varchar', 'NULL', $char_d,  '', '',
3752         'priority',   'char', 'NULL',       1,  '', '', 
3753         '_date',     'int', 'NULL',       '', '', '',
3754         'note',     'text', '',       '', '', '',
3755       ],
3756       'primary_key'  => 'notenum',
3757       'unique'       => [],
3758       'index'        => [ ['svcnum'] ],
3759       'foreign_keys' => [
3760                           { columns    => [ 'svcnum' ],
3761                             table      => 'svc_dsl',
3762                           },
3763                         ],
3764     },
3765
3766     'svc_dish' => {
3767       'columns' => [
3768         'svcnum',   'int',     '',     '', '', '',
3769         'acctnum',  'varchar', '',     16, '', '',
3770         'installdate', @date_type,         '', '', 
3771         'note',     'text',    'NULL', '', '', '',
3772       ],
3773       'primary_key'  => 'svcnum',
3774       'unique'       => [],
3775       'index'        => [],
3776       'foreign_keys' => [
3777                           { columns    => [ 'svcnum' ],
3778                             table      => 'cust_svc',
3779                           },
3780                         ],
3781     },
3782
3783     'svc_hardware' => {
3784       'columns' => [
3785         'svcnum',   'int',     '',          '', '', '',
3786         'typenum',  'int',     '',          '', '', '',
3787         'serial',   'varchar', 'NULL', $char_d, '', '',
3788         'ip_addr',  'varchar', 'NULL',      40, '', '',
3789         'hw_addr',  'varchar', 'NULL',      12, '', '',
3790         'smartcard','varchar', 'NULL',      30, '', '',
3791         'statusnum','int',     'NULL',      '', '', '',
3792         'note',     'text',    'NULL',      '', '', '',
3793       ],
3794       'primary_key'  => 'svcnum',
3795       'unique'       => [],
3796       'index'        => [],
3797       'foreign_keys' => [
3798                           { columns    => [ 'svcnum' ],
3799                             table      => 'cust_svc',
3800                           },
3801                           { columns    => [ 'typenum' ],
3802                             table      => 'hardware_type',
3803                           },
3804                           { columns    => [ 'statusnum' ],
3805                             table      => 'hardware_status',
3806                           },
3807                         ],
3808     },
3809
3810     'hardware_class' => {
3811       'columns' => [
3812         'classnum',   'serial', '',      '', '', '',
3813         'classname', 'varchar', '', $char_d, '', '',
3814       ],
3815       'primary_key' => 'classnum',
3816       'unique' => [],
3817       'index'  => [],
3818     },
3819
3820     'hardware_type' => {
3821       'columns' => [
3822         'typenum',  'serial',     '',      '', '', '',
3823         'classnum',    'int',     '',      '', '', '',
3824         'model',   'varchar',     '', $char_d, '', '',
3825         'revision','varchar', 'NULL', $char_d, '', '',
3826       ],
3827       'primary_key'  => 'typenum',
3828       'unique'       => [ [ 'classnum', 'model', 'revision' ] ],
3829       'index'        => [],
3830       'foreign_keys' => [
3831                           { columns    => [ 'classnum' ],
3832                             table      => 'hardware_class',
3833                           },
3834                         ],
3835     },
3836
3837     'hardware_status' => {
3838       'columns' => [
3839         'statusnum', 'serial', '',      '', '', '',
3840         'label'    ,'varchar', '', $char_d, '', '',
3841         'disabled',    'char', 'NULL',   1, '', '', 
3842       ],
3843       'primary_key' => 'statusnum',
3844       'unique' => [],
3845       'index'  => [],
3846     },
3847
3848     'domain_record' => {
3849       'columns' => [
3850         'recnum',    'serial',     '',  '', '', '', 
3851         'svcnum',    'int',     '',  '', '', '', 
3852         'reczone',   'varchar', '',  255, '', '', 
3853         'recaf',     'char',    '',  2, '', '', 
3854         'rectype',   'varchar',    '',  5, '', '', 
3855         'recdata',   'varchar', '',  255, '', '', 
3856         'ttl',       'int',     'NULL', '', '', '',
3857       ],
3858       'primary_key'  => 'recnum',
3859       'unique'       => [],
3860       'index'        => [ ['svcnum'] ],
3861       'foreign_keys' => [
3862                           { columns    => [ 'svcnum' ],
3863                             table      => 'svc_domain',
3864                           },
3865                         ],
3866     },
3867
3868     'registrar' => {
3869       'columns' => [
3870         'registrarnum',   'serial', '',      '', '', '',
3871         'registrarname', 'varchar', '', $char_d, '', '',
3872       ],
3873       'primary_key' => 'registrarnum',
3874       'unique'      => [],
3875       'index'       => [],
3876     },
3877
3878     'cgp_rule' => {
3879       'columns' => [
3880         'rulenum',  'serial',     '',      '', '', '',
3881         'name',    'varchar',     '', $char_d, '', '',
3882         'comment', 'varchar', 'NULL', $char_d, '', '',
3883         'svcnum',      'int',     '',      '', '', '',
3884         'priority',    'int',     '',      '', '', '',
3885       ],
3886       'primary_key' => 'rulenum',
3887       'unique'      => [ [ 'svcnum', 'name' ] ],
3888       'index'       => [ [ 'svcnum' ] ],
3889       'foreign_keys' => [
3890                           { columns    => [ 'svcnum' ],
3891                             table      => 'cust_svc', #svc_acct / svc_domain
3892                           },
3893                         ],
3894     },
3895
3896     'cgp_rule_condition' => {
3897       'columns' => [
3898         'ruleconditionnum',  'serial',     '',      '', '', '',
3899         'conditionname',    'varchar',     '', $char_d, '', '',
3900         'op',               'varchar', 'NULL', $char_d, '', '',
3901         'params',           'varchar', 'NULL',     255, '', '',
3902         'rulenum',              'int',     '',      '', '', '',
3903       ],
3904       'primary_key'  => 'ruleconditionnum',
3905       'unique'       => [],
3906       'index'        => [ [ 'rulenum' ] ],
3907       'foreign_keys' => [
3908                           { columns    => [ 'rulenum' ],
3909                             table      => 'cgp_rule',
3910                           },
3911                         ],
3912     },
3913
3914     'cgp_rule_action' => {
3915        'columns' => [
3916         'ruleactionnum',  'serial',     '',      '', '', '',
3917         'action',        'varchar',     '', $char_d, '', '',
3918         'params',        'varchar', 'NULL',     255, '', '',
3919         'rulenum',           'int',     '',      '', '', '',
3920       ],
3921       'primary_key'  => 'ruleactionnum',
3922       'unique'       => [],
3923       'index'        => [ [ 'rulenum' ] ],
3924       'foreign_keys' => [
3925                           { columns    => [ 'rulenum' ],
3926                             table      => 'cgp_rule',
3927                           },
3928                         ],
3929    },
3930
3931     'svc_forward' => {
3932       'columns' => [
3933         'svcnum',   'int',            '',   '', '', '', 
3934         'srcsvc',   'int',        'NULL',   '', '', '', 
3935         'src',      'varchar',    'NULL',  255, '', '', 
3936         'dstsvc',   'int',        'NULL',   '', '', '', 
3937         'dst',      'varchar',    'NULL',  255, '', '', 
3938       ],
3939       'primary_key'  => 'svcnum',
3940       'unique'       => [],
3941       'index'        => [ ['srcsvc'], ['dstsvc'] ],
3942       'foreign_keys' => [
3943                           { columns    => [ 'svcnum' ],
3944                             table      => 'cust_svc',
3945                           },
3946                           { columns    => [ 'srcsvc' ],
3947                             table      => 'svc_acct',
3948                             references => [ 'svcnum' ]
3949                           },
3950                           { columns    => [ 'dstsvc' ],
3951                             table      => 'svc_acct',
3952                             references => [ 'svcnum' ]
3953                           },
3954                         ],
3955     },
3956
3957     'svc_www' => {
3958       'columns' => [
3959         'svcnum',   'int',      '',  '', '', '', 
3960         'recnum',   'int',      '',  '', '', '', 
3961         'usersvc',  'int',  'NULL',  '', '', '', 
3962         'config',   'text', 'NULL',  '', '', '', 
3963       ],
3964       'primary_key' => 'svcnum',
3965       'unique'      => [],
3966       'index'       => [],
3967       'foreign_keys' => [
3968                           { columns    => [ 'svcnum' ],
3969                             table      => 'cust_svc',
3970                           },
3971                           { columns    => [ 'recnum' ],
3972                             table      => 'domain_record',
3973                           },
3974                           { columns    => [ 'usersvc' ],
3975                             table      => 'svc_acct',
3976                             references => [ 'svcnum' ]
3977                           },
3978                         ],
3979     },
3980
3981     #'svc_wo' => {
3982     #  'columns' => [
3983     #    'svcnum',    'int',    '',   '',
3984     #    'svcnum',    'int',    '',   '',
3985     #    'svcnum',    'int',    '',   '',
3986     #    'worker',    'varchar',   '',   $char_d,
3987     #    '_date',     @date_type,
3988     #  ],
3989     #  'primary_key' => 'svcnum',
3990     #  'unique' => [ [] ],
3991     #  'index' => [ [] ],
3992     #},
3993
3994     'prepay_credit' => {
3995       'columns' => [
3996         'prepaynum',   'serial',     '',   '', '', '', 
3997         'identifier',  'varchar', '', $char_d, '', '', 
3998         'amount',      @money_type, '', '', 
3999         'seconds',     'int',     'NULL', '', '', '', 
4000         'upbytes',     'bigint',     'NULL', '', '', '', 
4001         'downbytes',   'bigint',     'NULL', '', '', '', 
4002         'totalbytes',  'bigint',     'NULL', '', '', '', 
4003         'agentnum',    'int',     'NULL', '', '', '', 
4004       ],
4005       'primary_key'  => 'prepaynum',
4006       'unique'       => [ ['identifier'] ],
4007       'index'        => [],
4008       'foreign_keys' => [
4009                           { columns    => [ 'agentnum' ],
4010                             table      => 'agent',
4011                           },
4012                         ],
4013     },
4014
4015     'port' => {
4016       'columns' => [
4017         'portnum',  'serial',     '',   '', '', '', 
4018         'ip',       'varchar', 'NULL', 15, '', '', 
4019         'nasport',  'int',     'NULL', '', '', '', 
4020         'nasnum',   'int',     '',   '', '', '', 
4021       ],
4022       'primary_key'  => 'portnum',
4023       'unique'       => [],
4024       'index'        => [],
4025       'foreign_keys' => [
4026                           { columns    => [ 'nasnum' ],
4027                             table      => 'nas',
4028                           },
4029                         ],
4030     },
4031
4032     'nas' => {
4033       'columns' => [
4034         'nasnum',       'serial',     '',  '',              '', '', 
4035         'nasname',     'varchar',     '', 128,              '', '',
4036         'shortname',   'varchar', 'NULL',  32,              '', '',
4037         'type',        'varchar',     '',  30,         'other', '',
4038         'ports',           'int', 'NULL',  '',              '', '',
4039         'secret',      'varchar',     '',  60,        'secret', '',
4040         'server',      'varchar', 'NULL',  64,              '', '',
4041         'community',   'varchar', 'NULL',  50,              '', '',
4042         'description', 'varchar',     '', 200, 'RADIUS Client', '',
4043         'svcnum',          'int', 'NULL',  '',              '', '',
4044       ],
4045       'primary_key'  => 'nasnum',
4046       'unique'       => [ [ 'nasname' ], ],
4047       'index'        => [],
4048       'foreign_keys' => [
4049                           { columns    => [ 'svcnum' ],
4050                             table      => 'svc_broadband',#no? could be _acct?
4051                                                           #remove or cust_svc?
4052                           },
4053                         ],
4054     },
4055
4056     'export_nas' => {
4057       'columns' => [
4058         'exportnasnum', 'serial', '', '', '', '', 
4059         'exportnum',       'int', '', '', '', '', 
4060         'nasnum',          'int', '', '', '', '', 
4061       ],
4062       'primary_key'  => 'exportnasnum',
4063       'unique'       => [ [ 'exportnum', 'nasnum' ] ],
4064       'index'        => [ [ 'exportnum' ], [ 'nasnum' ] ],
4065       'foreign_keys' => [
4066                           { columns    => [ 'exportnum' ],
4067                             table      => 'part_export',
4068                           },
4069                           { columns    => [ 'nasnum' ],
4070                             table      => 'nas',
4071                           },
4072                         ],
4073     },
4074
4075     'queue' => {
4076       'columns' => [
4077         'jobnum',   'bigserial',     '',      '', '', '', 
4078         'job',        'varchar',     '',     512, '', '', 
4079         '_date',          'int',     '',      '', '', '', 
4080         'status',     'varchar',     '', $char_d, '', '', 
4081         'statustext',    'text', 'NULL',      '', '', '', 
4082         'svcnum',         'int', 'NULL',      '', '', '', 
4083         'custnum',        'int', 'NULL',      '', '', '',
4084         'secure',        'char', 'NULL',       1, '', '',
4085         'priority',       'int', 'NULL',      '', '', '',
4086       ],
4087       'primary_key'  => 'jobnum',
4088       'unique'       => [],
4089       'index'        => [ [ 'secure' ], [ 'priority' ],
4090                           [ 'job' ], [ 'svcnum' ], [ 'custnum' ], [ 'status' ],
4091                         ],
4092       'foreign_keys' => [
4093                           { columns    => [ 'svcnum' ],
4094                             table      => 'cust_svc',
4095                           },
4096                           { columns    => [ 'custnum' ],
4097                             table      => 'cust_main',
4098                           },
4099                         ],
4100     },
4101
4102     'queue_arg' => {
4103       'columns' => [
4104         'argnum', 'bigserial',     '', '', '', '', 
4105         'jobnum',    'bigint',     '', '', '', '', 
4106         'frozen',      'char', 'NULL',  1, '', '',
4107         'arg',         'text', 'NULL', '', '', '', 
4108       ],
4109       'primary_key'  => 'argnum',
4110       'unique'       => [],
4111       'index'        => [ [ 'jobnum' ] ],
4112       'foreign_keys' => [
4113                           { columns    => [ 'jobnum' ],
4114                             table      => 'queue',
4115                             on_delete  => 'CASCADE',
4116                           },
4117                         ],
4118     },
4119
4120     'queue_depend' => {
4121       'columns' => [
4122         'dependnum',  'bigserial', '', '', '', '', 
4123         'jobnum',        'bigint', '', '', '', '', 
4124         'depend_jobnum', 'bigint', '', '', '', '', 
4125       ],
4126       'primary_key'  => 'dependnum',
4127       'unique'       => [],
4128       'index'        => [ [ 'jobnum' ], [ 'depend_jobnum' ] ],
4129       'foreign_keys' => [
4130                           { columns    => [ 'jobnum' ],
4131                             table      => 'queue',
4132                           },
4133                           { columns    => [ 'depend_jobnum' ],
4134                             table      => 'queue',
4135                             references => [ 'jobnum' ],
4136                             on_delete  => 'CASCADE',
4137                           },
4138                         ],
4139     },
4140
4141     'export_svc' => {
4142       'columns' => [
4143         'exportsvcnum' => 'serial', '', '', '', '', 
4144         'exportnum'    => 'int', '', '', '', '', 
4145         'svcpart'      => 'int', '', '', '', '', 
4146       ],
4147       'primary_key'  => 'exportsvcnum',
4148       'unique'       => [ [ 'exportnum', 'svcpart' ] ],
4149       'index'        => [ [ 'exportnum' ], [ 'svcpart' ] ],
4150       'foreign_keys' => [
4151                           { columns    => [ 'exportnum' ],
4152                             table      => 'part_export',
4153                           },
4154                           { columns    => [ 'svcpart' ],
4155                             table      => 'part_svc',
4156                           },
4157                         ],
4158     },
4159
4160     'export_device' => {
4161       'columns' => [
4162         'exportdevicenum' => 'serial', '', '', '', '', 
4163         'exportnum'       => 'int', '', '', '', '', 
4164         'devicepart'      => 'int', '', '', '', '', 
4165       ],
4166       'primary_key'  => 'exportdevicenum',
4167       'unique'       => [ [ 'exportnum', 'devicepart' ] ],
4168       'index'        => [ [ 'exportnum' ], [ 'devicepart' ] ],
4169       'foreign_keys' => [
4170                           { columns    => [ 'exportnum' ],
4171                             table      => 'part_export',
4172                           },
4173                           { columns    => [ 'devicepart' ],
4174                             table      => 'part_device',
4175                           },
4176                         ],
4177     },
4178
4179     'part_export' => {
4180       'columns' => [
4181         'exportnum',   'serial',     '',      '', '', '', 
4182         'exportname', 'varchar', 'NULL', $char_d, '', '',
4183         'machine',    'varchar', 'NULL', $char_d, '', '',
4184         'exporttype', 'varchar',     '', $char_d, '', '', 
4185         'nodomain',      'char', 'NULL',       1, '', '', 
4186         'default_machine','int', 'NULL',      '', '', '',
4187       ],
4188       'primary_key'  => 'exportnum',
4189       'unique'       => [],
4190       'index'        => [ [ 'machine' ], [ 'exporttype' ] ],
4191       'foreign_keys' => [
4192                           { columns    => [ 'default_machine' ],
4193                             table      => 'part_export_machine',
4194                             references => [ 'machinenum' ]
4195                           },
4196                         ],
4197     },
4198
4199     'part_export_option' => {
4200       'columns' => [
4201         'optionnum', 'serial', '', '', '', '', 
4202         'exportnum', 'int', '', '', '', '', 
4203         'optionname', 'varchar', '', $char_d, '', '', 
4204         'optionvalue', 'text', 'NULL', '', '', '', 
4205       ],
4206       'primary_key'  => 'optionnum',
4207       'unique'       => [],
4208       'index'        => [ [ 'exportnum' ], [ 'optionname' ] ],
4209       'foreign_keys' => [
4210                           { columns    => [ 'exportnum' ],
4211                             table      => 'part_export',
4212                           },
4213                         ],
4214     },
4215
4216     'radius_usergroup' => {
4217       'columns' => [
4218         'usergroupnum', 'serial', '', '', '', '', 
4219         'svcnum',       'int', '', '', '', '', 
4220         'groupname',    'varchar', 'NULL', $char_d, '', '', #deprecated
4221         'groupnum',     'int', 'NULL', '', '', '', 
4222       ],
4223       'primary_key'  => 'usergroupnum',
4224       'unique'       => [],
4225       'index'        => [ [ 'svcnum' ], [ 'groupname' ] ],
4226       'foreign_keys' => [
4227                           { columns    => [ 'svcnum' ],
4228                             table      => 'cust_svc', #svc_acct / svc_broadband
4229                           },
4230                           { columns    => [ 'groupnum' ],
4231                             table      => 'radius_group',
4232                           },
4233                         ],
4234     },
4235
4236     'radius_group' => {
4237       'columns' => [
4238         'groupnum', 'serial', '', '', '', '', 
4239         'groupname',    'varchar', '', $char_d, '', '', 
4240         'description',  'varchar', 'NULL', $char_d, '', '', 
4241         'priority', 'int', '', '', '1', '',
4242         'speed_up', 'int', 'NULL', '', '', '',
4243         'speed_down', 'int', 'NULL', '', '', '',
4244       ],
4245       'primary_key' => 'groupnum',
4246       'unique'      => [ ['groupname'] ],
4247       'index'       => [],
4248     },
4249
4250     'radius_attr' => {
4251       'columns' => [
4252         'attrnum',   'serial', '',      '', '', '',
4253         'groupnum',     'int', '',      '', '', '',
4254         'attrname', 'varchar', '', $char_d, '', '',
4255         'value',    'varchar', '',     255, '', '',
4256         'attrtype',    'char', '',       1, '', '',
4257         'op',          'char', '',       2, '', '',
4258       ],
4259       'primary_key'  => 'attrnum',
4260       'unique'       => [],
4261       'index'        => [ ['groupnum'], ],
4262       'foreign_keys' => [
4263                           { columns    => [ 'groupnum' ],
4264                             table      => 'radius_group',
4265                           },
4266                         ],
4267     },
4268
4269     'msgcat' => {
4270       'columns' => [
4271         'msgnum', 'serial', '', '', '', '', 
4272         'msgcode', 'varchar', '', 255, '', '', 
4273         'locale', 'varchar', '', 16, '', '', 
4274         'msg', 'text', '', '', '', '', 
4275       ],
4276       'primary_key' => 'msgnum',
4277       'unique'      => [ [ 'msgcode', 'locale' ] ],
4278       'index'       => [],
4279     },
4280
4281     'cust_tax_exempt' => {
4282       'columns' => [
4283         'exemptnum', 'serial', '', '', '', '', 
4284         'custnum',   'int', '', '', '', '', 
4285         'taxnum',    'int', '', '', '', '', 
4286         'year',      'int', '', '', '', '', 
4287         'month',     'int', '', '', '', '', 
4288         'amount',   @money_type, '', '', 
4289       ],
4290       'primary_key'  => 'exemptnum',
4291       'unique'       => [ [ 'custnum', 'taxnum', 'year', 'month' ] ],
4292       'index'        => [],
4293       'foreign_keys' => [
4294                           { columns    => [ 'custnum' ],
4295                             table      => 'cust_main',
4296                           },
4297                           { columns    => [ 'taxnum' ],
4298                             table      => 'cust_main_county',
4299                           },
4300                         ],
4301     },
4302
4303     'cust_tax_exempt_pkg' => {
4304       'columns' => [
4305         'exemptpkgnum',  'serial', '', '', '', '', 
4306         #'custnum',      'int', '', '', '', ''
4307         'billpkgnum',   'int', '', '', '', '', 
4308         'taxnum',       'int', '', '', '', '', 
4309         'year',         'int', 'NULL', '', '', '', 
4310         'month',        'int', 'NULL', '', '', '', 
4311         'creditbillpkgnum', 'int', 'NULL', '', '', '',
4312         'amount',       @money_type, '', '', 
4313         # exemption type flags
4314         'exempt_cust',          'char', 'NULL', 1, '', '',
4315         'exempt_setup',         'char', 'NULL', 1, '', '',
4316         'exempt_recur',         'char', 'NULL', 1, '', '',
4317         'exempt_cust_taxname',  'char', 'NULL', 1, '', '',
4318         'exempt_monthly',       'char', 'NULL', 1, '', '',
4319       ],
4320       'primary_key'  => 'exemptpkgnum',
4321       'unique'       => [],
4322       'index'        => [ [ 'taxnum', 'year', 'month' ],
4323                           [ 'billpkgnum' ],
4324                           [ 'taxnum' ],
4325                           [ 'creditbillpkgnum' ],
4326                         ],
4327       'foreign_keys' => [
4328                           { columns    => [ 'billpkgnum' ],
4329                             table      => 'cust_bill_pkg',
4330                           },
4331                           { columns    => [ 'taxnum' ],
4332                             table      => 'cust_main_county',
4333                           },
4334                           { columns    => [ 'creditbillpkgnum' ],
4335                             table      => 'cust_credit_bill_pkg',
4336                           },
4337                         ],
4338     },
4339
4340     'cust_tax_exempt_pkg_void' => {
4341       'columns' => [
4342         'exemptpkgnum',  'int', '', '', '', '', 
4343         #'custnum',      'int', '', '', '', ''
4344         'billpkgnum',   'int', '', '', '', '', 
4345         'taxnum',       'int', '', '', '', '', 
4346         'year',         'int', 'NULL', '', '', '', 
4347         'month',        'int', 'NULL', '', '', '', 
4348         'creditbillpkgnum', 'int', 'NULL', '', '', '',
4349         'amount',       @money_type, '', '', 
4350         # exemption type flags
4351         'exempt_cust',          'char', 'NULL', 1, '', '',
4352         'exempt_setup',         'char', 'NULL', 1, '', '',
4353         'exempt_recur',         'char', 'NULL', 1, '', '',
4354         'exempt_cust_taxname',  'char', 'NULL', 1, '', '',
4355         'exempt_monthly',       'char', 'NULL', 1, '', '',
4356       ],
4357       'primary_key'  => 'exemptpkgnum',
4358       'unique'       => [],
4359       'index'        => [ [ 'taxnum', 'year', 'month' ],
4360                           [ 'billpkgnum' ],
4361                           [ 'taxnum' ],
4362                           [ 'creditbillpkgnum' ],
4363                         ],
4364       'foreign_keys' => [
4365                           { columns    => [ 'billpkgnum' ],
4366                             table      => 'cust_bill_pkg_void',
4367                           },
4368                           { columns    => [ 'taxnum' ],
4369                             table      => 'cust_main_county',
4370                           },
4371                           { columns    => [ 'creditbillpkgnum' ],
4372                             table      => 'cust_credit_bill_pkg',
4373                           },
4374                         ],
4375     },
4376
4377     'router' => {
4378       'columns' => [
4379         'routernum', 'serial', '', '', '', '', 
4380         'routername', 'varchar', '', $char_d, '', '', 
4381         'svcnum', 'int', 'NULL', '', '', '', 
4382         'agentnum',   'int', 'NULL', '', '', '', 
4383         'manual_addr', 'char', 'NULL', 1, '', '',
4384       ],
4385       'primary_key'  => 'routernum',
4386       'unique'       => [],
4387       'index'        => [],
4388       'foreign_keys' => [
4389                           { columns    => [ 'svcnum' ],
4390                             table      => 'cust_svc', #svc_acct / svc_broadband
4391                           },
4392                           { columns    => [ 'agentnum' ],
4393                             table      => 'agent',
4394                           },
4395                         ],
4396     },
4397
4398     'part_svc_router' => {
4399       'columns' => [
4400         'svcrouternum', 'serial', '', '', '', '', 
4401         'svcpart', 'int', '', '', '', '', 
4402         'routernum', 'int', '', '', '', '', 
4403       ],
4404       'primary_key'  => 'svcrouternum',
4405       'unique'       => [],
4406       'index'        => [],
4407       'foreign_keys' => [
4408                           { columns    => [ 'svcpart' ],
4409                             table      => 'part_svc',
4410                           },
4411                           { columns    => [ 'routernum' ],
4412                             table      => 'router',
4413                           },
4414                         ],
4415     },
4416
4417     'addr_block' => {
4418       'columns' => [
4419         'blocknum', 'serial', '', '', '', '', 
4420         'routernum', 'int', '', '', '', '', 
4421         'ip_gateway', 'varchar', '', 15, '', '', 
4422         'ip_netmask', 'int', '', '', '', '', 
4423         'agentnum',   'int', 'NULL', '', '', '', 
4424         'manual_flag', 'char', 'NULL', 1, '', '', 
4425       ],
4426       'primary_key'  => 'blocknum',
4427       'unique'       => [ [ 'blocknum', 'routernum' ] ],
4428       'index'        => [],
4429       'foreign_keys' => [
4430                           { columns    => [ 'routernum' ],
4431                             table      => 'router',
4432                           },
4433                           { columns    => [ 'agentnum' ],
4434                             table      => 'agent',
4435                           },
4436                         ],
4437     },
4438
4439     'addr_range' => {
4440       'columns' => [
4441         'rangenum', 'serial', '', '', '', '',
4442         'start',    'varchar', '', 15, '', '',
4443         'length',   'int', '', '', '', '',
4444         'status',   'varchar', 'NULL', 32, '', '',
4445       ],
4446       'primary_key' => 'rangenum',
4447       'unique'      => [],
4448       'index'       => [],
4449     },
4450
4451     'svc_broadband' => {
4452       'columns' => [
4453         'svcnum',                  'int',     '',        '', '', '', 
4454         'description',         'varchar', 'NULL',   $char_d, '', '', 
4455         'routernum',               'int', 'NULL',        '', '', '',
4456         'blocknum',                'int', 'NULL',        '', '', '', 
4457         'sectornum',               'int', 'NULL',        '', '', '',
4458         'speed_up',                'int', 'NULL',        '', '', '', 
4459         'speed_down',              'int', 'NULL',        '', '', '', 
4460         'ip_addr',             'varchar', 'NULL',        15, '', '', 
4461         'mac_addr',            'varchar', 'NULL',        12, '', '', 
4462         'authkey',             'varchar', 'NULL',        32, '', '', 
4463         'latitude',            'decimal', 'NULL',    '10,7', '', '', 
4464         'longitude',           'decimal', 'NULL',    '10,7', '', '', 
4465         'altitude',            'decimal', 'NULL',        '', '', '', 
4466         'vlan_profile',        'varchar', 'NULL',   $char_d, '', '', 
4467         'performance_profile', 'varchar', 'NULL',   $char_d, '', '',
4468         'plan_id',             'varchar', 'NULL',   $char_d, '', '',
4469         'radio_serialnum',     'varchar', 'NULL',   $char_d, '', '',
4470         'radio_location',      'varchar', 'NULL', 2*$char_d, '', '',
4471         'poe_location',        'varchar', 'NULL', 2*$char_d, '', '',
4472         'rssi',                    'int', 'NULL',        '', '', '',
4473         'suid',                    'int', 'NULL',        '', '', '',
4474         'shared_svcnum',           'int', 'NULL',        '', '', '',
4475       ],
4476       'primary_key'  => 'svcnum',
4477       'unique'       => [ [ 'ip_addr' ], [ 'mac_addr' ] ],
4478       'index'        => [],
4479       'foreign_keys' => [
4480                           { columns    => [ 'svcnum' ],
4481                             table      => 'cust_svc',
4482                           },
4483                           { columns    => [ 'routernum' ],
4484                             table      => 'router',
4485                           },
4486                           { columns    => [ 'blocknum' ],
4487                             table      => 'addr_block',
4488                           },
4489                           { columns    => [ 'sectornum' ],
4490                             table      => 'tower_sector',
4491                           },
4492                           { columns    => [ 'shared_svcnum' ],
4493                             table      => 'svc_broadband',
4494                             references => [ 'svcnum' ],
4495                           },
4496                         ],
4497     },
4498
4499     'tower' => {
4500       'columns' => [
4501         'towernum',    'serial',     '',      '', '', '',
4502         #'agentnum',       'int', 'NULL',      '', '', '',
4503         'towername',  'varchar',     '', $char_d, '', '',
4504         'disabled',      'char', 'NULL',       1, '', '',
4505         'latitude',   'decimal', 'NULL',  '10,7', '', '', 
4506         'longitude',  'decimal', 'NULL',  '10,7', '', '', 
4507         'coord_auto',    'char', 'NULL',       1, '', '',
4508         'altitude',   'decimal', 'NULL',      '', '', '', 
4509         'height',     'decimal', 'NULL',      '', '', '', 
4510         'veg_height', 'decimal', 'NULL',      '', '', '', 
4511         'color',      'varchar', 'NULL',       6, '', '',
4512       ],
4513       'primary_key' => 'towernum',
4514       'unique'      => [ [ 'towername' ] ], # , 'agentnum' ] ],
4515       'index'       => [],
4516     },
4517
4518     'tower_sector' => {
4519       'columns' => [
4520         'sectornum',   'serial',     '',      '', '', '',
4521         'towernum',       'int',     '',      '', '', '',
4522         'sectorname', 'varchar',     '', $char_d, '', '',
4523         'ip_addr',    'varchar', 'NULL',      15, '', '',
4524         'height',     'decimal', 'NULL',      '', '', '', 
4525         'freq_mhz',       'int', 'NULL',      '', '', '',
4526         'direction',      'int', 'NULL',      '', '', '',
4527         'width',          'int', 'NULL',      '', '', '',
4528         #downtilt etc? rfpath has profile files for devices/antennas you upload?
4529         'range',      'decimal', 'NULL',      '', '', '',  #?
4530       ],
4531       'primary_key'  => 'sectornum',
4532       'unique'       => [ [ 'towernum', 'sectorname' ], [ 'ip_addr' ], ],
4533       'index'        => [ [ 'towernum' ] ],
4534       'foreign_keys' => [
4535                           { columns    => [ 'towernum' ],
4536                             table      => 'tower',
4537                           },
4538                         ],
4539     },
4540
4541     'part_virtual_field' => {
4542       'columns' => [
4543         'vfieldpart', 'serial', '', '', '', '', 
4544         'dbtable', 'varchar', '', 32, '', '', 
4545         'name', 'varchar', '', 32, '', '', 
4546         'length', 'int', 'NULL', '', '', '', 
4547         'label', 'varchar', 'NULL', 80, '', '', 
4548       ],
4549       'primary_key' => 'vfieldpart',
4550       'unique' => [],
4551       'index' => [],
4552     },
4553
4554     'virtual_field' => {
4555       'columns' => [
4556         'vfieldnum', 'serial', '', '', '', '', 
4557         'recnum', 'int', '', '', '', '', 
4558         'vfieldpart', 'int', '', '', '', '', 
4559         'value', 'varchar', '', 128, '', '', 
4560       ],
4561       'primary_key'  => 'vfieldnum',
4562       'unique'       => [ [ 'vfieldpart', 'recnum' ] ],
4563       'index'        => [],
4564       'foreign_keys' => [
4565                           { columns    => [ 'vfieldpart' ],
4566                             table      => 'part_virtual_field',
4567                           },
4568                         ],
4569     },
4570
4571     'acct_snarf' => {
4572       'columns' => [
4573         'snarfnum',    'serial',     '',      '', '', '', 
4574         'snarfname',  'varchar', 'NULL', $char_d, '', '', 
4575         'svcnum',         'int',     '',      '', '', '', 
4576         'machine',    'varchar',     '',     255, '', '', 
4577         'protocol',   'varchar',     '', $char_d, '', '', 
4578         'username',   'varchar',     '', $char_d, '', '', 
4579         '_password',  'varchar',     '', $char_d, '', '', 
4580         'check_freq',     'int', 'NULL',      '', '', '', 
4581         'leavemail',     'char', 'NULL',       1, '', '', 
4582         'apop',          'char', 'NULL',       1, '', '', 
4583         'tls',           'char', 'NULL',       1, '', '', 
4584         'mailbox',    'varchar', 'NULL', $char_d, '', '', 
4585       ],
4586       'primary_key'  => 'snarfnum',
4587       'unique'       => [],
4588       'index'        => [ [ 'svcnum' ] ],
4589       'foreign_keys' => [
4590                           { columns    => [ 'svcnum' ],
4591                             table      => 'svc_acct',
4592                           },
4593                         ],
4594     },
4595
4596     'svc_external' => {
4597       'columns' => [
4598         'svcnum',     'int',     '',      '', '', '', 
4599         'id',      'bigint', 'NULL',      '', '', '', 
4600         'title',  'varchar', 'NULL', $char_d, '', '', 
4601       ],
4602       'primary_key'  => 'svcnum',
4603       'unique'       => [],
4604       'index'        => [],
4605       'foreign_keys' => [
4606                           { columns    => [ 'svcnum' ],
4607                             table      => 'cust_svc',
4608                           },
4609                         ],
4610     },
4611
4612     'cust_pay_refund' => {
4613       'columns' => [
4614         'payrefundnum', 'serial', '', '', '', '', 
4615         'paynum',  'int', '', '', '', '', 
4616         'refundnum',  'int', '', '', '', '', 
4617         '_date',    @date_type, '', '', 
4618         'amount',   @money_type, '', '', 
4619       ],
4620       'primary_key'  => 'payrefundnum',
4621       'unique'       => [],
4622       'index'        => [ ['paynum'], ['refundnum'] ],
4623       'foreign_keys' => [
4624                           { columns    => [ 'paynum' ],
4625                             table      => 'cust_pay',
4626                           },
4627                           { columns    => [ 'refundnum' ],
4628                             table      => 'cust_refund',
4629                           },
4630                         ],
4631     },
4632
4633     'part_pkg_option' => {
4634       'columns' => [
4635         'optionnum', 'serial', '', '', '', '', 
4636         'pkgpart', 'int', '', '', '', '', 
4637         'optionname', 'varchar', '', $char_d, '', '', 
4638         'optionvalue', 'text', 'NULL', '', '', '', 
4639       ],
4640       'primary_key'  => 'optionnum',
4641       'unique'       => [],
4642       'index'        => [ [ 'pkgpart' ], [ 'optionname' ] ],
4643       'foreign_keys' => [
4644                           { columns    => [ 'pkgpart' ],
4645                             table      => 'part_pkg',
4646                           },
4647                         ],
4648     },
4649
4650     'part_pkg_vendor' => {
4651       'columns' => [
4652         'num', 'serial', '', '', '', '', 
4653         'pkgpart', 'int', '', '', '', '', 
4654         'exportnum', 'int', '', '', '', '', 
4655         'vendor_pkg_id', 'varchar', '', $char_d, '', '', 
4656       ],
4657       'primary_key'  => 'num',
4658       'unique'       => [ [ 'pkgpart', 'exportnum' ] ],
4659       'index'        => [ [ 'pkgpart' ] ],
4660       'foreign_keys' => [
4661                           { columns    => [ 'pkgpart' ],
4662                             table      => 'part_pkg',
4663                           },
4664                           { columns    => [ 'exportnum' ],
4665                             table      => 'part_export',
4666                           },
4667                         ],
4668     },
4669
4670     'part_pkg_report_option' => {
4671       'columns' => [
4672         'num',      'serial',   '',      '', '', '', 
4673         'name',     'varchar',  '', $char_d, '', '', 
4674         'disabled', 'char', 'NULL',       1, '', '', 
4675       ],
4676       'primary_key' => 'num',
4677       'unique' => [ [ 'name' ] ],
4678       'index' => [ [ 'disabled' ] ],
4679     },
4680
4681     'part_pkg_usage' => {
4682       'columns' => [
4683         'pkgusagepart', 'serial',   '', '', '', '',
4684         'pkgpart',  'int',      '', '', '', '',
4685         'minutes',  'int',      '', '', '', '',
4686         'priority', 'int',  'NULL', '', '', '',
4687         'shared',   'char', 'NULL',  1, '', '',
4688         'rollover', 'char', 'NULL',  1, '', '',
4689         'description',  'varchar', 'NULL', $char_d, '', '',
4690       ],
4691       'primary_key'  => 'pkgusagepart',
4692       'unique'       => [],
4693       'index'        => [ [ 'pkgpart' ] ],
4694       'foreign_keys' => [
4695                           { columns    => [ 'pkgpart' ],
4696                             table      => 'part_pkg',
4697                           },
4698                         ],
4699     },
4700
4701     'part_pkg_usage_class' => {
4702       'columns' => [
4703         'num',       'serial',  '', '', '', '',
4704         'pkgusagepart', 'int',  '', '', '', '',
4705         'classnum',     'int','NULL', '', '', '',
4706       ],
4707       'primary_key'  => 'num',
4708       'unique'       => [ [ 'pkgusagepart', 'classnum' ] ],
4709       'index'        => [],
4710       'foreign_keys' => [
4711                           { columns    => [ 'pkgusagepart' ],
4712                             table      => 'part_pkg_usage',
4713                           },
4714                           { columns    => [ 'classnum' ],
4715                             table      => 'usage_class',
4716                           },
4717                         ],
4718     },
4719
4720     'rate' => {
4721       'columns' => [
4722         'ratenum',  'serial', '', '', '', '', 
4723         'ratename', 'varchar', '', $char_d, '', '', 
4724       ],
4725       'primary_key' => 'ratenum',
4726       'unique'      => [],
4727       'index'       => [],
4728     },
4729
4730     'rate_detail' => {
4731       'columns' => [
4732         'ratedetailnum',   'serial',  '',     '',      '', '', 
4733         'ratenum',         'int',     '',     '',      '', '', 
4734         'orig_regionnum',  'int', 'NULL',     '',      '', '', 
4735         'dest_regionnum',  'int',     '',     '',      '', '', 
4736         'min_included',    'int',     '',     '',      '', '', 
4737         'conn_charge',     'decimal', '', '10,4', '0.0000', '',
4738         'conn_sec',        'int',     '',     '',      '0', '',
4739         'min_charge',      'decimal', '', '10,5',       '', '',
4740         'sec_granularity', 'int',     '',     '',       '', '', 
4741         'ratetimenum',     'int', 'NULL',     '',       '', '',
4742         'classnum',        'int', 'NULL',     '',       '', '', 
4743         'cdrtypenum',      'int', 'NULL',     '',       '', '',
4744         'region_group', 'char', 'NULL',        1,       '', '', 
4745       ],
4746       'primary_key'  => 'ratedetailnum',
4747       'unique'       => [ [ 'ratenum', 'orig_regionnum', 'dest_regionnum' ] ],
4748       'index'        => [ [ 'ratenum', 'dest_regionnum' ],
4749                           [ 'ratenum', 'ratetimenum' ]
4750                         ],
4751       'foreign_keys' => [
4752                           { columns    => [ 'ratenum' ],
4753                             table      => 'rate',
4754                           },
4755                           { columns    => [ 'orig_regionnum' ],
4756                             table      => 'rate_region',
4757                             references => [ 'regionnum' ],
4758                           },
4759                           { columns    => [ 'dest_regionnum' ],
4760                             table      => 'rate_region',
4761                             references => [ 'regionnum' ],
4762                           },
4763                           { columns    => [ 'ratetimenum' ],
4764                             table      => 'rate_time',
4765                           },
4766                           { columns    => [ 'classnum' ],
4767                             table      => 'usage_class',
4768                           },
4769                           { columns    => [ 'cdrtypenum' ],
4770                             table      => 'cdr_type',
4771                           },
4772                         ],
4773     },
4774
4775     'rate_region' => {
4776       'columns' => [
4777         'regionnum',   'serial',      '', '', '', '', 
4778         'regionname',  'varchar',     '', $char_d, '', '', 
4779         'exact_match', 'char',    'NULL',  1, '', '',
4780       ],
4781       'primary_key' => 'regionnum',
4782       'unique'      => [],
4783       'index'       => [],
4784     },
4785
4786     'rate_prefix' => {
4787       'columns' => [
4788         'prefixnum',   'serial',      '', '', '', '', 
4789         'regionnum',   'int',         '', '', '', '', 
4790         'countrycode', 'varchar',     '',  3, '', '', 
4791         'npa',         'varchar', 'NULL', 10, '', '', #actually the whole prefix
4792         'nxx',         'varchar', 'NULL',  3, '', '', #actually not used
4793         'latanum',     'int',     'NULL',      '', '', '',
4794         'state',       'char',    'NULL',       2, '', '', 
4795         'ocn',         'char',    'NULL',       4, '', '', 
4796       ],
4797       'primary_key'  => 'prefixnum',
4798       'unique'       => [],
4799       'index'        => [ [ 'countrycode' ], [ 'npa' ], [ 'regionnum' ] ],
4800       'foreign_keys' => [
4801                           { columns    => [ 'regionnum' ],
4802                             table      => 'rate_region',
4803                           },
4804                           { columns    => [ 'latanum' ],
4805                             table      => 'lata',
4806                           },
4807                         ],
4808     },
4809
4810     'rate_time' => {
4811       'columns' => [
4812         'ratetimenum', 'serial',      '',      '', '', '',
4813         'ratetimename',   'varchar',      '', $char_d, '', '',
4814       ],
4815       'primary_key' => 'ratetimenum',
4816       'unique'      => [],
4817       'index'       => [],
4818     },
4819
4820     'rate_time_interval' => {
4821       'columns' => [
4822         'intervalnum', 'serial', '', '', '', '',
4823         'stime',          'int', '', '', '', '',
4824         'etime',          'int', '', '', '', '',
4825         'ratetimenum',    'int', '', '', '', '',
4826       ],
4827       'primary_key'  => 'intervalnum',
4828       'unique'       => [],
4829       'index'        => [],
4830       'foreign_keys' => [
4831                           { columns    => [ 'ratetimenum' ],
4832                             table      => 'rate_time',
4833                           },
4834                         ],
4835      },
4836
4837     #not really part of the above rate_ stuff (used with flat rate rather than
4838     # rated billing), but could be eventually, and its a rate
4839     'rate_tier' => {
4840       'columns' => [
4841         'tiernum',   'serial', '',      '', '', '',
4842         'tiername', 'varchar', '', $char_d, '', '',
4843       ],
4844       'primary_key' => 'tiernum',
4845       'unique'      => [ [ 'tiername'], ],
4846       'index'       => [],
4847     },
4848
4849     'rate_tier_detail' => {
4850       'columns' => [
4851         'tierdetailnum', 'serial', '',     '', '', '',
4852         'tiernum',          'int', '',     '', '', '',
4853         'min_quan',         'int', '',     '', '', '',
4854         'min_charge',   'decimal', '', '10,4', '', '',
4855       ],
4856       'primary_key'  => 'tierdetailnum',
4857       'unique'       => [],
4858       'index'        => [ ['tiernum'], ],
4859       'foreign_keys' => [
4860                           { columns    => [ 'tiernum' ],
4861                             table      => 'rate_tier',
4862                           },
4863                         ],
4864     },
4865
4866     'usage_class' => {
4867       'columns' => [
4868         'classnum',    'serial',      '',      '', '', '', 
4869         'weight',      'int',     'NULL',      '', '', '',
4870         'classname',   'varchar',     '', $char_d, '', '', 
4871         'format',      'varchar', 'NULL', $char_d, '', '', 
4872         'disabled',    'char',    'NULL',       1, '', '', 
4873       ],
4874       'primary_key' => 'classnum',
4875       'unique' => [],
4876       'index' => [ ['disabled'] ],
4877     },
4878
4879     'reg_code' => {
4880       'columns' => [
4881         'codenum',   'serial',    '', '', '', '', 
4882         'code',      'varchar',   '', $char_d, '', '', 
4883         'agentnum',  'int',       '', '', '', '', 
4884       ],
4885       'primary_key'  => 'codenum',
4886       'unique'       => [ [ 'agentnum', 'code' ] ],
4887       'index'        => [ [ 'agentnum' ] ],
4888       'foreign_keys' => [
4889                           { columns    => [ 'agentnum' ],
4890                             table      => 'agent',
4891                           },
4892                         ],
4893      },
4894
4895     'reg_code_pkg' => {
4896       'columns' => [
4897         'codepkgnum', 'serial', '', '', '', '', 
4898         'codenum',   'int',    '', '', '', '', 
4899         'pkgpart',   'int',    '', '', '', '', 
4900       ],
4901       'primary_key'  => 'codepkgnum',
4902       'unique'       => [ [ 'codenum', 'pkgpart' ] ],
4903       'index'        => [ [ 'codenum' ] ],
4904       'foreign_keys' => [
4905                           { columns    => [ 'codenum' ],
4906                             table      => 'reg_code',
4907                           },
4908                           { columns    => [ 'pkgpart' ],
4909                             table      => 'part_pkg',
4910                           },
4911                         ],
4912     },
4913
4914     'clientapi_session' => {
4915       'columns' => [
4916         'sessionnum',  'serial',  '', '', '', '', 
4917         'sessionid',  'varchar',  '', $char_d, '', '', 
4918         'namespace',  'varchar',  '', $char_d, '', '', 
4919       ],
4920       'primary_key' => 'sessionnum',
4921       'unique'      => [ [ 'sessionid', 'namespace' ] ],
4922       'index'       => [],
4923     },
4924
4925     'clientapi_session_field' => {
4926       'columns' => [
4927         'fieldnum',    'serial',     '', '', '', '', 
4928         'sessionnum',     'int',     '', '', '', '', 
4929         'fieldname',  'varchar',     '', $char_d, '', '', 
4930         'fieldvalue',    'text', 'NULL', '', '', '', 
4931       ],
4932       'primary_key'  => 'fieldnum',
4933       'unique'       => [ [ 'sessionnum', 'fieldname' ] ],
4934       'index'        => [],
4935       'foreign_keys' => [
4936                           { columns    => [ 'sessionnum' ],
4937                             table      => 'clientapi_session',
4938                           },
4939                         ],
4940     },
4941
4942     'payment_gateway' => {
4943       'columns' => [
4944         'gatewaynum',       'serial',   '',     '', '', '', 
4945         'gateway_namespace','varchar',  'NULL', $char_d, '', '', 
4946         'gateway_module',   'varchar',  '',     $char_d, '', '', 
4947         'gateway_username', 'varchar',  'NULL', $char_d, '', '', 
4948         'gateway_password', 'varchar',  'NULL', $char_d, '', '', 
4949         'gateway_action',   'varchar',  'NULL', $char_d, '', '', 
4950         'gateway_callback_url', 'varchar',  'NULL', 255, '', '', 
4951         'gateway_cancel_url',   'varchar',  'NULL', 255, '', '',
4952         'disabled',   'char',  'NULL',   1, '', '', 
4953       ],
4954       'primary_key' => 'gatewaynum',
4955       'unique' => [],
4956       'index'  => [ [ 'disabled' ] ],
4957     },
4958
4959     'payment_gateway_option' => {
4960       'columns' => [
4961         'optionnum',   'serial',  '',     '', '', '', 
4962         'gatewaynum',  'int',     '',     '', '', '', 
4963         'optionname',  'varchar', '',     $char_d, '', '', 
4964         'optionvalue', 'text',    'NULL', '', '', '', 
4965       ],
4966       'primary_key'  => 'optionnum',
4967       'unique'       => [],
4968       'index'        => [ [ 'gatewaynum' ], [ 'optionname' ] ],
4969       'foreign_keys' => [
4970                           { columns    => [ 'gatewaynum' ],
4971                             table      => 'payment_gateway',
4972                           },
4973                         ],
4974     },
4975
4976     'agent_payment_gateway' => {
4977       'columns' => [
4978         'agentgatewaynum', 'serial', '', '', '', '', 
4979         'agentnum',        'int', '', '', '', '', 
4980         'gatewaynum',      'int', '', '', '', '', 
4981         'cardtype',        'varchar', 'NULL', $char_d, '', '', 
4982         'taxclass',        'varchar', 'NULL', $char_d, '', '', 
4983       ],
4984       'primary_key'  => 'agentgatewaynum',
4985       'unique'       => [],
4986       'index'        => [ [ 'agentnum', 'cardtype' ], ],
4987
4988       'foreign_keys' => [
4989
4990                           { columns    => [ 'agentnum' ],
4991                             table      => 'agent',
4992                           },
4993                           { columns    => [ 'gatewaynum' ],
4994                             table      => 'payment_gateway',
4995                           },
4996                         ],
4997     },
4998
4999     'banned_pay' => {
5000       'columns' => [
5001         'bannum',  'serial',   '',     '', '', '', 
5002         'payby',   'char',     '',       4, '', '', 
5003         'payinfo', 'varchar',  '',     128, '', '', #say, a 512-big digest _hex encoded
5004         #'paymask', 'varchar',  'NULL', $char_d, '', ''
5005         '_date',            @date_type,         '', '', 
5006         'end_date',         @date_type,         '', '', 
5007         'otaker',  'varchar',  'NULL',      32, '', '', 
5008         'usernum',     'int',  'NULL',      '', '', '',
5009         'bantype', 'varchar',  'NULL', $char_d, '', '',
5010         'reason',  'varchar',  'NULL', $char_d, '', '', 
5011       ],
5012       'primary_key'  => 'bannum',
5013       'unique'       => [],
5014       'index'        => [ [ 'payby', 'payinfo' ], [ 'usernum' ], ],
5015       'foreign_keys' => [
5016                           { columns    => [ 'usernum' ],
5017                             table      => 'access_user',
5018                           },
5019                         ],
5020     },
5021
5022     'pkg_category' => {
5023       'columns' => [
5024         'categorynum',   'serial',  '', '', '', '', 
5025         'categoryname',  'varchar', '', $char_d, '', '', 
5026         'weight',         'int', 'NULL',  '', '', '',
5027         'condense',      'char', 'NULL',   1, '', '', 
5028         'disabled',      'char', 'NULL',   1, '', '', 
5029       ],
5030       'primary_key' => 'categorynum',
5031       'unique' => [],
5032       'index' => [ ['disabled'] ],
5033     },
5034
5035     'pkg_class' => {
5036       'columns' => [
5037         'classnum',    'serial',   '',      '', '', '', 
5038         'classname',   'varchar',  '', $char_d, '', '', 
5039         'categorynum', 'int',  'NULL',      '', '', '', 
5040         'disabled',    'char', 'NULL',       1, '', '', 
5041         'fcc_ds0s',      'int',     'NULL', '', '', '', 
5042       ],
5043       'primary_key'  => 'classnum',
5044       'unique'       => [],
5045       'index'        => [ ['disabled'] ],
5046       'foreign_keys' => [
5047                           { columns    => [ 'categorynum' ],
5048                             table      => 'pkg_category',
5049                           },
5050                         ],
5051     },
5052
5053     'cdr' => {
5054       'columns' => [
5055         # qw( name type null length default local );
5056
5057         ###
5058         #asterisk fields
5059         ###
5060
5061         'acctid',   'bigserial',  '', '', '', '', 
5062         #'calldate', 'TIMESTAMP with time zone', '', '', \'now()', '',
5063         'calldate', 'timestamp',   '',      '', \'now()', '',
5064         'clid',        'varchar',  '', $char_d, \"''", '', 
5065         'src',         'varchar',  '', $char_d, \"''", '', 
5066         'dst',         'varchar',  '', $char_d, \"''", '', 
5067         'dcontext',    'varchar',  '', $char_d, \"''", '', 
5068         'channel',     'varchar',  '', $char_d, \"''", '', 
5069         'dstchannel',  'varchar',  '', $char_d, \"''", '', 
5070         'lastapp',     'varchar',  '', $char_d, \"''", '', 
5071         'lastdata',    'varchar',  '',     255, \"''", '', 
5072
5073         #currently only opensips & voipswitch
5074         'src_ip_addr', 'varchar',  'NULL',  15,    '', '',
5075
5076         #currently only opensips
5077         'dst_ip_addr', 'varchar',  'NULL',  15,    '', '',
5078
5079         #currently only u4:
5080         # terminating number (as opposed to dialed destination)
5081         'dst_term',    'varchar',  'NULL', $char_d, '', '',
5082
5083         #these don't seem to be logged by most of the SQL cdr_* modules
5084         #except tds under sql-illegal names, so;
5085         # ... don't rely on them for rating?
5086         # and, what they hey, i went ahead and changed the names and data types
5087         # to freeside-style dates...
5088           #'start',  'timestamp', 'NULL',  '',    '', '',
5089           #'answer', 'timestamp', 'NULL',  '',    '', '',
5090           #'end',    'timestamp', 'NULL',  '',    '', '',
5091         'startdate',  @date_type, '', '', 
5092         'answerdate', @date_type, '', '', 
5093         'enddate',    @date_type, '', '', 
5094         #
5095
5096         'duration',    'int',      '',      '',     0, '',
5097         'billsec',     'int',      '',      '',     0, '', 
5098         'disposition', 'varchar',  '',      45, \"''", '',
5099         'amaflags',    'int',      '',      '',     0, '',
5100         'accountcode', 'varchar',  '',      20, \"''", '',
5101         'uniqueid',    'varchar',  '', $char_d, \"''", '',
5102         'userfield',   'varchar',  '',     512, \"''", '',
5103
5104         'max_callers', 'int',  'NULL',      '',    '', '',
5105
5106         ###
5107         # old fields for unitel/RSLCOM/convergent that don't map to asterisk
5108         # ones we adoped moved to "own fields" section below
5109         # charged_party, upstream_price, rated_price, carrierid, cdrtypenum
5110         ###
5111
5112         'upstream_currency',      'char', 'NULL',       3, '', '',
5113         'upstream_rateplanid',     'int', 'NULL',      '', '', '', #?
5114
5115         # how it was rated internally...
5116         'ratedetailnum',           'int', 'NULL',      '', '', '',
5117
5118         'distance',            'decimal', 'NULL',      '', '', '',
5119         'islocal',                 'int', 'NULL',      '', '', '', # '',  '', 0, '' instead?
5120
5121         #cdr_calltype: the big list in appendix 2
5122         'calltypenum',             'int', 'NULL',      '', '', '',
5123
5124         'description',         'varchar', 'NULL', $char_d, '', '',
5125         'quantity',                'int', 'NULL',      '', '', '', 
5126
5127         'upstream_rateid',         'int', 'NULL',      '', '', '',
5128
5129         ###
5130         # more fields, for GSM imports
5131         ###
5132         'servicecode',             'int', 'NULL',      '', '', '',
5133         'quantity_able',           'int', 'NULL',      '', '', '', 
5134
5135         ###
5136         #and now for our own fields
5137         ###
5138
5139         'cdrtypenum',              'int', 'NULL',      '', '', '',
5140
5141         'charged_party',       'varchar', 'NULL', $char_d, '', '',
5142         'charged_party_imsi',  'varchar', 'NULL', $char_d, '', '',
5143
5144         'upstream_price',      'decimal', 'NULL',  '10,5', '', '', 
5145
5146         #currently only voipswitch
5147         #'upstream_rate',      'decimal', 'NULL',  '10,5', '', '', 
5148
5149         'upstream_src_regionname', 'varchar', 'NULL', $char_d, '', '',
5150         'upstream_dst_regionname', 'varchar', 'NULL', $char_d, '', '',
5151
5152         # how it was rated internally...
5153         'rated_pretty_dst',       'varchar', 'NULL', $char_d, '', '',
5154         'rated_regionname',       'varchar', 'NULL', $char_d, '', '',
5155         'rated_price',            'decimal', 'NULL',  '10,4', '', '',
5156         'rated_seconds',              'int', 'NULL',      '', '', '',
5157         'rated_minutes', 'double precision', 'NULL',      '', '', '',
5158         'rated_granularity',          'int', 'NULL',      '', '', '',
5159         'rated_ratedetailnum',        'int', 'NULL',      '', '', '',
5160         'rated_classnum',             'int', 'NULL',      '', '', '', 
5161         'rated_ratename',         'varchar', 'NULL', $char_d, '', '', 
5162
5163         'carrierid',               'bigint', 'NULL',      '', '', '',
5164
5165         # service it was matched to
5166         'svcnum',             'int',   'NULL',     '',   '', '', 
5167
5168         #NULL, done (or something)
5169         'freesidestatus', 'varchar',   'NULL',     32,   '', '', 
5170
5171         #NULL, done (or something)
5172         'freesiderewritestatus', 'varchar',   'NULL',     32,   '', '', 
5173
5174         #an indexed place to put big numbers
5175         'cdrid',         'bigint',     'NULL',     '',  '', '', 
5176
5177         #for taqua accountcode rewriting, for starters
5178         'sessionnum',       'int',    'NULL',      '', '', '',
5179         'subscriber',   'varchar',    'NULL', $char_d, '', '',
5180
5181         #old
5182         'cdrbatch',     'varchar',    'NULL',     255, '', '',
5183         #new
5184         'cdrbatchnum',      'int',    'NULL',      '', '', '',
5185
5186       ],
5187       'primary_key' => 'acctid',
5188       'unique' => [],
5189       'index' => [ [ 'calldate' ],
5190                    [ 'src' ], [ 'dst' ], [ 'dcontext' ], [ 'charged_party' ],
5191                    [ 'lastapp' ],
5192                    ['accountcode'], ['uniqueid'], ['carrierid'], ['cdrid'],
5193                    [ 'sessionnum' ], [ 'subscriber' ],
5194                    [ 'freesidestatus' ], [ 'freesiderewritestatus' ],
5195                    [ 'cdrbatch' ], [ 'cdrbatchnum' ],
5196                    [ 'src_ip_addr' ], [ 'dst_ip_addr' ], [ 'dst_term' ],
5197                  ],
5198       #no FKs on cdr table... choosing not to throw errors no matter what's
5199       # thrown in here.  better to have the data.
5200     },
5201
5202     'cdr_batch' => {
5203       'columns' => [
5204         'cdrbatchnum',   'serial',    '',   '', '', '', 
5205         'cdrbatch', 'varchar', 'NULL', 255, '', '',
5206         '_date',     @date_type, '', '', 
5207       ],
5208       'primary_key' => 'cdrbatchnum',
5209       'unique' => [ [ 'cdrbatch' ] ],
5210       'index' => [],
5211     },
5212
5213     'cdr_termination' => {
5214       'columns' => [
5215         'cdrtermnum', 'bigserial',     '',      '', '', '',
5216         'acctid',        'bigint',     '',      '', '', '', 
5217         'termpart',         'int',     '',      '', '', '',#future use see below
5218         'rated_price',  'decimal', 'NULL',  '10,4', '', '',
5219         'rated_seconds',    'int', 'NULL',      '', '', '',
5220         'rated_minutes', 'double precision', 'NULL',   '', '', '',
5221         'status',       'varchar', 'NULL',      32, '', '',
5222         'svcnum',           'int', 'NULL',      '', '', '',
5223       ],
5224       'primary_key'  => 'cdrtermnum',
5225       'unique'       => [ [ 'acctid', 'termpart' ] ],
5226       'index'        => [ [ 'acctid' ], [ 'status' ], ],
5227       'foreign_keys' => [
5228                           { columns    => [ 'acctid' ],
5229                             table      => 'cdr',
5230                           },
5231                           { columns    => [ 'svcnum' ],
5232                             table      => 'cust_svc',
5233                           },
5234                         ],
5235     },
5236
5237     #to handle multiple termination/settlement passes...
5238    # 'part_termination' => {
5239    #   'columns' => [
5240    #     'termpart',       'int', '',      '', '', '',
5241    #     'termname',   'varchar', '', $char_d, '', '',
5242    #     'cdr_column', 'varchar', '', $char_d, '', '', #maybe set it here instead of in the price plan?
5243    #   ],
5244    #   'primary_key' => 'termpart',
5245    #   'unique' => [],
5246    #   'index'  => [],
5247    # },
5248
5249     #the remaining cdr_ tables are not really used
5250     'cdr_calltype' => {
5251       'columns' => [
5252         'calltypenum',   'serial',  '', '', '', '', 
5253         'calltypename',  'varchar', '', $char_d, '', '', 
5254       ],
5255       'primary_key' => 'calltypenum',
5256       'unique'      => [],
5257       'index'       => [],
5258     },
5259
5260     'cdr_type' => {
5261       'columns' => [
5262         'cdrtypenum'  => 'serial',  '', '', '', '',
5263         'cdrtypename' => 'varchar', '', $char_d, '', '',
5264       ],
5265       'primary_key' => 'cdrtypenum',
5266       'unique'      => [],
5267       'index'       => [],
5268     },
5269
5270     'cdr_carrier' => {
5271       'columns' => [
5272         'carrierid'   =>  'serial',     '',      '', '', '',
5273         'carriername' => 'varchar',     '', $char_d, '', '',
5274         'disabled'    =>    'char', 'NULL',       1, '', '', 
5275       ],
5276       'primary_key' => 'carrierid',
5277       'unique'      => [],
5278       'index'       => [],
5279     },
5280
5281     #'cdr_file' => {
5282     #  'columns' => [
5283     #    'filenum',    'serial',     '', '', '', '',
5284     #    'filename',  'varchar',     '', '', '', '',
5285     #    'status',    'varchar', 'NULL', '', '', '',
5286     #  ],
5287     #  'primary_key' => 'filenum',
5288     #  'unique' => [ [ 'filename' ], ], #just change the index if we need to
5289     #                                   # agent-virtualize or have a customer
5290     #                                   # with dup-filename needs or something
5291     #                                   # (only used by cdr.http_and_import for
5292     #                                   #  chrissakes)
5293     #  'index'  => [],
5294     #},
5295
5296     'inventory_item' => {
5297       'columns' => [
5298         'itemnum',   'serial',      '',      '', '', '',
5299         'classnum',  'int',         '',      '', '', '',
5300         'agentnum',  'int',     'NULL',      '', '', '',
5301         'item',      'varchar',     '', $char_d, '', '',
5302         'svcnum',    'int',     'NULL',      '', '', '',
5303         'svc_field', 'varchar', 'NULL', $char_d, '', '',
5304       ],
5305       'primary_key'  => 'itemnum',
5306       'unique'       => [ [ 'classnum', 'item' ] ],
5307       'index'        => [ [ 'classnum' ], [ 'agentnum' ], [ 'svcnum' ] ],
5308       'foreign_keys' => [
5309                           { columns    => [ 'classnum' ],
5310                             table      => 'inventory_class',
5311                           },
5312                           { columns    => [ 'agentnum' ],
5313                             table      => 'agent',
5314                           },
5315                           { columns    => [ 'svcnum' ],
5316                             table      => 'cust_svc',
5317                           },
5318                         ],
5319     },
5320
5321     'inventory_class' => {
5322       'columns' => [
5323         'classnum',  'serial',       '',      '', '', '',
5324         'classname', 'varchar',      '', $char_d, '', '',
5325       ],
5326       'primary_key' => 'classnum',
5327       'unique' => [],
5328       'index'  => [],
5329     },
5330
5331     'access_user_session' => {
5332       'columns' => [
5333         'sessionnum',   'serial',  '',      '', '', '', 
5334         'sessionkey',  'varchar',  '', $char_d, '', '',
5335         'usernum',         'int',  '',      '', '', '',
5336         'start_date', @date_type,               '', '',
5337         'last_date',  @date_type,               '', '',
5338       ],
5339       'primary_key'  => 'sessionnum',
5340       'unique'       => [ [ 'sessionkey' ] ],
5341       'index'        => [],
5342       'foreign_keys' => [
5343                           { columns    => [ 'usernum' ],
5344                             table      => 'access_user',
5345                           },
5346                         ],
5347     },
5348
5349     'access_user' => {
5350       'columns' => [
5351         'usernum',             'serial',     '',      '', '', '',
5352         'username',           'varchar',     '', $char_d, '', '',
5353         '_password',          'varchar', 'NULL', $char_d, '', '',
5354         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
5355         'last',               'varchar', 'NULL', $char_d, '', '', 
5356         'first',              'varchar', 'NULL', $char_d, '', '', 
5357         'user_custnum',           'int', 'NULL',      '', '', '',
5358         'report_salesnum',        'int', 'NULL',      '', '', '',
5359         'disabled',              'char', 'NULL',       1, '', '', 
5360       ],
5361       'primary_key'  => 'usernum',
5362       'unique'       => [ [ 'username' ] ],
5363       'index'        => [ [ 'user_custnum' ] ],
5364       'foreign_keys' => [
5365                           { columns    => [ 'user_custnum' ],
5366                             table      => 'cust_main',
5367                             references => [ 'custnum' ],
5368                           },
5369                           { columns    => [ 'report_salesnum' ],
5370                             table      => 'sales',
5371                             references => [ 'salesnum' ],
5372                           },
5373                         ],
5374     },
5375
5376     'access_user_pref' => {
5377       'columns' => [
5378         'prefnum',    'serial',       '', '', '', '',
5379         'usernum',     'int',       '', '', '', '',
5380         'prefname', 'varchar', '', $char_d, '', '', 
5381         'prefvalue', 'text', 'NULL', '', '', '', 
5382         'expiration', @date_type, '', '',
5383       ],
5384       'primary_key'  => 'prefnum',
5385       'unique'       => [],
5386       'index'        => [ [ 'usernum' ] ],
5387       'foreign_keys' => [
5388                           { columns    => [ 'usernum' ],
5389                             table      => 'access_user',
5390                           },
5391                         ],
5392     },
5393
5394     'access_group' => {
5395       'columns' => [
5396         'groupnum',   'serial', '',      '', '', '',
5397         'groupname', 'varchar', '', $char_d, '', '',
5398       ],
5399       'primary_key' => 'groupnum',
5400       'unique' => [ [ 'groupname' ] ],
5401       'index'  => [],
5402     },
5403
5404     'access_usergroup' => {
5405       'columns' => [
5406         'usergroupnum', 'serial', '', '', '', '',
5407         'usernum',         'int', '', '', '', '',
5408         'groupnum',        'int', '', '', '', '',
5409       ],
5410       'primary_key'  => 'usergroupnum',
5411       'unique'       => [ [ 'usernum', 'groupnum' ] ],
5412       'index'        => [ [ 'usernum' ] ],
5413       'foreign_keys' => [
5414                           { columns    => [ 'usernum' ],
5415                             table      => 'access_user',
5416                           },
5417                           { columns    => [ 'groupnum' ],
5418                             table      => 'access_group',
5419                           },
5420                         ],
5421      },
5422
5423     'access_groupagent' => {
5424       'columns' => [
5425         'groupagentnum', 'serial', '', '', '', '',
5426         'groupnum',         'int', '', '', '', '',
5427         'agentnum',         'int', '', '', '', '',
5428       ],
5429       'primary_key'  => 'groupagentnum',
5430       'unique'       => [ [ 'groupnum', 'agentnum' ] ],
5431       'index'        => [ [ 'groupnum' ] ],
5432       'foreign_keys' => [
5433                           { columns    => [ 'groupnum' ],
5434                             table      => 'access_group',
5435                           },
5436                           { columns    => [ 'agentnum' ],
5437                             table      => 'agent',
5438                           },
5439                         ],
5440     },
5441
5442     'access_right' => {
5443       'columns' => [
5444         'rightnum',   'serial', '',      '', '', '',
5445         'righttype', 'varchar', '', $char_d, '', '',
5446         'rightobjnum',   'int', '',      '', '', '',
5447         'rightname', 'varchar', '', $char_d, '', '',
5448       ],
5449       'primary_key' => 'rightnum',
5450       'unique' => [ [ 'righttype', 'rightobjnum', 'rightname' ] ],
5451       'index'  => [],
5452     },
5453
5454     'svc_phone' => {
5455       'columns' => [
5456         'svcnum',                         'int',     '',      '', '', '', 
5457         'countrycode',                'varchar',     '',       3, '', '', 
5458         'phonenum',                   'varchar',     '',      25, '', '', #12 ?
5459         'sim_imsi',                   'varchar', 'NULL',      15, '', '',
5460         'pin',                        'varchar', 'NULL', $char_d, '', '',
5461         'sip_password',               'varchar', 'NULL', $char_d, '', '',
5462         'phone_name',                 'varchar', 'NULL', $char_d, '', '',
5463         'pbxsvc',                         'int', 'NULL',      '', '', '',
5464         'domsvc',                         'int', 'NULL',      '', '', '', 
5465         'locationnum',                    'int', 'NULL',      '', '', '',
5466         'forwarddst',                 'varchar', 'NULL',      15, '', '', 
5467         'email',                      'varchar', 'NULL',     255, '', '', 
5468         'lnp_status',                 'varchar', 'NULL', $char_d, '', '',
5469         'portable',                      'char', 'NULL',       1, '', '', 
5470         'lrn',                           'char', 'NULL',      10, '', '', 
5471         'lnp_desired_due_date',           'int', 'NULL',      '', '', '',
5472         'lnp_due_date',                   'int', 'NULL',      '', '', '',
5473         'lnp_other_provider',         'varchar', 'NULL', $char_d, '', '',
5474         'lnp_other_provider_account', 'varchar', 'NULL', $char_d, '', '',
5475         'lnp_reject_reason',          'varchar', 'NULL', $char_d, '', '',
5476         'sms_carrierid',                  'int', 'NULL',      '', '', '',
5477         'sms_account',                'varchar', 'NULL', $char_d, '', '',
5478         'max_simultaneous',               'int', 'NULL',      '', '', '',
5479       ],
5480       'primary_key'  => 'svcnum',
5481       'unique'       => [ [ 'sms_carrierid', 'sms_account'] ],
5482       'index'        => [ ['countrycode', 'phonenum'], ['pbxsvc'], ['domsvc'],
5483                           ['locationnum'], ['sms_carrierid'],
5484                         ],
5485       'foreign_keys' => [
5486                           { columns    => [ 'svcnum' ],
5487                             table      => 'cust_svc',
5488                           },
5489                           { columns    => [ 'pbxsvc' ],
5490                             table      => 'svc_pbx', #'cust_svc',
5491                             references => [ 'svcnum' ],
5492                           },
5493                           { columns    => [ 'domsvc' ],
5494                             table      => 'svc_domain', #'cust_svc',
5495                             references => [ 'svcnum' ],
5496                           },
5497                           { columns    => [ 'locationnum' ],
5498                             table      => 'cust_location',
5499                           },
5500                           { columns    => [ 'sms_carrierid' ],
5501                             table      => 'cdr_carrier',
5502                             references => [ 'carrierid' ],
5503                           },
5504                         ],
5505     },
5506
5507     'phone_device' => {
5508       'columns' => [
5509         'devicenum', 'serial',     '', '', '', '',
5510         'devicepart',   'int',     '', '', '', '',
5511         'svcnum',       'int',     '', '', '', '', 
5512         'mac_addr', 'varchar', 'NULL', 12, '', '', 
5513       ],
5514       'primary_key'  => 'devicenum',
5515       'unique'       => [ [ 'mac_addr' ], ],
5516       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
5517       'foreign_keys' => [
5518                           { columns    => [ 'devicepart' ],
5519                             table      => 'part_device',
5520                           },
5521                           { columns    => [ 'svcnum' ],
5522                             table      => 'svc_phone',
5523                           },
5524                         ],
5525     },
5526
5527     'part_device' => {
5528       'columns' => [
5529         'devicepart', 'serial',  '',      '', '', '',
5530         'devicename', 'varchar', '', $char_d, '', '',
5531         'inventory_classnum', 'int', 'NULL', '', '', '',
5532       ],
5533       'primary_key'  => 'devicepart',
5534       'unique'       => [ [ 'devicename' ] ], #?
5535       'index'        => [],
5536       'foreign_keys' => [
5537                           { columns    => [ 'inventory_classnum' ],
5538                             table      => 'inventory_class',
5539                             references => [ 'classnum' ],
5540                           },
5541                         ],
5542     },
5543
5544     'phone_avail' => {
5545       'columns' => [
5546         'availnum',    'serial',      '',      '', '', '', 
5547         'exportnum',   'int',         '',      '', '', '', 
5548         'countrycode', 'varchar',     '',       3, '', '', 
5549         'state',       'char',    'NULL',       2, '', '', 
5550         'npa',         'char',        '',       3, '', '', 
5551         'nxx',         'char',    'NULL',       3, '', '', 
5552         'station',     'char',    'NULL',       4, '', '',
5553         'name',        'varchar', 'NULL', $char_d, '', '',
5554         'rate_center_abbrev', 'varchar', 'NULL', $char_d, '', '',
5555         'latanum',      'int',     'NULL',      '', '', '',
5556         'msanum',       'int', 'NULL', '', '', '',
5557         'ordernum',      'int',     'NULL',      '', '', '',
5558         'svcnum',      'int',     'NULL',      '', '', '',
5559         'availbatch', 'varchar',  'NULL', $char_d, '', '',
5560       ],
5561       'primary_key'  => 'availnum',
5562       'unique'       => [],
5563       'index'        => [ ['exportnum','countrycode','state'],    #npa search
5564                           ['exportnum','countrycode','npa'],      #nxx search
5565                           ['exportnum','countrycode','npa','nxx'],#station srch
5566                           [ 'exportnum','countrycode','npa','nxx','station'], #
5567                           [ 'svcnum' ],
5568                           [ 'availbatch' ],
5569                           [ 'latanum' ],
5570                         ],
5571       'foreign_keys' => [
5572                           { columns    => [ 'exportnum' ],
5573                             table      => 'part_export',
5574                           },
5575                           { columns    => [ 'latanum' ],
5576                             table      => 'lata',
5577                           },
5578                           { columns    => [ 'msanum' ],
5579                             table      => 'msa',
5580                           },
5581                           { columns    => [ 'ordernum' ],
5582                             table      => 'did_order',
5583                           },
5584                           { columns    => [ 'svcnum' ],
5585                             table      => 'svc_phone',
5586                           },
5587                         ],
5588     },
5589
5590     'lata' => {
5591       'columns' => [
5592         'latanum',    'int',      '',      '', '', '', 
5593         'description',   'varchar',    '',      $char_d, '', '', 
5594         'have_usage',   'int',    'NULL',      '', '', '', 
5595       ],
5596       'primary_key' => 'latanum',
5597       'unique' => [],
5598       'index'  => [],
5599     },
5600
5601     'msa' => {
5602       'columns' => [
5603         'msanum',    'int',      '',      '', '', '', 
5604         'description',   'varchar',    '',      $char_d, '', '', 
5605       ],
5606       'primary_key' => 'msanum',
5607       'unique' => [],
5608       'index'  => [],
5609     },
5610
5611     'rate_center' => {
5612       'columns' => [
5613         'ratecenternum',    'serial',      '',      '', '', '', 
5614         'description',   'varchar',    '',      $char_d, '', '', 
5615       ],
5616       'primary_key' => 'ratecenternum',
5617       'unique' => [],
5618       'index'  => [],
5619     },
5620
5621     'did_vendor' => {
5622       'columns' => [
5623         'vendornum',    'serial',      '',      '', '', '', 
5624         'vendorname',   'varchar',        '',     $char_d, '', '', 
5625       ],
5626       'primary_key' => 'vendornum',
5627       'unique' => [],
5628       'index'  => [],
5629     },
5630
5631     'did_order_item' => {
5632       'columns' => [
5633         'orderitemnum',    'serial',      '',      '', '', '', 
5634         'ordernum',    'int',      '',      '', '', '', 
5635         'msanum',      'int',     'NULL',      '', '', '',
5636         'npa',      'int',     'NULL',      '', '', '',
5637         'latanum',      'int',     'NULL',      '', '', '',
5638         'ratecenternum',      'int',     'NULL',      '', '', '',
5639         'state',       'char',    'NULL',       2, '', '', 
5640         'quantity',      'int',     '',      '', '', '',
5641         'custnum',   'int', 'NULL', '', '', '',
5642       ],
5643       'primary_key'  => 'orderitemnum',
5644       'unique'       => [],
5645       'index'        => [],
5646       'foreign_keys' => [
5647                           { columns    => [ 'ordernum' ],
5648                             table      => 'did_order',
5649                           },
5650                           { columns    => [ 'msanum' ],
5651                             table      => 'msa',
5652                           },
5653                           { columns    => [ 'latanum' ],
5654                             table      => 'lata',
5655                           },
5656                           { columns    => [ 'ratecenternum' ],
5657                             table      => 'rate_center',
5658                           },
5659                           { columns    => [ 'custnum' ],
5660                             table      => 'cust_main',
5661                           },
5662                         ],
5663     },
5664
5665     'did_order' => {
5666       'columns' => [
5667         'ordernum',    'serial',      '',      '', '', '', 
5668         'vendornum',   'int',       '',      '', '', '', 
5669         'vendor_order_id',   'varchar',  'NULL',   $char_d, '', '', 
5670         'custnum',   'int', 'NULL', '', '', '',
5671         'submitted',      'int',     '',      '', '', '',
5672         'confirmed',      'int',     'NULL',      '', '', '',
5673         'received',      'int',     'NULL',      '', '', '',
5674       ],
5675       'primary_key'  => 'ordernum',
5676       'unique'       => [ [ 'vendornum', 'vendor_order_id' ] ],
5677       'index'        => [],
5678       'foreign_keys' => [
5679                           { columns    => [ 'vendornum' ],
5680                             table      => 'did_vendor',
5681                           },
5682                           { columns    => [ 'custnum' ],
5683                             table      => 'cust_main',
5684                           },
5685                         ],
5686     },
5687
5688     'reason_type' => {
5689       'columns' => [
5690         'typenum',   'serial',  '', '', '', '', 
5691         'class',     'char', '', 1, '', '', 
5692         'type',     'varchar', '', $char_d, '', '', 
5693       ],
5694       'primary_key' => 'typenum',
5695       'unique' => [],
5696       'index' => [],
5697     },
5698
5699     'reason' => {
5700       'columns' => [
5701         'reasonnum',     'serial',  '', '', '', '', 
5702         'reason_type',   'int',  '', '', '', '', 
5703         'reason',        'text', '', '', '', '', 
5704         'disabled',      'char',    'NULL', 1, '', '', 
5705         'unsuspend_pkgpart', 'int',  'NULL', '', '', '',
5706         'unsuspend_hold','char',    'NULL', 1, '', '',
5707       ],
5708       'primary_key'  => 'reasonnum',
5709       'unique'       => [],
5710       'index'        => [],
5711       'foreign_keys' => [
5712                           { columns    => [ 'reason_type' ],
5713                             table      => 'reason_type',
5714                             references => [ 'typenum' ],
5715                           },
5716                           { columns    => [ 'unsuspend_pkgpart' ],
5717                             table      => 'part_pkg',
5718                             references => [ 'pkgpart' ],
5719                           },
5720                         ],
5721     },
5722
5723     'conf' => {
5724       'columns' => [
5725         'confnum',  'serial',     '',      '', '', '', 
5726         'agentnum', 'int',    'NULL',      '', '', '', 
5727         'locale',   'varchar','NULL',      16, '', '',
5728         'name',     'varchar',    '', $char_d, '', '', 
5729         'value',    'text',   'NULL',      '', '', '',
5730       ],
5731       'primary_key'  => 'confnum',
5732       'unique'       => [ [ 'agentnum', 'locale', 'name' ] ],
5733       'index'        => [],
5734       'foreign_keys' => [
5735                           { columns    => [ 'agentnum' ],
5736                             table      => 'agent',
5737                           },
5738                         ],
5739     },
5740
5741     'pkg_referral' => {
5742       'columns' => [
5743         'pkgrefnum',     'serial', '', '', '', '',
5744         'pkgnum',        'int',    '', '', '', '',
5745         'refnum',        'int',    '', '', '', '',
5746       ],
5747       'primary_key'  => 'pkgrefnum',
5748       'unique'       => [ [ 'pkgnum', 'refnum' ] ],
5749       'index'        => [ [ 'pkgnum' ], [ 'refnum' ] ],
5750       'foreign_keys' => [
5751                           { columns    => [ 'pkgnum' ],
5752                             table      => 'cust_pkg',
5753                           },
5754                           { columns    => [ 'refnum' ],
5755                             table      => 'part_referral',
5756                           },
5757                         ],
5758     },
5759
5760     'svc_pbx' => {
5761       'columns' => [
5762         'svcnum',           'int',     '',      '', '', '', 
5763         'id',               'int', 'NULL',      '', '', '', 
5764         'title',        'varchar', 'NULL', $char_d, '', '', 
5765         'max_extensions',   'int', 'NULL',      '', '', '',
5766         'max_simultaneous', 'int', 'NULL',      '', '', '',
5767       ],
5768       'primary_key'  => 'svcnum',
5769       'unique'       => [],
5770       'index'        => [ [ 'id' ] ],
5771       'foreign_keys' => [
5772                           { columns    => [ 'svcnum' ],
5773                             table      => 'cust_svc',
5774                           },
5775                         ],
5776     },
5777
5778     'pbx_extension' => {
5779       'columns' => [
5780         'extensionnum',  'serial',     '',      '', '', '',
5781         'svcnum',           'int',     '',      '', '', '',
5782         'extension',    'varchar',     '', $char_d, '', '',
5783         'pin',          'varchar', 'NULL', $char_d, '', '',
5784         'sip_password', 'varchar', 'NULL', $char_d, '', '',
5785         'phone_name',   'varchar', 'NULL', $char_d, '', '',
5786       ],
5787       'primary_key'  => 'extensionnum',
5788       'unique'       => [ [ 'svcnum', 'extension' ] ],
5789       'index'        => [ [ 'svcnum' ] ],
5790       'foreign_keys' => [
5791                           { columns    => [ 'svcnum' ],
5792                             table      => 'svc_pbx',
5793                           },
5794                         ],
5795     },
5796
5797     'pbx_device' => {
5798       'columns' => [
5799         'devicenum', 'serial',     '', '', '', '',
5800         'devicepart',   'int',     '', '', '', '',
5801         'svcnum',       'int',     '', '', '', '', 
5802         'mac_addr', 'varchar', 'NULL', 12, '', '', 
5803       ],
5804       'primary_key'  => 'devicenum',
5805       'unique'       => [ [ 'mac_addr' ], ],
5806       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
5807       'foreign_keys' => [
5808                           { columns    => [ 'devicepart' ],
5809                             table      => 'part_device',
5810                           },
5811                           { columns    => [ 'svcnum' ],
5812                             table      => 'svc_pbx',
5813                           },
5814                         ],
5815     },
5816
5817     'extension_device' => {
5818       'columns' => [
5819         'extensiondevicenum', 'serial', '', '', '', '',
5820         'extensionnum',          'int', '', '', '', '',
5821         'devicenum',             'int', '', '', '', '',
5822       ],
5823       'primary_key'  => 'extensiondevicenum',
5824       'unique'       => [ [ 'extensionnum', 'devicenum' ] ],
5825       'index'        => [],#both?  which way do we need to query?
5826       'foreign_keys' => [
5827                           { columns  => [ 'extensionnum' ],
5828                             table    => 'pbx_extension',
5829                           },
5830                           { columns  => [ 'devicenum' ],
5831                             table    => 'pbx_device',
5832                           },
5833                         ],
5834     },
5835
5836     'svc_mailinglist' => { #svc_group?
5837       'columns' => [
5838         'svcnum',            'int',     '',            '', '', '', 
5839         'username',      'varchar',     '', $username_len, '', '',
5840         'domsvc',            'int',     '',            '', '', '', 
5841         'listnum',           'int',     '',            '', '', '',
5842         'reply_to',         'char', 'NULL',             1, '', '',#SetReplyTo
5843         'remove_from',      'char', 'NULL',             1, '', '',#RemoveAuthor
5844         'reject_auto',      'char', 'NULL',             1, '', '',#RejectAuto
5845         'remove_to_and_cc', 'char', 'NULL',             1, '', '',#RemoveToAndCc
5846       ],
5847       'primary_key'  => 'svcnum',
5848       'unique'       => [],
5849       'index'        => [ ['username'], ['domsvc'], ['listnum'] ],
5850       'foreign_keys' => [
5851                           { columns    => [ 'svcnum' ],
5852                             table      => 'cust_svc',
5853                           },
5854                           { columns    => [ 'domsvc' ],
5855                             table      => 'svc_domain', #'cust_svc',
5856                             references => [ 'svcnum' ],
5857                           },
5858                           { columns    => [ 'listnum' ],
5859                             table      => 'mailinglist',
5860                           },
5861                         ],
5862     },
5863
5864     'mailinglist' => {
5865       'columns' => [
5866         'listnum',   'serial', '',      '', '', '',
5867         'listname', 'varchar', '', $char_d, '', '',
5868       ],
5869       'primary_key' => 'listnum',
5870       'unique' => [],
5871       'index'  => [],
5872     },
5873
5874     'mailinglistmember' => {
5875       'columns' => [
5876         'membernum',        'serial',     '',   '', '', '',
5877         'listnum',             'int',     '',   '', '', '',
5878         'svcnum',              'int', 'NULL',   '', '', '', 
5879         'contactemailnum',     'int', 'NULL',   '', '', '', 
5880         'email',           'varchar', 'NULL',  255, '', '', 
5881       ],
5882       'primary_key'  => 'membernum',
5883       'unique'       => [],
5884       'index'        => [['listnum'],['svcnum'],['contactemailnum'],['email']],
5885       'foreign_keys' => [
5886                           { columns    => [ 'listnum' ],
5887                             table      => 'mailinglist',
5888                           },
5889                           { columns    => [ 'svcnum' ],
5890                             table      => 'svc_acct',
5891                           },
5892                           { columns    => [ 'contactemailnum' ],
5893                             table      => 'contact_email',
5894                           },
5895                         ],
5896     },
5897
5898     'bill_batch' => {
5899       'columns' => [
5900         'batchnum',         'serial',     '',  '', '', '',
5901         'agentnum',            'int', 'NULL',  '', '', '',
5902         'status',             'char', 'NULL', '1', '', '',
5903         'pdf',                'blob', 'NULL',  '', '', '',
5904       ],
5905       'primary_key'  => 'batchnum',
5906       'unique'       => [],
5907       'index'        => [ ['agentnum'] ],
5908       'foreign_keys' => [
5909                           { columns    => [ 'agentnum' ],
5910                             table      => 'agent',
5911                           },
5912                         ],
5913     },
5914
5915     'cust_bill_batch' => {
5916       'columns' => [
5917         'billbatchnum',     'serial',     '', '', '', '',
5918         'batchnum',            'int',     '', '', '', '',
5919         'invnum',              'int',     '', '', '', '',
5920       ],
5921       'primary_key'  => 'billbatchnum',
5922       'unique'       => [],
5923       'index'        => [ [ 'batchnum' ], [ 'invnum' ] ],
5924       'foreign_keys' => [
5925                           { columns    => [ 'batchnum' ],
5926                             table      => 'bill_batch',
5927                           },
5928                           { columns    => [ 'invnum' ],
5929                             table      => 'cust_bill',
5930                           },
5931                         ],
5932     },
5933
5934     'cust_bill_batch_option' => {
5935       'columns' => [
5936         'optionnum', 'serial', '', '', '', '', 
5937         'billbatchnum', 'int', '', '', '', '', 
5938         'optionname', 'varchar', '', $char_d, '', '', 
5939         'optionvalue', 'text', 'NULL', '', '', '', 
5940       ],
5941       'primary_key'  => 'optionnum',
5942       'unique'       => [],
5943       'index'        => [ [ 'billbatchnum' ], [ 'optionname' ] ],
5944       'foreign_keys' => [
5945                           { columns    => [ 'billbatchnum' ],
5946                             table      => 'cust_bill_batch',
5947                           },
5948                         ],
5949      },
5950
5951     'msg_template' => {
5952       'columns' => [
5953         'msgnum',     'serial',     '',      '', '', '',
5954         'msgname',   'varchar',     '', $char_d, '', '',
5955         'agentnum',      'int', 'NULL',      '', '', '',
5956         'subject',   'varchar', 'NULL',     512, '', '',
5957         'mime_type', 'varchar',     '', $char_d, '', '',
5958         'body',         'blob', 'NULL',      '', '', '',
5959         'disabled',     'char', 'NULL',       1, '', '', 
5960         'from_addr', 'varchar', 'NULL',     255, '', '',
5961         'bcc_addr',  'varchar', 'NULL',     255, '', '',
5962       ],
5963       'primary_key'  => 'msgnum',
5964       'unique'       => [ ],
5965       'index'        => [ ['agentnum'], ],
5966       'foreign_keys' => [
5967                           { columns    => [ 'agentnum' ],
5968                             table      => 'agent',
5969                           },
5970                         ],
5971     },
5972
5973     'template_content' => {
5974       'columns' => [
5975         'contentnum', 'serial',     '',      '', '', '',
5976         'msgnum',        'int',     '',      '', '', '',
5977         'locale',    'varchar', 'NULL',      16, '', '',
5978         'subject',   'varchar', 'NULL',     512, '', '',
5979         'body',         'text', 'NULL',      '', '', '',
5980       ],
5981       'primary_key'  => 'contentnum',
5982       'unique'       => [ ['msgnum', 'locale'] ],
5983       'index'        => [ ],
5984       'foreign_keys' => [
5985                           { columns    => [ 'msgnum' ],
5986                             table      => 'msg_template',
5987                           },
5988                         ],
5989     },
5990
5991     'cust_msg' => {
5992       'columns' => [
5993         'custmsgnum', 'serial',     '',     '', '', '',
5994         'custnum',       'int',     '',     '', '', '',
5995         'msgnum',        'int', 'NULL',     '', '', '',
5996         '_date',    @date_type,                 '', '',
5997         'env_from',  'varchar', 'NULL',    255, '', '',
5998         'env_to',    'varchar', 'NULL',    255, '', '',
5999         'header',       'blob', 'NULL',     '', '', '',
6000         'body',         'blob', 'NULL',     '', '', '',
6001         'error',     'varchar', 'NULL',    255, '', '',
6002         'status',    'varchar',     '',$char_d, '', '',
6003       ],
6004       'primary_key'  => 'custmsgnum',
6005       'unique'       => [ ],
6006       'index'        => [ ['custnum'], ],
6007       'foreign_keys' => [
6008                           { columns    => [ 'custnum' ],
6009                             table      => 'cust_main',
6010                           },
6011                           { columns    => [ 'msgnum' ],
6012                             table      => 'msg_template',
6013                           },
6014                         ],
6015     },
6016
6017     'svc_cert' => {
6018       'columns' => [
6019         'svcnum',                'int',     '',      '', '', '', 
6020         'recnum',                'int', 'NULL',      '', '', '',
6021         'privatekey',           'text', 'NULL',      '', '', '',
6022         'csr',                  'text', 'NULL',      '', '', '',
6023         'certificate',          'text', 'NULL',      '', '', '',
6024         'cacert',               'text', 'NULL',      '', '', '',
6025         'common_name',       'varchar', 'NULL', $char_d, '', '',
6026         'organization',      'varchar', 'NULL', $char_d, '', '',
6027         'organization_unit', 'varchar', 'NULL', $char_d, '', '',
6028         'city',              'varchar', 'NULL', $char_d, '', '',
6029         'state',             'varchar', 'NULL', $char_d, '', '',
6030         'country',              'char', 'NULL',       2, '', '',
6031         'cert_contact',      'varchar', 'NULL', $char_d, '', '',
6032       ],
6033       'primary_key'  => 'svcnum',
6034       'unique'       => [],
6035       'index'        => [], #recnum
6036       'foreign_keys' => [
6037                           { columns    => [ 'svcnum' ],
6038                             table      => 'cust_svc',
6039                           },
6040                           { columns    => [ 'recnum' ],
6041                             table      => 'domain_record',
6042                           },
6043                         ],
6044     },
6045
6046     'svc_port' => {
6047       'columns' => [
6048         'svcnum',                'int',     '',      '', '', '', 
6049         'serviceid', 'varchar', '', 64, '', '', #srvexport / reportfields
6050       ],
6051       'primary_key'  => 'svcnum',
6052       'unique'       => [],
6053       'index'        => [], #recnum
6054       'foreign_keys' => [
6055                           { columns    => [ 'svcnum' ],
6056                             table      => 'cust_svc',
6057                           },
6058                         ],
6059     },
6060
6061     'areacode'  => {
6062       'columns' => [
6063         'areanum',   'serial',        '',      '', '', '',
6064         'code',        'char',        '',       3, '', '', 
6065         'country',     'char',    'NULL',       2, '', '',
6066         'state',       'char',    'NULL',       2, '', '', 
6067         'description','varchar',  'NULL',     255, '', '',
6068       ], 
6069       'primary_key' => 'areanum',
6070       'unique' => [ [ 'areanum' ] ],
6071       'index'  => [],
6072     },
6073
6074     'upgrade_journal' => {
6075       'columns' => [
6076         'upgradenum', 'serial', '', '', '', '',
6077         '_date', 'int', '', '', '', '',
6078         'upgrade', 'varchar', '', $char_d, '', '',
6079         'status', 'varchar', '', $char_d, '', '',
6080         'statustext', 'varchar', 'NULL', $char_d, '', '',
6081       ],
6082       'primary_key' => 'upgradenum',
6083       'unique' => [],
6084       'index' => [ [ 'upgrade' ] ],
6085     },
6086
6087     'upload_target' => {
6088       'columns' => [
6089         'targetnum', 'serial', '', '', '', '',
6090         'agentnum', 'int', 'NULL', '', '', '',
6091         'protocol', 'varchar', '', 10, '', '',
6092         'hostname', 'varchar', '', $char_d, '', '',
6093         'port', 'int', 'NULL', '', '', '',
6094         'username', 'varchar', '', $char_d, '', '',
6095         'password', 'varchar', 'NULL', $char_d, '', '',
6096         'path', 'varchar', 'NULL', $char_d, '', '',
6097         'subject', 'varchar', 'NULL', '255', '', '',
6098         'handling', 'varchar', 'NULL', $char_d, '', '',
6099       ],
6100       'primary_key'   => 'targetnum',
6101       'unique'        => [ [ 'targetnum' ] ],
6102       'index'         => [],
6103       'foreign_keys' => [
6104                           { columns    => [ 'agentnum' ],
6105                             table      => 'agent',
6106                           },
6107                         ],
6108     },
6109
6110     'log' => {
6111       'columns' => [
6112         'lognum',     'serial', '', '', '', '',
6113         '_date',      'int', '', '', '', '',
6114         'agentnum',   'int', 'NULL', '', '', '',
6115         'tablename',  'varchar', 'NULL', $char_d, '', '',
6116         'tablenum',   'int',  'NULL', '', '', '', 
6117         'level',      'int',  '', '', '', '',
6118         'message',    'text', '', '', '', '',
6119       ],
6120       'primary_key'  => 'lognum',
6121       'unique'       => [],
6122       'index'        => [ ['_date'], ['level'] ],
6123       'foreign_keys' => [
6124                           { columns    => [ 'agentnum' ],
6125                             table      => 'agent',
6126                           },
6127                         ],
6128     },
6129
6130     'log_context' => {
6131       'columns' => [
6132         'logcontextnum', 'serial', '', '', '', '',
6133         'lognum', 'int', '', '', '', '',
6134         'context', 'varchar', '', 32, '', '',
6135       ],
6136       'primary_key'  => 'logcontextnum',
6137       'unique'       => [ [ 'lognum', 'context' ] ],
6138       'index'        => [],
6139       'foreign_keys' => [
6140                           { columns    => [ 'lognum' ],
6141                             table      => 'log',
6142                           },
6143                         ],
6144     },
6145
6146     'svc_alarm' => {
6147       'columns' => [
6148         'svcnum',          'int',      '',      '', '', '', 
6149         'alarmsystemnum',  'int',      '',      '', '', '',
6150         'alarmtypenum',    'int',      '',      '', '', '',
6151         'alarmstationnum', 'int',      '',      '', '', '',
6152         'acctnum',      'varchar',     '', $char_d, '', '',
6153         '_password',    'varchar',     '', $char_d, '', '',
6154         'location',     'varchar', 'NULL', $char_d, '', '',
6155         #installer (rep)
6156       ],
6157       'primary_key'  => 'svcnum',
6158       'unique'       => [],
6159       'index'        => [],
6160       'foreign_keys' => [
6161                           { columns    => [ 'svcnum' ],
6162                             table      => 'cust_svc',
6163                           },
6164                           { columns    => [ 'alarmsystemnum' ],
6165                             table      => 'alarm_system',
6166                           },
6167                           { columns    => [ 'alarmtypenum' ],
6168                             table      => 'alarm_type',
6169                           },
6170                           { columns    => [ 'alarmstationnum' ],
6171                             table      => 'alarm_station',
6172                           },
6173                         ],
6174     },
6175
6176     'alarm_system' => { #vendors
6177       'columns' => [
6178         'alarmsystemnum',  'serial',     '',      '', '', '',
6179         'agentnum',           'int', 'NULL',      '', '', '',
6180         'systemname',     'varchar',     '', $char_d, '', '',
6181         'disabled',          'char', 'NULL',       1, '', '', 
6182       ],
6183       'primary_key' => 'alarmsystemnum',
6184       'unique'      => [ ['agentnum', 'systemname'] ],
6185       'index'       => [ ['agentnum'], ['disabled'] ],
6186       'foreign_keys' => [
6187                           { columns    => [ 'agentnum' ],
6188                             table      => 'agent',
6189                           },
6190                         ],
6191     },
6192
6193     'alarm_type' => { #inputs and outputs
6194       'columns' => [
6195         'alarmtypenum', 'serial',     '',      '', '', '',
6196         'agentnum',        'int', 'NULL',      '', '', '',
6197         'inputs',          'int',     '', '', '', '',
6198         'outputs',         'int',     '', '', '', '',
6199         'disabled',       'char', 'NULL',       1, '', '', 
6200       ],
6201       'primary_key' => 'alarmtypenum',
6202       'unique'      => [ ['agentnum', 'inputs', 'outputs'] ],
6203       'index'       => [ ['agentnum'], ['disabled'] ],
6204       'foreign_keys' => [
6205                           { columns    => [ 'agentnum' ],
6206                             table      => 'agent',
6207                           },
6208                         ],
6209     },
6210
6211     'alarm_station' => { #central station (where the alarm reports to)
6212       'columns' => [
6213         'alarmstationnum', 'serial',     '',      '', '', '',
6214         'agentnum',           'int', 'NULL',      '', '', '',
6215         'stationname',    'varchar',     '', $char_d, '', '',
6216         'disabled',          'char', 'NULL',       1, '', '', 
6217       ],
6218       'primary_key' => 'alarmstationnum',
6219       'unique'      => [ ['agentnum', 'stationname'], ],
6220       'index'       => [ ['agentnum'], ['disabled'] ],
6221       'foreign_keys' => [
6222                           { columns    => [ 'agentnum' ],
6223                             table      => 'agent',
6224                           },
6225                         ],
6226     },
6227
6228     'svc_cable' => {
6229       'columns' => [
6230         'svcnum',        'int',     '',      '', '', '', 
6231         'providernum',   'int', 'NULL',      '', '', '',
6232         'ordernum',  'varchar', 'NULL', $char_d, '', '',
6233         'modelnum',      'int', 'NULL',      '', '', '',
6234         'serialnum', 'varchar', 'NULL', $char_d, '', '',
6235         'mac_addr',  'varchar', 'NULL',      12, '', '', 
6236       ],
6237       'primary_key'  => 'svcnum',
6238       'unique'       => [],
6239       'index'        => [],
6240       'foreign_keys' => [
6241                           { columns    => [ 'svcnum' ],
6242                             table      => 'cust_svc',
6243                           },
6244                           { columns    => [ 'providernum' ],
6245                             table      => 'cable_provider',
6246                           },
6247                           { columns    => [ 'modelnum' ],
6248                             table      => 'cable_model',
6249                           },
6250                         ],
6251     },
6252
6253     'cable_model' => {
6254       'columns' => [
6255         'modelnum',    'serial',     '',      '', '', '',
6256         'model_name', 'varchar',     '', $char_d, '', '',
6257         'disabled',      'char', 'NULL',       1, '', '', 
6258       ],
6259       'primary_key' => 'modelnum',
6260       'unique' => [ [ 'model_name' ], ],
6261       'index'  => [],
6262     },
6263
6264     'cable_provider' => {
6265       'columns' => [
6266         'providernum', 'serial',     '',      '', '', '',
6267         'provider',   'varchar',     '', $char_d, '', '',
6268         'disabled',      'char', 'NULL',       1, '', '', 
6269       ],
6270       'primary_key' => 'providernum',
6271       'unique' => [ [ 'provider' ], ],
6272       'index'  => [],
6273     },
6274
6275     'svc_conferencing' => {
6276       'columns' => [
6277         'svcnum',            'int',     '',      '', '', '',
6278         'conf_id',           'int', 'NULL',      '', '', '', #"system assigned"
6279         'conf_name',     'varchar',     '', $char_d, '', '',
6280         'conf_password', 'varchar',     '', $char_d, '', '',
6281         'access_code',   'varchar',     '',      16, '', '',
6282         'duration',          'int',     '',      '', '', '',
6283         'participants',      'int',     '',      '', '', '',
6284         'conftypenum',       'int',     '',      '', '', '',
6285         'confqualitynum',    'int',     '',      '', '', '',
6286         'opt_recording',    'char', 'NULL',       1, '', '',
6287         'opt_sip',          'char', 'NULL',       1, '', '',
6288         'opt_phone',        'char', 'NULL',       1, '', '',
6289       ],
6290       'primary_key' => 'svcnum',
6291       'unique' => [],
6292       'index'  => [],
6293       'foreign_keys' => [
6294                           { columns => [ 'svcnum' ],
6295                             table   => 'cust_svc',
6296                           },
6297                           { columns => [ 'conftypenum' ],
6298                             table   => 'conferencing_type',
6299                           },
6300                           { columns => [ 'confqualitynum' ],
6301                             table   => 'conferencing_quality',
6302                           },
6303                         ],
6304     },
6305
6306     'conferencing_type' => {
6307       'columns' => [
6308         'conftypenum',  'int',     '',      '', '', '',
6309         'typeid'      , 'int',     '',      '', '', '',
6310         'typename', 'varchar',     '', $char_d, '', '',
6311         'disabled',    'char', 'NULL',       1, '', '', 
6312       ],
6313       'primary_key' => 'conftypenum',
6314       'unique'      => [ [ 'typeid', 'disabled' ], [ 'typename', 'disabled' ] ],
6315       'index'       => [],
6316     },
6317
6318     'conferencing_quality' => {
6319       'columns' => [
6320         'confqualitynum',  'int',     '',      '', '', '',
6321         'qualityid'      , 'int',     '',      '', '', '',
6322         'qualityname', 'varchar',     '', $char_d, '', '',
6323         'disabled',       'char', 'NULL',       1, '', '', 
6324       ],
6325       'primary_key' => 'confqualitynum',
6326       'unique'      => [ [ 'qualityid', 'disabled' ], [ 'qualityname', 'disabled' ] ],
6327       'index'       => [],
6328     },
6329
6330     'svc_video' => {
6331       'columns' => [
6332         'svcnum',            'int', '', '', '', '',
6333         'smartcard_num', 'varchar', '', 16, '', '',
6334         'mac_addr',      'varchar', '', 12, '', '', 
6335         'duration',          'int', '', '', '', '',
6336       ],
6337       'primary_key' => 'svcnum',
6338       'unique' => [], # [ 'smartcard_num' ], [ 'mac_addr' ], ],
6339       'index'  => [],
6340       'foreign_keys' => [
6341                           { columns => [ 'svcnum' ],
6342                             table   => 'cust_svc',
6343                           },
6344                         ],
6345     },
6346
6347     'vend_main' => {
6348       'columns' => [
6349         'vendnum',   'serial',     '',      '', '', '',
6350         'vendname', 'varchar',     '', $char_d, '', '',
6351         'classnum',     'int',     '',      '', '', '',
6352         'disabled',    'char', 'NULL',       1, '', '', 
6353       ],
6354       'primary_key'  => 'vendnum',
6355       'unique'       => [ ['vendname', 'disabled'] ],
6356       'index'        => [],
6357       'foreign_keys' => [
6358                           { columns    => [ 'classnum' ],
6359                             table      => 'vend_class',
6360                           },
6361                         ],
6362     },
6363
6364     'vend_class' => {
6365       'columns' => [
6366         'classnum',     'serial',     '',      '', '', '', 
6367         'classname',   'varchar',     '', $char_d, '', '', 
6368         'disabled',       'char', 'NULL',       1, '', '', 
6369       ],
6370       'primary_key' => 'classnum',
6371       'unique'      => [],
6372       'index'       => [ ['disabled'] ],
6373     },
6374
6375     'vend_bill' => {
6376       'columns' => [
6377         'vendbillnum',    'serial',     '',      '', '', '', 
6378         'vendnum',           'int',     '',      '', '', '', 
6379         '_date',        @date_type,                  '', '', 
6380         'charged',     @money_type,                  '', '', 
6381       ],
6382       'primary_key'  => 'vendbillnum',
6383       'unique'       => [],
6384       'index'        => [ ['vendnum'], ['_date'], ],
6385       'foreign_keys' => [
6386                           { columns    => [ 'vendnum' ],
6387                             table      => 'vend_main',
6388                           },
6389                         ],
6390     },
6391
6392     'vend_pay' => {
6393       'columns' => [
6394         'vendpaynum',   'serial',    '',       '', '', '',
6395         'vendnum',         'int',    '',       '', '', '', 
6396         '_date',     @date_type,                   '', '', 
6397         'paid',      @money_type,                  '', '', 
6398       ],
6399       'primary_key'  => 'vendpaynum',
6400       'unique'       => [],
6401       'index'        => [ [ 'vendnum' ], [ '_date' ], ],
6402       'foreign_keys' => [
6403                           { columns    => [ 'vendnum' ],
6404                             table      => 'vend_main',
6405                           },
6406                         ],
6407     },
6408
6409     'vend_bill_pay' => {
6410       'columns' => [
6411         'vendbillpaynum', 'serial',     '',   '', '', '', 
6412         'vendbillnum',       'int',     '',   '', '', '', 
6413         'vendpaynum',        'int',     '',   '', '', '', 
6414         'amount',  @money_type, '', '', 
6415         #? '_date',   @date_type, '', '', 
6416       ],
6417       'primary_key'  => 'vendbillpaynum',
6418       'unique'       => [],
6419       'index'        => [ [ 'vendbillnum' ], [ 'vendpaynum' ] ],
6420       'foreign_keys' => [
6421                           { columns    => [ 'vendbillnum' ],
6422                             table      => 'vend_bill',
6423                           },
6424                           { columns    => [ 'vendpaynum' ],
6425                             table      => 'vend_pay',
6426                           },
6427                         ],
6428     },
6429
6430     %{ tables_hashref_torrus() },
6431
6432     # tables of ours for doing torrus virtual port combining
6433     'torrus_srvderive' => {
6434       'columns' => [
6435         'derivenum',     'serial',     '', '', '', '',
6436         'serviceid',    'varchar',     '', 64, '', '', #srvexport / reportfields
6437         'last_srv_date',   'date', 'NULL', '', '', '',
6438       ],
6439       'primary_key' => 'derivenum',
6440       'unique' => [ ['serviceid'] ],
6441       'index'  => [],
6442     },
6443
6444     'torrus_srvderive_component' => {
6445       'columns' => [
6446         'componentnum', 'serial', '', '', '', '',
6447         'derivenum',       'int', '', '', '', '',
6448         'serviceid',   'varchar', '', 64, '', '', #srvexport / reportfields
6449       ],
6450       'primary_key'  => 'componentnum',
6451       'unique'       => [ [ 'derivenum', 'serviceid' ], ],
6452       'index'        => [ [ 'derivenum', ], ],
6453       'foreign_keys' => [
6454                           { columns    => [ 'derivenum' ],
6455                             table      => 'torrus_srvderive',
6456                           },
6457                         ],
6458     },
6459
6460     'invoice_mode' => {
6461       'columns' => [
6462         'modenum',      'serial', '', '', '', '',
6463         'agentnum',        'int', 'NULL', '', '', '',
6464         'modename',    'varchar', '', 32, '', '',
6465       ],
6466       'primary_key' => 'modenum',
6467       'unique'      => [ ],
6468       'index'       => [ ],
6469       'foreign_keys' => [
6470                           { columns    => [ 'agentnum' ],
6471                             table      => 'agent',
6472                           },
6473                         ],
6474     },
6475
6476     'invoice_conf' => {
6477       'columns' => [
6478         'confnum',              'serial',   '', '', '', '',
6479         'modenum',              'int',      '', '', '', '',
6480         'locale',               'varchar',  'NULL', 16, '', '',
6481         'notice_name',          'varchar',  'NULL', 64, '', '',
6482         'subject',              'varchar',  'NULL', 64, '', '',
6483         'htmlnotes',            'text',     'NULL', '', '', '',
6484         'htmlfooter',           'text',     'NULL', '', '', '',
6485         'htmlsummary',          'text',     'NULL', '', '', '',
6486         'htmlreturnaddress',    'text',     'NULL', '', '', '',
6487         'latexnotes',           'text',     'NULL', '', '', '',
6488         'latexfooter',          'text',     'NULL', '', '', '',
6489         'latexsummary',         'text',     'NULL', '', '', '',
6490         'latexsmallfooter',     'text',     'NULL', '', '', '',
6491         'latexreturnaddress',   'text',     'NULL', '', '', '',
6492         'with_latexcoupon',     'char',     'NULL', '1', '', '',
6493         'lpr',                  'varchar',  'NULL', $char_d, '', '',
6494       ],
6495       'primary_key'  => 'confnum',
6496       'unique'       => [ [ 'modenum', 'locale' ] ],
6497       'index'        => [ ],
6498       'foreign_keys' => [
6499                           { columns    => [ 'modenum' ],
6500                             table      => 'invoice_mode',
6501                           },
6502                         ],
6503     },
6504
6505     # name type nullability length default local
6506
6507     #'new_table' => {
6508     #  'columns' => [
6509     #    'num', 'serial',       '', '', '', '',
6510     #  ],
6511     #  'primary_key' => 'num',
6512     #  'unique' => [],
6513     #  'index'  => [],
6514     #},
6515
6516   };
6517
6518 }
6519
6520 =back
6521
6522 =head1 BUGS
6523
6524 =head1 SEE ALSO
6525
6526 L<DBIx::DBSchema>
6527
6528 =cut
6529
6530 1;
6531