automatic package changes for supplemental packages, #37102
[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         'expire_months', 'int',     'NULL', '', '', '',
3202         'adjourn_months', 'int',    'NULL', '', '', '',
3203         'contract_end_months','int','NULL', '', '', '',
3204         'change_to_pkgpart', 'int', 'NULL', '', '', '',
3205       ],
3206       'primary_key'  => 'pkgpart',
3207       'unique'       => [],
3208       'index'        => [ [ 'promo_code' ], [ 'disabled' ], [ 'classnum' ],
3209                           [ 'agentnum' ], ['no_auto'], ['agent_pkgpartid'],
3210                         ],
3211       'foreign_keys' => [
3212                           { columns    => [ 'classnum' ],
3213                             table      => 'pkg_class',
3214                           },
3215                           { columns    => [ 'addon_classnum' ],
3216                             table      => 'pkg_class',
3217                             references => [ 'classnum' ],
3218                           },
3219                           { columns    => [ 'taxproductnum' ],
3220                             table      => 'part_pkg_taxproduct',
3221                           },
3222                           { columns    => [ 'agentnum' ],
3223                             table      => 'agent',
3224                           },
3225                           { columns    => [ 'successor' ],
3226                             table      => 'part_pkg',
3227                             references => [ 'pkgpart' ],
3228                           },
3229                           { columns    => [ 'family_pkgpart' ],
3230                             table      => 'part_pkg',
3231                             references => [ 'pkgpart' ],
3232                           },
3233                           { columns    => [ 'change_to_pkgpart' ],
3234                             table      => 'part_pkg',
3235                             references => [ 'pkgpart' ],
3236                           },
3237                         ],
3238     },
3239
3240     'part_pkg_msgcat' => {
3241       'columns' => [
3242         'pkgpartmsgnum',  'serial',     '',        '', '', '',
3243         'pkgpart',           'int',     '',        '', '', '',
3244         'locale',        'varchar',     '',        16, '', '',
3245         'pkg',           'varchar',     '',   $char_d, '', '', #longer/no limit?
3246         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
3247       ],
3248       'primary_key'  => 'pkgpartmsgnum',
3249       'unique'       => [ [ 'pkgpart', 'locale' ] ],
3250       'index'        => [],
3251       'foreign_keys' => [
3252                           { columns    => [ 'pkgpart' ],
3253                             table      => 'part_pkg',
3254                           },
3255                         ],
3256     },
3257
3258     'part_pkg_currency' => {
3259       'columns' => [
3260         'pkgcurrencynum', 'serial', '',      '', '', '',
3261         'pkgpart',           'int', '',      '', '', '',
3262         'currency',         'char', '',       3, '', '',
3263         'optionname',    'varchar', '', $char_d, '', '', 
3264         'optionvalue',      'text', '',      '', '', '', 
3265       ],
3266       'primary_key'  => 'pkgcurrencynum',
3267       'unique'       => [ [ 'pkgpart', 'currency', 'optionname' ] ],
3268       'index'        => [ ['pkgpart'] ],
3269       'foreign_keys' => [
3270                           { columns    => [ 'pkgpart' ],
3271                             table      => 'part_pkg',
3272                           },
3273                         ],
3274     },
3275
3276     'currency_exchange' => {
3277       'columns' => [
3278         'currencyratenum', 'serial', '',    '', '', '',
3279         'from_currency',     'char', '',     3, '', '',
3280         'to_currency',       'char', '',     3, '', '',
3281         'rate',           'decimal', '', '7,6', '', '',
3282       ],
3283       'primary_key' => 'currencyratenum',
3284       'unique'      => [ [ 'from_currency', 'to_currency' ] ],
3285       'index'       => [],
3286     },
3287
3288     'part_pkg_usageprice' => {
3289       'columns' => [
3290         'usagepricepart', 'serial',      '',      '', '', '',
3291         'pkgpart',           'int',      '',      '', '', '',
3292         'price',          @money_type,                '', '', 
3293         'currency',         'char',  'NULL',       3, '', '',
3294         'action',        'varchar',      '', $char_d, '', '',
3295         'target',        'varchar',      '', $char_d, '', '',
3296         'amount',        'varchar',      '', $char_d, '', '',
3297       ],
3298       'primary_key'  => 'usagepricepart',
3299       'unique'       => [ [ 'pkgpart', 'currency', 'target' ] ],
3300       'index'        => [ [ 'pkgpart' ] ],
3301       'foreign_keys' => [
3302                           { columns    => [ 'pkgpart' ],
3303                             table      => 'part_pkg',
3304                           },
3305                         ],
3306     },
3307
3308     'cust_pkg_usageprice' => {
3309       'columns' => [
3310         'usagepricenum', 'serial',      '',      '', '', '',
3311         'pkgnum',           'int',      '',      '', '', '',
3312         'usagepricepart',   'int',      '',      '', '', '',
3313         'quantity',         'int',      '',      '', '', '',
3314       ],
3315       'primary_key'  => 'usagepricenum',
3316       'unique'       => [ [ 'pkgnum', 'usagepricepart' ] ],
3317       'index'        => [ [ 'pkgnum' ] ],
3318       'foreign_keys' => [
3319                           { columns    => [ 'pkgnum' ],
3320                             table      => 'cust_pkg',
3321                           },
3322                           { columns    => [ 'usagepricepart' ],
3323                             table      => 'part_pkg_usageprice',
3324                           },
3325                         ],
3326     },
3327
3328     'part_fee' => {
3329       'columns' => [
3330         'feepart',       'serial',    '',   '', '', '',
3331         'itemdesc',      'varchar',   '',   $char_d,   '', '',
3332         'comment',       'varchar', 'NULL', 2*$char_d, '', '',
3333         'disabled',      'char',    'NULL',  1, '', '',
3334         'classnum',      'int',     'NULL', '', '', '',
3335         'taxclass',      'varchar', 'NULL', $char_d, '', '',
3336         'taxproductnum', 'int',     'NULL', '', '', '',
3337         'pay_weight',    'real',    'NULL', '', '', '',
3338         'credit_weight', 'real',    'NULL', '', '', '',
3339         'agentnum',      'int',     'NULL', '', '', '',
3340         'amount',   @money_type,                '', '', 
3341         'percent',     'decimal',    '', '7,4', '', '',
3342         'basis',         'varchar',  '',    16, '', '',
3343         'minimum',    @money_typen,             '', '',
3344         'maximum',    @money_typen,             '', '',
3345         'limit_credit',  'char',    'NULL',  1, '', '',
3346         'setuprecur',    'char',     '',     5, '', '',
3347         'taxable',       'char',    'NULL',  1, '', '',
3348       ],
3349       'primary_key'  => 'feepart',
3350       'unique'       => [],
3351       'index'        => [ [ 'disabled' ], [ 'classnum' ], [ 'agentnum' ]
3352                         ],
3353       'foreign_keys' => [
3354                           { columns    => [ 'classnum' ],
3355                             table      => 'pkg_class',
3356                           },
3357                           { columns    => [ 'taxproductnum' ],
3358                             table      => 'part_pkg_taxproduct',
3359                           },
3360                           { columns    => [ 'agentnum' ],
3361                             table      => 'agent',
3362                           },
3363                         ],
3364     },
3365
3366     'part_fee_msgcat' => {
3367       'columns' => [
3368         'feepartmsgnum',  'serial',     '',        '', '', '',
3369         'feepart',           'int',     '',        '', '', '',
3370         'locale',        'varchar',     '',        16, '', '',
3371         'itemdesc',      'varchar',     '',   $char_d, '', '', #longer/no limit?
3372         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
3373       ],
3374       'primary_key'  => 'feepartmsgnum',
3375       'unique'       => [ [ 'feepart', 'locale' ] ],
3376       'index'        => [],
3377       'foreign_keys' => [
3378                           { columns    => [ 'feepart' ],
3379                             table      => 'part_fee',
3380                           },
3381                         ],
3382     },
3383
3384     'part_fee_usage' => {
3385       'columns' => [
3386         'feepartusagenum','serial',     '',        '', '', '',
3387         'feepart',           'int',     '',        '', '', '',
3388         'classnum',          'int',     '',        '', '', '',
3389         'amount',   @money_type,                '', '',
3390         'percent',     'decimal',    '', '7,4', '', '',
3391       ],
3392       'primary_key'  => 'feepartusagenum',
3393       'unique'       => [ [ 'feepart', 'classnum' ] ],
3394       'index'        => [],
3395       'foreign_keys' => [
3396                           { columns    => [ 'feepart' ],
3397                             table      => 'part_fee',
3398                           },
3399                           { columns    => [ 'classnum' ],
3400                             table      => 'usage_class',
3401                           },
3402                         ],
3403     },
3404
3405     'part_pkg_link' => {
3406       'columns' => [
3407         'pkglinknum',  'serial',   '',      '', '', '',
3408         'src_pkgpart', 'int',      '',      '', '', '',
3409         'dst_pkgpart', 'int',      '',      '', '', '', 
3410         'link_type',   'varchar',  '', $char_d, '', '',
3411         'hidden',      'char', 'NULL',       1, '', '',
3412       ],
3413       'primary_key'  => 'pkglinknum',
3414       'unique'       => [ ['src_pkgpart','dst_pkgpart','link_type','hidden'] ],
3415       'index'        => [ [ 'src_pkgpart' ] ],
3416       'foreign_keys' => [
3417                           { columns    => [ 'src_pkgpart' ],
3418                             table      => 'part_pkg',
3419                             references => [ 'pkgpart' ]
3420                           },
3421                           { columns    => [ 'dst_pkgpart' ],
3422                             table      => 'part_pkg',
3423                             references => [ 'pkgpart' ]
3424                           },
3425                         ],
3426     },
3427     # XXX somewhat borked unique: we don't really want a hidden and unhidden
3428     # it turns out we'd prefer to use svc, bill, and invisibill (or something)
3429
3430     'part_pkg_discount' => {
3431       'columns' => [
3432         'pkgdiscountnum', 'serial',   '',      '', '', '',
3433         'pkgpart',        'int',      '',      '', '', '',
3434         'discountnum',    'int',      '',      '', '', '', 
3435       ],
3436       'primary_key'  => 'pkgdiscountnum',
3437       'unique'       => [ [ 'pkgpart', 'discountnum' ] ],
3438       'index'        => [],
3439       'foreign_keys' => [
3440                           { columns    => [ 'pkgpart' ],
3441                             table      => 'part_pkg',
3442                           },
3443                           { columns    => [ 'discountnum' ],
3444                             table      => 'discount',
3445                           },
3446                         ],
3447     },
3448
3449     'part_pkg_taxclass' => {
3450       'columns' => [
3451         'taxclassnum',  'serial', '',       '', '', '',
3452         'taxclass',     'varchar', '', $char_d, '', '', 
3453         'disabled', 'char',   'NULL',         1, '', '', 
3454       ],
3455       'primary_key' => 'taxclassnum',
3456       'unique'      => [ [ 'taxclass' ] ],
3457       'index'       => [ [ 'disabled' ] ],
3458     },
3459
3460     'part_pkg_taxproduct' => {
3461       'columns' => [
3462         'taxproductnum', 'serial',      '',        '', '', '',
3463         'data_vendor',   'varchar', 'NULL',   $char_d, '', '', 
3464         'taxproduct',    'varchar',     '',   $char_d, '', '', 
3465         'description',   'varchar',     '', 3*$char_d, '', '', 
3466         'note',             'text', 'NULL',        '', '', '',
3467       ],
3468       'primary_key' => 'taxproductnum',
3469       'unique'      => [ [ 'data_vendor', 'taxproduct' ] ],
3470       'index'       => [],
3471     },
3472
3473     'part_pkg_taxrate' => { 
3474       'columns' => [
3475         'pkgtaxratenum', 'serial',  '',     '',      '', '',
3476         'data_vendor',   'varchar', 'NULL', $char_d, '', '', # update source
3477         'geocode',       'varchar', 'NULL', $char_d, '', '', # cch provides 10
3478         'taxproductnum', 'int',  '',     '',       '', '',          
3479         'city',             'varchar', 'NULL', $char_d, '', '', # tax_location?
3480         'county',           'varchar', 'NULL', $char_d, '', '', 
3481         'state',            'varchar', 'NULL', $char_d, '', '', 
3482         'local',            'varchar', 'NULL', $char_d, '', '', 
3483         'country',          'char',    'NULL', 2,       '', '',
3484         'taxclassnumtaxed', 'int',     'NULL', '',      '', '', 
3485         'taxcattaxed',      'varchar', 'NULL', $char_d, '', '', 
3486         'taxclassnum',      'int',     'NULL', '',      '', '', 
3487         'effdate',          @date_type, '', '', 
3488         'taxable',          'char',    'NULL', 1,       '', '', 
3489       ],
3490       'primary_key'  => 'pkgtaxratenum',
3491       'unique'       => [],
3492       'index'        => [ [ 'data_vendor', 'geocode', 'taxproductnum' ] ],
3493       'foreign_keys' => [
3494                           { columns    => [ 'taxproductnum' ],
3495                             table      => 'part_pkg_taxproduct',
3496                           },
3497                           { columns    => [ 'taxclassnumtaxed' ],
3498                             table      => 'tax_class',
3499                             references => [ 'taxclassnum' ],
3500                           },
3501                           { columns    => [ 'taxclassnum' ],
3502                             table      => 'tax_class',
3503                           },
3504                         ],
3505     },
3506
3507     'part_pkg_taxoverride' => { 
3508       'columns' => [
3509         'taxoverridenum', 'serial', '', '', '', '',
3510         'pkgpart',           'int', '', '', '', '',
3511         'taxclassnum',       'int', '', '', '', '',
3512         'usage_class',    'varchar', 'NULL', $char_d, '', '', 
3513       ],
3514       'primary_key'  => 'taxoverridenum',
3515       'unique'       => [],
3516       'index'        => [ [ 'pkgpart' ], [ 'taxclassnum' ] ],
3517       'foreign_keys' => [
3518                           { columns    => [ 'pkgpart' ],
3519                             table      => 'part_pkg',
3520                           },
3521                           { columns    => [ 'taxclassnum' ],
3522                             table      => 'tax_class',
3523                           },
3524                         ],
3525     },
3526
3527 #    'part_title' => {
3528 #      'columns' => [
3529 #        'titlenum',   'int',    '',   '',
3530 #        'title',      'varchar',   '',   $char_d,
3531 #      ],
3532 #      'primary_key' => 'titlenum',
3533 #      'unique' => [ [] ],
3534 #      'index' => [ [] ],
3535 #    },
3536
3537     'pkg_svc' => {
3538       'columns' => [
3539         'pkgsvcnum',   'serial',    '', '', '', '', 
3540         'pkgpart',        'int',    '', '', '', '', 
3541         'svcpart',        'int',    '', '', '', '', 
3542         'quantity',       'int',    '', '', '', '', 
3543         'primary_svc',   'char', 'NULL', 1, '', '', 
3544         'hidden',        'char', 'NULL', 1, '', '',
3545         'bulk_skip',     'char', 'NULL', 1, '', '',
3546       ],
3547       'primary_key'  => 'pkgsvcnum',
3548       'unique'       => [ ['pkgpart', 'svcpart'] ],
3549       'index'        => [ ['pkgpart'], ['quantity'] ],
3550       'foreign_keys' => [
3551                           { columns    => [ 'pkgpart' ],
3552                             table      => 'part_pkg',
3553                           },
3554                           { columns    => [ 'svcpart' ],
3555                             table      => 'part_svc',
3556                           },
3557                         ],
3558     },
3559
3560     'part_referral' => {
3561       'columns' => [
3562         'refnum',   'serial',     '',        '', '', '', 
3563         'referral', 'varchar',    '',   $char_d, '', '', 
3564         'disabled', 'char',   'NULL',         1, '', '', 
3565         'agentnum', 'int',    'NULL',        '', '', '', 
3566       ],
3567       'primary_key'  => 'refnum',
3568       'unique'       => [],
3569       'index'        => [ ['disabled'], ['agentnum'], ],
3570       'foreign_keys' => [
3571                           { columns    => [ 'agentnum' ],
3572                             table      => 'agent',
3573                           },
3574                         ],
3575     },
3576
3577     'part_svc' => {
3578       'columns' => [
3579         'svcpart',             'serial',     '',        '', '', '', 
3580         'svc',                'varchar',     '',   $char_d, '', '', 
3581         'svcdb',              'varchar',     '',   $char_d, '', '', 
3582         'disabled',              'char', 'NULL',         1, '', '', 
3583         'preserve',              'char', 'NULL',         1, '', '',
3584         'selfservice_access', 'varchar', 'NULL',   $char_d, '', '',
3585         'classnum',               'int', 'NULL',        '', '', '',
3586         'restrict_edit_password','char', 'NULL',         1, '', '',
3587         'has_router',            'char', 'NULL',         1, '', '',
3588 ],
3589       'primary_key'  => 'svcpart',
3590       'unique'       => [],
3591       'index'        => [ [ 'disabled' ] ],
3592       'foreign_keys' => [
3593                           { columns    => [ 'classnum' ],
3594                             table      => 'part_svc_class',
3595                           },
3596                         ],
3597     },
3598
3599     'part_svc_column' => {
3600       'columns' => [
3601         'columnnum',   'serial',      '',      '', '', '', 
3602         'svcpart',     'int',         '',      '', '', '', 
3603         'columnname',  'varchar',     '',      64, '', '', 
3604         'columnlabel', 'varchar', 'NULL', $char_d, '', '',
3605         'columnvalue', 'varchar', 'NULL',     512, '', '', 
3606         'columnflag',  'char',    'NULL',       1, '', '', 
3607         'required',    'char',    'NULL',       1, '', '', 
3608       ],
3609       'primary_key'  => 'columnnum',
3610       'unique'       => [ [ 'svcpart', 'columnname' ] ],
3611       'index'        => [ [ 'svcpart' ] ],
3612       'foreign_keys' => [
3613                           { columns    => [ 'svcpart' ],
3614                             table      => 'part_svc',
3615                           },
3616                         ],
3617     },
3618
3619     'part_svc_class' => {
3620       'columns' => [
3621         'classnum',    'serial',   '',      '', '', '', 
3622         'classname',   'varchar',  '', $char_d, '', '', 
3623         'disabled',    'char', 'NULL',       1, '', '', 
3624       ],
3625       'primary_key' => 'classnum',
3626       'unique' => [],
3627       'index' => [ ['disabled'] ],
3628     },
3629
3630     'part_svc_link' => {
3631       'columns' => [
3632         'svclinknum',  'serial',   '',      '', '', '',
3633         #'linkname',    'varchar', 'NULL', $char_d, '', '',
3634         'agentnum',    'int',     'NULL', '', '', '', 
3635         'src_svcpart', 'int',      '',      '', '', '',
3636         'dst_svcpart', 'int',      '',      '', '', '', 
3637         'link_type',   'varchar',  '', $char_d, '', '',
3638         'disabled',    'char', 'NULL',   1, '', '', 
3639       ],
3640       'primary_key'  => 'svclinknum',
3641       'unique'       => [ ['agentnum','src_svcpart','dst_svcpart','link_type'] ],
3642       'index'        => [ [ 'src_svcpart' ], [ 'src_svcpart', 'link_type' ], [ 'disabled' ] ],
3643       'foreign_keys' => [
3644                           { columns    => [ 'src_svcpart' ],
3645                             table      => 'part_svc',
3646                             references => [ 'svcpart' ]
3647                           },
3648                           { columns    => [ 'dst_svcpart' ],
3649                             table      => 'part_svc',
3650                             references => [ 'svcpart' ]
3651                           },
3652                         ],
3653     },
3654
3655     #(this should be renamed to part_pop)
3656     'svc_acct_pop' => {
3657       'columns' => [
3658         'popnum',    'serial',    '',   '', '', '', 
3659         'city',      'varchar',   '',   $char_d, '', '', 
3660         'state',     'varchar',   '',   $char_d, '', '', 
3661         'ac',        'char',   '',   3, '', '', 
3662         'exch',      'char',   '',   3, '', '', 
3663         'loc',       'char',   'NULL',   4, '', '', #NULL for legacy purposes
3664       ],
3665       'primary_key' => 'popnum',
3666       'unique' => [],
3667       'index' => [ [ 'state' ] ],
3668     },
3669
3670     'part_pop_local' => {
3671       'columns' => [
3672         'localnum',  'serial',     '',     '', '', '', 
3673         'popnum',    'int',     '',     '', '', '', 
3674         'city',      'varchar', 'NULL', $char_d, '', '', 
3675         'state',     'char',    'NULL', 2, '', '', 
3676         'npa',       'char',    '',     3, '', '', 
3677         'nxx',       'char',    '',     3, '', '', 
3678       ],
3679       'primary_key'  => 'localnum',
3680       'unique'       => [],
3681       'index'        => [ [ 'npa', 'nxx' ], [ 'popnum' ] ],
3682       'foreign_keys' => [
3683                          { columns    => [ 'popnum' ],
3684                            table      => 'svc_acct_pop',
3685                          },
3686                        ],
3687     },
3688
3689     'qual' => {
3690       'columns' => [
3691         'qualnum',  'serial',     '',     '', '', '', 
3692         'custnum',    'int',     'NULL',     '', '', '',
3693         'prospectnum',    'int',     'NULL',     '', '', '',
3694         'locationnum',    'int',     'NULL',     '', '', '',
3695         'phonenum',     'varchar', 'NULL',       24, '', '',
3696         'exportnum',      'int', 'NULL', '', '', '', 
3697         'vendor_qual_id',      'varchar', 'NULL', $char_d, '', '', 
3698         'status',      'char', '', 1, '', '', 
3699       ],
3700       'primary_key'  => 'qualnum',
3701       'unique'       => [],
3702       'index'        => [ ['locationnum'], ['custnum'], ['prospectnum'],
3703                           ['phonenum'], ['vendor_qual_id'],
3704                         ],
3705       'foreign_keys' => [
3706                           { columns    => [ 'custnum' ],
3707                             table      => 'cust_main',
3708                           },
3709                           { columns    => [ 'prospectnum' ],
3710                             table      => 'prospect_main',
3711                           },
3712                           { columns    => [ 'locationnum' ],
3713                             table      => 'cust_location',
3714                           },
3715                           { columns    => [ 'exportnum' ],
3716                             table      => 'part_export',
3717                           },
3718                         ],
3719     },
3720
3721     'qual_option' => {
3722       'columns' => [
3723         'optionnum', 'serial', '', '', '', '', 
3724         'qualnum',  'int',     '',     '', '', '', 
3725         'optionname', 'varchar', '', $char_d, '', '', 
3726         'optionvalue', 'text', 'NULL', '', '', '', 
3727       ],
3728       'primary_key'  => 'optionnum',
3729       'unique'       => [],
3730       'index'        => [],
3731       'foreign_keys' => [
3732                           { columns    => [ 'qualnum' ],
3733                             table      => 'qual',
3734                           },
3735                         ],
3736     },
3737
3738     'svc_acct' => {
3739       'columns' => [
3740         'svcnum',    'int',    '',   '', '', '', 
3741         'username',  'varchar',   '',   $username_len, '', '',
3742         '_password', 'varchar',   'NULL',  512, '', '',
3743         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
3744         'sec_phrase', 'varchar',  'NULL',   $char_d, '', '', 
3745         'popnum',    'int',    'NULL',   '', '', '', 
3746         'sectornum', 'int', 'NULL',      '', '', '',
3747         'uid',       'int', 'NULL',   '', '', '', 
3748         'gid',       'int', 'NULL',   '', '', '', 
3749         'finger',    'varchar',   'NULL',   2*$char_d, '', '', 
3750         'dir',       'varchar',   'NULL',   $char_d, '', '', 
3751         'shell',     'varchar',   'NULL',   $char_d, '', '', 
3752         'quota',     'varchar',   'NULL',   $char_d, '', '', 
3753         'slipip',    'varchar',   'NULL',   15, '', '', #four TINYINTs, bah.
3754         # IP address mgmt
3755         'routernum', 'int', 'NULL',      '', '', '',
3756         'blocknum',  'int', 'NULL',      '', '', '', 
3757         'seconds',   'int', 'NULL',   '', '', '', #uhhhh
3758         'seconds_threshold',   'int', 'NULL',   '', '', '',
3759         'upbytes',   'bigint', 'NULL',   '', '', '', 
3760         'upbytes_threshold',   'bigint', 'NULL',   '', '', '',
3761         'downbytes', 'bigint', 'NULL',   '', '', '',
3762         'downbytes_threshold',   'bigint', 'NULL',   '', '', '',
3763         'totalbytes','bigint', 'NULL',   '', '', '',
3764         'totalbytes_threshold',   'bigint', 'NULL',   '', '', '',
3765         'domsvc',    'int',     '', '', '', '', 
3766         'pbxsvc',    'int', 'NULL', '', '', '',
3767         'last_login',  @date_type, '', '', 
3768         'last_logout', @date_type, '', '', 
3769         #cardfortress field(s)
3770         'cf_privatekey',      'text', 'NULL',      '', '', '',
3771         #communigate pro fields (quota = MaxAccountSize)
3772         'cgp_aliases',     'varchar', 'NULL',     255, '', '',
3773         #settings
3774         'cgp_type',        'varchar', 'NULL', $char_d, '', '', #AccountType
3775         'file_quota',      'varchar', 'NULL', $char_d, '', '', #MaxWebSize
3776         'file_maxnum',     'varchar', 'NULL', $char_d, '', '', #MaxWebFiles
3777         'file_maxsize',    'varchar', 'NULL', $char_d, '', '', #MaxFileSize
3778         'cgp_accessmodes', 'varchar', 'NULL',     255, '', '', #AccessModes
3779         'password_selfchange','char', 'NULL',       1, '', '', #PWDAllowed
3780         'password_recover',   'char', 'NULL',       1, 'Y','', #PasswordRecovery
3781         'cgp_rulesallowed','varchar', 'NULL', $char_d, '', '', #RulesAllowed
3782         'cgp_rpopallowed',    'char', 'NULL',       1, '', '', #RPOPAllowed
3783         'cgp_mailtoall',      'char', 'NULL',       1, '', '', #MailToAll
3784         'cgp_addmailtrailer', 'char', 'NULL',       1, '', '', #AddMailTrailer
3785         'cgp_archiveafter',    'int', 'NULL',      '', '', '', #ArchiveMessagesAfter
3786         #XXX mailing lists
3787         #preferences
3788         'cgp_deletemode',     'varchar', 'NULL', $char_d, '', '',#DeleteMode
3789         'cgp_emptytrash',     'varchar', 'NULL', $char_d, '', '',#EmptyTrash
3790         'cgp_language',       'varchar', 'NULL', $char_d, '', '',#Language
3791         'cgp_timezone',       'varchar', 'NULL', $char_d, '', '',#TimeZone
3792         'cgp_skinname',       'varchar', 'NULL', $char_d, '', '',#SkinName
3793         'cgp_prontoskinname', 'varchar', 'NULL', $char_d, '', '',#ProntoSkinName
3794         'cgp_sendmdnmode',    'varchar', 'NULL', $char_d, '', '',#SendMDNMode
3795         #mail
3796         #XXX RPOP settings
3797         #
3798       ],
3799       'primary_key'  => 'svcnum',
3800       #'unique'       => [ [ 'username', 'domsvc' ] ],
3801       'unique'       => [],
3802       'index'        => [ ['username'], ['domsvc'], ['pbxsvc'] ],
3803       'foreign_keys' => [
3804                           { columns    => [ 'svcnum' ],
3805                             table      => 'cust_svc',
3806                           },
3807                           { columns    => [ 'popnum' ],
3808                             table      => 'svc_acct_pop',
3809                           },
3810                           { columns    => [ 'sectornum' ],
3811                             table      => 'tower_sector',
3812                           },
3813                           { columns    => [ 'routernum' ],
3814                             table      => 'router',
3815                           },
3816                           { columns    => [ 'blocknum' ],
3817                             table      => 'addr_block',
3818                           },
3819                           { columns    => [ 'domsvc' ],
3820                             table      => 'svc_domain', #'cust_svc',
3821                             references => [ 'svcnum' ],
3822                           },
3823                           { columns    => [ 'pbxsvc' ],
3824                             table      => 'svc_pbx', #'cust_svc',
3825                             references => [ 'svcnum' ],
3826                           },
3827                         ],
3828     },
3829
3830     'acct_rt_transaction' => {
3831       'columns' => [
3832         'svcrtid',   'int',    '',   '', '', '', #why am i not a serial
3833         'svcnum',    'int',    '',   '', '', '', 
3834         'transaction_id',       'int', '',   '', '', '', 
3835         '_date',   @date_type, '', '',
3836         'seconds',   'int', '',   '', '', '', #uhhhh
3837         'support',   'int', '',   '', '', '',
3838       ],
3839       'primary_key'  => 'svcrtid',
3840       'unique'       => [],
3841       'index'        => [ ['svcnum', 'transaction_id'] ],
3842       'foreign_keys' => [
3843                           { columns    => [ 'svcnum' ],
3844                             table      => 'svc_acct', #'cust_svc',
3845                           },
3846                           # 1. RT tables aren't part of our data structure, so
3847                           #     we can't make sure Queue is created already
3848                           # 2. This is our internal hack for time tracking, not
3849                           #     a user-facing feature
3850                           #{ columns    => [ 'transaction_id' ],
3851                           #  table      => 'Transaction',
3852                           #  references => [ 'id' ],
3853                           #},
3854                         ],
3855     },
3856
3857     #'svc_charge' => {
3858     #  'columns' => [
3859     #    'svcnum',    'int',    '',   '',
3860     #    'amount',    @money_type,
3861     #  ],
3862     #  'primary_key' => 'svcnum',
3863     #  'unique' => [ [] ],
3864     #  'index' => [ [] ],
3865     #},
3866
3867     'svc_domain' => {
3868       'columns' => [
3869         'svcnum',           'int',    '',        '', '', '',
3870         'domain',       'varchar',    '',   $char_d, '', '',
3871         'suffix',       'varchar', 'NULL',  $char_d, '', '',
3872         'catchall',         'int', 'NULL',       '', '', '',
3873         'parent_svcnum',    'int', 'NULL',       '', '', '',
3874         'quota',        'varchar', 'NULL',  $char_d, '', '', 
3875
3876         #registration info
3877         'registrarnum',     'int', 'NULL',       '', '', '',
3878         'registrarkey', 'varchar', 'NULL',      512, '', '',
3879         'setup_date',      @date_type, '', '',
3880         'renewal_interval', 'int', 'NULL',       '', '', '',
3881         'expiration_date', @date_type, '', '',
3882
3883         #some weird shit australia-specific shit?  yuck.. seems totally unused
3884         'au_registrant_name',       'varchar', 'NULL',  $char_d, '', '',
3885         'au_eligibility_type',      'varchar', 'NULL',  $char_d, '', '',
3886
3887         #communigate pro fields (quota = MaxAccountSize)
3888         'max_accounts',     'int', 'NULL',       '', '', '',
3889         'trailer',         'text', 'NULL',       '', '', '',
3890         'cgp_aliases',  'varchar', 'NULL',      255, '', '',
3891         'cgp_accessmodes','varchar','NULL',     255, '', '', #DomainAccessModes
3892         'cgp_certificatetype','varchar','NULL', $char_d, '', '',
3893
3894         #(account default) settings
3895         'acct_def_password_selfchange',   'char', 'NULL',       1,  '', '', 
3896         'acct_def_password_recover',      'char', 'NULL',       1, 'Y', '', 
3897         'acct_def_cgp_accessmodes',    'varchar', 'NULL',     255,  '', '',
3898         'acct_def_quota',              'varchar', 'NULL', $char_d,  '', '',
3899         'acct_def_file_quota',         'varchar', 'NULL', $char_d,  '', '',
3900         'acct_def_file_maxnum',        'varchar', 'NULL', $char_d,  '', '',
3901         'acct_def_file_maxsize',       'varchar', 'NULL', $char_d,  '', '',
3902         'acct_def_cgp_rulesallowed',   'varchar', 'NULL', $char_d,  '', '',
3903         'acct_def_cgp_rpopallowed',       'char', 'NULL',       1,  '', '', 
3904         'acct_def_cgp_mailtoall',         'char', 'NULL',       1,  '', '', 
3905         'acct_def_cgp_addmailtrailer',    'char', 'NULL',       1,  '', '', 
3906         'acct_def_cgp_archiveafter',       'int', 'NULL',      '',  '', '',
3907
3908         #(account default) preferences
3909         'acct_def_cgp_deletemode',     'varchar', 'NULL', $char_d,  '', '',
3910         'acct_def_cgp_emptytrash',     'varchar', 'NULL', $char_d,  '', '',
3911         'acct_def_cgp_language',       'varchar', 'NULL', $char_d,  '', '',
3912         'acct_def_cgp_timezone',       'varchar', 'NULL', $char_d,  '', '',
3913         'acct_def_cgp_skinname',       'varchar', 'NULL', $char_d,  '', '',
3914         'acct_def_cgp_prontoskinname', 'varchar', 'NULL', $char_d,  '', '',
3915         'acct_def_cgp_sendmdnmode',    'varchar', 'NULL', $char_d,  '', '',
3916       ],
3917       'primary_key'  => 'svcnum',
3918       'unique'       => [],
3919       'index'        => [ ['domain'] ],
3920       'foreign_keys' => [
3921                           { columns    => [ 'svcnum' ],
3922                             table      => 'cust_svc',
3923                           },
3924                           { columns    => [ 'catchall' ],
3925                             table      => 'svc_acct',
3926                             references => [ 'svcnum' ],
3927                           },
3928                           { columns    => [ 'parent_svcnum' ],
3929                             table      => 'cust_svc',
3930                             references => [ 'svcnum' ],
3931                           },
3932                           { columns    => [ 'registrarnum' ],
3933                             table      => 'registrar',
3934                           },
3935                         ],
3936     },
3937
3938     'svc_dsl' => {
3939       'columns' => [
3940         'svcnum',                    'int',    '',        '', '', '',
3941         'pushed',                    'int', 'NULL',       '', '', '',
3942         'desired_due_date',          'int', 'NULL',       '', '', '',
3943         'due_date',                  'int', 'NULL',       '', '', '',
3944         'vendor_order_id',       'varchar', 'NULL', $char_d,  '', '',
3945         'vendor_qual_id',        'varchar', 'NULL', $char_d,  '', '',
3946         'vendor_order_type',     'varchar', 'NULL', $char_d,  '', '',
3947         'vendor_order_status',   'varchar', 'NULL', $char_d,  '', '',
3948         'first',                 'varchar', 'NULL', $char_d,  '', '',
3949         'last',                  'varchar', 'NULL', $char_d,  '', '',
3950         'company',               'varchar', 'NULL', $char_d,  '', '',
3951         'phonenum',              'varchar', 'NULL',      24, '', '',
3952         'gateway_access_number', 'varchar', 'NULL',      24, '', '',
3953         'loop_type',                'char', 'NULL',       1, '', '', 
3954         'local_voice_provider',  'varchar', 'NULL', $char_d, '', '',
3955         'circuitnum',            'varchar', 'NULL', $char_d, '', '',
3956         'rate_band',             'varchar', 'NULL', $char_d, '', '',
3957         'vpi',                       'int', 'NULL',      '', '', '',
3958         'vci',                       'int', 'NULL',      '', '', '',
3959         'isp_chg',                  'char', 'NULL',       1, '', '', 
3960         'isp_prev',              'varchar', 'NULL', $char_d, '', '',
3961         'username',              'varchar', 'NULL', $char_d, '', '',
3962         'password',              'varchar', 'NULL', $char_d, '', '',
3963         'staticips',                'text', 'NULL',      '', '', '',
3964         'monitored',                'char', 'NULL',       1, '', '', 
3965         'last_pull',                 'int', 'NULL',      '', '', '',
3966       ],
3967       'primary_key'  => 'svcnum',
3968       'unique'       => [ ],
3969       'index'        => [ ['phonenum'], ['vendor_order_id'] ],
3970       'foreign_keys' => [
3971                           { columns    => [ 'svcnum' ],
3972                             table      => 'cust_svc',
3973                           },
3974                         ],
3975     },
3976
3977     'dsl_device' => {
3978       'columns' => [
3979         'devicenum', 'serial',     '', '', '', '',
3980         #part_device?  or our own part_dsl_device?
3981         #'devicepart',   'int',     '', '', '', '',
3982         'svcnum',       'int',     '', '', '', '', 
3983         'mac_addr', 'varchar',     '', 12, '', '', 
3984       ],
3985       'primary_key'  => 'devicenum',
3986       'unique'       => [ [ 'mac_addr' ], ],
3987       'index'        => [ [ 'svcnum' ], ], # [ 'devicepart' ] ],
3988       'foreign_keys' => [
3989                           { columns    => [ 'svcnum' ],
3990                             table      => 'svc_dsl',
3991                           },
3992                         ],
3993     },
3994
3995     'dsl_note' => {
3996       'columns' => [
3997         'notenum',           'serial',    '',        '', '', '',
3998         'svcnum',     'int', '',       '', '', '',
3999         'author',     'varchar', 'NULL', $char_d,  '', '',
4000         'priority',   'char', 'NULL',       1,  '', '', 
4001         '_date',     'int', 'NULL',       '', '', '',
4002         'note',     'text', '',       '', '', '',
4003       ],
4004       'primary_key'  => 'notenum',
4005       'unique'       => [],
4006       'index'        => [ ['svcnum'] ],
4007       'foreign_keys' => [
4008                           { columns    => [ 'svcnum' ],
4009                             table      => 'svc_dsl',
4010                           },
4011                         ],
4012     },
4013
4014     'svc_dish' => {
4015       'columns' => [
4016         'svcnum',   'int',     '',     '', '', '',
4017         'acctnum',  'varchar', '',     16, '', '',
4018         'installdate', @date_type,         '', '', 
4019         'note',     'text',    'NULL', '', '', '',
4020       ],
4021       'primary_key'  => 'svcnum',
4022       'unique'       => [],
4023       'index'        => [],
4024       'foreign_keys' => [
4025                           { columns    => [ 'svcnum' ],
4026                             table      => 'cust_svc',
4027                           },
4028                         ],
4029     },
4030
4031     'svc_hardware' => {
4032       'columns' => [
4033         'svcnum',   'int',     '',          '', '', '',
4034         'typenum',  'int',     '',          '', '', '',
4035         'serial',   'varchar', 'NULL', $char_d, '', '',
4036         'ip_addr',  'varchar', 'NULL',      40, '', '',
4037         'hw_addr',  'varchar', 'NULL',      12, '', '',
4038         'smartcard','varchar', 'NULL',      30, '', '',
4039         'statusnum','int',     'NULL',      '', '', '',
4040         'note',     'text',    'NULL',      '', '', '',
4041       ],
4042       'primary_key'  => 'svcnum',
4043       'unique'       => [],
4044       'index'        => [],
4045       'foreign_keys' => [
4046                           { columns    => [ 'svcnum' ],
4047                             table      => 'cust_svc',
4048                           },
4049                           { columns    => [ 'typenum' ],
4050                             table      => 'hardware_type',
4051                           },
4052                           { columns    => [ 'statusnum' ],
4053                             table      => 'hardware_status',
4054                           },
4055                         ],
4056     },
4057
4058     'hardware_class' => {
4059       'columns' => [
4060         'classnum',   'serial', '',      '', '', '',
4061         'classname', 'varchar', '', $char_d, '', '',
4062       ],
4063       'primary_key' => 'classnum',
4064       'unique' => [],
4065       'index'  => [],
4066     },
4067
4068     'hardware_type' => {
4069       'columns' => [
4070         'typenum',  'serial',     '',      '', '', '',
4071         'classnum',    'int',     '',      '', '', '',
4072         'model',   'varchar',     '', $char_d, '', '',
4073         'revision','varchar', 'NULL', $char_d, '', '',
4074       ],
4075       'primary_key'  => 'typenum',
4076       'unique'       => [ [ 'classnum', 'model', 'revision' ] ],
4077       'index'        => [],
4078       'foreign_keys' => [
4079                           { columns    => [ 'classnum' ],
4080                             table      => 'hardware_class',
4081                           },
4082                         ],
4083     },
4084
4085     'hardware_status' => {
4086       'columns' => [
4087         'statusnum', 'serial', '',      '', '', '',
4088         'label'    ,'varchar', '', $char_d, '', '',
4089         'disabled',    'char', 'NULL',   1, '', '', 
4090       ],
4091       'primary_key' => 'statusnum',
4092       'unique' => [],
4093       'index'  => [],
4094     },
4095
4096     'domain_record' => {
4097       'columns' => [
4098         'recnum',    'serial',     '',  '', '', '', 
4099         'svcnum',    'int',     '',  '', '', '', 
4100         'reczone',   'varchar', '',  255, '', '', 
4101         'recaf',     'char',    '',  2, '', '', 
4102         'rectype',   'varchar',    '',  5, '', '', 
4103         'recdata',   'varchar', '',  255, '', '', 
4104         'ttl',       'int',     'NULL', '', '', '',
4105       ],
4106       'primary_key'  => 'recnum',
4107       'unique'       => [],
4108       'index'        => [ ['svcnum'] ],
4109       'foreign_keys' => [
4110                           { columns    => [ 'svcnum' ],
4111                             table      => 'svc_domain',
4112                           },
4113                         ],
4114     },
4115
4116     'registrar' => {
4117       'columns' => [
4118         'registrarnum',   'serial', '',      '', '', '',
4119         'registrarname', 'varchar', '', $char_d, '', '',
4120       ],
4121       'primary_key' => 'registrarnum',
4122       'unique'      => [],
4123       'index'       => [],
4124     },
4125
4126     'cgp_rule' => {
4127       'columns' => [
4128         'rulenum',  'serial',     '',      '', '', '',
4129         'name',    'varchar',     '', $char_d, '', '',
4130         'comment', 'varchar', 'NULL', $char_d, '', '',
4131         'svcnum',      'int',     '',      '', '', '',
4132         'priority',    'int',     '',      '', '', '',
4133       ],
4134       'primary_key' => 'rulenum',
4135       'unique'      => [ [ 'svcnum', 'name' ] ],
4136       'index'       => [ [ 'svcnum' ] ],
4137       'foreign_keys' => [
4138                           { columns    => [ 'svcnum' ],
4139                             table      => 'cust_svc', #svc_acct / svc_domain
4140                           },
4141                         ],
4142     },
4143
4144     'cgp_rule_condition' => {
4145       'columns' => [
4146         'ruleconditionnum',  'serial',     '',      '', '', '',
4147         'conditionname',    'varchar',     '', $char_d, '', '',
4148         'op',               'varchar', 'NULL', $char_d, '', '',
4149         'params',           'varchar', 'NULL',     255, '', '',
4150         'rulenum',              'int',     '',      '', '', '',
4151       ],
4152       'primary_key'  => 'ruleconditionnum',
4153       'unique'       => [],
4154       'index'        => [ [ 'rulenum' ] ],
4155       'foreign_keys' => [
4156                           { columns    => [ 'rulenum' ],
4157                             table      => 'cgp_rule',
4158                           },
4159                         ],
4160     },
4161
4162     'cgp_rule_action' => {
4163        'columns' => [
4164         'ruleactionnum',  'serial',     '',      '', '', '',
4165         'action',        'varchar',     '', $char_d, '', '',
4166         'params',        'varchar', 'NULL',     255, '', '',
4167         'rulenum',           'int',     '',      '', '', '',
4168       ],
4169       'primary_key'  => 'ruleactionnum',
4170       'unique'       => [],
4171       'index'        => [ [ 'rulenum' ] ],
4172       'foreign_keys' => [
4173                           { columns    => [ 'rulenum' ],
4174                             table      => 'cgp_rule',
4175                           },
4176                         ],
4177    },
4178
4179     'svc_forward' => {
4180       'columns' => [
4181         'svcnum',   'int',            '',   '', '', '', 
4182         'srcsvc',   'int',        'NULL',   '', '', '', 
4183         'src',      'varchar',    'NULL',  255, '', '', 
4184         'dstsvc',   'int',        'NULL',   '', '', '', 
4185         'dst',      'varchar',    'NULL',  255, '', '', 
4186       ],
4187       'primary_key'  => 'svcnum',
4188       'unique'       => [],
4189       'index'        => [ ['srcsvc'], ['dstsvc'] ],
4190       'foreign_keys' => [
4191                           { columns    => [ 'svcnum' ],
4192                             table      => 'cust_svc',
4193                           },
4194                           { columns    => [ 'srcsvc' ],
4195                             table      => 'svc_acct',
4196                             references => [ 'svcnum' ]
4197                           },
4198                           { columns    => [ 'dstsvc' ],
4199                             table      => 'svc_acct',
4200                             references => [ 'svcnum' ]
4201                           },
4202                         ],
4203     },
4204
4205     'svc_www' => {
4206       'columns' => [
4207         'svcnum',   'int',      '',  '', '', '', 
4208         'recnum',   'int',      '',  '', '', '', 
4209         'usersvc',  'int',  'NULL',  '', '', '', 
4210         'config',   'text', 'NULL',  '', '', '', 
4211       ],
4212       'primary_key' => 'svcnum',
4213       'unique'      => [],
4214       'index'       => [],
4215       'foreign_keys' => [
4216                           { columns    => [ 'svcnum' ],
4217                             table      => 'cust_svc',
4218                           },
4219                           { columns    => [ 'recnum' ],
4220                             table      => 'domain_record',
4221                           },
4222                           { columns    => [ 'usersvc' ],
4223                             table      => 'svc_acct',
4224                             references => [ 'svcnum' ]
4225                           },
4226                         ],
4227     },
4228
4229     #'svc_wo' => {
4230     #  'columns' => [
4231     #    'svcnum',    'int',    '',   '',
4232     #    'svcnum',    'int',    '',   '',
4233     #    'svcnum',    'int',    '',   '',
4234     #    'worker',    'varchar',   '',   $char_d,
4235     #    '_date',     @date_type,
4236     #  ],
4237     #  'primary_key' => 'svcnum',
4238     #  'unique' => [ [] ],
4239     #  'index' => [ [] ],
4240     #},
4241
4242     'prepay_credit' => {
4243       'columns' => [
4244         'prepaynum',   'serial',     '',   '', '', '', 
4245         'identifier',  'varchar', '', $char_d, '', '', 
4246         'amount',      @money_type, '', '', 
4247         'seconds',     'int',     'NULL', '', '', '', 
4248         'upbytes',     'bigint',     'NULL', '', '', '', 
4249         'downbytes',   'bigint',     'NULL', '', '', '', 
4250         'totalbytes',  'bigint',     'NULL', '', '', '', 
4251         'agentnum',    'int',     'NULL', '', '', '', 
4252       ],
4253       'primary_key'  => 'prepaynum',
4254       'unique'       => [ ['identifier'] ],
4255       'index'        => [ ['agentnum'] ],
4256       'foreign_keys' => [
4257                           { columns    => [ 'agentnum' ],
4258                             table      => 'agent',
4259                           },
4260                         ],
4261     },
4262
4263     'port' => {
4264       'columns' => [
4265         'portnum',  'serial',     '',   '', '', '', 
4266         'ip',       'varchar', 'NULL', 15, '', '', 
4267         'nasport',  'int',     'NULL', '', '', '', 
4268         'nasnum',   'int',     '',   '', '', '', 
4269       ],
4270       'primary_key'  => 'portnum',
4271       'unique'       => [],
4272       'index'        => [],
4273       'foreign_keys' => [
4274                           { columns    => [ 'nasnum' ],
4275                             table      => 'nas',
4276                           },
4277                         ],
4278     },
4279
4280     'nas' => {
4281       'columns' => [
4282         'nasnum',       'serial',     '',  '',              '', '', 
4283         'nasname',     'varchar',     '', 128,              '', '',
4284         'shortname',   'varchar', 'NULL',  32,              '', '',
4285         'type',        'varchar',     '',  30,         'other', '',
4286         'ports',           'int', 'NULL',  '',              '', '',
4287         'secret',      'varchar',     '',  60,        'secret', '',
4288         'server',      'varchar', 'NULL',  64,              '', '',
4289         'community',   'varchar', 'NULL',  50,              '', '',
4290         'description', 'varchar',     '', 200, 'RADIUS Client', '',
4291         'svcnum',          'int', 'NULL',  '',              '', '',
4292       ],
4293       'primary_key'  => 'nasnum',
4294       'unique'       => [ [ 'nasname' ], ],
4295       'index'        => [],
4296       'foreign_keys' => [
4297                           { columns    => [ 'svcnum' ],
4298                             table      => 'svc_broadband',#no? could be _acct?
4299                                                           #remove or cust_svc?
4300                           },
4301                         ],
4302     },
4303
4304     'export_nas' => {
4305       'columns' => [
4306         'exportnasnum', 'serial', '', '', '', '', 
4307         'exportnum',       'int', '', '', '', '', 
4308         'nasnum',          'int', '', '', '', '', 
4309       ],
4310       'primary_key'  => 'exportnasnum',
4311       'unique'       => [ [ 'exportnum', 'nasnum' ] ],
4312       'index'        => [ [ 'exportnum' ], [ 'nasnum' ] ],
4313       'foreign_keys' => [
4314                           { columns    => [ 'exportnum' ],
4315                             table      => 'part_export',
4316                           },
4317                           { columns    => [ 'nasnum' ],
4318                             table      => 'nas',
4319                           },
4320                         ],
4321     },
4322
4323     'queue' => {
4324       'columns' => [
4325         'jobnum',   'bigserial',     '',      '', '', '', 
4326         'job',        'varchar',     '',     512, '', '', 
4327         '_date',          'int',     '',      '', '', '', 
4328         'status',     'varchar',     '', $char_d, '', '', 
4329         'statustext',    'text', 'NULL',      '', '', '', 
4330         'svcnum',         'int', 'NULL',      '', '', '', 
4331         'custnum',        'int', 'NULL',      '', '', '',
4332         'secure',        'char', 'NULL',       1, '', '',
4333         'priority',       'int', 'NULL',      '', '', '',
4334       ],
4335       'primary_key'  => 'jobnum',
4336       'unique'       => [],
4337       'index'        => [ [ 'secure' ], [ 'priority' ],
4338                           [ 'job' ], [ 'svcnum' ], [ 'custnum' ], [ 'status' ],
4339                         ],
4340       'foreign_keys' => [
4341 #                          { columns    => [ 'svcnum' ],
4342 #                            table      => 'cust_svc',
4343 #                          },
4344                           { columns    => [ 'custnum' ],
4345                             table      => 'cust_main',
4346                           },
4347                         ],
4348     },
4349
4350     'queue_arg' => {
4351       'columns' => [
4352         'argnum', 'bigserial',     '', '', '', '', 
4353         'jobnum',    'bigint',     '', '', '', '', 
4354         'frozen',      'char', 'NULL',  1, '', '',
4355         'arg',         'text', 'NULL', '', '', '', 
4356       ],
4357       'primary_key'  => 'argnum',
4358       'unique'       => [],
4359       'index'        => [ [ 'jobnum' ] ],
4360       'foreign_keys' => [
4361                           { columns    => [ 'jobnum' ],
4362                             table      => 'queue',
4363                             on_delete  => 'CASCADE',
4364                           },
4365                         ],
4366     },
4367
4368     'queue_depend' => {
4369       'columns' => [
4370         'dependnum',  'bigserial', '', '', '', '', 
4371         'jobnum',        'bigint', '', '', '', '', 
4372         'depend_jobnum', 'bigint', '', '', '', '', 
4373       ],
4374       'primary_key'  => 'dependnum',
4375       'unique'       => [],
4376       'index'        => [ [ 'jobnum' ], [ 'depend_jobnum' ] ],
4377       'foreign_keys' => [
4378                           { columns    => [ 'jobnum' ],
4379                             table      => 'queue',
4380                           },
4381                           { columns    => [ 'depend_jobnum' ],
4382                             table      => 'queue',
4383                             references => [ 'jobnum' ],
4384                             on_delete  => 'CASCADE',
4385                           },
4386                         ],
4387     },
4388
4389     'queue_stat' => {
4390       'columns' => [
4391         'statnum', 'bigserial',     '',  '', '', '',
4392         'jobnum',     'bigint',     '',  '', '', '',
4393         'job',       'varchar',     '', 512, '', '', 
4394         'custnum',       'int', 'NULL',  '', '', '',
4395         'insert_date', @date_type, '', '',
4396         'start_date',  @date_type, '', '', 
4397         'end_date',    @date_type, '', '', 
4398       ],
4399       'primary_key'  => 'statnum',
4400       'unique'       => [], #[ ['jobnum'] ],
4401       'index'        => [],
4402     },
4403
4404     'export_svc' => {
4405       'columns' => [
4406         'exportsvcnum' => 'serial', '', '', '', '', 
4407         'exportnum'    => 'int', '', '', '', '', 
4408         'svcpart'      => 'int', '', '', '', '', 
4409         'role'         => 'varchar', 'NULL', 16, '', '',
4410       ],
4411       'primary_key'  => 'exportsvcnum',
4412       'unique'       => [ [ 'exportnum', 'svcpart' ] ],
4413       'index'        => [ [ 'exportnum' ], [ 'svcpart' ] ],
4414       'foreign_keys' => [
4415                           { columns    => [ 'exportnum' ],
4416                             table      => 'part_export',
4417                           },
4418                           { columns    => [ 'svcpart' ],
4419                             table      => 'part_svc',
4420                           },
4421                         ],
4422     },
4423
4424     'export_device' => {
4425       'columns' => [
4426         'exportdevicenum' => 'serial', '', '', '', '', 
4427         'exportnum'       => 'int', '', '', '', '', 
4428         'devicepart'      => 'int', '', '', '', '', 
4429       ],
4430       'primary_key'  => 'exportdevicenum',
4431       'unique'       => [ [ 'exportnum', 'devicepart' ] ],
4432       'index'        => [ [ 'exportnum' ], [ 'devicepart' ] ],
4433       'foreign_keys' => [
4434                           { columns    => [ 'exportnum' ],
4435                             table      => 'part_export',
4436                           },
4437                           { columns    => [ 'devicepart' ],
4438                             table      => 'part_device',
4439                           },
4440                         ],
4441     },
4442
4443     'part_export' => {
4444       'columns' => [
4445         'exportnum',   'serial',     '',      '', '', '', 
4446         'exportname', 'varchar', 'NULL', $char_d, '', '',
4447         'machine',    'varchar', 'NULL', $char_d, '', '',
4448         'exporttype', 'varchar',     '', $char_d, '', '', 
4449         'nodomain',      'char', 'NULL',       1, '', '', 
4450         'default_machine','int', 'NULL',      '', '', '',
4451       ],
4452       'primary_key'  => 'exportnum',
4453       'unique'       => [],
4454       'index'        => [ [ 'machine' ], [ 'exporttype' ] ],
4455       'foreign_keys' => [
4456                           { columns    => [ 'default_machine' ],
4457                             table      => 'part_export_machine',
4458                             references => [ 'machinenum' ]
4459                           },
4460                         ],
4461     },
4462
4463     'part_export_option' => {
4464       'columns' => [
4465         'optionnum', 'serial', '', '', '', '', 
4466         'exportnum', 'int', '', '', '', '', 
4467         'optionname', 'varchar', '', $char_d, '', '', 
4468         'optionvalue', 'text', 'NULL', '', '', '', 
4469       ],
4470       'primary_key'  => 'optionnum',
4471       'unique'       => [],
4472       'index'        => [ [ 'exportnum' ], [ 'optionname' ] ],
4473       'foreign_keys' => [
4474                           { columns    => [ 'exportnum' ],
4475                             table      => 'part_export',
4476                           },
4477                         ],
4478     },
4479
4480     'radius_usergroup' => {
4481       'columns' => [
4482         'usergroupnum', 'serial', '', '', '', '', 
4483         'svcnum',       'int', '', '', '', '', 
4484         'groupname',    'varchar', 'NULL', $char_d, '', '', #deprecated
4485         'groupnum',     'int', 'NULL', '', '', '', 
4486       ],
4487       'primary_key'  => 'usergroupnum',
4488       'unique'       => [],
4489       'index'        => [ [ 'svcnum' ], [ 'groupname' ] ],
4490       'foreign_keys' => [
4491                           { columns    => [ 'svcnum' ],
4492                             table      => 'cust_svc', #svc_acct / svc_broadband
4493                           },
4494                           { columns    => [ 'groupnum' ],
4495                             table      => 'radius_group',
4496                           },
4497                         ],
4498     },
4499
4500     'radius_group' => {
4501       'columns' => [
4502         'groupnum', 'serial', '', '', '', '', 
4503         'groupname',    'varchar', '', $char_d, '', '', 
4504         'description',  'varchar', 'NULL', $char_d, '', '', 
4505         'priority', 'int', '', '', '1', '',
4506         'speed_up', 'int', 'NULL', '', '', '',
4507         'speed_down', 'int', 'NULL', '', '', '',
4508       ],
4509       'primary_key' => 'groupnum',
4510       'unique'      => [ ['groupname'] ],
4511       'index'       => [],
4512     },
4513
4514     'radius_attr' => {
4515       'columns' => [
4516         'attrnum',   'serial', '',      '', '', '',
4517         'groupnum',     'int', '',      '', '', '',
4518         'attrname', 'varchar', '', $char_d, '', '',
4519         'value',    'varchar', '',     255, '', '',
4520         'attrtype',    'char', '',       1, '', '',
4521         'op',          'char', '',       2, '', '',
4522       ],
4523       'primary_key'  => 'attrnum',
4524       'unique'       => [],
4525       'index'        => [ ['groupnum'], ],
4526       'foreign_keys' => [
4527                           { columns    => [ 'groupnum' ],
4528                             table      => 'radius_group',
4529                           },
4530                         ],
4531     },
4532
4533     'msgcat' => {
4534       'columns' => [
4535         'msgnum', 'serial', '', '', '', '', 
4536         'msgcode', 'varchar', '', 255, '', '', 
4537         'locale', 'varchar', '', 16, '', '', 
4538         'msg', 'text', '', '', '', '', 
4539       ],
4540       'primary_key' => 'msgnum',
4541       'unique'      => [ [ 'msgcode', 'locale' ] ],
4542       'index'       => [],
4543     },
4544
4545     'cust_tax_exempt' => {
4546       'columns' => [
4547         'exemptnum', 'serial', '', '', '', '', 
4548         'custnum',   'int', '', '', '', '', 
4549         'taxnum',    'int', '', '', '', '', 
4550         'year',      'int', '', '', '', '', 
4551         'month',     'int', '', '', '', '', 
4552         'amount',   @money_type, '', '', 
4553       ],
4554       'primary_key'  => 'exemptnum',
4555       'unique'       => [ [ 'custnum', 'taxnum', 'year', 'month' ] ],
4556       'index'        => [],
4557       'foreign_keys' => [
4558                           { columns    => [ 'custnum' ],
4559                             table      => 'cust_main',
4560                           },
4561                           { columns    => [ 'taxnum' ],
4562                             table      => 'cust_main_county',
4563                           },
4564                         ],
4565     },
4566
4567     'cust_tax_exempt_pkg' => {
4568       'columns' => [
4569         'exemptpkgnum',  'serial', '', '', '', '', 
4570         #'custnum',      'int', '', '', '', ''
4571         'billpkgnum',   'int', '', '', '', '', 
4572         'taxnum',       'int', '', '', '', '', 
4573         'taxtype',  'varchar', 'NULL', $char_d, '', '',
4574         'year',         'int', 'NULL', '', '', '', 
4575         'month',        'int', 'NULL', '', '', '', 
4576         'creditbillpkgnum', 'int', 'NULL', '', '', '',
4577         'amount',       @money_type, '', '', 
4578         # exemption type flags
4579         'exempt_cust',          'char', 'NULL', 1, '', '',
4580         'exempt_setup',         'char', 'NULL', 1, '', '',
4581         'exempt_recur',         'char', 'NULL', 1, '', '',
4582         'exempt_cust_taxname',  'char', 'NULL', 1, '', '',
4583         'exempt_monthly',       'char', 'NULL', 1, '', '',
4584       ],
4585       'primary_key'  => 'exemptpkgnum',
4586       'unique'       => [],
4587       'index'        => [ [ 'taxnum', 'year', 'month' ],
4588                           [ 'billpkgnum' ],
4589                           [ 'taxnum', 'taxtype' ],
4590                           [ 'creditbillpkgnum' ],
4591                         ],
4592       'foreign_keys' => [
4593                           { columns    => [ 'billpkgnum' ],
4594                             table      => 'cust_bill_pkg',
4595                           },
4596                           { columns    => [ 'creditbillpkgnum' ],
4597                             table      => 'cust_credit_bill_pkg',
4598                           },
4599                         ],
4600     },
4601
4602     'cust_tax_exempt_pkg_void' => {
4603       'columns' => [
4604         'exemptpkgnum',  'int', '', '', '', '', 
4605         #'custnum',      'int', '', '', '', ''
4606         'billpkgnum',   'int', '', '', '', '', 
4607         'taxnum',       'int', '', '', '', '', 
4608         'taxtype',  'varchar', 'NULL', $char_d, '', '',
4609         'year',         'int', 'NULL', '', '', '', 
4610         'month',        'int', 'NULL', '', '', '', 
4611         'creditbillpkgnum', 'int', 'NULL', '', '', '',
4612         'amount',       @money_type, '', '', 
4613         # exemption type flags
4614         'exempt_cust',          'char', 'NULL', 1, '', '',
4615         'exempt_setup',         'char', 'NULL', 1, '', '',
4616         'exempt_recur',         'char', 'NULL', 1, '', '',
4617         'exempt_cust_taxname',  'char', 'NULL', 1, '', '',
4618         'exempt_monthly',       'char', 'NULL', 1, '', '',
4619       ],
4620       'primary_key'  => 'exemptpkgnum',
4621       'unique'       => [],
4622       'index'        => [ [ 'taxnum', 'year', 'month' ],
4623                           [ 'billpkgnum' ],
4624                           [ 'taxnum', 'taxtype' ],
4625                           [ 'creditbillpkgnum' ],
4626                         ],
4627       'foreign_keys' => [
4628                           { columns    => [ 'billpkgnum' ],
4629                             table      => 'cust_bill_pkg_void',
4630                           },
4631                           { columns    => [ 'taxnum' ],
4632                             table      => 'cust_main_county',
4633                           },
4634                           { columns    => [ 'creditbillpkgnum' ],
4635                             table      => 'cust_credit_bill_pkg',
4636                           },
4637                         ],
4638     },
4639
4640     'router' => {
4641       'columns' => [
4642         'routernum', 'serial', '', '', '', '', 
4643         'routername', 'varchar', '', $char_d, '', '', 
4644         'svcnum', 'int', 'NULL', '', '', '', 
4645         'agentnum',   'int', 'NULL', '', '', '', 
4646         'manual_addr', 'char', 'NULL', 1, '', '',
4647       ],
4648       'primary_key'  => 'routernum',
4649       'unique'       => [],
4650       'index'        => [],
4651       'foreign_keys' => [
4652                           { columns    => [ 'svcnum' ],
4653                             table      => 'cust_svc', #svc_acct / svc_broadband
4654                           },
4655                           { columns    => [ 'agentnum' ],
4656                             table      => 'agent',
4657                           },
4658                         ],
4659     },
4660
4661     'part_svc_router' => {
4662       'columns' => [
4663         'svcrouternum', 'serial', '', '', '', '', 
4664         'svcpart', 'int', '', '', '', '', 
4665         'routernum', 'int', '', '', '', '', 
4666       ],
4667       'primary_key'  => 'svcrouternum',
4668       'unique'       => [],
4669       'index'        => [],
4670       'foreign_keys' => [
4671                           { columns    => [ 'svcpart' ],
4672                             table      => 'part_svc',
4673                           },
4674                           { columns    => [ 'routernum' ],
4675                             table      => 'router',
4676                           },
4677                         ],
4678     },
4679
4680     'addr_block' => {
4681       'columns' => [
4682         'blocknum', 'serial', '', '', '', '', 
4683         'routernum', 'int', '', '', '', '', 
4684         'ip_gateway', 'varchar', '', 15, '', '', 
4685         'ip_netmask', 'int', '', '', '', '', 
4686         'agentnum',   'int', 'NULL', '', '', '', 
4687         'manual_flag', 'char', 'NULL', 1, '', '', 
4688       ],
4689       'primary_key'  => 'blocknum',
4690       'unique'       => [ [ 'blocknum', 'routernum' ] ],
4691       'index'        => [],
4692       'foreign_keys' => [
4693                           #{ columns    => [ 'routernum' ],
4694                           #   table      => 'router',
4695                           #},
4696                           { columns    => [ 'agentnum' ],
4697                             table      => 'agent',
4698                           },
4699                         ],
4700     },
4701
4702     'addr_range' => {
4703       'columns' => [
4704         'rangenum', 'serial', '', '', '', '',
4705         'start',    'varchar', '', 15, '', '',
4706         'length',   'int', '', '', '', '',
4707         'status',   'varchar', 'NULL', 32, '', '',
4708       ],
4709       'primary_key' => 'rangenum',
4710       'unique'      => [],
4711       'index'       => [],
4712     },
4713
4714     'svc_broadband' => {
4715       'columns' => [
4716         'svcnum',                  'int',     '',        '', '', '', 
4717         'description',         'varchar', 'NULL',   $char_d, '', '', 
4718         'routernum',               'int', 'NULL',        '', '', '',
4719         'blocknum',                'int', 'NULL',        '', '', '', 
4720         'sectornum',               'int', 'NULL',        '', '', '',
4721         'speed_up',                'int', 'NULL',        '', '', '', 
4722         'speed_down',              'int', 'NULL',        '', '', '', 
4723         'ip_addr',             'varchar', 'NULL',        15, '', '', 
4724         'mac_addr',            'varchar', 'NULL',        12, '', '', 
4725         'authkey',             'varchar', 'NULL',        32, '', '', 
4726         'latitude',            'decimal', 'NULL',    '10,7', '', '', 
4727         'longitude',           'decimal', 'NULL',    '10,7', '', '', 
4728         'altitude',            'decimal', 'NULL',        '', '', '', 
4729         'vlan_profile',        'varchar', 'NULL',   $char_d, '', '', 
4730         'performance_profile', 'varchar', 'NULL',   $char_d, '', '',
4731         'plan_id',             'varchar', 'NULL',   $char_d, '', '',
4732         'radio_serialnum',     'varchar', 'NULL',   $char_d, '', '',
4733         'radio_location',      'varchar', 'NULL', 2*$char_d, '', '',
4734         'poe_location',        'varchar', 'NULL', 2*$char_d, '', '',
4735         'rssi',                    'int', 'NULL',        '', '', '',
4736         'suid',                    'int', 'NULL',        '', '', '',
4737         'shared_svcnum',           'int', 'NULL',        '', '', '',
4738         'serviceid',           'varchar', 'NULL',        64, '', '',#srvexport/reportfields
4739       ],
4740       'primary_key'  => 'svcnum',
4741       'unique'       => [ [ 'ip_addr' ], [ 'mac_addr' ] ],
4742       'index'        => [],
4743       'foreign_keys' => [
4744                           { columns    => [ 'svcnum' ],
4745                             table      => 'cust_svc',
4746                           },
4747                           { columns    => [ 'routernum' ],
4748                             table      => 'router',
4749                           },
4750                           { columns    => [ 'blocknum' ],
4751                             table      => 'addr_block',
4752                           },
4753                           { columns    => [ 'sectornum' ],
4754                             table      => 'tower_sector',
4755                           },
4756                           { columns    => [ 'shared_svcnum' ],
4757                             table      => 'svc_broadband',
4758                             references => [ 'svcnum' ],
4759                           },
4760                         ],
4761     },
4762
4763     'tower' => {
4764       'columns' => [
4765         'towernum',    'serial',     '',      '', '', '',
4766         #'agentnum',       'int', 'NULL',      '', '', '',
4767         'towername',  'varchar',     '', $char_d, '', '',
4768         'disabled',      'char', 'NULL',       1, '', '',
4769         'latitude',   'decimal', 'NULL',  '10,7', '', '', 
4770         'longitude',  'decimal', 'NULL',  '10,7', '', '', 
4771         'coord_auto',    'char', 'NULL',       1, '', '',
4772         'altitude',   'decimal', 'NULL',      '', '', '', 
4773         'height',     'decimal', 'NULL',      '', '', '', 
4774         'veg_height', 'decimal', 'NULL',      '', '', '', 
4775         'color',      'varchar', 'NULL',       6, '', '',
4776       ],
4777       'primary_key' => 'towernum',
4778       'unique'      => [ [ 'towername' ] ], # , 'agentnum' ] ],
4779       'index'       => [],
4780     },
4781
4782     'tower_sector' => {
4783       'columns' => [
4784         'sectornum',     'serial',     '',      '', '', '',
4785         'towernum',         'int',     '',      '', '', '',
4786         'sectorname',   'varchar',     '', $char_d, '', '',
4787         'ip_addr',      'varchar', 'NULL',      15, '', '',
4788         'height',       'decimal', 'NULL',      '', '', '', 
4789         'freq_mhz',         'int', 'NULL',      '', '', '',
4790         'direction',        'int', 'NULL',      '', '', '',
4791         'width',            'int', 'NULL',      '', '', '',
4792         #downtilt etc? rfpath has profile files for devices/antennas you upload?
4793         'sector_range', 'decimal', 'NULL',      '', '', '',  #?
4794       ],
4795       'primary_key'  => 'sectornum',
4796       'unique'       => [ [ 'towernum', 'sectorname' ], [ 'ip_addr' ], ],
4797       'index'        => [ [ 'towernum' ] ],
4798       'foreign_keys' => [
4799                           { columns    => [ 'towernum' ],
4800                             table      => 'tower',
4801                           },
4802                         ],
4803     },
4804
4805     'part_virtual_field' => {
4806       'columns' => [
4807         'vfieldpart', 'serial', '', '', '', '', 
4808         'dbtable', 'varchar', '', 32, '', '', 
4809         'name', 'varchar', '', 32, '', '', 
4810         'length', 'int', 'NULL', '', '', '', 
4811         'label', 'varchar', 'NULL', 80, '', '', 
4812       ],
4813       'primary_key' => 'vfieldpart',
4814       'unique' => [],
4815       'index' => [],
4816     },
4817
4818     'virtual_field' => {
4819       'columns' => [
4820         'vfieldnum', 'serial', '', '', '', '', 
4821         'recnum', 'int', '', '', '', '', 
4822         'vfieldpart', 'int', '', '', '', '', 
4823         'value', 'varchar', '', 128, '', '', 
4824       ],
4825       'primary_key'  => 'vfieldnum',
4826       'unique'       => [ [ 'vfieldpart', 'recnum' ] ],
4827       'index'        => [],
4828       'foreign_keys' => [
4829                           { columns    => [ 'vfieldpart' ],
4830                             table      => 'part_virtual_field',
4831                           },
4832                         ],
4833     },
4834
4835     'acct_snarf' => {
4836       'columns' => [
4837         'snarfnum',    'serial',     '',      '', '', '', 
4838         'snarfname',  'varchar', 'NULL', $char_d, '', '', 
4839         'svcnum',         'int',     '',      '', '', '', 
4840         'machine',    'varchar',     '',     255, '', '', 
4841         'protocol',   'varchar',     '', $char_d, '', '', 
4842         'username',   'varchar',     '', $char_d, '', '', 
4843         '_password',  'varchar',     '', $char_d, '', '', 
4844         'check_freq',     'int', 'NULL',      '', '', '', 
4845         'leavemail',     'char', 'NULL',       1, '', '', 
4846         'apop',          'char', 'NULL',       1, '', '', 
4847         'tls',           'char', 'NULL',       1, '', '', 
4848         'mailbox',    'varchar', 'NULL', $char_d, '', '', 
4849       ],
4850       'primary_key'  => 'snarfnum',
4851       'unique'       => [],
4852       'index'        => [ [ 'svcnum' ] ],
4853       'foreign_keys' => [
4854                           { columns    => [ 'svcnum' ],
4855                             table      => 'svc_acct',
4856                           },
4857                         ],
4858     },
4859
4860     'svc_external' => {
4861       'columns' => [
4862         'svcnum',     'int',     '',      '', '', '', 
4863         'id',      'bigint', 'NULL',      '', '', '', 
4864         'title',  'varchar', 'NULL', $char_d, '', '', 
4865       ],
4866       'primary_key'  => 'svcnum',
4867       'unique'       => [],
4868       'index'        => [],
4869       'foreign_keys' => [
4870                           { columns    => [ 'svcnum' ],
4871                             table      => 'cust_svc',
4872                           },
4873                         ],
4874     },
4875
4876     'cust_pay_refund' => {
4877       'columns' => [
4878         'payrefundnum', 'serial', '', '', '', '', 
4879         'paynum',  'int', '', '', '', '', 
4880         'refundnum',  'int', '', '', '', '', 
4881         '_date',    @date_type, '', '', 
4882         'amount',   @money_type, '', '', 
4883       ],
4884       'primary_key'  => 'payrefundnum',
4885       'unique'       => [],
4886       'index'        => [ ['paynum'], ['refundnum'] ],
4887       'foreign_keys' => [
4888                           { columns    => [ 'paynum' ],
4889                             table      => 'cust_pay',
4890                           },
4891                           { columns    => [ 'refundnum' ],
4892                             table      => 'cust_refund',
4893                           },
4894                         ],
4895     },
4896
4897     'part_pkg_option' => {
4898       'columns' => [
4899         'optionnum', 'serial', '', '', '', '', 
4900         'pkgpart', 'int', '', '', '', '', 
4901         'optionname', 'varchar', '', $char_d, '', '', 
4902         'optionvalue', 'text', 'NULL', '', '', '', 
4903       ],
4904       'primary_key'  => 'optionnum',
4905       'unique'       => [],
4906       'index'        => [ [ 'pkgpart' ], [ 'optionname' ] ],
4907       'foreign_keys' => [
4908                           { columns    => [ 'pkgpart' ],
4909                             table      => 'part_pkg',
4910                           },
4911                         ],
4912     },
4913
4914     'part_pkg_vendor' => {
4915       'columns' => [
4916         'num', 'serial', '', '', '', '', 
4917         'pkgpart', 'int', '', '', '', '', 
4918         'exportnum', 'int', '', '', '', '', 
4919         'vendor_pkg_id', 'varchar', '', $char_d, '', '', 
4920       ],
4921       'primary_key'  => 'num',
4922       'unique'       => [ [ 'pkgpart', 'exportnum' ] ],
4923       'index'        => [ [ 'pkgpart' ] ],
4924       'foreign_keys' => [
4925                           { columns    => [ 'pkgpart' ],
4926                             table      => 'part_pkg',
4927                           },
4928                           { columns    => [ 'exportnum' ],
4929                             table      => 'part_export',
4930                           },
4931                         ],
4932     },
4933
4934     'part_pkg_report_option' => {
4935       'columns' => [
4936         'num',      'serial',   '',      '', '', '', 
4937         'name',     'varchar',  '', $char_d, '', '', 
4938         'disabled', 'char', 'NULL',       1, '', '', 
4939       ],
4940       'primary_key' => 'num',
4941       'unique' => [ [ 'name' ] ],
4942       'index' => [ [ 'disabled' ] ],
4943     },
4944
4945     'part_pkg_usage' => {
4946       'columns' => [
4947         'pkgusagepart', 'serial',   '', '', '', '',
4948         'pkgpart',  'int',      '', '', '', '',
4949         'minutes',  'double precision',      '', '', '', '',
4950         'priority', 'int',  'NULL', '', '', '',
4951         'shared',   'char', 'NULL',  1, '', '',
4952         'rollover', 'char', 'NULL',  1, '', '',
4953         'description',  'varchar', 'NULL', $char_d, '', '',
4954       ],
4955       'primary_key'  => 'pkgusagepart',
4956       'unique'       => [],
4957       'index'        => [ [ 'pkgpart' ] ],
4958       'foreign_keys' => [
4959                           { columns    => [ 'pkgpart' ],
4960                             table      => 'part_pkg',
4961                           },
4962                         ],
4963     },
4964
4965     'part_pkg_usage_class' => {
4966       'columns' => [
4967         'num',       'serial',  '', '', '', '',
4968         'pkgusagepart', 'int',  '', '', '', '',
4969         'classnum',     'int','NULL', '', '', '',
4970       ],
4971       'primary_key'  => 'num',
4972       'unique'       => [ [ 'pkgusagepart', 'classnum' ] ],
4973       'index'        => [],
4974       'foreign_keys' => [
4975                           { columns    => [ 'pkgusagepart' ],
4976                             table      => 'part_pkg_usage',
4977                           },
4978                           { columns    => [ 'classnum' ],
4979                             table      => 'usage_class',
4980                           },
4981                         ],
4982     },
4983
4984     'part_pkg_fcc_option' => {
4985       'columns' => [
4986         'num',        'serial', '', '', '', '',
4987         'fccoptionname', 'varchar', '', $char_d, '', '',
4988         'pkgpart',       'int', '', '', '', '',
4989         'optionvalue',   'varchar', 'NULL', $char_d, '', '',
4990       ],
4991       'primary_key' => 'num',
4992       'unique'      => [ [ 'fccoptionname', 'pkgpart' ] ],
4993       'index'       => [],
4994     },
4995
4996     'rate' => {
4997       'columns' => [
4998         'ratenum',          'serial',     '', '', '', '', 
4999         'ratename',        'varchar', '',$char_d, '', '', 
5000         'agentnum',            'int', 'NULL', '', '', '',
5001         'default_detailnum',   'int', 'NULL', '', '', '',
5002       ],
5003       'primary_key' => 'ratenum',
5004       'unique'      => [],
5005       'index'       => [],
5006       'foreign_keys' => [
5007                           { columns    => [ 'agentnum' ],
5008                             table      => 'agent',
5009                           },
5010                         ],
5011     },
5012
5013     'rate_detail' => {
5014       'columns' => [
5015         'ratedetailnum',   'serial',  '',     '',      '', '', 
5016         'ratenum',         'int',     '',     '',      '', '', 
5017         'orig_regionnum',  'int', 'NULL',     '',      '', '', 
5018         'dest_regionnum',  'int', 'NULL',     '',      '', '', 
5019         'min_included',    'int',     '',     '',      '', '', 
5020         'conn_charge',     'decimal', '', '10,4', '0.0000', '',
5021         'conn_cost',       'decimal', '', '10,4', '0.0000', '',
5022         'conn_sec',        'int',     '',     '',      '0', '',
5023         'min_charge',      'decimal', '', '10,5',       '', '',
5024         'min_cost',        'decimal', '', '10,5','0.00000', '',
5025         'sec_granularity', 'int',     '',     '',       '', '', 
5026         'ratetimenum',     'int', 'NULL',     '',       '', '',
5027         'classnum',        'int', 'NULL',     '',       '', '', 
5028         'cdrtypenum',      'int', 'NULL',     '',       '', '',
5029         'region_group',   'char', 'NULL',      1,       '', '', 
5030         'upstream_mult_charge',  'decimal',  '', '10,4', '0.0000', '',
5031         'upstream_mult_cost',    'decimal',  '', '10,4', '0.0000', '',
5032       ],
5033       'primary_key'  => 'ratedetailnum',
5034       'unique'       => [ [ 'ratenum', 'orig_regionnum', 'dest_regionnum' ] ],
5035       'index'        => [ [ 'ratenum', 'dest_regionnum' ],
5036                           [ 'ratenum', 'ratetimenum' ]
5037                         ],
5038       'foreign_keys' => [
5039                           { columns    => [ 'ratenum' ],
5040                             table      => 'rate',
5041                           },
5042                           { columns    => [ 'orig_regionnum' ],
5043                             table      => 'rate_region',
5044                             references => [ 'regionnum' ],
5045                           },
5046                           { columns    => [ 'dest_regionnum' ],
5047                             table      => 'rate_region',
5048                             references => [ 'regionnum' ],
5049                           },
5050                           { columns    => [ 'ratetimenum' ],
5051                             table      => 'rate_time',
5052                           },
5053                           { columns    => [ 'classnum' ],
5054                             table      => 'usage_class',
5055                           },
5056                           { columns    => [ 'cdrtypenum' ],
5057                             table      => 'cdr_type',
5058                           },
5059                         ],
5060     },
5061
5062     'rate_region' => {
5063       'columns' => [
5064         'regionnum',   'serial',      '', '', '', '', 
5065         'regionname',  'varchar',     '', $char_d, '', '', 
5066         'exact_match', 'char',    'NULL',  1, '', '',
5067       ],
5068       'primary_key' => 'regionnum',
5069       'unique'      => [],
5070       'index'       => [],
5071     },
5072
5073     'rate_prefix' => {
5074       'columns' => [
5075         'prefixnum',   'serial',      '', '', '', '', 
5076         'regionnum',   'int',         '', '', '', '', 
5077         'countrycode', 'varchar',     '',  3, '', '', 
5078         'npa',         'varchar', 'NULL', 10, '', '', #actually the whole prefix
5079         'nxx',         'varchar', 'NULL',  3, '', '', #actually not used
5080         'latanum',     'int',     'NULL',      '', '', '',
5081         'state',       'char',    'NULL',       2, '', '', 
5082         'ocn',         'char',    'NULL',       4, '', '', 
5083       ],
5084       'primary_key'  => 'prefixnum',
5085       'unique'       => [],
5086       'index'        => [ [ 'countrycode' ], [ 'npa' ], [ 'regionnum' ] ],
5087       'foreign_keys' => [
5088                           { columns    => [ 'regionnum' ],
5089                             table      => 'rate_region',
5090                           },
5091                           { columns    => [ 'latanum' ],
5092                             table      => 'lata',
5093                           },
5094                         ],
5095     },
5096
5097     'rate_time' => {
5098       'columns' => [
5099         'ratetimenum', 'serial',      '',      '', '', '',
5100         'ratetimename',   'varchar',      '', $char_d, '', '',
5101       ],
5102       'primary_key' => 'ratetimenum',
5103       'unique'      => [],
5104       'index'       => [],
5105     },
5106
5107     'rate_time_interval' => {
5108       'columns' => [
5109         'intervalnum', 'serial', '', '', '', '',
5110         'stime',          'int', '', '', '', '',
5111         'etime',          'int', '', '', '', '',
5112         'ratetimenum',    'int', '', '', '', '',
5113       ],
5114       'primary_key'  => 'intervalnum',
5115       'unique'       => [],
5116       'index'        => [],
5117       'foreign_keys' => [
5118                           { columns    => [ 'ratetimenum' ],
5119                             table      => 'rate_time',
5120                           },
5121                         ],
5122      },
5123
5124     #not really part of the above rate_ stuff (used with flat rate rather than
5125     # rated billing), but could be eventually, and its a rate
5126     'rate_tier' => {
5127       'columns' => [
5128         'tiernum',   'serial', '',      '', '', '',
5129         'tiername', 'varchar', '', $char_d, '', '',
5130       ],
5131       'primary_key' => 'tiernum',
5132       'unique'      => [ [ 'tiername'], ],
5133       'index'       => [],
5134     },
5135
5136     'rate_tier_detail' => {
5137       'columns' => [
5138         'tierdetailnum', 'serial', '',     '', '', '',
5139         'tiernum',          'int', '',     '', '', '',
5140         'min_quan',         'int', '',     '', '', '',
5141         'min_charge',   'decimal', '', '10,4', '', '',
5142       ],
5143       'primary_key'  => 'tierdetailnum',
5144       'unique'       => [],
5145       'index'        => [ ['tiernum'], ],
5146       'foreign_keys' => [
5147                           { columns    => [ 'tiernum' ],
5148                             table      => 'rate_tier',
5149                           },
5150                         ],
5151     },
5152
5153     'usage_class' => {
5154       'columns' => [
5155         'classnum',    'serial',      '',      '', '', '', 
5156         'weight',      'int',     'NULL',      '', '', '',
5157         'classname',   'varchar',     '', $char_d, '', '', 
5158         'format',      'varchar', 'NULL', $char_d, '', '', 
5159         'disabled',    'char',    'NULL',       1, '', '', 
5160       ],
5161       'primary_key' => 'classnum',
5162       'unique' => [],
5163       'index' => [ ['disabled'] ],
5164     },
5165
5166     'reg_code' => {
5167       'columns' => [
5168         'codenum',   'serial',    '', '', '', '', 
5169         'code',      'varchar',   '', $char_d, '', '', 
5170         'agentnum',  'int',       '', '', '', '', 
5171       ],
5172       'primary_key'  => 'codenum',
5173       'unique'       => [ [ 'agentnum', 'code' ] ],
5174       'index'        => [ [ 'agentnum' ] ],
5175       'foreign_keys' => [
5176                           { columns    => [ 'agentnum' ],
5177                             table      => 'agent',
5178                           },
5179                         ],
5180      },
5181
5182     'reg_code_pkg' => {
5183       'columns' => [
5184         'codepkgnum', 'serial', '', '', '', '', 
5185         'codenum',   'int',    '', '', '', '', 
5186         'pkgpart',   'int',    '', '', '', '', 
5187       ],
5188       'primary_key'  => 'codepkgnum',
5189       'unique'       => [ [ 'codenum', 'pkgpart' ] ],
5190       'index'        => [ [ 'codenum' ] ],
5191       'foreign_keys' => [
5192                           { columns    => [ 'codenum' ],
5193                             table      => 'reg_code',
5194                           },
5195                           { columns    => [ 'pkgpart' ],
5196                             table      => 'part_pkg',
5197                           },
5198                         ],
5199     },
5200
5201     'clientapi_session' => {
5202       'columns' => [
5203         'sessionnum',  'serial',  '', '', '', '', 
5204         'sessionid',  'varchar',  '', $char_d, '', '', 
5205         'namespace',  'varchar',  '', $char_d, '', '', 
5206       ],
5207       'primary_key' => 'sessionnum',
5208       'unique'      => [ [ 'sessionid', 'namespace' ] ],
5209       'index'       => [],
5210     },
5211
5212     'clientapi_session_field' => {
5213       'columns' => [
5214         'fieldnum',    'serial',     '', '', '', '', 
5215         'sessionnum',     'int',     '', '', '', '', 
5216         'fieldname',  'varchar',     '', $char_d, '', '', 
5217         'fieldvalue',    'text', 'NULL', '', '', '', 
5218       ],
5219       'primary_key'  => 'fieldnum',
5220       'unique'       => [ [ 'sessionnum', 'fieldname' ] ],
5221       'index'        => [],
5222       'foreign_keys' => [
5223                           { columns    => [ 'sessionnum' ],
5224                             table      => 'clientapi_session',
5225                           },
5226                         ],
5227     },
5228
5229     'payment_gateway' => {
5230       'columns' => [
5231         'gatewaynum',       'serial',   '',     '', '', '', 
5232         'gateway_namespace','varchar',  'NULL', $char_d, '', '', 
5233         'gateway_module',   'varchar',  '',     $char_d, '', '', 
5234         'gateway_username', 'varchar',  'NULL', $char_d, '', '', 
5235         'gateway_password', 'varchar',  'NULL', $char_d, '', '', 
5236         'gateway_action',   'varchar',  'NULL', $char_d, '', '', 
5237         'gateway_callback_url', 'varchar',  'NULL', 255, '', '', 
5238         'gateway_cancel_url',   'varchar',  'NULL', 255, '', '',
5239         'disabled',   'char',  'NULL',   1, '', '', 
5240       ],
5241       'primary_key' => 'gatewaynum',
5242       'unique' => [],
5243       'index'  => [ [ 'disabled' ] ],
5244     },
5245
5246     'payment_gateway_option' => {
5247       'columns' => [
5248         'optionnum',   'serial',  '',     '', '', '', 
5249         'gatewaynum',  'int',     '',     '', '', '', 
5250         'optionname',  'varchar', '',     $char_d, '', '', 
5251         'optionvalue', 'text',    'NULL', '', '', '', 
5252       ],
5253       'primary_key'  => 'optionnum',
5254       'unique'       => [],
5255       'index'        => [ [ 'gatewaynum' ], [ 'optionname' ] ],
5256       'foreign_keys' => [
5257                           { columns    => [ 'gatewaynum' ],
5258                             table      => 'payment_gateway',
5259                           },
5260                         ],
5261     },
5262
5263     'agent_payment_gateway' => {
5264       'columns' => [
5265         'agentgatewaynum', 'serial', '', '', '', '', 
5266         'agentnum',        'int', '', '', '', '', 
5267         'gatewaynum',      'int', '', '', '', '', 
5268         'cardtype',        'varchar', 'NULL', $char_d, '', '', 
5269         'taxclass',        'varchar', 'NULL', $char_d, '', '', 
5270       ],
5271       'primary_key'  => 'agentgatewaynum',
5272       'unique'       => [],
5273       'index'        => [ [ 'agentnum', 'cardtype' ], ],
5274
5275       'foreign_keys' => [
5276
5277                           { columns    => [ 'agentnum' ],
5278                             table      => 'agent',
5279                           },
5280                           { columns    => [ 'gatewaynum' ],
5281                             table      => 'payment_gateway',
5282                           },
5283                         ],
5284     },
5285
5286     'banned_pay' => {
5287       'columns' => [
5288         'bannum',        'serial',     '',      '', '', '', 
5289         'payby',           'char',     '',       4, '', '', 
5290         'payinfo',      'varchar',     '',     128, '', '', #say, a 512-big digest _hex encoded
5291         'payinfo_hash', 'varchar', 'NULL',      32, '', '',
5292         #'paymask',      'varchar',  'NULL', $char_d, '', ''
5293         '_date',                @date_type,         '', '', 
5294         'end_date',             @date_type,         '', '', 
5295         'otaker',       'varchar', 'NULL',      32, '', '', 
5296         'usernum',          'int', 'NULL',      '', '', '',
5297         'bantype',      'varchar', 'NULL', $char_d, '', '',
5298         'reason',       'varchar', 'NULL', $char_d, '', '', 
5299       ],
5300       'primary_key'  => 'bannum',
5301       'unique'       => [],
5302       'index'        => [ [ 'payby', 'payinfo' ], [ 'usernum' ], ],
5303       'foreign_keys' => [
5304                           { columns    => [ 'usernum' ],
5305                             table      => 'access_user',
5306                           },
5307                         ],
5308     },
5309
5310     'pkg_category' => {
5311       'columns' => [
5312         'categorynum',        'serial',     '',      '', '', '', 
5313         'categoryname',      'varchar',     '', $char_d, '', '', 
5314         'weight',                'int', 'NULL',      '', '', '',
5315         'ticketing_queueid',     'int', 'NULL',      '', '', '', 
5316         'condense',             'char', 'NULL',       1, '', '', 
5317         'disabled',             'char', 'NULL',       1, '', '', 
5318       ],
5319       'primary_key' => 'categorynum',
5320       'unique' => [],
5321       'index' => [ ['disabled'] ],
5322     },
5323
5324     'pkg_class' => {
5325       'columns' => [
5326         'classnum',    'serial',   '',      '', '', '', 
5327         'classname',   'varchar',  '', $char_d, '', '', 
5328         'categorynum', 'int',  'NULL',      '', '', '', 
5329         'disabled',    'char', 'NULL',       1, '', '', 
5330         'fcc_ds0s',      'int',     'NULL', '', '', '', 
5331       ],
5332       'primary_key'  => 'classnum',
5333       'unique'       => [],
5334       'index'        => [ ['disabled'] ],
5335       'foreign_keys' => [
5336                           { columns    => [ 'categorynum' ],
5337                             table      => 'pkg_category',
5338                           },
5339                         ],
5340     },
5341
5342     'cdr' => {
5343       'columns' => [
5344         # qw( name type null length default local );
5345
5346         ###
5347         #asterisk fields
5348         ###
5349
5350         'acctid',   'bigserial',  '', '', '', '', 
5351         #'calldate', 'TIMESTAMP with time zone', '', '', \'now()', '',
5352         'calldate', 'timestamp',   '',      '', \'now()', '',
5353         'clid',        'varchar',  '', $char_d, \"''", '', 
5354         'src',         'varchar',  '', $char_d, \"''", '', 
5355         'dst',         'varchar',  '', $char_d, \"''", '', 
5356         'dcontext',    'varchar',  '', $char_d, \"''", '', 
5357         'channel',     'varchar',  '', $char_d, \"''", '', 
5358         'dstchannel',  'varchar',  '', $char_d, \"''", '', 
5359         'lastapp',     'varchar',  '', $char_d, \"''", '', 
5360         'lastdata',    'varchar',  '',     255, \"''", '', 
5361
5362         #currently only opensips & voipswitch
5363         'src_ip_addr', 'varchar',  'NULL',  15,    '', '',
5364
5365         #currently only opensips
5366         'dst_ip_addr', 'varchar',  'NULL',  15,    '', '',
5367
5368         #currently only u4:
5369         # terminating number (as opposed to dialed destination)
5370         'dst_term',    'varchar',  'NULL', $char_d, '', '',
5371
5372         #these don't seem to be logged by most of the SQL cdr_* modules
5373         #except tds under sql-illegal names, so;
5374         # ... don't rely on them for rating?
5375         # and, what they hey, i went ahead and changed the names and data types
5376         # to freeside-style dates...
5377           #'start',  'timestamp', 'NULL',  '',    '', '',
5378           #'answer', 'timestamp', 'NULL',  '',    '', '',
5379           #'end',    'timestamp', 'NULL',  '',    '', '',
5380         'startdate',  @date_type, '', '', 
5381         'answerdate', @date_type, '', '', 
5382         'enddate',    @date_type, '', '', 
5383         #
5384
5385         'duration',    'int',      '',      '',     0, '',
5386         'billsec',     'int',      '',      '',     0, '', 
5387         'disposition', 'varchar',  '',      45, \"''", '',
5388         'amaflags',    'int',      '',      '',     0, '',
5389         'accountcode', 'varchar',  '',      32, \"''", '',
5390         'uniqueid',    'varchar',  '', $char_d, \"''", '',
5391         'userfield',   'varchar',  '',     512, \"''", '',
5392
5393         'max_callers', 'int',  'NULL',      '',    '', '',
5394
5395         ###
5396         # old fields for unitel/RSLCOM/convergent that don't map to asterisk
5397         # ones we adoped moved to "own fields" section below
5398         # charged_party, upstream_price, rated_price, carrierid, cdrtypenum
5399         ###
5400
5401         'upstream_currency',      'char', 'NULL',       3, '', '',
5402         'upstream_rateplanid',     'int', 'NULL',      '', '', '', #?
5403
5404         # how it was rated internally...
5405         'ratedetailnum',           'int', 'NULL',      '', '', '',
5406
5407         'distance',            'decimal', 'NULL',      '', '', '',
5408         'islocal',                 'int', 'NULL',      '', '', '', # '',  '', 0, '' instead?
5409
5410         #cdr_calltype: the big list in appendix 2
5411         'calltypenum',             'int', 'NULL',      '', '', '',
5412
5413         'description',         'varchar', 'NULL', $char_d, '', '',
5414         'quantity',                'int', 'NULL',      '', '', '', 
5415
5416         'upstream_rateid',         'int', 'NULL',      '', '', '',
5417
5418         ###
5419         # more fields, for GSM imports
5420         ###
5421         'servicecode',             'int', 'NULL',      '', '', '',
5422         'quantity_able',           'int', 'NULL',      '', '', '', 
5423
5424         ###
5425         #and now for our own fields
5426         ###
5427
5428         'cdrtypenum',              'int', 'NULL',      '', '', '',
5429
5430         'charged_party',       'varchar', 'NULL', $char_d, '', '',
5431         'charged_party_imsi',  'varchar', 'NULL', $char_d, '', '',
5432
5433         'upstream_price',      'decimal', 'NULL',  '10,5', '', '', 
5434
5435         #currently only voipswitch
5436         #'upstream_rate',      'decimal', 'NULL',  '10,5', '', '', 
5437
5438         'upstream_src_regionname', 'varchar', 'NULL', $char_d, '', '',
5439         'upstream_dst_regionname', 'varchar', 'NULL', $char_d, '', '',
5440
5441         # how it was rated internally...
5442         'rated_pretty_dst',       'varchar', 'NULL', $char_d, '', '',
5443         'rated_regionname',       'varchar', 'NULL', $char_d, '', '',
5444         'rated_price',            'decimal', 'NULL',  '10,4', '', '',
5445         'rated_seconds',              'int', 'NULL',      '', '', '',
5446         'rated_minutes', 'double precision', 'NULL',      '', '', '',
5447         'rated_granularity',          'int', 'NULL',      '', '', '',
5448         'rated_ratedetailnum',        'int', 'NULL',      '', '', '',
5449         'rated_classnum',             'int', 'NULL',      '', '', '', 
5450         'rated_ratename',         'varchar', 'NULL', $char_d, '', '', 
5451
5452         'carrierid',               'bigint', 'NULL',      '', '', '',
5453
5454         # service it was matched to
5455         'svcnum',             'int',   'NULL',     '',   '', '', 
5456
5457         #NULL, done (or something)
5458         'freesidestatus', 'varchar',   'NULL',     32,   '', '', 
5459
5460         #NULL, done (or something)
5461         'freesiderewritestatus', 'varchar',   'NULL',     32,   '', '', 
5462
5463         #an indexed place to put big numbers
5464         'cdrid',         'bigint',     'NULL',     '',  '', '', 
5465
5466         #for taqua accountcode rewriting, for starters
5467         'sessionnum',       'int',    'NULL',      '', '', '',
5468         'subscriber',   'varchar',    'NULL', $char_d, '', '',
5469
5470         #old
5471         'cdrbatch',     'varchar',    'NULL',     255, '', '',
5472         #new
5473         'cdrbatchnum',      'int',    'NULL',      '', '', '',
5474
5475         # FK to cust_bill_pkg_detail; having a value here absolutely means
5476         # that the CDR appears on an invoice
5477         'detailnum',     'bigint',    'NULL',      '', '', '',
5478       ],
5479       'primary_key' => 'acctid',
5480       'unique' => [],
5481       'index' => [ [ 'calldate' ],
5482                    [ 'src' ], [ 'dst' ], [ 'dcontext' ], [ 'charged_party' ],
5483                    [ 'lastapp' ],
5484                    ['accountcode'], ['uniqueid'], ['carrierid'], ['cdrid'],
5485                    [ 'sessionnum' ], [ 'subscriber' ],
5486                    [ 'freesidestatus' ], [ 'freesiderewritestatus' ],
5487                    [ 'cdrbatch' ], [ 'cdrbatchnum' ],
5488                    [ 'src_ip_addr' ], [ 'dst_ip_addr' ], [ 'dst_term' ],
5489                  ],
5490       #no FKs on cdr table... choosing not to throw errors no matter what's
5491       # thrown in here.  better to have the data.
5492     },
5493
5494     'cdr_batch' => {
5495       'columns' => [
5496         'cdrbatchnum',   'serial',    '',   '', '', '', 
5497         'cdrbatch', 'varchar', 'NULL', 255, '', '',
5498         '_date',     @date_type, '', '', 
5499       ],
5500       'primary_key' => 'cdrbatchnum',
5501       'unique' => [ [ 'cdrbatch' ] ],
5502       'index' => [],
5503     },
5504
5505     'cdr_termination' => {
5506       'columns' => [
5507         'cdrtermnum', 'bigserial',     '',      '', '', '',
5508         'acctid',        'bigint',     '',      '', '', '', 
5509         'termpart',         'int',     '',      '', '', '',#future use see below
5510         'rated_price',  'decimal', 'NULL',  '10,4', '', '',
5511         'rated_seconds',    'int', 'NULL',      '', '', '',
5512         'rated_minutes', 'double precision', 'NULL',   '', '', '',
5513         'status',       'varchar', 'NULL',      32, '', '',
5514         'svcnum',           'int', 'NULL',      '', '', '',
5515       ],
5516       'primary_key'  => 'cdrtermnum',
5517       'unique'       => [ [ 'acctid', 'termpart' ] ],
5518       'index'        => [ [ 'acctid' ], [ 'status' ], ],
5519       'foreign_keys' => [
5520                           { columns    => [ 'acctid' ],
5521                             table      => 'cdr',
5522                           },
5523                           { columns    => [ 'svcnum' ],
5524                             table      => 'cust_svc',
5525                           },
5526                         ],
5527     },
5528
5529     #to handle multiple termination/settlement passes...
5530    # 'part_termination' => {
5531    #   'columns' => [
5532    #     'termpart',       'int', '',      '', '', '',
5533    #     'termname',   'varchar', '', $char_d, '', '',
5534    #     'cdr_column', 'varchar', '', $char_d, '', '', #maybe set it here instead of in the price plan?
5535    #   ],
5536    #   'primary_key' => 'termpart',
5537    #   'unique' => [],
5538    #   'index'  => [],
5539    # },
5540
5541     #the remaining cdr_ tables are not really used
5542     'cdr_calltype' => {
5543       'columns' => [
5544         'calltypenum',   'serial',  '', '', '', '', 
5545         'calltypename',  'varchar', '', $char_d, '', '', 
5546       ],
5547       'primary_key' => 'calltypenum',
5548       'unique'      => [],
5549       'index'       => [],
5550     },
5551
5552     'cdr_type' => {
5553       'columns' => [
5554         'cdrtypenum'  => 'serial',  '', '', '', '',
5555         'cdrtypename' => 'varchar', '', $char_d, '', '',
5556       ],
5557       'primary_key' => 'cdrtypenum',
5558       'unique'      => [],
5559       'index'       => [],
5560     },
5561
5562     'cdr_carrier' => {
5563       'columns' => [
5564         'carrierid'   =>  'serial',     '',      '', '', '',
5565         'carriername' => 'varchar',     '', $char_d, '', '',
5566         'disabled'    =>    'char', 'NULL',       1, '', '', 
5567       ],
5568       'primary_key' => 'carrierid',
5569       'unique'      => [],
5570       'index'       => [],
5571     },
5572
5573     #'cdr_file' => {
5574     #  'columns' => [
5575     #    'filenum',    'serial',     '', '', '', '',
5576     #    'filename',  'varchar',     '', '', '', '',
5577     #    'status',    'varchar', 'NULL', '', '', '',
5578     #  ],
5579     #  'primary_key' => 'filenum',
5580     #  'unique' => [ [ 'filename' ], ], #just change the index if we need to
5581     #                                   # agent-virtualize or have a customer
5582     #                                   # with dup-filename needs or something
5583     #                                   # (only used by cdr.http_and_import for
5584     #                                   #  chrissakes)
5585     #  'index'  => [],
5586     #},
5587
5588     'inventory_item' => {
5589       'columns' => [
5590         'itemnum',   'serial',      '',      '', '', '',
5591         'classnum',  'int',         '',      '', '', '',
5592         'agentnum',  'int',     'NULL',      '', '', '',
5593         'item',      'varchar',     '', $char_d, '', '',
5594         'svcnum',    'int',     'NULL',      '', '', '',
5595         'svc_field', 'varchar', 'NULL', $char_d, '', '',
5596       ],
5597       'primary_key'  => 'itemnum',
5598       'unique'       => [ [ 'classnum', 'item' ] ],
5599       'index'        => [ [ 'classnum' ], [ 'agentnum' ], [ 'svcnum' ] ],
5600       'foreign_keys' => [
5601                           { columns    => [ 'classnum' ],
5602                             table      => 'inventory_class',
5603                           },
5604                           { columns    => [ 'agentnum' ],
5605                             table      => 'agent',
5606                           },
5607                           { columns    => [ 'svcnum' ],
5608                             table      => 'cust_svc',
5609                           },
5610                         ],
5611     },
5612
5613     'inventory_class' => {
5614       'columns' => [
5615         'classnum',  'serial',       '',      '', '', '',
5616         'classname', 'varchar',      '', $char_d, '', '',
5617       ],
5618       'primary_key' => 'classnum',
5619       'unique' => [],
5620       'index'  => [],
5621     },
5622
5623     'access_user_session' => {
5624       'columns' => [
5625         'sessionnum',   'serial',  '',      '', '', '', 
5626         'sessionkey',  'varchar',  '', $char_d, '', '',
5627         'usernum',         'int',  '',      '', '', '',
5628         'start_date', @date_type,               '', '',
5629         'last_date',  @date_type,               '', '',
5630       ],
5631       'primary_key'  => 'sessionnum',
5632       'unique'       => [ [ 'sessionkey' ] ],
5633       'index'        => [],
5634       'foreign_keys' => [
5635                           { columns    => [ 'usernum' ],
5636                             table      => 'access_user',
5637                           },
5638                         ],
5639     },
5640
5641     'access_user' => {
5642       'columns' => [
5643         'usernum',             'serial',     '',      '', '', '',
5644         'username',           'varchar',     '', $char_d, '', '',
5645         '_password',          'varchar', 'NULL', $char_d, '', '',
5646         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
5647         'last',               'varchar', 'NULL', $char_d, '', '', 
5648         'first',              'varchar', 'NULL', $char_d, '', '', 
5649         'user_custnum',           'int', 'NULL',      '', '', '',
5650         'report_salesnum',        'int', 'NULL',      '', '', '',
5651         'disabled',              'char', 'NULL',       1, '', '', 
5652       ],
5653       'primary_key'  => 'usernum',
5654       'unique'       => [ [ 'username' ] ],
5655       'index'        => [ [ 'user_custnum' ] ],
5656       'foreign_keys' => [
5657                           { columns    => [ 'user_custnum' ],
5658                             table      => 'cust_main',
5659                             references => [ 'custnum' ],
5660                           },
5661                           { columns    => [ 'report_salesnum' ],
5662                             table      => 'sales',
5663                             references => [ 'salesnum' ],
5664                           },
5665                         ],
5666     },
5667
5668     'access_user_pref' => {
5669       'columns' => [
5670         'prefnum',    'serial',       '', '', '', '',
5671         'usernum',     'int',       '', '', '', '',
5672         'prefname', 'varchar', '', $char_d, '', '', 
5673         'prefvalue', 'text', 'NULL', '', '', '', 
5674         'expiration', @date_type, '', '',
5675       ],
5676       'primary_key'  => 'prefnum',
5677       'unique'       => [],
5678       'index'        => [ [ 'usernum' ] ],
5679       'foreign_keys' => [
5680                           { columns    => [ 'usernum' ],
5681                             table      => 'access_user',
5682                           },
5683                         ],
5684     },
5685
5686     'access_group' => {
5687       'columns' => [
5688         'groupnum',   'serial', '',      '', '', '',
5689         'groupname', 'varchar', '', $char_d, '', '',
5690       ],
5691       'primary_key' => 'groupnum',
5692       'unique' => [ [ 'groupname' ] ],
5693       'index'  => [],
5694     },
5695
5696     'access_usergroup' => {
5697       'columns' => [
5698         'usergroupnum', 'serial', '', '', '', '',
5699         'usernum',         'int', '', '', '', '',
5700         'groupnum',        'int', '', '', '', '',
5701       ],
5702       'primary_key'  => 'usergroupnum',
5703       'unique'       => [ [ 'usernum', 'groupnum' ] ],
5704       'index'        => [ [ 'usernum' ] ],
5705       'foreign_keys' => [
5706                           { columns    => [ 'usernum' ],
5707                             table      => 'access_user',
5708                           },
5709                           { columns    => [ 'groupnum' ],
5710                             table      => 'access_group',
5711                           },
5712                         ],
5713      },
5714
5715     'access_groupagent' => {
5716       'columns' => [
5717         'groupagentnum', 'serial', '', '', '', '',
5718         'groupnum',         'int', '', '', '', '',
5719         'agentnum',         'int', '', '', '', '',
5720       ],
5721       'primary_key'  => 'groupagentnum',
5722       'unique'       => [ [ 'groupnum', 'agentnum' ] ],
5723       'index'        => [ [ 'groupnum' ] ],
5724       'foreign_keys' => [
5725                           { columns    => [ 'groupnum' ],
5726                             table      => 'access_group',
5727                           },
5728                           { columns    => [ 'agentnum' ],
5729                             table      => 'agent',
5730                           },
5731                         ],
5732     },
5733
5734     'access_right' => {
5735       'columns' => [
5736         'rightnum',   'serial', '',      '', '', '',
5737         'righttype', 'varchar', '', $char_d, '', '',
5738         'rightobjnum',   'int', '',      '', '', '',
5739         'rightname', 'varchar', '', $char_d, '', '',
5740       ],
5741       'primary_key' => 'rightnum',
5742       'unique' => [ [ 'righttype', 'rightobjnum', 'rightname' ] ],
5743       'index'  => [],
5744     },
5745
5746     'access_user_log' => {
5747       'columns'      => [
5748         'lognum',  'serial', '',        '', '', '',
5749         'usernum',    'int', '',        '', '', '',
5750         'path',   'varchar', '', 2*$char_d, '', '',
5751         '_date',         @date_type,        '', '',
5752       ],
5753       'primary_key'  => 'lognum',
5754       'unique'       => [],
5755       'index'        => [ ['usernum'], ['path'], ['_date'] ],
5756     },
5757
5758     'sched_item' => {
5759       'columns' => [
5760         'itemnum',   'serial',      '', '', '', '', 
5761         'usernum',      'int',  'NULL', '', '', '', 
5762         #'itemname', 'varchar', $char_d, '', '', '',
5763         'disabled',    'char',  'NULL',  1, '', '', 
5764       ],
5765       'primary_key'  => 'itemnum',
5766       'unique'       => [ [ 'usernum' ] ],
5767       'index'        => [],
5768       'foreign_keys' => [
5769                           { columns    => [ 'usernum' ],
5770                             table      => 'access_user',
5771                           },
5772                         ],
5773     },
5774
5775     #'sched_item_class'
5776
5777     'sched_avail' => {
5778       'columns' => [
5779         'availnum',      'serial', '', '', '', '', 
5780         'itemnum',          'int', '', '', '', '',
5781         'wday',             'int', '', '', '', '',
5782         'stime',            'int', '', '', '', '',
5783         'etime',            'int', '', '', '', '',
5784         'override_date',    @date_type,    '', '',
5785       ],
5786       'primary_key'  => 'availnum',
5787       'unique'       => [],
5788       'index'        => [],
5789       'foreign_keys' => [
5790                           { columns    => [ 'itemnum' ],
5791                             table      => 'sched_item',
5792                           },
5793                         ],
5794     },
5795
5796     'svc_phone' => {
5797       'columns' => [
5798         'svcnum',                         'int',     '',      '', '', '', 
5799         'countrycode',                'varchar',     '',       3, '', '', 
5800         'phonenum',                   'varchar',     '',      25, '', '', #12 ?
5801         'sim_imsi',                   'varchar', 'NULL',      15, '', '',
5802         'pin',                        'varchar', 'NULL', $char_d, '', '',
5803         'sip_password',               'varchar', 'NULL', $char_d, '', '',
5804         'phone_name',                 'varchar', 'NULL', $char_d, '', '',
5805         'pbxsvc',                         'int', 'NULL',      '', '', '',
5806         'domsvc',                         'int', 'NULL',      '', '', '', 
5807         'locationnum',                    'int', 'NULL',      '', '', '',
5808         'forwarddst',                 'varchar', 'NULL',      15, '', '', 
5809         'email',                      'varchar', 'NULL',     255, '', '', 
5810         'lnp_status',                 'varchar', 'NULL', $char_d, '', '',
5811         'portable',                      'char', 'NULL',       1, '', '', 
5812         'lrn',                           'char', 'NULL',      10, '', '', 
5813         'lnp_desired_due_date',           'int', 'NULL',      '', '', '',
5814         'lnp_due_date',                   'int', 'NULL',      '', '', '',
5815         'lnp_other_provider',         'varchar', 'NULL', $char_d, '', '',
5816         'lnp_other_provider_account', 'varchar', 'NULL', $char_d, '', '',
5817         'lnp_reject_reason',          'varchar', 'NULL', $char_d, '', '',
5818         'sms_carrierid',                  'int', 'NULL',      '', '', '',
5819         'sms_account',                'varchar', 'NULL', $char_d, '', '',
5820         'max_simultaneous',               'int', 'NULL',      '', '', '',
5821         'e911_class',                    'char', 'NULL',       1, '', '',
5822         'e911_type',                     'char', 'NULL',       1, '', '', 
5823         'circuit_svcnum',                 'int', 'NULL',      '', '', '',
5824         'sip_server',                 'varchar', 'NULL', $char_d, '', '',
5825       ],
5826       'primary_key'  => 'svcnum',
5827       'unique'       => [ [ 'sms_carrierid', 'sms_account'] ],
5828       'index'        => [ ['countrycode', 'phonenum'], ['pbxsvc'], ['domsvc'],
5829                           ['locationnum'], ['sms_carrierid'],
5830                         ],
5831       'foreign_keys' => [
5832                           { columns    => [ 'svcnum' ],
5833                             table      => 'cust_svc',
5834                           },
5835                           { columns    => [ 'pbxsvc' ],
5836                             table      => 'svc_pbx', #'cust_svc',
5837                             references => [ 'svcnum' ],
5838                           },
5839                           { columns    => [ 'domsvc' ],
5840                             table      => 'svc_domain', #'cust_svc',
5841                             references => [ 'svcnum' ],
5842                           },
5843                           { columns    => [ 'locationnum' ],
5844                             table      => 'cust_location',
5845                           },
5846                           { columns    => [ 'sms_carrierid' ],
5847                             table      => 'cdr_carrier',
5848                             references => [ 'carrierid' ],
5849                           },
5850                           { columns    => [ 'circuit_svcnum' ],
5851                             table      => 'svc_circuit',
5852                             references => [ 'svcnum' ],
5853                           },
5854                         ],
5855     },
5856
5857     'phone_device' => {
5858       'columns' => [
5859         'devicenum', 'serial',     '', '', '', '',
5860         'devicepart',   'int',     '', '', '', '',
5861         'svcnum',       'int',     '', '', '', '', 
5862         'mac_addr', 'varchar', 'NULL', 12, '', '', 
5863       ],
5864       'primary_key'  => 'devicenum',
5865       'unique'       => [ [ 'mac_addr' ], ],
5866       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
5867       'foreign_keys' => [
5868                           { columns    => [ 'devicepart' ],
5869                             table      => 'part_device',
5870                           },
5871                           { columns    => [ 'svcnum' ],
5872                             table      => 'svc_phone',
5873                           },
5874                         ],
5875     },
5876
5877     'part_device' => {
5878       'columns' => [
5879         'devicepart', 'serial',  '',      '', '', '',
5880         'devicename', 'varchar', '', $char_d, '', '',
5881         'inventory_classnum', 'int', 'NULL', '', '', '',
5882         'title',      'varchar', 'NULL', $char_d, '', '',
5883       ],
5884       'primary_key'  => 'devicepart',
5885       'unique'       => [ [ 'devicename' ] ], #?
5886       'index'        => [],
5887       'foreign_keys' => [
5888                           { columns    => [ 'inventory_classnum' ],
5889                             table      => 'inventory_class',
5890                             references => [ 'classnum' ],
5891                           },
5892                         ],
5893     },
5894
5895     'phone_avail' => {
5896       'columns' => [
5897         'availnum',    'serial',      '',      '', '', '', 
5898         'exportnum',   'int',         '',      '', '', '', 
5899         'countrycode', 'varchar',     '',       3, '', '', 
5900         'state',       'char',    'NULL',       2, '', '', 
5901         'npa',         'char',        '',       3, '', '', 
5902         'nxx',         'char',    'NULL',       3, '', '', 
5903         'station',     'char',    'NULL',       4, '', '',
5904         'name',        'varchar', 'NULL', $char_d, '', '',
5905         'rate_center_abbrev', 'varchar', 'NULL', $char_d, '', '',
5906         'latanum',      'int',     'NULL',      '', '', '',
5907         'msanum',       'int', 'NULL', '', '', '',
5908         'ordernum',      'int',     'NULL',      '', '', '',
5909         'svcnum',      'int',     'NULL',      '', '', '',
5910         'availbatch', 'varchar',  'NULL', $char_d, '', '',
5911       ],
5912       'primary_key'  => 'availnum',
5913       'unique'       => [],
5914       'index'        => [ ['exportnum','countrycode','state'],    #npa search
5915                           ['exportnum','countrycode','npa'],      #nxx search
5916                           ['exportnum','countrycode','npa','nxx'],#station srch
5917                           [ 'exportnum','countrycode','npa','nxx','station'], #
5918                           [ 'svcnum' ],
5919                           [ 'availbatch' ],
5920                           [ 'latanum' ],
5921                         ],
5922       'foreign_keys' => [
5923                           { columns    => [ 'exportnum' ],
5924                             table      => 'part_export',
5925                           },
5926                           { columns    => [ 'latanum' ],
5927                             table      => 'lata',
5928                           },
5929                           { columns    => [ 'msanum' ],
5930                             table      => 'msa',
5931                           },
5932                           { columns    => [ 'ordernum' ],
5933                             table      => 'did_order',
5934                           },
5935                           { columns    => [ 'svcnum' ],
5936                             table      => 'svc_phone',
5937                           },
5938                         ],
5939     },
5940
5941     'lata' => {
5942       'columns' => [
5943         'latanum',    'int',      '',      '', '', '', 
5944         'description',   'varchar',    '',      $char_d, '', '', 
5945         'have_usage',   'int',    'NULL',      '', '', '', 
5946       ],
5947       'primary_key' => 'latanum',
5948       'unique' => [],
5949       'index'  => [],
5950     },
5951
5952     'msa' => {
5953       'columns' => [
5954         'msanum',    'int',      '',      '', '', '', 
5955         'description',   'varchar',    '',      $char_d, '', '', 
5956       ],
5957       'primary_key' => 'msanum',
5958       'unique' => [],
5959       'index'  => [],
5960     },
5961
5962     'rate_center' => {
5963       'columns' => [
5964         'ratecenternum',    'serial',      '',      '', '', '', 
5965         'description',   'varchar',    '',      $char_d, '', '', 
5966       ],
5967       'primary_key' => 'ratecenternum',
5968       'unique' => [],
5969       'index'  => [],
5970     },
5971
5972     'did_vendor' => {
5973       'columns' => [
5974         'vendornum',    'serial',      '',      '', '', '', 
5975         'vendorname',   'varchar',        '',     $char_d, '', '', 
5976       ],
5977       'primary_key' => 'vendornum',
5978       'unique' => [],
5979       'index'  => [],
5980     },
5981
5982     'did_order_item' => {
5983       'columns' => [
5984         'orderitemnum',    'serial',      '',      '', '', '', 
5985         'ordernum',    'int',      '',      '', '', '', 
5986         'msanum',      'int',     'NULL',      '', '', '',
5987         'npa',      'int',     'NULL',      '', '', '',
5988         'latanum',      'int',     'NULL',      '', '', '',
5989         'ratecenternum',      'int',     'NULL',      '', '', '',
5990         'state',       'char',    'NULL',       2, '', '', 
5991         'quantity',      'int',     '',      '', '', '',
5992         'custnum',   'int', 'NULL', '', '', '',
5993       ],
5994       'primary_key'  => 'orderitemnum',
5995       'unique'       => [],
5996       'index'        => [],
5997       'foreign_keys' => [
5998                           { columns    => [ 'ordernum' ],
5999                             table      => 'did_order',
6000                           },
6001                           { columns    => [ 'msanum' ],
6002                             table      => 'msa',
6003                           },
6004                           { columns    => [ 'latanum' ],
6005                             table      => 'lata',
6006                           },
6007                           { columns    => [ 'ratecenternum' ],
6008                             table      => 'rate_center',
6009                           },
6010                           { columns    => [ 'custnum' ],
6011                             table      => 'cust_main',
6012                           },
6013                         ],
6014     },
6015
6016     'did_order' => {
6017       'columns' => [
6018         'ordernum',    'serial',      '',      '', '', '', 
6019         'vendornum',   'int',       '',      '', '', '', 
6020         'vendor_order_id',   'varchar',  'NULL',   $char_d, '', '', 
6021         'custnum',   'int', 'NULL', '', '', '',
6022         'submitted',      'int',     '',      '', '', '',
6023         'confirmed',      'int',     'NULL',      '', '', '',
6024         'received',      'int',     'NULL',      '', '', '',
6025       ],
6026       'primary_key'  => 'ordernum',
6027       'unique'       => [ [ 'vendornum', 'vendor_order_id' ] ],
6028       'index'        => [],
6029       'foreign_keys' => [
6030                           { columns    => [ 'vendornum' ],
6031                             table      => 'did_vendor',
6032                           },
6033                           { columns    => [ 'custnum' ],
6034                             table      => 'cust_main',
6035                           },
6036                         ],
6037     },
6038
6039     'reason_type' => {
6040       'columns' => [
6041         'typenum',   'serial',  '', '', '', '', 
6042         'class',     'char', '', 1, '', '', 
6043         'type',     'varchar', '', $char_d, '', '', 
6044       ],
6045       'primary_key' => 'typenum',
6046       'unique' => [],
6047       'index' => [],
6048     },
6049
6050     'reason' => {
6051       'columns' => [
6052         'reasonnum',     'serial',  '', '', '', '', 
6053         'reason_type',   'int',  '', '', '', '', 
6054         'reason',        'text', '', '', '', '', 
6055         'disabled',      'char',    'NULL', 1, '', '', 
6056         'unsuspend_pkgpart', 'int',  'NULL', '', '', '',
6057         'unsuspend_hold','char',    'NULL', 1, '', '',
6058         'unused_credit', 'char',    'NULL', 1, '', '',
6059         'feepart',        'int', 'NULL', '', '', '',
6060         'fee_on_unsuspend','char',  'NULL', 1, '', '',
6061         'fee_hold',      'char',    'NULL', 1, '', '',
6062       ],
6063       'primary_key'  => 'reasonnum',
6064       'unique'       => [],
6065       'index'        => [],
6066       'foreign_keys' => [
6067                           { columns    => [ 'reason_type' ],
6068                             table      => 'reason_type',
6069                             references => [ 'typenum' ],
6070                           },
6071                           { columns    => [ 'unsuspend_pkgpart' ],
6072                             table      => 'part_pkg',
6073                             references => [ 'pkgpart' ],
6074                           },
6075                         ],
6076     },
6077
6078     'conf' => {
6079       'columns' => [
6080         'confnum',  'serial',     '',      '', '', '', 
6081         'agentnum', 'int',    'NULL',      '', '', '', 
6082         'locale',   'varchar','NULL',      16, '', '',
6083         'name',     'varchar',    '', $char_d, '', '', 
6084         'value',    'text',   'NULL',      '', '', '',
6085       ],
6086       'primary_key'  => 'confnum',
6087       'unique'       => [ [ 'agentnum', 'locale', 'name' ] ],
6088       'index'        => [],
6089       'foreign_keys' => [
6090                           { columns    => [ 'agentnum' ],
6091                             table      => 'agent',
6092                           },
6093                         ],
6094     },
6095
6096     'pkg_referral' => {
6097       'columns' => [
6098         'pkgrefnum',     'serial', '', '', '', '',
6099         'pkgnum',        'int',    '', '', '', '',
6100         'refnum',        'int',    '', '', '', '',
6101       ],
6102       'primary_key'  => 'pkgrefnum',
6103       'unique'       => [ [ 'pkgnum', 'refnum' ] ],
6104       'index'        => [ [ 'pkgnum' ], [ 'refnum' ] ],
6105       'foreign_keys' => [
6106                           { columns    => [ 'pkgnum' ],
6107                             table      => 'cust_pkg',
6108                           },
6109                           { columns    => [ 'refnum' ],
6110                             table      => 'part_referral',
6111                           },
6112                         ],
6113     },
6114
6115     'svc_pbx' => {
6116       'columns' => [
6117         'svcnum',           'int',     '',      '', '', '', 
6118         'id',               'int', 'NULL',      '', '', '', 
6119         'uuid',            'char', 'NULL',      36, '', '',
6120         'title',        'varchar', 'NULL', $char_d, '', '', 
6121         'max_extensions',   'int', 'NULL',      '', '', '',
6122         'max_simultaneous', 'int', 'NULL',      '', '', '',
6123         'ip_addr',      'varchar', 'NULL',      40, '', '',
6124       ],
6125       'primary_key'  => 'svcnum',
6126       'unique'       => [],
6127       'index'        => [ [ 'id' ], [ 'uuid' ] ],
6128       'foreign_keys' => [
6129                           { columns    => [ 'svcnum' ],
6130                             table      => 'cust_svc',
6131                           },
6132                         ],
6133     },
6134
6135     'pbx_extension' => {
6136       'columns' => [
6137         'extensionnum',  'serial',     '',      '', '', '',
6138         'svcnum',           'int',     '',      '', '', '',
6139         'extension',    'varchar',     '', $char_d, '', '',
6140         'pin',          'varchar', 'NULL', $char_d, '', '',
6141         'sip_password', 'varchar', 'NULL', $char_d, '', '',
6142         'phone_name',   'varchar', 'NULL', $char_d, '', '',
6143       ],
6144       'primary_key'  => 'extensionnum',
6145       'unique'       => [ [ 'svcnum', 'extension' ] ],
6146       'index'        => [ [ 'svcnum' ] ],
6147       'foreign_keys' => [
6148                           { columns    => [ 'svcnum' ],
6149                             table      => 'svc_pbx',
6150                           },
6151                         ],
6152     },
6153
6154     'pbx_device' => {
6155       'columns' => [
6156         'devicenum', 'serial',     '', '', '', '',
6157         'devicepart',   'int',     '', '', '', '',
6158         'svcnum',       'int',     '', '', '', '', 
6159         'mac_addr', 'varchar', 'NULL', 12, '', '', 
6160       ],
6161       'primary_key'  => 'devicenum',
6162       'unique'       => [ [ 'mac_addr' ], ],
6163       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
6164       'foreign_keys' => [
6165                           { columns    => [ 'devicepart' ],
6166                             table      => 'part_device',
6167                           },
6168                           { columns    => [ 'svcnum' ],
6169                             table      => 'svc_pbx',
6170                           },
6171                         ],
6172     },
6173
6174     'extension_device' => {
6175       'columns' => [
6176         'extensiondevicenum', 'serial', '', '', '', '',
6177         'extensionnum',          'int', '', '', '', '',
6178         'devicenum',             'int', '', '', '', '',
6179       ],
6180       'primary_key'  => 'extensiondevicenum',
6181       'unique'       => [ [ 'extensionnum', 'devicenum' ] ],
6182       'index'        => [],#both?  which way do we need to query?
6183       'foreign_keys' => [
6184                           { columns  => [ 'extensionnum' ],
6185                             table    => 'pbx_extension',
6186                           },
6187                           { columns  => [ 'devicenum' ],
6188                             table    => 'pbx_device',
6189                           },
6190                         ],
6191     },
6192
6193     'svc_mailinglist' => { #svc_group?
6194       'columns' => [
6195         'svcnum',            'int',     '',            '', '', '', 
6196         'username',      'varchar',     '', $username_len, '', '',
6197         'domsvc',            'int',     '',            '', '', '', 
6198         'listnum',           'int',     '',            '', '', '',
6199         'reply_to',         'char', 'NULL',             1, '', '',#SetReplyTo
6200         'remove_from',      'char', 'NULL',             1, '', '',#RemoveAuthor
6201         'reject_auto',      'char', 'NULL',             1, '', '',#RejectAuto
6202         'remove_to_and_cc', 'char', 'NULL',             1, '', '',#RemoveToAndCc
6203       ],
6204       'primary_key'  => 'svcnum',
6205       'unique'       => [],
6206       'index'        => [ ['username'], ['domsvc'], ['listnum'] ],
6207       'foreign_keys' => [
6208                           { columns    => [ 'svcnum' ],
6209                             table      => 'cust_svc',
6210                           },
6211                           { columns    => [ 'domsvc' ],
6212                             table      => 'svc_domain', #'cust_svc',
6213                             references => [ 'svcnum' ],
6214                           },
6215                           { columns    => [ 'listnum' ],
6216                             table      => 'mailinglist',
6217                           },
6218                         ],
6219     },
6220
6221     'mailinglist' => {
6222       'columns' => [
6223         'listnum',   'serial', '',      '', '', '',
6224         'listname', 'varchar', '', $char_d, '', '',
6225       ],
6226       'primary_key' => 'listnum',
6227       'unique' => [],
6228       'index'  => [],
6229     },
6230
6231     'mailinglistmember' => {
6232       'columns' => [
6233         'membernum',        'serial',     '',   '', '', '',
6234         'listnum',             'int',     '',   '', '', '',
6235         'svcnum',              'int', 'NULL',   '', '', '', 
6236         'contactemailnum',     'int', 'NULL',   '', '', '', 
6237         'email',           'varchar', 'NULL',  255, '', '', 
6238       ],
6239       'primary_key'  => 'membernum',
6240       'unique'       => [],
6241       'index'        => [['listnum'],['svcnum'],['contactemailnum'],['email']],
6242       'foreign_keys' => [
6243                           { columns    => [ 'listnum' ],
6244                             table      => 'mailinglist',
6245                           },
6246                           { columns    => [ 'svcnum' ],
6247                             table      => 'svc_acct',
6248                           },
6249                           { columns    => [ 'contactemailnum' ],
6250                             table      => 'contact_email',
6251                           },
6252                         ],
6253     },
6254
6255     'bill_batch' => {
6256       'columns' => [
6257         'batchnum',         'serial',     '',  '', '', '',
6258         'agentnum',            'int', 'NULL',  '', '', '',
6259         'status',             'char', 'NULL', '1', '', '',
6260         'pdf',                'blob', 'NULL',  '', '', '',
6261       ],
6262       'primary_key'  => 'batchnum',
6263       'unique'       => [],
6264       'index'        => [ ['agentnum'] ],
6265       'foreign_keys' => [
6266                           { columns    => [ 'agentnum' ],
6267                             table      => 'agent',
6268                           },
6269                         ],
6270     },
6271
6272     'cust_bill_batch' => {
6273       'columns' => [
6274         'billbatchnum',     'serial',     '', '', '', '',
6275         'batchnum',            'int',     '', '', '', '',
6276         'invnum',              'int',     '', '', '', '',
6277       ],
6278       'primary_key'  => 'billbatchnum',
6279       'unique'       => [],
6280       'index'        => [ [ 'batchnum' ], [ 'invnum' ] ],
6281       'foreign_keys' => [
6282                           { columns    => [ 'batchnum' ],
6283                             table      => 'bill_batch',
6284                           },
6285                           { columns    => [ 'invnum' ],
6286                             table      => 'cust_bill',
6287                           },
6288                         ],
6289     },
6290
6291     'cust_bill_batch_option' => {
6292       'columns' => [
6293         'optionnum', 'serial', '', '', '', '', 
6294         'billbatchnum', 'int', '', '', '', '', 
6295         'optionname', 'varchar', '', $char_d, '', '', 
6296         'optionvalue', 'text', 'NULL', '', '', '', 
6297       ],
6298       'primary_key'  => 'optionnum',
6299       'unique'       => [],
6300       'index'        => [ [ 'billbatchnum' ], [ 'optionname' ] ],
6301       'foreign_keys' => [
6302                           { columns    => [ 'billbatchnum' ],
6303                             table      => 'cust_bill_batch',
6304                           },
6305                         ],
6306      },
6307
6308     'msg_template' => {
6309       'columns' => [
6310         'msgnum',     'serial',     '',      '', '', '',
6311         'msgname',   'varchar',     '', $char_d, '', '',
6312         'agentnum',      'int', 'NULL',      '', '', '',
6313         'subject',   'varchar', 'NULL',     512, '', '',
6314         'mime_type', 'varchar',     '', $char_d, '', '',
6315         'body',         'blob', 'NULL',      '', '', '',
6316         'disabled',     'char', 'NULL',       1, '', '', 
6317         'from_addr', 'varchar', 'NULL',     255, '', '',
6318         'bcc_addr',  'varchar', 'NULL',     255, '', '',
6319       ],
6320       'primary_key'  => 'msgnum',
6321       'unique'       => [ ],
6322       'index'        => [ ['agentnum'], ],
6323       'foreign_keys' => [
6324                           { columns    => [ 'agentnum' ],
6325                             table      => 'agent',
6326                           },
6327                         ],
6328     },
6329
6330     'template_content' => {
6331       'columns' => [
6332         'contentnum', 'serial',     '',      '', '', '',
6333         'msgnum',        'int',     '',      '', '', '',
6334         'locale',    'varchar', 'NULL',      16, '', '',
6335         'subject',   'varchar', 'NULL',     512, '', '',
6336         'body',         'text', 'NULL',      '', '', '',
6337       ],
6338       'primary_key'  => 'contentnum',
6339       'unique'       => [ ['msgnum', 'locale'] ],
6340       'index'        => [ ],
6341       'foreign_keys' => [
6342                           { columns    => [ 'msgnum' ],
6343                             table      => 'msg_template',
6344                           },
6345                         ],
6346     },
6347
6348     'cust_msg' => {
6349       'columns' => [
6350         'custmsgnum', 'serial',     '',     '', '', '',
6351         'custnum',       'int', 'NULL',     '', '', '',
6352         'msgnum',        'int', 'NULL',     '', '', '',
6353         '_date',    @date_type,                 '', '',
6354         'env_from',  'varchar', 'NULL',    255, '', '',
6355         'env_to',    'varchar', 'NULL',    255, '', '',
6356         'header',       'blob', 'NULL',     '', '', '',
6357         'body',         'blob', 'NULL',     '', '', '',
6358         'error',     'varchar', 'NULL',    255, '', '',
6359         'status',    'varchar',     '',$char_d, '', '',
6360         'msgtype',   'varchar', 'NULL',     16, '', '',
6361       ],
6362       'primary_key'  => 'custmsgnum',
6363       'unique'       => [ ],
6364       'index'        => [ ['custnum'], ],
6365       'foreign_keys' => [
6366                           { columns    => [ 'custnum' ],
6367                             table      => 'cust_main',
6368                           },
6369                           { columns    => [ 'msgnum' ],
6370                             table      => 'msg_template',
6371                           },
6372                         ],
6373     },
6374
6375     'svc_cert' => {
6376       'columns' => [
6377         'svcnum',                'int',     '',      '', '', '', 
6378         'recnum',                'int', 'NULL',      '', '', '',
6379         'privatekey',           'text', 'NULL',      '', '', '',
6380         'csr',                  'text', 'NULL',      '', '', '',
6381         'certificate',          'text', 'NULL',      '', '', '',
6382         'cacert',               'text', 'NULL',      '', '', '',
6383         'common_name',       'varchar', 'NULL', $char_d, '', '',
6384         'organization',      'varchar', 'NULL', $char_d, '', '',
6385         'organization_unit', 'varchar', 'NULL', $char_d, '', '',
6386         'city',              'varchar', 'NULL', $char_d, '', '',
6387         'state',             'varchar', 'NULL', $char_d, '', '',
6388         'country',              'char', 'NULL',       2, '', '',
6389         'cert_contact',      'varchar', 'NULL', $char_d, '', '',
6390       ],
6391       'primary_key'  => 'svcnum',
6392       'unique'       => [],
6393       'index'        => [], #recnum
6394       'foreign_keys' => [
6395                           { columns    => [ 'svcnum' ],
6396                             table      => 'cust_svc',
6397                           },
6398                           { columns    => [ 'recnum' ],
6399                             table      => 'domain_record',
6400                           },
6401                         ],
6402     },
6403
6404     'svc_port' => {
6405       'columns' => [
6406         'svcnum',                'int',     '',      '', '', '', 
6407         'serviceid', 'varchar', '', 64, '', '', #srvexport / reportfields
6408       ],
6409       'primary_key'  => 'svcnum',
6410       'unique'       => [],
6411       'index'        => [], #recnum
6412       'foreign_keys' => [
6413                           { columns    => [ 'svcnum' ],
6414                             table      => 'cust_svc',
6415                           },
6416                         ],
6417     },
6418
6419     'areacode'  => {
6420       'columns' => [
6421         'areanum',   'serial',        '',      '', '', '',
6422         'code',        'char',        '',       3, '', '', 
6423         'country',     'char',    'NULL',       2, '', '',
6424         'state',       'char',    'NULL',       2, '', '', 
6425         'description','varchar',  'NULL',     255, '', '',
6426       ], 
6427       'primary_key' => 'areanum',
6428       'unique' => [ [ 'areanum' ] ],
6429       'index'  => [],
6430     },
6431
6432     'upgrade_journal' => {
6433       'columns' => [
6434         'upgradenum', 'serial', '', '', '', '',
6435         '_date', 'int', '', '', '', '',
6436         'upgrade', 'varchar', '', $char_d, '', '',
6437         'status', 'varchar', '', $char_d, '', '',
6438         'statustext', 'varchar', 'NULL', $char_d, '', '',
6439       ],
6440       'primary_key' => 'upgradenum',
6441       'unique' => [],
6442       'index' => [ [ 'upgrade' ] ],
6443     },
6444
6445     'upload_target' => {
6446       'columns' => [
6447         'targetnum', 'serial', '', '', '', '',
6448         'agentnum', 'int', 'NULL', '', '', '',
6449         'protocol', 'varchar', '', 10, '', '',
6450         'hostname', 'varchar', '', $char_d, '', '',
6451         'port', 'int', 'NULL', '', '', '',
6452         'username', 'varchar', '', $char_d, '', '',
6453         'password', 'varchar', 'NULL', $char_d, '', '',
6454         'path', 'varchar', 'NULL', $char_d, '', '',
6455         'subject', 'varchar', 'NULL', '255', '', '',
6456         'handling', 'varchar', 'NULL', $char_d, '', '',
6457       ],
6458       'primary_key'   => 'targetnum',
6459       'unique'        => [ [ 'targetnum' ] ],
6460       'index'         => [],
6461       'foreign_keys' => [
6462                           { columns    => [ 'agentnum' ],
6463                             table      => 'agent',
6464                           },
6465                         ],
6466     },
6467
6468     'log' => {
6469       'columns' => [
6470         'lognum',     'serial', '', '', '', '',
6471         '_date',      'int', '', '', '', '',
6472         'agentnum',   'int', 'NULL', '', '', '',
6473         'tablename',  'varchar', 'NULL', $char_d, '', '',
6474         'tablenum',   'int',  'NULL', '', '', '', 
6475         'level',      'int',  '', '', '', '',
6476         'message',    'text', '', '', '', '',
6477       ],
6478       'primary_key'  => 'lognum',
6479       'unique'       => [],
6480       'index'        => [ ['_date'], ['level'] ],
6481       'foreign_keys' => [
6482                           { columns    => [ 'agentnum' ],
6483                             table      => 'agent',
6484                           },
6485                         ],
6486     },
6487
6488     'log_context' => {
6489       'columns' => [
6490         'logcontextnum', 'serial', '', '', '', '',
6491         'lognum', 'int', '', '', '', '',
6492         'context', 'varchar', '', $char_d, '', '',
6493       ],
6494       'primary_key'  => 'logcontextnum',
6495       'unique'       => [ [ 'lognum', 'context' ] ],
6496       'index'        => [],
6497       'foreign_keys' => [
6498                           { columns    => [ 'lognum' ],
6499                             table      => 'log',
6500                           },
6501                         ],
6502     },
6503
6504     'svc_alarm' => {
6505       'columns' => [
6506 #       name               type        null   length   default local
6507         'svcnum',          'int',      '',    '',      '',     '', 
6508         'alarmsystemnum',  'int',      '',    '',      '',     '',
6509         'alarmtypenum',    'int',      '',    '',      '',     '',
6510         'alarmstationnum', 'int',      '',    '',      '',     '',
6511         'acctnum',         'varchar',  '',    $char_d, '',     '',
6512         '_password',       'varchar',  '',    $char_d, '',     '',
6513         'location',        'varchar', 'NULL', $char_d, '',     '',
6514         'cs_receiver',     'int',     'NULL', '',      '',     '',
6515         'cs_phonenum',     'varchar', 'NULL', $char_d, '',     '',
6516         'serialnum',       'varchar', 'NULL', $char_d, '',     '',
6517         #installer (rep)
6518       ],
6519       'primary_key'  => 'svcnum',
6520       'unique'       => [],
6521       'index'        => [],
6522       'foreign_keys' => [
6523                           { columns    => [ 'svcnum' ],
6524                             table      => 'cust_svc',
6525                           },
6526                           { columns    => [ 'alarmsystemnum' ],
6527                             table      => 'alarm_system',
6528                           },
6529                           { columns    => [ 'alarmtypenum' ],
6530                             table      => 'alarm_type',
6531                           },
6532                           { columns    => [ 'alarmstationnum' ],
6533                             table      => 'alarm_station',
6534                           },
6535                         ],
6536     },
6537
6538     'alarm_system' => { #vendors
6539       'columns' => [
6540         'alarmsystemnum',  'serial',     '',      '', '', '',
6541         'agentnum',           'int', 'NULL',      '', '', '',
6542         'systemname',     'varchar',     '', $char_d, '', '',
6543         'disabled',          'char', 'NULL',       1, '', '', 
6544       ],
6545       'primary_key' => 'alarmsystemnum',
6546       'unique'      => [ ['agentnum', 'systemname'] ],
6547       'index'       => [ ['agentnum'], ['disabled'] ],
6548       'foreign_keys' => [
6549                           { columns    => [ 'agentnum' ],
6550                             table      => 'agent',
6551                           },
6552                         ],
6553     },
6554
6555     'alarm_type' => { #inputs and outputs
6556       'columns' => [
6557         'alarmtypenum', 'serial',     '',      '', '', '',
6558         'agentnum',        'int', 'NULL',      '', '', '',
6559         'inputs',          'int',     '', '', '', '',
6560         'outputs',         'int',     '', '', '', '',
6561         'disabled',       'char', 'NULL',       1, '', '', 
6562       ],
6563       'primary_key' => 'alarmtypenum',
6564       'unique'      => [ ['agentnum', 'inputs', 'outputs'] ],
6565       'index'       => [ ['agentnum'], ['disabled'] ],
6566       'foreign_keys' => [
6567                           { columns    => [ 'agentnum' ],
6568                             table      => 'agent',
6569                           },
6570                         ],
6571     },
6572
6573     'alarm_station' => { #central station (where the alarm reports to)
6574       'columns' => [
6575         'alarmstationnum', 'serial',     '',      '', '', '',
6576         'agentnum',           'int', 'NULL',      '', '', '',
6577         'stationname',    'varchar',     '', $char_d, '', '',
6578         'disabled',          'char', 'NULL',       1, '', '', 
6579       ],
6580       'primary_key' => 'alarmstationnum',
6581       'unique'      => [ ['agentnum', 'stationname'], ],
6582       'index'       => [ ['agentnum'], ['disabled'] ],
6583       'foreign_keys' => [
6584                           { columns    => [ 'agentnum' ],
6585                             table      => 'agent',
6586                           },
6587                         ],
6588     },
6589
6590     'svc_cable' => {
6591       'columns' => [
6592         'svcnum',        'int',     '',      '', '', '', 
6593         'providernum',   'int', 'NULL',      '', '', '',
6594         'ordernum',  'varchar', 'NULL', $char_d, '', '',
6595         'modelnum',      'int', 'NULL',      '', '', '',
6596         'serialnum', 'varchar', 'NULL', $char_d, '', '',
6597         'mac_addr',  'varchar', 'NULL',      12, '', '', 
6598       ],
6599       'primary_key'  => 'svcnum',
6600       'unique'       => [ ['serialnum'] , ['mac_addr'] ],
6601       'index'        => [],
6602       'foreign_keys' => [
6603                           { columns    => [ 'svcnum' ],
6604                             table      => 'cust_svc',
6605                           },
6606                           { columns    => [ 'providernum' ],
6607                             table      => 'cable_provider',
6608                           },
6609                           { columns    => [ 'modelnum' ],
6610                             table      => 'cable_model',
6611                           },
6612                         ],
6613     },
6614
6615     'cable_model' => {
6616       'columns' => [
6617         'modelnum',    'serial',     '',      '', '', '',
6618         'model_name', 'varchar',     '', $char_d, '', '',
6619         'disabled',      'char', 'NULL',       1, '', '', 
6620       ],
6621       'primary_key' => 'modelnum',
6622       'unique' => [ [ 'model_name' ], ],
6623       'index'  => [],
6624     },
6625
6626     'cable_provider' => {
6627       'columns' => [
6628         'providernum', 'serial',     '',      '', '', '',
6629         'provider',   'varchar',     '', $char_d, '', '',
6630         'disabled',      'char', 'NULL',       1, '', '', 
6631       ],
6632       'primary_key' => 'providernum',
6633       'unique' => [ [ 'provider' ], ],
6634       'index'  => [],
6635     },
6636
6637     'svc_conferencing' => {
6638       'columns' => [
6639         'svcnum',            'int',     '',      '', '', '',
6640         'conf_id',           'int', 'NULL',      '', '', '', #"system assigned"
6641         'conf_name',     'varchar',     '', $char_d, '', '',
6642         'conf_password', 'varchar',     '', $char_d, '', '',
6643         'access_code',   'varchar',     '',      16, '', '',
6644         'duration',          'int',     '',      '', '', '',
6645         'participants',      'int',     '',      '', '', '',
6646         'conftypenum',       'int',     '',      '', '', '',
6647         'confqualitynum',    'int',     '',      '', '', '',
6648         'opt_recording',    'char', 'NULL',       1, '', '',
6649         'opt_sip',          'char', 'NULL',       1, '', '',
6650         'opt_phone',        'char', 'NULL',       1, '', '',
6651       ],
6652       'primary_key' => 'svcnum',
6653       'unique' => [],
6654       'index'  => [],
6655       'foreign_keys' => [
6656                           { columns => [ 'svcnum' ],
6657                             table   => 'cust_svc',
6658                           },
6659                           { columns => [ 'conftypenum' ],
6660                             table   => 'conferencing_type',
6661                           },
6662                           { columns => [ 'confqualitynum' ],
6663                             table   => 'conferencing_quality',
6664                           },
6665                         ],
6666     },
6667
6668     'conferencing_type' => {
6669       'columns' => [
6670         'conftypenum',  'int',     '',      '', '', '',
6671         'typeid'      , 'int',     '',      '', '', '',
6672         'typename', 'varchar',     '', $char_d, '', '',
6673         'disabled',    'char', 'NULL',       1, '', '', 
6674       ],
6675       'primary_key' => 'conftypenum',
6676       'unique'      => [ [ 'typeid', 'disabled' ], [ 'typename', 'disabled' ] ],
6677       'index'       => [],
6678     },
6679
6680     'conferencing_quality' => {
6681       'columns' => [
6682         'confqualitynum',  'int',     '',      '', '', '',
6683         'qualityid'      , 'int',     '',      '', '', '',
6684         'qualityname', 'varchar',     '', $char_d, '', '',
6685         'disabled',       'char', 'NULL',       1, '', '', 
6686       ],
6687       'primary_key' => 'confqualitynum',
6688       'unique'      => [ [ 'qualityid', 'disabled' ], [ 'qualityname', 'disabled' ] ],
6689       'index'       => [],
6690     },
6691
6692     'svc_video' => {
6693       'columns' => [
6694         'svcnum',            'int', '', '', '', '',
6695         'smartcard_num', 'varchar', '', 16, '', '',
6696         'mac_addr',      'varchar', '', 12, '', '', 
6697         'duration',          'int', '', '', '', '',
6698       ],
6699       'primary_key' => 'svcnum',
6700       'unique' => [], # [ 'smartcard_num' ], [ 'mac_addr' ], ],
6701       'index'  => [],
6702       'foreign_keys' => [
6703                           { columns => [ 'svcnum' ],
6704                             table   => 'cust_svc',
6705                           },
6706                         ],
6707     },
6708
6709     'circuit_type' => {
6710       'columns' => [
6711         'typenum',     'serial',     '',      '', '', '',
6712         'typename',   'varchar',     '', $char_d, '', '',
6713         'disabled',      'char', 'NULL',       1, '', '',
6714         # speed? number of voice lines? anything else?
6715       ],
6716       'primary_key' => 'typenum',
6717       'unique' => [ [ 'typename' ] ],
6718       'index'  => [],
6719     },
6720
6721     'circuit_provider' => {
6722       'columns' => [
6723         'providernum', 'serial',     '',      '', '', '',
6724         'provider',   'varchar',     '', $char_d, '', '',
6725         'disabled',      'char', 'NULL',       1, '', '', 
6726       ],
6727       'primary_key' => 'providernum',
6728       'unique' => [ [ 'provider' ], ],
6729       'index'  => [],
6730     },
6731
6732     'circuit_termination' => {
6733       'columns' => [
6734         'termnum',     'serial',     '',      '', '', '',
6735         'termination','varchar',     '', $char_d, '', '',
6736         'disabled',      'char', 'NULL',       1, '', '',
6737       ],
6738       'primary_key' => 'termnum',
6739       'unique' => [ [ 'termination' ] ],
6740       'index' => [],
6741     },
6742
6743     'svc_circuit' => {
6744       'columns' => [
6745         'svcnum',                   'int',     '', '', '', '',
6746         'typenum',                  'int',     '', '', '', '',
6747         'providernum',              'int',     '', '', '', '',
6748         'termnum',                  'int',     '', '', '', '',
6749         'circuit_id',           'varchar',     '', 64, '', '',
6750         'desired_due_date',         'int', 'NULL', '', '', '',
6751         'due_date',                 'int', 'NULL', '', '', '',
6752         'vendor_order_id',      'varchar', 'NULL', $char_d,  '', '',
6753         'vendor_qual_id',       'varchar', 'NULL', $char_d,  '', '',
6754         'vendor_order_type',    'varchar', 'NULL', $char_d,  '', '',
6755         'vendor_order_status',  'varchar', 'NULL', $char_d,  '', '',
6756         'endpoint_ip_addr',     'varchar', 'NULL', 40, '', '',
6757         'endpoint_mac_addr',    'varchar', 'NULL', 12, '', '',
6758       ],
6759       'primary_key' => 'svcnum',
6760       'unique'      => [],
6761       'index'       => [ [ 'providernum' ], [ 'typenum' ] ],
6762       'foreign_keys' => [
6763                           { columns => [ 'svcnum' ],
6764                             table   => 'cust_svc',
6765                           },
6766                           { columns => [ 'typenum' ],
6767                             table   => 'circuit_type',
6768                           },
6769                           { columns => [ 'providernum' ],
6770                             table   => 'circuit_provider',
6771                           },
6772                           { columns => [ 'termnum' ],
6773                             table   => 'circuit_termination',
6774                           },
6775       ],
6776     },
6777
6778     'vend_main' => {
6779       'columns' => [
6780         'vendnum',   'serial',     '',      '', '', '',
6781         'vendname', 'varchar',     '', $char_d, '', '',
6782         'classnum',     'int',     '',      '', '', '',
6783         'disabled',    'char', 'NULL',       1, '', '', 
6784       ],
6785       'primary_key'  => 'vendnum',
6786       'unique'       => [ ['vendname', 'disabled'] ],
6787       'index'        => [],
6788       'foreign_keys' => [
6789                           { columns    => [ 'classnum' ],
6790                             table      => 'vend_class',
6791                           },
6792                         ],
6793     },
6794
6795     'vend_class' => {
6796       'columns' => [
6797         'classnum',     'serial',     '',      '', '', '', 
6798         'classname',   'varchar',     '', $char_d, '', '', 
6799         'disabled',       'char', 'NULL',       1, '', '', 
6800       ],
6801       'primary_key' => 'classnum',
6802       'unique'      => [],
6803       'index'       => [ ['disabled'] ],
6804     },
6805
6806     'vend_bill' => {
6807       'columns' => [
6808         'vendbillnum',    'serial',     '',      '', '', '', 
6809         'vendnum',           'int',     '',      '', '', '', 
6810         #'_date',        @date_type,                  '', '', 
6811         '_date',     'int', '', '',                   '', '', 
6812         'charged',     @money_type,                  '', '', 
6813       ],
6814       'primary_key'  => 'vendbillnum',
6815       'unique'       => [],
6816       'index'        => [ ['vendnum'], ['_date'], ],
6817       'foreign_keys' => [
6818                           { columns    => [ 'vendnum' ],
6819                             table      => 'vend_main',
6820                           },
6821                         ],
6822     },
6823
6824     'vend_pay' => {
6825       'columns' => [
6826         'vendpaynum',   'serial',    '',       '', '', '',
6827         'vendnum',         'int',    '',       '', '', '', 
6828         #'_date',     @date_type,                   '', '', 
6829         '_date',     'int', '', '',                   '', '', 
6830         'paid',      @money_type,                  '', '', 
6831       ],
6832       'primary_key'  => 'vendpaynum',
6833       'unique'       => [],
6834       'index'        => [ [ 'vendnum' ], [ '_date' ], ],
6835       'foreign_keys' => [
6836                           { columns    => [ 'vendnum' ],
6837                             table      => 'vend_main',
6838                           },
6839                         ],
6840     },
6841
6842     'vend_bill_pay' => {
6843       'columns' => [
6844         'vendbillpaynum', 'serial',     '',   '', '', '', 
6845         'vendbillnum',       'int',     '',   '', '', '', 
6846         'vendpaynum',        'int',     '',   '', '', '', 
6847         'amount',  @money_type, '', '', 
6848         #? '_date',   @date_type, '', '', 
6849       ],
6850       'primary_key'  => 'vendbillpaynum',
6851       'unique'       => [],
6852       'index'        => [ [ 'vendbillnum' ], [ 'vendpaynum' ] ],
6853       'foreign_keys' => [
6854                           { columns    => [ 'vendbillnum' ],
6855                             table      => 'vend_bill',
6856                           },
6857                           { columns    => [ 'vendpaynum' ],
6858                             table      => 'vend_pay',
6859                           },
6860                         ],
6861     },
6862
6863     %{ tables_hashref_torrus() },
6864
6865     # tables of ours for doing torrus virtual port combining
6866     'torrus_srvderive' => {
6867       'columns' => [
6868         'derivenum',     'serial',     '', '', '', '',
6869         'serviceid',    'varchar',     '', 64, '', '', #srvexport / reportfields
6870         'last_srv_date',   'date', 'NULL', '', '', '',
6871       ],
6872       'primary_key' => 'derivenum',
6873       'unique' => [ ['serviceid'] ],
6874       'index'  => [],
6875     },
6876
6877     'torrus_srvderive_component' => {
6878       'columns' => [
6879         'componentnum', 'serial', '', '', '', '',
6880         'derivenum',       'int', '', '', '', '',
6881         'serviceid',   'varchar', '', 64, '', '', #srvexport / reportfields
6882       ],
6883       'primary_key'  => 'componentnum',
6884       'unique'       => [ [ 'derivenum', 'serviceid' ], ],
6885       'index'        => [ [ 'derivenum', ], ],
6886       'foreign_keys' => [
6887                           { columns    => [ 'derivenum' ],
6888                             table      => 'torrus_srvderive',
6889                           },
6890                         ],
6891     },
6892
6893     'invoice_mode' => {
6894       'columns' => [
6895         'modenum',      'serial', '', '', '', '',
6896         'agentnum',        'int', 'NULL', '', '', '',
6897         'modename',    'varchar', '', 32, '', '',
6898       ],
6899       'primary_key' => 'modenum',
6900       'unique'      => [ ],
6901       'index'       => [ ],
6902       'foreign_keys' => [
6903                           { columns    => [ 'agentnum' ],
6904                             table      => 'agent',
6905                           },
6906                         ],
6907     },
6908
6909     'invoice_conf' => {
6910       'columns' => [
6911         'confnum',              'serial',   '', '', '', '',
6912         'modenum',              'int',      '', '', '', '',
6913         'locale',               'varchar',  'NULL', 16, '', '',
6914         'notice_name',          'varchar',  'NULL', 64, '', '',
6915         'subject',              'varchar',  'NULL', 64, '', '',
6916         'htmlnotes',            'text',     'NULL', '', '', '',
6917         'htmlfooter',           'text',     'NULL', '', '', '',
6918         'htmlsummary',          'text',     'NULL', '', '', '',
6919         'htmlreturnaddress',    'text',     'NULL', '', '', '',
6920         'latexnotes',           'text',     'NULL', '', '', '',
6921         'latexfooter',          'text',     'NULL', '', '', '',
6922         'latexsummary',         'text',     'NULL', '', '', '',
6923         'latexsmallfooter',     'text',     'NULL', '', '', '',
6924         'latexreturnaddress',   'text',     'NULL', '', '', '',
6925         'with_latexcoupon',     'char',     'NULL', '1', '', '',
6926         'htmlwatermark',        'text',     'NULL', '', '', '',
6927         'latexwatermark',       'text',     'NULL', '', '', '',
6928         'lpr',                  'varchar',  'NULL', $char_d, '', '',
6929       ],
6930       'primary_key'  => 'confnum',
6931       'unique'       => [ [ 'modenum', 'locale' ] ],
6932       'index'        => [ ],
6933       'foreign_keys' => [
6934                           { columns    => [ 'modenum' ],
6935                             table      => 'invoice_mode',
6936                           },
6937                         ],
6938     },
6939
6940     'export_batch' => {
6941       'columns' => [
6942         'batchnum',    'serial',     '',      '', '', '',
6943         'exportnum',      'int',     '',      '', '', '',
6944         '_date',          'int',     '',      '', '', '',
6945         'status',     'varchar', 'NULL',      32, '', '',
6946         'statustext',    'text', 'NULL',      '', '', '',
6947       ],
6948       'primary_key'  => 'batchnum',
6949       'unique'       => [],
6950       'index'        => [ [ 'exportnum' ], [ 'status' ] ],
6951       'foreign_keys' => [
6952                           { columns    => [ 'exportnum' ],
6953                             table      => 'part_export',
6954                             references => [ 'exportnum' ]
6955                           },
6956                         ],
6957     },
6958
6959     'export_batch_item' => {
6960       'columns' => [
6961         'itemnum',     'serial',     '',      '', '', '',
6962         'batchnum',       'int',     '',      '', '', '',
6963         'svcnum',         'int',     '',      '', '', '',
6964         'action',     'varchar',     '',      32, '', '',
6965         'data',          'text', 'NULL',      '', '', '',
6966         'frozen',        'char', 'NULL',       1, '', '',
6967       ],
6968       'primary_key'  => 'itemnum',
6969       'unique'       => [],
6970       'index'        => [ [ 'batchnum' ], [ 'svcnum' ] ],
6971       'foreign_keys' => [
6972                           { columns    => [ 'batchnum' ],
6973                             table      => 'export_batch',
6974                             references => [ 'batchnum' ]
6975                           },
6976                         ],
6977     },
6978
6979     # lookup table for states, similar to msa and lata
6980     'state' => {
6981       'columns' => [
6982         'statenum', 'int',  '', '', '', '', 
6983         'country',  'char', '',  2, '', '',
6984         'state',    'char', '', $char_d, '', '', 
6985         'fips',     'char', '',  3, '', '',
6986       ],
6987       'primary_key' => 'statenum',
6988       'unique' => [ [ 'country', 'state' ], ],
6989       'index' => [],
6990     },
6991
6992     # eventually link to tower/sector?
6993     'deploy_zone' => {
6994       'columns' => [
6995         'zonenum',        'serial',  '',     '',      '', '',
6996         'description',    'char',    'NULL', $char_d, '', '',
6997         'agentnum',       'int',     '',     '',      '', '',
6998         'dbaname',        'char',    'NULL', $char_d, '', '',
6999         'zonetype',       'char',    '',     1,       '', '',
7000         'technology',     'int',     '',     '',      '', '',
7001         'spectrum',       'int',     'NULL', '',      '', '',
7002         'adv_speed_up',   'decimal', '',     '10,3', '0', '',
7003         'adv_speed_down', 'decimal', '',     '10,3', '0', '',
7004         'cir_speed_up',   'decimal', '',     '10,3', '0', '',
7005         'cir_speed_down', 'decimal', '',     '10,3', '0', '',
7006         'is_broadband',   'char',    'NULL', 1,       '', '',
7007         'is_voice',       'char',    'NULL', 1,       '', '',
7008         'is_consumer',    'char',    'NULL', 1,       '', '',
7009         'is_business',    'char',    'NULL', 1,       '', '',
7010         'active_date',    @date_type,                 '', '',
7011         'expire_date',    @date_type,                 '', '',
7012       ],
7013       'primary_key' => 'zonenum',
7014       'unique' => [],
7015       'index'  => [ [ 'agentnum' ] ],
7016       'foreign_keys' => [
7017                           { columns     => [ 'agentnum' ],
7018                             table       => 'agent',
7019                             references  => [ 'agentnum' ],
7020                           },
7021                         ],
7022     },
7023
7024     'deploy_zone_block' => {
7025       'columns' => [
7026         'blocknum',       'serial',  '',     '',      '', '',
7027         'zonenum',        'int',     '',     '',      '', '',
7028         'censusblock',    'char',    '',     15,      '', '',
7029         'censusyear',     'char',    '',      4,      '', '',
7030       ],
7031       'primary_key' => 'blocknum',
7032       'unique' => [],
7033       'index'  => [ [ 'zonenum' ] ],
7034       'foreign_keys' => [
7035                           { columns     => [ 'zonenum' ],
7036                             table       => 'deploy_zone',
7037                             references  => [ 'zonenum' ],
7038                           },
7039                         ],
7040     },
7041
7042     'deploy_zone_vertex' => {
7043       'columns' => [
7044         'vertexnum',      'serial',  '',     '',      '', '',
7045         'zonenum',        'int',     '',     '',      '', '',
7046         'latitude',       'decimal', '',     '10,7',  '', '', 
7047         'longitude',      'decimal', '',     '10,7',  '', '', 
7048       ],
7049       'primary_key' => 'vertexnum',
7050       'unique' => [ ],
7051       'index'  => [ ],
7052       'foreign_keys' => [
7053                           { columns     => [ 'zonenum' ],
7054                             table       => 'deploy_zone',
7055                             references  => [ 'zonenum' ],
7056                           },
7057                         ],
7058     },
7059
7060     'cacti_page' => {
7061       'columns' => [
7062         'cacti_pagenum',  'serial',   '',     '', '', '',
7063         'exportnum',      'int',      'NULL', '', '', '',
7064         'svcnum',         'int',      'NULL', '', '', '', 
7065         'graphnum',       'int',      'NULL', '', '', '', 
7066         'imported',       @date_type,             '', '',
7067         'content',        'text',     'NULL', '', '', '',
7068       ],
7069       'primary_key' => 'cacti_pagenum',
7070       'unique'  => [ ],
7071       'index'   => [ ['svcnum'], ['imported'] ],
7072       'foreign_keys' => [
7073                           { columns    => [ 'svcnum' ],
7074                             table      => 'cust_svc',
7075                             references => [ 'svcnum' ],
7076                           },
7077                           { columns    => [ 'exportnum' ],
7078                             table      => 'part_export',
7079                             references => [ 'exportnum' ],
7080                           },
7081                         ],
7082     },
7083
7084     # name type nullability length default local
7085
7086     #'new_table' => {
7087     #  'columns' => [
7088     #    'num', 'serial',       '', '', '', '',
7089     #  ],
7090     #  'primary_key' => 'num',
7091     #  'unique' => [],
7092     #  'index'  => [],
7093     #},
7094
7095   };
7096
7097 }
7098
7099 =back
7100
7101 =head1 BUGS
7102
7103 =head1 SEE ALSO
7104
7105 L<DBIx::DBSchema>
7106
7107 =cut
7108
7109 1;
7110