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