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