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