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