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