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