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