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