option to force one-time charges to be billed separately, #32866
[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         #'paymask', 'varchar',  'NULL', $char_d, '', ''
5174         '_date',            @date_type,         '', '', 
5175         'end_date',         @date_type,         '', '', 
5176         'otaker',  'varchar',  'NULL',      32, '', '', 
5177         'usernum',     'int',  'NULL',      '', '', '',
5178         'bantype', 'varchar',  'NULL', $char_d, '', '',
5179         'reason',  'varchar',  'NULL', $char_d, '', '', 
5180       ],
5181       'primary_key'  => 'bannum',
5182       'unique'       => [],
5183       'index'        => [ [ 'payby', 'payinfo' ], [ 'usernum' ], ],
5184       'foreign_keys' => [
5185                           { columns    => [ 'usernum' ],
5186                             table      => 'access_user',
5187                           },
5188                         ],
5189     },
5190
5191     'pkg_category' => {
5192       'columns' => [
5193         'categorynum',        'serial',     '',      '', '', '', 
5194         'categoryname',      'varchar',     '', $char_d, '', '', 
5195         'weight',                'int', 'NULL',      '', '', '',
5196         'ticketing_queueid',     'int', 'NULL',      '', '', '', 
5197         'condense',             'char', 'NULL',       1, '', '', 
5198         'disabled',             'char', 'NULL',       1, '', '', 
5199       ],
5200       'primary_key' => 'categorynum',
5201       'unique' => [],
5202       'index' => [ ['disabled'] ],
5203     },
5204
5205     'pkg_class' => {
5206       'columns' => [
5207         'classnum',    'serial',   '',      '', '', '', 
5208         'classname',   'varchar',  '', $char_d, '', '', 
5209         'categorynum', 'int',  'NULL',      '', '', '', 
5210         'disabled',    'char', 'NULL',       1, '', '', 
5211         'fcc_ds0s',      'int',     'NULL', '', '', '', 
5212       ],
5213       'primary_key'  => 'classnum',
5214       'unique'       => [],
5215       'index'        => [ ['disabled'] ],
5216       'foreign_keys' => [
5217                           { columns    => [ 'categorynum' ],
5218                             table      => 'pkg_category',
5219                           },
5220                         ],
5221     },
5222
5223     'cdr' => {
5224       'columns' => [
5225         # qw( name type null length default local );
5226
5227         ###
5228         #asterisk fields
5229         ###
5230
5231         'acctid',   'bigserial',  '', '', '', '', 
5232         #'calldate', 'TIMESTAMP with time zone', '', '', \'now()', '',
5233         'calldate', 'timestamp',   '',      '', \'now()', '',
5234         'clid',        'varchar',  '', $char_d, \"''", '', 
5235         'src',         'varchar',  '', $char_d, \"''", '', 
5236         'dst',         'varchar',  '', $char_d, \"''", '', 
5237         'dcontext',    'varchar',  '', $char_d, \"''", '', 
5238         'channel',     'varchar',  '', $char_d, \"''", '', 
5239         'dstchannel',  'varchar',  '', $char_d, \"''", '', 
5240         'lastapp',     'varchar',  '', $char_d, \"''", '', 
5241         'lastdata',    'varchar',  '',     255, \"''", '', 
5242
5243         #currently only opensips & voipswitch
5244         'src_ip_addr', 'varchar',  'NULL',  15,    '', '',
5245
5246         #currently only opensips
5247         'dst_ip_addr', 'varchar',  'NULL',  15,    '', '',
5248
5249         #currently only u4:
5250         # terminating number (as opposed to dialed destination)
5251         'dst_term',    'varchar',  'NULL', $char_d, '', '',
5252
5253         #these don't seem to be logged by most of the SQL cdr_* modules
5254         #except tds under sql-illegal names, so;
5255         # ... don't rely on them for rating?
5256         # and, what they hey, i went ahead and changed the names and data types
5257         # to freeside-style dates...
5258           #'start',  'timestamp', 'NULL',  '',    '', '',
5259           #'answer', 'timestamp', 'NULL',  '',    '', '',
5260           #'end',    'timestamp', 'NULL',  '',    '', '',
5261         'startdate',  @date_type, '', '', 
5262         'answerdate', @date_type, '', '', 
5263         'enddate',    @date_type, '', '', 
5264         #
5265
5266         'duration',    'int',      '',      '',     0, '',
5267         'billsec',     'int',      '',      '',     0, '', 
5268         'disposition', 'varchar',  '',      45, \"''", '',
5269         'amaflags',    'int',      '',      '',     0, '',
5270         'accountcode', 'varchar',  '',      32, \"''", '',
5271         'uniqueid',    'varchar',  '', $char_d, \"''", '',
5272         'userfield',   'varchar',  '',     512, \"''", '',
5273
5274         'max_callers', 'int',  'NULL',      '',    '', '',
5275
5276         ###
5277         # old fields for unitel/RSLCOM/convergent that don't map to asterisk
5278         # ones we adoped moved to "own fields" section below
5279         # charged_party, upstream_price, rated_price, carrierid, cdrtypenum
5280         ###
5281
5282         'upstream_currency',      'char', 'NULL',       3, '', '',
5283         'upstream_rateplanid',     'int', 'NULL',      '', '', '', #?
5284
5285         # how it was rated internally...
5286         'ratedetailnum',           'int', 'NULL',      '', '', '',
5287
5288         'distance',            'decimal', 'NULL',      '', '', '',
5289         'islocal',                 'int', 'NULL',      '', '', '', # '',  '', 0, '' instead?
5290
5291         #cdr_calltype: the big list in appendix 2
5292         'calltypenum',             'int', 'NULL',      '', '', '',
5293
5294         'description',         'varchar', 'NULL', $char_d, '', '',
5295         'quantity',                'int', 'NULL',      '', '', '', 
5296
5297         'upstream_rateid',         'int', 'NULL',      '', '', '',
5298
5299         ###
5300         # more fields, for GSM imports
5301         ###
5302         'servicecode',             'int', 'NULL',      '', '', '',
5303         'quantity_able',           'int', 'NULL',      '', '', '', 
5304
5305         ###
5306         #and now for our own fields
5307         ###
5308
5309         'cdrtypenum',              'int', 'NULL',      '', '', '',
5310
5311         'charged_party',       'varchar', 'NULL', $char_d, '', '',
5312         'charged_party_imsi',  'varchar', 'NULL', $char_d, '', '',
5313
5314         'upstream_price',      'decimal', 'NULL',  '10,5', '', '', 
5315
5316         #currently only voipswitch
5317         #'upstream_rate',      'decimal', 'NULL',  '10,5', '', '', 
5318
5319         'upstream_src_regionname', 'varchar', 'NULL', $char_d, '', '',
5320         'upstream_dst_regionname', 'varchar', 'NULL', $char_d, '', '',
5321
5322         # how it was rated internally...
5323         'rated_pretty_dst',       'varchar', 'NULL', $char_d, '', '',
5324         'rated_regionname',       'varchar', 'NULL', $char_d, '', '',
5325         'rated_price',            'decimal', 'NULL',  '10,4', '', '',
5326         'rated_seconds',              'int', 'NULL',      '', '', '',
5327         'rated_minutes', 'double precision', 'NULL',      '', '', '',
5328         'rated_granularity',          'int', 'NULL',      '', '', '',
5329         'rated_ratedetailnum',        'int', 'NULL',      '', '', '',
5330         'rated_classnum',             'int', 'NULL',      '', '', '', 
5331         'rated_ratename',         'varchar', 'NULL', $char_d, '', '', 
5332
5333         'carrierid',               'bigint', 'NULL',      '', '', '',
5334
5335         # service it was matched to
5336         'svcnum',             'int',   'NULL',     '',   '', '', 
5337
5338         #NULL, done (or something)
5339         'freesidestatus', 'varchar',   'NULL',     32,   '', '', 
5340
5341         #NULL, done (or something)
5342         'freesiderewritestatus', 'varchar',   'NULL',     32,   '', '', 
5343
5344         #an indexed place to put big numbers
5345         'cdrid',         'bigint',     'NULL',     '',  '', '', 
5346
5347         #for taqua accountcode rewriting, for starters
5348         'sessionnum',       'int',    'NULL',      '', '', '',
5349         'subscriber',   'varchar',    'NULL', $char_d, '', '',
5350
5351         #old
5352         'cdrbatch',     'varchar',    'NULL',     255, '', '',
5353         #new
5354         'cdrbatchnum',      'int',    'NULL',      '', '', '',
5355
5356         # FK to cust_bill_pkg_detail; having a value here absolutely means
5357         # that the CDR appears on an invoice
5358         'detailnum',     'bigint',    'NULL',      '', '', '',
5359       ],
5360       'primary_key' => 'acctid',
5361       'unique' => [],
5362       'index' => [ [ 'calldate' ],
5363                    [ 'src' ], [ 'dst' ], [ 'dcontext' ], [ 'charged_party' ],
5364                    [ 'lastapp' ],
5365                    ['accountcode'], ['uniqueid'], ['carrierid'], ['cdrid'],
5366                    [ 'sessionnum' ], [ 'subscriber' ],
5367                    [ 'freesidestatus' ], [ 'freesiderewritestatus' ],
5368                    [ 'cdrbatch' ], [ 'cdrbatchnum' ],
5369                    [ 'src_ip_addr' ], [ 'dst_ip_addr' ], [ 'dst_term' ],
5370                  ],
5371       #no FKs on cdr table... choosing not to throw errors no matter what's
5372       # thrown in here.  better to have the data.
5373     },
5374
5375     'cdr_batch' => {
5376       'columns' => [
5377         'cdrbatchnum',   'serial',    '',   '', '', '', 
5378         'cdrbatch', 'varchar', 'NULL', 255, '', '',
5379         '_date',     @date_type, '', '', 
5380       ],
5381       'primary_key' => 'cdrbatchnum',
5382       'unique' => [ [ 'cdrbatch' ] ],
5383       'index' => [],
5384     },
5385
5386     'cdr_termination' => {
5387       'columns' => [
5388         'cdrtermnum', 'bigserial',     '',      '', '', '',
5389         'acctid',        'bigint',     '',      '', '', '', 
5390         'termpart',         'int',     '',      '', '', '',#future use see below
5391         'rated_price',  'decimal', 'NULL',  '10,4', '', '',
5392         'rated_seconds',    'int', 'NULL',      '', '', '',
5393         'rated_minutes', 'double precision', 'NULL',   '', '', '',
5394         'status',       'varchar', 'NULL',      32, '', '',
5395         'svcnum',           'int', 'NULL',      '', '', '',
5396       ],
5397       'primary_key'  => 'cdrtermnum',
5398       'unique'       => [ [ 'acctid', 'termpart' ] ],
5399       'index'        => [ [ 'acctid' ], [ 'status' ], ],
5400       'foreign_keys' => [
5401                           { columns    => [ 'acctid' ],
5402                             table      => 'cdr',
5403                           },
5404                           { columns    => [ 'svcnum' ],
5405                             table      => 'cust_svc',
5406                           },
5407                         ],
5408     },
5409
5410     #to handle multiple termination/settlement passes...
5411    # 'part_termination' => {
5412    #   'columns' => [
5413    #     'termpart',       'int', '',      '', '', '',
5414    #     'termname',   'varchar', '', $char_d, '', '',
5415    #     'cdr_column', 'varchar', '', $char_d, '', '', #maybe set it here instead of in the price plan?
5416    #   ],
5417    #   'primary_key' => 'termpart',
5418    #   'unique' => [],
5419    #   'index'  => [],
5420    # },
5421
5422     #the remaining cdr_ tables are not really used
5423     'cdr_calltype' => {
5424       'columns' => [
5425         'calltypenum',   'serial',  '', '', '', '', 
5426         'calltypename',  'varchar', '', $char_d, '', '', 
5427       ],
5428       'primary_key' => 'calltypenum',
5429       'unique'      => [],
5430       'index'       => [],
5431     },
5432
5433     'cdr_type' => {
5434       'columns' => [
5435         'cdrtypenum'  => 'serial',  '', '', '', '',
5436         'cdrtypename' => 'varchar', '', $char_d, '', '',
5437       ],
5438       'primary_key' => 'cdrtypenum',
5439       'unique'      => [],
5440       'index'       => [],
5441     },
5442
5443     'cdr_carrier' => {
5444       'columns' => [
5445         'carrierid'   =>  'serial',     '',      '', '', '',
5446         'carriername' => 'varchar',     '', $char_d, '', '',
5447         'disabled'    =>    'char', 'NULL',       1, '', '', 
5448       ],
5449       'primary_key' => 'carrierid',
5450       'unique'      => [],
5451       'index'       => [],
5452     },
5453
5454     #'cdr_file' => {
5455     #  'columns' => [
5456     #    'filenum',    'serial',     '', '', '', '',
5457     #    'filename',  'varchar',     '', '', '', '',
5458     #    'status',    'varchar', 'NULL', '', '', '',
5459     #  ],
5460     #  'primary_key' => 'filenum',
5461     #  'unique' => [ [ 'filename' ], ], #just change the index if we need to
5462     #                                   # agent-virtualize or have a customer
5463     #                                   # with dup-filename needs or something
5464     #                                   # (only used by cdr.http_and_import for
5465     #                                   #  chrissakes)
5466     #  'index'  => [],
5467     #},
5468
5469     'inventory_item' => {
5470       'columns' => [
5471         'itemnum',   'serial',      '',      '', '', '',
5472         'classnum',  'int',         '',      '', '', '',
5473         'agentnum',  'int',     'NULL',      '', '', '',
5474         'item',      'varchar',     '', $char_d, '', '',
5475         'svcnum',    'int',     'NULL',      '', '', '',
5476         'svc_field', 'varchar', 'NULL', $char_d, '', '',
5477       ],
5478       'primary_key'  => 'itemnum',
5479       'unique'       => [ [ 'classnum', 'item' ] ],
5480       'index'        => [ [ 'classnum' ], [ 'agentnum' ], [ 'svcnum' ] ],
5481       'foreign_keys' => [
5482                           { columns    => [ 'classnum' ],
5483                             table      => 'inventory_class',
5484                           },
5485                           { columns    => [ 'agentnum' ],
5486                             table      => 'agent',
5487                           },
5488                           { columns    => [ 'svcnum' ],
5489                             table      => 'cust_svc',
5490                           },
5491                         ],
5492     },
5493
5494     'inventory_class' => {
5495       'columns' => [
5496         'classnum',  'serial',       '',      '', '', '',
5497         'classname', 'varchar',      '', $char_d, '', '',
5498       ],
5499       'primary_key' => 'classnum',
5500       'unique' => [],
5501       'index'  => [],
5502     },
5503
5504     'access_user_session' => {
5505       'columns' => [
5506         'sessionnum',   'serial',  '',      '', '', '', 
5507         'sessionkey',  'varchar',  '', $char_d, '', '',
5508         'usernum',         'int',  '',      '', '', '',
5509         'start_date', @date_type,               '', '',
5510         'last_date',  @date_type,               '', '',
5511       ],
5512       'primary_key'  => 'sessionnum',
5513       'unique'       => [ [ 'sessionkey' ] ],
5514       'index'        => [],
5515       'foreign_keys' => [
5516                           { columns    => [ 'usernum' ],
5517                             table      => 'access_user',
5518                           },
5519                         ],
5520     },
5521
5522     'access_user' => {
5523       'columns' => [
5524         'usernum',             'serial',     '',      '', '', '',
5525         'username',           'varchar',     '', $char_d, '', '',
5526         '_password',          'varchar', 'NULL', $char_d, '', '',
5527         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
5528         'last',               'varchar', 'NULL', $char_d, '', '', 
5529         'first',              'varchar', 'NULL', $char_d, '', '', 
5530         'user_custnum',           'int', 'NULL',      '', '', '',
5531         'report_salesnum',        'int', 'NULL',      '', '', '',
5532         'disabled',              'char', 'NULL',       1, '', '', 
5533       ],
5534       'primary_key'  => 'usernum',
5535       'unique'       => [ [ 'username' ] ],
5536       'index'        => [ [ 'user_custnum' ] ],
5537       'foreign_keys' => [
5538                           { columns    => [ 'user_custnum' ],
5539                             table      => 'cust_main',
5540                             references => [ 'custnum' ],
5541                           },
5542                           { columns    => [ 'report_salesnum' ],
5543                             table      => 'sales',
5544                             references => [ 'salesnum' ],
5545                           },
5546                         ],
5547     },
5548
5549     'access_user_pref' => {
5550       'columns' => [
5551         'prefnum',    'serial',       '', '', '', '',
5552         'usernum',     'int',       '', '', '', '',
5553         'prefname', 'varchar', '', $char_d, '', '', 
5554         'prefvalue', 'text', 'NULL', '', '', '', 
5555         'expiration', @date_type, '', '',
5556       ],
5557       'primary_key'  => 'prefnum',
5558       'unique'       => [],
5559       'index'        => [ [ 'usernum' ] ],
5560       'foreign_keys' => [
5561                           { columns    => [ 'usernum' ],
5562                             table      => 'access_user',
5563                           },
5564                         ],
5565     },
5566
5567     'access_group' => {
5568       'columns' => [
5569         'groupnum',   'serial', '',      '', '', '',
5570         'groupname', 'varchar', '', $char_d, '', '',
5571       ],
5572       'primary_key' => 'groupnum',
5573       'unique' => [ [ 'groupname' ] ],
5574       'index'  => [],
5575     },
5576
5577     'access_usergroup' => {
5578       'columns' => [
5579         'usergroupnum', 'serial', '', '', '', '',
5580         'usernum',         'int', '', '', '', '',
5581         'groupnum',        'int', '', '', '', '',
5582       ],
5583       'primary_key'  => 'usergroupnum',
5584       'unique'       => [ [ 'usernum', 'groupnum' ] ],
5585       'index'        => [ [ 'usernum' ] ],
5586       'foreign_keys' => [
5587                           { columns    => [ 'usernum' ],
5588                             table      => 'access_user',
5589                           },
5590                           { columns    => [ 'groupnum' ],
5591                             table      => 'access_group',
5592                           },
5593                         ],
5594      },
5595
5596     'access_groupagent' => {
5597       'columns' => [
5598         'groupagentnum', 'serial', '', '', '', '',
5599         'groupnum',         'int', '', '', '', '',
5600         'agentnum',         'int', '', '', '', '',
5601       ],
5602       'primary_key'  => 'groupagentnum',
5603       'unique'       => [ [ 'groupnum', 'agentnum' ] ],
5604       'index'        => [ [ 'groupnum' ] ],
5605       'foreign_keys' => [
5606                           { columns    => [ 'groupnum' ],
5607                             table      => 'access_group',
5608                           },
5609                           { columns    => [ 'agentnum' ],
5610                             table      => 'agent',
5611                           },
5612                         ],
5613     },
5614
5615     'access_right' => {
5616       'columns' => [
5617         'rightnum',   'serial', '',      '', '', '',
5618         'righttype', 'varchar', '', $char_d, '', '',
5619         'rightobjnum',   'int', '',      '', '', '',
5620         'rightname', 'varchar', '', $char_d, '', '',
5621       ],
5622       'primary_key' => 'rightnum',
5623       'unique' => [ [ 'righttype', 'rightobjnum', 'rightname' ] ],
5624       'index'  => [],
5625     },
5626
5627     'sched_item' => {
5628       'columns' => [
5629         'itemnum',   'serial',      '', '', '', '', 
5630         'usernum',      'int',  'NULL', '', '', '', 
5631         #'itemname', 'varchar', $char_d, '', '', '',
5632         'disabled',    'char',  'NULL',  1, '', '', 
5633       ],
5634       'primary_key'  => 'itemnum',
5635       'unique'       => [ [ 'usernum' ] ],
5636       'index'        => [],
5637       'foreign_keys' => [
5638                           { columns    => [ 'usernum' ],
5639                             table      => 'access_user',
5640                           },
5641                         ],
5642     },
5643
5644     #'sched_item_class'
5645
5646     'sched_avail' => {
5647       'columns' => [
5648         'availnum',      'serial', '', '', '', '', 
5649         'itemnum',          'int', '', '', '', '',
5650         'wday',             'int', '', '', '', '',
5651         'stime',            'int', '', '', '', '',
5652         'etime',            'int', '', '', '', '',
5653         'override_date',    @date_type,    '', '',
5654       ],
5655       'primary_key'  => 'availnum',
5656       'unique'       => [],
5657       'index'        => [],
5658       'foreign_keys' => [
5659                           { columns    => [ 'itemnum' ],
5660                             table      => 'sched_item',
5661                           },
5662                         ],
5663     },
5664
5665     'svc_phone' => {
5666       'columns' => [
5667         'svcnum',                         'int',     '',      '', '', '', 
5668         'countrycode',                'varchar',     '',       3, '', '', 
5669         'phonenum',                   'varchar',     '',      25, '', '', #12 ?
5670         'sim_imsi',                   'varchar', 'NULL',      15, '', '',
5671         'pin',                        'varchar', 'NULL', $char_d, '', '',
5672         'sip_password',               'varchar', 'NULL', $char_d, '', '',
5673         'phone_name',                 'varchar', 'NULL', $char_d, '', '',
5674         'pbxsvc',                         'int', 'NULL',      '', '', '',
5675         'domsvc',                         'int', 'NULL',      '', '', '', 
5676         'locationnum',                    'int', 'NULL',      '', '', '',
5677         'forwarddst',                 'varchar', 'NULL',      15, '', '', 
5678         'email',                      'varchar', 'NULL',     255, '', '', 
5679         'lnp_status',                 'varchar', 'NULL', $char_d, '', '',
5680         'portable',                      'char', 'NULL',       1, '', '', 
5681         'lrn',                           'char', 'NULL',      10, '', '', 
5682         'lnp_desired_due_date',           'int', 'NULL',      '', '', '',
5683         'lnp_due_date',                   'int', 'NULL',      '', '', '',
5684         'lnp_other_provider',         'varchar', 'NULL', $char_d, '', '',
5685         'lnp_other_provider_account', 'varchar', 'NULL', $char_d, '', '',
5686         'lnp_reject_reason',          'varchar', 'NULL', $char_d, '', '',
5687         'sms_carrierid',                  'int', 'NULL',      '', '', '',
5688         'sms_account',                'varchar', 'NULL', $char_d, '', '',
5689         'max_simultaneous',               'int', 'NULL',      '', '', '',
5690         'e911_class',                    'char', 'NULL',       1, '', '',
5691         'e911_type',                     'char', 'NULL',       1, '', '', 
5692         'circuit_svcnum',                 'int', 'NULL',      '', '', '',
5693         'sip_server',                 'varchar', 'NULL', $char_d, '', '',
5694       ],
5695       'primary_key'  => 'svcnum',
5696       'unique'       => [ [ 'sms_carrierid', 'sms_account'] ],
5697       'index'        => [ ['countrycode', 'phonenum'], ['pbxsvc'], ['domsvc'],
5698                           ['locationnum'], ['sms_carrierid'],
5699                         ],
5700       'foreign_keys' => [
5701                           { columns    => [ 'svcnum' ],
5702                             table      => 'cust_svc',
5703                           },
5704                           { columns    => [ 'pbxsvc' ],
5705                             table      => 'svc_pbx', #'cust_svc',
5706                             references => [ 'svcnum' ],
5707                           },
5708                           { columns    => [ 'domsvc' ],
5709                             table      => 'svc_domain', #'cust_svc',
5710                             references => [ 'svcnum' ],
5711                           },
5712                           { columns    => [ 'locationnum' ],
5713                             table      => 'cust_location',
5714                           },
5715                           { columns    => [ 'sms_carrierid' ],
5716                             table      => 'cdr_carrier',
5717                             references => [ 'carrierid' ],
5718                           },
5719                           { columns    => [ 'circuit_svcnum' ],
5720                             table      => 'svc_circuit',
5721                             references => [ 'svcnum' ],
5722                           },
5723                         ],
5724     },
5725
5726     'phone_device' => {
5727       'columns' => [
5728         'devicenum', 'serial',     '', '', '', '',
5729         'devicepart',   'int',     '', '', '', '',
5730         'svcnum',       'int',     '', '', '', '', 
5731         'mac_addr', 'varchar', 'NULL', 12, '', '', 
5732       ],
5733       'primary_key'  => 'devicenum',
5734       'unique'       => [ [ 'mac_addr' ], ],
5735       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
5736       'foreign_keys' => [
5737                           { columns    => [ 'devicepart' ],
5738                             table      => 'part_device',
5739                           },
5740                           { columns    => [ 'svcnum' ],
5741                             table      => 'svc_phone',
5742                           },
5743                         ],
5744     },
5745
5746     'part_device' => {
5747       'columns' => [
5748         'devicepart', 'serial',  '',      '', '', '',
5749         'devicename', 'varchar', '', $char_d, '', '',
5750         'inventory_classnum', 'int', 'NULL', '', '', '',
5751       ],
5752       'primary_key'  => 'devicepart',
5753       'unique'       => [ [ 'devicename' ] ], #?
5754       'index'        => [],
5755       'foreign_keys' => [
5756                           { columns    => [ 'inventory_classnum' ],
5757                             table      => 'inventory_class',
5758                             references => [ 'classnum' ],
5759                           },
5760                         ],
5761     },
5762
5763     'phone_avail' => {
5764       'columns' => [
5765         'availnum',    'serial',      '',      '', '', '', 
5766         'exportnum',   'int',         '',      '', '', '', 
5767         'countrycode', 'varchar',     '',       3, '', '', 
5768         'state',       'char',    'NULL',       2, '', '', 
5769         'npa',         'char',        '',       3, '', '', 
5770         'nxx',         'char',    'NULL',       3, '', '', 
5771         'station',     'char',    'NULL',       4, '', '',
5772         'name',        'varchar', 'NULL', $char_d, '', '',
5773         'rate_center_abbrev', 'varchar', 'NULL', $char_d, '', '',
5774         'latanum',      'int',     'NULL',      '', '', '',
5775         'msanum',       'int', 'NULL', '', '', '',
5776         'ordernum',      'int',     'NULL',      '', '', '',
5777         'svcnum',      'int',     'NULL',      '', '', '',
5778         'availbatch', 'varchar',  'NULL', $char_d, '', '',
5779       ],
5780       'primary_key'  => 'availnum',
5781       'unique'       => [],
5782       'index'        => [ ['exportnum','countrycode','state'],    #npa search
5783                           ['exportnum','countrycode','npa'],      #nxx search
5784                           ['exportnum','countrycode','npa','nxx'],#station srch
5785                           [ 'exportnum','countrycode','npa','nxx','station'], #
5786                           [ 'svcnum' ],
5787                           [ 'availbatch' ],
5788                           [ 'latanum' ],
5789                         ],
5790       'foreign_keys' => [
5791                           { columns    => [ 'exportnum' ],
5792                             table      => 'part_export',
5793                           },
5794                           { columns    => [ 'latanum' ],
5795                             table      => 'lata',
5796                           },
5797                           { columns    => [ 'msanum' ],
5798                             table      => 'msa',
5799                           },
5800                           { columns    => [ 'ordernum' ],
5801                             table      => 'did_order',
5802                           },
5803                           { columns    => [ 'svcnum' ],
5804                             table      => 'svc_phone',
5805                           },
5806                         ],
5807     },
5808
5809     'lata' => {
5810       'columns' => [
5811         'latanum',    'int',      '',      '', '', '', 
5812         'description',   'varchar',    '',      $char_d, '', '', 
5813         'have_usage',   'int',    'NULL',      '', '', '', 
5814       ],
5815       'primary_key' => 'latanum',
5816       'unique' => [],
5817       'index'  => [],
5818     },
5819
5820     'msa' => {
5821       'columns' => [
5822         'msanum',    'int',      '',      '', '', '', 
5823         'description',   'varchar',    '',      $char_d, '', '', 
5824       ],
5825       'primary_key' => 'msanum',
5826       'unique' => [],
5827       'index'  => [],
5828     },
5829
5830     'rate_center' => {
5831       'columns' => [
5832         'ratecenternum',    'serial',      '',      '', '', '', 
5833         'description',   'varchar',    '',      $char_d, '', '', 
5834       ],
5835       'primary_key' => 'ratecenternum',
5836       'unique' => [],
5837       'index'  => [],
5838     },
5839
5840     'did_vendor' => {
5841       'columns' => [
5842         'vendornum',    'serial',      '',      '', '', '', 
5843         'vendorname',   'varchar',        '',     $char_d, '', '', 
5844       ],
5845       'primary_key' => 'vendornum',
5846       'unique' => [],
5847       'index'  => [],
5848     },
5849
5850     'did_order_item' => {
5851       'columns' => [
5852         'orderitemnum',    'serial',      '',      '', '', '', 
5853         'ordernum',    'int',      '',      '', '', '', 
5854         'msanum',      'int',     'NULL',      '', '', '',
5855         'npa',      'int',     'NULL',      '', '', '',
5856         'latanum',      'int',     'NULL',      '', '', '',
5857         'ratecenternum',      'int',     'NULL',      '', '', '',
5858         'state',       'char',    'NULL',       2, '', '', 
5859         'quantity',      'int',     '',      '', '', '',
5860         'custnum',   'int', 'NULL', '', '', '',
5861       ],
5862       'primary_key'  => 'orderitemnum',
5863       'unique'       => [],
5864       'index'        => [],
5865       'foreign_keys' => [
5866                           { columns    => [ 'ordernum' ],
5867                             table      => 'did_order',
5868                           },
5869                           { columns    => [ 'msanum' ],
5870                             table      => 'msa',
5871                           },
5872                           { columns    => [ 'latanum' ],
5873                             table      => 'lata',
5874                           },
5875                           { columns    => [ 'ratecenternum' ],
5876                             table      => 'rate_center',
5877                           },
5878                           { columns    => [ 'custnum' ],
5879                             table      => 'cust_main',
5880                           },
5881                         ],
5882     },
5883
5884     'did_order' => {
5885       'columns' => [
5886         'ordernum',    'serial',      '',      '', '', '', 
5887         'vendornum',   'int',       '',      '', '', '', 
5888         'vendor_order_id',   'varchar',  'NULL',   $char_d, '', '', 
5889         'custnum',   'int', 'NULL', '', '', '',
5890         'submitted',      'int',     '',      '', '', '',
5891         'confirmed',      'int',     'NULL',      '', '', '',
5892         'received',      'int',     'NULL',      '', '', '',
5893       ],
5894       'primary_key'  => 'ordernum',
5895       'unique'       => [ [ 'vendornum', 'vendor_order_id' ] ],
5896       'index'        => [],
5897       'foreign_keys' => [
5898                           { columns    => [ 'vendornum' ],
5899                             table      => 'did_vendor',
5900                           },
5901                           { columns    => [ 'custnum' ],
5902                             table      => 'cust_main',
5903                           },
5904                         ],
5905     },
5906
5907     'reason_type' => {
5908       'columns' => [
5909         'typenum',   'serial',  '', '', '', '', 
5910         'class',     'char', '', 1, '', '', 
5911         'type',     'varchar', '', $char_d, '', '', 
5912       ],
5913       'primary_key' => 'typenum',
5914       'unique' => [],
5915       'index' => [],
5916     },
5917
5918     'reason' => {
5919       'columns' => [
5920         'reasonnum',     'serial',  '', '', '', '', 
5921         'reason_type',   'int',  '', '', '', '', 
5922         'reason',        'text', '', '', '', '', 
5923         'disabled',      'char',    'NULL', 1, '', '', 
5924         'unsuspend_pkgpart', 'int',  'NULL', '', '', '',
5925         'unsuspend_hold','char',    'NULL', 1, '', '',
5926         'unused_credit', 'char',    'NULL', 1, '', '',
5927       ],
5928       'primary_key'  => 'reasonnum',
5929       'unique'       => [],
5930       'index'        => [],
5931       'foreign_keys' => [
5932                           { columns    => [ 'reason_type' ],
5933                             table      => 'reason_type',
5934                             references => [ 'typenum' ],
5935                           },
5936                           { columns    => [ 'unsuspend_pkgpart' ],
5937                             table      => 'part_pkg',
5938                             references => [ 'pkgpart' ],
5939                           },
5940                         ],
5941     },
5942
5943     'conf' => {
5944       'columns' => [
5945         'confnum',  'serial',     '',      '', '', '', 
5946         'agentnum', 'int',    'NULL',      '', '', '', 
5947         'locale',   'varchar','NULL',      16, '', '',
5948         'name',     'varchar',    '', $char_d, '', '', 
5949         'value',    'text',   'NULL',      '', '', '',
5950       ],
5951       'primary_key'  => 'confnum',
5952       'unique'       => [ [ 'agentnum', 'locale', 'name' ] ],
5953       'index'        => [],
5954       'foreign_keys' => [
5955                           { columns    => [ 'agentnum' ],
5956                             table      => 'agent',
5957                           },
5958                         ],
5959     },
5960
5961     'pkg_referral' => {
5962       'columns' => [
5963         'pkgrefnum',     'serial', '', '', '', '',
5964         'pkgnum',        'int',    '', '', '', '',
5965         'refnum',        'int',    '', '', '', '',
5966       ],
5967       'primary_key'  => 'pkgrefnum',
5968       'unique'       => [ [ 'pkgnum', 'refnum' ] ],
5969       'index'        => [ [ 'pkgnum' ], [ 'refnum' ] ],
5970       'foreign_keys' => [
5971                           { columns    => [ 'pkgnum' ],
5972                             table      => 'cust_pkg',
5973                           },
5974                           { columns    => [ 'refnum' ],
5975                             table      => 'part_referral',
5976                           },
5977                         ],
5978     },
5979
5980     'svc_pbx' => {
5981       'columns' => [
5982         'svcnum',           'int',     '',      '', '', '', 
5983         'id',               'int', 'NULL',      '', '', '', 
5984         'uuid',            'char', 'NULL',      36, '', '',
5985         'title',        'varchar', 'NULL', $char_d, '', '', 
5986         'max_extensions',   'int', 'NULL',      '', '', '',
5987         'max_simultaneous', 'int', 'NULL',      '', '', '',
5988         'ip_addr',      'varchar', 'NULL',      40, '', '',
5989       ],
5990       'primary_key'  => 'svcnum',
5991       'unique'       => [],
5992       'index'        => [ [ 'id' ], [ 'uuid' ] ],
5993       'foreign_keys' => [
5994                           { columns    => [ 'svcnum' ],
5995                             table      => 'cust_svc',
5996                           },
5997                         ],
5998     },
5999
6000     'pbx_extension' => {
6001       'columns' => [
6002         'extensionnum',  'serial',     '',      '', '', '',
6003         'svcnum',           'int',     '',      '', '', '',
6004         'extension',    'varchar',     '', $char_d, '', '',
6005         'pin',          'varchar', 'NULL', $char_d, '', '',
6006         'sip_password', 'varchar', 'NULL', $char_d, '', '',
6007         'phone_name',   'varchar', 'NULL', $char_d, '', '',
6008       ],
6009       'primary_key'  => 'extensionnum',
6010       'unique'       => [ [ 'svcnum', 'extension' ] ],
6011       'index'        => [ [ 'svcnum' ] ],
6012       'foreign_keys' => [
6013                           { columns    => [ 'svcnum' ],
6014                             table      => 'svc_pbx',
6015                           },
6016                         ],
6017     },
6018
6019     'pbx_device' => {
6020       'columns' => [
6021         'devicenum', 'serial',     '', '', '', '',
6022         'devicepart',   'int',     '', '', '', '',
6023         'svcnum',       'int',     '', '', '', '', 
6024         'mac_addr', 'varchar', 'NULL', 12, '', '', 
6025       ],
6026       'primary_key'  => 'devicenum',
6027       'unique'       => [ [ 'mac_addr' ], ],
6028       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
6029       'foreign_keys' => [
6030                           { columns    => [ 'devicepart' ],
6031                             table      => 'part_device',
6032                           },
6033                           { columns    => [ 'svcnum' ],
6034                             table      => 'svc_pbx',
6035                           },
6036                         ],
6037     },
6038
6039     'extension_device' => {
6040       'columns' => [
6041         'extensiondevicenum', 'serial', '', '', '', '',
6042         'extensionnum',          'int', '', '', '', '',
6043         'devicenum',             'int', '', '', '', '',
6044       ],
6045       'primary_key'  => 'extensiondevicenum',
6046       'unique'       => [ [ 'extensionnum', 'devicenum' ] ],
6047       'index'        => [],#both?  which way do we need to query?
6048       'foreign_keys' => [
6049                           { columns  => [ 'extensionnum' ],
6050                             table    => 'pbx_extension',
6051                           },
6052                           { columns  => [ 'devicenum' ],
6053                             table    => 'pbx_device',
6054                           },
6055                         ],
6056     },
6057
6058     'svc_mailinglist' => { #svc_group?
6059       'columns' => [
6060         'svcnum',            'int',     '',            '', '', '', 
6061         'username',      'varchar',     '', $username_len, '', '',
6062         'domsvc',            'int',     '',            '', '', '', 
6063         'listnum',           'int',     '',            '', '', '',
6064         'reply_to',         'char', 'NULL',             1, '', '',#SetReplyTo
6065         'remove_from',      'char', 'NULL',             1, '', '',#RemoveAuthor
6066         'reject_auto',      'char', 'NULL',             1, '', '',#RejectAuto
6067         'remove_to_and_cc', 'char', 'NULL',             1, '', '',#RemoveToAndCc
6068       ],
6069       'primary_key'  => 'svcnum',
6070       'unique'       => [],
6071       'index'        => [ ['username'], ['domsvc'], ['listnum'] ],
6072       'foreign_keys' => [
6073                           { columns    => [ 'svcnum' ],
6074                             table      => 'cust_svc',
6075                           },
6076                           { columns    => [ 'domsvc' ],
6077                             table      => 'svc_domain', #'cust_svc',
6078                             references => [ 'svcnum' ],
6079                           },
6080                           { columns    => [ 'listnum' ],
6081                             table      => 'mailinglist',
6082                           },
6083                         ],
6084     },
6085
6086     'mailinglist' => {
6087       'columns' => [
6088         'listnum',   'serial', '',      '', '', '',
6089         'listname', 'varchar', '', $char_d, '', '',
6090       ],
6091       'primary_key' => 'listnum',
6092       'unique' => [],
6093       'index'  => [],
6094     },
6095
6096     'mailinglistmember' => {
6097       'columns' => [
6098         'membernum',        'serial',     '',   '', '', '',
6099         'listnum',             'int',     '',   '', '', '',
6100         'svcnum',              'int', 'NULL',   '', '', '', 
6101         'contactemailnum',     'int', 'NULL',   '', '', '', 
6102         'email',           'varchar', 'NULL',  255, '', '', 
6103       ],
6104       'primary_key'  => 'membernum',
6105       'unique'       => [],
6106       'index'        => [['listnum'],['svcnum'],['contactemailnum'],['email']],
6107       'foreign_keys' => [
6108                           { columns    => [ 'listnum' ],
6109                             table      => 'mailinglist',
6110                           },
6111                           { columns    => [ 'svcnum' ],
6112                             table      => 'svc_acct',
6113                           },
6114                           { columns    => [ 'contactemailnum' ],
6115                             table      => 'contact_email',
6116                           },
6117                         ],
6118     },
6119
6120     'bill_batch' => {
6121       'columns' => [
6122         'batchnum',         'serial',     '',  '', '', '',
6123         'agentnum',            'int', 'NULL',  '', '', '',
6124         'status',             'char', 'NULL', '1', '', '',
6125         'pdf',                'blob', 'NULL',  '', '', '',
6126       ],
6127       'primary_key'  => 'batchnum',
6128       'unique'       => [],
6129       'index'        => [ ['agentnum'] ],
6130       'foreign_keys' => [
6131                           { columns    => [ 'agentnum' ],
6132                             table      => 'agent',
6133                           },
6134                         ],
6135     },
6136
6137     'cust_bill_batch' => {
6138       'columns' => [
6139         'billbatchnum',     'serial',     '', '', '', '',
6140         'batchnum',            'int',     '', '', '', '',
6141         'invnum',              'int',     '', '', '', '',
6142       ],
6143       'primary_key'  => 'billbatchnum',
6144       'unique'       => [],
6145       'index'        => [ [ 'batchnum' ], [ 'invnum' ] ],
6146       'foreign_keys' => [
6147                           { columns    => [ 'batchnum' ],
6148                             table      => 'bill_batch',
6149                           },
6150                           { columns    => [ 'invnum' ],
6151                             table      => 'cust_bill',
6152                           },
6153                         ],
6154     },
6155
6156     'cust_bill_batch_option' => {
6157       'columns' => [
6158         'optionnum', 'serial', '', '', '', '', 
6159         'billbatchnum', 'int', '', '', '', '', 
6160         'optionname', 'varchar', '', $char_d, '', '', 
6161         'optionvalue', 'text', 'NULL', '', '', '', 
6162       ],
6163       'primary_key'  => 'optionnum',
6164       'unique'       => [],
6165       'index'        => [ [ 'billbatchnum' ], [ 'optionname' ] ],
6166       'foreign_keys' => [
6167                           { columns    => [ 'billbatchnum' ],
6168                             table      => 'cust_bill_batch',
6169                           },
6170                         ],
6171      },
6172
6173     'msg_template' => {
6174       'columns' => [
6175         'msgnum',     'serial',     '',      '', '', '',
6176         'msgname',   'varchar',     '', $char_d, '', '',
6177         'agentnum',      'int', 'NULL',      '', '', '',
6178         'subject',   'varchar', 'NULL',     512, '', '',
6179         'mime_type', 'varchar',     '', $char_d, '', '',
6180         'body',         'blob', 'NULL',      '', '', '',
6181         'disabled',     'char', 'NULL',       1, '', '', 
6182         'from_addr', 'varchar', 'NULL',     255, '', '',
6183         'bcc_addr',  'varchar', 'NULL',     255, '', '',
6184       ],
6185       'primary_key'  => 'msgnum',
6186       'unique'       => [ ],
6187       'index'        => [ ['agentnum'], ],
6188       'foreign_keys' => [
6189                           { columns    => [ 'agentnum' ],
6190                             table      => 'agent',
6191                           },
6192                         ],
6193     },
6194
6195     'template_content' => {
6196       'columns' => [
6197         'contentnum', 'serial',     '',      '', '', '',
6198         'msgnum',        'int',     '',      '', '', '',
6199         'locale',    'varchar', 'NULL',      16, '', '',
6200         'subject',   'varchar', 'NULL',     512, '', '',
6201         'body',         'text', 'NULL',      '', '', '',
6202       ],
6203       'primary_key'  => 'contentnum',
6204       'unique'       => [ ['msgnum', 'locale'] ],
6205       'index'        => [ ],
6206       'foreign_keys' => [
6207                           { columns    => [ 'msgnum' ],
6208                             table      => 'msg_template',
6209                           },
6210                         ],
6211     },
6212
6213     'cust_msg' => {
6214       'columns' => [
6215         'custmsgnum', 'serial',     '',     '', '', '',
6216         'custnum',       'int', 'NULL',     '', '', '',
6217         'msgnum',        'int', 'NULL',     '', '', '',
6218         '_date',    @date_type,                 '', '',
6219         'env_from',  'varchar', 'NULL',    255, '', '',
6220         'env_to',    'varchar', 'NULL',    255, '', '',
6221         'header',       'blob', 'NULL',     '', '', '',
6222         'body',         'blob', 'NULL',     '', '', '',
6223         'error',     'varchar', 'NULL',    255, '', '',
6224         'status',    'varchar',     '',$char_d, '', '',
6225         'msgtype',   'varchar', 'NULL',     16, '', '',
6226       ],
6227       'primary_key'  => 'custmsgnum',
6228       'unique'       => [ ],
6229       'index'        => [ ['custnum'], ],
6230       'foreign_keys' => [
6231                           { columns    => [ 'custnum' ],
6232                             table      => 'cust_main',
6233                           },
6234                           { columns    => [ 'msgnum' ],
6235                             table      => 'msg_template',
6236                           },
6237                         ],
6238     },
6239
6240     'svc_cert' => {
6241       'columns' => [
6242         'svcnum',                'int',     '',      '', '', '', 
6243         'recnum',                'int', 'NULL',      '', '', '',
6244         'privatekey',           'text', 'NULL',      '', '', '',
6245         'csr',                  'text', 'NULL',      '', '', '',
6246         'certificate',          'text', 'NULL',      '', '', '',
6247         'cacert',               'text', 'NULL',      '', '', '',
6248         'common_name',       'varchar', 'NULL', $char_d, '', '',
6249         'organization',      'varchar', 'NULL', $char_d, '', '',
6250         'organization_unit', 'varchar', 'NULL', $char_d, '', '',
6251         'city',              'varchar', 'NULL', $char_d, '', '',
6252         'state',             'varchar', 'NULL', $char_d, '', '',
6253         'country',              'char', 'NULL',       2, '', '',
6254         'cert_contact',      'varchar', 'NULL', $char_d, '', '',
6255       ],
6256       'primary_key'  => 'svcnum',
6257       'unique'       => [],
6258       'index'        => [], #recnum
6259       'foreign_keys' => [
6260                           { columns    => [ 'svcnum' ],
6261                             table      => 'cust_svc',
6262                           },
6263                           { columns    => [ 'recnum' ],
6264                             table      => 'domain_record',
6265                           },
6266                         ],
6267     },
6268
6269     'svc_port' => {
6270       'columns' => [
6271         'svcnum',                'int',     '',      '', '', '', 
6272         'serviceid', 'varchar', '', 64, '', '', #srvexport / reportfields
6273       ],
6274       'primary_key'  => 'svcnum',
6275       'unique'       => [],
6276       'index'        => [], #recnum
6277       'foreign_keys' => [
6278                           { columns    => [ 'svcnum' ],
6279                             table      => 'cust_svc',
6280                           },
6281                         ],
6282     },
6283
6284     'areacode'  => {
6285       'columns' => [
6286         'areanum',   'serial',        '',      '', '', '',
6287         'code',        'char',        '',       3, '', '', 
6288         'country',     'char',    'NULL',       2, '', '',
6289         'state',       'char',    'NULL',       2, '', '', 
6290         'description','varchar',  'NULL',     255, '', '',
6291       ], 
6292       'primary_key' => 'areanum',
6293       'unique' => [ [ 'areanum' ] ],
6294       'index'  => [],
6295     },
6296
6297     'upgrade_journal' => {
6298       'columns' => [
6299         'upgradenum', 'serial', '', '', '', '',
6300         '_date', 'int', '', '', '', '',
6301         'upgrade', 'varchar', '', $char_d, '', '',
6302         'status', 'varchar', '', $char_d, '', '',
6303         'statustext', 'varchar', 'NULL', $char_d, '', '',
6304       ],
6305       'primary_key' => 'upgradenum',
6306       'unique' => [],
6307       'index' => [ [ 'upgrade' ] ],
6308     },
6309
6310     'upload_target' => {
6311       'columns' => [
6312         'targetnum', 'serial', '', '', '', '',
6313         'agentnum', 'int', 'NULL', '', '', '',
6314         'protocol', 'varchar', '', 10, '', '',
6315         'hostname', 'varchar', '', $char_d, '', '',
6316         'port', 'int', 'NULL', '', '', '',
6317         'username', 'varchar', '', $char_d, '', '',
6318         'password', 'varchar', 'NULL', $char_d, '', '',
6319         'path', 'varchar', 'NULL', $char_d, '', '',
6320         'subject', 'varchar', 'NULL', '255', '', '',
6321         'handling', 'varchar', 'NULL', $char_d, '', '',
6322       ],
6323       'primary_key'   => 'targetnum',
6324       'unique'        => [ [ 'targetnum' ] ],
6325       'index'         => [],
6326       'foreign_keys' => [
6327                           { columns    => [ 'agentnum' ],
6328                             table      => 'agent',
6329                           },
6330                         ],
6331     },
6332
6333     'log' => {
6334       'columns' => [
6335         'lognum',     'serial', '', '', '', '',
6336         '_date',      'int', '', '', '', '',
6337         'agentnum',   'int', 'NULL', '', '', '',
6338         'tablename',  'varchar', 'NULL', $char_d, '', '',
6339         'tablenum',   'int',  'NULL', '', '', '', 
6340         'level',      'int',  '', '', '', '',
6341         'message',    'text', '', '', '', '',
6342       ],
6343       'primary_key'  => 'lognum',
6344       'unique'       => [],
6345       'index'        => [ ['_date'], ['level'] ],
6346       'foreign_keys' => [
6347                           { columns    => [ 'agentnum' ],
6348                             table      => 'agent',
6349                           },
6350                         ],
6351     },
6352
6353     'log_context' => {
6354       'columns' => [
6355         'logcontextnum', 'serial', '', '', '', '',
6356         'lognum', 'int', '', '', '', '',
6357         'context', 'varchar', '', $char_d, '', '',
6358       ],
6359       'primary_key'  => 'logcontextnum',
6360       'unique'       => [ [ 'lognum', 'context' ] ],
6361       'index'        => [],
6362       'foreign_keys' => [
6363                           { columns    => [ 'lognum' ],
6364                             table      => 'log',
6365                           },
6366                         ],
6367     },
6368
6369     'svc_alarm' => {
6370       'columns' => [
6371 #       name               type        null   length   default local
6372         'svcnum',          'int',      '',    '',      '',     '', 
6373         'alarmsystemnum',  'int',      '',    '',      '',     '',
6374         'alarmtypenum',    'int',      '',    '',      '',     '',
6375         'alarmstationnum', 'int',      '',    '',      '',     '',
6376         'acctnum',         'varchar',  '',    $char_d, '',     '',
6377         '_password',       'varchar',  '',    $char_d, '',     '',
6378         'location',        'varchar', 'NULL', $char_d, '',     '',
6379         'cs_receiver',     'int',     'NULL', '',      '',     '',
6380         'cs_phonenum',     'varchar', 'NULL', $char_d, '',     '',
6381         'serialnum',       'varchar', 'NULL', $char_d, '',     '',
6382         #installer (rep)
6383       ],
6384       'primary_key'  => 'svcnum',
6385       'unique'       => [],
6386       'index'        => [],
6387       'foreign_keys' => [
6388                           { columns    => [ 'svcnum' ],
6389                             table      => 'cust_svc',
6390                           },
6391                           { columns    => [ 'alarmsystemnum' ],
6392                             table      => 'alarm_system',
6393                           },
6394                           { columns    => [ 'alarmtypenum' ],
6395                             table      => 'alarm_type',
6396                           },
6397                           { columns    => [ 'alarmstationnum' ],
6398                             table      => 'alarm_station',
6399                           },
6400                         ],
6401     },
6402
6403     'alarm_system' => { #vendors
6404       'columns' => [
6405         'alarmsystemnum',  'serial',     '',      '', '', '',
6406         'agentnum',           'int', 'NULL',      '', '', '',
6407         'systemname',     'varchar',     '', $char_d, '', '',
6408         'disabled',          'char', 'NULL',       1, '', '', 
6409       ],
6410       'primary_key' => 'alarmsystemnum',
6411       'unique'      => [ ['agentnum', 'systemname'] ],
6412       'index'       => [ ['agentnum'], ['disabled'] ],
6413       'foreign_keys' => [
6414                           { columns    => [ 'agentnum' ],
6415                             table      => 'agent',
6416                           },
6417                         ],
6418     },
6419
6420     'alarm_type' => { #inputs and outputs
6421       'columns' => [
6422         'alarmtypenum', 'serial',     '',      '', '', '',
6423         'agentnum',        'int', 'NULL',      '', '', '',
6424         'inputs',          'int',     '', '', '', '',
6425         'outputs',         'int',     '', '', '', '',
6426         'disabled',       'char', 'NULL',       1, '', '', 
6427       ],
6428       'primary_key' => 'alarmtypenum',
6429       'unique'      => [ ['agentnum', 'inputs', 'outputs'] ],
6430       'index'       => [ ['agentnum'], ['disabled'] ],
6431       'foreign_keys' => [
6432                           { columns    => [ 'agentnum' ],
6433                             table      => 'agent',
6434                           },
6435                         ],
6436     },
6437
6438     'alarm_station' => { #central station (where the alarm reports to)
6439       'columns' => [
6440         'alarmstationnum', 'serial',     '',      '', '', '',
6441         'agentnum',           'int', 'NULL',      '', '', '',
6442         'stationname',    'varchar',     '', $char_d, '', '',
6443         'disabled',          'char', 'NULL',       1, '', '', 
6444       ],
6445       'primary_key' => 'alarmstationnum',
6446       'unique'      => [ ['agentnum', 'stationname'], ],
6447       'index'       => [ ['agentnum'], ['disabled'] ],
6448       'foreign_keys' => [
6449                           { columns    => [ 'agentnum' ],
6450                             table      => 'agent',
6451                           },
6452                         ],
6453     },
6454
6455     'svc_cable' => {
6456       'columns' => [
6457         'svcnum',        'int',     '',      '', '', '', 
6458         'providernum',   'int', 'NULL',      '', '', '',
6459         'ordernum',  'varchar', 'NULL', $char_d, '', '',
6460         'modelnum',      'int', 'NULL',      '', '', '',
6461         'serialnum', 'varchar', 'NULL', $char_d, '', '',
6462         'mac_addr',  'varchar', 'NULL',      12, '', '', 
6463       ],
6464       'primary_key'  => 'svcnum',
6465       'unique'       => [ ['serialnum'] , ['mac_addr'] ],
6466       'index'        => [],
6467       'foreign_keys' => [
6468                           { columns    => [ 'svcnum' ],
6469                             table      => 'cust_svc',
6470                           },
6471                           { columns    => [ 'providernum' ],
6472                             table      => 'cable_provider',
6473                           },
6474                           { columns    => [ 'modelnum' ],
6475                             table      => 'cable_model',
6476                           },
6477                         ],
6478     },
6479
6480     'cable_model' => {
6481       'columns' => [
6482         'modelnum',    'serial',     '',      '', '', '',
6483         'model_name', 'varchar',     '', $char_d, '', '',
6484         'disabled',      'char', 'NULL',       1, '', '', 
6485       ],
6486       'primary_key' => 'modelnum',
6487       'unique' => [ [ 'model_name' ], ],
6488       'index'  => [],
6489     },
6490
6491     'cable_provider' => {
6492       'columns' => [
6493         'providernum', 'serial',     '',      '', '', '',
6494         'provider',   'varchar',     '', $char_d, '', '',
6495         'disabled',      'char', 'NULL',       1, '', '', 
6496       ],
6497       'primary_key' => 'providernum',
6498       'unique' => [ [ 'provider' ], ],
6499       'index'  => [],
6500     },
6501
6502     'svc_conferencing' => {
6503       'columns' => [
6504         'svcnum',            'int',     '',      '', '', '',
6505         'conf_id',           'int', 'NULL',      '', '', '', #"system assigned"
6506         'conf_name',     'varchar',     '', $char_d, '', '',
6507         'conf_password', 'varchar',     '', $char_d, '', '',
6508         'access_code',   'varchar',     '',      16, '', '',
6509         'duration',          'int',     '',      '', '', '',
6510         'participants',      'int',     '',      '', '', '',
6511         'conftypenum',       'int',     '',      '', '', '',
6512         'confqualitynum',    'int',     '',      '', '', '',
6513         'opt_recording',    'char', 'NULL',       1, '', '',
6514         'opt_sip',          'char', 'NULL',       1, '', '',
6515         'opt_phone',        'char', 'NULL',       1, '', '',
6516       ],
6517       'primary_key' => 'svcnum',
6518       'unique' => [],
6519       'index'  => [],
6520       'foreign_keys' => [
6521                           { columns => [ 'svcnum' ],
6522                             table   => 'cust_svc',
6523                           },
6524                           { columns => [ 'conftypenum' ],
6525                             table   => 'conferencing_type',
6526                           },
6527                           { columns => [ 'confqualitynum' ],
6528                             table   => 'conferencing_quality',
6529                           },
6530                         ],
6531     },
6532
6533     'conferencing_type' => {
6534       'columns' => [
6535         'conftypenum',  'int',     '',      '', '', '',
6536         'typeid'      , 'int',     '',      '', '', '',
6537         'typename', 'varchar',     '', $char_d, '', '',
6538         'disabled',    'char', 'NULL',       1, '', '', 
6539       ],
6540       'primary_key' => 'conftypenum',
6541       'unique'      => [ [ 'typeid', 'disabled' ], [ 'typename', 'disabled' ] ],
6542       'index'       => [],
6543     },
6544
6545     'conferencing_quality' => {
6546       'columns' => [
6547         'confqualitynum',  'int',     '',      '', '', '',
6548         'qualityid'      , 'int',     '',      '', '', '',
6549         'qualityname', 'varchar',     '', $char_d, '', '',
6550         'disabled',       'char', 'NULL',       1, '', '', 
6551       ],
6552       'primary_key' => 'confqualitynum',
6553       'unique'      => [ [ 'qualityid', 'disabled' ], [ 'qualityname', 'disabled' ] ],
6554       'index'       => [],
6555     },
6556
6557     'svc_video' => {
6558       'columns' => [
6559         'svcnum',            'int', '', '', '', '',
6560         'smartcard_num', 'varchar', '', 16, '', '',
6561         'mac_addr',      'varchar', '', 12, '', '', 
6562         'duration',          'int', '', '', '', '',
6563       ],
6564       'primary_key' => 'svcnum',
6565       'unique' => [], # [ 'smartcard_num' ], [ 'mac_addr' ], ],
6566       'index'  => [],
6567       'foreign_keys' => [
6568                           { columns => [ 'svcnum' ],
6569                             table   => 'cust_svc',
6570                           },
6571                         ],
6572     },
6573
6574     'circuit_type' => {
6575       'columns' => [
6576         'typenum',     'serial',     '',      '', '', '',
6577         'typename',   'varchar',     '', $char_d, '', '',
6578         'disabled',      'char', 'NULL',       1, '', '',
6579         # speed? number of voice lines? anything else?
6580       ],
6581       'primary_key' => 'typenum',
6582       'unique' => [ [ 'typename' ] ],
6583       'index'  => [],
6584     },
6585
6586     'circuit_provider' => {
6587       'columns' => [
6588         'providernum', 'serial',     '',      '', '', '',
6589         'provider',   'varchar',     '', $char_d, '', '',
6590         'disabled',      'char', 'NULL',       1, '', '', 
6591       ],
6592       'primary_key' => 'providernum',
6593       'unique' => [ [ 'provider' ], ],
6594       'index'  => [],
6595     },
6596
6597     'circuit_termination' => {
6598       'columns' => [
6599         'termnum',     'serial',     '',      '', '', '',
6600         'termination','varchar',     '', $char_d, '', '',
6601         'disabled',      'char', 'NULL',       1, '', '',
6602       ],
6603       'primary_key' => 'termnum',
6604       'unique' => [ [ 'termination' ] ],
6605       'index' => [],
6606     },
6607
6608     'svc_circuit' => {
6609       'columns' => [
6610         'svcnum',                   'int',     '', '', '', '',
6611         'typenum',                  'int',     '', '', '', '',
6612         'providernum',              'int',     '', '', '', '',
6613         'termnum',                  'int',     '', '', '', '',
6614         'circuit_id',           'varchar',     '', 64, '', '',
6615         'desired_due_date',         'int', 'NULL', '', '', '',
6616         'due_date',                 'int', 'NULL', '', '', '',
6617         'vendor_order_id',      'varchar', 'NULL', $char_d,  '', '',
6618         'vendor_qual_id',       'varchar', 'NULL', $char_d,  '', '',
6619         'vendor_order_type',    'varchar', 'NULL', $char_d,  '', '',
6620         'vendor_order_status',  'varchar', 'NULL', $char_d,  '', '',
6621         'endpoint_ip_addr',     'varchar', 'NULL', 40, '', '',
6622         'endpoint_mac_addr',    'varchar', 'NULL', 12, '', '',
6623       ],
6624       'primary_key' => 'svcnum',
6625       'unique'      => [],
6626       'index'       => [ [ 'providernum' ], [ 'typenum' ] ],
6627       'foreign_keys' => [
6628                           { columns => [ 'svcnum' ],
6629                             table   => 'cust_svc',
6630                           },
6631                           { columns => [ 'typenum' ],
6632                             table   => 'circuit_type',
6633                           },
6634                           { columns => [ 'providernum' ],
6635                             table   => 'circuit_provider',
6636                           },
6637                           { columns => [ 'termnum' ],
6638                             table   => 'circuit_termination',
6639                           },
6640       ],
6641     },
6642
6643     'vend_main' => {
6644       'columns' => [
6645         'vendnum',   'serial',     '',      '', '', '',
6646         'vendname', 'varchar',     '', $char_d, '', '',
6647         'classnum',     'int',     '',      '', '', '',
6648         'disabled',    'char', 'NULL',       1, '', '', 
6649       ],
6650       'primary_key'  => 'vendnum',
6651       'unique'       => [ ['vendname', 'disabled'] ],
6652       'index'        => [],
6653       'foreign_keys' => [
6654                           { columns    => [ 'classnum' ],
6655                             table      => 'vend_class',
6656                           },
6657                         ],
6658     },
6659
6660     'vend_class' => {
6661       'columns' => [
6662         'classnum',     'serial',     '',      '', '', '', 
6663         'classname',   'varchar',     '', $char_d, '', '', 
6664         'disabled',       'char', 'NULL',       1, '', '', 
6665       ],
6666       'primary_key' => 'classnum',
6667       'unique'      => [],
6668       'index'       => [ ['disabled'] ],
6669     },
6670
6671     'vend_bill' => {
6672       'columns' => [
6673         'vendbillnum',    'serial',     '',      '', '', '', 
6674         'vendnum',           'int',     '',      '', '', '', 
6675         #'_date',        @date_type,                  '', '', 
6676         '_date',     'int', '', '',                   '', '', 
6677         'charged',     @money_type,                  '', '', 
6678       ],
6679       'primary_key'  => 'vendbillnum',
6680       'unique'       => [],
6681       'index'        => [ ['vendnum'], ['_date'], ],
6682       'foreign_keys' => [
6683                           { columns    => [ 'vendnum' ],
6684                             table      => 'vend_main',
6685                           },
6686                         ],
6687     },
6688
6689     'vend_pay' => {
6690       'columns' => [
6691         'vendpaynum',   'serial',    '',       '', '', '',
6692         'vendnum',         'int',    '',       '', '', '', 
6693         #'_date',     @date_type,                   '', '', 
6694         '_date',     'int', '', '',                   '', '', 
6695         'paid',      @money_type,                  '', '', 
6696       ],
6697       'primary_key'  => 'vendpaynum',
6698       'unique'       => [],
6699       'index'        => [ [ 'vendnum' ], [ '_date' ], ],
6700       'foreign_keys' => [
6701                           { columns    => [ 'vendnum' ],
6702                             table      => 'vend_main',
6703                           },
6704                         ],
6705     },
6706
6707     'vend_bill_pay' => {
6708       'columns' => [
6709         'vendbillpaynum', 'serial',     '',   '', '', '', 
6710         'vendbillnum',       'int',     '',   '', '', '', 
6711         'vendpaynum',        'int',     '',   '', '', '', 
6712         'amount',  @money_type, '', '', 
6713         #? '_date',   @date_type, '', '', 
6714       ],
6715       'primary_key'  => 'vendbillpaynum',
6716       'unique'       => [],
6717       'index'        => [ [ 'vendbillnum' ], [ 'vendpaynum' ] ],
6718       'foreign_keys' => [
6719                           { columns    => [ 'vendbillnum' ],
6720                             table      => 'vend_bill',
6721                           },
6722                           { columns    => [ 'vendpaynum' ],
6723                             table      => 'vend_pay',
6724                           },
6725                         ],
6726     },
6727
6728     %{ tables_hashref_torrus() },
6729
6730     # tables of ours for doing torrus virtual port combining
6731     'torrus_srvderive' => {
6732       'columns' => [
6733         'derivenum',     'serial',     '', '', '', '',
6734         'serviceid',    'varchar',     '', 64, '', '', #srvexport / reportfields
6735         'last_srv_date',   'date', 'NULL', '', '', '',
6736       ],
6737       'primary_key' => 'derivenum',
6738       'unique' => [ ['serviceid'] ],
6739       'index'  => [],
6740     },
6741
6742     'torrus_srvderive_component' => {
6743       'columns' => [
6744         'componentnum', 'serial', '', '', '', '',
6745         'derivenum',       'int', '', '', '', '',
6746         'serviceid',   'varchar', '', 64, '', '', #srvexport / reportfields
6747       ],
6748       'primary_key'  => 'componentnum',
6749       'unique'       => [ [ 'derivenum', 'serviceid' ], ],
6750       'index'        => [ [ 'derivenum', ], ],
6751       'foreign_keys' => [
6752                           { columns    => [ 'derivenum' ],
6753                             table      => 'torrus_srvderive',
6754                           },
6755                         ],
6756     },
6757
6758     'invoice_mode' => {
6759       'columns' => [
6760         'modenum',      'serial', '', '', '', '',
6761         'agentnum',        'int', 'NULL', '', '', '',
6762         'modename',    'varchar', '', 32, '', '',
6763       ],
6764       'primary_key' => 'modenum',
6765       'unique'      => [ ],
6766       'index'       => [ ],
6767       'foreign_keys' => [
6768                           { columns    => [ 'agentnum' ],
6769                             table      => 'agent',
6770                           },
6771                         ],
6772     },
6773
6774     'invoice_conf' => {
6775       'columns' => [
6776         'confnum',              'serial',   '', '', '', '',
6777         'modenum',              'int',      '', '', '', '',
6778         'locale',               'varchar',  'NULL', 16, '', '',
6779         'notice_name',          'varchar',  'NULL', 64, '', '',
6780         'subject',              'varchar',  'NULL', 64, '', '',
6781         'htmlnotes',            'text',     'NULL', '', '', '',
6782         'htmlfooter',           'text',     'NULL', '', '', '',
6783         'htmlsummary',          'text',     'NULL', '', '', '',
6784         'htmlreturnaddress',    'text',     'NULL', '', '', '',
6785         'latexnotes',           'text',     'NULL', '', '', '',
6786         'latexfooter',          'text',     'NULL', '', '', '',
6787         'latexsummary',         'text',     'NULL', '', '', '',
6788         'latexsmallfooter',     'text',     'NULL', '', '', '',
6789         'latexreturnaddress',   'text',     'NULL', '', '', '',
6790         'with_latexcoupon',     'char',     'NULL', '1', '', '',
6791         'lpr',                  'varchar',  'NULL', $char_d, '', '',
6792       ],
6793       'primary_key'  => 'confnum',
6794       'unique'       => [ [ 'modenum', 'locale' ] ],
6795       'index'        => [ ],
6796       'foreign_keys' => [
6797                           { columns    => [ 'modenum' ],
6798                             table      => 'invoice_mode',
6799                           },
6800                         ],
6801     },
6802
6803     'export_batch' => {
6804       'columns' => [
6805         'batchnum',    'serial',     '',      '', '', '',
6806         'exportnum',      'int',     '',      '', '', '',
6807         '_date',          'int',     '',      '', '', '',
6808         'status',     'varchar', 'NULL',      32, '', '',
6809         'statustext',    'text', 'NULL',      '', '', '',
6810       ],
6811       'primary_key'  => 'batchnum',
6812       'unique'       => [],
6813       'index'        => [ [ 'exportnum' ], [ 'status' ] ],
6814       'foreign_keys' => [
6815                           { columns    => [ 'exportnum' ],
6816                             table      => 'part_export',
6817                             references => [ 'exportnum' ]
6818                           },
6819                         ],
6820     },
6821
6822     'export_batch_item' => {
6823       'columns' => [
6824         'itemnum',     'serial',     '',      '', '', '',
6825         'batchnum',       'int',     '',      '', '', '',
6826         'svcnum',         'int',     '',      '', '', '',
6827         'action',     'varchar',     '',      32, '', '',
6828         'data',          'text', 'NULL',      '', '', '',
6829         'frozen',        'char', 'NULL',       1, '', '',
6830       ],
6831       'primary_key'  => 'itemnum',
6832       'unique'       => [],
6833       'index'        => [ [ 'batchnum' ], [ 'svcnum' ] ],
6834       'foreign_keys' => [
6835                           { columns    => [ 'batchnum' ],
6836                             table      => 'export_batch',
6837                             references => [ 'batchnum' ]
6838                           },
6839                         ],
6840     },
6841
6842     # lookup table for states, similar to msa and lata
6843     'state' => {
6844       'columns' => [
6845         'statenum', 'int',  '', '', '', '', 
6846         'country',  'char', '',  2, '', '',
6847         'state',    'char', '', $char_d, '', '', 
6848         'fips',     'char', '',  3, '', '',
6849       ],
6850       'primary_key' => 'statenum',
6851       'unique' => [ [ 'country', 'state' ], ],
6852       'index' => [],
6853     },
6854
6855     # eventually link to tower/sector?
6856     'deploy_zone' => {
6857       'columns' => [
6858         'zonenum',        'serial',  '',     '',      '', '',
6859         'description',    'char',    'NULL', $char_d, '', '',
6860         'agentnum',       'int',     '',     '',      '', '',
6861         'dbaname',        'char',    'NULL', $char_d, '', '',
6862         'zonetype',       'char',    '',     1,       '', '',
6863         'technology',     'int',     '',     '',      '', '',
6864         'spectrum',       'int',     'NULL', '',      '', '',
6865         'adv_speed_up',   'decimal', '',     '10,3', '0', '',
6866         'adv_speed_down', 'decimal', '',     '10,3', '0', '',
6867         'cir_speed_up',   'decimal', '',     '10,3', '0', '',
6868         'cir_speed_down', 'decimal', '',     '10,3', '0', '',
6869         'is_broadband',   'char',    'NULL', 1,       '', '',
6870         'is_voice',       'char',    'NULL', 1,       '', '',
6871         'is_consumer',    'char',    'NULL', 1,       '', '',
6872         'is_business',    'char',    'NULL', 1,       '', '',
6873         'active_date',    @date_type,                 '', '',
6874         'expire_date',    @date_type,                 '', '',
6875       ],
6876       'primary_key' => 'zonenum',
6877       'unique' => [],
6878       'index'  => [ [ 'agentnum' ] ],
6879       'foreign_keys' => [
6880                           { columns     => [ 'agentnum' ],
6881                             table       => 'agent',
6882                             references  => [ 'agentnum' ],
6883                           },
6884                         ],
6885     },
6886
6887     'deploy_zone_block' => {
6888       'columns' => [
6889         'blocknum',       'serial',  '',     '',      '', '',
6890         'zonenum',        'int',     '',     '',      '', '',
6891         'censusblock',    'char',    '',     15,      '', '',
6892         'censusyear',     'char',    '',      4,      '', '',
6893       ],
6894       'primary_key' => 'blocknum',
6895       'unique' => [],
6896       'index'  => [ [ 'zonenum' ] ],
6897       'foreign_keys' => [
6898                           { columns     => [ 'zonenum' ],
6899                             table       => 'deploy_zone',
6900                             references  => [ 'zonenum' ],
6901                           },
6902                         ],
6903     },
6904
6905     'deploy_zone_vertex' => {
6906       'columns' => [
6907         'vertexnum',      'serial',  '',     '',      '', '',
6908         'zonenum',        'int',     '',     '',      '', '',
6909         'latitude',       'decimal', '',     '10,7',  '', '', 
6910         'longitude',      'decimal', '',     '10,7',  '', '', 
6911       ],
6912       'primary_key' => 'vertexnum',
6913       'unique' => [ ],
6914       'index'  => [ ],
6915       'foreign_keys' => [
6916                           { columns     => [ 'zonenum' ],
6917                             table       => 'deploy_zone',
6918                             references  => [ 'zonenum' ],
6919                           },
6920                         ],
6921     },
6922
6923
6924
6925
6926
6927     # name type nullability length default local
6928
6929     #'new_table' => {
6930     #  'columns' => [
6931     #    'num', 'serial',       '', '', '', '',
6932     #  ],
6933     #  'primary_key' => 'num',
6934     #  'unique' => [],
6935     #  'index'  => [],
6936     #},
6937
6938   };
6939
6940 }
6941
6942 =back
6943
6944 =head1 BUGS
6945
6946 =head1 SEE ALSO
6947
6948 L<DBIx::DBSchema>
6949
6950 =cut
6951
6952 1;
6953