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