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