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