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