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