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