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