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