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