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