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