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