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