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