Merge branch 'master' of git.freeside.biz:/home/git/freeside
[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',   'char', 'NULL',      32, '', '',
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       ],
1889       'primary_key'  => 'prospectnum',
1890       'unique'       => [],
1891       'index'        => [ ['company'], ['agentnum'], ['disabled'], ['refnum'] ],
1892       'foreign_keys' => [
1893                           { columns    => [ 'agentnum' ],
1894                             table      => 'agent',
1895                           },
1896                           { columns    => [ 'custnum' ],
1897                             table      => 'cust_main',
1898                           },
1899                           { columns    => [ 'refnum' ],
1900                             table      => 'part_referral',
1901                           },
1902                         ],
1903     },
1904
1905     'quotation' => {
1906       'columns' => [
1907         #regular fields
1908         'quotationnum',   'serial',     '', '', '', '', 
1909         'prospectnum',       'int', 'NULL', '', '', '',
1910         'custnum',           'int', 'NULL', '', '', '',
1911         '_date',        @date_type,             '', '', 
1912         'disabled',         'char', 'NULL',  1, '', '', 
1913         'usernum',           'int', 'NULL', '', '', '',
1914         #'total',      @money_type,       '', '', 
1915         #'quotation_term', 'varchar', 'NULL', $char_d, '', '',
1916       ],
1917       'primary_key'  => 'quotationnum',
1918       'unique'       => [],
1919       'index'        => [ [ 'prospectnum' ], ['custnum'], ['disabled'], ],
1920       'foreign_keys' => [
1921                           { columns    => [ 'prospectnum' ],
1922                             table      => 'prospect_main',
1923                           },
1924                           { columns    => [ 'custnum' ],
1925                             table      => 'cust_main',
1926                           },
1927                           { columns    => [ 'usernum' ],
1928                             table      => 'access_user',
1929                           },
1930                         ],
1931     },
1932
1933     'quotation_pkg' => {
1934       'columns' => [
1935         'quotationpkgnum',   'serial',     '', '', '', '', 
1936         'quotationnum',         'int', 'NULL', '', '', '', #shouldn't be null,
1937                                                            # but history...
1938         'pkgpart',              'int',     '', '', '', '', 
1939         'locationnum',          'int', 'NULL', '', '', '',
1940         'start_date',      @date_type,             '', '', 
1941         'contract_end',    @date_type,             '', '',
1942         'quantity',             'int', 'NULL', '', '', '',
1943         'waive_setup',         'char', 'NULL',  1, '', '', 
1944         'unitsetup',     @money_typen,             '', '',
1945         'unitrecur',     @money_typen,             '', '',
1946       ],
1947       'primary_key'  => 'quotationpkgnum',
1948       'unique'       => [],
1949       'index'        => [ ['pkgpart'], ],
1950       'foreign_keys' => [
1951                           { columns    => [ 'quotationnum' ],
1952                             table      => 'quotation',
1953                           },
1954                           { columns    => [ 'pkgpart' ],
1955                             table      => 'part_pkg',
1956                           },
1957                           { columns    => [ 'locationnum' ],
1958                             table      => 'cust_location',
1959                           },
1960                         ],
1961     },
1962
1963     'quotation_pkg_discount' => {
1964       'columns' => [
1965         'quotationpkgdiscountnum', 'serial', '', '', '', '',
1966         'quotationpkgnum',            'int', '', '', '', '', 
1967         'discountnum',                'int', '', '', '', '',
1968         'setup_amount',        @money_typen,         '', '',
1969         'recur_amount',        @money_typen,         '', '',
1970         #'end_date',              @date_type,         '', '',
1971       ],
1972       'primary_key'  => 'quotationpkgdiscountnum',
1973       'unique'       => [],
1974       'index'        => [ [ 'quotationpkgnum' ], ], #[ 'discountnum' ] ],
1975       'foreign_keys' => [
1976                           { columns    => [ 'quotationpkgnum' ],
1977                             table      => 'quotation_pkg',
1978                           },
1979                           { columns    => [ 'discountnum' ],
1980                             table      => 'discount',
1981                           },
1982                         ],
1983     },
1984
1985     'quotation_pkg_tax' => {
1986       'columns' => [
1987         'quotationtaxnum',  'serial',     '',      '', '', '',
1988         'quotationpkgnum',     'int',     '',      '', '', '',
1989         'itemdesc',        'varchar',     '', $char_d, '', '',
1990         'taxnum',              'int',     '',      '', '', '', 
1991         'taxtype',         'varchar',     '', $char_d, '', '',
1992         'setup_amount',    @money_type,                '', '',
1993         'recur_amount',    @money_type,                '', '',
1994       ],
1995       'primary_key' => 'quotationtaxnum',,
1996       'unique' => [],
1997       'index'  => [ [ 'quotationpkgnum' ] ],
1998       'foreign_keys' => [
1999                           { columns    => [ 'quotationpkgnum' ],
2000                             table      => 'quotation_pkg',
2001                           },
2002                         ],
2003 },
2004
2005     'cust_location' => { #'location' now that its prospects too, but...
2006       'columns' => [
2007         'locationnum',      'serial',     '',      '', '', '',
2008         'prospectnum',         'int', 'NULL',      '', '', '',
2009         'custnum',             'int', 'NULL',      '', '', '',
2010         'locationname',    'varchar', 'NULL', $char_d, '', '',
2011         'address1',        'varchar',     '', $char_d, '', '', 
2012         'address2',        'varchar', 'NULL', $char_d, '', '', 
2013         'city',            'varchar',     '', $char_d, '', '', 
2014         'county',          'varchar', 'NULL', $char_d, '', '', 
2015         'state',           'varchar', 'NULL', $char_d, '', '', 
2016         'zip',             'varchar', 'NULL',      10, '', '', 
2017         'latitude',        'decimal', 'NULL',  '10,7', '', '', 
2018         'longitude',       'decimal', 'NULL',  '10,7', '', '', 
2019         'coord_auto',         'char', 'NULL',       1, '', '',
2020         'addr_clean',         'char', 'NULL',       1, '', '',
2021         'country',            'char',     '',       2, '', '', 
2022         'geocode',         'varchar', 'NULL',      20, '', '',
2023         'district',        'varchar', 'NULL',      20, '', '',
2024         'censustract',     'varchar', 'NULL',      20, '', '',
2025         'censusyear',         'char', 'NULL',       4, '', '',
2026         'location_type',   'varchar', 'NULL',      20, '', '',
2027         'location_number', 'varchar', 'NULL',      20, '', '',
2028         'location_kind',      'char', 'NULL',       1, '', '',
2029         'incorporated',       'char', 'NULL',       1, '', '',
2030         'disabled',           'char', 'NULL',       1, '', '', 
2031       ],
2032       'primary_key'  => 'locationnum',
2033       'unique'       => [],
2034       'index'        => [ [ 'prospectnum' ], [ 'custnum' ],
2035                           [ 'county' ], [ 'state' ], [ 'country' ], [ 'zip' ],
2036                           [ 'city' ], [ 'district' ]
2037                         ],
2038       'foreign_keys' => [
2039                           { columns    => [ 'prospectnum' ],
2040                             table      => 'prospect_main',
2041                           },
2042                           { columns    => [ 'custnum' ],
2043                             table      => 'cust_main',
2044                           },
2045                         ],
2046     },
2047
2048     'cust_main_invoice' => {
2049       'columns' => [
2050         'destnum',  'serial',  '',     '', '', '', 
2051         'custnum',  'int',  '',     '', '', '', 
2052         'dest',     'varchar', '',  $char_d, '', '', 
2053       ],
2054       'primary_key'  => 'destnum',
2055       'unique'       => [],
2056       'index'        => [ ['custnum'], ],
2057       'foreign_keys' => [
2058                           { columns    => [ 'custnum' ],
2059                             table      => 'cust_main',
2060                           },
2061                         ],
2062     },
2063
2064     'cust_main_credit_limit' => {
2065       'columns' => [
2066         'creditlimitnum',   'serial', '', '', '', '',
2067         'custnum',             'int', '', '', '', '', 
2068         '_date',          @date_type,         '', '', 
2069         'amount',       @money_typen,         '', '',
2070         #'amount_currency', 'char', 'NULL',  3, '', '',
2071         'credit_limit', @money_typen,         '', '',
2072         #'credit_limit_currency', 'char', 'NULL',  3, '', '',
2073       ],
2074       'primary_key'  => 'creditlimitnum',
2075       'unique'       => [],
2076       'index'        => [ ['custnum'], ],
2077       'foreign_keys' => [
2078                           { columns    => [ 'custnum' ],
2079                             table      => 'cust_main',
2080                           },
2081                         ],
2082     },
2083
2084     'cust_main_note' => {
2085       'columns' => [
2086         'notenum',   'serial',    '',  '', '', '', 
2087         'custnum',      'int',    '',  '', '', '', 
2088         'classnum',     'int', 'NULL', '', '', '', 
2089         '_date',          @date_type,      '', '', 
2090         'otaker',   'varchar', 'NULL', 32, '', '', 
2091         'usernum',      'int', 'NULL', '', '', '',
2092         'comments',    'text', 'NULL', '', '', '', 
2093         'sticky',       'int',     '', '',  0, '',
2094       ],
2095       'primary_key'  => 'notenum',
2096       'unique'       => [],
2097       'index'        => [ [ 'custnum' ], [ '_date' ], [ 'usernum' ], ],
2098       'foreign_keys' => [
2099                           { columns    => [ 'custnum' ],
2100                             table      => 'cust_main',
2101                           },
2102                           { columns    => [ 'classnum' ],
2103                             table      => 'cust_note_class',
2104                           },
2105                           { columns    => [ 'usernum' ],
2106                             table      => 'access_user',
2107                           },
2108                         ],
2109     },
2110
2111     'cust_note_class' => {
2112       'columns' => [
2113         'classnum',    'serial',   '',      '', '', '', 
2114         'classname',   'varchar',  '', $char_d, '', '', 
2115         'disabled',    'char', 'NULL',       1, '', '', 
2116       ],
2117       'primary_key' => 'classnum',
2118       'unique' => [],
2119       'index' => [ ['disabled'] ],
2120     },
2121
2122     'cust_category' => {
2123       'columns' => [
2124         'categorynum',   'serial',  '', '', '', '', 
2125         'categoryname',  'varchar', '', $char_d, '', '', 
2126         'weight',         'int', 'NULL',  '', '', '',
2127         'disabled',      'char', 'NULL',   1, '', '', 
2128       ],
2129       'primary_key' => 'categorynum',
2130       'unique' => [],
2131       'index' => [ ['disabled'] ],
2132     },
2133
2134     'cust_class' => {
2135       'columns' => [
2136         'classnum',     'serial',     '',      '', '', '', 
2137         'classname',   'varchar',     '', $char_d, '', '', 
2138         'categorynum',     'int', 'NULL',      '', '', '', 
2139         'tax',            'char', 'NULL',       1, '', '', 
2140         'disabled',       'char', 'NULL',       1, '', '', 
2141       ],
2142       'primary_key'  => 'classnum',
2143       'unique'       => [],
2144       'index'        => [ ['disabled'] ],
2145       'foreign_keys' => [
2146                           { columns    => [ 'categorynum' ],
2147                             table      => 'cust_category',
2148                           },
2149                         ],
2150     },
2151  
2152     'cust_tag' => {
2153       'columns' => [
2154         'custtagnum', 'serial', '', '', '', '',
2155         'custnum',       'int', '', '', '', '',
2156         'tagnum',        'int', '', '', '', '',
2157       ],
2158       'primary_key'  => 'custtagnum',
2159       'unique'       => [ [ 'custnum', 'tagnum' ] ],
2160       'index'        => [ [ 'custnum' ] ],
2161       'foreign_keys' => [
2162                           { columns    => [ 'custnum' ],
2163                             table      => 'cust_main',
2164                           },
2165                           { columns    => [ 'tagnum' ],
2166                             table      => 'part_tag',
2167                           },
2168                         ],
2169     },
2170
2171     'part_tag' => {
2172       'columns' => [
2173         'tagnum',    'serial',     '',      '', '', '',
2174         'tagname',  'varchar',     '', $char_d, '', '',
2175         'tagdesc',  'varchar', 'NULL', $char_d, '', '',
2176         'tagcolor', 'varchar', 'NULL',       6, '', '',
2177         'by_default',  'char', 'NULL',       1, '', '',
2178         'disabled',    'char', 'NULL',       1, '', '', 
2179       ],
2180       'primary_key' => 'tagnum',
2181       'unique'      => [], #[ [ 'tagname' ] ], #?
2182       'index'       => [ [ 'disabled' ] ],
2183     },
2184
2185     'cust_main_exemption' => {
2186       'columns' => [
2187         'exemptionnum',   'serial',     '',      '', '', '',
2188         'custnum',           'int',     '',      '', '', '', 
2189         'taxname',       'varchar',     '', $char_d, '', '',
2190         'exempt_number', 'varchar', 'NULL', $char_d, '', '',
2191         #start/end dates?  for reporting?
2192       ],
2193       'primary_key'  => 'exemptionnum',
2194       'unique'       => [],
2195       'index'        => [ [ 'custnum' ] ],
2196       'foreign_keys' => [
2197                           { columns    => [ 'custnum' ],
2198                             table      => 'cust_main',
2199                           },
2200                         ],
2201     },
2202
2203     'cust_tax_adjustment' => {
2204       'columns' => [
2205         'adjustmentnum', 'serial',     '',      '', '', '',
2206         'custnum',          'int',     '',      '', '', '',
2207         'taxname',      'varchar',     '', $char_d, '', '',
2208         'amount',     @money_type,                  '', '', 
2209         'currency',        'char', 'NULL',       3, '', '',
2210         'comment',      'varchar', 'NULL', $char_d, '', '', 
2211         'billpkgnum',       'int', 'NULL',      '', '', '',
2212         #more?  no cust_bill_pkg_tax_location?
2213       ],
2214       'primary_key'  => 'adjustmentnum',
2215       'unique'       => [],
2216       'index'        => [ [ 'custnum' ], [ 'billpkgnum' ] ],
2217       'foreign_keys' => [
2218                           { columns    => [ 'custnum' ],
2219                             table      => 'cust_main',
2220                           },
2221                           { columns    => [ 'billpkgnum' ],
2222                             table      => 'cust_bill_pkg',
2223                           },
2224                         ],
2225     },
2226
2227     'cust_main_county' => { #district+city+county+state+country are checked 
2228                             #off the cust_main_county for validation and to 
2229                             #provide a tax rate.
2230       'columns' => [
2231         'taxnum',    'serial',     '',      '', '', '', 
2232         'district', 'varchar', 'NULL',      20, '', '',
2233         'city',     'varchar', 'NULL', $char_d, '', '',
2234         'county',   'varchar', 'NULL', $char_d, '', '', 
2235         'state',    'varchar', 'NULL', $char_d, '', '', 
2236         'country',     'char',     '',       2, '', '', 
2237         'taxclass', 'varchar', 'NULL', $char_d, '', '', 
2238         'exempt_amount', @money_type,            '', '', 
2239         'exempt_amount_currency', 'char', 'NULL', 3, '', '',
2240         'tax',         'real',     '',      '', '', '', #tax %
2241         'taxname',  'varchar', 'NULL', $char_d, '', '', 
2242         'setuptax',    'char', 'NULL',       1, '', '', # Y = setup tax exempt
2243         'recurtax',    'char', 'NULL',       1, '', '', # Y = recur tax exempt
2244       ],
2245       'primary_key' => 'taxnum',
2246       'unique' => [],
2247   #    'unique' => [ ['taxnum'], ['state', 'county'] ],
2248       'index' => [ [ 'district' ], [ 'city' ], [ 'county' ], [ 'state' ], 
2249                    [ 'country' ],
2250                    [ 'taxclass' ],
2251                  ],
2252     },
2253
2254     'tax_rate'    => {
2255       'columns' => [
2256         'taxnum',       'serial',     '',      '', '', '', 
2257         'geocode',     'varchar', 'NULL', $char_d, '', '',#cch provides 10 char
2258         'data_vendor', 'varchar', 'NULL', $char_d, '', '',#auto update source
2259         'location',    'varchar', 'NULL', $char_d, '', '',#provided by tax authority
2260         'taxclassnum', 'int',     'NULL',      '', '', '', 
2261         'effective_date', @date_type, '', '', 
2262         'tax',        @taxrate_type,      '', '',        # tax %
2263         'excessrate', @taxrate_typen,     '', '',        # second tax %
2264         'taxbase',    @money_typen, '', '',              # amount at first tax rate
2265         'taxmax',     @money_typen, '', '',              # maximum about at both rates
2266         'usetax',        @taxrate_typen,     '', '',     # tax % when non-local
2267         'useexcessrate', @taxrate_typen,     '', '',     # second tax % when non-local
2268         'unittype',    'int',  'NULL', '', '', '',      # for fee
2269         'fee',         @taxrate_typen,     '', '',      # amount tax per unit
2270         'excessfee',   @taxrate_typen,     '', '',      # second amount tax per unit
2271         'feebase',     @taxrate_typen,     '', '',      # units taxed at first rate
2272         'feemax',      @taxrate_typen,     '', '',      # maximum number of unit taxed
2273         'maxtype',     'int',  'NULL', '', '', '',      # indicator of how thresholds accumulate
2274         'taxname', 'varchar',  'NULL', $char_d, '', '', # may appear on invoice
2275         'taxauth',     'int',  'NULL', '', '', '',      # tax authority
2276         'basetype',    'int',  'NULL', '', '', '', # indicator of basis for tax
2277         'passtype',    'int',  'NULL', '', '', '', # indicator declaring how item should be shown
2278         'passflag',    'char', 'NULL', 1, '', '',  # Y = required to list as line item, N = Prohibited
2279         'setuptax',    'char', 'NULL', 1, '', '',  # Y = setup tax exempt
2280         'recurtax',    'char', 'NULL', 1, '', '',  # Y = recur tax exempt
2281         'inoutcity',   'char', 'NULL', 1, '', '',  # '', 'I', or 'O'
2282         'inoutlocal',  'char', 'NULL', 1, '', '',  # '', 'I', or 'O'
2283         'manual',      'char', 'NULL', 1, '', '',  # Y = manually edited
2284         'disabled',    'char', 'NULL', 1, '', '',  # Y = tax disabled
2285       ],
2286       'primary_key'  => 'taxnum',
2287       'unique'       => [],
2288       'index'        => [ ['taxclassnum'], ['data_vendor', 'geocode'] ],
2289       'foreign_keys' => [
2290                           { columns    => [ 'taxclassnum' ],
2291                             table      => 'tax_class',
2292                           },
2293                         ],
2294     },
2295
2296     'tax_rate_location' => { 
2297       'columns' => [
2298         'taxratelocationnum', 'serial',  '',     '', '', '', 
2299         'data_vendor',        'varchar', 'NULL', $char_d, '', '',
2300         'geocode',            'varchar', '',     20,      '', '', 
2301         'city',               'varchar', 'NULL', $char_d, '', '',
2302         'county',             'varchar', 'NULL', $char_d, '', '',
2303         'state',              'char',    'NULL',       2, '', '', 
2304         'country',            'char',    'NULL',       2, '', '',
2305         'disabled',           'char',    'NULL', 1, '', '',
2306       ],
2307       'primary_key' => 'taxratelocationnum',
2308       'unique' => [],
2309       'index' => [ [ 'data_vendor', 'geocode', 'disabled' ] ],
2310     },
2311
2312     'cust_tax_location' => { 
2313       'columns' => [
2314         'custlocationnum', 'serial',  '',     '', '', '', 
2315         'data_vendor',     'varchar', 'NULL', $char_d, '', '', # update source
2316         'city',            'varchar', 'NULL', $char_d, '', '',
2317         'postalcity',      'varchar', 'NULL', $char_d, '', '',
2318         'county',          'varchar', 'NULL', $char_d, '', '',
2319         'zip',             'char',    'NULL', 5,  '', '', 
2320         'state',           'char',    '',     2,  '', '', 
2321         'country',         'char',    'NULL', 2,  '', '', # should not actually be NULL, but cch...
2322         'ziphi',           'char',    'NULL', 10, '', '',
2323         'ziplo',           'char',    'NULL', 10, '', '',
2324         'plus4hi',         'char',    'NULL', 4,  '', '', 
2325         'plus4lo',         'char',    'NULL', 4,  '', '', 
2326         'default_location','char',    'NULL', 1,  '', '', # Y = default for zip
2327         'cityflag',        'char',    'NULL', 1,  '', '', # I(n)/O(out)/B(oth)/NULL
2328         'geocode',         'varchar', '',    20,  '', '', 
2329       ],
2330       'primary_key' => 'custlocationnum',
2331       'unique' => [],
2332       'index' => [ [ 'zip', 'plus4lo', 'plus4hi', 'ziphi', 'ziplo' ] ],
2333     },
2334
2335     'tax_class' => { 
2336       'columns' => [
2337         'taxclassnum',  'serial',  '',            '', '', '',
2338         'data_vendor',  'varchar', 'NULL',   $char_d, '', '',
2339         'taxclass',     'varchar', '',       $char_d, '', '',          
2340         'description',  'varchar', '',     2*$char_d, '', '',          
2341       ],
2342       'primary_key' => 'taxclassnum',
2343       'unique' => [ [ 'data_vendor', 'taxclass' ] ],
2344       'index' => [],
2345     },
2346
2347     'tax_status' => {
2348       'columns' => [
2349         'taxstatusnum', 'serial', '',             '', '', '',
2350         'data_vendor',  'varchar', 'NULL',   $char_d, '', '',
2351         'taxstatus',    'varchar', '',       $char_d, '', '',          
2352         'description',  'varchar', '',       $char_d, '', '',
2353       ],
2354       'primary_key' => 'taxstatusnum',
2355       'unique'      => [ [ 'data_vendor', 'taxstatus' ] ],
2356       'index' => [],
2357     },
2358
2359     'cust_pay_pending' => {
2360       'columns' => [
2361         'paypendingnum',      'serial',     '',      '', '', '',
2362         'custnum',               'int',     '',      '', '', '', 
2363         'paid',            @money_type,                  '', '', 
2364         'currency',             'char', 'NULL',       3, '', '',
2365         '_date',            @date_type,                  '', '', 
2366         'payby',                'char',     '',       4, '', '',
2367         'payinfo',           'varchar', 'NULL',     512, '', '',
2368         'paymask',           'varchar', 'NULL', $char_d, '', '', 
2369         'paydate',           'varchar', 'NULL',     10, '', '', 
2370         'recurring_billing', 'varchar', 'NULL', $char_d, '', '',
2371         'payunique',         'varchar', 'NULL', $char_d, '', '', #separate paybatch "unique" functions from current usage
2372
2373         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
2374         'status',       'varchar',     '', $char_d, '', '', 
2375         'session_id',   'varchar', 'NULL', 1024, '', '', # SHA-512-hex
2376         'statustext',   'text',    'NULL',  '', '', '', 
2377         'gatewaynum',   'int',     'NULL',  '', '', '',
2378         #'cust_balance', @money_type,            '', '',
2379         'paynum',       'int',     'NULL',  '', '', '',
2380         'void_paynum',  'int',     'NULL',  '', '', '',
2381         'jobnum',    'bigint',     'NULL',  '', '', '', 
2382         'invnum',       'int',     'NULL',  '', '', '',
2383         'manual',       'char',    'NULL',   1, '', '',
2384         'discount_term','int',     'NULL',  '', '', '',
2385         'failure_status','varchar','NULL',  16, '', '',
2386       ],
2387       'primary_key'  => 'paypendingnum',
2388       'unique'       => [ [ 'payunique' ] ],
2389       'index'        => [ [ 'custnum' ], [ 'status' ],
2390                           ['paynum'], ['void_paynum'], ['jobnum'], ['invnum'],
2391                         ],
2392       'foreign_keys' => [
2393                           { columns    => [ 'custnum' ],
2394                             table      => 'cust_main',
2395                           },
2396                           { columns    => [ 'pkgnum' ],
2397                             table      => 'cust_pkg',
2398                           },
2399                           { columns    => [ 'gatewaynum' ],
2400                             table      => 'payment_gateway',
2401                           },
2402                           { columns    => [ 'paynum' ],
2403                             table      => 'cust_pay',
2404                           },
2405                           { columns    => [ 'void_paynum' ],
2406                             table      => 'cust_pay_void',
2407                             references => [ 'paynum' ],
2408                           },
2409                           { columns    => [ 'jobnum' ],
2410                             table      => 'queue',
2411                           },
2412                           { columns    => [ 'invnum' ],
2413                             table      => 'cust_bill',
2414                           },
2415                         ],
2416     },
2417
2418     'cust_pay' => {
2419       'columns' => [
2420         'paynum',       'serial',    '',       '', '', '',
2421         'custnum',         'int',    '',       '', '', '', 
2422         '_date',     @date_type,                   '', '', 
2423         'paid',      @money_type,                  '', '', 
2424         'currency',       'char', 'NULL',       3, '', '',
2425         'otaker',      'varchar', 'NULL',      32, '', '',
2426         'usernum',         'int', 'NULL',      '', '', '',
2427         'payby',          'char',     '',       4, '', '',
2428         'payinfo',     'varchar', 'NULL',     512, '', '',
2429         'paymask',     'varchar', 'NULL', $char_d, '', '', 
2430         'paydate',     'varchar', 'NULL',      10, '', '', 
2431         'paybatch',    'varchar', 'NULL', $char_d, '', '',#for auditing purposes
2432         'payunique',   'varchar', 'NULL', $char_d, '', '',#separate paybatch "unique" functions from current usage
2433         'closed',         'char', 'NULL',       1, '', '', 
2434         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
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',     '', $char_d, '', '', 
2644         'state',         'varchar', 'NULL', $char_d, '', '', 
2645         'zip',           'varchar', 'NULL',      10, '', '', 
2646         'country',          'char',     '',       2, '', '', 
2647         'payby',            'char',     '',       4, '', '',
2648         'payinfo',       'varchar', 'NULL',     512, '', '', 
2649         #'exp',          @date_type,                  '', '',
2650         'exp',           'varchar', 'NULL',      11, '', '', 
2651         'payname',       'varchar', 'NULL', $char_d, '', '', 
2652         'amount',      @money_type,                  '', '', 
2653         'currency',         'char', 'NULL',       3, '', '',
2654         'status',        'varchar', 'NULL', $char_d, '', '', 
2655         'failure_status','varchar', 'NULL',      16, '', '',
2656         'error_message', 'varchar', 'NULL', $char_d, '', '',
2657       ],
2658       'primary_key'  => 'paybatchnum',
2659       'unique'       => [],
2660       'index'        => [ ['batchnum'], ['invnum'], ['custnum'] ],
2661       'foreign_keys' => [
2662                           { columns    => [ 'batchnum' ],
2663                             table      => 'pay_batch',
2664                           },
2665                           { columns    => [ 'invnum' ],
2666                             table      => 'cust_bill',
2667                           },
2668                           { columns    => [ 'custnum' ],
2669                             table      => 'cust_main',
2670                           },
2671                         ],
2672     },
2673
2674     'fcc477map' => {
2675       'columns' => [
2676         'formkey',   'varchar',     '', 255, '', '',
2677         'formvalue',    'text', 'NULL',  '', '', '',
2678       ],
2679       'primary_key' => 'formkey',
2680       'unique'      => [],
2681       'index'       => [],
2682     },
2683
2684     'cust_pkg' => {
2685       'columns' => [
2686         'pkgnum',           'serial',     '', '', '', '', 
2687         'custnum',             'int',     '', '', '', '', 
2688         'pkgpart',             'int',     '', '', '', '', 
2689         'pkgbatch',        'varchar', 'NULL', $char_d, '', '',
2690         'contactnum',          'int', 'NULL', '', '', '', 
2691         'locationnum',         'int', 'NULL', '', '', '',
2692         'otaker',          'varchar', 'NULL', 32, '', '', 
2693         'usernum',             'int', 'NULL', '', '', '',
2694         'salesnum',            'int', 'NULL', '', '', '', 
2695         'order_date',     @date_type,             '', '', 
2696         'start_date',     @date_type,             '', '', 
2697         'setup',          @date_type,             '', '', 
2698         'bill',           @date_type,             '', '', 
2699         'last_bill',      @date_type,             '', '', 
2700         'susp',           @date_type,             '', '', 
2701         'adjourn',        @date_type,             '', '', 
2702         'resume',         @date_type,             '', '', 
2703         'cancel',         @date_type,             '', '', 
2704         'uncancel',       @date_type,             '', '', 
2705         'uncancel_pkgnum',     'int', 'NULL', '', '', '',
2706         'expire',         @date_type,             '', '', 
2707         'contract_end',   @date_type,             '', '',
2708         'dundate',        @date_type,             '', '',
2709         'change_date',    @date_type,             '', '',
2710         'change_pkgnum',       'int', 'NULL', '', '', '',
2711         'change_pkgpart',      'int', 'NULL', '', '', '',
2712         'change_locationnum',  'int', 'NULL', '', '', '',
2713         'change_custnum',      'int', 'NULL', '', '', '',
2714         'main_pkgnum',         'int', 'NULL', '', '', '',
2715         'pkglinknum',          'int', 'NULL', '', '', '',
2716         'manual_flag',        'char', 'NULL',  1, '', '', 
2717         'no_auto',            'char', 'NULL',  1, '', '', 
2718         'quantity',            'int', 'NULL', '', '', '',
2719         'agent_pkgid',     'varchar', 'NULL', $char_d, '', '',
2720         'waive_setup',        'char', 'NULL',  1, '', '', 
2721         'recur_show_zero',    'char', 'NULL',  1, '', '',
2722         'setup_show_zero',    'char', 'NULL',  1, '', '',
2723         'change_to_pkgnum',    'int', 'NULL', '', '', '',
2724         'separate_bill',      'char', 'NULL',  1, '', '',
2725       ],
2726       'primary_key'  => 'pkgnum',
2727       'unique'       => [],
2728       'index'        => [ ['custnum'], ['pkgpart'], ['pkgbatch'],
2729                           ['locationnum'], ['usernum'], ['agent_pkgid'],
2730                           ['order_date'], [ 'start_date' ], ['setup'], ['bill'],
2731                           ['last_bill'], ['susp'], ['adjourn'], ['resume'],
2732                           ['cancel'], ['expire'], ['contract_end'],
2733                           ['change_date'],
2734                           ['no_auto'],
2735                           #['contactnum'],
2736                           ['salesnum'],
2737                           #['uncancel_pkgnum'],
2738                           #['change_pkgnum'], ['change_locationnum'],
2739                           #['change_custnum'],
2740                           ['main_pkgnum'],
2741                           #['pkglinknum'], ['change_to_pkgnum'],
2742                         ],
2743       'foreign_keys' => [
2744                           { columns    => [ 'custnum' ],
2745                             table      => 'cust_main',
2746                           },
2747                           { columns    => [ 'pkgpart' ],
2748                             table      => 'part_pkg',
2749                           },
2750                           { columns    => [ 'contactnum' ],
2751                             table      => 'contact',
2752                           },
2753                           { columns    => [ 'locationnum' ],
2754                             table      => 'cust_location',
2755                           },
2756                           { columns    => [ 'usernum' ],
2757                             table      => 'access_user',
2758                           },
2759                           { columns    => [ 'salesnum' ],
2760                             table      => 'sales',
2761                           },
2762                           { columns    => [ 'uncancel_pkgnum' ],
2763                             table      => 'cust_pkg',
2764                             references => [ 'pkgnum' ],
2765                           },
2766                           { columns    => [ 'change_pkgnum' ],
2767                             table      => 'cust_pkg',
2768                             references => [ 'pkgnum' ],
2769                           },
2770                           { columns    => [ 'change_pkgpart' ],
2771                             table      => 'part_pkg',
2772                             references => [ 'pkgpart' ],
2773                           },
2774                           { columns    => [ 'change_locationnum' ],
2775                             table      => 'cust_location',
2776                             references => [ 'locationnum' ],
2777                           },
2778                           { columns    => [ 'change_custnum' ],
2779                             table      => 'cust_main',
2780                             references => [ 'custnum' ],
2781                           },
2782                           { columns    => [ 'main_pkgnum' ],
2783                             table      => 'cust_pkg',
2784                             references => [ 'pkgnum' ],
2785                           },
2786                           { columns    => [ 'pkglinknum' ],
2787                             table      => 'part_pkg_link',
2788                           },
2789                           { columns    => [ 'change_to_pkgnum' ],
2790                             table      => 'cust_pkg',
2791                             references => [ 'pkgnum' ],
2792                           },
2793                         ],
2794    },
2795
2796     'cust_pkg_option' => {
2797       'columns' => [
2798         'optionnum', 'serial', '', '', '', '', 
2799         'pkgnum', 'int', '', '', '', '', 
2800         'optionname', 'varchar', '', $char_d, '', '', 
2801         'optionvalue', 'text', 'NULL', '', '', '', 
2802       ],
2803       'primary_key'  => 'optionnum',
2804       'unique'       => [],
2805       'index'        => [ [ 'pkgnum' ], [ 'optionname' ] ],
2806       'foreign_keys' => [
2807                           { columns    => [ 'pkgnum' ],
2808                             table      => 'cust_pkg',
2809                           },
2810                         ],
2811     },
2812
2813     'cust_pkg_detail' => {
2814       'columns' => [
2815         'pkgdetailnum', 'serial', '',        '', '', '',
2816         'pkgnum',          'int', '',        '', '', '',
2817         'detail',      'varchar', '', 2*$char_d, '', '', 
2818         'detailtype',     'char', '',         1, '', '', #"I"nvoice or "C"omment
2819         'weight',          'int', '',        '', '', '',
2820       ],
2821       'primary_key'  => 'pkgdetailnum',
2822       'unique'       => [],
2823       'index'        => [ [ 'pkgnum', 'detailtype' ] ],
2824       'foreign_keys' => [
2825                           { columns    => [ 'pkgnum' ],
2826                             table      => 'cust_pkg',
2827                           },
2828                         ],
2829     },
2830
2831     'cust_pkg_reason' => {
2832       'columns' => [
2833         'num',      'serial',    '',   '', '', '', 
2834         'pkgnum',   'int',    '',   '', '', '', 
2835         'reasonnum','int',    '',   '', '', '', 
2836         'action',   'char', 'NULL', 1, '', '',     #should not be nullable
2837         'otaker',   'varchar', 'NULL', 32, '', '', 
2838         'usernum',   'int', 'NULL', '', '', '',
2839         'date',     @date_type, '', '', 
2840       ],
2841       'primary_key'  => 'num',
2842       'unique'       => [],
2843       'index'        => [ ['pkgnum'], ['reasonnum'], ['action'], ['usernum'], ],
2844       'foreign_keys' => [
2845                           { columns    => [ 'pkgnum' ],
2846                             table      => 'cust_pkg',
2847                           },
2848                           { columns    => [ 'reasonnum' ],
2849                             table      => 'reason',
2850                           },
2851                           { columns    => [ 'usernum' ],
2852                             table      => 'access_user',
2853                           },
2854                         ],
2855     },
2856
2857     'cust_pkg_reason_fee' => {
2858       'columns' => [
2859         'pkgreasonfeenum', 'serial', '', '', '', '',
2860         'pkgreasonnum',       'int', '', '', '', '',
2861         'billpkgnum',         'int', 'NULL', '', '', '',
2862         'feepart',            'int', '', '', '', '',
2863         'nextbill',          'char', 'NULL',  1, '', '',
2864       ],
2865       'primary_key'  => 'pkgreasonfeenum',
2866       'unique' => [ [ 'billpkgnum' ], [ 'pkgreasonnum' ] ], # one-to-one link
2867       'index'  => [ [ 'feepart' ] ],
2868       'foreign_keys' => [
2869                           { columns     => [ 'pkgreasonnum' ],
2870                             table       => 'cust_pkg_reason',
2871                             references  => [ 'num' ],
2872                           },
2873                           { columns     => [ 'feepart' ],
2874                             table       => 'part_fee',
2875                           },
2876                           # can't link billpkgnum, because of voids
2877       ],
2878     },
2879
2880     'cust_pkg_discount' => {
2881       'columns' => [
2882         'pkgdiscountnum', 'serial', '',        '', '', '',
2883         'pkgnum',            'int', '',        '', '', '', 
2884         'discountnum',       'int', '',        '', '', '',
2885         'months_used',   'decimal', 'NULL', '7,4', '', '',
2886         'end_date',     @date_type,                '', '',
2887         'otaker',        'varchar', 'NULL',    32, '', '', 
2888         'usernum',           'int', 'NULL',    '', '', '',
2889         'disabled',         'char', 'NULL',     1, '', '', 
2890       ],
2891       'primary_key'  => 'pkgdiscountnum',
2892       'unique'       => [],
2893       'index'        => [ [ 'pkgnum' ], [ 'discountnum' ], [ 'usernum' ], ],
2894       'foreign_keys' => [
2895                           { columns    => [ 'pkgnum' ],
2896                             table      => 'cust_pkg',
2897                           },
2898                           { columns    => [ 'discountnum' ],
2899                             table      => 'discount',
2900                           },
2901                           { columns    => [ 'usernum' ],
2902                             table      => 'access_user',
2903                           },
2904                         ],
2905     },
2906
2907     'cust_pkg_usage' => {
2908       'columns' => [
2909         'pkgusagenum', 'serial', '', '', '', '',
2910         'pkgnum',         'int', '', '', '', '',
2911         'minutes',        'double precision', '', '', '', '',
2912         'pkgusagepart',   'int', '', '', '', '',
2913       ],
2914       'primary_key'  => 'pkgusagenum',
2915       'unique'       => [],
2916       'index'        => [ [ 'pkgnum' ], [ 'pkgusagepart' ] ],
2917       'foreign_keys' => [
2918                           { columns    => [ 'pkgnum' ],
2919                             table      => 'cust_pkg',
2920                           },
2921                           { columns    => [ 'pkgusagepart' ],
2922                             table      => 'part_pkg_usage',
2923                           },
2924                         ],
2925     },
2926
2927     'cdr_cust_pkg_usage' => {
2928       'columns' => [
2929         'cdrusagenum', 'bigserial', '', '', '', '',
2930         'acctid',      'bigint',    '', '', '', '',
2931         'pkgusagenum', 'int',       '', '', '', '',
2932         'minutes',     'double precision',       '', '', '', '',
2933       ],
2934       'primary_key'  => 'cdrusagenum',
2935       'unique'       => [],
2936       'index'        => [ [ 'pkgusagenum' ], [ 'acctid' ] ],
2937       'foreign_keys' => [
2938                           { columns    => [ 'acctid' ],
2939                             table      => 'cdr',
2940                           },
2941                           { columns    => [ 'pkgusagenum' ],
2942                             table      => 'cust_pkg_usage',
2943                           },
2944                         ],
2945     },
2946
2947     'cust_bill_pkg_discount' => {
2948       'columns' => [
2949         'billpkgdiscountnum', 'serial',        '', '', '', '',
2950         'billpkgnum',            'int',        '', '', '', '', 
2951         'pkgdiscountnum',        'int',        '', '', '', '', 
2952         'amount',          @money_type,                '', '', 
2953         'months',            'decimal', 'NULL', '7,4', '', '',
2954       ],
2955       'primary_key'  => 'billpkgdiscountnum',
2956       'unique'       => [],
2957       'index'        => [ [ 'billpkgnum' ], [ 'pkgdiscountnum' ] ],
2958       'foreign_keys' => [
2959                           { columns    => [ 'billpkgnum' ],
2960                             table      => 'cust_bill_pkg',
2961                           },
2962                           { columns    => [ 'pkgdiscountnum' ],
2963                             table      => 'cust_pkg_discount',
2964                           },
2965                         ],
2966     },
2967
2968     'cust_bill_pkg_discount_void' => {
2969       'columns' => [
2970         'billpkgdiscountnum',    'int',        '', '', '', '',
2971         'billpkgnum',            'int',        '', '', '', '', 
2972         'pkgdiscountnum',        'int',        '', '', '', '', 
2973         'amount',          @money_type,                '', '', 
2974         'months',            'decimal', 'NULL', '7,4', '', '',
2975       ],
2976       'primary_key'  => 'billpkgdiscountnum',
2977       'unique'       => [],
2978       'index'        => [ [ 'billpkgnum' ], [ 'pkgdiscountnum' ] ],
2979       'foreign_keys' => [
2980                           { columns    => [ 'billpkgnum' ],
2981                             table      => 'cust_bill_pkg_void',
2982                           },
2983                           { columns    => [ 'pkgdiscountnum' ],
2984                             table      => 'cust_pkg_discount',
2985                           },
2986                         ],
2987     },
2988
2989     'discount' => {
2990       'columns' => [
2991         'discountnum', 'serial',     '',      '', '', '',
2992         #'agentnum',       'int', 'NULL',      '', '', '', 
2993         'classnum',       'int', 'NULL',      '', '', '',
2994         'name',       'varchar', 'NULL', $char_d, '', '',
2995         'amount',   @money_type,                  '', '', 
2996         'percent',    'decimal',     '',   '7,4', '', '',
2997         'months',     'decimal', 'NULL',   '7,4', '', '',
2998         'disabled',      'char', 'NULL',       1, '', '', 
2999         'setup',         'char', 'NULL',       1, '', '', 
3000         #'linked',        'char', 'NULL',       1, '', '',
3001       ],
3002       'primary_key'  => 'discountnum',
3003       'unique'       => [],
3004       'index'        => [], # [ 'agentnum' ], ],
3005       'foreign_keys' => [
3006                           { columns    => [ 'classnum' ],
3007                             table      => 'discount_class',
3008                           },
3009                         ],
3010     },
3011
3012     'discount_class' => {
3013       'columns' => [
3014         'classnum',    'serial',   '',      '', '', '', 
3015         'classname',   'varchar',  '', $char_d, '', '', 
3016         #'categorynum', 'int',  'NULL',      '', '', '', 
3017         'disabled',    'char', 'NULL',       1, '', '', 
3018       ],
3019       'primary_key' => 'classnum',
3020       'unique' => [],
3021       'index' => [ ['disabled'] ],
3022     },
3023
3024     'cust_refund' => {
3025       'columns' => [
3026         'refundnum',    'serial',    '',   '', '', '', 
3027         'custnum',  'int',    '',   '', '', '', 
3028         '_date',        @date_type, '', '', 
3029         'refund',       @money_type, '', '', 
3030         'currency',       'char', 'NULL',       3, '', '',
3031         'otaker',       'varchar',   'NULL',   32, '', '', 
3032         'usernum',   'int', 'NULL', '', '', '',
3033         'reason',       'varchar',   'NULL',   $char_d, '', '', 
3034         'reasonnum',   'int', 'NULL', '', '', '',
3035         'payby',        'char',   '',     4, '', '', # CARD/BILL/COMP, should
3036                                                      # be index into payby
3037                                                      # table eventually
3038         'payinfo',      'varchar',   'NULL', 512, '', '', #see cust_main above
3039         'paymask', 'varchar', 'NULL', $char_d, '', '', 
3040         'paybatch',     'varchar',   'NULL', $char_d, '', '', 
3041         'closed',    'char', 'NULL', 1, '', '', 
3042         # credit card/EFT fields (formerly in paybatch)
3043         'gatewaynum',     'int', 'NULL', '', '', '', # payment_gateway FK
3044         'processor',  'varchar', 'NULL', $char_d, '', '', # module name
3045         'auth',       'varchar','NULL',16, '', '', # CC auth number
3046         'order_number', 'varchar','NULL',$char_d, '', '', # transaction number
3047       ],
3048       'primary_key'  => 'refundnum',
3049       'unique'       => [],
3050       'index'        => [ ['custnum'], ['_date'], [ 'usernum' ], ],
3051       'foreign_keys' => [
3052                           { columns    => [ 'custnum' ],
3053                             table      => 'cust_main',
3054                           },
3055                           { columns    => [ 'usernum' ],
3056                             table      => 'access_user',
3057                           },
3058                           { columns    => [ 'reasonnum' ],
3059                             table      => 'reason',
3060                           },
3061                           { columns    => [ 'gatewaynum' ],
3062                             table      => 'payment_gateway',
3063                           },
3064                         ],
3065     },
3066
3067     'cust_credit_refund' => {
3068       'columns' => [
3069         'creditrefundnum', 'serial',     '',   '', '', '', 
3070         'crednum',  'int',     '',   '', '', '', 
3071         'refundnum',  'int',     '',   '', '', '', 
3072         'amount',  @money_type, '', '', 
3073         '_date',   @date_type, '', '', 
3074       ],
3075       'primary_key'  => 'creditrefundnum',
3076       'unique'       => [],
3077       'index'        => [ ['crednum'], ['refundnum'] ],
3078       'foreign_keys' => [
3079                           { columns    => [ 'crednum' ],
3080                             table      => 'cust_credit',
3081                           },
3082                           { columns    => [ 'refundnum' ],
3083                             table      => 'cust_refund',
3084                           },
3085                         ],
3086     },
3087
3088
3089     'cust_svc' => {
3090       'columns' => [
3091         'svcnum',      'serial',     '', '', '', '', 
3092         'pkgnum',         'int', 'NULL', '', '', '', 
3093         'svcpart',        'int',     '', '', '', '', 
3094         'agent_svcid',    'int', 'NULL', '', '', '',
3095         'overlimit',           @date_type,   '', '', 
3096       ],
3097       'primary_key'  => 'svcnum',
3098       'unique'       => [],
3099       'index'        => [ ['svcnum'], ['pkgnum'], ['svcpart'],
3100                           ['agent_svcid'],
3101                         ],
3102       'foreign_keys' => [
3103                           { columns    => [ 'pkgnum' ],
3104                             table      => 'cust_pkg',
3105                           },
3106                           { columns    => [ 'svcpart' ],
3107                             table      => 'part_svc',
3108                           },
3109                         ],
3110     },
3111
3112     'cust_svc_option' => {
3113       'columns' => [
3114         'optionnum',   'serial', '', '', '', '', 
3115         'svcnum',      'int', '', '', '', '', 
3116         'optionname',  'varchar', '', $char_d, '', '', 
3117         'optionvalue', 'text', 'NULL', '', '', '', 
3118       ],
3119       'primary_key'  => 'optionnum',
3120       'unique'       => [],
3121       'index'        => [ [ 'svcnum' ], [ 'optionname' ] ],
3122       'foreign_keys' => [
3123                           { columns    => [ 'svcnum' ],
3124                             table      => 'cust_svc',
3125                           },
3126                         ],
3127     },
3128
3129     'svc_export_machine' => {
3130       'columns' => [
3131         'svcexportmachinenum', 'serial', '', '', '', '',
3132         'svcnum',                 'int', '', '', '', '', 
3133         'exportnum',              'int', '', '', '', '', 
3134         'machinenum',             'int', '', '', '', '',
3135       ],
3136       'primary_key'  => 'svcexportmachinenum',
3137       'unique'       => [ ['svcnum', 'exportnum'] ],
3138       'index'        => [],
3139       'foreign_keys' => [
3140                           { columns    => [ 'svcnum' ],
3141                             table      => 'cust_svc',
3142                           },
3143                           { columns    => [ 'exportnum' ],
3144                             table      => 'part_export',
3145                           },
3146                           { columns    => [ 'machinenum' ],
3147                             table      => 'part_export_machine',
3148                           },
3149                         ],
3150     },
3151
3152     'part_export_machine' => {
3153       'columns' => [
3154         'machinenum', 'serial', '', '', '', '',
3155         'exportnum',     'int', '', '', '', '',
3156         'machine',    'varchar', 'NULL', $char_d, '', '', 
3157         'disabled',      'char', 'NULL',       1, '', '',
3158       ],
3159       'primary_key'  => 'machinenum',
3160       'unique'       => [ [ 'exportnum', 'machine' ] ],
3161       'index'        => [ [ 'exportnum' ] ],
3162       'foreign_keys' => [
3163                           { columns    => [ 'exportnum' ],
3164                             table      => 'part_export',
3165                           },
3166                         ],
3167     },
3168
3169     'part_pkg' => {
3170       'columns' => [
3171         'pkgpart',       'serial',    '',   '', '', '', 
3172         'pkgpartbatch',  'varchar', 'NULL', $char_d, '', '',
3173         'pkg',           'varchar',   '',   $char_d, '', '', 
3174         'comment',       'varchar', 'NULL', 2*$char_d, '', '', 
3175         'promo_code',    'varchar', 'NULL', $char_d, '', '', 
3176         'freq',          'varchar',   '',   $char_d, '', '', #billing frequency
3177         'setuptax',      'char', 'NULL', 1, '', '', 
3178         'recurtax',      'char', 'NULL', 1, '', '', 
3179         'plan',          'varchar', 'NULL', $char_d, '', '', 
3180         'disabled',      'char', 'NULL', 1, '', '', 
3181         'custom',        'char', 'NULL', 1, '', '', 
3182         'taxclass',      'varchar', 'NULL', $char_d, '', '', 
3183         'classnum',      'int',     'NULL', '', '', '', 
3184         'addon_classnum','int',     'NULL', '', '', '', 
3185         'taxproductnum', 'int',     'NULL', '', '', '', 
3186         'setup_cost',    @money_typen,          '', '',
3187         'recur_cost',    @money_typen,          '', '',
3188         'pay_weight',    'real',    'NULL', '', '', '',
3189         'credit_weight', 'real',    'NULL', '', '', '',
3190         'agentnum',      'int',     'NULL', '', '', '', 
3191         'fcc_ds0s',      'int',     'NULL', '', '', '', 
3192         'fcc_voip_class','char',    'NULL',  1, '', '',
3193         'no_auto',          'char', 'NULL',  1, '', '', 
3194         'recur_show_zero',  'char', 'NULL',  1, '', '',
3195         'setup_show_zero',  'char', 'NULL',  1, '', '',
3196         'successor',     'int',     'NULL', '', '', '',
3197         'family_pkgpart','int',     'NULL', '', '', '',
3198         'delay_start',   'int',     'NULL', '', '', '',
3199         'start_on_hold', 'char',    'NULL',  1, '', '',
3200         'agent_pkgpartid', 'varchar', 'NULL', 20, '', '',
3201       ],
3202       'primary_key'  => 'pkgpart',
3203       'unique'       => [],
3204       'index'        => [ [ 'promo_code' ], [ 'disabled' ], [ 'classnum' ],
3205                           [ 'agentnum' ], ['no_auto'], ['agent_pkgpartid'],
3206                         ],
3207       'foreign_keys' => [
3208                           { columns    => [ 'classnum' ],
3209                             table      => 'pkg_class',
3210                           },
3211                           { columns    => [ 'addon_classnum' ],
3212                             table      => 'pkg_class',
3213                             references => [ 'classnum' ],
3214                           },
3215                           { columns    => [ 'taxproductnum' ],
3216                             table      => 'part_pkg_taxproduct',
3217                           },
3218                           { columns    => [ 'agentnum' ],
3219                             table      => 'agent',
3220                           },
3221                           { columns    => [ 'successor' ],
3222                             table      => 'part_pkg',
3223                             references => [ 'pkgpart' ],
3224                           },
3225                           { columns    => [ 'family_pkgpart' ],
3226                             table      => 'part_pkg',
3227                             references => [ 'pkgpart' ],
3228                           },
3229                         ],
3230     },
3231
3232     'part_pkg_msgcat' => {
3233       'columns' => [
3234         'pkgpartmsgnum',  'serial',     '',        '', '', '',
3235         'pkgpart',           'int',     '',        '', '', '',
3236         'locale',        'varchar',     '',        16, '', '',
3237         'pkg',           'varchar',     '',   $char_d, '', '', #longer/no limit?
3238         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
3239       ],
3240       'primary_key'  => 'pkgpartmsgnum',
3241       'unique'       => [ [ 'pkgpart', 'locale' ] ],
3242       'index'        => [],
3243       'foreign_keys' => [
3244                           { columns    => [ 'pkgpart' ],
3245                             table      => 'part_pkg',
3246                           },
3247                         ],
3248     },
3249
3250     'part_pkg_currency' => {
3251       'columns' => [
3252         'pkgcurrencynum', 'serial', '',      '', '', '',
3253         'pkgpart',           'int', '',      '', '', '',
3254         'currency',         'char', '',       3, '', '',
3255         'optionname',    'varchar', '', $char_d, '', '', 
3256         'optionvalue',      'text', '',      '', '', '', 
3257       ],
3258       'primary_key'  => 'pkgcurrencynum',
3259       'unique'       => [ [ 'pkgpart', 'currency', 'optionname' ] ],
3260       'index'        => [ ['pkgpart'] ],
3261       'foreign_keys' => [
3262                           { columns    => [ 'pkgpart' ],
3263                             table      => 'part_pkg',
3264                           },
3265                         ],
3266     },
3267
3268     'currency_exchange' => {
3269       'columns' => [
3270         'currencyratenum', 'serial', '',    '', '', '',
3271         'from_currency',     'char', '',     3, '', '',
3272         'to_currency',       'char', '',     3, '', '',
3273         'rate',           'decimal', '', '7,6', '', '',
3274       ],
3275       'primary_key' => 'currencyratenum',
3276       'unique'      => [ [ 'from_currency', 'to_currency' ] ],
3277       'index'       => [],
3278     },
3279
3280     'part_pkg_usageprice' => {
3281       'columns' => [
3282         'usagepricepart', 'serial',      '',      '', '', '',
3283         'pkgpart',           'int',      '',      '', '', '',
3284         'price',          @money_type,                '', '', 
3285         'currency',         'char',  'NULL',       3, '', '',
3286         'action',        'varchar',      '', $char_d, '', '',
3287         'target',        'varchar',      '', $char_d, '', '',
3288         'amount',        'varchar',      '', $char_d, '', '',
3289       ],
3290       'primary_key'  => 'usagepricepart',
3291       'unique'       => [ [ 'pkgpart', 'currency', 'target' ] ],
3292       'index'        => [ [ 'pkgpart' ] ],
3293       'foreign_keys' => [
3294                           { columns    => [ 'pkgpart' ],
3295                             table      => 'part_pkg',
3296                           },
3297                         ],
3298     },
3299
3300     'cust_pkg_usageprice' => {
3301       'columns' => [
3302         'usagepricenum', 'serial',      '',      '', '', '',
3303         'pkgnum',           'int',      '',      '', '', '',
3304         'usagepricepart',   'int',      '',      '', '', '',
3305         'quantity',         'int',      '',      '', '', '',
3306       ],
3307       'primary_key'  => 'usagepricenum',
3308       'unique'       => [ [ 'pkgnum', 'usagepricepart' ] ],
3309       'index'        => [ [ 'pkgnum' ] ],
3310       'foreign_keys' => [
3311                           { columns    => [ 'pkgnum' ],
3312                             table      => 'cust_pkg',
3313                           },
3314                           { columns    => [ 'usagepricepart' ],
3315                             table      => 'part_pkg_usageprice',
3316                           },
3317                         ],
3318     },
3319
3320     'part_fee' => {
3321       'columns' => [
3322         'feepart',       'serial',    '',   '', '', '',
3323         'itemdesc',      'varchar',   '',   $char_d,   '', '',
3324         'comment',       'varchar', 'NULL', 2*$char_d, '', '',
3325         'disabled',      'char',    'NULL',  1, '', '',
3326         'classnum',      'int',     'NULL', '', '', '',
3327         'taxclass',      'varchar', 'NULL', $char_d, '', '',
3328         'taxproductnum', 'int',     'NULL', '', '', '',
3329         'pay_weight',    'real',    'NULL', '', '', '',
3330         'credit_weight', 'real',    'NULL', '', '', '',
3331         'agentnum',      'int',     'NULL', '', '', '',
3332         'amount',   @money_type,                '', '', 
3333         'percent',     'decimal',    '', '7,4', '', '',
3334         'basis',         'varchar',  '',    16, '', '',
3335         'minimum',    @money_typen,             '', '',
3336         'maximum',    @money_typen,             '', '',
3337         'limit_credit',  'char',    'NULL',  1, '', '',
3338         'setuprecur',    'char',     '',     5, '', '',
3339         'taxable',       'char',    'NULL',  1, '', '',
3340       ],
3341       'primary_key'  => 'feepart',
3342       'unique'       => [],
3343       'index'        => [ [ 'disabled' ], [ 'classnum' ], [ 'agentnum' ]
3344                         ],
3345       'foreign_keys' => [
3346                           { columns    => [ 'classnum' ],
3347                             table      => 'pkg_class',
3348                           },
3349                           { columns    => [ 'taxproductnum' ],
3350                             table      => 'part_pkg_taxproduct',
3351                           },
3352                           { columns    => [ 'agentnum' ],
3353                             table      => 'agent',
3354                           },
3355                         ],
3356     },
3357
3358     'part_fee_msgcat' => {
3359       'columns' => [
3360         'feepartmsgnum',  'serial',     '',        '', '', '',
3361         'feepart',           'int',     '',        '', '', '',
3362         'locale',        'varchar',     '',        16, '', '',
3363         'itemdesc',      'varchar',     '',   $char_d, '', '', #longer/no limit?
3364         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
3365       ],
3366       'primary_key'  => 'feepartmsgnum',
3367       'unique'       => [ [ 'feepart', 'locale' ] ],
3368       'index'        => [],
3369       'foreign_keys' => [
3370                           { columns    => [ 'feepart' ],
3371                             table      => 'part_fee',
3372                           },
3373                         ],
3374     },
3375
3376     'part_fee_usage' => {
3377       'columns' => [
3378         'feepartusagenum','serial',     '',        '', '', '',
3379         'feepart',           'int',     '',        '', '', '',
3380         'classnum',          'int',     '',        '', '', '',
3381         'amount',   @money_type,                '', '',
3382         'percent',     'decimal',    '', '7,4', '', '',
3383       ],
3384       'primary_key'  => 'feepartusagenum',
3385       'unique'       => [ [ 'feepart', 'classnum' ] ],
3386       'index'        => [],
3387       'foreign_keys' => [
3388                           { columns    => [ 'feepart' ],
3389                             table      => 'part_fee',
3390                           },
3391                           { columns    => [ 'classnum' ],
3392                             table      => 'usage_class',
3393                           },
3394                         ],
3395     },
3396
3397     'part_pkg_link' => {
3398       'columns' => [
3399         'pkglinknum',  'serial',   '',      '', '', '',
3400         'src_pkgpart', 'int',      '',      '', '', '',
3401         'dst_pkgpart', 'int',      '',      '', '', '', 
3402         'link_type',   'varchar',  '', $char_d, '', '',
3403         'hidden',      'char', 'NULL',       1, '', '',
3404       ],
3405       'primary_key'  => 'pkglinknum',
3406       'unique'       => [ ['src_pkgpart','dst_pkgpart','link_type','hidden'] ],
3407       'index'        => [ [ 'src_pkgpart' ] ],
3408       'foreign_keys' => [
3409                           { columns    => [ 'src_pkgpart' ],
3410                             table      => 'part_pkg',
3411                             references => [ 'pkgpart' ]
3412                           },
3413                           { columns    => [ 'dst_pkgpart' ],
3414                             table      => 'part_pkg',
3415                             references => [ 'pkgpart' ]
3416                           },
3417                         ],
3418     },
3419     # XXX somewhat borked unique: we don't really want a hidden and unhidden
3420     # it turns out we'd prefer to use svc, bill, and invisibill (or something)
3421
3422     'part_pkg_discount' => {
3423       'columns' => [
3424         'pkgdiscountnum', 'serial',   '',      '', '', '',
3425         'pkgpart',        'int',      '',      '', '', '',
3426         'discountnum',    'int',      '',      '', '', '', 
3427       ],
3428       'primary_key'  => 'pkgdiscountnum',
3429       'unique'       => [ [ 'pkgpart', 'discountnum' ] ],
3430       'index'        => [],
3431       'foreign_keys' => [
3432                           { columns    => [ 'pkgpart' ],
3433                             table      => 'part_pkg',
3434                           },
3435                           { columns    => [ 'discountnum' ],
3436                             table      => 'discount',
3437                           },
3438                         ],
3439     },
3440
3441     'part_pkg_taxclass' => {
3442       'columns' => [
3443         'taxclassnum',  'serial', '',       '', '', '',
3444         'taxclass',     'varchar', '', $char_d, '', '', 
3445         'disabled', 'char',   'NULL',         1, '', '', 
3446       ],
3447       'primary_key' => 'taxclassnum',
3448       'unique'      => [ [ 'taxclass' ] ],
3449       'index'       => [ [ 'disabled' ] ],
3450     },
3451
3452     'part_pkg_taxproduct' => {
3453       'columns' => [
3454         'taxproductnum', 'serial',      '',        '', '', '',
3455         'data_vendor',   'varchar', 'NULL',   $char_d, '', '', 
3456         'taxproduct',    'varchar',     '',   $char_d, '', '', 
3457         'description',   'varchar',     '', 3*$char_d, '', '', 
3458         'note',             'text', 'NULL',        '', '', '',
3459       ],
3460       'primary_key' => 'taxproductnum',
3461       'unique'      => [ [ 'data_vendor', 'taxproduct' ] ],
3462       'index'       => [],
3463     },
3464
3465     'part_pkg_taxrate' => { 
3466       'columns' => [
3467         'pkgtaxratenum', 'serial',  '',     '',      '', '',
3468         'data_vendor',   'varchar', 'NULL', $char_d, '', '', # update source
3469         'geocode',       'varchar', 'NULL', $char_d, '', '', # cch provides 10
3470         'taxproductnum', 'int',  '',     '',       '', '',          
3471         'city',             'varchar', 'NULL', $char_d, '', '', # tax_location?
3472         'county',           'varchar', 'NULL', $char_d, '', '', 
3473         'state',            'varchar', 'NULL', $char_d, '', '', 
3474         'local',            'varchar', 'NULL', $char_d, '', '', 
3475         'country',          'char',    'NULL', 2,       '', '',
3476         'taxclassnumtaxed', 'int',     'NULL', '',      '', '', 
3477         'taxcattaxed',      'varchar', 'NULL', $char_d, '', '', 
3478         'taxclassnum',      'int',     'NULL', '',      '', '', 
3479         'effdate',          @date_type, '', '', 
3480         'taxable',          'char',    'NULL', 1,       '', '', 
3481       ],
3482       'primary_key'  => 'pkgtaxratenum',
3483       'unique'       => [],
3484       'index'        => [ [ 'data_vendor', 'geocode', 'taxproductnum' ] ],
3485       'foreign_keys' => [
3486                           { columns    => [ 'taxproductnum' ],
3487                             table      => 'part_pkg_taxproduct',
3488                           },
3489                           { columns    => [ 'taxclassnumtaxed' ],
3490                             table      => 'tax_class',
3491                             references => [ 'taxclassnum' ],
3492                           },
3493                           { columns    => [ 'taxclassnum' ],
3494                             table      => 'tax_class',
3495                           },
3496                         ],
3497     },
3498
3499     'part_pkg_taxoverride' => { 
3500       'columns' => [
3501         'taxoverridenum', 'serial', '', '', '', '',
3502         'pkgpart',           'int', '', '', '', '',
3503         'taxclassnum',       'int', '', '', '', '',
3504         'usage_class',    'varchar', 'NULL', $char_d, '', '', 
3505       ],
3506       'primary_key'  => 'taxoverridenum',
3507       'unique'       => [],
3508       'index'        => [ [ 'pkgpart' ], [ 'taxclassnum' ] ],
3509       'foreign_keys' => [
3510                           { columns    => [ 'pkgpart' ],
3511                             table      => 'part_pkg',
3512                           },
3513                           { columns    => [ 'taxclassnum' ],
3514                             table      => 'tax_class',
3515                           },
3516                         ],
3517     },
3518
3519 #    'part_title' => {
3520 #      'columns' => [
3521 #        'titlenum',   'int',    '',   '',
3522 #        'title',      'varchar',   '',   $char_d,
3523 #      ],
3524 #      'primary_key' => 'titlenum',
3525 #      'unique' => [ [] ],
3526 #      'index' => [ [] ],
3527 #    },
3528
3529     'pkg_svc' => {
3530       'columns' => [
3531         'pkgsvcnum',   'serial',    '', '', '', '', 
3532         'pkgpart',        'int',    '', '', '', '', 
3533         'svcpart',        'int',    '', '', '', '', 
3534         'quantity',       'int',    '', '', '', '', 
3535         'primary_svc',   'char', 'NULL', 1, '', '', 
3536         'hidden',        'char', 'NULL', 1, '', '',
3537         'bulk_skip',     'char', 'NULL', 1, '', '',
3538       ],
3539       'primary_key'  => 'pkgsvcnum',
3540       'unique'       => [ ['pkgpart', 'svcpart'] ],
3541       'index'        => [ ['pkgpart'], ['quantity'] ],
3542       'foreign_keys' => [
3543                           { columns    => [ 'pkgpart' ],
3544                             table      => 'part_pkg',
3545                           },
3546                           { columns    => [ 'svcpart' ],
3547                             table      => 'part_svc',
3548                           },
3549                         ],
3550     },
3551
3552     'part_referral' => {
3553       'columns' => [
3554         'refnum',   'serial',     '',        '', '', '', 
3555         'referral', 'varchar',    '',   $char_d, '', '', 
3556         'disabled', 'char',   'NULL',         1, '', '', 
3557         'agentnum', 'int',    'NULL',        '', '', '', 
3558       ],
3559       'primary_key'  => 'refnum',
3560       'unique'       => [],
3561       'index'        => [ ['disabled'], ['agentnum'], ],
3562       'foreign_keys' => [
3563                           { columns    => [ 'agentnum' ],
3564                             table      => 'agent',
3565                           },
3566                         ],
3567     },
3568
3569     'part_svc' => {
3570       'columns' => [
3571         'svcpart',             'serial',     '',        '', '', '', 
3572         'svc',                'varchar',     '',   $char_d, '', '', 
3573         'svcdb',              'varchar',     '',   $char_d, '', '', 
3574         'disabled',              'char', 'NULL',         1, '', '', 
3575         'preserve',              'char', 'NULL',         1, '', '',
3576         'selfservice_access', 'varchar', 'NULL',   $char_d, '', '',
3577         'classnum',               'int', 'NULL',        '', '', '',
3578         'restrict_edit_password','char', 'NULL',         1, '', '',
3579         'has_router',            'char', 'NULL',         1, '', '',
3580 ],
3581       'primary_key'  => 'svcpart',
3582       'unique'       => [],
3583       'index'        => [ [ 'disabled' ] ],
3584       'foreign_keys' => [
3585                           { columns    => [ 'classnum' ],
3586                             table      => 'part_svc_class',
3587                           },
3588                         ],
3589     },
3590
3591     'part_svc_column' => {
3592       'columns' => [
3593         'columnnum',   'serial',      '',      '', '', '', 
3594         'svcpart',     'int',         '',      '', '', '', 
3595         'columnname',  'varchar',     '',      64, '', '', 
3596         'columnlabel', 'varchar', 'NULL', $char_d, '', '',
3597         'columnvalue', 'varchar', 'NULL',     512, '', '', 
3598         'columnflag',  'char',    'NULL',       1, '', '', 
3599       ],
3600       'primary_key'  => 'columnnum',
3601       'unique'       => [ [ 'svcpart', 'columnname' ] ],
3602       'index'        => [ [ 'svcpart' ] ],
3603       'foreign_keys' => [
3604                           { columns    => [ 'svcpart' ],
3605                             table      => 'part_svc',
3606                           },
3607                         ],
3608     },
3609
3610     'part_svc_class' => {
3611       'columns' => [
3612         'classnum',    'serial',   '',      '', '', '', 
3613         'classname',   'varchar',  '', $char_d, '', '', 
3614         'disabled',    'char', 'NULL',       1, '', '', 
3615       ],
3616       'primary_key' => 'classnum',
3617       'unique' => [],
3618       'index' => [ ['disabled'] ],
3619     },
3620
3621     #(this should be renamed to part_pop)
3622     'svc_acct_pop' => {
3623       'columns' => [
3624         'popnum',    'serial',    '',   '', '', '', 
3625         'city',      'varchar',   '',   $char_d, '', '', 
3626         'state',     'varchar',   '',   $char_d, '', '', 
3627         'ac',        'char',   '',   3, '', '', 
3628         'exch',      'char',   '',   3, '', '', 
3629         'loc',       'char',   'NULL',   4, '', '', #NULL for legacy purposes
3630       ],
3631       'primary_key' => 'popnum',
3632       'unique' => [],
3633       'index' => [ [ 'state' ] ],
3634     },
3635
3636     'part_pop_local' => {
3637       'columns' => [
3638         'localnum',  'serial',     '',     '', '', '', 
3639         'popnum',    'int',     '',     '', '', '', 
3640         'city',      'varchar', 'NULL', $char_d, '', '', 
3641         'state',     'char',    'NULL', 2, '', '', 
3642         'npa',       'char',    '',     3, '', '', 
3643         'nxx',       'char',    '',     3, '', '', 
3644       ],
3645       'primary_key'  => 'localnum',
3646       'unique'       => [],
3647       'index'        => [ [ 'npa', 'nxx' ], [ 'popnum' ] ],
3648       'foreign_keys' => [
3649                          { columns    => [ 'popnum' ],
3650                            table      => 'svc_acct_pop',
3651                          },
3652                        ],
3653     },
3654
3655     'qual' => {
3656       'columns' => [
3657         'qualnum',  'serial',     '',     '', '', '', 
3658         'custnum',    'int',     'NULL',     '', '', '',
3659         'prospectnum',    'int',     'NULL',     '', '', '',
3660         'locationnum',    'int',     'NULL',     '', '', '',
3661         'phonenum',     'varchar', 'NULL',       24, '', '',
3662         'exportnum',      'int', 'NULL', '', '', '', 
3663         'vendor_qual_id',      'varchar', 'NULL', $char_d, '', '', 
3664         'status',      'char', '', 1, '', '', 
3665       ],
3666       'primary_key'  => 'qualnum',
3667       'unique'       => [],
3668       'index'        => [ ['locationnum'], ['custnum'], ['prospectnum'],
3669                           ['phonenum'], ['vendor_qual_id'],
3670                         ],
3671       'foreign_keys' => [
3672                           { columns    => [ 'custnum' ],
3673                             table      => 'cust_main',
3674                           },
3675                           { columns    => [ 'prospectnum' ],
3676                             table      => 'prospect_main',
3677                           },
3678                           { columns    => [ 'locationnum' ],
3679                             table      => 'cust_location',
3680                           },
3681                           { columns    => [ 'exportnum' ],
3682                             table      => 'part_export',
3683                           },
3684                         ],
3685     },
3686
3687     'qual_option' => {
3688       'columns' => [
3689         'optionnum', 'serial', '', '', '', '', 
3690         'qualnum',  'int',     '',     '', '', '', 
3691         'optionname', 'varchar', '', $char_d, '', '', 
3692         'optionvalue', 'text', 'NULL', '', '', '', 
3693       ],
3694       'primary_key'  => 'optionnum',
3695       'unique'       => [],
3696       'index'        => [],
3697       'foreign_keys' => [
3698                           { columns    => [ 'qualnum' ],
3699                             table      => 'qual',
3700                           },
3701                         ],
3702     },
3703
3704     'svc_acct' => {
3705       'columns' => [
3706         'svcnum',    'int',    '',   '', '', '', 
3707         'username',  'varchar',   '',   $username_len, '', '',
3708         '_password', 'varchar',   'NULL',  512, '', '',
3709         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
3710         'sec_phrase', 'varchar',  'NULL',   $char_d, '', '', 
3711         'popnum',    'int',    'NULL',   '', '', '', 
3712         'sectornum', 'int', 'NULL',      '', '', '',
3713         'uid',       'int', 'NULL',   '', '', '', 
3714         'gid',       'int', 'NULL',   '', '', '', 
3715         'finger',    'varchar',   'NULL',   2*$char_d, '', '', 
3716         'dir',       'varchar',   'NULL',   $char_d, '', '', 
3717         'shell',     'varchar',   'NULL',   $char_d, '', '', 
3718         'quota',     'varchar',   'NULL',   $char_d, '', '', 
3719         'slipip',    'varchar',   'NULL',   15, '', '', #four TINYINTs, bah.
3720         # IP address mgmt
3721         'routernum', 'int', 'NULL',      '', '', '',
3722         'blocknum',  'int', 'NULL',      '', '', '', 
3723         'seconds',   'int', 'NULL',   '', '', '', #uhhhh
3724         'seconds_threshold',   'int', 'NULL',   '', '', '',
3725         'upbytes',   'bigint', 'NULL',   '', '', '', 
3726         'upbytes_threshold',   'bigint', 'NULL',   '', '', '',
3727         'downbytes', 'bigint', 'NULL',   '', '', '',
3728         'downbytes_threshold',   'bigint', 'NULL',   '', '', '',
3729         'totalbytes','bigint', 'NULL',   '', '', '',
3730         'totalbytes_threshold',   'bigint', 'NULL',   '', '', '',
3731         'domsvc',    'int',     '', '', '', '', 
3732         'pbxsvc',    'int', 'NULL', '', '', '',
3733         'last_login',  @date_type, '', '', 
3734         'last_logout', @date_type, '', '', 
3735         #cardfortress field(s)
3736         'cf_privatekey',      'text', 'NULL',      '', '', '',
3737         #communigate pro fields (quota = MaxAccountSize)
3738         'cgp_aliases',     'varchar', 'NULL',     255, '', '',
3739         #settings
3740         'cgp_type',        'varchar', 'NULL', $char_d, '', '', #AccountType
3741         'file_quota',      'varchar', 'NULL', $char_d, '', '', #MaxWebSize
3742         'file_maxnum',     'varchar', 'NULL', $char_d, '', '', #MaxWebFiles
3743         'file_maxsize',    'varchar', 'NULL', $char_d, '', '', #MaxFileSize
3744         'cgp_accessmodes', 'varchar', 'NULL',     255, '', '', #AccessModes
3745         'password_selfchange','char', 'NULL',       1, '', '', #PWDAllowed
3746         'password_recover',   'char', 'NULL',       1, 'Y','', #PasswordRecovery
3747         'cgp_rulesallowed','varchar', 'NULL', $char_d, '', '', #RulesAllowed
3748         'cgp_rpopallowed',    'char', 'NULL',       1, '', '', #RPOPAllowed
3749         'cgp_mailtoall',      'char', 'NULL',       1, '', '', #MailToAll
3750         'cgp_addmailtrailer', 'char', 'NULL',       1, '', '', #AddMailTrailer
3751         'cgp_archiveafter',    'int', 'NULL',      '', '', '', #ArchiveMessagesAfter
3752         #XXX mailing lists
3753         #preferences
3754         'cgp_deletemode',     'varchar', 'NULL', $char_d, '', '',#DeleteMode
3755         'cgp_emptytrash',     'varchar', 'NULL', $char_d, '', '',#EmptyTrash
3756         'cgp_language',       'varchar', 'NULL', $char_d, '', '',#Language
3757         'cgp_timezone',       'varchar', 'NULL', $char_d, '', '',#TimeZone
3758         'cgp_skinname',       'varchar', 'NULL', $char_d, '', '',#SkinName
3759         'cgp_prontoskinname', 'varchar', 'NULL', $char_d, '', '',#ProntoSkinName
3760         'cgp_sendmdnmode',    'varchar', 'NULL', $char_d, '', '',#SendMDNMode
3761         #mail
3762         #XXX RPOP settings
3763         #
3764       ],
3765       'primary_key'  => 'svcnum',
3766       #'unique'       => [ [ 'username', 'domsvc' ] ],
3767       'unique'       => [],
3768       'index'        => [ ['username'], ['domsvc'], ['pbxsvc'] ],
3769       'foreign_keys' => [
3770                           { columns    => [ 'svcnum' ],
3771                             table      => 'cust_svc',
3772                           },
3773                           { columns    => [ 'popnum' ],
3774                             table      => 'svc_acct_pop',
3775                           },
3776                           { columns    => [ 'sectornum' ],
3777                             table      => 'tower_sector',
3778                           },
3779                           { columns    => [ 'routernum' ],
3780                             table      => 'router',
3781                           },
3782                           { columns    => [ 'blocknum' ],
3783                             table      => 'addr_block',
3784                           },
3785                           { columns    => [ 'domsvc' ],
3786                             table      => 'svc_domain', #'cust_svc',
3787                             references => [ 'svcnum' ],
3788                           },
3789                           { columns    => [ 'pbxsvc' ],
3790                             table      => 'svc_pbx', #'cust_svc',
3791                             references => [ 'svcnum' ],
3792                           },
3793                         ],
3794     },
3795
3796     'acct_rt_transaction' => {
3797       'columns' => [
3798         'svcrtid',   'int',    '',   '', '', '', #why am i not a serial
3799         'svcnum',    'int',    '',   '', '', '', 
3800         'transaction_id',       'int', '',   '', '', '', 
3801         '_date',   @date_type, '', '',
3802         'seconds',   'int', '',   '', '', '', #uhhhh
3803         'support',   'int', '',   '', '', '',
3804       ],
3805       'primary_key'  => 'svcrtid',
3806       'unique'       => [],
3807       'index'        => [ ['svcnum', 'transaction_id'] ],
3808       'foreign_keys' => [
3809                           { columns    => [ 'svcnum' ],
3810                             table      => 'svc_acct', #'cust_svc',
3811                           },
3812                           # 1. RT tables aren't part of our data structure, so
3813                           #     we can't make sure Queue is created already
3814                           # 2. This is our internal hack for time tracking, not
3815                           #     a user-facing feature
3816                           #{ columns    => [ 'transaction_id' ],
3817                           #  table      => 'Transaction',
3818                           #  references => [ 'id' ],
3819                           #},
3820                         ],
3821     },
3822
3823     #'svc_charge' => {
3824     #  'columns' => [
3825     #    'svcnum',    'int',    '',   '',
3826     #    'amount',    @money_type,
3827     #  ],
3828     #  'primary_key' => 'svcnum',
3829     #  'unique' => [ [] ],
3830     #  'index' => [ [] ],
3831     #},
3832
3833     'svc_domain' => {
3834       'columns' => [
3835         'svcnum',           'int',    '',        '', '', '',
3836         'domain',       'varchar',    '',   $char_d, '', '',
3837         'suffix',       'varchar', 'NULL',  $char_d, '', '',
3838         'catchall',         'int', 'NULL',       '', '', '',
3839         'parent_svcnum',    'int', 'NULL',       '', '', '',
3840         'quota',        'varchar', 'NULL',  $char_d, '', '', 
3841
3842         #registration info
3843         'registrarnum',     'int', 'NULL',       '', '', '',
3844         'registrarkey', 'varchar', 'NULL',      512, '', '',
3845         'setup_date',      @date_type, '', '',
3846         'renewal_interval', 'int', 'NULL',       '', '', '',
3847         'expiration_date', @date_type, '', '',
3848
3849         #some weird shit australia-specific shit?  yuck.. seems totally unused
3850         'au_registrant_name',       'varchar', 'NULL',  $char_d, '', '',
3851         'au_eligibility_type',      'varchar', 'NULL',  $char_d, '', '',
3852
3853         #communigate pro fields (quota = MaxAccountSize)
3854         'max_accounts',     'int', 'NULL',       '', '', '',
3855         'trailer',         'text', 'NULL',       '', '', '',
3856         'cgp_aliases',  'varchar', 'NULL',      255, '', '',
3857         'cgp_accessmodes','varchar','NULL',     255, '', '', #DomainAccessModes
3858         'cgp_certificatetype','varchar','NULL', $char_d, '', '',
3859
3860         #(account default) settings
3861         'acct_def_password_selfchange',   'char', 'NULL',       1,  '', '', 
3862         'acct_def_password_recover',      'char', 'NULL',       1, 'Y', '', 
3863         'acct_def_cgp_accessmodes',    'varchar', 'NULL',     255,  '', '',
3864         'acct_def_quota',              'varchar', 'NULL', $char_d,  '', '',
3865         'acct_def_file_quota',         'varchar', 'NULL', $char_d,  '', '',
3866         'acct_def_file_maxnum',        'varchar', 'NULL', $char_d,  '', '',
3867         'acct_def_file_maxsize',       'varchar', 'NULL', $char_d,  '', '',
3868         'acct_def_cgp_rulesallowed',   'varchar', 'NULL', $char_d,  '', '',
3869         'acct_def_cgp_rpopallowed',       'char', 'NULL',       1,  '', '', 
3870         'acct_def_cgp_mailtoall',         'char', 'NULL',       1,  '', '', 
3871         'acct_def_cgp_addmailtrailer',    'char', 'NULL',       1,  '', '', 
3872         'acct_def_cgp_archiveafter',       'int', 'NULL',      '',  '', '',
3873
3874         #(account default) preferences
3875         'acct_def_cgp_deletemode',     'varchar', 'NULL', $char_d,  '', '',
3876         'acct_def_cgp_emptytrash',     'varchar', 'NULL', $char_d,  '', '',
3877         'acct_def_cgp_language',       'varchar', 'NULL', $char_d,  '', '',
3878         'acct_def_cgp_timezone',       'varchar', 'NULL', $char_d,  '', '',
3879         'acct_def_cgp_skinname',       'varchar', 'NULL', $char_d,  '', '',
3880         'acct_def_cgp_prontoskinname', 'varchar', 'NULL', $char_d,  '', '',
3881         'acct_def_cgp_sendmdnmode',    'varchar', 'NULL', $char_d,  '', '',
3882       ],
3883       'primary_key'  => 'svcnum',
3884       'unique'       => [],
3885       'index'        => [ ['domain'] ],
3886       'foreign_keys' => [
3887                           { columns    => [ 'svcnum' ],
3888                             table      => 'cust_svc',
3889                           },
3890                           { columns    => [ 'catchall' ],
3891                             table      => 'svc_acct',
3892                             references => [ 'svcnum' ],
3893                           },
3894                           { columns    => [ 'parent_svcnum' ],
3895                             table      => 'cust_svc',
3896                             references => [ 'svcnum' ],
3897                           },
3898                           { columns    => [ 'registrarnum' ],
3899                             table      => 'registrar',
3900                           },
3901                         ],
3902     },
3903
3904     'svc_dsl' => {
3905       'columns' => [
3906         'svcnum',                    'int',    '',        '', '', '',
3907         'pushed',                    'int', 'NULL',       '', '', '',
3908         'desired_due_date',          'int', 'NULL',       '', '', '',
3909         'due_date',                  'int', 'NULL',       '', '', '',
3910         'vendor_order_id',       'varchar', 'NULL', $char_d,  '', '',
3911         'vendor_qual_id',        'varchar', 'NULL', $char_d,  '', '',
3912         'vendor_order_type',     'varchar', 'NULL', $char_d,  '', '',
3913         'vendor_order_status',   'varchar', 'NULL', $char_d,  '', '',
3914         'first',                 'varchar', 'NULL', $char_d,  '', '',
3915         'last',                  'varchar', 'NULL', $char_d,  '', '',
3916         'company',               'varchar', 'NULL', $char_d,  '', '',
3917         'phonenum',              'varchar', 'NULL',      24, '', '',
3918         'gateway_access_number', 'varchar', 'NULL',      24, '', '',
3919         'loop_type',                'char', 'NULL',       1, '', '', 
3920         'local_voice_provider',  'varchar', 'NULL', $char_d, '', '',
3921         'circuitnum',            'varchar', 'NULL', $char_d, '', '',
3922         'rate_band',             'varchar', 'NULL', $char_d, '', '',
3923         'vpi',                       'int', 'NULL',      '', '', '',
3924         'vci',                       'int', 'NULL',      '', '', '',
3925         'isp_chg',                  'char', 'NULL',       1, '', '', 
3926         'isp_prev',              'varchar', 'NULL', $char_d, '', '',
3927         'username',              'varchar', 'NULL', $char_d, '', '',
3928         'password',              'varchar', 'NULL', $char_d, '', '',
3929         'staticips',                'text', 'NULL',      '', '', '',
3930         'monitored',                'char', 'NULL',       1, '', '', 
3931         'last_pull',                 'int', 'NULL',      '', '', '',
3932       ],
3933       'primary_key'  => 'svcnum',
3934       'unique'       => [ ],
3935       'index'        => [ ['phonenum'], ['vendor_order_id'] ],
3936       'foreign_keys' => [
3937                           { columns    => [ 'svcnum' ],
3938                             table      => 'cust_svc',
3939                           },
3940                         ],
3941     },
3942
3943     'dsl_device' => {
3944       'columns' => [
3945         'devicenum', 'serial',     '', '', '', '',
3946         #part_device?  or our own part_dsl_device?
3947         #'devicepart',   'int',     '', '', '', '',
3948         'svcnum',       'int',     '', '', '', '', 
3949         'mac_addr', 'varchar',     '', 12, '', '', 
3950       ],
3951       'primary_key'  => 'devicenum',
3952       'unique'       => [ [ 'mac_addr' ], ],
3953       'index'        => [ [ 'svcnum' ], ], # [ 'devicepart' ] ],
3954       'foreign_keys' => [
3955                           { columns    => [ 'svcnum' ],
3956                             table      => 'svc_dsl',
3957                           },
3958                         ],
3959     },
3960
3961     'dsl_note' => {
3962       'columns' => [
3963         'notenum',           'serial',    '',        '', '', '',
3964         'svcnum',     'int', '',       '', '', '',
3965         'author',     'varchar', 'NULL', $char_d,  '', '',
3966         'priority',   'char', 'NULL',       1,  '', '', 
3967         '_date',     'int', 'NULL',       '', '', '',
3968         'note',     'text', '',       '', '', '',
3969       ],
3970       'primary_key'  => 'notenum',
3971       'unique'       => [],
3972       'index'        => [ ['svcnum'] ],
3973       'foreign_keys' => [
3974                           { columns    => [ 'svcnum' ],
3975                             table      => 'svc_dsl',
3976                           },
3977                         ],
3978     },
3979
3980     'svc_dish' => {
3981       'columns' => [
3982         'svcnum',   'int',     '',     '', '', '',
3983         'acctnum',  'varchar', '',     16, '', '',
3984         'installdate', @date_type,         '', '', 
3985         'note',     'text',    'NULL', '', '', '',
3986       ],
3987       'primary_key'  => 'svcnum',
3988       'unique'       => [],
3989       'index'        => [],
3990       'foreign_keys' => [
3991                           { columns    => [ 'svcnum' ],
3992                             table      => 'cust_svc',
3993                           },
3994                         ],
3995     },
3996
3997     'svc_hardware' => {
3998       'columns' => [
3999         'svcnum',   'int',     '',          '', '', '',
4000         'typenum',  'int',     '',          '', '', '',
4001         'serial',   'varchar', 'NULL', $char_d, '', '',
4002         'ip_addr',  'varchar', 'NULL',      40, '', '',
4003         'hw_addr',  'varchar', 'NULL',      12, '', '',
4004         'smartcard','varchar', 'NULL',      30, '', '',
4005         'statusnum','int',     'NULL',      '', '', '',
4006         'note',     'text',    'NULL',      '', '', '',
4007       ],
4008       'primary_key'  => 'svcnum',
4009       'unique'       => [],
4010       'index'        => [],
4011       'foreign_keys' => [
4012                           { columns    => [ 'svcnum' ],
4013                             table      => 'cust_svc',
4014                           },
4015                           { columns    => [ 'typenum' ],
4016                             table      => 'hardware_type',
4017                           },
4018                           { columns    => [ 'statusnum' ],
4019                             table      => 'hardware_status',
4020                           },
4021                         ],
4022     },
4023
4024     'hardware_class' => {
4025       'columns' => [
4026         'classnum',   'serial', '',      '', '', '',
4027         'classname', 'varchar', '', $char_d, '', '',
4028       ],
4029       'primary_key' => 'classnum',
4030       'unique' => [],
4031       'index'  => [],
4032     },
4033
4034     'hardware_type' => {
4035       'columns' => [
4036         'typenum',  'serial',     '',      '', '', '',
4037         'classnum',    'int',     '',      '', '', '',
4038         'model',   'varchar',     '', $char_d, '', '',
4039         'revision','varchar', 'NULL', $char_d, '', '',
4040       ],
4041       'primary_key'  => 'typenum',
4042       'unique'       => [ [ 'classnum', 'model', 'revision' ] ],
4043       'index'        => [],
4044       'foreign_keys' => [
4045                           { columns    => [ 'classnum' ],
4046                             table      => 'hardware_class',
4047                           },
4048                         ],
4049     },
4050
4051     'hardware_status' => {
4052       'columns' => [
4053         'statusnum', 'serial', '',      '', '', '',
4054         'label'    ,'varchar', '', $char_d, '', '',
4055         'disabled',    'char', 'NULL',   1, '', '', 
4056       ],
4057       'primary_key' => 'statusnum',
4058       'unique' => [],
4059       'index'  => [],
4060     },
4061
4062     'domain_record' => {
4063       'columns' => [
4064         'recnum',    'serial',     '',  '', '', '', 
4065         'svcnum',    'int',     '',  '', '', '', 
4066         'reczone',   'varchar', '',  255, '', '', 
4067         'recaf',     'char',    '',  2, '', '', 
4068         'rectype',   'varchar',    '',  5, '', '', 
4069         'recdata',   'varchar', '',  255, '', '', 
4070         'ttl',       'int',     'NULL', '', '', '',
4071       ],
4072       'primary_key'  => 'recnum',
4073       'unique'       => [],
4074       'index'        => [ ['svcnum'] ],
4075       'foreign_keys' => [
4076                           { columns    => [ 'svcnum' ],
4077                             table      => 'svc_domain',
4078                           },
4079                         ],
4080     },
4081
4082     'registrar' => {
4083       'columns' => [
4084         'registrarnum',   'serial', '',      '', '', '',
4085         'registrarname', 'varchar', '', $char_d, '', '',
4086       ],
4087       'primary_key' => 'registrarnum',
4088       'unique'      => [],
4089       'index'       => [],
4090     },
4091
4092     'cgp_rule' => {
4093       'columns' => [
4094         'rulenum',  'serial',     '',      '', '', '',
4095         'name',    'varchar',     '', $char_d, '', '',
4096         'comment', 'varchar', 'NULL', $char_d, '', '',
4097         'svcnum',      'int',     '',      '', '', '',
4098         'priority',    'int',     '',      '', '', '',
4099       ],
4100       'primary_key' => 'rulenum',
4101       'unique'      => [ [ 'svcnum', 'name' ] ],
4102       'index'       => [ [ 'svcnum' ] ],
4103       'foreign_keys' => [
4104                           { columns    => [ 'svcnum' ],
4105                             table      => 'cust_svc', #svc_acct / svc_domain
4106                           },
4107                         ],
4108     },
4109
4110     'cgp_rule_condition' => {
4111       'columns' => [
4112         'ruleconditionnum',  'serial',     '',      '', '', '',
4113         'conditionname',    'varchar',     '', $char_d, '', '',
4114         'op',               'varchar', 'NULL', $char_d, '', '',
4115         'params',           'varchar', 'NULL',     255, '', '',
4116         'rulenum',              'int',     '',      '', '', '',
4117       ],
4118       'primary_key'  => 'ruleconditionnum',
4119       'unique'       => [],
4120       'index'        => [ [ 'rulenum' ] ],
4121       'foreign_keys' => [
4122                           { columns    => [ 'rulenum' ],
4123                             table      => 'cgp_rule',
4124                           },
4125                         ],
4126     },
4127
4128     'cgp_rule_action' => {
4129        'columns' => [
4130         'ruleactionnum',  'serial',     '',      '', '', '',
4131         'action',        'varchar',     '', $char_d, '', '',
4132         'params',        'varchar', 'NULL',     255, '', '',
4133         'rulenum',           'int',     '',      '', '', '',
4134       ],
4135       'primary_key'  => 'ruleactionnum',
4136       'unique'       => [],
4137       'index'        => [ [ 'rulenum' ] ],
4138       'foreign_keys' => [
4139                           { columns    => [ 'rulenum' ],
4140                             table      => 'cgp_rule',
4141                           },
4142                         ],
4143    },
4144
4145     'svc_forward' => {
4146       'columns' => [
4147         'svcnum',   'int',            '',   '', '', '', 
4148         'srcsvc',   'int',        'NULL',   '', '', '', 
4149         'src',      'varchar',    'NULL',  255, '', '', 
4150         'dstsvc',   'int',        'NULL',   '', '', '', 
4151         'dst',      'varchar',    'NULL',  255, '', '', 
4152       ],
4153       'primary_key'  => 'svcnum',
4154       'unique'       => [],
4155       'index'        => [ ['srcsvc'], ['dstsvc'] ],
4156       'foreign_keys' => [
4157                           { columns    => [ 'svcnum' ],
4158                             table      => 'cust_svc',
4159                           },
4160                           { columns    => [ 'srcsvc' ],
4161                             table      => 'svc_acct',
4162                             references => [ 'svcnum' ]
4163                           },
4164                           { columns    => [ 'dstsvc' ],
4165                             table      => 'svc_acct',
4166                             references => [ 'svcnum' ]
4167                           },
4168                         ],
4169     },
4170
4171     'svc_www' => {
4172       'columns' => [
4173         'svcnum',   'int',      '',  '', '', '', 
4174         'recnum',   'int',      '',  '', '', '', 
4175         'usersvc',  'int',  'NULL',  '', '', '', 
4176         'config',   'text', 'NULL',  '', '', '', 
4177       ],
4178       'primary_key' => 'svcnum',
4179       'unique'      => [],
4180       'index'       => [],
4181       'foreign_keys' => [
4182                           { columns    => [ 'svcnum' ],
4183                             table      => 'cust_svc',
4184                           },
4185                           { columns    => [ 'recnum' ],
4186                             table      => 'domain_record',
4187                           },
4188                           { columns    => [ 'usersvc' ],
4189                             table      => 'svc_acct',
4190                             references => [ 'svcnum' ]
4191                           },
4192                         ],
4193     },
4194
4195     #'svc_wo' => {
4196     #  'columns' => [
4197     #    'svcnum',    'int',    '',   '',
4198     #    'svcnum',    'int',    '',   '',
4199     #    'svcnum',    'int',    '',   '',
4200     #    'worker',    'varchar',   '',   $char_d,
4201     #    '_date',     @date_type,
4202     #  ],
4203     #  'primary_key' => 'svcnum',
4204     #  'unique' => [ [] ],
4205     #  'index' => [ [] ],
4206     #},
4207
4208     'prepay_credit' => {
4209       'columns' => [
4210         'prepaynum',   'serial',     '',   '', '', '', 
4211         'identifier',  'varchar', '', $char_d, '', '', 
4212         'amount',      @money_type, '', '', 
4213         'seconds',     'int',     'NULL', '', '', '', 
4214         'upbytes',     'bigint',     'NULL', '', '', '', 
4215         'downbytes',   'bigint',     'NULL', '', '', '', 
4216         'totalbytes',  'bigint',     'NULL', '', '', '', 
4217         'agentnum',    'int',     'NULL', '', '', '', 
4218       ],
4219       'primary_key'  => 'prepaynum',
4220       'unique'       => [ ['identifier'] ],
4221       'index'        => [ ['agentnum'] ],
4222       'foreign_keys' => [
4223                           { columns    => [ 'agentnum' ],
4224                             table      => 'agent',
4225                           },
4226                         ],
4227     },
4228
4229     'port' => {
4230       'columns' => [
4231         'portnum',  'serial',     '',   '', '', '', 
4232         'ip',       'varchar', 'NULL', 15, '', '', 
4233         'nasport',  'int',     'NULL', '', '', '', 
4234         'nasnum',   'int',     '',   '', '', '', 
4235       ],
4236       'primary_key'  => 'portnum',
4237       'unique'       => [],
4238       'index'        => [],
4239       'foreign_keys' => [
4240                           { columns    => [ 'nasnum' ],
4241                             table      => 'nas',
4242                           },
4243                         ],
4244     },
4245
4246     'nas' => {
4247       'columns' => [
4248         'nasnum',       'serial',     '',  '',              '', '', 
4249         'nasname',     'varchar',     '', 128,              '', '',
4250         'shortname',   'varchar', 'NULL',  32,              '', '',
4251         'type',        'varchar',     '',  30,         'other', '',
4252         'ports',           'int', 'NULL',  '',              '', '',
4253         'secret',      'varchar',     '',  60,        'secret', '',
4254         'server',      'varchar', 'NULL',  64,              '', '',
4255         'community',   'varchar', 'NULL',  50,              '', '',
4256         'description', 'varchar',     '', 200, 'RADIUS Client', '',
4257         'svcnum',          'int', 'NULL',  '',              '', '',
4258       ],
4259       'primary_key'  => 'nasnum',
4260       'unique'       => [ [ 'nasname' ], ],
4261       'index'        => [],
4262       'foreign_keys' => [
4263                           { columns    => [ 'svcnum' ],
4264                             table      => 'svc_broadband',#no? could be _acct?
4265                                                           #remove or cust_svc?
4266                           },
4267                         ],
4268     },
4269
4270     'export_nas' => {
4271       'columns' => [
4272         'exportnasnum', 'serial', '', '', '', '', 
4273         'exportnum',       'int', '', '', '', '', 
4274         'nasnum',          'int', '', '', '', '', 
4275       ],
4276       'primary_key'  => 'exportnasnum',
4277       'unique'       => [ [ 'exportnum', 'nasnum' ] ],
4278       'index'        => [ [ 'exportnum' ], [ 'nasnum' ] ],
4279       'foreign_keys' => [
4280                           { columns    => [ 'exportnum' ],
4281                             table      => 'part_export',
4282                           },
4283                           { columns    => [ 'nasnum' ],
4284                             table      => 'nas',
4285                           },
4286                         ],
4287     },
4288
4289     'queue' => {
4290       'columns' => [
4291         'jobnum',   'bigserial',     '',      '', '', '', 
4292         'job',        'varchar',     '',     512, '', '', 
4293         '_date',          'int',     '',      '', '', '', 
4294         'status',     'varchar',     '', $char_d, '', '', 
4295         'statustext',    'text', 'NULL',      '', '', '', 
4296         'svcnum',         'int', 'NULL',      '', '', '', 
4297         'custnum',        'int', 'NULL',      '', '', '',
4298         'secure',        'char', 'NULL',       1, '', '',
4299         'priority',       'int', 'NULL',      '', '', '',
4300       ],
4301       'primary_key'  => 'jobnum',
4302       'unique'       => [],
4303       'index'        => [ [ 'secure' ], [ 'priority' ],
4304                           [ 'job' ], [ 'svcnum' ], [ 'custnum' ], [ 'status' ],
4305                         ],
4306       'foreign_keys' => [
4307 #                          { columns    => [ 'svcnum' ],
4308 #                            table      => 'cust_svc',
4309 #                          },
4310                           { columns    => [ 'custnum' ],
4311                             table      => 'cust_main',
4312                           },
4313                         ],
4314     },
4315
4316     'queue_arg' => {
4317       'columns' => [
4318         'argnum', 'bigserial',     '', '', '', '', 
4319         'jobnum',    'bigint',     '', '', '', '', 
4320         'frozen',      'char', 'NULL',  1, '', '',
4321         'arg',         'text', 'NULL', '', '', '', 
4322       ],
4323       'primary_key'  => 'argnum',
4324       'unique'       => [],
4325       'index'        => [ [ 'jobnum' ] ],
4326       'foreign_keys' => [
4327                           { columns    => [ 'jobnum' ],
4328                             table      => 'queue',
4329                             on_delete  => 'CASCADE',
4330                           },
4331                         ],
4332     },
4333
4334     'queue_depend' => {
4335       'columns' => [
4336         'dependnum',  'bigserial', '', '', '', '', 
4337         'jobnum',        'bigint', '', '', '', '', 
4338         'depend_jobnum', 'bigint', '', '', '', '', 
4339       ],
4340       'primary_key'  => 'dependnum',
4341       'unique'       => [],
4342       'index'        => [ [ 'jobnum' ], [ 'depend_jobnum' ] ],
4343       'foreign_keys' => [
4344                           { columns    => [ 'jobnum' ],
4345                             table      => 'queue',
4346                           },
4347                           { columns    => [ 'depend_jobnum' ],
4348                             table      => 'queue',
4349                             references => [ 'jobnum' ],
4350                             on_delete  => 'CASCADE',
4351                           },
4352                         ],
4353     },
4354
4355     'queue_stat' => {
4356       'columns' => [
4357         'statnum', 'bigserial',     '',  '', '', '',
4358         'jobnum',     'bigint',     '',  '', '', '',
4359         'job',       'varchar',     '', 512, '', '', 
4360         'custnum',       'int', 'NULL',  '', '', '',
4361         'insert_date', @date_type, '', '',
4362         'start_date',  @date_type, '', '', 
4363         'end_date',    @date_type, '', '', 
4364       ],
4365       'primary_key'  => 'statnum',
4366       'unique'       => [], #[ ['jobnum'] ],
4367       'index'        => [],
4368     },
4369
4370     'export_svc' => {
4371       'columns' => [
4372         'exportsvcnum' => 'serial', '', '', '', '', 
4373         'exportnum'    => 'int', '', '', '', '', 
4374         'svcpart'      => 'int', '', '', '', '', 
4375         'role'         => 'varchar', 'NULL', 16, '', '',
4376       ],
4377       'primary_key'  => 'exportsvcnum',
4378       'unique'       => [ [ 'exportnum', 'svcpart' ] ],
4379       'index'        => [ [ 'exportnum' ], [ 'svcpart' ] ],
4380       'foreign_keys' => [
4381                           { columns    => [ 'exportnum' ],
4382                             table      => 'part_export',
4383                           },
4384                           { columns    => [ 'svcpart' ],
4385                             table      => 'part_svc',
4386                           },
4387                         ],
4388     },
4389
4390     'export_device' => {
4391       'columns' => [
4392         'exportdevicenum' => 'serial', '', '', '', '', 
4393         'exportnum'       => 'int', '', '', '', '', 
4394         'devicepart'      => 'int', '', '', '', '', 
4395       ],
4396       'primary_key'  => 'exportdevicenum',
4397       'unique'       => [ [ 'exportnum', 'devicepart' ] ],
4398       'index'        => [ [ 'exportnum' ], [ 'devicepart' ] ],
4399       'foreign_keys' => [
4400                           { columns    => [ 'exportnum' ],
4401                             table      => 'part_export',
4402                           },
4403                           { columns    => [ 'devicepart' ],
4404                             table      => 'part_device',
4405                           },
4406                         ],
4407     },
4408
4409     'part_export' => {
4410       'columns' => [
4411         'exportnum',   'serial',     '',      '', '', '', 
4412         'exportname', 'varchar', 'NULL', $char_d, '', '',
4413         'machine',    'varchar', 'NULL', $char_d, '', '',
4414         'exporttype', 'varchar',     '', $char_d, '', '', 
4415         'nodomain',      'char', 'NULL',       1, '', '', 
4416         'default_machine','int', 'NULL',      '', '', '',
4417       ],
4418       'primary_key'  => 'exportnum',
4419       'unique'       => [],
4420       'index'        => [ [ 'machine' ], [ 'exporttype' ] ],
4421       'foreign_keys' => [
4422                           { columns    => [ 'default_machine' ],
4423                             table      => 'part_export_machine',
4424                             references => [ 'machinenum' ]
4425                           },
4426                         ],
4427     },
4428
4429     'part_export_option' => {
4430       'columns' => [
4431         'optionnum', 'serial', '', '', '', '', 
4432         'exportnum', 'int', '', '', '', '', 
4433         'optionname', 'varchar', '', $char_d, '', '', 
4434         'optionvalue', 'text', 'NULL', '', '', '', 
4435       ],
4436       'primary_key'  => 'optionnum',
4437       'unique'       => [],
4438       'index'        => [ [ 'exportnum' ], [ 'optionname' ] ],
4439       'foreign_keys' => [
4440                           { columns    => [ 'exportnum' ],
4441                             table      => 'part_export',
4442                           },
4443                         ],
4444     },
4445
4446     'radius_usergroup' => {
4447       'columns' => [
4448         'usergroupnum', 'serial', '', '', '', '', 
4449         'svcnum',       'int', '', '', '', '', 
4450         'groupname',    'varchar', 'NULL', $char_d, '', '', #deprecated
4451         'groupnum',     'int', 'NULL', '', '', '', 
4452       ],
4453       'primary_key'  => 'usergroupnum',
4454       'unique'       => [],
4455       'index'        => [ [ 'svcnum' ], [ 'groupname' ] ],
4456       'foreign_keys' => [
4457                           { columns    => [ 'svcnum' ],
4458                             table      => 'cust_svc', #svc_acct / svc_broadband
4459                           },
4460                           { columns    => [ 'groupnum' ],
4461                             table      => 'radius_group',
4462                           },
4463                         ],
4464     },
4465
4466     'radius_group' => {
4467       'columns' => [
4468         'groupnum', 'serial', '', '', '', '', 
4469         'groupname',    'varchar', '', $char_d, '', '', 
4470         'description',  'varchar', 'NULL', $char_d, '', '', 
4471         'priority', 'int', '', '', '1', '',
4472         'speed_up', 'int', 'NULL', '', '', '',
4473         'speed_down', 'int', 'NULL', '', '', '',
4474       ],
4475       'primary_key' => 'groupnum',
4476       'unique'      => [ ['groupname'] ],
4477       'index'       => [],
4478     },
4479
4480     'radius_attr' => {
4481       'columns' => [
4482         'attrnum',   'serial', '',      '', '', '',
4483         'groupnum',     'int', '',      '', '', '',
4484         'attrname', 'varchar', '', $char_d, '', '',
4485         'value',    'varchar', '',     255, '', '',
4486         'attrtype',    'char', '',       1, '', '',
4487         'op',          'char', '',       2, '', '',
4488       ],
4489       'primary_key'  => 'attrnum',
4490       'unique'       => [],
4491       'index'        => [ ['groupnum'], ],
4492       'foreign_keys' => [
4493                           { columns    => [ 'groupnum' ],
4494                             table      => 'radius_group',
4495                           },
4496                         ],
4497     },
4498
4499     'msgcat' => {
4500       'columns' => [
4501         'msgnum', 'serial', '', '', '', '', 
4502         'msgcode', 'varchar', '', 255, '', '', 
4503         'locale', 'varchar', '', 16, '', '', 
4504         'msg', 'text', '', '', '', '', 
4505       ],
4506       'primary_key' => 'msgnum',
4507       'unique'      => [ [ 'msgcode', 'locale' ] ],
4508       'index'       => [],
4509     },
4510
4511     'cust_tax_exempt' => {
4512       'columns' => [
4513         'exemptnum', 'serial', '', '', '', '', 
4514         'custnum',   'int', '', '', '', '', 
4515         'taxnum',    'int', '', '', '', '', 
4516         'year',      'int', '', '', '', '', 
4517         'month',     'int', '', '', '', '', 
4518         'amount',   @money_type, '', '', 
4519       ],
4520       'primary_key'  => 'exemptnum',
4521       'unique'       => [ [ 'custnum', 'taxnum', 'year', 'month' ] ],
4522       'index'        => [],
4523       'foreign_keys' => [
4524                           { columns    => [ 'custnum' ],
4525                             table      => 'cust_main',
4526                           },
4527                           { columns    => [ 'taxnum' ],
4528                             table      => 'cust_main_county',
4529                           },
4530                         ],
4531     },
4532
4533     'cust_tax_exempt_pkg' => {
4534       'columns' => [
4535         'exemptpkgnum',  'serial', '', '', '', '', 
4536         #'custnum',      'int', '', '', '', ''
4537         'billpkgnum',   'int', '', '', '', '', 
4538         'taxnum',       'int', '', '', '', '', 
4539         'taxtype',  'varchar', 'NULL', $char_d, '', '',
4540         'year',         'int', 'NULL', '', '', '', 
4541         'month',        'int', 'NULL', '', '', '', 
4542         'creditbillpkgnum', 'int', 'NULL', '', '', '',
4543         'amount',       @money_type, '', '', 
4544         # exemption type flags
4545         'exempt_cust',          'char', 'NULL', 1, '', '',
4546         'exempt_setup',         'char', 'NULL', 1, '', '',
4547         'exempt_recur',         'char', 'NULL', 1, '', '',
4548         'exempt_cust_taxname',  'char', 'NULL', 1, '', '',
4549         'exempt_monthly',       'char', 'NULL', 1, '', '',
4550       ],
4551       'primary_key'  => 'exemptpkgnum',
4552       'unique'       => [],
4553       'index'        => [ [ 'taxnum', 'year', 'month' ],
4554                           [ 'billpkgnum' ],
4555                           [ 'taxnum', 'taxtype' ],
4556                           [ 'creditbillpkgnum' ],
4557                         ],
4558       'foreign_keys' => [
4559                           { columns    => [ 'billpkgnum' ],
4560                             table      => 'cust_bill_pkg',
4561                           },
4562                           { columns    => [ 'creditbillpkgnum' ],
4563                             table      => 'cust_credit_bill_pkg',
4564                           },
4565                         ],
4566     },
4567
4568     'cust_tax_exempt_pkg_void' => {
4569       'columns' => [
4570         'exemptpkgnum',  'int', '', '', '', '', 
4571         #'custnum',      'int', '', '', '', ''
4572         'billpkgnum',   'int', '', '', '', '', 
4573         'taxnum',       'int', '', '', '', '', 
4574         'taxtype',  'varchar', 'NULL', $char_d, '', '',
4575         'year',         'int', 'NULL', '', '', '', 
4576         'month',        'int', 'NULL', '', '', '', 
4577         'creditbillpkgnum', 'int', 'NULL', '', '', '',
4578         'amount',       @money_type, '', '', 
4579         # exemption type flags
4580         'exempt_cust',          'char', 'NULL', 1, '', '',
4581         'exempt_setup',         'char', 'NULL', 1, '', '',
4582         'exempt_recur',         'char', 'NULL', 1, '', '',
4583         'exempt_cust_taxname',  'char', 'NULL', 1, '', '',
4584         'exempt_monthly',       'char', 'NULL', 1, '', '',
4585       ],
4586       'primary_key'  => 'exemptpkgnum',
4587       'unique'       => [],
4588       'index'        => [ [ 'taxnum', 'year', 'month' ],
4589                           [ 'billpkgnum' ],
4590                           [ 'taxnum', 'taxtype' ],
4591                           [ 'creditbillpkgnum' ],
4592                         ],
4593       'foreign_keys' => [
4594                           { columns    => [ 'billpkgnum' ],
4595                             table      => 'cust_bill_pkg_void',
4596                           },
4597                           { columns    => [ 'taxnum' ],
4598                             table      => 'cust_main_county',
4599                           },
4600                           { columns    => [ 'creditbillpkgnum' ],
4601                             table      => 'cust_credit_bill_pkg',
4602                           },
4603                         ],
4604     },
4605
4606     'router' => {
4607       'columns' => [
4608         'routernum', 'serial', '', '', '', '', 
4609         'routername', 'varchar', '', $char_d, '', '', 
4610         'svcnum', 'int', 'NULL', '', '', '', 
4611         'agentnum',   'int', 'NULL', '', '', '', 
4612         'manual_addr', 'char', 'NULL', 1, '', '',
4613       ],
4614       'primary_key'  => 'routernum',
4615       'unique'       => [],
4616       'index'        => [],
4617       'foreign_keys' => [
4618                           { columns    => [ 'svcnum' ],
4619                             table      => 'cust_svc', #svc_acct / svc_broadband
4620                           },
4621                           { columns    => [ 'agentnum' ],
4622                             table      => 'agent',
4623                           },
4624                         ],
4625     },
4626
4627     'part_svc_router' => {
4628       'columns' => [
4629         'svcrouternum', 'serial', '', '', '', '', 
4630         'svcpart', 'int', '', '', '', '', 
4631         'routernum', 'int', '', '', '', '', 
4632       ],
4633       'primary_key'  => 'svcrouternum',
4634       'unique'       => [],
4635       'index'        => [],
4636       'foreign_keys' => [
4637                           { columns    => [ 'svcpart' ],
4638                             table      => 'part_svc',
4639                           },
4640                           { columns    => [ 'routernum' ],
4641                             table      => 'router',
4642                           },
4643                         ],
4644     },
4645
4646     'addr_block' => {
4647       'columns' => [
4648         'blocknum', 'serial', '', '', '', '', 
4649         'routernum', 'int', '', '', '', '', 
4650         'ip_gateway', 'varchar', '', 15, '', '', 
4651         'ip_netmask', 'int', '', '', '', '', 
4652         'agentnum',   'int', 'NULL', '', '', '', 
4653         'manual_flag', 'char', 'NULL', 1, '', '', 
4654       ],
4655       'primary_key'  => 'blocknum',
4656       'unique'       => [ [ 'blocknum', 'routernum' ] ],
4657       'index'        => [],
4658       'foreign_keys' => [
4659                           #{ columns    => [ 'routernum' ],
4660                           #   table      => 'router',
4661                           #},
4662                           { columns    => [ 'agentnum' ],
4663                             table      => 'agent',
4664                           },
4665                         ],
4666     },
4667
4668     'addr_range' => {
4669       'columns' => [
4670         'rangenum', 'serial', '', '', '', '',
4671         'start',    'varchar', '', 15, '', '',
4672         'length',   'int', '', '', '', '',
4673         'status',   'varchar', 'NULL', 32, '', '',
4674       ],
4675       'primary_key' => 'rangenum',
4676       'unique'      => [],
4677       'index'       => [],
4678     },
4679
4680     'svc_broadband' => {
4681       'columns' => [
4682         'svcnum',                  'int',     '',        '', '', '', 
4683         'description',         'varchar', 'NULL',   $char_d, '', '', 
4684         'routernum',               'int', 'NULL',        '', '', '',
4685         'blocknum',                'int', 'NULL',        '', '', '', 
4686         'sectornum',               'int', 'NULL',        '', '', '',
4687         'speed_up',                'int', 'NULL',        '', '', '', 
4688         'speed_down',              'int', 'NULL',        '', '', '', 
4689         'ip_addr',             'varchar', 'NULL',        15, '', '', 
4690         'mac_addr',            'varchar', 'NULL',        12, '', '', 
4691         'authkey',             'varchar', 'NULL',        32, '', '', 
4692         'latitude',            'decimal', 'NULL',    '10,7', '', '', 
4693         'longitude',           'decimal', 'NULL',    '10,7', '', '', 
4694         'altitude',            'decimal', 'NULL',        '', '', '', 
4695         'vlan_profile',        'varchar', 'NULL',   $char_d, '', '', 
4696         'performance_profile', 'varchar', 'NULL',   $char_d, '', '',
4697         'plan_id',             'varchar', 'NULL',   $char_d, '', '',
4698         'radio_serialnum',     'varchar', 'NULL',   $char_d, '', '',
4699         'radio_location',      'varchar', 'NULL', 2*$char_d, '', '',
4700         'poe_location',        'varchar', 'NULL', 2*$char_d, '', '',
4701         'rssi',                    'int', 'NULL',        '', '', '',
4702         'suid',                    'int', 'NULL',        '', '', '',
4703         'shared_svcnum',           'int', 'NULL',        '', '', '',
4704         'serviceid',           'varchar', 'NULL',        64, '', '',#srvexport/reportfields
4705       ],
4706       'primary_key'  => 'svcnum',
4707       'unique'       => [ [ 'ip_addr' ], [ 'mac_addr' ] ],
4708       'index'        => [],
4709       'foreign_keys' => [
4710                           { columns    => [ 'svcnum' ],
4711                             table      => 'cust_svc',
4712                           },
4713                           { columns    => [ 'routernum' ],
4714                             table      => 'router',
4715                           },
4716                           { columns    => [ 'blocknum' ],
4717                             table      => 'addr_block',
4718                           },
4719                           { columns    => [ 'sectornum' ],
4720                             table      => 'tower_sector',
4721                           },
4722                           { columns    => [ 'shared_svcnum' ],
4723                             table      => 'svc_broadband',
4724                             references => [ 'svcnum' ],
4725                           },
4726                         ],
4727     },
4728
4729     'tower' => {
4730       'columns' => [
4731         'towernum',    'serial',     '',      '', '', '',
4732         #'agentnum',       'int', 'NULL',      '', '', '',
4733         'towername',  'varchar',     '', $char_d, '', '',
4734         'disabled',      'char', 'NULL',       1, '', '',
4735         'latitude',   'decimal', 'NULL',  '10,7', '', '', 
4736         'longitude',  'decimal', 'NULL',  '10,7', '', '', 
4737         'coord_auto',    'char', 'NULL',       1, '', '',
4738         'altitude',   'decimal', 'NULL',      '', '', '', 
4739         'height',     'decimal', 'NULL',      '', '', '', 
4740         'veg_height', 'decimal', 'NULL',      '', '', '', 
4741         'color',      'varchar', 'NULL',       6, '', '',
4742       ],
4743       'primary_key' => 'towernum',
4744       'unique'      => [ [ 'towername' ] ], # , 'agentnum' ] ],
4745       'index'       => [],
4746     },
4747
4748     'tower_sector' => {
4749       'columns' => [
4750         'sectornum',     'serial',     '',      '', '', '',
4751         'towernum',         'int',     '',      '', '', '',
4752         'sectorname',   'varchar',     '', $char_d, '', '',
4753         'ip_addr',      'varchar', 'NULL',      15, '', '',
4754         'height',       'decimal', 'NULL',      '', '', '', 
4755         'freq_mhz',         'int', 'NULL',      '', '', '',
4756         'direction',        'int', 'NULL',      '', '', '',
4757         'width',            'int', 'NULL',      '', '', '',
4758         #downtilt etc? rfpath has profile files for devices/antennas you upload?
4759         'sector_range', 'decimal', 'NULL',      '', '', '',  #?
4760       ],
4761       'primary_key'  => 'sectornum',
4762       'unique'       => [ [ 'towernum', 'sectorname' ], [ 'ip_addr' ], ],
4763       'index'        => [ [ 'towernum' ] ],
4764       'foreign_keys' => [
4765                           { columns    => [ 'towernum' ],
4766                             table      => 'tower',
4767                           },
4768                         ],
4769     },
4770
4771     'part_virtual_field' => {
4772       'columns' => [
4773         'vfieldpart', 'serial', '', '', '', '', 
4774         'dbtable', 'varchar', '', 32, '', '', 
4775         'name', 'varchar', '', 32, '', '', 
4776         'length', 'int', 'NULL', '', '', '', 
4777         'label', 'varchar', 'NULL', 80, '', '', 
4778       ],
4779       'primary_key' => 'vfieldpart',
4780       'unique' => [],
4781       'index' => [],
4782     },
4783
4784     'virtual_field' => {
4785       'columns' => [
4786         'vfieldnum', 'serial', '', '', '', '', 
4787         'recnum', 'int', '', '', '', '', 
4788         'vfieldpart', 'int', '', '', '', '', 
4789         'value', 'varchar', '', 128, '', '', 
4790       ],
4791       'primary_key'  => 'vfieldnum',
4792       'unique'       => [ [ 'vfieldpart', 'recnum' ] ],
4793       'index'        => [],
4794       'foreign_keys' => [
4795                           { columns    => [ 'vfieldpart' ],
4796                             table      => 'part_virtual_field',
4797                           },
4798                         ],
4799     },
4800
4801     'acct_snarf' => {
4802       'columns' => [
4803         'snarfnum',    'serial',     '',      '', '', '', 
4804         'snarfname',  'varchar', 'NULL', $char_d, '', '', 
4805         'svcnum',         'int',     '',      '', '', '', 
4806         'machine',    'varchar',     '',     255, '', '', 
4807         'protocol',   'varchar',     '', $char_d, '', '', 
4808         'username',   'varchar',     '', $char_d, '', '', 
4809         '_password',  'varchar',     '', $char_d, '', '', 
4810         'check_freq',     'int', 'NULL',      '', '', '', 
4811         'leavemail',     'char', 'NULL',       1, '', '', 
4812         'apop',          'char', 'NULL',       1, '', '', 
4813         'tls',           'char', 'NULL',       1, '', '', 
4814         'mailbox',    'varchar', 'NULL', $char_d, '', '', 
4815       ],
4816       'primary_key'  => 'snarfnum',
4817       'unique'       => [],
4818       'index'        => [ [ 'svcnum' ] ],
4819       'foreign_keys' => [
4820                           { columns    => [ 'svcnum' ],
4821                             table      => 'svc_acct',
4822                           },
4823                         ],
4824     },
4825
4826     'svc_external' => {
4827       'columns' => [
4828         'svcnum',     'int',     '',      '', '', '', 
4829         'id',      'bigint', 'NULL',      '', '', '', 
4830         'title',  'varchar', 'NULL', $char_d, '', '', 
4831       ],
4832       'primary_key'  => 'svcnum',
4833       'unique'       => [],
4834       'index'        => [],
4835       'foreign_keys' => [
4836                           { columns    => [ 'svcnum' ],
4837                             table      => 'cust_svc',
4838                           },
4839                         ],
4840     },
4841
4842     'cust_pay_refund' => {
4843       'columns' => [
4844         'payrefundnum', 'serial', '', '', '', '', 
4845         'paynum',  'int', '', '', '', '', 
4846         'refundnum',  'int', '', '', '', '', 
4847         '_date',    @date_type, '', '', 
4848         'amount',   @money_type, '', '', 
4849       ],
4850       'primary_key'  => 'payrefundnum',
4851       'unique'       => [],
4852       'index'        => [ ['paynum'], ['refundnum'] ],
4853       'foreign_keys' => [
4854                           { columns    => [ 'paynum' ],
4855                             table      => 'cust_pay',
4856                           },
4857                           { columns    => [ 'refundnum' ],
4858                             table      => 'cust_refund',
4859                           },
4860                         ],
4861     },
4862
4863     'part_pkg_option' => {
4864       'columns' => [
4865         'optionnum', 'serial', '', '', '', '', 
4866         'pkgpart', 'int', '', '', '', '', 
4867         'optionname', 'varchar', '', $char_d, '', '', 
4868         'optionvalue', 'text', 'NULL', '', '', '', 
4869       ],
4870       'primary_key'  => 'optionnum',
4871       'unique'       => [],
4872       'index'        => [ [ 'pkgpart' ], [ 'optionname' ] ],
4873       'foreign_keys' => [
4874                           { columns    => [ 'pkgpart' ],
4875                             table      => 'part_pkg',
4876                           },
4877                         ],
4878     },
4879
4880     'part_pkg_vendor' => {
4881       'columns' => [
4882         'num', 'serial', '', '', '', '', 
4883         'pkgpart', 'int', '', '', '', '', 
4884         'exportnum', 'int', '', '', '', '', 
4885         'vendor_pkg_id', 'varchar', '', $char_d, '', '', 
4886       ],
4887       'primary_key'  => 'num',
4888       'unique'       => [ [ 'pkgpart', 'exportnum' ] ],
4889       'index'        => [ [ 'pkgpart' ] ],
4890       'foreign_keys' => [
4891                           { columns    => [ 'pkgpart' ],
4892                             table      => 'part_pkg',
4893                           },
4894                           { columns    => [ 'exportnum' ],
4895                             table      => 'part_export',
4896                           },
4897                         ],
4898     },
4899
4900     'part_pkg_report_option' => {
4901       'columns' => [
4902         'num',      'serial',   '',      '', '', '', 
4903         'name',     'varchar',  '', $char_d, '', '', 
4904         'disabled', 'char', 'NULL',       1, '', '', 
4905       ],
4906       'primary_key' => 'num',
4907       'unique' => [ [ 'name' ] ],
4908       'index' => [ [ 'disabled' ] ],
4909     },
4910
4911     'part_pkg_usage' => {
4912       'columns' => [
4913         'pkgusagepart', 'serial',   '', '', '', '',
4914         'pkgpart',  'int',      '', '', '', '',
4915         'minutes',  'double precision',      '', '', '', '',
4916         'priority', 'int',  'NULL', '', '', '',
4917         'shared',   'char', 'NULL',  1, '', '',
4918         'rollover', 'char', 'NULL',  1, '', '',
4919         'description',  'varchar', 'NULL', $char_d, '', '',
4920       ],
4921       'primary_key'  => 'pkgusagepart',
4922       'unique'       => [],
4923       'index'        => [ [ 'pkgpart' ] ],
4924       'foreign_keys' => [
4925                           { columns    => [ 'pkgpart' ],
4926                             table      => 'part_pkg',
4927                           },
4928                         ],
4929     },
4930
4931     'part_pkg_usage_class' => {
4932       'columns' => [
4933         'num',       'serial',  '', '', '', '',
4934         'pkgusagepart', 'int',  '', '', '', '',
4935         'classnum',     'int','NULL', '', '', '',
4936       ],
4937       'primary_key'  => 'num',
4938       'unique'       => [ [ 'pkgusagepart', 'classnum' ] ],
4939       'index'        => [],
4940       'foreign_keys' => [
4941                           { columns    => [ 'pkgusagepart' ],
4942                             table      => 'part_pkg_usage',
4943                           },
4944                           { columns    => [ 'classnum' ],
4945                             table      => 'usage_class',
4946                           },
4947                         ],
4948     },
4949
4950     'part_pkg_fcc_option' => {
4951       'columns' => [
4952         'num',        'serial', '', '', '', '',
4953         'fccoptionname', 'varchar', '', $char_d, '', '',
4954         'pkgpart',       'int', '', '', '', '',
4955         'optionvalue',   'varchar', 'NULL', $char_d, '', '',
4956       ],
4957       'primary_key' => 'num',
4958       'unique'      => [ [ 'fccoptionname', 'pkgpart' ] ],
4959       'index'       => [],
4960     },
4961
4962     'rate' => {
4963       'columns' => [
4964         'ratenum',          'serial',     '', '', '', '', 
4965         'ratename',        'varchar', '',$char_d, '', '', 
4966         'agentnum',            'int', 'NULL', '', '', '',
4967         'default_detailnum',   'int', 'NULL', '', '', '',
4968       ],
4969       'primary_key' => 'ratenum',
4970       'unique'      => [],
4971       'index'       => [],
4972       'foreign_keys' => [
4973                           { columns    => [ 'agentnum' ],
4974                             table      => 'agent',
4975                           },
4976                         ],
4977     },
4978
4979     'rate_detail' => {
4980       'columns' => [
4981         'ratedetailnum',   'serial',  '',     '',      '', '', 
4982         'ratenum',         'int',     '',     '',      '', '', 
4983         'orig_regionnum',  'int', 'NULL',     '',      '', '', 
4984         'dest_regionnum',  'int', 'NULL',     '',      '', '', 
4985         'min_included',    'int',     '',     '',      '', '', 
4986         'conn_charge',     'decimal', '', '10,4', '0.0000', '',
4987         'conn_cost',       'decimal', '', '10,4', '0.0000', '',
4988         'conn_sec',        'int',     '',     '',      '0', '',
4989         'min_charge',      'decimal', '', '10,5',       '', '',
4990         'min_cost',        'decimal', '', '10,5','0.00000', '',
4991         'sec_granularity', 'int',     '',     '',       '', '', 
4992         'ratetimenum',     'int', 'NULL',     '',       '', '',
4993         'classnum',        'int', 'NULL',     '',       '', '', 
4994         'cdrtypenum',      'int', 'NULL',     '',       '', '',
4995         'region_group',   'char', 'NULL',      1,       '', '', 
4996         'upstream_mult_charge',  'decimal',  '', '10,4', '0.0000', '',
4997         'upstream_mult_cost',    'decimal',  '', '10,4', '0.0000', '',
4998       ],
4999       'primary_key'  => 'ratedetailnum',
5000       'unique'       => [ [ 'ratenum', 'orig_regionnum', 'dest_regionnum' ] ],
5001       'index'        => [ [ 'ratenum', 'dest_regionnum' ],
5002                           [ 'ratenum', 'ratetimenum' ]
5003                         ],
5004       'foreign_keys' => [
5005                           { columns    => [ 'ratenum' ],
5006                             table      => 'rate',
5007                           },
5008                           { columns    => [ 'orig_regionnum' ],
5009                             table      => 'rate_region',
5010                             references => [ 'regionnum' ],
5011                           },
5012                           { columns    => [ 'dest_regionnum' ],
5013                             table      => 'rate_region',
5014                             references => [ 'regionnum' ],
5015                           },
5016                           { columns    => [ 'ratetimenum' ],
5017                             table      => 'rate_time',
5018                           },
5019                           { columns    => [ 'classnum' ],
5020                             table      => 'usage_class',
5021                           },
5022                           { columns    => [ 'cdrtypenum' ],
5023                             table      => 'cdr_type',
5024                           },
5025                         ],
5026     },
5027
5028     'rate_region' => {
5029       'columns' => [
5030         'regionnum',   'serial',      '', '', '', '', 
5031         'regionname',  'varchar',     '', $char_d, '', '', 
5032         'exact_match', 'char',    'NULL',  1, '', '',
5033       ],
5034       'primary_key' => 'regionnum',
5035       'unique'      => [],
5036       'index'       => [],
5037     },
5038
5039     'rate_prefix' => {
5040       'columns' => [
5041         'prefixnum',   'serial',      '', '', '', '', 
5042         'regionnum',   'int',         '', '', '', '', 
5043         'countrycode', 'varchar',     '',  3, '', '', 
5044         'npa',         'varchar', 'NULL', 10, '', '', #actually the whole prefix
5045         'nxx',         'varchar', 'NULL',  3, '', '', #actually not used
5046         'latanum',     'int',     'NULL',      '', '', '',
5047         'state',       'char',    'NULL',       2, '', '', 
5048         'ocn',         'char',    'NULL',       4, '', '', 
5049       ],
5050       'primary_key'  => 'prefixnum',
5051       'unique'       => [],
5052       'index'        => [ [ 'countrycode' ], [ 'npa' ], [ 'regionnum' ] ],
5053       'foreign_keys' => [
5054                           { columns    => [ 'regionnum' ],
5055                             table      => 'rate_region',
5056                           },
5057                           { columns    => [ 'latanum' ],
5058                             table      => 'lata',
5059                           },
5060                         ],
5061     },
5062
5063     'rate_time' => {
5064       'columns' => [
5065         'ratetimenum', 'serial',      '',      '', '', '',
5066         'ratetimename',   'varchar',      '', $char_d, '', '',
5067       ],
5068       'primary_key' => 'ratetimenum',
5069       'unique'      => [],
5070       'index'       => [],
5071     },
5072
5073     'rate_time_interval' => {
5074       'columns' => [
5075         'intervalnum', 'serial', '', '', '', '',
5076         'stime',          'int', '', '', '', '',
5077         'etime',          'int', '', '', '', '',
5078         'ratetimenum',    'int', '', '', '', '',
5079       ],
5080       'primary_key'  => 'intervalnum',
5081       'unique'       => [],
5082       'index'        => [],
5083       'foreign_keys' => [
5084                           { columns    => [ 'ratetimenum' ],
5085                             table      => 'rate_time',
5086                           },
5087                         ],
5088      },
5089
5090     #not really part of the above rate_ stuff (used with flat rate rather than
5091     # rated billing), but could be eventually, and its a rate
5092     'rate_tier' => {
5093       'columns' => [
5094         'tiernum',   'serial', '',      '', '', '',
5095         'tiername', 'varchar', '', $char_d, '', '',
5096       ],
5097       'primary_key' => 'tiernum',
5098       'unique'      => [ [ 'tiername'], ],
5099       'index'       => [],
5100     },
5101
5102     'rate_tier_detail' => {
5103       'columns' => [
5104         'tierdetailnum', 'serial', '',     '', '', '',
5105         'tiernum',          'int', '',     '', '', '',
5106         'min_quan',         'int', '',     '', '', '',
5107         'min_charge',   'decimal', '', '10,4', '', '',
5108       ],
5109       'primary_key'  => 'tierdetailnum',
5110       'unique'       => [],
5111       'index'        => [ ['tiernum'], ],
5112       'foreign_keys' => [
5113                           { columns    => [ 'tiernum' ],
5114                             table      => 'rate_tier',
5115                           },
5116                         ],
5117     },
5118
5119     'usage_class' => {
5120       'columns' => [
5121         'classnum',    'serial',      '',      '', '', '', 
5122         'weight',      'int',     'NULL',      '', '', '',
5123         'classname',   'varchar',     '', $char_d, '', '', 
5124         'format',      'varchar', 'NULL', $char_d, '', '', 
5125         'disabled',    'char',    'NULL',       1, '', '', 
5126       ],
5127       'primary_key' => 'classnum',
5128       'unique' => [],
5129       'index' => [ ['disabled'] ],
5130     },
5131
5132     'reg_code' => {
5133       'columns' => [
5134         'codenum',   'serial',    '', '', '', '', 
5135         'code',      'varchar',   '', $char_d, '', '', 
5136         'agentnum',  'int',       '', '', '', '', 
5137       ],
5138       'primary_key'  => 'codenum',
5139       'unique'       => [ [ 'agentnum', 'code' ] ],
5140       'index'        => [ [ 'agentnum' ] ],
5141       'foreign_keys' => [
5142                           { columns    => [ 'agentnum' ],
5143                             table      => 'agent',
5144                           },
5145                         ],
5146      },
5147
5148     'reg_code_pkg' => {
5149       'columns' => [
5150         'codepkgnum', 'serial', '', '', '', '', 
5151         'codenum',   'int',    '', '', '', '', 
5152         'pkgpart',   'int',    '', '', '', '', 
5153       ],
5154       'primary_key'  => 'codepkgnum',
5155       'unique'       => [ [ 'codenum', 'pkgpart' ] ],
5156       'index'        => [ [ 'codenum' ] ],
5157       'foreign_keys' => [
5158                           { columns    => [ 'codenum' ],
5159                             table      => 'reg_code',
5160                           },
5161                           { columns    => [ 'pkgpart' ],
5162                             table      => 'part_pkg',
5163                           },
5164                         ],
5165     },
5166
5167     'clientapi_session' => {
5168       'columns' => [
5169         'sessionnum',  'serial',  '', '', '', '', 
5170         'sessionid',  'varchar',  '', $char_d, '', '', 
5171         'namespace',  'varchar',  '', $char_d, '', '', 
5172       ],
5173       'primary_key' => 'sessionnum',
5174       'unique'      => [ [ 'sessionid', 'namespace' ] ],
5175       'index'       => [],
5176     },
5177
5178     'clientapi_session_field' => {
5179       'columns' => [
5180         'fieldnum',    'serial',     '', '', '', '', 
5181         'sessionnum',     'int',     '', '', '', '', 
5182         'fieldname',  'varchar',     '', $char_d, '', '', 
5183         'fieldvalue',    'text', 'NULL', '', '', '', 
5184       ],
5185       'primary_key'  => 'fieldnum',
5186       'unique'       => [ [ 'sessionnum', 'fieldname' ] ],
5187       'index'        => [],
5188       'foreign_keys' => [
5189                           { columns    => [ 'sessionnum' ],
5190                             table      => 'clientapi_session',
5191                           },
5192                         ],
5193     },
5194
5195     'payment_gateway' => {
5196       'columns' => [
5197         'gatewaynum',       'serial',   '',     '', '', '', 
5198         'gateway_namespace','varchar',  'NULL', $char_d, '', '', 
5199         'gateway_module',   'varchar',  '',     $char_d, '', '', 
5200         'gateway_username', 'varchar',  'NULL', $char_d, '', '', 
5201         'gateway_password', 'varchar',  'NULL', $char_d, '', '', 
5202         'gateway_action',   'varchar',  'NULL', $char_d, '', '', 
5203         'gateway_callback_url', 'varchar',  'NULL', 255, '', '', 
5204         'gateway_cancel_url',   'varchar',  'NULL', 255, '', '',
5205         'disabled',   'char',  'NULL',   1, '', '', 
5206       ],
5207       'primary_key' => 'gatewaynum',
5208       'unique' => [],
5209       'index'  => [ [ 'disabled' ] ],
5210     },
5211
5212     'payment_gateway_option' => {
5213       'columns' => [
5214         'optionnum',   'serial',  '',     '', '', '', 
5215         'gatewaynum',  'int',     '',     '', '', '', 
5216         'optionname',  'varchar', '',     $char_d, '', '', 
5217         'optionvalue', 'text',    'NULL', '', '', '', 
5218       ],
5219       'primary_key'  => 'optionnum',
5220       'unique'       => [],
5221       'index'        => [ [ 'gatewaynum' ], [ 'optionname' ] ],
5222       'foreign_keys' => [
5223                           { columns    => [ 'gatewaynum' ],
5224                             table      => 'payment_gateway',
5225                           },
5226                         ],
5227     },
5228
5229     'agent_payment_gateway' => {
5230       'columns' => [
5231         'agentgatewaynum', 'serial', '', '', '', '', 
5232         'agentnum',        'int', '', '', '', '', 
5233         'gatewaynum',      'int', '', '', '', '', 
5234         'cardtype',        'varchar', 'NULL', $char_d, '', '', 
5235         'taxclass',        'varchar', 'NULL', $char_d, '', '', 
5236       ],
5237       'primary_key'  => 'agentgatewaynum',
5238       'unique'       => [],
5239       'index'        => [ [ 'agentnum', 'cardtype' ], ],
5240
5241       'foreign_keys' => [
5242
5243                           { columns    => [ 'agentnum' ],
5244                             table      => 'agent',
5245                           },
5246                           { columns    => [ 'gatewaynum' ],
5247                             table      => 'payment_gateway',
5248                           },
5249                         ],
5250     },
5251
5252     'banned_pay' => {
5253       'columns' => [
5254         'bannum',        'serial',     '',      '', '', '', 
5255         'payby',           'char',     '',       4, '', '', 
5256         'payinfo',      'varchar',     '',     128, '', '', #say, a 512-big digest _hex encoded
5257         'payinfo_hash', 'varchar', 'NULL',      32, '', '',
5258         #'paymask',      'varchar',  'NULL', $char_d, '', ''
5259         '_date',                @date_type,         '', '', 
5260         'end_date',             @date_type,         '', '', 
5261         'otaker',       'varchar', 'NULL',      32, '', '', 
5262         'usernum',          'int', 'NULL',      '', '', '',
5263         'bantype',      'varchar', 'NULL', $char_d, '', '',
5264         'reason',       'varchar', 'NULL', $char_d, '', '', 
5265       ],
5266       'primary_key'  => 'bannum',
5267       'unique'       => [],
5268       'index'        => [ [ 'payby', 'payinfo' ], [ 'usernum' ], ],
5269       'foreign_keys' => [
5270                           { columns    => [ 'usernum' ],
5271                             table      => 'access_user',
5272                           },
5273                         ],
5274     },
5275
5276     'pkg_category' => {
5277       'columns' => [
5278         'categorynum',        'serial',     '',      '', '', '', 
5279         'categoryname',      'varchar',     '', $char_d, '', '', 
5280         'weight',                'int', 'NULL',      '', '', '',
5281         'ticketing_queueid',     'int', 'NULL',      '', '', '', 
5282         'condense',             'char', 'NULL',       1, '', '', 
5283         'disabled',             'char', 'NULL',       1, '', '', 
5284       ],
5285       'primary_key' => 'categorynum',
5286       'unique' => [],
5287       'index' => [ ['disabled'] ],
5288     },
5289
5290     'pkg_class' => {
5291       'columns' => [
5292         'classnum',    'serial',   '',      '', '', '', 
5293         'classname',   'varchar',  '', $char_d, '', '', 
5294         'categorynum', 'int',  'NULL',      '', '', '', 
5295         'disabled',    'char', 'NULL',       1, '', '', 
5296         'fcc_ds0s',      'int',     'NULL', '', '', '', 
5297       ],
5298       'primary_key'  => 'classnum',
5299       'unique'       => [],
5300       'index'        => [ ['disabled'] ],
5301       'foreign_keys' => [
5302                           { columns    => [ 'categorynum' ],
5303                             table      => 'pkg_category',
5304                           },
5305                         ],
5306     },
5307
5308     'cdr' => {
5309       'columns' => [
5310         # qw( name type null length default local );
5311
5312         ###
5313         #asterisk fields
5314         ###
5315
5316         'acctid',   'bigserial',  '', '', '', '', 
5317         #'calldate', 'TIMESTAMP with time zone', '', '', \'now()', '',
5318         'calldate', 'timestamp',   '',      '', \'now()', '',
5319         'clid',        'varchar',  '', $char_d, \"''", '', 
5320         'src',         'varchar',  '', $char_d, \"''", '', 
5321         'dst',         'varchar',  '', $char_d, \"''", '', 
5322         'dcontext',    'varchar',  '', $char_d, \"''", '', 
5323         'channel',     'varchar',  '', $char_d, \"''", '', 
5324         'dstchannel',  'varchar',  '', $char_d, \"''", '', 
5325         'lastapp',     'varchar',  '', $char_d, \"''", '', 
5326         'lastdata',    'varchar',  '',     255, \"''", '', 
5327
5328         #currently only opensips & voipswitch
5329         'src_ip_addr', 'varchar',  'NULL',  15,    '', '',
5330
5331         #currently only opensips
5332         'dst_ip_addr', 'varchar',  'NULL',  15,    '', '',
5333
5334         #currently only u4:
5335         # terminating number (as opposed to dialed destination)
5336         'dst_term',    'varchar',  'NULL', $char_d, '', '',
5337
5338         #these don't seem to be logged by most of the SQL cdr_* modules
5339         #except tds under sql-illegal names, so;
5340         # ... don't rely on them for rating?
5341         # and, what they hey, i went ahead and changed the names and data types
5342         # to freeside-style dates...
5343           #'start',  'timestamp', 'NULL',  '',    '', '',
5344           #'answer', 'timestamp', 'NULL',  '',    '', '',
5345           #'end',    'timestamp', 'NULL',  '',    '', '',
5346         'startdate',  @date_type, '', '', 
5347         'answerdate', @date_type, '', '', 
5348         'enddate',    @date_type, '', '', 
5349         #
5350
5351         'duration',    'int',      '',      '',     0, '',
5352         'billsec',     'int',      '',      '',     0, '', 
5353         'disposition', 'varchar',  '',      45, \"''", '',
5354         'amaflags',    'int',      '',      '',     0, '',
5355         'accountcode', 'varchar',  '',      32, \"''", '',
5356         'uniqueid',    'varchar',  '', $char_d, \"''", '',
5357         'userfield',   'varchar',  '',     512, \"''", '',
5358
5359         'max_callers', 'int',  'NULL',      '',    '', '',
5360
5361         ###
5362         # old fields for unitel/RSLCOM/convergent that don't map to asterisk
5363         # ones we adoped moved to "own fields" section below
5364         # charged_party, upstream_price, rated_price, carrierid, cdrtypenum
5365         ###
5366
5367         'upstream_currency',      'char', 'NULL',       3, '', '',
5368         'upstream_rateplanid',     'int', 'NULL',      '', '', '', #?
5369
5370         # how it was rated internally...
5371         'ratedetailnum',           'int', 'NULL',      '', '', '',
5372
5373         'distance',            'decimal', 'NULL',      '', '', '',
5374         'islocal',                 'int', 'NULL',      '', '', '', # '',  '', 0, '' instead?
5375
5376         #cdr_calltype: the big list in appendix 2
5377         'calltypenum',             'int', 'NULL',      '', '', '',
5378
5379         'description',         'varchar', 'NULL', $char_d, '', '',
5380         'quantity',                'int', 'NULL',      '', '', '', 
5381
5382         'upstream_rateid',         'int', 'NULL',      '', '', '',
5383
5384         ###
5385         # more fields, for GSM imports
5386         ###
5387         'servicecode',             'int', 'NULL',      '', '', '',
5388         'quantity_able',           'int', 'NULL',      '', '', '', 
5389
5390         ###
5391         #and now for our own fields
5392         ###
5393
5394         'cdrtypenum',              'int', 'NULL',      '', '', '',
5395
5396         'charged_party',       'varchar', 'NULL', $char_d, '', '',
5397         'charged_party_imsi',  'varchar', 'NULL', $char_d, '', '',
5398
5399         'upstream_price',      'decimal', 'NULL',  '10,5', '', '', 
5400
5401         #currently only voipswitch
5402         #'upstream_rate',      'decimal', 'NULL',  '10,5', '', '', 
5403
5404         'upstream_src_regionname', 'varchar', 'NULL', $char_d, '', '',
5405         'upstream_dst_regionname', 'varchar', 'NULL', $char_d, '', '',
5406
5407         # how it was rated internally...
5408         'rated_pretty_dst',       'varchar', 'NULL', $char_d, '', '',
5409         'rated_regionname',       'varchar', 'NULL', $char_d, '', '',
5410         'rated_price',            'decimal', 'NULL',  '10,4', '', '',
5411         'rated_seconds',              'int', 'NULL',      '', '', '',
5412         'rated_minutes', 'double precision', 'NULL',      '', '', '',
5413         'rated_granularity',          'int', 'NULL',      '', '', '',
5414         'rated_ratedetailnum',        'int', 'NULL',      '', '', '',
5415         'rated_classnum',             'int', 'NULL',      '', '', '', 
5416         'rated_ratename',         'varchar', 'NULL', $char_d, '', '', 
5417
5418         'carrierid',               'bigint', 'NULL',      '', '', '',
5419
5420         # service it was matched to
5421         'svcnum',             'int',   'NULL',     '',   '', '', 
5422
5423         #NULL, done (or something)
5424         'freesidestatus', 'varchar',   'NULL',     32,   '', '', 
5425
5426         #NULL, done (or something)
5427         'freesiderewritestatus', 'varchar',   'NULL',     32,   '', '', 
5428
5429         #an indexed place to put big numbers
5430         'cdrid',         'bigint',     'NULL',     '',  '', '', 
5431
5432         #for taqua accountcode rewriting, for starters
5433         'sessionnum',       'int',    'NULL',      '', '', '',
5434         'subscriber',   'varchar',    'NULL', $char_d, '', '',
5435
5436         #old
5437         'cdrbatch',     'varchar',    'NULL',     255, '', '',
5438         #new
5439         'cdrbatchnum',      'int',    'NULL',      '', '', '',
5440
5441         # FK to cust_bill_pkg_detail; having a value here absolutely means
5442         # that the CDR appears on an invoice
5443         'detailnum',     'bigint',    'NULL',      '', '', '',
5444       ],
5445       'primary_key' => 'acctid',
5446       'unique' => [],
5447       'index' => [ [ 'calldate' ],
5448                    [ 'src' ], [ 'dst' ], [ 'dcontext' ], [ 'charged_party' ],
5449                    [ 'lastapp' ],
5450                    ['accountcode'], ['uniqueid'], ['carrierid'], ['cdrid'],
5451                    [ 'sessionnum' ], [ 'subscriber' ],
5452                    [ 'freesidestatus' ], [ 'freesiderewritestatus' ],
5453                    [ 'cdrbatch' ], [ 'cdrbatchnum' ],
5454                    [ 'src_ip_addr' ], [ 'dst_ip_addr' ], [ 'dst_term' ],
5455                  ],
5456       #no FKs on cdr table... choosing not to throw errors no matter what's
5457       # thrown in here.  better to have the data.
5458     },
5459
5460     'cdr_batch' => {
5461       'columns' => [
5462         'cdrbatchnum',   'serial',    '',   '', '', '', 
5463         'cdrbatch', 'varchar', 'NULL', 255, '', '',
5464         '_date',     @date_type, '', '', 
5465       ],
5466       'primary_key' => 'cdrbatchnum',
5467       'unique' => [ [ 'cdrbatch' ] ],
5468       'index' => [],
5469     },
5470
5471     'cdr_termination' => {
5472       'columns' => [
5473         'cdrtermnum', 'bigserial',     '',      '', '', '',
5474         'acctid',        'bigint',     '',      '', '', '', 
5475         'termpart',         'int',     '',      '', '', '',#future use see below
5476         'rated_price',  'decimal', 'NULL',  '10,4', '', '',
5477         'rated_seconds',    'int', 'NULL',      '', '', '',
5478         'rated_minutes', 'double precision', 'NULL',   '', '', '',
5479         'status',       'varchar', 'NULL',      32, '', '',
5480         'svcnum',           'int', 'NULL',      '', '', '',
5481       ],
5482       'primary_key'  => 'cdrtermnum',
5483       'unique'       => [ [ 'acctid', 'termpart' ] ],
5484       'index'        => [ [ 'acctid' ], [ 'status' ], ],
5485       'foreign_keys' => [
5486                           { columns    => [ 'acctid' ],
5487                             table      => 'cdr',
5488                           },
5489                           { columns    => [ 'svcnum' ],
5490                             table      => 'cust_svc',
5491                           },
5492                         ],
5493     },
5494
5495     #to handle multiple termination/settlement passes...
5496    # 'part_termination' => {
5497    #   'columns' => [
5498    #     'termpart',       'int', '',      '', '', '',
5499    #     'termname',   'varchar', '', $char_d, '', '',
5500    #     'cdr_column', 'varchar', '', $char_d, '', '', #maybe set it here instead of in the price plan?
5501    #   ],
5502    #   'primary_key' => 'termpart',
5503    #   'unique' => [],
5504    #   'index'  => [],
5505    # },
5506
5507     #the remaining cdr_ tables are not really used
5508     'cdr_calltype' => {
5509       'columns' => [
5510         'calltypenum',   'serial',  '', '', '', '', 
5511         'calltypename',  'varchar', '', $char_d, '', '', 
5512       ],
5513       'primary_key' => 'calltypenum',
5514       'unique'      => [],
5515       'index'       => [],
5516     },
5517
5518     'cdr_type' => {
5519       'columns' => [
5520         'cdrtypenum'  => 'serial',  '', '', '', '',
5521         'cdrtypename' => 'varchar', '', $char_d, '', '',
5522       ],
5523       'primary_key' => 'cdrtypenum',
5524       'unique'      => [],
5525       'index'       => [],
5526     },
5527
5528     'cdr_carrier' => {
5529       'columns' => [
5530         'carrierid'   =>  'serial',     '',      '', '', '',
5531         'carriername' => 'varchar',     '', $char_d, '', '',
5532         'disabled'    =>    'char', 'NULL',       1, '', '', 
5533       ],
5534       'primary_key' => 'carrierid',
5535       'unique'      => [],
5536       'index'       => [],
5537     },
5538
5539     #'cdr_file' => {
5540     #  'columns' => [
5541     #    'filenum',    'serial',     '', '', '', '',
5542     #    'filename',  'varchar',     '', '', '', '',
5543     #    'status',    'varchar', 'NULL', '', '', '',
5544     #  ],
5545     #  'primary_key' => 'filenum',
5546     #  'unique' => [ [ 'filename' ], ], #just change the index if we need to
5547     #                                   # agent-virtualize or have a customer
5548     #                                   # with dup-filename needs or something
5549     #                                   # (only used by cdr.http_and_import for
5550     #                                   #  chrissakes)
5551     #  'index'  => [],
5552     #},
5553
5554     'inventory_item' => {
5555       'columns' => [
5556         'itemnum',   'serial',      '',      '', '', '',
5557         'classnum',  'int',         '',      '', '', '',
5558         'agentnum',  'int',     'NULL',      '', '', '',
5559         'item',      'varchar',     '', $char_d, '', '',
5560         'svcnum',    'int',     'NULL',      '', '', '',
5561         'svc_field', 'varchar', 'NULL', $char_d, '', '',
5562       ],
5563       'primary_key'  => 'itemnum',
5564       'unique'       => [ [ 'classnum', 'item' ] ],
5565       'index'        => [ [ 'classnum' ], [ 'agentnum' ], [ 'svcnum' ] ],
5566       'foreign_keys' => [
5567                           { columns    => [ 'classnum' ],
5568                             table      => 'inventory_class',
5569                           },
5570                           { columns    => [ 'agentnum' ],
5571                             table      => 'agent',
5572                           },
5573                           { columns    => [ 'svcnum' ],
5574                             table      => 'cust_svc',
5575                           },
5576                         ],
5577     },
5578
5579     'inventory_class' => {
5580       'columns' => [
5581         'classnum',  'serial',       '',      '', '', '',
5582         'classname', 'varchar',      '', $char_d, '', '',
5583       ],
5584       'primary_key' => 'classnum',
5585       'unique' => [],
5586       'index'  => [],
5587     },
5588
5589     'access_user_session' => {
5590       'columns' => [
5591         'sessionnum',   'serial',  '',      '', '', '', 
5592         'sessionkey',  'varchar',  '', $char_d, '', '',
5593         'usernum',         'int',  '',      '', '', '',
5594         'start_date', @date_type,               '', '',
5595         'last_date',  @date_type,               '', '',
5596       ],
5597       'primary_key'  => 'sessionnum',
5598       'unique'       => [ [ 'sessionkey' ] ],
5599       'index'        => [],
5600       'foreign_keys' => [
5601                           { columns    => [ 'usernum' ],
5602                             table      => 'access_user',
5603                           },
5604                         ],
5605     },
5606
5607     'access_user' => {
5608       'columns' => [
5609         'usernum',             'serial',     '',      '', '', '',
5610         'username',           'varchar',     '', $char_d, '', '',
5611         '_password',          'varchar', 'NULL', $char_d, '', '',
5612         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
5613         'last',               'varchar', 'NULL', $char_d, '', '', 
5614         'first',              'varchar', 'NULL', $char_d, '', '', 
5615         'user_custnum',           'int', 'NULL',      '', '', '',
5616         'report_salesnum',        'int', 'NULL',      '', '', '',
5617         'disabled',              'char', 'NULL',       1, '', '', 
5618       ],
5619       'primary_key'  => 'usernum',
5620       'unique'       => [ [ 'username' ] ],
5621       'index'        => [ [ 'user_custnum' ] ],
5622       'foreign_keys' => [
5623                           { columns    => [ 'user_custnum' ],
5624                             table      => 'cust_main',
5625                             references => [ 'custnum' ],
5626                           },
5627                           { columns    => [ 'report_salesnum' ],
5628                             table      => 'sales',
5629                             references => [ 'salesnum' ],
5630                           },
5631                         ],
5632     },
5633
5634     'access_user_pref' => {
5635       'columns' => [
5636         'prefnum',    'serial',       '', '', '', '',
5637         'usernum',     'int',       '', '', '', '',
5638         'prefname', 'varchar', '', $char_d, '', '', 
5639         'prefvalue', 'text', 'NULL', '', '', '', 
5640         'expiration', @date_type, '', '',
5641       ],
5642       'primary_key'  => 'prefnum',
5643       'unique'       => [],
5644       'index'        => [ [ 'usernum' ] ],
5645       'foreign_keys' => [
5646                           { columns    => [ 'usernum' ],
5647                             table      => 'access_user',
5648                           },
5649                         ],
5650     },
5651
5652     'access_group' => {
5653       'columns' => [
5654         'groupnum',   'serial', '',      '', '', '',
5655         'groupname', 'varchar', '', $char_d, '', '',
5656       ],
5657       'primary_key' => 'groupnum',
5658       'unique' => [ [ 'groupname' ] ],
5659       'index'  => [],
5660     },
5661
5662     'access_usergroup' => {
5663       'columns' => [
5664         'usergroupnum', 'serial', '', '', '', '',
5665         'usernum',         'int', '', '', '', '',
5666         'groupnum',        'int', '', '', '', '',
5667       ],
5668       'primary_key'  => 'usergroupnum',
5669       'unique'       => [ [ 'usernum', 'groupnum' ] ],
5670       'index'        => [ [ 'usernum' ] ],
5671       'foreign_keys' => [
5672                           { columns    => [ 'usernum' ],
5673                             table      => 'access_user',
5674                           },
5675                           { columns    => [ 'groupnum' ],
5676                             table      => 'access_group',
5677                           },
5678                         ],
5679      },
5680
5681     'access_groupagent' => {
5682       'columns' => [
5683         'groupagentnum', 'serial', '', '', '', '',
5684         'groupnum',         'int', '', '', '', '',
5685         'agentnum',         'int', '', '', '', '',
5686       ],
5687       'primary_key'  => 'groupagentnum',
5688       'unique'       => [ [ 'groupnum', 'agentnum' ] ],
5689       'index'        => [ [ 'groupnum' ] ],
5690       'foreign_keys' => [
5691                           { columns    => [ 'groupnum' ],
5692                             table      => 'access_group',
5693                           },
5694                           { columns    => [ 'agentnum' ],
5695                             table      => 'agent',
5696                           },
5697                         ],
5698     },
5699
5700     'access_right' => {
5701       'columns' => [
5702         'rightnum',   'serial', '',      '', '', '',
5703         'righttype', 'varchar', '', $char_d, '', '',
5704         'rightobjnum',   'int', '',      '', '', '',
5705         'rightname', 'varchar', '', $char_d, '', '',
5706       ],
5707       'primary_key' => 'rightnum',
5708       'unique' => [ [ 'righttype', 'rightobjnum', 'rightname' ] ],
5709       'index'  => [],
5710     },
5711
5712     'sched_item' => {
5713       'columns' => [
5714         'itemnum',   'serial',      '', '', '', '', 
5715         'usernum',      'int',  'NULL', '', '', '', 
5716         #'itemname', 'varchar', $char_d, '', '', '',
5717         'disabled',    'char',  'NULL',  1, '', '', 
5718       ],
5719       'primary_key'  => 'itemnum',
5720       'unique'       => [ [ 'usernum' ] ],
5721       'index'        => [],
5722       'foreign_keys' => [
5723                           { columns    => [ 'usernum' ],
5724                             table      => 'access_user',
5725                           },
5726                         ],
5727     },
5728
5729     #'sched_item_class'
5730
5731     'sched_avail' => {
5732       'columns' => [
5733         'availnum',      'serial', '', '', '', '', 
5734         'itemnum',          'int', '', '', '', '',
5735         'wday',             'int', '', '', '', '',
5736         'stime',            'int', '', '', '', '',
5737         'etime',            'int', '', '', '', '',
5738         'override_date',    @date_type,    '', '',
5739       ],
5740       'primary_key'  => 'availnum',
5741       'unique'       => [],
5742       'index'        => [],
5743       'foreign_keys' => [
5744                           { columns    => [ 'itemnum' ],
5745                             table      => 'sched_item',
5746                           },
5747                         ],
5748     },
5749
5750     'svc_phone' => {
5751       'columns' => [
5752         'svcnum',                         'int',     '',      '', '', '', 
5753         'countrycode',                'varchar',     '',       3, '', '', 
5754         'phonenum',                   'varchar',     '',      25, '', '', #12 ?
5755         'sim_imsi',                   'varchar', 'NULL',      15, '', '',
5756         'pin',                        'varchar', 'NULL', $char_d, '', '',
5757         'sip_password',               'varchar', 'NULL', $char_d, '', '',
5758         'phone_name',                 'varchar', 'NULL', $char_d, '', '',
5759         'pbxsvc',                         'int', 'NULL',      '', '', '',
5760         'domsvc',                         'int', 'NULL',      '', '', '', 
5761         'locationnum',                    'int', 'NULL',      '', '', '',
5762         'forwarddst',                 'varchar', 'NULL',      15, '', '', 
5763         'email',                      'varchar', 'NULL',     255, '', '', 
5764         'lnp_status',                 'varchar', 'NULL', $char_d, '', '',
5765         'portable',                      'char', 'NULL',       1, '', '', 
5766         'lrn',                           'char', 'NULL',      10, '', '', 
5767         'lnp_desired_due_date',           'int', 'NULL',      '', '', '',
5768         'lnp_due_date',                   'int', 'NULL',      '', '', '',
5769         'lnp_other_provider',         'varchar', 'NULL', $char_d, '', '',
5770         'lnp_other_provider_account', 'varchar', 'NULL', $char_d, '', '',
5771         'lnp_reject_reason',          'varchar', 'NULL', $char_d, '', '',
5772         'sms_carrierid',                  'int', 'NULL',      '', '', '',
5773         'sms_account',                'varchar', 'NULL', $char_d, '', '',
5774         'max_simultaneous',               'int', 'NULL',      '', '', '',
5775         'e911_class',                    'char', 'NULL',       1, '', '',
5776         'e911_type',                     'char', 'NULL',       1, '', '', 
5777         'circuit_svcnum',                 'int', 'NULL',      '', '', '',
5778         'sip_server',                 'varchar', 'NULL', $char_d, '', '',
5779       ],
5780       'primary_key'  => 'svcnum',
5781       'unique'       => [ [ 'sms_carrierid', 'sms_account'] ],
5782       'index'        => [ ['countrycode', 'phonenum'], ['pbxsvc'], ['domsvc'],
5783                           ['locationnum'], ['sms_carrierid'],
5784                         ],
5785       'foreign_keys' => [
5786                           { columns    => [ 'svcnum' ],
5787                             table      => 'cust_svc',
5788                           },
5789                           { columns    => [ 'pbxsvc' ],
5790                             table      => 'svc_pbx', #'cust_svc',
5791                             references => [ 'svcnum' ],
5792                           },
5793                           { columns    => [ 'domsvc' ],
5794                             table      => 'svc_domain', #'cust_svc',
5795                             references => [ 'svcnum' ],
5796                           },
5797                           { columns    => [ 'locationnum' ],
5798                             table      => 'cust_location',
5799                           },
5800                           { columns    => [ 'sms_carrierid' ],
5801                             table      => 'cdr_carrier',
5802                             references => [ 'carrierid' ],
5803                           },
5804                           { columns    => [ 'circuit_svcnum' ],
5805                             table      => 'svc_circuit',
5806                             references => [ 'svcnum' ],
5807                           },
5808                         ],
5809     },
5810
5811     'phone_device' => {
5812       'columns' => [
5813         'devicenum', 'serial',     '', '', '', '',
5814         'devicepart',   'int',     '', '', '', '',
5815         'svcnum',       'int',     '', '', '', '', 
5816         'mac_addr', 'varchar', 'NULL', 12, '', '', 
5817       ],
5818       'primary_key'  => 'devicenum',
5819       'unique'       => [ [ 'mac_addr' ], ],
5820       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
5821       'foreign_keys' => [
5822                           { columns    => [ 'devicepart' ],
5823                             table      => 'part_device',
5824                           },
5825                           { columns    => [ 'svcnum' ],
5826                             table      => 'svc_phone',
5827                           },
5828                         ],
5829     },
5830
5831     'part_device' => {
5832       'columns' => [
5833         'devicepart', 'serial',  '',      '', '', '',
5834         'devicename', 'varchar', '', $char_d, '', '',
5835         'inventory_classnum', 'int', 'NULL', '', '', '',
5836       ],
5837       'primary_key'  => 'devicepart',
5838       'unique'       => [ [ 'devicename' ] ], #?
5839       'index'        => [],
5840       'foreign_keys' => [
5841                           { columns    => [ 'inventory_classnum' ],
5842                             table      => 'inventory_class',
5843                             references => [ 'classnum' ],
5844                           },
5845                         ],
5846     },
5847
5848     'phone_avail' => {
5849       'columns' => [
5850         'availnum',    'serial',      '',      '', '', '', 
5851         'exportnum',   'int',         '',      '', '', '', 
5852         'countrycode', 'varchar',     '',       3, '', '', 
5853         'state',       'char',    'NULL',       2, '', '', 
5854         'npa',         'char',        '',       3, '', '', 
5855         'nxx',         'char',    'NULL',       3, '', '', 
5856         'station',     'char',    'NULL',       4, '', '',
5857         'name',        'varchar', 'NULL', $char_d, '', '',
5858         'rate_center_abbrev', 'varchar', 'NULL', $char_d, '', '',
5859         'latanum',      'int',     'NULL',      '', '', '',
5860         'msanum',       'int', 'NULL', '', '', '',
5861         'ordernum',      'int',     'NULL',      '', '', '',
5862         'svcnum',      'int',     'NULL',      '', '', '',
5863         'availbatch', 'varchar',  'NULL', $char_d, '', '',
5864       ],
5865       'primary_key'  => 'availnum',
5866       'unique'       => [],
5867       'index'        => [ ['exportnum','countrycode','state'],    #npa search
5868                           ['exportnum','countrycode','npa'],      #nxx search
5869                           ['exportnum','countrycode','npa','nxx'],#station srch
5870                           [ 'exportnum','countrycode','npa','nxx','station'], #
5871                           [ 'svcnum' ],
5872                           [ 'availbatch' ],
5873                           [ 'latanum' ],
5874                         ],
5875       'foreign_keys' => [
5876                           { columns    => [ 'exportnum' ],
5877                             table      => 'part_export',
5878                           },
5879                           { columns    => [ 'latanum' ],
5880                             table      => 'lata',
5881                           },
5882                           { columns    => [ 'msanum' ],
5883                             table      => 'msa',
5884                           },
5885                           { columns    => [ 'ordernum' ],
5886                             table      => 'did_order',
5887                           },
5888                           { columns    => [ 'svcnum' ],
5889                             table      => 'svc_phone',
5890                           },
5891                         ],
5892     },
5893
5894     'lata' => {
5895       'columns' => [
5896         'latanum',    'int',      '',      '', '', '', 
5897         'description',   'varchar',    '',      $char_d, '', '', 
5898         'have_usage',   'int',    'NULL',      '', '', '', 
5899       ],
5900       'primary_key' => 'latanum',
5901       'unique' => [],
5902       'index'  => [],
5903     },
5904
5905     'msa' => {
5906       'columns' => [
5907         'msanum',    'int',      '',      '', '', '', 
5908         'description',   'varchar',    '',      $char_d, '', '', 
5909       ],
5910       'primary_key' => 'msanum',
5911       'unique' => [],
5912       'index'  => [],
5913     },
5914
5915     'rate_center' => {
5916       'columns' => [
5917         'ratecenternum',    'serial',      '',      '', '', '', 
5918         'description',   'varchar',    '',      $char_d, '', '', 
5919       ],
5920       'primary_key' => 'ratecenternum',
5921       'unique' => [],
5922       'index'  => [],
5923     },
5924
5925     'did_vendor' => {
5926       'columns' => [
5927         'vendornum',    'serial',      '',      '', '', '', 
5928         'vendorname',   'varchar',        '',     $char_d, '', '', 
5929       ],
5930       'primary_key' => 'vendornum',
5931       'unique' => [],
5932       'index'  => [],
5933     },
5934
5935     'did_order_item' => {
5936       'columns' => [
5937         'orderitemnum',    'serial',      '',      '', '', '', 
5938         'ordernum',    'int',      '',      '', '', '', 
5939         'msanum',      'int',     'NULL',      '', '', '',
5940         'npa',      'int',     'NULL',      '', '', '',
5941         'latanum',      'int',     'NULL',      '', '', '',
5942         'ratecenternum',      'int',     'NULL',      '', '', '',
5943         'state',       'char',    'NULL',       2, '', '', 
5944         'quantity',      'int',     '',      '', '', '',
5945         'custnum',   'int', 'NULL', '', '', '',
5946       ],
5947       'primary_key'  => 'orderitemnum',
5948       'unique'       => [],
5949       'index'        => [],
5950       'foreign_keys' => [
5951                           { columns    => [ 'ordernum' ],
5952                             table      => 'did_order',
5953                           },
5954                           { columns    => [ 'msanum' ],
5955                             table      => 'msa',
5956                           },
5957                           { columns    => [ 'latanum' ],
5958                             table      => 'lata',
5959                           },
5960                           { columns    => [ 'ratecenternum' ],
5961                             table      => 'rate_center',
5962                           },
5963                           { columns    => [ 'custnum' ],
5964                             table      => 'cust_main',
5965                           },
5966                         ],
5967     },
5968
5969     'did_order' => {
5970       'columns' => [
5971         'ordernum',    'serial',      '',      '', '', '', 
5972         'vendornum',   'int',       '',      '', '', '', 
5973         'vendor_order_id',   'varchar',  'NULL',   $char_d, '', '', 
5974         'custnum',   'int', 'NULL', '', '', '',
5975         'submitted',      'int',     '',      '', '', '',
5976         'confirmed',      'int',     'NULL',      '', '', '',
5977         'received',      'int',     'NULL',      '', '', '',
5978       ],
5979       'primary_key'  => 'ordernum',
5980       'unique'       => [ [ 'vendornum', 'vendor_order_id' ] ],
5981       'index'        => [],
5982       'foreign_keys' => [
5983                           { columns    => [ 'vendornum' ],
5984                             table      => 'did_vendor',
5985                           },
5986                           { columns    => [ 'custnum' ],
5987                             table      => 'cust_main',
5988                           },
5989                         ],
5990     },
5991
5992     'reason_type' => {
5993       'columns' => [
5994         'typenum',   'serial',  '', '', '', '', 
5995         'class',     'char', '', 1, '', '', 
5996         'type',     'varchar', '', $char_d, '', '', 
5997       ],
5998       'primary_key' => 'typenum',
5999       'unique' => [],
6000       'index' => [],
6001     },
6002
6003     'reason' => {
6004       'columns' => [
6005         'reasonnum',     'serial',  '', '', '', '', 
6006         'reason_type',   'int',  '', '', '', '', 
6007         'reason',        'text', '', '', '', '', 
6008         'disabled',      'char',    'NULL', 1, '', '', 
6009         'unsuspend_pkgpart', 'int',  'NULL', '', '', '',
6010         'unsuspend_hold','char',    'NULL', 1, '', '',
6011         'unused_credit', 'char',    'NULL', 1, '', '',
6012         'feepart',        'int', 'NULL', '', '', '',
6013         'fee_on_unsuspend','char',  'NULL', 1, '', '',
6014         'fee_hold',      'char',    'NULL', 1, '', '',
6015       ],
6016       'primary_key'  => 'reasonnum',
6017       'unique'       => [],
6018       'index'        => [],
6019       'foreign_keys' => [
6020                           { columns    => [ 'reason_type' ],
6021                             table      => 'reason_type',
6022                             references => [ 'typenum' ],
6023                           },
6024                           { columns    => [ 'unsuspend_pkgpart' ],
6025                             table      => 'part_pkg',
6026                             references => [ 'pkgpart' ],
6027                           },
6028                         ],
6029     },
6030
6031     'conf' => {
6032       'columns' => [
6033         'confnum',  'serial',     '',      '', '', '', 
6034         'agentnum', 'int',    'NULL',      '', '', '', 
6035         'locale',   'varchar','NULL',      16, '', '',
6036         'name',     'varchar',    '', $char_d, '', '', 
6037         'value',    'text',   'NULL',      '', '', '',
6038       ],
6039       'primary_key'  => 'confnum',
6040       'unique'       => [ [ 'agentnum', 'locale', 'name' ] ],
6041       'index'        => [],
6042       'foreign_keys' => [
6043                           { columns    => [ 'agentnum' ],
6044                             table      => 'agent',
6045                           },
6046                         ],
6047     },
6048
6049     'pkg_referral' => {
6050       'columns' => [
6051         'pkgrefnum',     'serial', '', '', '', '',
6052         'pkgnum',        'int',    '', '', '', '',
6053         'refnum',        'int',    '', '', '', '',
6054       ],
6055       'primary_key'  => 'pkgrefnum',
6056       'unique'       => [ [ 'pkgnum', 'refnum' ] ],
6057       'index'        => [ [ 'pkgnum' ], [ 'refnum' ] ],
6058       'foreign_keys' => [
6059                           { columns    => [ 'pkgnum' ],
6060                             table      => 'cust_pkg',
6061                           },
6062                           { columns    => [ 'refnum' ],
6063                             table      => 'part_referral',
6064                           },
6065                         ],
6066     },
6067
6068     'svc_pbx' => {
6069       'columns' => [
6070         'svcnum',           'int',     '',      '', '', '', 
6071         'id',               'int', 'NULL',      '', '', '', 
6072         'uuid',            'char', 'NULL',      36, '', '',
6073         'title',        'varchar', 'NULL', $char_d, '', '', 
6074         'max_extensions',   'int', 'NULL',      '', '', '',
6075         'max_simultaneous', 'int', 'NULL',      '', '', '',
6076         'ip_addr',      'varchar', 'NULL',      40, '', '',
6077       ],
6078       'primary_key'  => 'svcnum',
6079       'unique'       => [],
6080       'index'        => [ [ 'id' ], [ 'uuid' ] ],
6081       'foreign_keys' => [
6082                           { columns    => [ 'svcnum' ],
6083                             table      => 'cust_svc',
6084                           },
6085                         ],
6086     },
6087
6088     'pbx_extension' => {
6089       'columns' => [
6090         'extensionnum',  'serial',     '',      '', '', '',
6091         'svcnum',           'int',     '',      '', '', '',
6092         'extension',    'varchar',     '', $char_d, '', '',
6093         'pin',          'varchar', 'NULL', $char_d, '', '',
6094         'sip_password', 'varchar', 'NULL', $char_d, '', '',
6095         'phone_name',   'varchar', 'NULL', $char_d, '', '',
6096       ],
6097       'primary_key'  => 'extensionnum',
6098       'unique'       => [ [ 'svcnum', 'extension' ] ],
6099       'index'        => [ [ 'svcnum' ] ],
6100       'foreign_keys' => [
6101                           { columns    => [ 'svcnum' ],
6102                             table      => 'svc_pbx',
6103                           },
6104                         ],
6105     },
6106
6107     'pbx_device' => {
6108       'columns' => [
6109         'devicenum', 'serial',     '', '', '', '',
6110         'devicepart',   'int',     '', '', '', '',
6111         'svcnum',       'int',     '', '', '', '', 
6112         'mac_addr', 'varchar', 'NULL', 12, '', '', 
6113       ],
6114       'primary_key'  => 'devicenum',
6115       'unique'       => [ [ 'mac_addr' ], ],
6116       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
6117       'foreign_keys' => [
6118                           { columns    => [ 'devicepart' ],
6119                             table      => 'part_device',
6120                           },
6121                           { columns    => [ 'svcnum' ],
6122                             table      => 'svc_pbx',
6123                           },
6124                         ],
6125     },
6126
6127     'extension_device' => {
6128       'columns' => [
6129         'extensiondevicenum', 'serial', '', '', '', '',
6130         'extensionnum',          'int', '', '', '', '',
6131         'devicenum',             'int', '', '', '', '',
6132       ],
6133       'primary_key'  => 'extensiondevicenum',
6134       'unique'       => [ [ 'extensionnum', 'devicenum' ] ],
6135       'index'        => [],#both?  which way do we need to query?
6136       'foreign_keys' => [
6137                           { columns  => [ 'extensionnum' ],
6138                             table    => 'pbx_extension',
6139                           },
6140                           { columns  => [ 'devicenum' ],
6141                             table    => 'pbx_device',
6142                           },
6143                         ],
6144     },
6145
6146     'svc_mailinglist' => { #svc_group?
6147       'columns' => [
6148         'svcnum',            'int',     '',            '', '', '', 
6149         'username',      'varchar',     '', $username_len, '', '',
6150         'domsvc',            'int',     '',            '', '', '', 
6151         'listnum',           'int',     '',            '', '', '',
6152         'reply_to',         'char', 'NULL',             1, '', '',#SetReplyTo
6153         'remove_from',      'char', 'NULL',             1, '', '',#RemoveAuthor
6154         'reject_auto',      'char', 'NULL',             1, '', '',#RejectAuto
6155         'remove_to_and_cc', 'char', 'NULL',             1, '', '',#RemoveToAndCc
6156       ],
6157       'primary_key'  => 'svcnum',
6158       'unique'       => [],
6159       'index'        => [ ['username'], ['domsvc'], ['listnum'] ],
6160       'foreign_keys' => [
6161                           { columns    => [ 'svcnum' ],
6162                             table      => 'cust_svc',
6163                           },
6164                           { columns    => [ 'domsvc' ],
6165                             table      => 'svc_domain', #'cust_svc',
6166                             references => [ 'svcnum' ],
6167                           },
6168                           { columns    => [ 'listnum' ],
6169                             table      => 'mailinglist',
6170                           },
6171                         ],
6172     },
6173
6174     'mailinglist' => {
6175       'columns' => [
6176         'listnum',   'serial', '',      '', '', '',
6177         'listname', 'varchar', '', $char_d, '', '',
6178       ],
6179       'primary_key' => 'listnum',
6180       'unique' => [],
6181       'index'  => [],
6182     },
6183
6184     'mailinglistmember' => {
6185       'columns' => [
6186         'membernum',        'serial',     '',   '', '', '',
6187         'listnum',             'int',     '',   '', '', '',
6188         'svcnum',              'int', 'NULL',   '', '', '', 
6189         'contactemailnum',     'int', 'NULL',   '', '', '', 
6190         'email',           'varchar', 'NULL',  255, '', '', 
6191       ],
6192       'primary_key'  => 'membernum',
6193       'unique'       => [],
6194       'index'        => [['listnum'],['svcnum'],['contactemailnum'],['email']],
6195       'foreign_keys' => [
6196                           { columns    => [ 'listnum' ],
6197                             table      => 'mailinglist',
6198                           },
6199                           { columns    => [ 'svcnum' ],
6200                             table      => 'svc_acct',
6201                           },
6202                           { columns    => [ 'contactemailnum' ],
6203                             table      => 'contact_email',
6204                           },
6205                         ],
6206     },
6207
6208     'bill_batch' => {
6209       'columns' => [
6210         'batchnum',         'serial',     '',  '', '', '',
6211         'agentnum',            'int', 'NULL',  '', '', '',
6212         'status',             'char', 'NULL', '1', '', '',
6213         'pdf',                'blob', 'NULL',  '', '', '',
6214       ],
6215       'primary_key'  => 'batchnum',
6216       'unique'       => [],
6217       'index'        => [ ['agentnum'] ],
6218       'foreign_keys' => [
6219                           { columns    => [ 'agentnum' ],
6220                             table      => 'agent',
6221                           },
6222                         ],
6223     },
6224
6225     'cust_bill_batch' => {
6226       'columns' => [
6227         'billbatchnum',     'serial',     '', '', '', '',
6228         'batchnum',            'int',     '', '', '', '',
6229         'invnum',              'int',     '', '', '', '',
6230       ],
6231       'primary_key'  => 'billbatchnum',
6232       'unique'       => [],
6233       'index'        => [ [ 'batchnum' ], [ 'invnum' ] ],
6234       'foreign_keys' => [
6235                           { columns    => [ 'batchnum' ],
6236                             table      => 'bill_batch',
6237                           },
6238                           { columns    => [ 'invnum' ],
6239                             table      => 'cust_bill',
6240                           },
6241                         ],
6242     },
6243
6244     'cust_bill_batch_option' => {
6245       'columns' => [
6246         'optionnum', 'serial', '', '', '', '', 
6247         'billbatchnum', 'int', '', '', '', '', 
6248         'optionname', 'varchar', '', $char_d, '', '', 
6249         'optionvalue', 'text', 'NULL', '', '', '', 
6250       ],
6251       'primary_key'  => 'optionnum',
6252       'unique'       => [],
6253       'index'        => [ [ 'billbatchnum' ], [ 'optionname' ] ],
6254       'foreign_keys' => [
6255                           { columns    => [ 'billbatchnum' ],
6256                             table      => 'cust_bill_batch',
6257                           },
6258                         ],
6259      },
6260
6261     'msg_template' => {
6262       'columns' => [
6263         'msgnum',     'serial',     '',      '', '', '',
6264         'msgname',   'varchar',     '', $char_d, '', '',
6265         'agentnum',      'int', 'NULL',      '', '', '',
6266         'subject',   'varchar', 'NULL',     512, '', '',
6267         'mime_type', 'varchar',     '', $char_d, '', '',
6268         'body',         'blob', 'NULL',      '', '', '',
6269         'disabled',     'char', 'NULL',       1, '', '', 
6270         'from_addr', 'varchar', 'NULL',     255, '', '',
6271         'bcc_addr',  'varchar', 'NULL',     255, '', '',
6272       ],
6273       'primary_key'  => 'msgnum',
6274       'unique'       => [ ],
6275       'index'        => [ ['agentnum'], ],
6276       'foreign_keys' => [
6277                           { columns    => [ 'agentnum' ],
6278                             table      => 'agent',
6279                           },
6280                         ],
6281     },
6282
6283     'template_content' => {
6284       'columns' => [
6285         'contentnum', 'serial',     '',      '', '', '',
6286         'msgnum',        'int',     '',      '', '', '',
6287         'locale',    'varchar', 'NULL',      16, '', '',
6288         'subject',   'varchar', 'NULL',     512, '', '',
6289         'body',         'text', 'NULL',      '', '', '',
6290       ],
6291       'primary_key'  => 'contentnum',
6292       'unique'       => [ ['msgnum', 'locale'] ],
6293       'index'        => [ ],
6294       'foreign_keys' => [
6295                           { columns    => [ 'msgnum' ],
6296                             table      => 'msg_template',
6297                           },
6298                         ],
6299     },
6300
6301     'cust_msg' => {
6302       'columns' => [
6303         'custmsgnum', 'serial',     '',     '', '', '',
6304         'custnum',       'int', 'NULL',     '', '', '',
6305         'msgnum',        'int', 'NULL',     '', '', '',
6306         '_date',    @date_type,                 '', '',
6307         'env_from',  'varchar', 'NULL',    255, '', '',
6308         'env_to',    'varchar', 'NULL',    255, '', '',
6309         'header',       'blob', 'NULL',     '', '', '',
6310         'body',         'blob', 'NULL',     '', '', '',
6311         'error',     'varchar', 'NULL',    255, '', '',
6312         'status',    'varchar',     '',$char_d, '', '',
6313         'msgtype',   'varchar', 'NULL',     16, '', '',
6314       ],
6315       'primary_key'  => 'custmsgnum',
6316       'unique'       => [ ],
6317       'index'        => [ ['custnum'], ],
6318       'foreign_keys' => [
6319                           { columns    => [ 'custnum' ],
6320                             table      => 'cust_main',
6321                           },
6322                           { columns    => [ 'msgnum' ],
6323                             table      => 'msg_template',
6324                           },
6325                         ],
6326     },
6327
6328     'svc_cert' => {
6329       'columns' => [
6330         'svcnum',                'int',     '',      '', '', '', 
6331         'recnum',                'int', 'NULL',      '', '', '',
6332         'privatekey',           'text', 'NULL',      '', '', '',
6333         'csr',                  'text', 'NULL',      '', '', '',
6334         'certificate',          'text', 'NULL',      '', '', '',
6335         'cacert',               'text', 'NULL',      '', '', '',
6336         'common_name',       'varchar', 'NULL', $char_d, '', '',
6337         'organization',      'varchar', 'NULL', $char_d, '', '',
6338         'organization_unit', 'varchar', 'NULL', $char_d, '', '',
6339         'city',              'varchar', 'NULL', $char_d, '', '',
6340         'state',             'varchar', 'NULL', $char_d, '', '',
6341         'country',              'char', 'NULL',       2, '', '',
6342         'cert_contact',      'varchar', 'NULL', $char_d, '', '',
6343       ],
6344       'primary_key'  => 'svcnum',
6345       'unique'       => [],
6346       'index'        => [], #recnum
6347       'foreign_keys' => [
6348                           { columns    => [ 'svcnum' ],
6349                             table      => 'cust_svc',
6350                           },
6351                           { columns    => [ 'recnum' ],
6352                             table      => 'domain_record',
6353                           },
6354                         ],
6355     },
6356
6357     'svc_port' => {
6358       'columns' => [
6359         'svcnum',                'int',     '',      '', '', '', 
6360         'serviceid', 'varchar', '', 64, '', '', #srvexport / reportfields
6361       ],
6362       'primary_key'  => 'svcnum',
6363       'unique'       => [],
6364       'index'        => [], #recnum
6365       'foreign_keys' => [
6366                           { columns    => [ 'svcnum' ],
6367                             table      => 'cust_svc',
6368                           },
6369                         ],
6370     },
6371
6372     'areacode'  => {
6373       'columns' => [
6374         'areanum',   'serial',        '',      '', '', '',
6375         'code',        'char',        '',       3, '', '', 
6376         'country',     'char',    'NULL',       2, '', '',
6377         'state',       'char',    'NULL',       2, '', '', 
6378         'description','varchar',  'NULL',     255, '', '',
6379       ], 
6380       'primary_key' => 'areanum',
6381       'unique' => [ [ 'areanum' ] ],
6382       'index'  => [],
6383     },
6384
6385     'upgrade_journal' => {
6386       'columns' => [
6387         'upgradenum', 'serial', '', '', '', '',
6388         '_date', 'int', '', '', '', '',
6389         'upgrade', 'varchar', '', $char_d, '', '',
6390         'status', 'varchar', '', $char_d, '', '',
6391         'statustext', 'varchar', 'NULL', $char_d, '', '',
6392       ],
6393       'primary_key' => 'upgradenum',
6394       'unique' => [],
6395       'index' => [ [ 'upgrade' ] ],
6396     },
6397
6398     'upload_target' => {
6399       'columns' => [
6400         'targetnum', 'serial', '', '', '', '',
6401         'agentnum', 'int', 'NULL', '', '', '',
6402         'protocol', 'varchar', '', 10, '', '',
6403         'hostname', 'varchar', '', $char_d, '', '',
6404         'port', 'int', 'NULL', '', '', '',
6405         'username', 'varchar', '', $char_d, '', '',
6406         'password', 'varchar', 'NULL', $char_d, '', '',
6407         'path', 'varchar', 'NULL', $char_d, '', '',
6408         'subject', 'varchar', 'NULL', '255', '', '',
6409         'handling', 'varchar', 'NULL', $char_d, '', '',
6410       ],
6411       'primary_key'   => 'targetnum',
6412       'unique'        => [ [ 'targetnum' ] ],
6413       'index'         => [],
6414       'foreign_keys' => [
6415                           { columns    => [ 'agentnum' ],
6416                             table      => 'agent',
6417                           },
6418                         ],
6419     },
6420
6421     'log' => {
6422       'columns' => [
6423         'lognum',     'serial', '', '', '', '',
6424         '_date',      'int', '', '', '', '',
6425         'agentnum',   'int', 'NULL', '', '', '',
6426         'tablename',  'varchar', 'NULL', $char_d, '', '',
6427         'tablenum',   'int',  'NULL', '', '', '', 
6428         'level',      'int',  '', '', '', '',
6429         'message',    'text', '', '', '', '',
6430       ],
6431       'primary_key'  => 'lognum',
6432       'unique'       => [],
6433       'index'        => [ ['_date'], ['level'] ],
6434       'foreign_keys' => [
6435                           { columns    => [ 'agentnum' ],
6436                             table      => 'agent',
6437                           },
6438                         ],
6439     },
6440
6441     'log_context' => {
6442       'columns' => [
6443         'logcontextnum', 'serial', '', '', '', '',
6444         'lognum', 'int', '', '', '', '',
6445         'context', 'varchar', '', $char_d, '', '',
6446       ],
6447       'primary_key'  => 'logcontextnum',
6448       'unique'       => [ [ 'lognum', 'context' ] ],
6449       'index'        => [],
6450       'foreign_keys' => [
6451                           { columns    => [ 'lognum' ],
6452                             table      => 'log',
6453                           },
6454                         ],
6455     },
6456
6457     'svc_alarm' => {
6458       'columns' => [
6459 #       name               type        null   length   default local
6460         'svcnum',          'int',      '',    '',      '',     '', 
6461         'alarmsystemnum',  'int',      '',    '',      '',     '',
6462         'alarmtypenum',    'int',      '',    '',      '',     '',
6463         'alarmstationnum', 'int',      '',    '',      '',     '',
6464         'acctnum',         'varchar',  '',    $char_d, '',     '',
6465         '_password',       'varchar',  '',    $char_d, '',     '',
6466         'location',        'varchar', 'NULL', $char_d, '',     '',
6467         'cs_receiver',     'int',     'NULL', '',      '',     '',
6468         'cs_phonenum',     'varchar', 'NULL', $char_d, '',     '',
6469         'serialnum',       'varchar', 'NULL', $char_d, '',     '',
6470         #installer (rep)
6471       ],
6472       'primary_key'  => 'svcnum',
6473       'unique'       => [],
6474       'index'        => [],
6475       'foreign_keys' => [
6476                           { columns    => [ 'svcnum' ],
6477                             table      => 'cust_svc',
6478                           },
6479                           { columns    => [ 'alarmsystemnum' ],
6480                             table      => 'alarm_system',
6481                           },
6482                           { columns    => [ 'alarmtypenum' ],
6483                             table      => 'alarm_type',
6484                           },
6485                           { columns    => [ 'alarmstationnum' ],
6486                             table      => 'alarm_station',
6487                           },
6488                         ],
6489     },
6490
6491     'alarm_system' => { #vendors
6492       'columns' => [
6493         'alarmsystemnum',  'serial',     '',      '', '', '',
6494         'agentnum',           'int', 'NULL',      '', '', '',
6495         'systemname',     'varchar',     '', $char_d, '', '',
6496         'disabled',          'char', 'NULL',       1, '', '', 
6497       ],
6498       'primary_key' => 'alarmsystemnum',
6499       'unique'      => [ ['agentnum', 'systemname'] ],
6500       'index'       => [ ['agentnum'], ['disabled'] ],
6501       'foreign_keys' => [
6502                           { columns    => [ 'agentnum' ],
6503                             table      => 'agent',
6504                           },
6505                         ],
6506     },
6507
6508     'alarm_type' => { #inputs and outputs
6509       'columns' => [
6510         'alarmtypenum', 'serial',     '',      '', '', '',
6511         'agentnum',        'int', 'NULL',      '', '', '',
6512         'inputs',          'int',     '', '', '', '',
6513         'outputs',         'int',     '', '', '', '',
6514         'disabled',       'char', 'NULL',       1, '', '', 
6515       ],
6516       'primary_key' => 'alarmtypenum',
6517       'unique'      => [ ['agentnum', 'inputs', 'outputs'] ],
6518       'index'       => [ ['agentnum'], ['disabled'] ],
6519       'foreign_keys' => [
6520                           { columns    => [ 'agentnum' ],
6521                             table      => 'agent',
6522                           },
6523                         ],
6524     },
6525
6526     'alarm_station' => { #central station (where the alarm reports to)
6527       'columns' => [
6528         'alarmstationnum', 'serial',     '',      '', '', '',
6529         'agentnum',           'int', 'NULL',      '', '', '',
6530         'stationname',    'varchar',     '', $char_d, '', '',
6531         'disabled',          'char', 'NULL',       1, '', '', 
6532       ],
6533       'primary_key' => 'alarmstationnum',
6534       'unique'      => [ ['agentnum', 'stationname'], ],
6535       'index'       => [ ['agentnum'], ['disabled'] ],
6536       'foreign_keys' => [
6537                           { columns    => [ 'agentnum' ],
6538                             table      => 'agent',
6539                           },
6540                         ],
6541     },
6542
6543     'svc_cable' => {
6544       'columns' => [
6545         'svcnum',        'int',     '',      '', '', '', 
6546         'providernum',   'int', 'NULL',      '', '', '',
6547         'ordernum',  'varchar', 'NULL', $char_d, '', '',
6548         'modelnum',      'int', 'NULL',      '', '', '',
6549         'serialnum', 'varchar', 'NULL', $char_d, '', '',
6550         'mac_addr',  'varchar', 'NULL',      12, '', '', 
6551       ],
6552       'primary_key'  => 'svcnum',
6553       'unique'       => [ ['serialnum'] , ['mac_addr'] ],
6554       'index'        => [],
6555       'foreign_keys' => [
6556                           { columns    => [ 'svcnum' ],
6557                             table      => 'cust_svc',
6558                           },
6559                           { columns    => [ 'providernum' ],
6560                             table      => 'cable_provider',
6561                           },
6562                           { columns    => [ 'modelnum' ],
6563                             table      => 'cable_model',
6564                           },
6565                         ],
6566     },
6567
6568     'cable_model' => {
6569       'columns' => [
6570         'modelnum',    'serial',     '',      '', '', '',
6571         'model_name', 'varchar',     '', $char_d, '', '',
6572         'disabled',      'char', 'NULL',       1, '', '', 
6573       ],
6574       'primary_key' => 'modelnum',
6575       'unique' => [ [ 'model_name' ], ],
6576       'index'  => [],
6577     },
6578
6579     'cable_provider' => {
6580       'columns' => [
6581         'providernum', 'serial',     '',      '', '', '',
6582         'provider',   'varchar',     '', $char_d, '', '',
6583         'disabled',      'char', 'NULL',       1, '', '', 
6584       ],
6585       'primary_key' => 'providernum',
6586       'unique' => [ [ 'provider' ], ],
6587       'index'  => [],
6588     },
6589
6590     'svc_conferencing' => {
6591       'columns' => [
6592         'svcnum',            'int',     '',      '', '', '',
6593         'conf_id',           'int', 'NULL',      '', '', '', #"system assigned"
6594         'conf_name',     'varchar',     '', $char_d, '', '',
6595         'conf_password', 'varchar',     '', $char_d, '', '',
6596         'access_code',   'varchar',     '',      16, '', '',
6597         'duration',          'int',     '',      '', '', '',
6598         'participants',      'int',     '',      '', '', '',
6599         'conftypenum',       'int',     '',      '', '', '',
6600         'confqualitynum',    'int',     '',      '', '', '',
6601         'opt_recording',    'char', 'NULL',       1, '', '',
6602         'opt_sip',          'char', 'NULL',       1, '', '',
6603         'opt_phone',        'char', 'NULL',       1, '', '',
6604       ],
6605       'primary_key' => 'svcnum',
6606       'unique' => [],
6607       'index'  => [],
6608       'foreign_keys' => [
6609                           { columns => [ 'svcnum' ],
6610                             table   => 'cust_svc',
6611                           },
6612                           { columns => [ 'conftypenum' ],
6613                             table   => 'conferencing_type',
6614                           },
6615                           { columns => [ 'confqualitynum' ],
6616                             table   => 'conferencing_quality',
6617                           },
6618                         ],
6619     },
6620
6621     'conferencing_type' => {
6622       'columns' => [
6623         'conftypenum',  'int',     '',      '', '', '',
6624         'typeid'      , 'int',     '',      '', '', '',
6625         'typename', 'varchar',     '', $char_d, '', '',
6626         'disabled',    'char', 'NULL',       1, '', '', 
6627       ],
6628       'primary_key' => 'conftypenum',
6629       'unique'      => [ [ 'typeid', 'disabled' ], [ 'typename', 'disabled' ] ],
6630       'index'       => [],
6631     },
6632
6633     'conferencing_quality' => {
6634       'columns' => [
6635         'confqualitynum',  'int',     '',      '', '', '',
6636         'qualityid'      , 'int',     '',      '', '', '',
6637         'qualityname', 'varchar',     '', $char_d, '', '',
6638         'disabled',       'char', 'NULL',       1, '', '', 
6639       ],
6640       'primary_key' => 'confqualitynum',
6641       'unique'      => [ [ 'qualityid', 'disabled' ], [ 'qualityname', 'disabled' ] ],
6642       'index'       => [],
6643     },
6644
6645     'svc_video' => {
6646       'columns' => [
6647         'svcnum',            'int', '', '', '', '',
6648         'smartcard_num', 'varchar', '', 16, '', '',
6649         'mac_addr',      'varchar', '', 12, '', '', 
6650         'duration',          'int', '', '', '', '',
6651       ],
6652       'primary_key' => 'svcnum',
6653       'unique' => [], # [ 'smartcard_num' ], [ 'mac_addr' ], ],
6654       'index'  => [],
6655       'foreign_keys' => [
6656                           { columns => [ 'svcnum' ],
6657                             table   => 'cust_svc',
6658                           },
6659                         ],
6660     },
6661
6662     'circuit_type' => {
6663       'columns' => [
6664         'typenum',     'serial',     '',      '', '', '',
6665         'typename',   'varchar',     '', $char_d, '', '',
6666         'disabled',      'char', 'NULL',       1, '', '',
6667         # speed? number of voice lines? anything else?
6668       ],
6669       'primary_key' => 'typenum',
6670       'unique' => [ [ 'typename' ] ],
6671       'index'  => [],
6672     },
6673
6674     'circuit_provider' => {
6675       'columns' => [
6676         'providernum', 'serial',     '',      '', '', '',
6677         'provider',   'varchar',     '', $char_d, '', '',
6678         'disabled',      'char', 'NULL',       1, '', '', 
6679       ],
6680       'primary_key' => 'providernum',
6681       'unique' => [ [ 'provider' ], ],
6682       'index'  => [],
6683     },
6684
6685     'circuit_termination' => {
6686       'columns' => [
6687         'termnum',     'serial',     '',      '', '', '',
6688         'termination','varchar',     '', $char_d, '', '',
6689         'disabled',      'char', 'NULL',       1, '', '',
6690       ],
6691       'primary_key' => 'termnum',
6692       'unique' => [ [ 'termination' ] ],
6693       'index' => [],
6694     },
6695
6696     'svc_circuit' => {
6697       'columns' => [
6698         'svcnum',                   'int',     '', '', '', '',
6699         'typenum',                  'int',     '', '', '', '',
6700         'providernum',              'int',     '', '', '', '',
6701         'termnum',                  'int',     '', '', '', '',
6702         'circuit_id',           'varchar',     '', 64, '', '',
6703         'desired_due_date',         'int', 'NULL', '', '', '',
6704         'due_date',                 'int', 'NULL', '', '', '',
6705         'vendor_order_id',      'varchar', 'NULL', $char_d,  '', '',
6706         'vendor_qual_id',       'varchar', 'NULL', $char_d,  '', '',
6707         'vendor_order_type',    'varchar', 'NULL', $char_d,  '', '',
6708         'vendor_order_status',  'varchar', 'NULL', $char_d,  '', '',
6709         'endpoint_ip_addr',     'varchar', 'NULL', 40, '', '',
6710         'endpoint_mac_addr',    'varchar', 'NULL', 12, '', '',
6711       ],
6712       'primary_key' => 'svcnum',
6713       'unique'      => [],
6714       'index'       => [ [ 'providernum' ], [ 'typenum' ] ],
6715       'foreign_keys' => [
6716                           { columns => [ 'svcnum' ],
6717                             table   => 'cust_svc',
6718                           },
6719                           { columns => [ 'typenum' ],
6720                             table   => 'circuit_type',
6721                           },
6722                           { columns => [ 'providernum' ],
6723                             table   => 'circuit_provider',
6724                           },
6725                           { columns => [ 'termnum' ],
6726                             table   => 'circuit_termination',
6727                           },
6728       ],
6729     },
6730
6731     'vend_main' => {
6732       'columns' => [
6733         'vendnum',   'serial',     '',      '', '', '',
6734         'vendname', 'varchar',     '', $char_d, '', '',
6735         'classnum',     'int',     '',      '', '', '',
6736         'disabled',    'char', 'NULL',       1, '', '', 
6737       ],
6738       'primary_key'  => 'vendnum',
6739       'unique'       => [ ['vendname', 'disabled'] ],
6740       'index'        => [],
6741       'foreign_keys' => [
6742                           { columns    => [ 'classnum' ],
6743                             table      => 'vend_class',
6744                           },
6745                         ],
6746     },
6747
6748     'vend_class' => {
6749       'columns' => [
6750         'classnum',     'serial',     '',      '', '', '', 
6751         'classname',   'varchar',     '', $char_d, '', '', 
6752         'disabled',       'char', 'NULL',       1, '', '', 
6753       ],
6754       'primary_key' => 'classnum',
6755       'unique'      => [],
6756       'index'       => [ ['disabled'] ],
6757     },
6758
6759     'vend_bill' => {
6760       'columns' => [
6761         'vendbillnum',    'serial',     '',      '', '', '', 
6762         'vendnum',           'int',     '',      '', '', '', 
6763         #'_date',        @date_type,                  '', '', 
6764         '_date',     'int', '', '',                   '', '', 
6765         'charged',     @money_type,                  '', '', 
6766       ],
6767       'primary_key'  => 'vendbillnum',
6768       'unique'       => [],
6769       'index'        => [ ['vendnum'], ['_date'], ],
6770       'foreign_keys' => [
6771                           { columns    => [ 'vendnum' ],
6772                             table      => 'vend_main',
6773                           },
6774                         ],
6775     },
6776
6777     'vend_pay' => {
6778       'columns' => [
6779         'vendpaynum',   'serial',    '',       '', '', '',
6780         'vendnum',         'int',    '',       '', '', '', 
6781         #'_date',     @date_type,                   '', '', 
6782         '_date',     'int', '', '',                   '', '', 
6783         'paid',      @money_type,                  '', '', 
6784       ],
6785       'primary_key'  => 'vendpaynum',
6786       'unique'       => [],
6787       'index'        => [ [ 'vendnum' ], [ '_date' ], ],
6788       'foreign_keys' => [
6789                           { columns    => [ 'vendnum' ],
6790                             table      => 'vend_main',
6791                           },
6792                         ],
6793     },
6794
6795     'vend_bill_pay' => {
6796       'columns' => [
6797         'vendbillpaynum', 'serial',     '',   '', '', '', 
6798         'vendbillnum',       'int',     '',   '', '', '', 
6799         'vendpaynum',        'int',     '',   '', '', '', 
6800         'amount',  @money_type, '', '', 
6801         #? '_date',   @date_type, '', '', 
6802       ],
6803       'primary_key'  => 'vendbillpaynum',
6804       'unique'       => [],
6805       'index'        => [ [ 'vendbillnum' ], [ 'vendpaynum' ] ],
6806       'foreign_keys' => [
6807                           { columns    => [ 'vendbillnum' ],
6808                             table      => 'vend_bill',
6809                           },
6810                           { columns    => [ 'vendpaynum' ],
6811                             table      => 'vend_pay',
6812                           },
6813                         ],
6814     },
6815
6816     %{ tables_hashref_torrus() },
6817
6818     # tables of ours for doing torrus virtual port combining
6819     'torrus_srvderive' => {
6820       'columns' => [
6821         'derivenum',     'serial',     '', '', '', '',
6822         'serviceid',    'varchar',     '', 64, '', '', #srvexport / reportfields
6823         'last_srv_date',   'date', 'NULL', '', '', '',
6824       ],
6825       'primary_key' => 'derivenum',
6826       'unique' => [ ['serviceid'] ],
6827       'index'  => [],
6828     },
6829
6830     'torrus_srvderive_component' => {
6831       'columns' => [
6832         'componentnum', 'serial', '', '', '', '',
6833         'derivenum',       'int', '', '', '', '',
6834         'serviceid',   'varchar', '', 64, '', '', #srvexport / reportfields
6835       ],
6836       'primary_key'  => 'componentnum',
6837       'unique'       => [ [ 'derivenum', 'serviceid' ], ],
6838       'index'        => [ [ 'derivenum', ], ],
6839       'foreign_keys' => [
6840                           { columns    => [ 'derivenum' ],
6841                             table      => 'torrus_srvderive',
6842                           },
6843                         ],
6844     },
6845
6846     'invoice_mode' => {
6847       'columns' => [
6848         'modenum',      'serial', '', '', '', '',
6849         'agentnum',        'int', 'NULL', '', '', '',
6850         'modename',    'varchar', '', 32, '', '',
6851       ],
6852       'primary_key' => 'modenum',
6853       'unique'      => [ ],
6854       'index'       => [ ],
6855       'foreign_keys' => [
6856                           { columns    => [ 'agentnum' ],
6857                             table      => 'agent',
6858                           },
6859                         ],
6860     },
6861
6862     'invoice_conf' => {
6863       'columns' => [
6864         'confnum',              'serial',   '', '', '', '',
6865         'modenum',              'int',      '', '', '', '',
6866         'locale',               'varchar',  'NULL', 16, '', '',
6867         'notice_name',          'varchar',  'NULL', 64, '', '',
6868         'subject',              'varchar',  'NULL', 64, '', '',
6869         'htmlnotes',            'text',     'NULL', '', '', '',
6870         'htmlfooter',           'text',     'NULL', '', '', '',
6871         'htmlsummary',          'text',     'NULL', '', '', '',
6872         'htmlreturnaddress',    'text',     'NULL', '', '', '',
6873         'latexnotes',           'text',     'NULL', '', '', '',
6874         'latexfooter',          'text',     'NULL', '', '', '',
6875         'latexsummary',         'text',     'NULL', '', '', '',
6876         'latexsmallfooter',     'text',     'NULL', '', '', '',
6877         'latexreturnaddress',   'text',     'NULL', '', '', '',
6878         'with_latexcoupon',     'char',     'NULL', '1', '', '',
6879         'lpr',                  'varchar',  'NULL', $char_d, '', '',
6880       ],
6881       'primary_key'  => 'confnum',
6882       'unique'       => [ [ 'modenum', 'locale' ] ],
6883       'index'        => [ ],
6884       'foreign_keys' => [
6885                           { columns    => [ 'modenum' ],
6886                             table      => 'invoice_mode',
6887                           },
6888                         ],
6889     },
6890
6891     'export_batch' => {
6892       'columns' => [
6893         'batchnum',    'serial',     '',      '', '', '',
6894         'exportnum',      'int',     '',      '', '', '',
6895         '_date',          'int',     '',      '', '', '',
6896         'status',     'varchar', 'NULL',      32, '', '',
6897         'statustext',    'text', 'NULL',      '', '', '',
6898       ],
6899       'primary_key'  => 'batchnum',
6900       'unique'       => [],
6901       'index'        => [ [ 'exportnum' ], [ 'status' ] ],
6902       'foreign_keys' => [
6903                           { columns    => [ 'exportnum' ],
6904                             table      => 'part_export',
6905                             references => [ 'exportnum' ]
6906                           },
6907                         ],
6908     },
6909
6910     'export_batch_item' => {
6911       'columns' => [
6912         'itemnum',     'serial',     '',      '', '', '',
6913         'batchnum',       'int',     '',      '', '', '',
6914         'svcnum',         'int',     '',      '', '', '',
6915         'action',     'varchar',     '',      32, '', '',
6916         'data',          'text', 'NULL',      '', '', '',
6917         'frozen',        'char', 'NULL',       1, '', '',
6918       ],
6919       'primary_key'  => 'itemnum',
6920       'unique'       => [],
6921       'index'        => [ [ 'batchnum' ], [ 'svcnum' ] ],
6922       'foreign_keys' => [
6923                           { columns    => [ 'batchnum' ],
6924                             table      => 'export_batch',
6925                             references => [ 'batchnum' ]
6926                           },
6927                         ],
6928     },
6929
6930     # lookup table for states, similar to msa and lata
6931     'state' => {
6932       'columns' => [
6933         'statenum', 'int',  '', '', '', '', 
6934         'country',  'char', '',  2, '', '',
6935         'state',    'char', '', $char_d, '', '', 
6936         'fips',     'char', '',  3, '', '',
6937       ],
6938       'primary_key' => 'statenum',
6939       'unique' => [ [ 'country', 'state' ], ],
6940       'index' => [],
6941     },
6942
6943     # eventually link to tower/sector?
6944     'deploy_zone' => {
6945       'columns' => [
6946         'zonenum',        'serial',  '',     '',      '', '',
6947         'description',    'char',    'NULL', $char_d, '', '',
6948         'agentnum',       'int',     '',     '',      '', '',
6949         'dbaname',        'char',    'NULL', $char_d, '', '',
6950         'zonetype',       'char',    '',     1,       '', '',
6951         'technology',     'int',     '',     '',      '', '',
6952         'spectrum',       'int',     'NULL', '',      '', '',
6953         'adv_speed_up',   'decimal', '',     '10,3', '0', '',
6954         'adv_speed_down', 'decimal', '',     '10,3', '0', '',
6955         'cir_speed_up',   'decimal', '',     '10,3', '0', '',
6956         'cir_speed_down', 'decimal', '',     '10,3', '0', '',
6957         'is_broadband',   'char',    'NULL', 1,       '', '',
6958         'is_voice',       'char',    'NULL', 1,       '', '',
6959         'is_consumer',    'char',    'NULL', 1,       '', '',
6960         'is_business',    'char',    'NULL', 1,       '', '',
6961         'active_date',    @date_type,                 '', '',
6962         'expire_date',    @date_type,                 '', '',
6963       ],
6964       'primary_key' => 'zonenum',
6965       'unique' => [],
6966       'index'  => [ [ 'agentnum' ] ],
6967       'foreign_keys' => [
6968                           { columns     => [ 'agentnum' ],
6969                             table       => 'agent',
6970                             references  => [ 'agentnum' ],
6971                           },
6972                         ],
6973     },
6974
6975     'deploy_zone_block' => {
6976       'columns' => [
6977         'blocknum',       'serial',  '',     '',      '', '',
6978         'zonenum',        'int',     '',     '',      '', '',
6979         'censusblock',    'char',    '',     15,      '', '',
6980         'censusyear',     'char',    '',      4,      '', '',
6981       ],
6982       'primary_key' => 'blocknum',
6983       'unique' => [],
6984       'index'  => [ [ 'zonenum' ] ],
6985       'foreign_keys' => [
6986                           { columns     => [ 'zonenum' ],
6987                             table       => 'deploy_zone',
6988                             references  => [ 'zonenum' ],
6989                           },
6990                         ],
6991     },
6992
6993     'deploy_zone_vertex' => {
6994       'columns' => [
6995         'vertexnum',      'serial',  '',     '',      '', '',
6996         'zonenum',        'int',     '',     '',      '', '',
6997         'latitude',       'decimal', '',     '10,7',  '', '', 
6998         'longitude',      'decimal', '',     '10,7',  '', '', 
6999       ],
7000       'primary_key' => 'vertexnum',
7001       'unique' => [ ],
7002       'index'  => [ ],
7003       'foreign_keys' => [
7004                           { columns     => [ 'zonenum' ],
7005                             table       => 'deploy_zone',
7006                             references  => [ 'zonenum' ],
7007                           },
7008                         ],
7009     },
7010
7011     'cacti_page' => {
7012       'columns' => [
7013         'cacti_pagenum',  'serial',   '',     '', '', '',
7014         'exportnum',      'int',      'NULL', '', '', '',
7015         'svcnum',         'int',      'NULL', '', '', '', 
7016         'graphnum',       'int',      'NULL', '', '', '', 
7017         'imported',       @date_type,             '', '',
7018         'content',        'text',     'NULL', '', '', '',
7019       ],
7020       'primary_key' => 'cacti_pagenum',
7021       'unique'  => [ ],
7022       'index'   => [ ['svcnum'], ['imported'] ],
7023       'foreign_keys' => [
7024                           { columns    => [ 'svcnum' ],
7025                             table      => 'cust_svc',
7026                             references => [ 'svcnum' ],
7027                           },
7028                           { columns    => [ 'exportnum' ],
7029                             table      => 'part_export',
7030                             references => [ 'exportnum' ],
7031                           },
7032                         ],
7033     },
7034
7035     # name type nullability length default local
7036
7037     #'new_table' => {
7038     #  'columns' => [
7039     #    'num', 'serial',       '', '', '', '',
7040     #  ],
7041     #  'primary_key' => 'num',
7042     #  'unique' => [],
7043     #  'index'  => [],
7044     #},
7045
7046   };
7047
7048 }
7049
7050 =back
7051
7052 =head1 BUGS
7053
7054 =head1 SEE ALSO
7055
7056 L<DBIx::DBSchema>
7057
7058 =cut
7059
7060 1;
7061