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