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