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',   'int', 'NULL', '', '', '',
1647         'complimentary', 'char', 'NULL', 1, '', '',
1648         'po_number', 'varchar', 'NULL', $char_d, '', '',
1649         'invoice_attn', 'varchar', 'NULL', $char_d, '', '',
1650         'invoice_ship_address', 'char', 'NULL', 1, '', '',
1651       ],
1652       'primary_key'  => 'custnum',
1653       'unique'       => [ [ 'agentnum', 'agent_custid' ] ],
1654       #'index'        => [ ['last'], ['company'] ],
1655       'index'        => [
1656                           ['agentnum'], ['refnum'], ['classnum'], ['usernum'],
1657                           [ 'custbatch' ],
1658                           [ 'referral_custnum' ],
1659                           [ 'payby' ], [ 'paydate' ],
1660                           [ 'archived' ],
1661                           [ 'ship_locationnum' ],
1662                           [ 'bill_locationnum' ],
1663                         ],
1664       'foreign_keys' => [
1665                           { columns    => [ 'agentnum' ],
1666                             table      => 'agent',
1667                           },
1668                           { columns    => [ 'salesnum' ],
1669                             table      => 'sales',
1670                           },
1671                           { columns    => [ 'refnum' ],
1672                             table      => 'part_referral',
1673                           },
1674                           { columns    => [ 'classnum' ],
1675                             table      => 'cust_class',
1676                           },
1677                           { columns    => [ 'usernum' ],
1678                             table      => 'access_user',
1679                           },
1680                           { columns    => [ 'referral_custnum' ],
1681                             table      => 'cust_main',
1682                             references => [ 'custnum' ],
1683                           },
1684                           { columns    => [ 'bill_locationnum' ],
1685                             table      => 'cust_location',
1686                             references => [ 'locationnum' ],
1687                           },
1688                           { columns    => [ 'ship_locationnum' ],
1689                             table      => 'cust_location',
1690                             references => [ 'locationnum' ],
1691                           },
1692                         ],
1693     },
1694
1695     'cust_payby' => {
1696       'columns' => [
1697         'custpaybynum', 'serial',     '',        '', '', '', 
1698         'custnum',         'int',     '',        '', '', '',
1699         'weight',          'int', 'NULL',        '', '', '', 
1700         'payby',          'char',     '',         4, '', '', 
1701         'payinfo',     'varchar', 'NULL',       512, '', '', 
1702         'cardtype',    'varchar', 'NULL',   $char_d, '', '',
1703         'paycvv',      'varchar', 'NULL',       512, '', '', 
1704         'paymask',     'varchar', 'NULL',   $char_d, '', '', 
1705         #'paydate',   @date_type, '', '', 
1706         'paydate',     'varchar', 'NULL',        10, '', '', 
1707         'paystart_month',  'int', 'NULL',        '', '', '', 
1708         'paystart_year',   'int', 'NULL',        '', '', '', 
1709         'payissue',    'varchar', 'NULL',         2, '', '', 
1710         'payname',     'varchar', 'NULL', 2*$char_d, '', '', 
1711         'paystate',    'varchar', 'NULL',   $char_d, '', '', 
1712         'paytype',     'varchar', 'NULL',   $char_d, '', '', 
1713         'payip',       'varchar', 'NULL',        15, '', '', 
1714         'locationnum',     'int', 'NULL',        '', '', '',
1715       ],
1716       'primary_key'  => 'custpaybynum',
1717       'unique'       => [],
1718       'index'        => [ [ 'custnum' ] ],
1719       'foreign_keys' => [
1720                           { columns    => [ 'custnum' ],
1721                             table      => 'cust_main',
1722                           },
1723                           { columns    => [ 'locationnum' ],
1724                             table      => 'cust_location',
1725                           },
1726                         ],
1727     },
1728
1729     'contact_class' => {
1730       'columns' => [
1731         'classnum',    'serial',   '',      '', '', '', 
1732         'classname',   'varchar',  '', $char_d, '', '', 
1733         'disabled',    'char', 'NULL',       1, '', '', 
1734       ],
1735       'primary_key' => 'classnum',
1736       'unique' => [],
1737       'index' => [ ['disabled'] ],
1738     },
1739
1740     'cust_contact' => {
1741       'columns' => [
1742         'custcontactnum',     'serial',     '',  '', '', '',
1743         'custnum',               'int',     '',  '', '', '',
1744         'contactnum',            'int',     '',  '', '', '',
1745         'classnum',              'int', 'NULL',  '', '', '',
1746         'comment',           'varchar', 'NULL', 255, '', '',
1747         'selfservice_access',   'char', 'NULL',   1, '', '',
1748       ],
1749       'primary_key'  => 'custcontactnum',
1750       'unique'       => [ [ 'custnum', 'contactnum' ], ],
1751       'index'        => [ [ 'custnum' ], [ 'contactnum' ], ],
1752       'foreign_keys' => [
1753                           { columns    => [ 'custnum' ],
1754                             table      => 'cust_main',
1755                           },
1756                           { columns    => [ 'contactnum' ],
1757                             table      => 'contact',
1758                           },
1759                           { columns    => [ 'classnum' ],
1760                             table      => 'contact_class',
1761                           },
1762                         ],
1763     },
1764
1765     'prospect_contact' => {
1766       'columns' => [
1767         'prospectcontactnum', 'serial',     '',  '', '', '',
1768         'prospectnum',       'int',     '',  '', '', '',
1769         'contactnum',        'int',     '',  '', '', '',
1770         'classnum',          'int', 'NULL',  '', '', '',
1771         'comment',       'varchar', 'NULL', 255, '', '',
1772       ],
1773       'primary_key'  => 'prospectcontactnum',
1774       'unique'       => [ [ 'prospectnum', 'contactnum' ], ],
1775       'index'        => [ [ 'prospectnum' ], [ 'contactnum' ], ],
1776       'foreign_keys' => [
1777                           { columns    => [ 'prospectnum' ],
1778                             table      => 'prospect_main',
1779                           },
1780                           { columns    => [ 'contactnum' ],
1781                             table      => 'contact',
1782                           },
1783                           { columns    => [ 'classnum' ],
1784                             table      => 'contact_class',
1785                           },
1786                         ],
1787     },
1788
1789     'contact' => {
1790       'columns' => [
1791         'contactnum', 'serial',     '',      '', '', '',
1792         'prospectnum',   'int', 'NULL',      '', '', '', #deprecated, now prospect_contact table
1793         'custnum',       'int', 'NULL',      '', '', '', #deprecated, now cust_contact table
1794         'locationnum',   'int', 'NULL',      '', '', '', #not yet
1795         'classnum',      'int', 'NULL',      '', '', '', #deprecated, now prospect_contact or cust_contact
1796 #        'titlenum',      'int', 'NULL',      '', '', '', #eg Mr. Mrs. Dr. Rev.
1797         'last',      'varchar',     '', $char_d, '', '', 
1798 #        'middle',    'varchar', 'NULL', $char_d, '', '', 
1799         'first',     'varchar',     '', $char_d, '', '', 
1800         'title',     'varchar', 'NULL', $char_d, '', '', #eg Head Bottle Washer
1801         'comment',   'varchar', 'NULL',     255, '', '',  #depredated, now prospect_contact or cust_contact
1802         'selfservice_access',    'char', 'NULL',       1, '', '', #deprecated, now cust_contact
1803         '_password',          'varchar', 'NULL', $char_d, '', '',
1804         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
1805         'disabled',              'char', 'NULL',       1, '', '', 
1806       ],
1807       'primary_key'  => 'contactnum',
1808       'unique'       => [],
1809       'index'        => [ [ 'prospectnum' ], [ 'custnum' ], [ 'locationnum' ],
1810                           [ 'last' ], [ 'first' ],
1811                         ],
1812       'foreign_keys' => [
1813                           { columns    => [ 'prospectnum' ],
1814                             table      => 'prospect_main',
1815                           },
1816                           { columns    => [ 'custnum' ],
1817                             table      => 'cust_main',
1818                           },
1819                           { columns    => [ 'locationnum' ],
1820                             table      => 'cust_location',
1821                           },
1822                           { columns    => [ 'classnum' ],
1823                             table      => 'contact_class',
1824                           },
1825                         ],
1826     },
1827
1828     'contact_phone' => {
1829       'columns' => [
1830         'contactphonenum', 'serial',     '', '', '', '',
1831         'contactnum',         'int',     '', '', '', '',
1832         'phonetypenum',       'int',     '', '', '', '',
1833         'countrycode',    'varchar',     '',  3, '', '', 
1834         'phonenum',       'varchar',     '', 14, '', '', 
1835         'extension',      'varchar', 'NULL',  7, '', '',
1836         #?#'comment',        'varchar',     '', $char_d, '', '', 
1837       ],
1838       'primary_key'  => 'contactphonenum',
1839       'unique'       => [],
1840       'index'        => [],
1841       'foreign_keys' => [
1842                           { columns    => [ 'contactnum' ],
1843                             table      => 'contact',
1844                           },
1845                           { columns    => [ 'phonetypenum' ],
1846                             table      => 'phone_type',
1847                           },
1848                         ],
1849     },
1850
1851     'phone_type' => {
1852       'columns' => [
1853         'phonetypenum',  'serial', '',      '', '', '',
1854         'typename',     'varchar', '', $char_d, '', '',
1855         'weight',           'int', '',      '', '', '', 
1856       ],
1857       'primary_key' => 'phonetypenum',
1858       'unique'      => [ [ 'typename' ], ],
1859       'index'       => [],
1860     },
1861
1862     'contact_email' => {
1863       'columns' => [
1864         'contactemailnum', 'serial', '',      '', '', '',
1865         'contactnum',         'int', '',      '', '', '',
1866         'emailaddress',   'varchar', '', $char_d, '', '',
1867       ],
1868       'primary_key'  => 'contactemailnum',
1869       #'unique'       => [ [ 'contactnum', 'emailaddress' ], ],
1870       'unique'       => [ [ 'emailaddress' ], ],
1871       'index'        => [],
1872       'foreign_keys' => [
1873                           { columns    => [ 'contactnum' ],
1874                             table      => 'contact',
1875                           },
1876                         ],
1877     },
1878
1879     'prospect_main' => {
1880       'columns' => [
1881         'prospectnum',  'serial',     '',      '', '', '',
1882         'agentnum',        'int',     '',      '', '', '',
1883         'company',     'varchar', 'NULL', $char_d, '', '',
1884         'add_date',   @date_type,                  '', '', 
1885         'disabled',       'char', 'NULL',       1, '', '', 
1886         'custnum',         'int', 'NULL',      '', '', '',
1887         'refnum',          'int', 'NULL',      '', '', '', 
1888         'taxstatusnum',    'int', 'NULL',      '', '', '',
1889       ],
1890       'primary_key'  => 'prospectnum',
1891       'unique'       => [],
1892       'index'        => [ ['company'], ['agentnum'], ['disabled'], ['refnum'] ],
1893       'foreign_keys' => [
1894                           { columns    => [ 'agentnum' ],
1895                             table      => 'agent',
1896                           },
1897                           { columns    => [ 'custnum' ],
1898                             table      => 'cust_main',
1899                           },
1900                           { columns    => [ 'refnum' ],
1901                             table      => 'part_referral',
1902                           },
1903                         ],
1904     },
1905
1906     'quotation' => {
1907       'columns' => [
1908         #regular fields
1909         'quotationnum',   'serial',     '', '', '', '', 
1910         'prospectnum',       'int', 'NULL', '', '', '',
1911         'custnum',           'int', 'NULL', '', '', '',
1912         '_date',        @date_type,             '', '', 
1913         'disabled',         'char', 'NULL',  1, '', '', 
1914         'usernum',           'int', 'NULL', '', '', '',
1915         #'total',      @money_type,       '', '', 
1916         #'quotation_term', 'varchar', 'NULL', $char_d, '', '',
1917       ],
1918       'primary_key'  => 'quotationnum',
1919       'unique'       => [],
1920       'index'        => [ [ 'prospectnum' ], ['custnum'], ['disabled'], ],
1921       'foreign_keys' => [
1922                           { columns    => [ 'prospectnum' ],
1923                             table      => 'prospect_main',
1924                           },
1925                           { columns    => [ 'custnum' ],
1926                             table      => 'cust_main',
1927                           },
1928                           { columns    => [ 'usernum' ],
1929                             table      => 'access_user',
1930                           },
1931                         ],
1932     },
1933
1934     'quotation_pkg' => {
1935       'columns' => [
1936         'quotationpkgnum',   'serial',     '', '', '', '', 
1937         'quotationnum',         'int', 'NULL', '', '', '', #shouldn't be null,
1938                                                            # but history...
1939         'pkgpart',              'int',     '', '', '', '', 
1940         'locationnum',          'int', 'NULL', '', '', '',
1941         'start_date',      @date_type,             '', '', 
1942         'contract_end',    @date_type,             '', '',
1943         'quantity',             'int', 'NULL', '', '', '',
1944         'waive_setup',         'char', 'NULL',  1, '', '', 
1945         'unitsetup',     @money_typen,             '', '',
1946         'unitrecur',     @money_typen,             '', '',
1947       ],
1948       'primary_key'  => 'quotationpkgnum',
1949       'unique'       => [],
1950       'index'        => [ ['pkgpart'], ],
1951       'foreign_keys' => [
1952                           { columns    => [ 'quotationnum' ],
1953                             table      => 'quotation',
1954                           },
1955                           { columns    => [ 'pkgpart' ],
1956                             table      => 'part_pkg',
1957                           },
1958                           { columns    => [ 'locationnum' ],
1959                             table      => 'cust_location',
1960                           },
1961                         ],
1962     },
1963
1964     'quotation_pkg_discount' => {
1965       'columns' => [
1966         'quotationpkgdiscountnum', 'serial', '', '', '', '',
1967         'quotationpkgnum',            'int', '', '', '', '', 
1968         'discountnum',                'int', '', '', '', '',
1969         'setup_amount',        @money_typen,         '', '',
1970         'recur_amount',        @money_typen,         '', '',
1971         #'end_date',              @date_type,         '', '',
1972       ],
1973       'primary_key'  => 'quotationpkgdiscountnum',
1974       'unique'       => [],
1975       'index'        => [ [ 'quotationpkgnum' ], ], #[ 'discountnum' ] ],
1976       'foreign_keys' => [
1977                           { columns    => [ 'quotationpkgnum' ],
1978                             table      => 'quotation_pkg',
1979                           },
1980                           { columns    => [ 'discountnum' ],
1981                             table      => 'discount',
1982                           },
1983                         ],
1984     },
1985
1986     'quotation_pkg_tax' => {
1987       'columns' => [
1988         'quotationtaxnum',  'serial',     '',      '', '', '',
1989         'quotationpkgnum',     'int',     '',      '', '', '',
1990         'itemdesc',        'varchar',     '', $char_d, '', '',
1991         'setup_amount',    @money_type,                '', '',
1992         'recur_amount',    @money_type,                '', '',
1993       ],
1994       'primary_key' => 'quotationtaxnum',
1995       'unique' => [],
1996       'index'  => [ [ 'quotationpkgnum' ] ],
1997       'foreign_keys' => [
1998                           { columns    => [ 'quotationpkgnum' ],
1999                             table      => 'quotation_pkg',
2000                           },
2001                         ],
2002     },
2003
2004     'cust_location' => { #'location' now that its prospects too, but...
2005       'columns' => [
2006         'locationnum',      'serial',     '',      '', '', '',
2007         'prospectnum',         'int', 'NULL',      '', '', '',
2008         'custnum',             'int', 'NULL',      '', '', '',
2009         'locationname',    'varchar', 'NULL', $char_d, '', '',
2010         'address1',        'varchar',     '', $char_d, '', '', 
2011         'address2',        'varchar', 'NULL', $char_d, '', '', 
2012         'city',            'varchar',     '', $char_d, '', '', 
2013         'county',          'varchar', 'NULL', $char_d, '', '', 
2014         'state',           'varchar', 'NULL', $char_d, '', '', 
2015         'zip',             'varchar', 'NULL',      10, '', '', 
2016         'latitude',        'decimal', 'NULL',  '10,7', '', '', 
2017         'longitude',       'decimal', 'NULL',  '10,7', '', '', 
2018         'coord_auto',         'char', 'NULL',       1, '', '',
2019         'addr_clean',         'char', 'NULL',       1, '', '',
2020         'country',            'char',     '',       2, '', '', 
2021         'geocode',         'varchar', 'NULL',      20, '', '',
2022         'district',        'varchar', 'NULL',      20, '', '',
2023         'censustract',     'varchar', 'NULL',      20, '', '',
2024         'censusyear',         'char', 'NULL',       4, '', '',
2025         'location_type',   'varchar', 'NULL',      20, '', '',
2026         'location_number', 'varchar', 'NULL',      20, '', '',
2027         'location_kind',      'char', 'NULL',       1, '', '',
2028         'incorporated',       'char', 'NULL',       1, '', '',
2029         'disabled',           'char', 'NULL',       1, '', '', 
2030       ],
2031       'primary_key'  => 'locationnum',
2032       'unique'       => [],
2033       'index'        => [ [ 'prospectnum' ], [ 'custnum' ],
2034                           [ 'county' ], [ 'state' ], [ 'country' ], [ 'zip' ],
2035                           [ 'city' ], [ 'district' ]
2036                         ],
2037       'foreign_keys' => [
2038                           { columns    => [ 'prospectnum' ],
2039                             table      => 'prospect_main',
2040                           },
2041                           { columns    => [ 'custnum' ],
2042                             table      => 'cust_main',
2043                           },
2044                         ],
2045     },
2046
2047     'cust_main_invoice' => {
2048       'columns' => [
2049         'destnum',  'serial',  '',     '', '', '', 
2050         'custnum',  'int',  '',     '', '', '', 
2051         'dest',     'varchar', '',  $char_d, '', '', 
2052       ],
2053       'primary_key'  => 'destnum',
2054       'unique'       => [],
2055       'index'        => [ ['custnum'], ],
2056       'foreign_keys' => [
2057                           { columns    => [ 'custnum' ],
2058                             table      => 'cust_main',
2059                           },
2060                         ],
2061     },
2062
2063     'cust_main_credit_limit' => {
2064       'columns' => [
2065         'creditlimitnum',   'serial', '', '', '', '',
2066         'custnum',             'int', '', '', '', '', 
2067         '_date',          @date_type,         '', '', 
2068         'amount',       @money_typen,         '', '',
2069         #'amount_currency', 'char', 'NULL',  3, '', '',
2070         'credit_limit', @money_typen,         '', '',
2071         #'credit_limit_currency', 'char', 'NULL',  3, '', '',
2072       ],
2073       'primary_key'  => 'creditlimitnum',
2074       'unique'       => [],
2075       'index'        => [ ['custnum'], ],
2076       'foreign_keys' => [
2077                           { columns    => [ 'custnum' ],
2078                             table      => 'cust_main',
2079                           },
2080                         ],
2081     },
2082
2083     'cust_main_note' => {
2084       'columns' => [
2085         'notenum',   'serial',    '',  '', '', '', 
2086         'custnum',      'int',    '',  '', '', '', 
2087         'classnum',     'int', 'NULL', '', '', '', 
2088         '_date',          @date_type,      '', '', 
2089         'otaker',   'varchar', 'NULL', 32, '', '', 
2090         'usernum',      'int', 'NULL', '', '', '',
2091         'comments',    'text', 'NULL', '', '', '', 
2092         'sticky',       'int',     '', '',  0, '',
2093       ],
2094       'primary_key'  => 'notenum',
2095       'unique'       => [],
2096       'index'        => [ [ 'custnum' ], [ '_date' ], [ 'usernum' ], ],
2097       'foreign_keys' => [
2098                           { columns    => [ 'custnum' ],
2099                             table      => 'cust_main',
2100                           },
2101                           { columns    => [ 'classnum' ],
2102                             table      => 'cust_note_class',
2103                           },
2104                           { columns    => [ 'usernum' ],
2105                             table      => 'access_user',
2106                           },
2107                         ],
2108     },
2109
2110     'cust_note_class' => {
2111       'columns' => [
2112         'classnum',    'serial',   '',      '', '', '', 
2113         'classname',   'varchar',  '', $char_d, '', '', 
2114         'disabled',    'char', 'NULL',       1, '', '', 
2115       ],
2116       'primary_key' => 'classnum',
2117       'unique' => [],
2118       'index' => [ ['disabled'] ],
2119     },
2120
2121     'cust_category' => {
2122       'columns' => [
2123         'categorynum',   'serial',  '', '', '', '', 
2124         'categoryname',  'varchar', '', $char_d, '', '', 
2125         'weight',         'int', 'NULL',  '', '', '',
2126         'disabled',      'char', 'NULL',   1, '', '', 
2127       ],
2128       'primary_key' => 'categorynum',
2129       'unique' => [],
2130       'index' => [ ['disabled'] ],
2131     },
2132
2133     'cust_class' => {
2134       'columns' => [
2135         'classnum',     'serial',     '',      '', '', '', 
2136         'classname',   'varchar',     '', $char_d, '', '', 
2137         'categorynum',     'int', 'NULL',      '', '', '', 
2138         'tax',            'char', 'NULL',       1, '', '', 
2139         'disabled',       'char', 'NULL',       1, '', '', 
2140       ],
2141       'primary_key'  => 'classnum',
2142       'unique'       => [],
2143       'index'        => [ ['disabled'] ],
2144       'foreign_keys' => [
2145                           { columns    => [ 'categorynum' ],
2146                             table      => 'cust_category',
2147                           },
2148                         ],
2149     },
2150  
2151     'cust_tag' => {
2152       'columns' => [
2153         'custtagnum', 'serial', '', '', '', '',
2154         'custnum',       'int', '', '', '', '',
2155         'tagnum',        'int', '', '', '', '',
2156       ],
2157       'primary_key'  => 'custtagnum',
2158       'unique'       => [ [ 'custnum', 'tagnum' ] ],
2159       'index'        => [ [ 'custnum' ] ],
2160       'foreign_keys' => [
2161                           { columns    => [ 'custnum' ],
2162                             table      => 'cust_main',
2163                           },
2164                           { columns    => [ 'tagnum' ],
2165                             table      => 'part_tag',
2166                           },
2167                         ],
2168     },
2169
2170     'part_tag' => {
2171       'columns' => [
2172         'tagnum',    'serial',     '',      '', '', '',
2173         'tagname',  'varchar',     '', $char_d, '', '',
2174         'tagdesc',  'varchar', 'NULL', $char_d, '', '',
2175         'tagcolor', 'varchar', 'NULL',       6, '', '',
2176         'by_default',  'char', 'NULL',       1, '', '',
2177         'disabled',    'char', 'NULL',       1, '', '', 
2178       ],
2179       'primary_key' => 'tagnum',
2180       'unique'      => [], #[ [ 'tagname' ] ], #?
2181       'index'       => [ [ 'disabled' ] ],
2182     },
2183
2184     'cust_main_exemption' => {
2185       'columns' => [
2186         'exemptionnum',   'serial',     '',      '', '', '',
2187         'custnum',           'int',     '',      '', '', '', 
2188         'taxname',       'varchar',     '', $char_d, '', '',
2189         'exempt_number', 'varchar', 'NULL', $char_d, '', '',
2190         #start/end dates?  for reporting?
2191       ],
2192       'primary_key'  => 'exemptionnum',
2193       'unique'       => [],
2194       'index'        => [ [ 'custnum' ] ],
2195       'foreign_keys' => [
2196                           { columns    => [ 'custnum' ],
2197                             table      => 'cust_main',
2198                           },
2199                         ],
2200     },
2201
2202     'cust_tax_adjustment' => {
2203       'columns' => [
2204         'adjustmentnum', 'serial',     '',      '', '', '',
2205         'custnum',          'int',     '',      '', '', '',
2206         'taxname',      'varchar',     '', $char_d, '', '',
2207         'amount',     @money_type,                  '', '', 
2208         'currency',        'char', 'NULL',       3, '', '',
2209         'comment',      'varchar', 'NULL', $char_d, '', '', 
2210         'billpkgnum',       'int', 'NULL',      '', '', '',
2211         #more?  no cust_bill_pkg_tax_location?
2212       ],
2213       'primary_key'  => 'adjustmentnum',
2214       'unique'       => [],
2215       'index'        => [ [ 'custnum' ], [ 'billpkgnum' ] ],
2216       'foreign_keys' => [
2217                           { columns    => [ 'custnum' ],
2218                             table      => 'cust_main',
2219                           },
2220                           { columns    => [ 'billpkgnum' ],
2221                             table      => 'cust_bill_pkg',
2222                           },
2223                         ],
2224     },
2225
2226     'cust_main_county' => { #district+city+county+state+country are checked 
2227                             #off the cust_main_county for validation and to 
2228                             #provide a tax rate.
2229       'columns' => [
2230         'taxnum',    'serial',     '',      '', '', '', 
2231         'district', 'varchar', 'NULL',      20, '', '',
2232         'city',     'varchar', 'NULL', $char_d, '', '',
2233         'county',   'varchar', 'NULL', $char_d, '', '', 
2234         'state',    'varchar', 'NULL', $char_d, '', '', 
2235         'country',     'char',     '',       2, '', '', 
2236         'taxclass', 'varchar', 'NULL', $char_d, '', '', 
2237         'exempt_amount', @money_type,            '', '', 
2238         'exempt_amount_currency', 'char', 'NULL', 3, '', '',
2239         'tax',         'real',     '',      '', '', '', #tax %
2240         'taxname',  'varchar', 'NULL', $char_d, '', '', 
2241         'setuptax',    'char', 'NULL',       1, '', '', # Y = setup tax exempt
2242         'recurtax',    'char', 'NULL',       1, '', '', # Y = recur tax exempt
2243       ],
2244       'primary_key' => 'taxnum',
2245       'unique' => [],
2246   #    'unique' => [ ['taxnum'], ['state', 'county'] ],
2247       'index' => [ [ 'district' ], [ 'city' ], [ 'county' ], [ 'state' ], 
2248                    [ 'country' ],
2249                    [ 'taxclass' ],
2250                  ],
2251     },
2252
2253     'tax_rate'    => {
2254       'columns' => [
2255         'taxnum',       'serial',     '',      '', '', '', 
2256         'geocode',     'varchar', 'NULL', $char_d, '', '',#cch provides 10 char
2257         'data_vendor', 'varchar', 'NULL', $char_d, '', '',#auto update source
2258         'location',    'varchar', 'NULL', $char_d, '', '',#provided by tax authority
2259         'taxclassnum', 'int',     'NULL',      '', '', '', 
2260         'effective_date', @date_type, '', '', 
2261         'tax',        @taxrate_type,      '', '',        # tax %
2262         'excessrate', @taxrate_typen,     '', '',        # second tax %
2263         'taxbase',    @money_typen, '', '',              # amount at first tax rate
2264         'taxmax',     @money_typen, '', '',              # maximum about at both rates
2265         'usetax',        @taxrate_typen,     '', '',     # tax % when non-local
2266         'useexcessrate', @taxrate_typen,     '', '',     # second tax % when non-local
2267         'unittype',    'int',  'NULL', '', '', '',      # for fee
2268         'fee',         @taxrate_typen,     '', '',      # amount tax per unit
2269         'excessfee',   @taxrate_typen,     '', '',      # second amount tax per unit
2270         'feebase',     @taxrate_typen,     '', '',      # units taxed at first rate
2271         'feemax',      @taxrate_typen,     '', '',      # maximum number of unit taxed
2272         'maxtype',     'int',  'NULL', '', '', '',      # indicator of how thresholds accumulate
2273         'taxname', 'varchar',  'NULL', $char_d, '', '', # may appear on invoice
2274         'taxauth',     'int',  'NULL', '', '', '',      # tax authority
2275         'basetype',    'int',  'NULL', '', '', '', # indicator of basis for tax
2276         'passtype',    'int',  'NULL', '', '', '', # indicator declaring how item should be shown
2277         'passflag',    'char', 'NULL', 1, '', '',  # Y = required to list as line item, N = Prohibited
2278         'setuptax',    'char', 'NULL', 1, '', '',  # Y = setup tax exempt
2279         'recurtax',    'char', 'NULL', 1, '', '',  # Y = recur tax exempt
2280         'inoutcity',   'char', 'NULL', 1, '', '',  # '', 'I', or 'O'
2281         'inoutlocal',  'char', 'NULL', 1, '', '',  # '', 'I', or 'O'
2282         'manual',      'char', 'NULL', 1, '', '',  # Y = manually edited
2283         'disabled',    'char', 'NULL', 1, '', '',  # Y = tax disabled
2284       ],
2285       'primary_key'  => 'taxnum',
2286       'unique'       => [],
2287       'index'        => [ ['taxclassnum'], ['data_vendor', 'geocode'] ],
2288       'foreign_keys' => [
2289                           { columns    => [ 'taxclassnum' ],
2290                             table      => 'tax_class',
2291                           },
2292                         ],
2293     },
2294
2295     'tax_rate_location' => { 
2296       'columns' => [
2297         'taxratelocationnum', 'serial',  '',     '', '', '', 
2298         'data_vendor',        'varchar', 'NULL', $char_d, '', '',
2299         'geocode',            'varchar', '',     20,      '', '', 
2300         'city',               'varchar', 'NULL', $char_d, '', '',
2301         'county',             'varchar', 'NULL', $char_d, '', '',
2302         'state',              'char',    'NULL',       2, '', '', 
2303         'country',            'char',    'NULL',       2, '', '',
2304         'disabled',           'char',    'NULL', 1, '', '',
2305       ],
2306       'primary_key' => 'taxratelocationnum',
2307       'unique' => [],
2308       'index' => [ [ 'data_vendor', 'geocode', 'disabled' ] ],
2309     },
2310
2311     'cust_tax_location' => { 
2312       'columns' => [
2313         'custlocationnum', 'serial',  '',     '', '', '', 
2314         'data_vendor',     'varchar', 'NULL', $char_d, '', '', # update source
2315         'city',            'varchar', 'NULL', $char_d, '', '',
2316         'postalcity',      'varchar', 'NULL', $char_d, '', '',
2317         'county',          'varchar', 'NULL', $char_d, '', '',
2318         'zip',             'char',    'NULL', 5,  '', '', 
2319         'state',           'char',    '',     2,  '', '', 
2320         'country',         'char',    'NULL', 2,  '', '', # should not actually be NULL, but cch...
2321         'ziphi',           'char',    'NULL', 10, '', '',
2322         'ziplo',           'char',    'NULL', 10, '', '',
2323         'plus4hi',         'char',    'NULL', 4,  '', '', 
2324         'plus4lo',         'char',    'NULL', 4,  '', '', 
2325         'default_location','char',    'NULL', 1,  '', '', # Y = default for zip
2326         'cityflag',        'char',    'NULL', 1,  '', '', # I(n)/O(out)/B(oth)/NULL
2327         'geocode',         'varchar', '',    20,  '', '', 
2328       ],
2329       'primary_key' => 'custlocationnum',
2330       'unique' => [],
2331       'index' => [ [ 'zip', 'plus4lo', 'plus4hi', 'ziphi', 'ziplo' ] ],
2332     },
2333
2334     'tax_class' => { 
2335       'columns' => [
2336         'taxclassnum',  'serial',  '',            '', '', '',
2337         'data_vendor',  'varchar', 'NULL',   $char_d, '', '',
2338         'taxclass',     'varchar', '',       $char_d, '', '',          
2339         'description',  'varchar', '',     2*$char_d, '', '',          
2340       ],
2341       'primary_key' => 'taxclassnum',
2342       'unique' => [ [ 'data_vendor', 'taxclass' ] ],
2343       'index' => [],
2344     },
2345
2346     'tax_status' => {
2347       'columns' => [
2348         'taxstatusnum', 'serial', '',             '', '', '',
2349         'data_vendor',  'varchar', 'NULL',   $char_d, '', '',
2350         'taxstatus',    'varchar', '',       $char_d, '', '',          
2351         'description',  'varchar', '',       $char_d, '', '',
2352       ],
2353       'primary_key' => 'taxstatusnum',
2354       'unique'      => [ [ 'data_vendor', 'taxstatus' ] ],
2355       'index' => [],
2356     },
2357
2358     'cust_pay_pending' => {
2359       'columns' => [
2360         'paypendingnum',      'serial',     '',      '', '', '',
2361         'custnum',               'int',     '',      '', '', '', 
2362         'paid',            @money_type,                  '', '', 
2363         'currency',             'char', 'NULL',       3, '', '',
2364         '_date',            @date_type,                  '', '', 
2365         'payby',                'char',     '',       4, '', '',
2366         'payinfo',           'varchar', 'NULL',     512, '', '',
2367         'paymask',           'varchar', 'NULL', $char_d, '', '', 
2368         'paydate',           'varchar', 'NULL',     10, '', '', 
2369         'recurring_billing', 'varchar', 'NULL', $char_d, '', '',
2370         'payunique',         'varchar', 'NULL', $char_d, '', '', #separate paybatch "unique" functions from current usage
2371
2372         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
2373         'status',       'varchar',     '', $char_d, '', '', 
2374         'session_id',   'varchar', 'NULL', 1024, '', '', # SHA-512-hex
2375         'statustext',   'text',    'NULL',  '', '', '', 
2376         'gatewaynum',   'int',     'NULL',  '', '', '',
2377         #'cust_balance', @money_type,            '', '',
2378         'paynum',       'int',     'NULL',  '', '', '',
2379         'void_paynum',  'int',     'NULL',  '', '', '',
2380         'jobnum',    'bigint',     'NULL',  '', '', '', 
2381         'invnum',       'int',     'NULL',  '', '', '',
2382         'manual',       'char',    'NULL',   1, '', '',
2383         'discount_term','int',     'NULL',  '', '', '',
2384         'failure_status','varchar','NULL',  16, '', '',
2385       ],
2386       'primary_key'  => 'paypendingnum',
2387       'unique'       => [ [ 'payunique' ] ],
2388       'index'        => [ [ 'custnum' ], [ 'status' ],
2389                           ['paynum'], ['void_paynum'], ['jobnum'], ['invnum'],
2390                         ],
2391       'foreign_keys' => [
2392                           { columns    => [ 'custnum' ],
2393                             table      => 'cust_main',
2394                           },
2395                           { columns    => [ 'pkgnum' ],
2396                             table      => 'cust_pkg',
2397                           },
2398                           { columns    => [ 'gatewaynum' ],
2399                             table      => 'payment_gateway',
2400                           },
2401                           { columns    => [ 'paynum' ],
2402                             table      => 'cust_pay',
2403                           },
2404                           { columns    => [ 'void_paynum' ],
2405                             table      => 'cust_pay_void',
2406                             references => [ 'paynum' ],
2407                           },
2408                           { columns    => [ 'jobnum' ],
2409                             table      => 'queue',
2410                           },
2411                           { columns    => [ 'invnum' ],
2412                             table      => 'cust_bill',
2413                           },
2414                         ],
2415     },
2416
2417     'cust_pay' => {
2418       'columns' => [
2419         'paynum',       'serial',    '',       '', '', '',
2420         'custnum',         'int',    '',       '', '', '', 
2421         '_date',     @date_type,                   '', '', 
2422         'paid',      @money_type,                  '', '', 
2423         'currency',       'char', 'NULL',       3, '', '',
2424         'otaker',      'varchar', 'NULL',      32, '', '',
2425         'usernum',         'int', 'NULL',      '', '', '',
2426         'payby',          'char',     '',       4, '', '',
2427         'payinfo',     'varchar', 'NULL',     512, '', '',
2428         'paymask',     'varchar', 'NULL', $char_d, '', '', 
2429         'paydate',     'varchar', 'NULL',      10, '', '', 
2430         'paybatch',    'varchar', 'NULL', $char_d, '', '',#for auditing purposes
2431         'payunique',   'varchar', 'NULL', $char_d, '', '',#separate paybatch "unique" functions from current usage
2432         'closed',         'char', 'NULL',       1, '', '', 
2433         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
2434
2435         # cash/check deposit info fields
2436         'bank',        'varchar', 'NULL', $char_d, '', '',
2437         'depositor',   'varchar', 'NULL', $char_d, '', '',
2438         'account',     'varchar', 'NULL',      20, '', '',
2439         'teller',      'varchar', 'NULL',      20, '', '',
2440
2441         'batchnum',        'int', 'NULL',      '', '', '',#pay_batch foreign key
2442
2443         # credit card/EFT fields (formerly in paybatch)
2444         'gatewaynum',      'int', 'NULL',      '', '', '', # payment_gateway FK
2445         'processor',   'varchar', 'NULL', $char_d, '', '', # module name
2446         'auth',        'varchar', 'NULL',      16, '', '', # CC auth number
2447         'order_number','varchar', 'NULL', $char_d, '', '', # transaction number
2448       ],
2449       'primary_key'  => 'paynum',
2450       #i guess not now, with cust_pay_pending, if we actually make it here, we _do_ want to record it# 'unique' => [ [ 'payunique' ] ],
2451       'index'        => [ ['custnum'], ['paybatch'], ['payby'], ['_date'],
2452                           ['usernum'],
2453                         ],
2454       'foreign_keys' => [
2455                           { columns    => [ 'custnum' ],
2456                             table      => 'cust_main',
2457                           },
2458                           { columns    => [ 'usernum' ],
2459                             table      => 'access_user',
2460                           },
2461                           { columns    => [ 'pkgnum' ],
2462                             table      => 'cust_pkg',
2463                           },
2464                           { columns    => [ 'batchnum' ],
2465                             table      => 'pay_batch',
2466                           },
2467                           { columns    => [ 'gatewaynum' ],
2468                             table      => 'payment_gateway',
2469                           },
2470                         ],
2471     },
2472
2473     'cust_pay_void' => {
2474       'columns' => [
2475         'paynum',          'int',    '',       '', '', '', 
2476         'custnum',         'int',    '',       '', '', '', 
2477         '_date',      @date_type,                  '', '', 
2478         'paid',      @money_type,                  '', '', 
2479         'currency',       'char', 'NULL',       3, '', '',
2480         'otaker',      'varchar', 'NULL',      32, '', '', 
2481         'usernum',         'int', 'NULL',      '', '', '',
2482         'payby',          'char',     '',       4, '', '',
2483         'payinfo',     'varchar', 'NULL',     512, '', '',
2484         'paymask',     'varchar', 'NULL', $char_d, '', '', 
2485         #'paydate' ?
2486         'paybatch',    'varchar', 'NULL', $char_d, '', '', #for auditing purposes.
2487         'closed',        'char',  'NULL',       1, '', '', 
2488         'pkgnum', 'int',   'NULL', '', '', '', #desired pkgnum for pkg-balances
2489
2490         # cash/check deposit info fields
2491         'bank',       'varchar', 'NULL', $char_d, '', '',
2492         'depositor',  'varchar', 'NULL', $char_d, '', '',
2493         'account',    'varchar', 'NULL',      20, '', '',
2494         'teller',     'varchar', 'NULL',      20, '', '',
2495         'batchnum',       'int', 'NULL',      '', '', '', #pay_batch foreign key
2496
2497         # credit card/EFT fields (formerly in paybatch)
2498         'gatewaynum',      'int', 'NULL',      '', '', '', # payment_gateway FK
2499         'processor',   'varchar', 'NULL', $char_d, '', '', # module name
2500         'auth',        'varchar', 'NULL',      16, '', '', # CC auth number
2501         'order_number','varchar', 'NULL', $char_d, '', '', # transaction number
2502
2503         #void fields
2504         'void_date',  @date_type,                  '', '', 
2505         'reason',      'varchar', 'NULL', $char_d, '', '', 
2506         'void_usernum',    'int', 'NULL',      '', '', '',
2507       ],
2508       'primary_key'  => 'paynum',
2509       'unique'       => [],
2510       'index'        => [ ['custnum'], ['usernum'], ['void_usernum'] ],
2511       'foreign_keys' => [
2512                           { columns    => [ 'custnum' ],
2513                             table      => 'cust_main',
2514                           },
2515                           { columns    => [ 'usernum' ],
2516                             table      => 'access_user',
2517                           },
2518                           { columns    => [ 'pkgnum' ],
2519                             table      => 'cust_pkg',
2520                           },
2521                           { columns    => [ 'batchnum' ],
2522                             table      => 'pay_batch',
2523                           },
2524                           { columns    => [ 'gatewaynum' ],
2525                             table      => 'payment_gateway',
2526                           },
2527                           { columns    => [ 'void_usernum' ],
2528                             table      => 'access_user',
2529                             references => [ 'usernum' ],
2530                           },
2531                         ],
2532     },
2533
2534     'cust_bill_pay' => {
2535       'columns' => [
2536         'billpaynum', 'serial',     '',   '', '', '', 
2537         'invnum',  'int',     '',   '', '', '', 
2538         'paynum',  'int',     '',   '', '', '', 
2539         'amount',  @money_type, '', '', 
2540         '_date',   @date_type, '', '', 
2541         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
2542       ],
2543       'primary_key'  => 'billpaynum',
2544       'unique'       => [],
2545       'index'        => [ [ 'paynum' ], [ 'invnum' ] ],
2546       'foreign_keys' => [
2547                           { columns    => [ 'invnum' ],
2548                             table      => 'cust_bill',
2549                           },
2550                           { columns    => [ 'paynum' ],
2551                             table      => 'cust_pay',
2552                           },
2553                           { columns    => [ 'pkgnum' ],
2554                             table      => 'cust_pkg',
2555                           },
2556                         ],
2557     },
2558
2559     'cust_bill_pay_batch' => {
2560       'columns' => [
2561         'billpaynum', 'serial',     '',   '', '', '', 
2562         'invnum',  'int',     '',   '', '', '', 
2563         'paybatchnum',  'int',     '',   '', '', '', 
2564         'amount',  @money_type, '', '', 
2565         '_date',   @date_type, '', '', 
2566       ],
2567       'primary_key'  => 'billpaynum',
2568       'unique'       => [],
2569       'index'        => [ [ 'paybatchnum' ], [ 'invnum' ] ],
2570       'foreign_keys' => [
2571                           { columns    => [ 'invnum' ],
2572                             table      => 'cust_bill',
2573                           },
2574                           { columns    => [ 'paybatchnum' ],
2575                             table      => 'cust_pay_batch',
2576                           },
2577                         ],
2578     },
2579
2580     'cust_bill_pay_pkg' => {
2581       'columns' => [
2582         'billpaypkgnum', 'serial', '', '', '', '',
2583         'billpaynum',       'int', '', '', '', '',
2584         'billpkgnum',       'int', '', '', '', '',
2585         'billpkgtaxlocationnum', 'int', 'NULL', '', '', '',
2586         'billpkgtaxratelocationnum', 'int', 'NULL', '', '', '',
2587         'amount',         @money_type,     '', '',
2588         'setuprecur',      'varchar', '', $char_d, '', '',
2589         'sdate',   @date_type, '', '', 
2590         'edate',   @date_type, '', '', 
2591       ],
2592       'primary_key'  => 'billpaypkgnum',
2593       'unique'       => [],
2594       'index'        => [ [ 'billpaynum' ], [ 'billpkgnum' ], ],
2595       'foreign_keys' => [
2596                           { columns    => [ 'billpaynum' ],
2597                             table      => 'cust_bill_pay',
2598                           },
2599                           { columns    => [ 'billpkgnum' ],
2600                             table      => 'cust_bill_pkg',
2601                           },
2602                           { columns    => [ 'billpkgtaxlocationnum' ],
2603                             table      => 'cust_bill_pkg_tax_location',
2604                           },
2605                           { columns    => [ 'billpkgtaxratelocationnum' ],
2606                             table      => 'cust_bill_pkg_tax_rate_location',
2607                           },
2608                         ],
2609     },
2610
2611     'pay_batch' => { #batches of payments to an external processor
2612       'columns' => [
2613         'batchnum', 'serial',     '', '', '', '', 
2614         'agentnum',    'int', 'NULL', '', '', '', 
2615         'payby',      'char',     '',  4, '', '', # CARD/CHEK
2616         'status',     'char', 'NULL',  1, '', '', 
2617         'download',       @date_type,     '', '', 
2618         'upload',         @date_type,     '', '', 
2619         'title',   'varchar', 'NULL',255, '', '',
2620         'processor_id',   'varchar', 'NULL',255, '', '',
2621       ],
2622       'primary_key'  => 'batchnum',
2623       'unique'       => [],
2624       'index'        => [],
2625       'foreign_keys' => [
2626                           { columns    => [ 'agentnum' ],
2627                             table      => 'agent',
2628                           },
2629                         ],
2630     },
2631
2632     'cust_pay_batch' => { #list of customers in current CARD/CHEK batch
2633       'columns' => [
2634         'paybatchnum',    'serial',     '',      '', '', '', 
2635         'batchnum',          'int',     '',      '', '', '', 
2636         'invnum',            'int',     '',      '', '', '', 
2637         'custnum',           'int',     '',      '', '', '', 
2638         'last',          'varchar',     '', $char_d, '', '', 
2639         'first',         'varchar',     '', $char_d, '', '', 
2640         'address1',      'varchar',     '', $char_d, '', '', 
2641         'address2',      'varchar', 'NULL', $char_d, '', '', 
2642         'city',          'varchar',     '', $char_d, '', '', 
2643         'state',         'varchar', 'NULL', $char_d, '', '', 
2644         'zip',           'varchar', 'NULL',      10, '', '', 
2645         'country',          'char',     '',       2, '', '', 
2646         'payby',            'char',     '',       4, '', '',
2647         'payinfo',       'varchar', 'NULL',     512, '', '', 
2648         #'exp',          @date_type,                  '', '',
2649         'exp',           'varchar', 'NULL',      11, '', '', 
2650         'payname',       'varchar', 'NULL', $char_d, '', '', 
2651         'amount',      @money_type,                  '', '', 
2652         'currency',         'char', 'NULL',       3, '', '',
2653         'status',        'varchar', 'NULL', $char_d, '', '', 
2654         'failure_status','varchar', 'NULL',      16, '', '',
2655         'error_message', 'varchar', 'NULL', $char_d, '', '',
2656       ],
2657       'primary_key'  => 'paybatchnum',
2658       'unique'       => [],
2659       'index'        => [ ['batchnum'], ['invnum'], ['custnum'] ],
2660       'foreign_keys' => [
2661                           { columns    => [ 'batchnum' ],
2662                             table      => 'pay_batch',
2663                           },
2664                           { columns    => [ 'invnum' ],
2665                             table      => 'cust_bill',
2666                           },
2667                           { columns    => [ 'custnum' ],
2668                             table      => 'cust_main',
2669                           },
2670                         ],
2671     },
2672
2673     'fcc477map' => {
2674       'columns' => [
2675         'formkey',   'varchar',     '', 255, '', '',
2676         'formvalue',    'text', 'NULL',  '', '', '',
2677       ],
2678       'primary_key' => 'formkey',
2679       'unique'      => [],
2680       'index'       => [],
2681     },
2682
2683     'cust_pkg' => {
2684       'columns' => [
2685         'pkgnum',           'serial',     '', '', '', '', 
2686         'custnum',             'int',     '', '', '', '', 
2687         'pkgpart',             'int',     '', '', '', '', 
2688         'pkgbatch',        'varchar', 'NULL', $char_d, '', '',
2689         'contactnum',          'int', 'NULL', '', '', '', 
2690         'locationnum',         'int', 'NULL', '', '', '',
2691         'otaker',          'varchar', 'NULL', 32, '', '', 
2692         'usernum',             'int', 'NULL', '', '', '',
2693         'salesnum',            'int', 'NULL', '', '', '', 
2694         'order_date',     @date_type,             '', '', 
2695         'start_date',     @date_type,             '', '', 
2696         'setup',          @date_type,             '', '', 
2697         'bill',           @date_type,             '', '', 
2698         'last_bill',      @date_type,             '', '', 
2699         'susp',           @date_type,             '', '', 
2700         'adjourn',        @date_type,             '', '', 
2701         'resume',         @date_type,             '', '', 
2702         'cancel',         @date_type,             '', '', 
2703         'uncancel',       @date_type,             '', '', 
2704         'uncancel_pkgnum',     'int', 'NULL', '', '', '',
2705         'expire',         @date_type,             '', '', 
2706         'contract_end',   @date_type,             '', '',
2707         'dundate',        @date_type,             '', '',
2708         'change_date',    @date_type,             '', '',
2709         'change_pkgnum',       'int', 'NULL', '', '', '',
2710         'change_pkgpart',      'int', 'NULL', '', '', '',
2711         'change_locationnum',  'int', 'NULL', '', '', '',
2712         'change_custnum',      'int', 'NULL', '', '', '',
2713         'main_pkgnum',         'int', 'NULL', '', '', '',
2714         'pkglinknum',          'int', 'NULL', '', '', '',
2715         'manual_flag',        'char', 'NULL',  1, '', '', 
2716         'no_auto',            'char', 'NULL',  1, '', '', 
2717         'quantity',            'int', 'NULL', '', '', '',
2718         'agent_pkgid',     'varchar', 'NULL', $char_d, '', '',
2719         'waive_setup',        'char', 'NULL',  1, '', '', 
2720         'recur_show_zero',    'char', 'NULL',  1, '', '',
2721         'setup_show_zero',    'char', 'NULL',  1, '', '',
2722         'change_to_pkgnum',    'int', 'NULL', '', '', '',
2723         'separate_bill',      'char', 'NULL',  1, '', '',
2724       ],
2725       'primary_key'  => 'pkgnum',
2726       'unique'       => [],
2727       'index'        => [ ['custnum'], ['pkgpart'], ['pkgbatch'],
2728                           ['locationnum'], ['usernum'], ['agent_pkgid'],
2729                           ['order_date'], [ 'start_date' ], ['setup'], ['bill'],
2730                           ['last_bill'], ['susp'], ['adjourn'], ['resume'],
2731                           ['cancel'], ['expire'], ['contract_end'],
2732                           ['change_date'],
2733                           ['no_auto'],
2734                           #['contactnum'],
2735                           ['salesnum'],
2736                           #['uncancel_pkgnum'],
2737                           #['change_pkgnum'], ['change_locationnum'],
2738                           #['change_custnum'],
2739                           ['main_pkgnum'],
2740                           #['pkglinknum'], ['change_to_pkgnum'],
2741                         ],
2742       'foreign_keys' => [
2743                           { columns    => [ 'custnum' ],
2744                             table      => 'cust_main',
2745                           },
2746                           { columns    => [ 'pkgpart' ],
2747                             table      => 'part_pkg',
2748                           },
2749                           { columns    => [ 'contactnum' ],
2750                             table      => 'contact',
2751                           },
2752                           { columns    => [ 'locationnum' ],
2753                             table      => 'cust_location',
2754                           },
2755                           { columns    => [ 'usernum' ],
2756                             table      => 'access_user',
2757                           },
2758                           { columns    => [ 'salesnum' ],
2759                             table      => 'sales',
2760                           },
2761                           { columns    => [ 'uncancel_pkgnum' ],
2762                             table      => 'cust_pkg',
2763                             references => [ 'pkgnum' ],
2764                           },
2765                           { columns    => [ 'change_pkgnum' ],
2766                             table      => 'cust_pkg',
2767                             references => [ 'pkgnum' ],
2768                           },
2769                           { columns    => [ 'change_pkgpart' ],
2770                             table      => 'part_pkg',
2771                             references => [ 'pkgpart' ],
2772                           },
2773                           { columns    => [ 'change_locationnum' ],
2774                             table      => 'cust_location',
2775                             references => [ 'locationnum' ],
2776                           },
2777                           { columns    => [ 'change_custnum' ],
2778                             table      => 'cust_main',
2779                             references => [ 'custnum' ],
2780                           },
2781                           { columns    => [ 'main_pkgnum' ],
2782                             table      => 'cust_pkg',
2783                             references => [ 'pkgnum' ],
2784                           },
2785                           { columns    => [ 'pkglinknum' ],
2786                             table      => 'part_pkg_link',
2787                           },
2788                           { columns    => [ 'change_to_pkgnum' ],
2789                             table      => 'cust_pkg',
2790                             references => [ 'pkgnum' ],
2791                           },
2792                         ],
2793    },
2794
2795     'cust_pkg_option' => {
2796       'columns' => [
2797         'optionnum', 'serial', '', '', '', '', 
2798         'pkgnum', 'int', '', '', '', '', 
2799         'optionname', 'varchar', '', $char_d, '', '', 
2800         'optionvalue', 'text', 'NULL', '', '', '', 
2801       ],
2802       'primary_key'  => 'optionnum',
2803       'unique'       => [],
2804       'index'        => [ [ 'pkgnum' ], [ 'optionname' ] ],
2805       'foreign_keys' => [
2806                           { columns    => [ 'pkgnum' ],
2807                             table      => 'cust_pkg',
2808                           },
2809                         ],
2810     },
2811
2812     'cust_pkg_detail' => {
2813       'columns' => [
2814         'pkgdetailnum', 'serial', '',        '', '', '',
2815         'pkgnum',          'int', '',        '', '', '',
2816         'detail',      'varchar', '', 2*$char_d, '', '', 
2817         'detailtype',     'char', '',         1, '', '', #"I"nvoice or "C"omment
2818         'weight',          'int', '',        '', '', '',
2819       ],
2820       'primary_key'  => 'pkgdetailnum',
2821       'unique'       => [],
2822       'index'        => [ [ 'pkgnum', 'detailtype' ] ],
2823       'foreign_keys' => [
2824                           { columns    => [ 'pkgnum' ],
2825                             table      => 'cust_pkg',
2826                           },
2827                         ],
2828     },
2829
2830     'cust_pkg_reason' => {
2831       'columns' => [
2832         'num',      'serial',    '',   '', '', '', 
2833         'pkgnum',   'int',    '',   '', '', '', 
2834         'reasonnum','int',    '',   '', '', '', 
2835         'action',   'char', 'NULL', 1, '', '',     #should not be nullable
2836         'otaker',   'varchar', 'NULL', 32, '', '', 
2837         'usernum',   'int', 'NULL', '', '', '',
2838         'date',     @date_type, '', '', 
2839       ],
2840       'primary_key'  => 'num',
2841       'unique'       => [],
2842       'index'        => [ ['pkgnum'], ['reasonnum'], ['action'], ['usernum'], ],
2843       'foreign_keys' => [
2844                           { columns    => [ 'pkgnum' ],
2845                             table      => 'cust_pkg',
2846                           },
2847                           { columns    => [ 'reasonnum' ],
2848                             table      => 'reason',
2849                           },
2850                           { columns    => [ 'usernum' ],
2851                             table      => 'access_user',
2852                           },
2853                         ],
2854     },
2855
2856     'cust_pkg_reason_fee' => {
2857       'columns' => [
2858         'pkgreasonfeenum', 'serial', '', '', '', '',
2859         'pkgreasonnum',       'int', '', '', '', '',
2860         'billpkgnum',         'int', 'NULL', '', '', '',
2861         'feepart',            'int', '', '', '', '',
2862         'nextbill',          'char', 'NULL',  1, '', '',
2863       ],
2864       'primary_key'  => 'pkgreasonfeenum',
2865       'unique' => [ [ 'billpkgnum' ], [ 'pkgreasonnum' ] ], # one-to-one link
2866       'index'  => [ [ 'feepart' ] ],
2867       'foreign_keys' => [
2868                           { columns     => [ 'pkgreasonnum' ],
2869                             table       => 'cust_pkg_reason',
2870                             references  => [ 'num' ],
2871                           },
2872                           { columns     => [ 'feepart' ],
2873                             table       => 'part_fee',
2874                           },
2875                           # can't link billpkgnum, because of voids
2876       ],
2877     },
2878
2879     'cust_pkg_discount' => {
2880       'columns' => [
2881         'pkgdiscountnum', 'serial', '',        '', '', '',
2882         'pkgnum',            'int', '',        '', '', '', 
2883         'discountnum',       'int', '',        '', '', '',
2884         'months_used',   'decimal', 'NULL', '7,4', '', '',
2885         'end_date',     @date_type,                '', '',
2886         'otaker',        'varchar', 'NULL',    32, '', '', 
2887         'usernum',           'int', 'NULL',    '', '', '',
2888         'disabled',         'char', 'NULL',     1, '', '', 
2889       ],
2890       'primary_key'  => 'pkgdiscountnum',
2891       'unique'       => [],
2892       'index'        => [ [ 'pkgnum' ], [ 'discountnum' ], [ 'usernum' ], ],
2893       'foreign_keys' => [
2894                           { columns    => [ 'pkgnum' ],
2895                             table      => 'cust_pkg',
2896                           },
2897                           { columns    => [ 'discountnum' ],
2898                             table      => 'discount',
2899                           },
2900                           { columns    => [ 'usernum' ],
2901                             table      => 'access_user',
2902                           },
2903                         ],
2904     },
2905
2906     'cust_pkg_usage' => {
2907       'columns' => [
2908         'pkgusagenum', 'serial', '', '', '', '',
2909         'pkgnum',         'int', '', '', '', '',
2910         'minutes',        'double precision', '', '', '', '',
2911         'pkgusagepart',   'int', '', '', '', '',
2912       ],
2913       'primary_key'  => 'pkgusagenum',
2914       'unique'       => [],
2915       'index'        => [ [ 'pkgnum' ], [ 'pkgusagepart' ] ],
2916       'foreign_keys' => [
2917                           { columns    => [ 'pkgnum' ],
2918                             table      => 'cust_pkg',
2919                           },
2920                           { columns    => [ 'pkgusagepart' ],
2921                             table      => 'part_pkg_usage',
2922                           },
2923                         ],
2924     },
2925
2926     'cdr_cust_pkg_usage' => {
2927       'columns' => [
2928         'cdrusagenum', 'bigserial', '', '', '', '',
2929         'acctid',      'bigint',    '', '', '', '',
2930         'pkgusagenum', 'int',       '', '', '', '',
2931         'minutes',     'double precision',       '', '', '', '',
2932       ],
2933       'primary_key'  => 'cdrusagenum',
2934       'unique'       => [],
2935       'index'        => [ [ 'pkgusagenum' ], [ 'acctid' ] ],
2936       'foreign_keys' => [
2937                           { columns    => [ 'acctid' ],
2938                             table      => 'cdr',
2939                           },
2940                           { columns    => [ 'pkgusagenum' ],
2941                             table      => 'cust_pkg_usage',
2942                           },
2943                         ],
2944     },
2945
2946     'cust_bill_pkg_discount' => {
2947       'columns' => [
2948         'billpkgdiscountnum', 'serial',        '', '', '', '',
2949         'billpkgnum',            'int',        '', '', '', '', 
2950         'pkgdiscountnum',        'int',        '', '', '', '', 
2951         'amount',          @money_type,                '', '', 
2952         'months',            'decimal', 'NULL', '7,4', '', '',
2953       ],
2954       'primary_key'  => 'billpkgdiscountnum',
2955       'unique'       => [],
2956       'index'        => [ [ 'billpkgnum' ], [ 'pkgdiscountnum' ] ],
2957       'foreign_keys' => [
2958                           { columns    => [ 'billpkgnum' ],
2959                             table      => 'cust_bill_pkg',
2960                           },
2961                           { columns    => [ 'pkgdiscountnum' ],
2962                             table      => 'cust_pkg_discount',
2963                           },
2964                         ],
2965     },
2966
2967     'cust_bill_pkg_discount_void' => {
2968       'columns' => [
2969         'billpkgdiscountnum',    'int',        '', '', '', '',
2970         'billpkgnum',            'int',        '', '', '', '', 
2971         'pkgdiscountnum',        'int',        '', '', '', '', 
2972         'amount',          @money_type,                '', '', 
2973         'months',            'decimal', 'NULL', '7,4', '', '',
2974       ],
2975       'primary_key'  => 'billpkgdiscountnum',
2976       'unique'       => [],
2977       'index'        => [ [ 'billpkgnum' ], [ 'pkgdiscountnum' ] ],
2978       'foreign_keys' => [
2979                           { columns    => [ 'billpkgnum' ],
2980                             table      => 'cust_bill_pkg_void',
2981                           },
2982                           { columns    => [ 'pkgdiscountnum' ],
2983                             table      => 'cust_pkg_discount',
2984                           },
2985                         ],
2986     },
2987
2988     'discount' => {
2989       'columns' => [
2990         'discountnum', 'serial',     '',      '', '', '',
2991         #'agentnum',       'int', 'NULL',      '', '', '', 
2992         'classnum',       'int', 'NULL',      '', '', '',
2993         'name',       'varchar', 'NULL', $char_d, '', '',
2994         'amount',   @money_type,                  '', '', 
2995         'percent',    'decimal',     '',   '7,4', '', '',
2996         'months',     'decimal', 'NULL',   '7,4', '', '',
2997         'disabled',      'char', 'NULL',       1, '', '', 
2998         'setup',         'char', 'NULL',       1, '', '', 
2999         #'linked',        'char', 'NULL',       1, '', '',
3000       ],
3001       'primary_key'  => 'discountnum',
3002       'unique'       => [],
3003       'index'        => [], # [ 'agentnum' ], ],
3004       'foreign_keys' => [
3005                           { columns    => [ 'classnum' ],
3006                             table      => 'discount_class',
3007                           },
3008                         ],
3009     },
3010
3011     'discount_class' => {
3012       'columns' => [
3013         'classnum',    'serial',   '',      '', '', '', 
3014         'classname',   'varchar',  '', $char_d, '', '', 
3015         #'categorynum', 'int',  'NULL',      '', '', '', 
3016         'disabled',    'char', 'NULL',       1, '', '', 
3017       ],
3018       'primary_key' => 'classnum',
3019       'unique' => [],
3020       'index' => [ ['disabled'] ],
3021     },
3022
3023     'cust_refund' => {
3024       'columns' => [
3025         'refundnum',    'serial',    '',   '', '', '', 
3026         'custnum',  'int',    '',   '', '', '', 
3027         '_date',        @date_type, '', '', 
3028         'refund',       @money_type, '', '', 
3029         'currency',       'char', 'NULL',       3, '', '',
3030         'otaker',       'varchar',   'NULL',   32, '', '', 
3031         'usernum',   'int', 'NULL', '', '', '',
3032         'reason',       'varchar',   'NULL',   $char_d, '', '', 
3033         'reasonnum',   'int', 'NULL', '', '', '',
3034         'payby',        'char',   '',     4, '', '', # CARD/BILL/COMP, should
3035                                                      # be index into payby
3036                                                      # table eventually
3037         'payinfo',      'varchar',   'NULL', 512, '', '', #see cust_main above
3038         'paymask', 'varchar', 'NULL', $char_d, '', '', 
3039         'paybatch',     'varchar',   'NULL', $char_d, '', '', 
3040         'closed',    'char', 'NULL', 1, '', '', 
3041         # credit card/EFT fields (formerly in paybatch)
3042         'gatewaynum',     'int', 'NULL', '', '', '', # payment_gateway FK
3043         'processor',  'varchar', 'NULL', $char_d, '', '', # module name
3044         'auth',       'varchar','NULL',16, '', '', # CC auth number
3045         'order_number', 'varchar','NULL',$char_d, '', '', # transaction number
3046       ],
3047       'primary_key'  => 'refundnum',
3048       'unique'       => [],
3049       'index'        => [ ['custnum'], ['_date'], [ 'usernum' ], ],
3050       'foreign_keys' => [
3051                           { columns    => [ 'custnum' ],
3052                             table      => 'cust_main',
3053                           },
3054                           { columns    => [ 'usernum' ],
3055                             table      => 'access_user',
3056                           },
3057                           { columns    => [ 'reasonnum' ],
3058                             table      => 'reason',
3059                           },
3060                           { columns    => [ 'gatewaynum' ],
3061                             table      => 'payment_gateway',
3062                           },
3063                         ],
3064     },
3065
3066     'cust_credit_refund' => {
3067       'columns' => [
3068         'creditrefundnum', 'serial',     '',   '', '', '', 
3069         'crednum',  'int',     '',   '', '', '', 
3070         'refundnum',  'int',     '',   '', '', '', 
3071         'amount',  @money_type, '', '', 
3072         '_date',   @date_type, '', '', 
3073       ],
3074       'primary_key'  => 'creditrefundnum',
3075       'unique'       => [],
3076       'index'        => [ ['crednum'], ['refundnum'] ],
3077       'foreign_keys' => [
3078                           { columns    => [ 'crednum' ],
3079                             table      => 'cust_credit',
3080                           },
3081                           { columns    => [ 'refundnum' ],
3082                             table      => 'cust_refund',
3083                           },
3084                         ],
3085     },
3086
3087
3088     'cust_svc' => {
3089       'columns' => [
3090         'svcnum',      'serial',     '', '', '', '', 
3091         'pkgnum',         'int', 'NULL', '', '', '', 
3092         'svcpart',        'int',     '', '', '', '', 
3093         'agent_svcid',    'int', 'NULL', '', '', '',
3094         'overlimit',           @date_type,   '', '', 
3095       ],
3096       'primary_key'  => 'svcnum',
3097       'unique'       => [],
3098       'index'        => [ ['svcnum'], ['pkgnum'], ['svcpart'],
3099                           ['agent_svcid'],
3100                         ],
3101       'foreign_keys' => [
3102                           { columns    => [ 'pkgnum' ],
3103                             table      => 'cust_pkg',
3104                           },
3105                           { columns    => [ 'svcpart' ],
3106                             table      => 'part_svc',
3107                           },
3108                         ],
3109     },
3110
3111     'cust_svc_option' => {
3112       'columns' => [
3113         'optionnum',   'serial', '', '', '', '', 
3114         'svcnum',      'int', '', '', '', '', 
3115         'optionname',  'varchar', '', $char_d, '', '', 
3116         'optionvalue', 'text', 'NULL', '', '', '', 
3117       ],
3118       'primary_key'  => 'optionnum',
3119       'unique'       => [],
3120       'index'        => [ [ 'svcnum' ], [ 'optionname' ] ],
3121       'foreign_keys' => [
3122                           { columns    => [ 'svcnum' ],
3123                             table      => 'cust_svc',
3124                           },
3125                         ],
3126     },
3127
3128     'svc_export_machine' => {
3129       'columns' => [
3130         'svcexportmachinenum', 'serial', '', '', '', '',
3131         'svcnum',                 'int', '', '', '', '', 
3132         'exportnum',              'int', '', '', '', '', 
3133         'machinenum',             'int', '', '', '', '',
3134       ],
3135       'primary_key'  => 'svcexportmachinenum',
3136       'unique'       => [ ['svcnum', 'exportnum'] ],
3137       'index'        => [],
3138       'foreign_keys' => [
3139                           { columns    => [ 'svcnum' ],
3140                             table      => 'cust_svc',
3141                           },
3142                           { columns    => [ 'exportnum' ],
3143                             table      => 'part_export',
3144                           },
3145                           { columns    => [ 'machinenum' ],
3146                             table      => 'part_export_machine',
3147                           },
3148                         ],
3149     },
3150
3151     'part_export_machine' => {
3152       'columns' => [
3153         'machinenum', 'serial', '', '', '', '',
3154         'exportnum',     'int', '', '', '', '',
3155         'machine',    'varchar', 'NULL', $char_d, '', '', 
3156         'disabled',      'char', 'NULL',       1, '', '',
3157       ],
3158       'primary_key'  => 'machinenum',
3159       'unique'       => [ [ 'exportnum', 'machine' ] ],
3160       'index'        => [ [ 'exportnum' ] ],
3161       'foreign_keys' => [
3162                           { columns    => [ 'exportnum' ],
3163                             table      => 'part_export',
3164                           },
3165                         ],
3166     },
3167
3168     'part_pkg' => {
3169       'columns' => [
3170         'pkgpart',       'serial',    '',   '', '', '', 
3171         'pkgpartbatch',  'varchar', 'NULL', $char_d, '', '',
3172         'pkg',           'varchar',   '',   $char_d, '', '', 
3173         'comment',       'varchar', 'NULL', 2*$char_d, '', '', 
3174         'promo_code',    'varchar', 'NULL', $char_d, '', '', 
3175         'freq',          'varchar',   '',   $char_d, '', '', #billing frequency
3176         'setuptax',      'char', 'NULL', 1, '', '', 
3177         'recurtax',      'char', 'NULL', 1, '', '', 
3178         'plan',          'varchar', 'NULL', $char_d, '', '', 
3179         'disabled',      'char', 'NULL', 1, '', '', 
3180         'custom',        'char', 'NULL', 1, '', '', 
3181         'taxclass',      'varchar', 'NULL', $char_d, '', '', 
3182         'classnum',      'int',     'NULL', '', '', '', 
3183         'addon_classnum','int',     'NULL', '', '', '', 
3184         'taxproductnum', 'int',     'NULL', '', '', '', 
3185         'setup_cost',    @money_typen,          '', '',
3186         'recur_cost',    @money_typen,          '', '',
3187         'pay_weight',    'real',    'NULL', '', '', '',
3188         'credit_weight', 'real',    'NULL', '', '', '',
3189         'agentnum',      'int',     'NULL', '', '', '', 
3190         'fcc_ds0s',      'int',     'NULL', '', '', '', 
3191         'fcc_voip_class','char',    'NULL',  1, '', '',
3192         'no_auto',          'char', 'NULL',  1, '', '', 
3193         'recur_show_zero',  'char', 'NULL',  1, '', '',
3194         'setup_show_zero',  'char', 'NULL',  1, '', '',
3195         'successor',     'int',     'NULL', '', '', '',
3196         'family_pkgpart','int',     'NULL', '', '', '',
3197         'delay_start',   'int',     'NULL', '', '', '',
3198         'start_on_hold', 'char',    'NULL',  1, '', '',
3199         'agent_pkgpartid', 'varchar', 'NULL', 20, '', '',
3200       ],
3201       'primary_key'  => 'pkgpart',
3202       'unique'       => [],
3203       'index'        => [ [ 'promo_code' ], [ 'disabled' ], [ 'classnum' ],
3204                           [ 'agentnum' ], ['no_auto'], ['agent_pkgpartid'],
3205                         ],
3206       'foreign_keys' => [
3207                           { columns    => [ 'classnum' ],
3208                             table      => 'pkg_class',
3209                           },
3210                           { columns    => [ 'addon_classnum' ],
3211                             table      => 'pkg_class',
3212                             references => [ 'classnum' ],
3213                           },
3214                           { columns    => [ 'taxproductnum' ],
3215                             table      => 'part_pkg_taxproduct',
3216                           },
3217                           { columns    => [ 'agentnum' ],
3218                             table      => 'agent',
3219                           },
3220                           { columns    => [ 'successor' ],
3221                             table      => 'part_pkg',
3222                             references => [ 'pkgpart' ],
3223                           },
3224                           { columns    => [ 'family_pkgpart' ],
3225                             table      => 'part_pkg',
3226                             references => [ 'pkgpart' ],
3227                           },
3228                         ],
3229     },
3230
3231     'part_pkg_msgcat' => {
3232       'columns' => [
3233         'pkgpartmsgnum',  'serial',     '',        '', '', '',
3234         'pkgpart',           'int',     '',        '', '', '',
3235         'locale',        'varchar',     '',        16, '', '',
3236         'pkg',           'varchar',     '',   $char_d, '', '', #longer/no limit?
3237         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
3238       ],
3239       'primary_key'  => 'pkgpartmsgnum',
3240       'unique'       => [ [ 'pkgpart', 'locale' ] ],
3241       'index'        => [],
3242       'foreign_keys' => [
3243                           { columns    => [ 'pkgpart' ],
3244                             table      => 'part_pkg',
3245                           },
3246                         ],
3247     },
3248
3249     'part_pkg_currency' => {
3250       'columns' => [
3251         'pkgcurrencynum', 'serial', '',      '', '', '',
3252         'pkgpart',           'int', '',      '', '', '',
3253         'currency',         'char', '',       3, '', '',
3254         'optionname',    'varchar', '', $char_d, '', '', 
3255         'optionvalue',      'text', '',      '', '', '', 
3256       ],
3257       'primary_key'  => 'pkgcurrencynum',
3258       'unique'       => [ [ 'pkgpart', 'currency', 'optionname' ] ],
3259       'index'        => [ ['pkgpart'] ],
3260       'foreign_keys' => [
3261                           { columns    => [ 'pkgpart' ],
3262                             table      => 'part_pkg',
3263                           },
3264                         ],
3265     },
3266
3267     'currency_exchange' => {
3268       'columns' => [
3269         'currencyratenum', 'serial', '',    '', '', '',
3270         'from_currency',     'char', '',     3, '', '',
3271         'to_currency',       'char', '',     3, '', '',
3272         'rate',           'decimal', '', '7,6', '', '',
3273       ],
3274       'primary_key' => 'currencyratenum',
3275       'unique'      => [ [ 'from_currency', 'to_currency' ] ],
3276       'index'       => [],
3277     },
3278
3279     'part_pkg_usageprice' => {
3280       'columns' => [
3281         'usagepricepart', 'serial',      '',      '', '', '',
3282         'pkgpart',           'int',      '',      '', '', '',
3283         'price',          @money_type,                '', '', 
3284         'currency',         'char',  'NULL',       3, '', '',
3285         'action',        'varchar',      '', $char_d, '', '',
3286         'target',        'varchar',      '', $char_d, '', '',
3287         'amount',        'varchar',      '', $char_d, '', '',
3288       ],
3289       'primary_key'  => 'usagepricepart',
3290       'unique'       => [ [ 'pkgpart', 'currency', 'target' ] ],
3291       'index'        => [ [ 'pkgpart' ] ],
3292       'foreign_keys' => [
3293                           { columns    => [ 'pkgpart' ],
3294                             table      => 'part_pkg',
3295                           },
3296                         ],
3297     },
3298
3299     'cust_pkg_usageprice' => {
3300       'columns' => [
3301         'usagepricenum', 'serial',      '',      '', '', '',
3302         'pkgnum',           'int',      '',      '', '', '',
3303         'usagepricepart',   'int',      '',      '', '', '',
3304         'quantity',         'int',      '',      '', '', '',
3305       ],
3306       'primary_key'  => 'usagepricenum',
3307       'unique'       => [ [ 'pkgnum', 'usagepricepart' ] ],
3308       'index'        => [ [ 'pkgnum' ] ],
3309       'foreign_keys' => [
3310                           { columns    => [ 'pkgnum' ],
3311                             table      => 'cust_pkg',
3312                           },
3313                           { columns    => [ 'usagepricepart' ],
3314                             table      => 'part_pkg_usageprice',
3315                           },
3316                         ],
3317     },
3318
3319     'part_fee' => {
3320       'columns' => [
3321         'feepart',       'serial',    '',   '', '', '',
3322         'itemdesc',      'varchar',   '',   $char_d,   '', '',
3323         'comment',       'varchar', 'NULL', 2*$char_d, '', '',
3324         'disabled',      'char',    'NULL',  1, '', '',
3325         'classnum',      'int',     'NULL', '', '', '',
3326         'taxclass',      'varchar', 'NULL', $char_d, '', '',
3327         'taxproductnum', 'int',     'NULL', '', '', '',
3328         'pay_weight',    'real',    'NULL', '', '', '',
3329         'credit_weight', 'real',    'NULL', '', '', '',
3330         'agentnum',      'int',     'NULL', '', '', '',
3331         'amount',   @money_type,                '', '', 
3332         'percent',     'decimal',    '', '7,4', '', '',
3333         'basis',         'varchar',  '',    16, '', '',
3334         'minimum',    @money_typen,             '', '',
3335         'maximum',    @money_typen,             '', '',
3336         'limit_credit',  'char',    'NULL',  1, '', '',
3337         'setuprecur',    'char',     '',     5, '', '',
3338         'taxable',       'char',    'NULL',  1, '', '',
3339       ],
3340       'primary_key'  => 'feepart',
3341       'unique'       => [],
3342       'index'        => [ [ 'disabled' ], [ 'classnum' ], [ 'agentnum' ]
3343                         ],
3344       'foreign_keys' => [
3345                           { columns    => [ 'classnum' ],
3346                             table      => 'pkg_class',
3347                           },
3348                           { columns    => [ 'taxproductnum' ],
3349                             table      => 'part_pkg_taxproduct',
3350                           },
3351                           { columns    => [ 'agentnum' ],
3352                             table      => 'agent',
3353                           },
3354                         ],
3355     },
3356
3357     'part_fee_msgcat' => {
3358       'columns' => [
3359         'feepartmsgnum',  'serial',     '',        '', '', '',
3360         'feepart',           'int',     '',        '', '', '',
3361         'locale',        'varchar',     '',        16, '', '',
3362         'itemdesc',      'varchar',     '',   $char_d, '', '', #longer/no limit?
3363         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
3364       ],
3365       'primary_key'  => 'feepartmsgnum',
3366       'unique'       => [ [ 'feepart', 'locale' ] ],
3367       'index'        => [],
3368       'foreign_keys' => [
3369                           { columns    => [ 'feepart' ],
3370                             table      => 'part_fee',
3371                           },
3372                         ],
3373     },
3374
3375     'part_fee_usage' => {
3376       'columns' => [
3377         'feepartusagenum','serial',     '',        '', '', '',
3378         'feepart',           'int',     '',        '', '', '',
3379         'classnum',          'int',     '',        '', '', '',
3380         'amount',   @money_type,                '', '',
3381         'percent',     'decimal',    '', '7,4', '', '',
3382       ],
3383       'primary_key'  => 'feepartusagenum',
3384       'unique'       => [ [ 'feepart', 'classnum' ] ],
3385       'index'        => [],
3386       'foreign_keys' => [
3387                           { columns    => [ 'feepart' ],
3388                             table      => 'part_fee',
3389                           },
3390                           { columns    => [ 'classnum' ],
3391                             table      => 'usage_class',
3392                           },
3393                         ],
3394     },
3395
3396     'part_pkg_link' => {
3397       'columns' => [
3398         'pkglinknum',  'serial',   '',      '', '', '',
3399         'src_pkgpart', 'int',      '',      '', '', '',
3400         'dst_pkgpart', 'int',      '',      '', '', '', 
3401         'link_type',   'varchar',  '', $char_d, '', '',
3402         'hidden',      'char', 'NULL',       1, '', '',
3403       ],
3404       'primary_key'  => 'pkglinknum',
3405       'unique'       => [ ['src_pkgpart','dst_pkgpart','link_type','hidden'] ],
3406       'index'        => [ [ 'src_pkgpart' ] ],
3407       'foreign_keys' => [
3408                           { columns    => [ 'src_pkgpart' ],
3409                             table      => 'part_pkg',
3410                             references => [ 'pkgpart' ]
3411                           },
3412                           { columns    => [ 'dst_pkgpart' ],
3413                             table      => 'part_pkg',
3414                             references => [ 'pkgpart' ]
3415                           },
3416                         ],
3417     },
3418     # XXX somewhat borked unique: we don't really want a hidden and unhidden
3419     # it turns out we'd prefer to use svc, bill, and invisibill (or something)
3420
3421     'part_pkg_discount' => {
3422       'columns' => [
3423         'pkgdiscountnum', 'serial',   '',      '', '', '',
3424         'pkgpart',        'int',      '',      '', '', '',
3425         'discountnum',    'int',      '',      '', '', '', 
3426       ],
3427       'primary_key'  => 'pkgdiscountnum',
3428       'unique'       => [ [ 'pkgpart', 'discountnum' ] ],
3429       'index'        => [],
3430       'foreign_keys' => [
3431                           { columns    => [ 'pkgpart' ],
3432                             table      => 'part_pkg',
3433                           },
3434                           { columns    => [ 'discountnum' ],
3435                             table      => 'discount',
3436                           },
3437                         ],
3438     },
3439
3440     'part_pkg_taxclass' => {
3441       'columns' => [
3442         'taxclassnum',  'serial', '',       '', '', '',
3443         'taxclass',     'varchar', '', $char_d, '', '', 
3444         'disabled', 'char',   'NULL',         1, '', '', 
3445       ],
3446       'primary_key' => 'taxclassnum',
3447       'unique'      => [ [ 'taxclass' ] ],
3448       'index'       => [ [ 'disabled' ] ],
3449     },
3450
3451     'part_pkg_taxproduct' => {
3452       'columns' => [
3453         'taxproductnum', 'serial',      '',        '', '', '',
3454         'data_vendor',   'varchar', 'NULL',   $char_d, '', '', 
3455         'taxproduct',    'varchar',     '',   $char_d, '', '', 
3456         'description',   'varchar',     '', 3*$char_d, '', '', 
3457         'note',             'text', 'NULL',        '', '', '',
3458       ],
3459       'primary_key' => 'taxproductnum',
3460       'unique'      => [ [ 'data_vendor', 'taxproduct' ] ],
3461       'index'       => [],
3462     },
3463
3464     'part_pkg_taxrate' => { 
3465       'columns' => [
3466         'pkgtaxratenum', 'serial',  '',     '',      '', '',
3467         'data_vendor',   'varchar', 'NULL', $char_d, '', '', # update source
3468         'geocode',       'varchar', 'NULL', $char_d, '', '', # cch provides 10
3469         'taxproductnum', 'int',  '',     '',       '', '',          
3470         'city',             'varchar', 'NULL', $char_d, '', '', # tax_location?
3471         'county',           'varchar', 'NULL', $char_d, '', '', 
3472         'state',            'varchar', 'NULL', $char_d, '', '', 
3473         'local',            'varchar', 'NULL', $char_d, '', '', 
3474         'country',          'char',    'NULL', 2,       '', '',
3475         'taxclassnumtaxed', 'int',     'NULL', '',      '', '', 
3476         'taxcattaxed',      'varchar', 'NULL', $char_d, '', '', 
3477         'taxclassnum',      'int',     'NULL', '',      '', '', 
3478         'effdate',          @date_type, '', '', 
3479         'taxable',          'char',    'NULL', 1,       '', '', 
3480       ],
3481       'primary_key'  => 'pkgtaxratenum',
3482       'unique'       => [],
3483       'index'        => [ [ 'data_vendor', 'geocode', 'taxproductnum' ] ],
3484       'foreign_keys' => [
3485                           { columns    => [ 'taxproductnum' ],
3486                             table      => 'part_pkg_taxproduct',
3487                           },
3488                           { columns    => [ 'taxclassnumtaxed' ],
3489                             table      => 'tax_class',
3490                             references => [ 'taxclassnum' ],
3491                           },
3492                           { columns    => [ 'taxclassnum' ],
3493                             table      => 'tax_class',
3494                           },
3495                         ],
3496     },
3497
3498     'part_pkg_taxoverride' => { 
3499       'columns' => [
3500         'taxoverridenum', 'serial', '', '', '', '',
3501         'pkgpart',           'int', '', '', '', '',
3502         'taxclassnum',       'int', '', '', '', '',
3503         'usage_class',    'varchar', 'NULL', $char_d, '', '', 
3504       ],
3505       'primary_key'  => 'taxoverridenum',
3506       'unique'       => [],
3507       'index'        => [ [ 'pkgpart' ], [ 'taxclassnum' ] ],
3508       'foreign_keys' => [
3509                           { columns    => [ 'pkgpart' ],
3510                             table      => 'part_pkg',
3511                           },
3512                           { columns    => [ 'taxclassnum' ],
3513                             table      => 'tax_class',
3514                           },
3515                         ],
3516     },
3517
3518 #    'part_title' => {
3519 #      'columns' => [
3520 #        'titlenum',   'int',    '',   '',
3521 #        'title',      'varchar',   '',   $char_d,
3522 #      ],
3523 #      'primary_key' => 'titlenum',
3524 #      'unique' => [ [] ],
3525 #      'index' => [ [] ],
3526 #    },
3527
3528     'pkg_svc' => {
3529       'columns' => [
3530         'pkgsvcnum',   'serial',    '', '', '', '', 
3531         'pkgpart',        'int',    '', '', '', '', 
3532         'svcpart',        'int',    '', '', '', '', 
3533         'quantity',       'int',    '', '', '', '', 
3534         'primary_svc',   'char', 'NULL', 1, '', '', 
3535         'hidden',        'char', 'NULL', 1, '', '',
3536         'bulk_skip',     'char', 'NULL', 1, '', '',
3537       ],
3538       'primary_key'  => 'pkgsvcnum',
3539       'unique'       => [ ['pkgpart', 'svcpart'] ],
3540       'index'        => [ ['pkgpart'], ['quantity'] ],
3541       'foreign_keys' => [
3542                           { columns    => [ 'pkgpart' ],
3543                             table      => 'part_pkg',
3544                           },
3545                           { columns    => [ 'svcpart' ],
3546                             table      => 'part_svc',
3547                           },
3548                         ],
3549     },
3550
3551     'part_referral' => {
3552       'columns' => [
3553         'refnum',   'serial',     '',        '', '', '', 
3554         'referral', 'varchar',    '',   $char_d, '', '', 
3555         'disabled', 'char',   'NULL',         1, '', '', 
3556         'agentnum', 'int',    'NULL',        '', '', '', 
3557       ],
3558       'primary_key'  => 'refnum',
3559       'unique'       => [],
3560       'index'        => [ ['disabled'], ['agentnum'], ],
3561       'foreign_keys' => [
3562                           { columns    => [ 'agentnum' ],
3563                             table      => 'agent',
3564                           },
3565                         ],
3566     },
3567
3568     'part_svc' => {
3569       'columns' => [
3570         'svcpart',             'serial',     '',        '', '', '', 
3571         'svc',                'varchar',     '',   $char_d, '', '', 
3572         'svcdb',              'varchar',     '',   $char_d, '', '', 
3573         'disabled',              'char', 'NULL',         1, '', '', 
3574         'preserve',              'char', 'NULL',         1, '', '',
3575         'selfservice_access', 'varchar', 'NULL',   $char_d, '', '',
3576         'classnum',               'int', 'NULL',        '', '', '',
3577         'restrict_edit_password','char', 'NULL',         1, '', '',
3578         'has_router',            'char', 'NULL',         1, '', '',
3579 ],
3580       'primary_key'  => 'svcpart',
3581       'unique'       => [],
3582       'index'        => [ [ 'disabled' ] ],
3583       'foreign_keys' => [
3584                           { columns    => [ 'classnum' ],
3585                             table      => 'part_svc_class',
3586                           },
3587                         ],
3588     },
3589
3590     'part_svc_column' => {
3591       'columns' => [
3592         'columnnum',   'serial',      '',      '', '', '', 
3593         'svcpart',     'int',         '',      '', '', '', 
3594         'columnname',  'varchar',     '',      64, '', '', 
3595         'columnlabel', 'varchar', 'NULL', $char_d, '', '',
3596         'columnvalue', 'varchar', 'NULL',     512, '', '', 
3597         'columnflag',  'char',    'NULL',       1, '', '', 
3598         'required',    '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