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