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