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