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