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