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