Ticket 8137 Broadsoft accountcode support
[freeside.git] / FS / FS / Schema.pm
1 package FS::Schema;
2
3 use vars qw(@ISA @EXPORT_OK $DEBUG $setup_hack %dbdef_cache);
4 use subs qw(reload_dbdef);
5 use Exporter;
6 use DBIx::DBSchema 0.44; #for foreign keys with MATCH / ON DELETE/UPDATE
7 use DBIx::DBSchema::Table;
8 use DBIx::DBSchema::Column;
9 use DBIx::DBSchema::Index;
10 use DBIx::DBSchema::ForeignKey;
11 #can't use this yet, dependency bs #use FS::Conf;
12
13 @ISA = qw(Exporter);
14 @EXPORT_OK = qw( dbdef dbdef_dist reload_dbdef );
15
16 $DEBUG = 0;
17 $me = '[FS::Schema]';
18
19 =head1 NAME
20
21 FS::Schema - Freeside database schema
22
23 =head1 SYNOPSYS
24
25     use FS::Schema qw(dbdef dbdef_dist reload_dbdef);
26
27     $dbdef = reload_dbdef;
28     $dbdef = reload_dbdef "/non/standard/filename";
29     $dbdef = dbdef;
30     $dbdef_dist = dbdef_dist;
31
32 =head1 DESCRIPTION
33
34 This class represents the database schema.
35
36 =head1 METHODS
37
38 =over 4
39
40 =item reload_dbdef([FILENAME])
41
42 Load a database definition (see L<DBIx::DBSchema>), optionally from a
43 non-default filename.  This command is executed at startup unless
44 I<$FS::Schema::setup_hack> is true.  Returns a DBIx::DBSchema object.
45
46 =cut
47
48 sub reload_dbdef {
49   my $file = shift;
50
51   unless ( exists $dbdef_cache{$file} ) {
52     warn "[debug]$me loading dbdef for $file\n" if $DEBUG;
53     $dbdef_cache{$file} = DBIx::DBSchema->load( $file )
54       or die "can't load database schema from $file: $DBIx::DBSchema::errstr\n";
55   } else {
56     warn "[debug]$me re-using cached dbdef for $file\n" if $DEBUG;
57   }
58   $dbdef = $dbdef_cache{$file};
59 }
60
61 =item dbdef
62
63 Returns the current database definition (represents the current database,
64 assuming it is up-to-date).  See L<DBIx::DBSchema>.
65
66 =cut
67
68 sub dbdef { $dbdef; }
69
70 =item dbdef_dist [ DATASRC ]
71
72 Returns the current canoical database definition as defined in this file.
73
74 Optionally, pass a DBI data source to enable syntax specific to that database.
75 Currently, this enables "ENGINE=InnoDB" for MySQL databases.
76
77 =cut
78
79 sub dbdef_dist {
80   my $datasrc = @_ && !ref($_[0]) ? shift : '';
81   my $opt = @_ ? shift : {};
82   
83   my $local_options = '';
84   if ( $datasrc =~ /^dbi:mysql/i ) {
85     $local_options = 'ENGINE=InnoDB';
86   }
87
88   ###
89   # create a dbdef object from the old data structure
90   ###
91
92   my $tables_hashref = tables_hashref();
93
94   #turn it into objects
95   my $dbdef = new DBIx::DBSchema map {  
96
97     my $tablename = $_;
98     my $indexnum = 1;
99
100     my @columns;
101     while (@{$tables_hashref->{$tablename}{'columns'}}) {
102       #my($name, $type, $null, $length, $default, $local) =
103       my @coldef = 
104         splice @{$tables_hashref->{$tablename}{'columns'}}, 0, 6;
105       my %hash = map { $_ => shift @coldef }
106                      qw( name type null length default local );
107
108       #can be removed once we depend on DBIx::DBSchema 0.39;
109       $hash{'type'} = 'LONGTEXT'
110         if $hash{'type'} =~ /^TEXT$/i && $datasrc =~ /^dbi:mysql/i;
111
112       unless ( defined $hash{'default'} ) {
113         warn "$tablename:\n".
114              join('', map "$_ => $hash{$_}\n", keys %hash) ;# $stop = <STDIN>;
115       }
116
117       push @columns, new DBIx::DBSchema::Column ( \%hash );
118     }
119
120     #false laziness w/sub indices in DBIx::DBSchema::DBD (well, sorta)
121     #and sub sql_create_table in DBIx::DBSchema::Table (slighty more?)
122     my $unique = $tables_hashref->{$tablename}{'unique'};
123     warn "missing index for $tablename\n" unless defined $tables_hashref->{$tablename}{'index'};
124     my @index  = @{ $tables_hashref->{$tablename}{'index'} };
125
126     # kludge to avoid avoid "BLOB/TEXT column 'statustext' used in key
127     #  specification without a key length".
128     # better solution: teach DBIx::DBSchema to specify a default length for
129     #  MySQL indices on text columns, or just to support an index length at all
130     #  so we can pass something in.
131     # best solution: eliminate need for this index in cust_main::retry_realtime
132     @index = grep { @{$_}[0] ne 'statustext' } @index
133       if $datasrc =~ /^dbi:mysql/i;
134
135     my @indices = ();
136     push @indices, map {
137                          DBIx::DBSchema::Index->new({
138                            'name'    => $tablename. $indexnum++,
139                            'unique'  => 1,
140                            'columns' => $_,
141                          });
142                        }
143                        @$unique;
144     push @indices, map {
145                          DBIx::DBSchema::Index->new({
146                            'name'    => $tablename. $indexnum++,
147                            'unique'  => 0,
148                            'columns' => $_,
149                          });
150                        }
151                        @index;
152
153     my @foreign_keys =
154       map DBIx::DBSchema::ForeignKey->new($_),
155         @{ $tables_hashref->{$tablename}{'foreign_keys'} || [] };
156
157     DBIx::DBSchema::Table->new({
158       name          => $tablename,
159       primary_key   => $tables_hashref->{$tablename}{'primary_key'},
160       columns       => \@columns,
161       indices       => \@indices,
162       foreign_keys  => \@foreign_keys,
163       local_options => $local_options,
164     });
165
166   } keys %$tables_hashref;
167
168   if ( $DEBUG ) {
169     warn "[debug]$me initial dbdef_dist created ($dbdef) with tables:\n";
170     warn "[debug]$me   $_\n" foreach $dbdef->tables;
171   }
172   
173   #add radius attributes to svc_acct
174   #
175   #my($svc_acct)=$dbdef->table('svc_acct');
176   # 
177   #my($attribute);
178   #foreach $attribute (@attributes) {
179   #  $svc_acct->addcolumn ( new DBIx::DBSchema::Column (
180   #    'radius_'. $attribute,
181   #    'varchar',
182   #    'NULL',
183   #    $char_d,
184   #  ));
185   #}
186   # 
187   #foreach $attribute (@check_attributes) {
188   #  $svc_acct->addcolumn( new DBIx::DBSchema::Column (
189   #    'rc_'. $attribute,
190   #    'varchar',
191   #    'NULL',
192   #    $char_d,
193   #  ));
194   #}
195
196   my $tables_hashref_torrus = tables_hashref_torrus();
197
198   #create history tables
199   foreach my $table (
200     grep {    ! /^(clientapi|access_user)_session/
201            && ! /^h_/
202            && ! /^log(_context)?$/
203            && ( ! /^queue(_arg|_depend|_stat)?$/ || ! $opt->{'queue-no_history'} )
204            && ! $tables_hashref_torrus->{$_}
205          }
206       $dbdef->tables
207   ) {
208     my $tableobj = $dbdef->table($table)
209       or die "unknown table $table";
210
211     my %h_indices = ();
212
213     unless ( $table eq 'cust_event' || $table eq 'cdr' ) { #others?
214
215       my %indices = $tableobj->indices;
216     
217       %h_indices = map { 
218                          ( "h_$_" =>
219                              DBIx::DBSchema::Index->new({
220                                'name'    => 'h_'. $indices{$_}->name,
221                                'unique'  => 0,
222                                'columns' => [ @{$indices{$_}->columns} ],
223                              })
224                          );
225                        }
226                        keys %indices;
227
228       $h_indices{"h_${table}_srckey"} =
229         DBIx::DBSchema::Index->new({
230           'name'    => "h_${table}_srckey",
231           'unique'  => 0,
232           'columns' => [ 'history_action', #right?
233                          $tableobj->primary_key,
234                        ],
235         });
236
237       $h_indices{"h_${table}_srckey2"} =
238          DBIx::DBSchema::Index->new({
239            'name'    => "h_${table}_srckey2",
240            'unique'  => 0,
241            'columns' => [ 'history_date',
242                           $tableobj->primary_key,
243                         ],
244          });
245
246         #necessary for queries that want to look at *who* made changes
247       $h_indices{"h_${table}_usernum"} =
248          DBIx::DBSchema::Index->new({
249            'name'    => "h_${table}_usernum",
250            'unique'  => 0,
251            'columns' => [ 'history_usernum'],
252          });
253
254         # necessary because of the evil OR username for older data, be really nice if everything was just migrated to usernum and we could drop username
255         # This will not be helpful to mysql, but postgres smartly does a bitmap across both indexes, mysql will just use one
256
257       $h_indices{"h_${table}_user"} =
258          DBIx::DBSchema::Index->new({
259            'name'    => "h_${table}_user",
260            'unique'  => 0,
261            'columns' => [ 'history_user'],
262          });
263     }
264
265     my $primary_key_col = $tableobj->column($tableobj->primary_key)
266       or die "$table: primary key declared as ". $tableobj->primary_key.
267              ", but no column of that name\n";
268
269     my $historynum_type = ( $tableobj->column($tableobj->primary_key)->type
270                               =~ /^(bigserial|bigint|int8)$/i
271                                 ? 'bigserial'
272                                 : 'serial'
273                           );
274
275     my $h_tableobj = DBIx::DBSchema::Table->new( {
276       'name'          => "h_$table",
277       'primary_key'   => 'historynum',
278       'indices'       => \%h_indices,
279       'local_options' => $local_options,
280       'columns'       => [
281           DBIx::DBSchema::Column->new( {
282             'name'    => 'historynum',
283             'type'    => $historynum_type,
284             'null'    => 'NOT NULL',
285             'length'  => '',
286             'default' => '',
287             'local'   => '',
288           } ),
289           DBIx::DBSchema::Column->new( {
290             'name'    => 'history_date',
291             'type'    => 'int',
292             'null'    => 'NULL',
293             'length'  => '',
294             'default' => '',
295             'local'   => '',
296           } ),
297           DBIx::DBSchema::Column->new( {
298             'name'    => 'history_user',
299             'type'    => 'varchar',
300             'null'    => 'NULL',
301             'length'  => '80',
302             'default' => '',
303             'local'   => '',
304           } ),
305           DBIx::DBSchema::Column->new( {
306             'name'    => 'history_usernum',
307             'type'    => 'int',
308             'null'    => 'NULL',
309             'length'  => '',
310             'default' => '',
311             'local'   => '',
312           } ),
313           DBIx::DBSchema::Column->new( {
314             'name'    => 'history_action',
315             'type'    => 'varchar',
316             'null'    => 'NOT NULL',
317             'length'  => '80',
318             'default' => '',
319             'local'   => '',
320           } ),
321           map {
322             my $column = $tableobj->column($_);
323     
324             #clone so as to not disturb the original
325             $column = DBIx::DBSchema::Column->new( {
326               map { $_ => $column->$_() }
327                 qw( name type null length default local )
328             } );
329     
330             if ( $column->type =~ /^(\w*)SERIAL$/i ) {
331               $column->type(uc($1).'INT');
332               $column->null('NULL');
333             }
334             #$column->default('')
335             #  if $column->default =~ /^nextval\(/i;
336             #( my $local = $column->local ) =~ s/AUTO_INCREMENT//i;
337             #$column->local($local);
338             $column;
339           } $tableobj->columns
340       ],
341     } );
342     $dbdef->addtable($h_tableobj);
343   }
344
345   if ( $datasrc =~ /^dbi:mysql/i ) {
346
347     my $dup_lock_table = DBIx::DBSchema::Table->new( {
348       'name'          => 'duplicate_lock',
349       'primary_key'   => 'duplocknum',
350       'local_options' => $local_options,
351       'columns'       => [
352         DBIx::DBSchema::Column->new( {
353           'name'    => 'duplocknum',
354           'type'    => 'serial',
355           'null'    => 'NOT NULL',
356           'length'  => '',
357           'default' => '',
358           'local'   => '',
359         } ),
360         DBIx::DBSchema::Column->new( {
361           'name'    => 'lockname',
362           'type'    => 'varchar',
363           'null'    => 'NOT NULL',
364           'length'  => '80',
365           'default' => '',
366           'local'   => '',
367         } ),
368       ],
369       'indices' => { 'duplicate_lock1' =>
370                        DBIx::DBSchema::Index->new({
371                          'name'    => 'duplicate_lock1',
372                          'unique'  => 1,
373                          'columns' => [ 'lockname' ],
374                        })
375                    },
376     } );
377
378     $dbdef->addtable($dup_lock_table);
379
380   }
381
382   $dbdef;
383
384 }
385
386 #torrus tables http://torrus.org/reporting_setup.pod.html#create_sql_tables
387 sub tables_hashref_torrus {
388
389   return {
390
391     # Collector export table. It usually grows at several megabytes
392     # per month, and is updated every 5 minutes
393     'srvexport' => {
394       'columns' => [
395         'id',         'serial', '', '', '', '',
396         'srv_date',     'date', '', '', '', '',#date and time of the data sample
397         'srv_time',     'time', '', '', '', '',
398         'serviceid', 'varchar', '', 64, '', '',#unique service ID per counter
399         'value',     'double precision', '', '', '', '',#collected rate or gauge value
400         'intvl', 'int', '', '', '', '', # collection interval - for counter volume calculation
401       ],
402       'primary_key' => 'id',
403       'unique' => [],
404       'index'  => [ ['srv_date'], ['srv_date', 'srv_time'], ['serviceid'], ],
405     },
406
407     #Tables for (currently monthly only) report contents.
408     #These are updated usually once per month, and read at the moment of
409     #rendering the report output (HTML now, PDF or XML or Excel or whatever
410     #in the future)
411
412     #DBIx::Sequence backend, theplatform-independent inplementation
413     #of sequences
414     'dbix_sequence_state' => {
415       'columns' => [
416         'id',       'serial', '', '', '', '',
417         'dataset', 'varchar', '', 50, '', '',
418         'state_id',    'int', '', '', '', '',
419       ],
420       'primary_key' => 'id',
421       #CONSTRAINT pk_dbix_sequence PRIMARY KEY (dataset, state_id)
422       'unique' => [ [ 'dataset', 'state_id' ], ],
423       'index'  => [],
424     },
425
426     'dbix_sequence_release' => {
427       'columns' => [
428         'id',       'serial', '', '', '', '',
429         'dataset', 'varchar', '', 50, '', '',
430         'released_id', 'int', '', '', '', '',
431       ],
432       'primary_key' => 'id',
433       #CONSTRAINT pk_dbi_release PRIMARY KEY (dataset, released_id)
434       'unique' => [ [ 'dataset', 'released_id', ] ],
435       'index'  => [],
436     },
437
438     #Each report is characterized by name, date and time.
439     #Monthly reports are automatically assigned 00:00 of the 1st day
440     #in the month. The report contains fields for every service ID
441     #defined across all datasource trees.
442     'reports' => {
443       'columns' => [
444         'id',          'serial', '', '', '', '',
445         'rep_date',      'date', '', '', '', '',#Start date of the report
446         'rep_time',      'time', '', '', '', '',#Start time of the report
447         'reportname', 'varchar', '', 64, '', '',#Report name, such as
448                                                 # MonthlyUsage
449         'iscomplete',     'int', '', '', '', '',#0 when the report is in
450                                                 # progress, 1 when it is ready
451       ],
452       'primary_key' => 'id',
453       'unique' => [ [ qw(rep_date rep_time reportname) ] ],
454       'index'  => [ [ 'rep_date' ] ],
455     },
456
457     #Each report contains fields. For each service ID,
458     #the report may contain several fields for various statistics.
459     #Each field contains information about the units of the value it
460     #contains
461     'reportfields' => {
462       'columns' => [
463         'id',              'serial',     '', '',    '', '',
464         'rep_id',             'int', 'NULL', '',    '', '',
465         'name',           'varchar',     '', 64,    '', '',#name of the field,
466                                                            # such as AVG or MAX
467         'serviceid',      'varchar',     '', 64,    '', '',#service ID
468         'value', 'double precision',     '', '',    '', '',#Numeric value
469         'units',          'varchar',     '', 64, \"''", '',#Units, such as bytes
470                                                            # or Mbps
471       ],
472       'primary_key', => 'id',
473       'unique' => [ [ qw(rep_id name serviceid) ] ],
474       'index'  => [],
475     },
476
477   };
478
479 }
480
481 sub tables_hashref {
482
483   my $char_d = 80; #default maxlength for text fields
484
485   #my(@date_type)  = ( 'timestamp', '', ''     );
486   my @date_type = ( 'int', 'NULL', ''     );
487   my @perl_type = ( 'text', 'NULL', ''  ); 
488   my @money_type = ( 'decimal',   '', '10,2' );
489   my @money_typen = ( 'decimal',   'NULL', '10,2' );
490   my @taxrate_type  = ( 'decimal',   '',     '14,8' ); # requires pg 8 for 
491   my @taxrate_typen = ( 'decimal',   'NULL', '14,8' ); # fs-upgrade to work
492
493   my $username_len = 64; #usernamemax config file
494
495     # name type nullability length default local
496
497   return {
498
499     'agent' => {
500       'columns' => [
501         'agentnum',          'serial',    '',       '', '', '', 
502         'agent',            'varchar',    '',  $char_d, '', '', 
503         'typenum',              'int',    '',       '', '', '', 
504         'ticketing_queueid',    'int', 'NULL',      '', '', '', 
505         'invoice_template', 'varchar', 'NULL', $char_d, '', '',
506         'agent_custnum',        'int', 'NULL',      '', '', '',
507         'disabled',            'char', 'NULL',       1, '', '', 
508         'username',         'varchar', 'NULL', $char_d, '', '',
509         '_password',        'varchar', 'NULL', $char_d, '', '',
510         'freq',              'int', 'NULL', '', '', '', #deprecated (never used)
511         'prog',                     @perl_type, '', '', #deprecated (never used)
512       ],
513       'primary_key'  => 'agentnum',
514       #'unique' => [ [ 'agent_custnum' ] ], #one agent per customer?
515                                             #insert is giving it a value, tho..
516       #'index' => [ ['typenum'], ['disabled'] ],
517       'unique'       => [],
518       'index'        => [ ['typenum'], ['disabled'], ['agent_custnum'] ],
519       'foreign_keys' => [
520                           { columns    => [ 'typenum' ],
521                             table      => 'agent_type',
522                           },
523                           # 1. RT tables aren't part of our data structure, so
524                           #     we can't make sure Queue is created already
525                           # 2. Future ability to plug in other ticketing systems
526                           #{ columns    => [ 'ticketing_queueid' ],
527                           #  table      => 'Queue',
528                           #  references => [ 'id' ],
529                           #},
530                           { columns    => [ 'agent_custnum' ],
531                             table      => 'cust_main',
532                             references => [ 'custnum' ],
533                           },
534                         ],
535     },
536
537     'agent_pkg_class' => {
538       'columns' => [
539         'agentpkgclassnum',    'serial',     '',    '', '', '',
540         'agentnum',               'int',     '',    '', '', '',
541         'classnum',               'int', 'NULL',    '', '', '',
542         'commission_percent', 'decimal',     '', '7,4', '', '',
543       ],
544       'primary_key'  => 'agentpkgclassnum',
545       'unique'       => [ [ 'agentnum', 'classnum' ], ],
546       'index'        => [],
547       'foreign_keys' => [
548                           { columns    => [ 'agentnum' ],
549                             table      => 'agent',
550                           },
551                           { columns    => [ 'classnum' ],
552                             table      => 'pkg_class',
553                           },
554                         ],
555     },
556
557     'agent_type' => {
558       'columns' => [
559         'typenum',  'serial',      '',      '', '', '',
560         'atype',    'varchar',     '', $char_d, '', '',
561         'disabled',    'char', 'NULL',       1, '', '',
562       ],
563       'primary_key' => 'typenum',
564       'unique' => [],
565       'index' => [ ['disabled'] ],
566     },
567
568     'type_pkgs' => {
569       'columns' => [
570         'typepkgnum', 'serial', '', '', '', '', 
571         'typenum',   'int',  '', '', '', '', 
572         'pkgpart',   'int',  '', '', '', '', 
573       ],
574       'primary_key'  => 'typepkgnum',
575       'unique'       => [ ['typenum', 'pkgpart'] ],
576       'index'        => [ ['typenum'] ],
577       'foreign_keys' => [
578                           { columns    => [ 'typenum' ],
579                             table      => 'agent_type',
580                           },
581                           { columns    => [ 'pkgpart' ],
582                             table      => 'part_pkg',
583                           },
584                         ],
585     },
586
587     'agent_currency' => {
588       'columns' => [
589         'agentcurrencynum', 'serial', '', '', '', '',
590         'agentnum',            'int', '', '', '', '',
591         'currency',           'char', '',  3, '', '',
592       ],
593       'primary_key'  => 'agentcurrencynum',
594       'unique'       => [],
595       'index'        => [ ['agentnum'] ],
596       'foreign_keys' => [
597                           { columns    => [ 'agentnum' ],
598                             table      => 'agent',
599                           },
600                         ],
601     },
602
603     'sales' => {
604       'columns' => [
605         'salesnum',          'serial',    '',       '', '', '', 
606         'salesperson',      'varchar',    '',  $char_d, '', '', 
607         'agentnum',             'int', 'NULL',      '', '', '', 
608         'sales_custnum',        'int', 'NULL',      '', '', '',
609         'disabled',            'char', 'NULL',       1, '', '', 
610       ],
611       'primary_key'  => 'salesnum',
612       'unique'       => [],
613       'index'        => [ ['salesnum'], ['disabled'] ],
614       'foreign_keys' => [
615                           { columns    => [ 'agentnum' ],
616                             table      => 'agent',
617                           },
618                           { columns    => [ 'sales_custnum' ],
619                             table      => 'cust_main',
620                             references => [ 'custnum' ],
621                           },
622                         ],
623     },
624
625     'sales_pkg_class' => {
626       'columns' => [
627         'salespkgclassnum',    'serial',     '',    '', '', '',
628         'salesnum',               'int',     '',    '', '', '',
629         'classnum',               'int', 'NULL',    '', '', '',
630         'commission_percent', 'decimal',     '', '7,4', '', '',
631         'commission_duration',    'int', 'NULL',    '', '', '',
632       ],
633       'primary_key'  => 'salespkgclassnum',
634       'unique'       => [ [ 'salesnum', 'classnum' ], ],
635       'index'        => [],
636       'foreign_keys' => [
637                           { columns    => [ 'salesnum' ],
638                             table      => 'sales',
639                           },
640                           { columns    => [ 'classnum' ],
641                             table      => 'pkg_class',
642                           },
643                         ],
644     },
645
646     'cust_attachment' => {
647       'columns' => [
648         'attachnum', 'serial', '', '', '', '',
649         'custnum',   'int', '', '', '', '',
650         '_date',     @date_type, '', '',
651         'otaker',    'varchar', 'NULL', 32, '', '',
652         'usernum',   'int', 'NULL', '', '', '',
653         'filename',  'varchar', '', 255, '', '',
654         'mime_type', 'varchar', '', $char_d, '', '',
655         'title',     'varchar', 'NULL', $char_d, '', '',
656         'body',      'blob', 'NULL', '', '', '',
657         'disabled',  @date_type, '', '',
658       ],
659       'primary_key'  => 'attachnum',
660       'unique'       => [],
661       'index'        => [ ['custnum'], ['usernum'], ],
662       'foreign_keys' => [
663                           { columns    => [ 'custnum' ],
664                             table      => 'cust_main',
665                           },
666                           { columns    => [ 'usernum' ],
667                             table      => 'access_user',
668                           },
669                         ],
670    },
671
672     'cust_bill' => {
673       'columns' => [
674         #regular fields
675         'invnum',         'serial',     '',      '', '', '', 
676         'custnum',           'int',     '',      '', '', '', 
677         '_date',        @date_type,                  '', '', 
678         'charged',     @money_type,                  '', '', 
679         'currency',         'char', 'NULL',       3, '', '',
680         'invoice_terms', 'varchar', 'NULL', $char_d, '', '',
681
682         #customer balance info at invoice generation time
683         #(deprecated)
684         'previous_balance',   @money_typen, '', '',  #eventually not nullable
685         'billing_balance',    @money_typen, '', '',  #eventually not nullable
686
687         #deprecated (unused by now, right?)
688         'printed',      'int',     '', '', '', '', 
689
690         #specific use cases
691         'closed',      'char', 'NULL',  1, '', '', #not yet used much
692         'statementnum', 'int', 'NULL', '', '', '', #invoice aggregate statements
693         'agent_invid',  'int', 'NULL', '', '', '', #(varchar?) importing legacy
694         'promised_date', @date_type,       '', '',
695         
696         'pending',     'char', 'NULL',  1, '', '',
697       ],
698       'primary_key'  => 'invnum',
699       'unique'       => [ [ 'custnum', 'agent_invid' ] ], #agentnum?  huh
700       'index'        => [ ['custnum'], ['_date'], ['statementnum'],
701                           ['agent_invid'],
702                         ],
703       'foreign_keys' => [
704                           { columns    => [ 'custnum' ],
705                             table      => 'cust_main',
706                           },
707                           { columns    => [ 'statementnum' ],
708                             table      => 'cust_statement',
709                           },
710                         ],
711     },
712
713     'cust_bill_void' => {
714       'columns' => [
715         #regular fields
716         'invnum',            'int',     '',      '', '', '', 
717         'custnum',           'int',     '',      '', '', '', 
718         '_date',        @date_type,                  '', '', 
719         'charged',     @money_type,                  '', '', 
720         'currency',         'char', 'NULL',       3, '', '',
721         'invoice_terms', 'varchar', 'NULL', $char_d, '', '',
722
723         #customer balance info at invoice generation time
724         'previous_balance',   @money_typen, '', '',  #eventually not nullable
725         'billing_balance',    @money_typen, '', '',  #eventually not nullable
726
727         #specific use cases
728         'closed',      'char', 'NULL',  1, '', '', #not yet used much
729         'statementnum', 'int', 'NULL', '', '', '', #invoice aggregate statements
730         'agent_invid',  'int', 'NULL', '', '', '', #(varchar?) importing legacy
731         'promised_date', @date_type,       '', '',
732
733         #void fields
734         'void_date', @date_type, '', '', 
735         'reason',    'varchar',   'NULL', $char_d, '', '', 
736         'void_usernum',   'int', 'NULL', '', '', '',
737       ],
738       'primary_key'  => 'invnum',
739       'unique'       => [ [ 'custnum', 'agent_invid' ] ], #agentnum?  huh
740       'index'        => [ ['custnum'], ['_date'], ['statementnum'],
741                           ['agent_invid'], [ 'void_usernum' ],
742                         ],
743       'foreign_keys' => [
744                           { columns    => [ 'custnum' ],
745                             table      => 'cust_main',
746                           },
747                           { columns    => [ 'statementnum' ],
748                             table      => 'cust_statement', #_void? both?
749                           },
750                           { columns    => [ 'void_usernum' ],
751                             table      => 'access_user',
752                             references => [ 'usernum' ],
753                           },
754                         ],
755     },
756
757     #for importing invoices from a legacy system for display purposes only
758     # no effect upon balance
759     'legacy_cust_bill' => {
760       'columns' => [
761         'legacyinvnum',  'serial',     '',      '', '', '',
762         'legacyid',     'varchar', 'NULL', $char_d, '', '',
763         'custnum',          'int',     '',      '', '', '', 
764         '_date',       @date_type,                  '', '', 
765         'charged',    @money_type,                  '', '', 
766         'currency',        'char', 'NULL',       3, '', '',
767         'content_pdf',     'blob', 'NULL',      '', '', '',
768         'content_html',    'text', 'NULL',      '', '', '',
769         'locale',       'varchar', 'NULL',      16, '', '', 
770       ],
771       'primary_key'  => 'legacyinvnum',
772       'unique'       => [],
773       'index'        => [ ['legacyid', 'custnum', 'locale' ], ],
774       'foreign_keys' => [
775                           { columns    => [ 'custnum' ],
776                             table      => 'cust_main',
777                           },
778                         ],
779     },
780
781     'cust_statement' => {
782       'columns' => [
783         'statementnum', 'serial', '', '', '', '',
784         'custnum',         'int', '', '', '', '',
785         '_date',           @date_type,    '', '',
786       ],
787       'primary_key'  => 'statementnum',
788       'unique'       => [],
789       'index'        => [ ['custnum'], ['_date'], ],
790       'foreign_keys' => [
791                           { columns    => [ 'custnum' ],
792                             table      => 'cust_main',
793                           },
794                         ],
795     },
796
797     #old "invoice" events, deprecated
798     'cust_bill_event' => {
799       'columns' => [
800         'eventnum',    'serial',  '', '', '', '', 
801         'invnum',   'int',  '', '', '', '', 
802         'eventpart',   'int',  '', '', '', '', 
803         '_date',     @date_type, '', '', 
804         'status', 'varchar', '', $char_d, '', '', 
805         'statustext', 'text', 'NULL', '', '', '', 
806       ],
807       'primary_key'  => 'eventnum',
808       #no... there are retries now #'unique' => [ [ 'eventpart', 'invnum' ] ],
809       'unique'       => [],
810       'index'        => [ ['invnum'], ['status'], ['eventpart'],
811                           ['statustext'], ['_date'],
812                         ],
813       'foreign_keys' => [
814                           { columns    => [ 'invnum' ],
815                             table      => 'cust_bill',
816                           },
817                           { columns    => [ 'eventpart' ],
818                             table      => 'part_bill_event',
819                           },
820                         ],
821     },
822
823     #old "invoice" events, deprecated
824     'part_bill_event' => {
825       'columns' => [
826         'eventpart',    'serial',  '', '', '', '', 
827         'freq',        'varchar',       'NULL',     $char_d, '', '', 
828         'payby',       'char',  '', 4, '', '', 
829         'event',       'varchar',           '',     $char_d, '', '', 
830         'eventcode',    @perl_type, '', '', 
831         'seconds',     'int', 'NULL', '', '', '', 
832         'weight',      'int', '', '', '', '', 
833         'plan',       'varchar', 'NULL', $char_d, '', '', 
834         'plandata',   'text', 'NULL', '', '', '', 
835         'reason',     'int', 'NULL', '', '', '', 
836         'disabled',     'char', 'NULL', 1, '', '', 
837       ],
838       'primary_key'  => 'eventpart',
839       'unique'       => [],
840       'index'        => [ ['payby'], ['disabled'], ],
841       'foreign_keys' => [
842                           { columns    => [ 'reason' ],
843                             table      => 'reason',
844                             references => [ 'reasonnum' ],
845                           },
846                         ],
847     },
848
849     'part_event' => {
850       'columns' => [
851         'eventpart',   'serial',      '',      '', '', '', 
852         'agentnum',    'int',     'NULL',      '', '', '', 
853         'event',       'varchar',     '', $char_d, '', '', 
854         'eventtable',  'varchar',     '', $char_d, '', '',
855         'check_freq',  'varchar', 'NULL', $char_d, '', '', 
856         'weight',      'int',         '',      '', '', '', 
857         'action',      'varchar',     '', $char_d, '', '',
858         'disabled',     'char',   'NULL',       1, '', '', 
859       ],
860       'primary_key'  => 'eventpart',
861       'unique'       => [],
862       'index'        => [ ['agentnum'], ['eventtable'], ['check_freq'],
863                           ['disabled'],
864                         ],
865       'foreign_keys' => [
866                           { columns    => [ 'agentnum' ],
867                             table      => 'agent',
868                           },
869                         ],
870     },
871
872     'part_event_option' => {
873       'columns' => [
874         'optionnum', 'serial', '', '', '', '', 
875         'eventpart', 'int', '', '', '', '', 
876         'optionname', 'varchar', '', $char_d, '', '', 
877         'optionvalue', 'text', 'NULL', '', '', '', 
878       ],
879       'primary_key'  => 'optionnum',
880       'unique'       => [],
881       'index'        => [ [ 'eventpart' ], [ 'optionname' ] ],
882       'foreign_keys' => [
883                           { columns    => [ 'eventpart' ],
884                             table      => 'part_event',
885                           },
886                         ],
887     },
888
889     'part_event_condition' => {
890       'columns' => [
891         'eventconditionnum', 'serial', '', '', '', '', 
892         'eventpart', 'int', '', '', '', '', 
893         'conditionname', 'varchar', '', $char_d, '', '', 
894       ],
895       'primary_key'  => 'eventconditionnum',
896       'unique'       => [],
897       'index'        => [ [ 'eventpart' ], [ 'conditionname' ] ],
898       'foreign_keys' => [
899                           { columns    => [ 'eventpart' ],
900                             table      => 'part_event',
901                           },
902                         ],
903     },
904
905     'part_event_condition_option' => {
906       'columns' => [
907         'optionnum', 'serial', '', '', '', '', 
908         'eventconditionnum', 'int', '', '', '', '', 
909         'optionname', 'varchar', '', $char_d, '', '', 
910         'optionvalue', 'text', 'NULL', '', '', '', 
911       ],
912       'primary_key'  => 'optionnum',
913       'unique'       => [],
914       'index'        => [ [ 'eventconditionnum' ], [ 'optionname' ] ],
915       'foreign_keys' => [
916                           { columns    => [ 'eventconditionnum' ],
917                             table      => 'part_event_condition',
918                           },
919                         ],
920     },
921
922     'part_event_condition_option_option' => {
923       'columns' => [
924         'optionoptionnum', 'serial', '', '', '', '', 
925         'optionnum', 'int', '', '', '', '', 
926         'optionname', 'varchar', '', $char_d, '', '', 
927         'optionvalue', 'text', 'NULL', '', '', '', 
928       ],
929       'primary_key'  => 'optionoptionnum',
930       'unique'       => [],
931       'index'        => [ [ 'optionnum' ], [ 'optionname' ] ],
932       'foreign_keys' => [
933                           { columns    => [ 'optionnum' ],
934                             table      => 'part_event_condition_option',
935                           },
936                         ],
937     },
938
939     'cust_event' => {
940       'columns' => [
941         'eventnum',    'serial',  '', '', '', '', 
942         'eventpart',   'int',  '', '', '', '', 
943         'tablenum',   'int',  '', '', '', '', 
944         '_date',     @date_type, '', '', 
945         'status', 'varchar', '', $char_d, '', '', 
946         'statustext', 'text', 'NULL', '', '', '', 
947       ],
948       'primary_key'  => 'eventnum',
949       #no... there are retries now #'unique' => [ [ 'eventpart', 'invnum' ] ],
950       'unique'       => [],
951       'index'        => [ ['eventpart'], ['tablenum'], ['status'],
952                           ['statustext'], ['_date'],
953                         ],
954       'foreign_keys' => [
955                           { columns    => [ 'eventpart' ],
956                             table      => 'part_event',
957                           },
958                         ],
959     },
960
961     'cust_event_fee' => {
962       'columns' => [
963         'eventfeenum', 'serial', '', '', '', '',
964         'eventnum',       'int', '', '', '', '',
965         'billpkgnum',     'int', 'NULL', '', '', '',
966         'feepart',        'int', '', '', '', '',
967         'nextbill',      'char', 'NULL',  1, '', '',
968       ],
969       'primary_key'  => 'eventfeenum', # I'd rather just use eventnum
970       'unique' => [ [ 'billpkgnum' ], [ 'eventnum' ] ], # one-to-one link
971       'index'  => [ [ 'feepart' ] ],
972       'foreign_keys' => [
973                           { columns => [ 'eventnum' ],
974                             table   => 'cust_event',
975                           },
976                           { columns => [ 'billpkgnum' ],
977                             table   => 'cust_bill_pkg',
978                           },
979                           { columns => [ 'feepart' ],
980                             table   => 'part_fee',
981                           },
982                         ],
983     },
984
985     'cust_bill_pkg' => {
986       'columns' => [
987         'billpkgnum',          'serial',     '',      '', '', '', 
988         'invnum',                 'int',     '',      '', '', '', 
989         'pkgnum',                 'int',     '',      '', '', '', 
990         'pkgpart_override',       'int', 'NULL',      '', '', '', 
991         'setup',                 @money_type,             '', '', 
992         'unitsetup',             @money_typen,            '', '', 
993         'setup_billed_currency', 'char', 'NULL',       3, '', '',
994         'setup_billed_amount',   @money_typen,            '', '',
995         'recur',                 @money_type,             '', '', 
996         'unitrecur',             @money_typen,            '', '', 
997         'recur_billed_currency', 'char', 'NULL',       3, '', '',
998         'recur_billed_amount',   @money_typen,            '', '',
999         'sdate',                 @date_type,              '', '', 
1000         'edate',                 @date_type,              '', '', 
1001         'itemdesc',           'varchar', 'NULL', $char_d, '', '', 
1002         'itemcomment',        'varchar', 'NULL', $char_d, '', '', 
1003         'section',            'varchar', 'NULL', $char_d, '', '', 
1004         'freq',               'varchar', 'NULL', $char_d, '', '',
1005         'quantity',               'int', 'NULL',      '', '', '',
1006         'hidden',                'char', 'NULL',       1, '', '',
1007         'feepart',                'int', 'NULL',      '', '', '',
1008       ],
1009       'primary_key'  => 'billpkgnum',
1010       'unique'       => [],
1011       'index'        => [ ['invnum'], [ 'pkgnum' ], [ 'itemdesc' ], ],
1012       'foreign_keys' => [
1013                           { columns    => [ 'invnum' ],
1014                             table      => 'cust_bill',
1015                           },
1016                           #pkgnum 0 and -1 are used for special things
1017                           #{ columns    => [ 'pkgnum' ],
1018                           #  table      => 'cust_pkg',
1019                           #},
1020                           { columns    => [ 'pkgpart_override' ],
1021                             table      => 'part_pkg',
1022                             references => [ 'pkgpart' ],
1023                           },
1024                           { columns    => [ 'feepart' ],
1025                             table      => 'part_fee',
1026                           },
1027                         ],
1028     },
1029
1030     'cust_bill_pkg_detail' => {
1031       'columns' => [
1032         'detailnum', 'serial', '', '', '', '', 
1033           # bigserial? this table will eventually be as big as cdr...
1034         'billpkgnum', 'int', 'NULL', '', '', '',        # should not be nullable
1035         'pkgnum',  'int', 'NULL', '', '', '',           # deprecated
1036         'invnum',  'int', 'NULL', '', '', '',           # deprecated
1037         'amount',  'decimal', 'NULL', '10,4', '', '',
1038         'format',  'char', 'NULL', 1, '', '',
1039         'classnum', 'int', 'NULL', '', '', '',
1040         'duration', 'int', 'NULL', '',  0, '',
1041         'phonenum', 'varchar', 'NULL', 255, '', '', # has to hold a service label
1042         'accountcode', 'varchar',  'NULL',      32, '', '',
1043         'startdate',  @date_type, '', '', 
1044         'regionname', 'varchar', 'NULL', $char_d, '', '',
1045         'detail',  'varchar', '', 255, '', '',
1046       ],
1047       'primary_key'  => 'detailnum',
1048       'unique'       => [],
1049       'index'        => [ [ 'billpkgnum' ], [ 'classnum' ],
1050                           [ 'pkgnum', 'invnum' ],
1051                         ],
1052       'foreign_keys' => [
1053                           { columns    => [ 'billpkgnum' ],
1054                             table      => 'cust_bill_pkg',
1055                           },
1056                           #{ columns    => [ 'pkgnum' ],
1057                           #  table      => 'cust_pkg',
1058                           #},
1059                           #{ columns    => [ 'invnum' ],
1060                           #  table      => 'cust_bill',
1061                           #},
1062                           { columns    => [ 'classnum' ],
1063                             table      => 'usage_class',
1064                           },
1065                         ],
1066     },
1067
1068     'cust_bill_pkg_display' => {
1069       'columns' => [
1070         'billpkgdisplaynum', 'serial', '', '', '', '',
1071         'billpkgnum', 'int', '', '', '', '', 
1072         'section',  'varchar', 'NULL', $char_d, '', '', 
1073         #'unitsetup', @money_typen, '', '',     #override the linked real one?
1074         #'unitrecur', @money_typen, '', '',     #this too?
1075         'post_total', 'char', 'NULL', 1, '', '',
1076         'type',       'char', 'NULL', 1, '', '',
1077         'summary',    'char', 'NULL', 1, '', '',
1078       ],
1079       'primary_key'  => 'billpkgdisplaynum',
1080       'unique'       => [],
1081       'index'        => [ ['billpkgnum'], ],
1082       'foreign_keys' => [
1083                           { columns    => [ 'billpkgnum' ],
1084                             table      => 'cust_bill_pkg',
1085                           },
1086                         ],
1087     },
1088
1089     'cust_bill_pkg_fee' => {
1090       'columns' => [
1091         'billpkgfeenum',    'serial', '', '', '', '',
1092         'billpkgnum',          'int', '', '', '', '',
1093         'base_invnum',       'int', '', '', '', '',
1094         'base_billpkgnum',   'int', 'NULL', '', '', '',
1095         'amount',        @money_type,         '', '',
1096       ],
1097       'primary_key' => 'billpkgfeenum',
1098       'unique'      => [],
1099       'index'       => [ ['billpkgnum'],
1100                          ['base_invnum'],
1101                          ['base_billpkgnum'],
1102                        ],
1103       'foreign_keys' => [
1104                           { columns     => [ 'billpkgnum' ],
1105                             table       => 'cust_bill_pkg',
1106                           },
1107                           { columns     => [ 'base_billpkgnum' ],
1108                             table       => 'cust_bill_pkg',
1109                             references  => [ 'billpkgnum' ],
1110                           },
1111                           { columns     => [ 'base_invnum' ],
1112                             table       => 'cust_bill',
1113                             references  => [ 'invnum' ],
1114                           },
1115                         ],
1116     },
1117
1118     'cust_bill_pkg_tax_location' => {
1119       'columns' => [
1120         'billpkgtaxlocationnum', 'serial',     '',      '', '', '',
1121         'billpkgnum',               'int',     '',      '', '', '',
1122         'taxnum',                   'int',     '',      '', '', '',
1123         'taxtype',              'varchar',     '', $char_d, '', '',
1124         'pkgnum',                   'int',     '',      '', '', '', #redundant
1125         'locationnum',              'int',     '',      '', '', '', #redundant
1126         'amount',             @money_type,                  '', '',
1127         'currency',                'char', 'NULL',       3, '', '',
1128         'taxable_billpkgnum',       'int', 'NULL',      '', '', '',
1129       ],
1130       'primary_key'  => 'billpkgtaxlocationnum',
1131       'unique'       => [],
1132       'index'        => [ [ 'billpkgnum' ], 
1133                           [ 'taxnum' ],
1134                           [ 'pkgnum' ],
1135                           [ 'locationnum' ],
1136                           [ 'taxable_billpkgnum' ],
1137                         ],
1138       'foreign_keys' => [
1139                           { columns    => [ 'billpkgnum' ],
1140                             table      => 'cust_bill_pkg',
1141                           },
1142                           #{ columns    => [ 'pkgnum' ],
1143                           #  table      => 'cust_pkg',
1144                           #}, # taxes can apply to fees
1145                           { columns    => [ 'locationnum' ],
1146                             table      => 'cust_location',
1147                           },
1148                           { columns    => [ 'taxable_billpkgnum' ],
1149                             table      => 'cust_bill_pkg',
1150                             references => [ 'billpkgnum' ],
1151                           },
1152                         ],
1153     },
1154
1155     'cust_bill_pkg_tax_rate_location' => {
1156       'columns' => [
1157         'billpkgtaxratelocationnum', 'serial',      '',      '', '', '',
1158         'billpkgnum',                   'int',      '',      '', '', '',
1159         'taxnum',                       'int',      '',      '', '', '',
1160         'taxtype',                  'varchar',      '', $char_d, '', '',
1161         'locationtaxid',            'varchar',  'NULL', $char_d, '', '',
1162         'taxratelocationnum',           'int',      '',      '', '', '',
1163         'amount',                 @money_type,                   '', '',
1164         'currency',                    'char', 'NULL',        3, '', '',
1165         'taxable_billpkgnum',           'int', 'NULL',       '', '', '',
1166       ],
1167       'primary_key'  => 'billpkgtaxratelocationnum',
1168       'unique'       => [],
1169       'index'        => [ ['billpkgnum'], ['taxnum'], ['taxratelocationnum'],
1170                           ['taxable_billpkgnum'],
1171                         ],
1172       'foreign_keys' => [
1173                           { columns    => [ 'billpkgnum' ],
1174                             table      => 'cust_bill_pkg',
1175                           },
1176                           { columns    => [ 'taxratelocationnum' ],
1177                             table      => 'tax_rate_location',
1178                           },
1179                           { columns    => [ 'taxable_billpkgnum' ],
1180                             table      => 'cust_bill_pkg',
1181                             references => [ 'billpkgnum' ],
1182                           },
1183                         ],
1184     },
1185
1186     'cust_bill_pkg_void' => {
1187       'columns' => [
1188         'billpkgnum',           'int',     '',      '', '', '', 
1189         'invnum',               'int',     '',      '', '', '', 
1190         'pkgnum',               'int',     '',      '', '', '', 
1191         'pkgpart_override',     'int', 'NULL',      '', '', '', 
1192         'setup',               @money_type,             '', '', 
1193         'recur',               @money_type,             '', '', 
1194         #XXX a currency for a line item?  or just one for the entire invoice
1195         #'currency',            'char', 'NULL',       3, '', '',
1196         'sdate',               @date_type,              '', '', 
1197         'edate',               @date_type,              '', '', 
1198         'itemdesc',         'varchar', 'NULL', $char_d, '', '', 
1199         'itemcomment',      'varchar', 'NULL', $char_d, '', '', 
1200         'section',          'varchar', 'NULL', $char_d, '', '', 
1201         'freq',             'varchar', 'NULL', $char_d, '', '',
1202         'quantity',             'int', 'NULL',      '', '', '',
1203         'unitsetup',           @money_typen,            '', '', 
1204         'unitrecur',           @money_typen,            '', '', 
1205         'hidden',              'char', 'NULL',       1, '', '',
1206         #void fields
1207         'void_date', @date_type, '', '', 
1208         'reason',    'varchar',   'NULL', $char_d, '', '', 
1209         'void_usernum',   'int', 'NULL', '', '', '',
1210       ],
1211       'primary_key'  => 'billpkgnum',
1212       'unique'       => [],
1213       'index'        => [ ['invnum'], ['pkgnum'], ['itemdesc'],
1214                           ['void_usernum'],
1215                         ],
1216       'foreign_keys' => [
1217                           { columns    => [ 'invnum' ],
1218                             table      => 'cust_bill_void',
1219                           },
1220                           #pkgnum 0 and -1 are used for special things
1221                           #{ columns    => [ 'pkgnum' ],
1222                           #  table      => 'cust_pkg',
1223                           #},
1224                           { columns    => [ 'pkgpart_override' ],
1225                             table      => 'part_pkg',
1226                             references => [ 'pkgpart' ],
1227                           },
1228                           { columns    => [ 'void_usernum' ],
1229                             table      => 'access_user',
1230                             references => [ 'usernum' ],
1231                           },
1232                         ],
1233     },
1234
1235     'cust_bill_pkg_detail_void' => {
1236       'columns' => [
1237         'detailnum',  'int', '', '', '', '', 
1238         'billpkgnum', 'int', 'NULL', '', '', '',        # should not be nullable
1239         'pkgnum',  'int', 'NULL', '', '', '',           # deprecated
1240         'invnum',  'int', 'NULL', '', '', '',           # deprecated
1241         'amount',  'decimal', 'NULL', '10,4', '', '',
1242         'format',  'char', 'NULL', 1, '', '',
1243         'classnum', 'int', 'NULL', '', '', '',
1244         'duration', 'int', 'NULL', '',  0, '',
1245         'phonenum', 'varchar', 'NULL', 255, '', '',
1246         'accountcode', 'varchar',  'NULL',      32, '', '',
1247         'startdate',  @date_type, '', '', 
1248         'regionname', 'varchar', 'NULL', $char_d, '', '',
1249         'detail',  'varchar', '', 255, '', '', 
1250       ],
1251       'primary_key'  => 'detailnum',
1252       'unique'       => [],
1253       'index'        => [ ['billpkgnum'], ['classnum'], ['pkgnum', 'invnum'] ],
1254       'foreign_keys' => [
1255                           { columns    => [ 'billpkgnum' ],
1256                             table      => 'cust_bill_pkg_void',
1257                           },
1258                           #{ columns    => [ 'pkgnum' ],
1259                           #  table      => 'cust_pkg',
1260                           #},
1261                           #{ columns    => [ 'invnum' ],
1262                           #  table      => 'cust_bill',
1263                           #},
1264                           { columns    => [ 'classnum' ],
1265                             table      => 'usage_class',
1266                           },
1267                         ],
1268     },
1269
1270     'cust_bill_pkg_display_void' => {
1271       'columns' => [
1272         'billpkgdisplaynum',    'int', '', '', '', '', 
1273         'billpkgnum', 'int', '', '', '', '', 
1274         'section',  'varchar', 'NULL', $char_d, '', '', 
1275         #'unitsetup', @money_typen, '', '',     #override the linked real one?
1276         #'unitrecur', @money_typen, '', '',     #this too?
1277         'post_total', 'char', 'NULL', 1, '', '',
1278         'type',       'char', 'NULL', 1, '', '',
1279         'summary',    'char', 'NULL', 1, '', '',
1280       ],
1281       'primary_key'  => 'billpkgdisplaynum',
1282       'unique'       => [],
1283       'index'        => [ ['billpkgnum'], ],
1284       'foreign_keys' => [
1285                           { columns    => [ 'billpkgnum' ],
1286                             table      => 'cust_bill_pkg_void',
1287                           },
1288                         ],
1289     },
1290
1291     'cust_bill_pkg_tax_location_void' => {
1292       'columns' => [
1293         'billpkgtaxlocationnum',    'int',     '',      '', '', '',
1294         'billpkgnum',               'int',     '',      '', '', '',
1295         'taxnum',                   'int',     '',      '', '', '',
1296         'taxtype',              'varchar',     '', $char_d, '', '',
1297         'pkgnum',                   'int',     '',      '', '', '',
1298         'locationnum',              'int',     '',      '', '', '', #redundant?
1299         'amount',             @money_type,                  '', '',
1300         'currency',                'char', 'NULL',       3, '', '',
1301         'taxable_billpkgnum',       'int', 'NULL',      '', '', '',
1302       ],
1303       'primary_key'  => 'billpkgtaxlocationnum',
1304       'unique'       => [],
1305       'index'        => [ ['billpkgnum'], ['taxnum'], ['pkgnum'],
1306                           ['locationnum'],
1307                         ],
1308       'foreign_keys' => [
1309                           { columns    => [ 'billpkgnum' ],
1310                             table      => 'cust_bill_pkg_void',
1311                           },
1312                           { columns    => [ 'pkgnum' ],
1313                             table      => 'cust_pkg',
1314                           },
1315                           { columns    => [ 'locationnum' ],
1316                             table      => 'cust_location',
1317                           },
1318                           { columns    => [ 'taxable_billpkgnum' ],
1319                             table      => 'cust_bill_pkg_void',
1320                             references => [ 'billpkgnum' ],
1321                           },
1322                         ],
1323     },
1324
1325     'cust_bill_pkg_tax_rate_location_void' => {
1326       'columns' => [
1327         'billpkgtaxratelocationnum',    'int',     '',      '', '', '',
1328         'billpkgnum',                   'int',     '',      '', '', '',
1329         'taxnum',                       'int',     '',      '', '', '',
1330         'taxtype',                  'varchar',     '', $char_d, '', '',
1331         'locationtaxid',            'varchar', 'NULL', $char_d, '', '',
1332         'taxratelocationnum',           'int',     '',      '', '', '',
1333         'amount',                 @money_type,                  '', '',
1334         'currency',                    'char', 'NULL',       3, '', '',
1335       ],
1336       'primary_key'  => 'billpkgtaxratelocationnum',
1337       'unique'       => [],
1338       'index'        => [ ['billpkgnum'], ['taxnum'], ['taxratelocationnum'] ],
1339       'foreign_keys' => [
1340                           { columns    => [ 'billpkgnum' ],
1341                             table      => 'cust_bill_pkg_void',
1342                           },
1343                           { columns    => [ 'taxratelocationnum' ],
1344                             table      => 'tax_rate_location',
1345                           },
1346                         ],
1347     },
1348
1349     'cust_credit' => {
1350       'columns' => [
1351         'crednum',  'serial',     '', '', '', '', 
1352         'custnum',     'int',     '', '', '', '', 
1353         '_date',  @date_type,             '', '', 
1354         'amount',@money_type,             '', '', 
1355         'currency',   'char', 'NULL',  3, '', '',
1356         'otaker',  'varchar', 'NULL', 32, '', '', 
1357         'usernum',     'int', 'NULL', '', '', '',
1358         'reason',     'text', 'NULL', '', '', '', 
1359         'reasonnum',   'int', 'NULL', '', '', '', 
1360         'addlinfo',   'text', 'NULL', '', '', '',
1361         'closed',     'char', 'NULL',  1, '', '', 
1362         'pkgnum',      'int', 'NULL', '', '','',#desired pkgnum for pkg-balances
1363         'eventnum',    'int', 'NULL', '', '','',#triggering event for commission
1364         'commission_agentnum', 'int', 'NULL', '', '', '', #
1365         'commission_salesnum', 'int', 'NULL', '', '', '', #
1366         'commission_pkgnum',   'int', 'NULL', '', '', '', #
1367         'credbatch',    'varchar', 'NULL', $char_d, '', '',
1368       ],
1369       'primary_key'  => 'crednum',
1370       'unique'       => [],
1371       'index'        => [ ['custnum'], ['_date'], ['usernum'], ['eventnum'],
1372                           ['commission_salesnum'], ['credbatch'],
1373                         ],
1374       'foreign_keys' => [
1375                           { columns    => [ 'custnum' ],
1376                             table      => 'cust_main',
1377                           },
1378                           { columns    => [ 'usernum' ],
1379                             table      => 'access_user',
1380                           },
1381                           { columns    => [ 'reasonnum' ],
1382                             table      => 'reason',
1383                           },
1384                           { columns    => [ 'pkgnum' ],
1385                             table      => 'cust_pkg',
1386                           },
1387                           { columns    => [ 'eventnum' ],
1388                             table      => 'cust_event',
1389                           },
1390                           { columns    => [ 'commission_agentnum' ],
1391                             table      => 'agent',
1392                             references => [ 'agentnum' ],
1393                           },
1394                           { columns    => [ 'commission_salesnum' ],
1395                             table      => 'sales',
1396                             references => [ 'salesnum' ],
1397                           },
1398                           { columns    => [ 'commission_pkgnum' ],
1399                             table      => 'cust_pkg',
1400                             references => [ 'pkgnum' ],
1401                           },
1402                         ],
1403     },
1404
1405     'cust_credit_void' => {
1406       'columns' => [
1407         'crednum',  'serial',     '', '', '', '', 
1408         'custnum',     'int',     '', '', '', '', 
1409         '_date',  @date_type,             '', '', 
1410         'amount',@money_type,             '', '', 
1411         'currency',   'char', 'NULL',  3, '', '',
1412         'otaker',  'varchar', 'NULL', 32, '', '', 
1413         'usernum',     'int', 'NULL', '', '', '',
1414         'reason',     'text', 'NULL', '', '', '', 
1415         'reasonnum',   'int', 'NULL', '', '', '', 
1416         'addlinfo',   'text', 'NULL', '', '', '',
1417         'closed',     'char', 'NULL',  1, '', '', 
1418         'pkgnum',      'int', 'NULL', '', '','',
1419         'eventnum',    'int', 'NULL', '', '','',
1420         'commission_agentnum', 'int', 'NULL', '', '', '',
1421         'commission_salesnum', 'int', 'NULL', '', '', '',
1422         'commission_pkgnum',   'int', 'NULL', '', '', '',
1423         #void fields
1424         'void_date',  @date_type,                  '', '', 
1425         'void_reason', 'varchar', 'NULL', $char_d, '', '', 
1426         'void_usernum',    'int', 'NULL',      '', '', '',
1427       ],
1428       'primary_key'  => 'crednum',
1429       'unique'       => [],
1430       'index'        => [ ['custnum'], ['_date'], ['usernum'], ['eventnum'],
1431                           ['commission_salesnum'],
1432                         ],
1433       'foreign_keys' => [
1434                           { columns    => [ 'custnum' ],
1435                             table      => 'cust_main',
1436                           },
1437                           { columns    => [ 'usernum' ],
1438                             table      => 'access_user',
1439                           },
1440                           { columns    => [ 'reasonnum' ],
1441                             table      => 'reason',
1442                           },
1443                           { columns    => [ 'pkgnum' ],
1444                             table      => 'cust_pkg',
1445                           },
1446                           { columns    => [ 'eventnum' ],
1447                             table      => 'cust_event',
1448                           },
1449                           { columns    => [ 'commission_agentnum' ],
1450                             table      => 'agent',
1451                             references => [ 'agentnum' ],
1452                           },
1453                           { columns    => [ 'commission_salesnum' ],
1454                             table      => 'sales',
1455                             references => [ 'salesnum' ],
1456                           },
1457                           { columns    => [ 'commission_pkgnum' ],
1458                             table      => 'cust_pkg',
1459                             references => [ 'pkgnum' ],
1460                           },
1461                           { columns    => [ 'void_usernum' ],
1462                             table      => 'access_user',
1463                             references => [ 'usernum' ],
1464                           },
1465                         ],
1466     },
1467
1468
1469     'cust_credit_bill' => {
1470       'columns' => [
1471         'creditbillnum', 'serial', '', '', '', '', 
1472         'crednum',  'int', '', '', '', '', 
1473         'invnum',  'int', '', '', '', '', 
1474         '_date',    @date_type, '', '', 
1475         'amount',   @money_type, '', '', 
1476         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
1477       ],
1478       'primary_key'  => 'creditbillnum',
1479       'unique'       => [],
1480       'index'        => [ ['crednum'], ['invnum'] ],
1481       'foreign_keys' => [
1482                           { columns    => [ 'crednum' ],
1483                             table      => 'cust_credit',
1484                           },
1485                           { columns    => [ 'invnum' ],
1486                             table      => 'cust_bill',
1487                           },
1488                           { columns    => [ 'pkgnum' ],
1489                             table      => 'cust_pkg',
1490                           },
1491                         ],
1492     },
1493
1494     'cust_credit_bill_pkg' => {
1495       'columns' => [
1496         'creditbillpkgnum', 'serial', '',      '', '', '',
1497         'creditbillnum',       'int', '',      '', '', '',
1498         'billpkgnum',          'int', '',      '', '', '',
1499         'billpkgtaxlocationnum', 'int', 'NULL', '', '', '',
1500         'billpkgtaxratelocationnum', 'int', 'NULL', '', '', '',
1501         'amount',            @money_type,          '', '',
1502         'setuprecur',      'varchar', '', $char_d, '', '',
1503         'sdate',   @date_type, '', '', 
1504         'edate',   @date_type, '', '', 
1505       ],
1506       'primary_key'  => 'creditbillpkgnum',
1507       'unique'       => [],
1508       'index'        => [ [ 'creditbillnum' ],
1509                           [ 'billpkgnum' ], 
1510                           [ 'billpkgtaxlocationnum' ],
1511                           [ 'billpkgtaxratelocationnum' ],
1512                         ],
1513       'foreign_keys' => [
1514                           { columns    => [ 'creditbillnum' ],
1515                             table      => 'cust_credit_bill',
1516                           },
1517                           { columns    => [ 'billpkgnum' ],
1518                             table      => 'cust_bill_pkg',
1519                           },
1520                           { columns    => [ 'billpkgtaxlocationnum' ],
1521                             table      => 'cust_bill_pkg_tax_location',
1522                           },
1523                           { columns    => [ 'billpkgtaxratelocationnum' ],
1524                             table      => 'cust_bill_pkg_tax_rate_location',
1525                           },
1526                         ],
1527     },
1528
1529     'cust_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         'pkgpartbatch',  'varchar', 'NULL', $char_d, '', '',
3056         'pkg',           'varchar',   '',   $char_d, '', '', 
3057         'comment',       'varchar', 'NULL', 2*$char_d, '', '', 
3058         'promo_code',    'varchar', 'NULL', $char_d, '', '', 
3059         'freq',          'varchar',   '',   $char_d, '', '', #billing frequency
3060         'setuptax',      'char', 'NULL', 1, '', '', 
3061         'recurtax',      'char', 'NULL', 1, '', '', 
3062         'plan',          'varchar', 'NULL', $char_d, '', '', 
3063         'disabled',      'char', 'NULL', 1, '', '', 
3064         'custom',        'char', 'NULL', 1, '', '', 
3065         'taxclass',      'varchar', 'NULL', $char_d, '', '', 
3066         'classnum',      'int',     'NULL', '', '', '', 
3067         'addon_classnum','int',     'NULL', '', '', '', 
3068         'taxproductnum', 'int',     'NULL', '', '', '', 
3069         'setup_cost',    @money_typen,          '', '',
3070         'recur_cost',    @money_typen,          '', '',
3071         'pay_weight',    'real',    'NULL', '', '', '',
3072         'credit_weight', 'real',    'NULL', '', '', '',
3073         'agentnum',      'int',     'NULL', '', '', '', 
3074         'fcc_ds0s',      'int',     'NULL', '', '', '', 
3075         'fcc_voip_class','char',    'NULL',  1, '', '',
3076         'no_auto',          'char', 'NULL',  1, '', '', 
3077         'recur_show_zero',  'char', 'NULL',  1, '', '',
3078         'setup_show_zero',  'char', 'NULL',  1, '', '',
3079         'successor',     'int',     'NULL', '', '', '',
3080         'family_pkgpart','int',     'NULL', '', '', '',
3081         'delay_start',   'int',     'NULL', '', '', '',
3082         'start_on_hold', 'char',    'NULL',  1, '', '',
3083         'agent_pkgpartid', 'varchar', 'NULL', 20, '', '',
3084       ],
3085       'primary_key'  => 'pkgpart',
3086       'unique'       => [],
3087       'index'        => [ [ 'promo_code' ], [ 'disabled' ], [ 'classnum' ],
3088                           [ 'agentnum' ], ['no_auto'], ['agent_pkgpartid'],
3089                         ],
3090       'foreign_keys' => [
3091                           { columns    => [ 'classnum' ],
3092                             table      => 'pkg_class',
3093                           },
3094                           { columns    => [ 'addon_classnum' ],
3095                             table      => 'pkg_class',
3096                             references => [ 'classnum' ],
3097                           },
3098                           { columns    => [ 'taxproductnum' ],
3099                             table      => 'part_pkg_taxproduct',
3100                           },
3101                           { columns    => [ 'agentnum' ],
3102                             table      => 'agent',
3103                           },
3104                           { columns    => [ 'successor' ],
3105                             table      => 'part_pkg',
3106                             references => [ 'pkgpart' ],
3107                           },
3108                           { columns    => [ 'family_pkgpart' ],
3109                             table      => 'part_pkg',
3110                             references => [ 'pkgpart' ],
3111                           },
3112                         ],
3113     },
3114
3115     'part_pkg_msgcat' => {
3116       'columns' => [
3117         'pkgpartmsgnum',  'serial',     '',        '', '', '',
3118         'pkgpart',           'int',     '',        '', '', '',
3119         'locale',        'varchar',     '',        16, '', '',
3120         'pkg',           'varchar',     '',   $char_d, '', '', #longer/no limit?
3121         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
3122       ],
3123       'primary_key'  => 'pkgpartmsgnum',
3124       'unique'       => [ [ 'pkgpart', 'locale' ] ],
3125       'index'        => [],
3126       'foreign_keys' => [
3127                           { columns    => [ 'pkgpart' ],
3128                             table      => 'part_pkg',
3129                           },
3130                         ],
3131     },
3132
3133     'part_pkg_currency' => {
3134       'columns' => [
3135         'pkgcurrencynum', 'serial', '',      '', '', '',
3136         'pkgpart',           'int', '',      '', '', '',
3137         'currency',         'char', '',       3, '', '',
3138         'optionname',    'varchar', '', $char_d, '', '', 
3139         'optionvalue',      'text', '',      '', '', '', 
3140       ],
3141       'primary_key'  => 'pkgcurrencynum',
3142       'unique'       => [ [ 'pkgpart', 'currency', 'optionname' ] ],
3143       'index'        => [ ['pkgpart'] ],
3144       'foreign_keys' => [
3145                           { columns    => [ 'pkgpart' ],
3146                             table      => 'part_pkg',
3147                           },
3148                         ],
3149     },
3150
3151     'currency_exchange' => {
3152       'columns' => [
3153         'currencyratenum', 'serial', '',    '', '', '',
3154         'from_currency',     'char', '',     3, '', '',
3155         'to_currency',       'char', '',     3, '', '',
3156         'rate',           'decimal', '', '7,6', '', '',
3157       ],
3158       'primary_key' => 'currencyratenum',
3159       'unique'      => [ [ 'from_currency', 'to_currency' ] ],
3160       'index'       => [],
3161     },
3162
3163     'part_pkg_usageprice' => {
3164       'columns' => [
3165         'usagepricepart', 'serial',      '',      '', '', '',
3166         'pkgpart',           'int',      '',      '', '', '',
3167         'price',          @money_type,                '', '', 
3168         'currency',         'char',  'NULL',       3, '', '',
3169         'action',        'varchar',      '', $char_d, '', '',
3170         'target',        'varchar',      '', $char_d, '', '',
3171         'amount',        'varchar',      '', $char_d, '', '',
3172       ],
3173       'primary_key'  => 'usagepricepart',
3174       'unique'       => [ [ 'pkgpart', 'currency', 'target' ] ],
3175       'index'        => [ [ 'pkgpart' ] ],
3176       'foreign_keys' => [
3177                           { columns    => [ 'pkgpart' ],
3178                             table      => 'part_pkg',
3179                           },
3180                         ],
3181     },
3182
3183     'cust_pkg_usageprice' => {
3184       'columns' => [
3185         'usagepricenum', 'serial',      '',      '', '', '',
3186         'pkgnum',           'int',      '',      '', '', '',
3187         'usagepricepart',   'int',      '',      '', '', '',
3188         'quantity',         'int',      '',      '', '', '',
3189       ],
3190       'primary_key'  => 'usagepricenum',
3191       'unique'       => [ [ 'pkgnum', 'usagepricepart' ] ],
3192       'index'        => [ [ 'pkgnum' ] ],
3193       'foreign_keys' => [
3194                           { columns    => [ 'pkgnum' ],
3195                             table      => 'cust_pkg',
3196                           },
3197                           { columns    => [ 'usagepricepart' ],
3198                             table      => 'part_pkg_usageprice',
3199                           },
3200                         ],
3201     },
3202
3203     'part_fee' => {
3204       'columns' => [
3205         'feepart',       'serial',    '',   '', '', '',
3206         'itemdesc',      'varchar',   '',   $char_d,   '', '',
3207         'comment',       'varchar', 'NULL', 2*$char_d, '', '',
3208         'disabled',      'char',    'NULL',  1, '', '',
3209         'classnum',      'int',     'NULL', '', '', '',
3210         'taxclass',      'varchar', 'NULL', $char_d, '', '',
3211         'taxproductnum', 'int',     'NULL', '', '', '',
3212         'pay_weight',    'real',    'NULL', '', '', '',
3213         'credit_weight', 'real',    'NULL', '', '', '',
3214         'agentnum',      'int',     'NULL', '', '', '',
3215         'amount',   @money_type,                '', '', 
3216         'percent',     'decimal',    '', '7,4', '', '',
3217         'basis',         'varchar',  '',    16, '', '',
3218         'minimum',    @money_typen,             '', '',
3219         'maximum',    @money_typen,             '', '',
3220         'limit_credit',  'char',    'NULL',  1, '', '',
3221         'setuprecur',    'char',     '',     5, '', '',
3222         'taxable',       'char',    'NULL',  1, '', '',
3223       ],
3224       'primary_key'  => 'feepart',
3225       'unique'       => [],
3226       'index'        => [ [ 'disabled' ], [ 'classnum' ], [ 'agentnum' ]
3227                         ],
3228       'foreign_keys' => [
3229                           { columns    => [ 'classnum' ],
3230                             table      => 'pkg_class',
3231                           },
3232                           { columns    => [ 'taxproductnum' ],
3233                             table      => 'part_pkg_taxproduct',
3234                           },
3235                           { columns    => [ 'agentnum' ],
3236                             table      => 'agent',
3237                           },
3238                         ],
3239     },
3240
3241     'part_fee_msgcat' => {
3242       'columns' => [
3243         'feepartmsgnum',  'serial',     '',        '', '', '',
3244         'feepart',           'int',     '',        '', '', '',
3245         'locale',        'varchar',     '',        16, '', '',
3246         'itemdesc',      'varchar',     '',   $char_d, '', '', #longer/no limit?
3247         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
3248       ],
3249       'primary_key'  => 'feepartmsgnum',
3250       'unique'       => [ [ 'feepart', 'locale' ] ],
3251       'index'        => [],
3252       'foreign_keys' => [
3253                           { columns    => [ 'feepart' ],
3254                             table      => 'part_fee',
3255                           },
3256                         ],
3257     },
3258
3259     'part_fee_usage' => {
3260       'columns' => [
3261         'feepartusagenum','serial',     '',        '', '', '',
3262         'feepart',           'int',     '',        '', '', '',
3263         'classnum',          'int',     '',        '', '', '',
3264         'amount',   @money_type,                '', '',
3265         'percent',     'decimal',    '', '7,4', '', '',
3266       ],
3267       'primary_key'  => 'feepartusagenum',
3268       'unique'       => [ [ 'feepart', 'classnum' ] ],
3269       'index'        => [],
3270       'foreign_keys' => [
3271                           { columns    => [ 'feepart' ],
3272                             table      => 'part_fee',
3273                           },
3274                           { columns    => [ 'classnum' ],
3275                             table      => 'usage_class',
3276                           },
3277                         ],
3278     },
3279
3280     'part_pkg_link' => {
3281       'columns' => [
3282         'pkglinknum',  'serial',   '',      '', '', '',
3283         'src_pkgpart', 'int',      '',      '', '', '',
3284         'dst_pkgpart', 'int',      '',      '', '', '', 
3285         'link_type',   'varchar',  '', $char_d, '', '',
3286         'hidden',      'char', 'NULL',       1, '', '',
3287       ],
3288       'primary_key'  => 'pkglinknum',
3289       'unique'       => [ ['src_pkgpart','dst_pkgpart','link_type','hidden'] ],
3290       'index'        => [ [ 'src_pkgpart' ] ],
3291       'foreign_keys' => [
3292                           { columns    => [ 'src_pkgpart' ],
3293                             table      => 'part_pkg',
3294                             references => [ 'pkgpart' ]
3295                           },
3296                           { columns    => [ 'dst_pkgpart' ],
3297                             table      => 'part_pkg',
3298                             references => [ 'pkgpart' ]
3299                           },
3300                         ],
3301     },
3302     # XXX somewhat borked unique: we don't really want a hidden and unhidden
3303     # it turns out we'd prefer to use svc, bill, and invisibill (or something)
3304
3305     'part_pkg_discount' => {
3306       'columns' => [
3307         'pkgdiscountnum', 'serial',   '',      '', '', '',
3308         'pkgpart',        'int',      '',      '', '', '',
3309         'discountnum',    'int',      '',      '', '', '', 
3310       ],
3311       'primary_key'  => 'pkgdiscountnum',
3312       'unique'       => [ [ 'pkgpart', 'discountnum' ] ],
3313       'index'        => [],
3314       'foreign_keys' => [
3315                           { columns    => [ 'pkgpart' ],
3316                             table      => 'part_pkg',
3317                           },
3318                           { columns    => [ 'discountnum' ],
3319                             table      => 'discount',
3320                           },
3321                         ],
3322     },
3323
3324     'part_pkg_taxclass' => {
3325       'columns' => [
3326         'taxclassnum',  'serial', '',       '', '', '',
3327         'taxclass',     'varchar', '', $char_d, '', '', 
3328         'disabled', 'char',   'NULL',         1, '', '', 
3329       ],
3330       'primary_key' => 'taxclassnum',
3331       'unique'      => [ [ 'taxclass' ] ],
3332       'index'       => [ [ 'disabled' ] ],
3333     },
3334
3335     'part_pkg_taxproduct' => {
3336       'columns' => [
3337         'taxproductnum', 'serial',      '',        '', '', '',
3338         'data_vendor',   'varchar', 'NULL',   $char_d, '', '', 
3339         'taxproduct',    'varchar',     '',   $char_d, '', '', 
3340         'description',   'varchar',     '', 3*$char_d, '', '', 
3341         'note',             'text', 'NULL',        '', '', '',
3342       ],
3343       'primary_key' => 'taxproductnum',
3344       'unique'      => [ [ 'data_vendor', 'taxproduct' ] ],
3345       'index'       => [],
3346     },
3347
3348     'part_pkg_taxrate' => { 
3349       'columns' => [
3350         'pkgtaxratenum', 'serial',  '',     '',      '', '',
3351         'data_vendor',   'varchar', 'NULL', $char_d, '', '', # update source
3352         'geocode',       'varchar', 'NULL', $char_d, '', '', # cch provides 10
3353         'taxproductnum', 'int',  '',     '',       '', '',          
3354         'city',             'varchar', 'NULL', $char_d, '', '', # tax_location?
3355         'county',           'varchar', 'NULL', $char_d, '', '', 
3356         'state',            'varchar', 'NULL', $char_d, '', '', 
3357         'local',            'varchar', 'NULL', $char_d, '', '', 
3358         'country',          'char',    'NULL', 2,       '', '',
3359         'taxclassnumtaxed', 'int',     'NULL', '',      '', '', 
3360         'taxcattaxed',      'varchar', 'NULL', $char_d, '', '', 
3361         'taxclassnum',      'int',     'NULL', '',      '', '', 
3362         'effdate',          @date_type, '', '', 
3363         'taxable',          'char',    'NULL', 1,       '', '', 
3364       ],
3365       'primary_key'  => 'pkgtaxratenum',
3366       'unique'       => [],
3367       'index'        => [ [ 'data_vendor', 'geocode', 'taxproductnum' ] ],
3368       'foreign_keys' => [
3369                           { columns    => [ 'taxproductnum' ],
3370                             table      => 'part_pkg_taxproduct',
3371                           },
3372                           { columns    => [ 'taxclassnumtaxed' ],
3373                             table      => 'tax_class',
3374                             references => [ 'taxclassnum' ],
3375                           },
3376                           { columns    => [ 'taxclassnum' ],
3377                             table      => 'tax_class',
3378                           },
3379                         ],
3380     },
3381
3382     'part_pkg_taxoverride' => { 
3383       'columns' => [
3384         'taxoverridenum', 'serial', '', '', '', '',
3385         'pkgpart',           'int', '', '', '', '',
3386         'taxclassnum',       'int', '', '', '', '',
3387         'usage_class',    'varchar', 'NULL', $char_d, '', '', 
3388       ],
3389       'primary_key'  => 'taxoverridenum',
3390       'unique'       => [],
3391       'index'        => [ [ 'pkgpart' ], [ 'taxclassnum' ] ],
3392       'foreign_keys' => [
3393                           { columns    => [ 'pkgpart' ],
3394                             table      => 'part_pkg',
3395                           },
3396                           { columns    => [ 'taxclassnum' ],
3397                             table      => 'tax_class',
3398                           },
3399                         ],
3400     },
3401
3402 #    'part_title' => {
3403 #      'columns' => [
3404 #        'titlenum',   'int',    '',   '',
3405 #        'title',      'varchar',   '',   $char_d,
3406 #      ],
3407 #      'primary_key' => 'titlenum',
3408 #      'unique' => [ [] ],
3409 #      'index' => [ [] ],
3410 #    },
3411
3412     'pkg_svc' => {
3413       'columns' => [
3414         'pkgsvcnum',   'serial',    '', '', '', '', 
3415         'pkgpart',        'int',    '', '', '', '', 
3416         'svcpart',        'int',    '', '', '', '', 
3417         'quantity',       'int',    '', '', '', '', 
3418         'primary_svc',   'char', 'NULL', 1, '', '', 
3419         'hidden',        'char', 'NULL', 1, '', '',
3420         'bulk_skip',     'char', 'NULL', 1, '', '',
3421       ],
3422       'primary_key'  => 'pkgsvcnum',
3423       'unique'       => [ ['pkgpart', 'svcpart'] ],
3424       'index'        => [ ['pkgpart'], ['quantity'] ],
3425       'foreign_keys' => [
3426                           { columns    => [ 'pkgpart' ],
3427                             table      => 'part_pkg',
3428                           },
3429                           { columns    => [ 'svcpart' ],
3430                             table      => 'part_svc',
3431                           },
3432                         ],
3433     },
3434
3435     'part_referral' => {
3436       'columns' => [
3437         'refnum',   'serial',     '',        '', '', '', 
3438         'referral', 'varchar',    '',   $char_d, '', '', 
3439         'disabled', 'char',   'NULL',         1, '', '', 
3440         'agentnum', 'int',    'NULL',        '', '', '', 
3441       ],
3442       'primary_key'  => 'refnum',
3443       'unique'       => [],
3444       'index'        => [ ['disabled'], ['agentnum'], ],
3445       'foreign_keys' => [
3446                           { columns    => [ 'agentnum' ],
3447                             table      => 'agent',
3448                           },
3449                         ],
3450     },
3451
3452     'part_svc' => {
3453       'columns' => [
3454         'svcpart',             'serial',     '',        '', '', '', 
3455         'svc',                'varchar',     '',   $char_d, '', '', 
3456         'svcdb',              'varchar',     '',   $char_d, '', '', 
3457         'disabled',              'char', 'NULL',         1, '', '', 
3458         'preserve',              'char', 'NULL',         1, '', '',
3459         'selfservice_access', 'varchar', 'NULL',   $char_d, '', '',
3460         'classnum',               'int', 'NULL',        '', '', '',
3461         'restrict_edit_password','char', 'NULL',         1, '', '',
3462         'has_router',            'char', 'NULL',         1, '', '',
3463 ],
3464       'primary_key'  => 'svcpart',
3465       'unique'       => [],
3466       'index'        => [ [ 'disabled' ] ],
3467       'foreign_keys' => [
3468                           { columns    => [ 'classnum' ],
3469                             table      => 'part_svc_class',
3470                           },
3471                         ],
3472     },
3473
3474     'part_svc_column' => {
3475       'columns' => [
3476         'columnnum',   'serial',      '',      '', '', '', 
3477         'svcpart',     'int',         '',      '', '', '', 
3478         'columnname',  'varchar',     '',      64, '', '', 
3479         'columnlabel', 'varchar', 'NULL', $char_d, '', '',
3480         'columnvalue', 'varchar', 'NULL',     512, '', '', 
3481         'columnflag',  'char',    'NULL',       1, '', '', 
3482       ],
3483       'primary_key'  => 'columnnum',
3484       'unique'       => [ [ 'svcpart', 'columnname' ] ],
3485       'index'        => [ [ 'svcpart' ] ],
3486       'foreign_keys' => [
3487                           { columns    => [ 'svcpart' ],
3488                             table      => 'part_svc',
3489                           },
3490                         ],
3491     },
3492
3493     'part_svc_class' => {
3494       'columns' => [
3495         'classnum',    'serial',   '',      '', '', '', 
3496         'classname',   'varchar',  '', $char_d, '', '', 
3497         'disabled',    'char', 'NULL',       1, '', '', 
3498       ],
3499       'primary_key' => 'classnum',
3500       'unique' => [],
3501       'index' => [ ['disabled'] ],
3502     },
3503
3504     #(this should be renamed to part_pop)
3505     'svc_acct_pop' => {
3506       'columns' => [
3507         'popnum',    'serial',    '',   '', '', '', 
3508         'city',      'varchar',   '',   $char_d, '', '', 
3509         'state',     'varchar',   '',   $char_d, '', '', 
3510         'ac',        'char',   '',   3, '', '', 
3511         'exch',      'char',   '',   3, '', '', 
3512         'loc',       'char',   'NULL',   4, '', '', #NULL for legacy purposes
3513       ],
3514       'primary_key' => 'popnum',
3515       'unique' => [],
3516       'index' => [ [ 'state' ] ],
3517     },
3518
3519     'part_pop_local' => {
3520       'columns' => [
3521         'localnum',  'serial',     '',     '', '', '', 
3522         'popnum',    'int',     '',     '', '', '', 
3523         'city',      'varchar', 'NULL', $char_d, '', '', 
3524         'state',     'char',    'NULL', 2, '', '', 
3525         'npa',       'char',    '',     3, '', '', 
3526         'nxx',       'char',    '',     3, '', '', 
3527       ],
3528       'primary_key'  => 'localnum',
3529       'unique'       => [],
3530       'index'        => [ [ 'npa', 'nxx' ], [ 'popnum' ] ],
3531       'foreign_keys' => [
3532                          { columns    => [ 'popnum' ],
3533                            table      => 'svc_acct_pop',
3534                          },
3535                        ],
3536     },
3537
3538     'qual' => {
3539       'columns' => [
3540         'qualnum',  'serial',     '',     '', '', '', 
3541         'custnum',    'int',     'NULL',     '', '', '',
3542         'prospectnum',    'int',     'NULL',     '', '', '',
3543         'locationnum',    'int',     'NULL',     '', '', '',
3544         'phonenum',     'varchar', 'NULL',       24, '', '',
3545         'exportnum',      'int', 'NULL', '', '', '', 
3546         'vendor_qual_id',      'varchar', 'NULL', $char_d, '', '', 
3547         'status',      'char', '', 1, '', '', 
3548       ],
3549       'primary_key'  => 'qualnum',
3550       'unique'       => [],
3551       'index'        => [ ['locationnum'], ['custnum'], ['prospectnum'],
3552                           ['phonenum'], ['vendor_qual_id'],
3553                         ],
3554       'foreign_keys' => [
3555                           { columns    => [ 'custnum' ],
3556                             table      => 'cust_main',
3557                           },
3558                           { columns    => [ 'prospectnum' ],
3559                             table      => 'prospect_main',
3560                           },
3561                           { columns    => [ 'locationnum' ],
3562                             table      => 'cust_location',
3563                           },
3564                           { columns    => [ 'exportnum' ],
3565                             table      => 'part_export',
3566                           },
3567                         ],
3568     },
3569
3570     'qual_option' => {
3571       'columns' => [
3572         'optionnum', 'serial', '', '', '', '', 
3573         'qualnum',  'int',     '',     '', '', '', 
3574         'optionname', 'varchar', '', $char_d, '', '', 
3575         'optionvalue', 'text', 'NULL', '', '', '', 
3576       ],
3577       'primary_key'  => 'optionnum',
3578       'unique'       => [],
3579       'index'        => [],
3580       'foreign_keys' => [
3581                           { columns    => [ 'qualnum' ],
3582                             table      => 'qual',
3583                           },
3584                         ],
3585     },
3586
3587     'svc_acct' => {
3588       'columns' => [
3589         'svcnum',    'int',    '',   '', '', '', 
3590         'username',  'varchar',   '',   $username_len, '', '',
3591         '_password', 'varchar',   'NULL',  512, '', '',
3592         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
3593         'sec_phrase', 'varchar',  'NULL',   $char_d, '', '', 
3594         'popnum',    'int',    'NULL',   '', '', '', 
3595         'sectornum', 'int', 'NULL',      '', '', '',
3596         'uid',       'int', 'NULL',   '', '', '', 
3597         'gid',       'int', 'NULL',   '', '', '', 
3598         'finger',    'varchar',   'NULL',   2*$char_d, '', '', 
3599         'dir',       'varchar',   'NULL',   $char_d, '', '', 
3600         'shell',     'varchar',   'NULL',   $char_d, '', '', 
3601         'quota',     'varchar',   'NULL',   $char_d, '', '', 
3602         'slipip',    'varchar',   'NULL',   15, '', '', #four TINYINTs, bah.
3603         # IP address mgmt
3604         'routernum', 'int', 'NULL',      '', '', '',
3605         'blocknum',  'int', 'NULL',      '', '', '', 
3606         'seconds',   'int', 'NULL',   '', '', '', #uhhhh
3607         'seconds_threshold',   'int', 'NULL',   '', '', '',
3608         'upbytes',   'bigint', 'NULL',   '', '', '', 
3609         'upbytes_threshold',   'bigint', 'NULL',   '', '', '',
3610         'downbytes', 'bigint', 'NULL',   '', '', '',
3611         'downbytes_threshold',   'bigint', 'NULL',   '', '', '',
3612         'totalbytes','bigint', 'NULL',   '', '', '',
3613         'totalbytes_threshold',   'bigint', 'NULL',   '', '', '',
3614         'domsvc',    'int',     '', '', '', '', 
3615         'pbxsvc',    'int', 'NULL', '', '', '',
3616         'last_login',  @date_type, '', '', 
3617         'last_logout', @date_type, '', '', 
3618         #cardfortress field(s)
3619         'cf_privatekey',      'text', 'NULL',      '', '', '',
3620         #communigate pro fields (quota = MaxAccountSize)
3621         'cgp_aliases',     'varchar', 'NULL',     255, '', '',
3622         #settings
3623         'cgp_type',        'varchar', 'NULL', $char_d, '', '', #AccountType
3624         'file_quota',      'varchar', 'NULL', $char_d, '', '', #MaxWebSize
3625         'file_maxnum',     'varchar', 'NULL', $char_d, '', '', #MaxWebFiles
3626         'file_maxsize',    'varchar', 'NULL', $char_d, '', '', #MaxFileSize
3627         'cgp_accessmodes', 'varchar', 'NULL',     255, '', '', #AccessModes
3628         'password_selfchange','char', 'NULL',       1, '', '', #PWDAllowed
3629         'password_recover',   'char', 'NULL',       1, 'Y','', #PasswordRecovery
3630         'cgp_rulesallowed','varchar', 'NULL', $char_d, '', '', #RulesAllowed
3631         'cgp_rpopallowed',    'char', 'NULL',       1, '', '', #RPOPAllowed
3632         'cgp_mailtoall',      'char', 'NULL',       1, '', '', #MailToAll
3633         'cgp_addmailtrailer', 'char', 'NULL',       1, '', '', #AddMailTrailer
3634         'cgp_archiveafter',    'int', 'NULL',      '', '', '', #ArchiveMessagesAfter
3635         #XXX mailing lists
3636         #preferences
3637         'cgp_deletemode',     'varchar', 'NULL', $char_d, '', '',#DeleteMode
3638         'cgp_emptytrash',     'varchar', 'NULL', $char_d, '', '',#EmptyTrash
3639         'cgp_language',       'varchar', 'NULL', $char_d, '', '',#Language
3640         'cgp_timezone',       'varchar', 'NULL', $char_d, '', '',#TimeZone
3641         'cgp_skinname',       'varchar', 'NULL', $char_d, '', '',#SkinName
3642         'cgp_prontoskinname', 'varchar', 'NULL', $char_d, '', '',#ProntoSkinName
3643         'cgp_sendmdnmode',    'varchar', 'NULL', $char_d, '', '',#SendMDNMode
3644         #mail
3645         #XXX RPOP settings
3646         #
3647       ],
3648       'primary_key'  => 'svcnum',
3649       #'unique'       => [ [ 'username', 'domsvc' ] ],
3650       'unique'       => [],
3651       'index'        => [ ['username'], ['domsvc'], ['pbxsvc'] ],
3652       'foreign_keys' => [
3653                           { columns    => [ 'svcnum' ],
3654                             table      => 'cust_svc',
3655                           },
3656                           { columns    => [ 'popnum' ],
3657                             table      => 'svc_acct_pop',
3658                           },
3659                           { columns    => [ 'sectornum' ],
3660                             table      => 'tower_sector',
3661                           },
3662                           { columns    => [ 'routernum' ],
3663                             table      => 'router',
3664                           },
3665                           { columns    => [ 'blocknum' ],
3666                             table      => 'addr_block',
3667                           },
3668                           { columns    => [ 'domsvc' ],
3669                             table      => 'svc_domain', #'cust_svc',
3670                             references => [ 'svcnum' ],
3671                           },
3672                           { columns    => [ 'pbxsvc' ],
3673                             table      => 'svc_pbx', #'cust_svc',
3674                             references => [ 'svcnum' ],
3675                           },
3676                         ],
3677     },
3678
3679     'acct_rt_transaction' => {
3680       'columns' => [
3681         'svcrtid',   'int',    '',   '', '', '', #why am i not a serial
3682         'svcnum',    'int',    '',   '', '', '', 
3683         'transaction_id',       'int', '',   '', '', '', 
3684         '_date',   @date_type, '', '',
3685         'seconds',   'int', '',   '', '', '', #uhhhh
3686         'support',   'int', '',   '', '', '',
3687       ],
3688       'primary_key'  => 'svcrtid',
3689       'unique'       => [],
3690       'index'        => [ ['svcnum', 'transaction_id'] ],
3691       'foreign_keys' => [
3692                           { columns    => [ 'svcnum' ],
3693                             table      => 'svc_acct', #'cust_svc',
3694                           },
3695                           # 1. RT tables aren't part of our data structure, so
3696                           #     we can't make sure Queue is created already
3697                           # 2. This is our internal hack for time tracking, not
3698                           #     a user-facing feature
3699                           #{ columns    => [ 'transaction_id' ],
3700                           #  table      => 'Transaction',
3701                           #  references => [ 'id' ],
3702                           #},
3703                         ],
3704     },
3705
3706     #'svc_charge' => {
3707     #  'columns' => [
3708     #    'svcnum',    'int',    '',   '',
3709     #    'amount',    @money_type,
3710     #  ],
3711     #  'primary_key' => 'svcnum',
3712     #  'unique' => [ [] ],
3713     #  'index' => [ [] ],
3714     #},
3715
3716     'svc_domain' => {
3717       'columns' => [
3718         'svcnum',           'int',    '',        '', '', '',
3719         'domain',       'varchar',    '',   $char_d, '', '',
3720         'suffix',       'varchar', 'NULL',  $char_d, '', '',
3721         'catchall',         'int', 'NULL',       '', '', '',
3722         'parent_svcnum',    'int', 'NULL',       '', '', '',
3723         'quota',        'varchar', 'NULL',  $char_d, '', '', 
3724
3725         #registration info
3726         'registrarnum',     'int', 'NULL',       '', '', '',
3727         'registrarkey', 'varchar', 'NULL',      512, '', '',
3728         'setup_date',      @date_type, '', '',
3729         'renewal_interval', 'int', 'NULL',       '', '', '',
3730         'expiration_date', @date_type, '', '',
3731
3732         #some weird shit australia-specific shit?  yuck.. seems totally unused
3733         'au_registrant_name',       'varchar', 'NULL',  $char_d, '', '',
3734         'au_eligibility_type',      'varchar', 'NULL',  $char_d, '', '',
3735
3736         #communigate pro fields (quota = MaxAccountSize)
3737         'max_accounts',     'int', 'NULL',       '', '', '',
3738         'trailer',         'text', 'NULL',       '', '', '',
3739         'cgp_aliases',  'varchar', 'NULL',      255, '', '',
3740         'cgp_accessmodes','varchar','NULL',     255, '', '', #DomainAccessModes
3741         'cgp_certificatetype','varchar','NULL', $char_d, '', '',
3742
3743         #(account default) settings
3744         'acct_def_password_selfchange',   'char', 'NULL',       1,  '', '', 
3745         'acct_def_password_recover',      'char', 'NULL',       1, 'Y', '', 
3746         'acct_def_cgp_accessmodes',    'varchar', 'NULL',     255,  '', '',
3747         'acct_def_quota',              'varchar', 'NULL', $char_d,  '', '',
3748         'acct_def_file_quota',         'varchar', 'NULL', $char_d,  '', '',
3749         'acct_def_file_maxnum',        'varchar', 'NULL', $char_d,  '', '',
3750         'acct_def_file_maxsize',       'varchar', 'NULL', $char_d,  '', '',
3751         'acct_def_cgp_rulesallowed',   'varchar', 'NULL', $char_d,  '', '',
3752         'acct_def_cgp_rpopallowed',       'char', 'NULL',       1,  '', '', 
3753         'acct_def_cgp_mailtoall',         'char', 'NULL',       1,  '', '', 
3754         'acct_def_cgp_addmailtrailer',    'char', 'NULL',       1,  '', '', 
3755         'acct_def_cgp_archiveafter',       'int', 'NULL',      '',  '', '',
3756
3757         #(account default) preferences
3758         'acct_def_cgp_deletemode',     'varchar', 'NULL', $char_d,  '', '',
3759         'acct_def_cgp_emptytrash',     'varchar', 'NULL', $char_d,  '', '',
3760         'acct_def_cgp_language',       'varchar', 'NULL', $char_d,  '', '',
3761         'acct_def_cgp_timezone',       'varchar', 'NULL', $char_d,  '', '',
3762         'acct_def_cgp_skinname',       'varchar', 'NULL', $char_d,  '', '',
3763         'acct_def_cgp_prontoskinname', 'varchar', 'NULL', $char_d,  '', '',
3764         'acct_def_cgp_sendmdnmode',    'varchar', 'NULL', $char_d,  '', '',
3765       ],
3766       'primary_key'  => 'svcnum',
3767       'unique'       => [],
3768       'index'        => [ ['domain'] ],
3769       'foreign_keys' => [
3770                           { columns    => [ 'svcnum' ],
3771                             table      => 'cust_svc',
3772                           },
3773                           { columns    => [ 'catchall' ],
3774                             table      => 'svc_acct',
3775                             references => [ 'svcnum' ],
3776                           },
3777                           { columns    => [ 'parent_svcnum' ],
3778                             table      => 'cust_svc',
3779                             references => [ 'svcnum' ],
3780                           },
3781                           { columns    => [ 'registrarnum' ],
3782                             table      => 'registrar',
3783                           },
3784                         ],
3785     },
3786
3787     'svc_dsl' => {
3788       'columns' => [
3789         'svcnum',                    'int',    '',        '', '', '',
3790         'pushed',                    'int', 'NULL',       '', '', '',
3791         'desired_due_date',          'int', 'NULL',       '', '', '',
3792         'due_date',                  'int', 'NULL',       '', '', '',
3793         'vendor_order_id',       'varchar', 'NULL', $char_d,  '', '',
3794         'vendor_qual_id',        'varchar', 'NULL', $char_d,  '', '',
3795         'vendor_order_type',     'varchar', 'NULL', $char_d,  '', '',
3796         'vendor_order_status',   'varchar', 'NULL', $char_d,  '', '',
3797         'first',                 'varchar', 'NULL', $char_d,  '', '',
3798         'last',                  'varchar', 'NULL', $char_d,  '', '',
3799         'company',               'varchar', 'NULL', $char_d,  '', '',
3800         'phonenum',              'varchar', 'NULL',      24, '', '',
3801         'gateway_access_number', 'varchar', 'NULL',      24, '', '',
3802         'loop_type',                'char', 'NULL',       1, '', '', 
3803         'local_voice_provider',  'varchar', 'NULL', $char_d, '', '',
3804         'circuitnum',            'varchar', 'NULL', $char_d, '', '',
3805         'rate_band',             'varchar', 'NULL', $char_d, '', '',
3806         'vpi',                       'int', 'NULL',      '', '', '',
3807         'vci',                       'int', 'NULL',      '', '', '',
3808         'isp_chg',                  'char', 'NULL',       1, '', '', 
3809         'isp_prev',              'varchar', 'NULL', $char_d, '', '',
3810         'username',              'varchar', 'NULL', $char_d, '', '',
3811         'password',              'varchar', 'NULL', $char_d, '', '',
3812         'staticips',                'text', 'NULL',      '', '', '',
3813         'monitored',                'char', 'NULL',       1, '', '', 
3814         'last_pull',                 'int', 'NULL',      '', '', '',
3815       ],
3816       'primary_key'  => 'svcnum',
3817       'unique'       => [ ],
3818       'index'        => [ ['phonenum'], ['vendor_order_id'] ],
3819       'foreign_keys' => [
3820                           { columns    => [ 'svcnum' ],
3821                             table      => 'cust_svc',
3822                           },
3823                         ],
3824     },
3825
3826     'dsl_device' => {
3827       'columns' => [
3828         'devicenum', 'serial',     '', '', '', '',
3829         #part_device?  or our own part_dsl_device?
3830         #'devicepart',   'int',     '', '', '', '',
3831         'svcnum',       'int',     '', '', '', '', 
3832         'mac_addr', 'varchar',     '', 12, '', '', 
3833       ],
3834       'primary_key'  => 'devicenum',
3835       'unique'       => [ [ 'mac_addr' ], ],
3836       'index'        => [ [ 'svcnum' ], ], # [ 'devicepart' ] ],
3837       'foreign_keys' => [
3838                           { columns    => [ 'svcnum' ],
3839                             table      => 'svc_dsl',
3840                           },
3841                         ],
3842     },
3843
3844     'dsl_note' => {
3845       'columns' => [
3846         'notenum',           'serial',    '',        '', '', '',
3847         'svcnum',     'int', '',       '', '', '',
3848         'author',     'varchar', 'NULL', $char_d,  '', '',
3849         'priority',   'char', 'NULL',       1,  '', '', 
3850         '_date',     'int', 'NULL',       '', '', '',
3851         'note',     'text', '',       '', '', '',
3852       ],
3853       'primary_key'  => 'notenum',
3854       'unique'       => [],
3855       'index'        => [ ['svcnum'] ],
3856       'foreign_keys' => [
3857                           { columns    => [ 'svcnum' ],
3858                             table      => 'svc_dsl',
3859                           },
3860                         ],
3861     },
3862
3863     'svc_dish' => {
3864       'columns' => [
3865         'svcnum',   'int',     '',     '', '', '',
3866         'acctnum',  'varchar', '',     16, '', '',
3867         'installdate', @date_type,         '', '', 
3868         'note',     'text',    'NULL', '', '', '',
3869       ],
3870       'primary_key'  => 'svcnum',
3871       'unique'       => [],
3872       'index'        => [],
3873       'foreign_keys' => [
3874                           { columns    => [ 'svcnum' ],
3875                             table      => 'cust_svc',
3876                           },
3877                         ],
3878     },
3879
3880     'svc_hardware' => {
3881       'columns' => [
3882         'svcnum',   'int',     '',          '', '', '',
3883         'typenum',  'int',     '',          '', '', '',
3884         'serial',   'varchar', 'NULL', $char_d, '', '',
3885         'ip_addr',  'varchar', 'NULL',      40, '', '',
3886         'hw_addr',  'varchar', 'NULL',      12, '', '',
3887         'smartcard','varchar', 'NULL',      30, '', '',
3888         'statusnum','int',     'NULL',      '', '', '',
3889         'note',     'text',    'NULL',      '', '', '',
3890       ],
3891       'primary_key'  => 'svcnum',
3892       'unique'       => [],
3893       'index'        => [],
3894       'foreign_keys' => [
3895                           { columns    => [ 'svcnum' ],
3896                             table      => 'cust_svc',
3897                           },
3898                           { columns    => [ 'typenum' ],
3899                             table      => 'hardware_type',
3900                           },
3901                           { columns    => [ 'statusnum' ],
3902                             table      => 'hardware_status',
3903                           },
3904                         ],
3905     },
3906
3907     'hardware_class' => {
3908       'columns' => [
3909         'classnum',   'serial', '',      '', '', '',
3910         'classname', 'varchar', '', $char_d, '', '',
3911       ],
3912       'primary_key' => 'classnum',
3913       'unique' => [],
3914       'index'  => [],
3915     },
3916
3917     'hardware_type' => {
3918       'columns' => [
3919         'typenum',  'serial',     '',      '', '', '',
3920         'classnum',    'int',     '',      '', '', '',
3921         'model',   'varchar',     '', $char_d, '', '',
3922         'revision','varchar', 'NULL', $char_d, '', '',
3923       ],
3924       'primary_key'  => 'typenum',
3925       'unique'       => [ [ 'classnum', 'model', 'revision' ] ],
3926       'index'        => [],
3927       'foreign_keys' => [
3928                           { columns    => [ 'classnum' ],
3929                             table      => 'hardware_class',
3930                           },
3931                         ],
3932     },
3933
3934     'hardware_status' => {
3935       'columns' => [
3936         'statusnum', 'serial', '',      '', '', '',
3937         'label'    ,'varchar', '', $char_d, '', '',
3938         'disabled',    'char', 'NULL',   1, '', '', 
3939       ],
3940       'primary_key' => 'statusnum',
3941       'unique' => [],
3942       'index'  => [],
3943     },
3944
3945     'domain_record' => {
3946       'columns' => [
3947         'recnum',    'serial',     '',  '', '', '', 
3948         'svcnum',    'int',     '',  '', '', '', 
3949         'reczone',   'varchar', '',  255, '', '', 
3950         'recaf',     'char',    '',  2, '', '', 
3951         'rectype',   'varchar',    '',  5, '', '', 
3952         'recdata',   'varchar', '',  255, '', '', 
3953         'ttl',       'int',     'NULL', '', '', '',
3954       ],
3955       'primary_key'  => 'recnum',
3956       'unique'       => [],
3957       'index'        => [ ['svcnum'] ],
3958       'foreign_keys' => [
3959                           { columns    => [ 'svcnum' ],
3960                             table      => 'svc_domain',
3961                           },
3962                         ],
3963     },
3964
3965     'registrar' => {
3966       'columns' => [
3967         'registrarnum',   'serial', '',      '', '', '',
3968         'registrarname', 'varchar', '', $char_d, '', '',
3969       ],
3970       'primary_key' => 'registrarnum',
3971       'unique'      => [],
3972       'index'       => [],
3973     },
3974
3975     'cgp_rule' => {
3976       'columns' => [
3977         'rulenum',  'serial',     '',      '', '', '',
3978         'name',    'varchar',     '', $char_d, '', '',
3979         'comment', 'varchar', 'NULL', $char_d, '', '',
3980         'svcnum',      'int',     '',      '', '', '',
3981         'priority',    'int',     '',      '', '', '',
3982       ],
3983       'primary_key' => 'rulenum',
3984       'unique'      => [ [ 'svcnum', 'name' ] ],
3985       'index'       => [ [ 'svcnum' ] ],
3986       'foreign_keys' => [
3987                           { columns    => [ 'svcnum' ],
3988                             table      => 'cust_svc', #svc_acct / svc_domain
3989                           },
3990                         ],
3991     },
3992
3993     'cgp_rule_condition' => {
3994       'columns' => [
3995         'ruleconditionnum',  'serial',     '',      '', '', '',
3996         'conditionname',    'varchar',     '', $char_d, '', '',
3997         'op',               'varchar', 'NULL', $char_d, '', '',
3998         'params',           'varchar', 'NULL',     255, '', '',
3999         'rulenum',              'int',     '',      '', '', '',
4000       ],
4001       'primary_key'  => 'ruleconditionnum',
4002       'unique'       => [],
4003       'index'        => [ [ 'rulenum' ] ],
4004       'foreign_keys' => [
4005                           { columns    => [ 'rulenum' ],
4006                             table      => 'cgp_rule',
4007                           },
4008                         ],
4009     },
4010
4011     'cgp_rule_action' => {
4012        'columns' => [
4013         'ruleactionnum',  'serial',     '',      '', '', '',
4014         'action',        'varchar',     '', $char_d, '', '',
4015         'params',        'varchar', 'NULL',     255, '', '',
4016         'rulenum',           'int',     '',      '', '', '',
4017       ],
4018       'primary_key'  => 'ruleactionnum',
4019       'unique'       => [],
4020       'index'        => [ [ 'rulenum' ] ],
4021       'foreign_keys' => [
4022                           { columns    => [ 'rulenum' ],
4023                             table      => 'cgp_rule',
4024                           },
4025                         ],
4026    },
4027
4028     'svc_forward' => {
4029       'columns' => [
4030         'svcnum',   'int',            '',   '', '', '', 
4031         'srcsvc',   'int',        'NULL',   '', '', '', 
4032         'src',      'varchar',    'NULL',  255, '', '', 
4033         'dstsvc',   'int',        'NULL',   '', '', '', 
4034         'dst',      'varchar',    'NULL',  255, '', '', 
4035       ],
4036       'primary_key'  => 'svcnum',
4037       'unique'       => [],
4038       'index'        => [ ['srcsvc'], ['dstsvc'] ],
4039       'foreign_keys' => [
4040                           { columns    => [ 'svcnum' ],
4041                             table      => 'cust_svc',
4042                           },
4043                           { columns    => [ 'srcsvc' ],
4044                             table      => 'svc_acct',
4045                             references => [ 'svcnum' ]
4046                           },
4047                           { columns    => [ 'dstsvc' ],
4048                             table      => 'svc_acct',
4049                             references => [ 'svcnum' ]
4050                           },
4051                         ],
4052     },
4053
4054     'svc_www' => {
4055       'columns' => [
4056         'svcnum',   'int',      '',  '', '', '', 
4057         'recnum',   'int',      '',  '', '', '', 
4058         'usersvc',  'int',  'NULL',  '', '', '', 
4059         'config',   'text', 'NULL',  '', '', '', 
4060       ],
4061       'primary_key' => 'svcnum',
4062       'unique'      => [],
4063       'index'       => [],
4064       'foreign_keys' => [
4065                           { columns    => [ 'svcnum' ],
4066                             table      => 'cust_svc',
4067                           },
4068                           { columns    => [ 'recnum' ],
4069                             table      => 'domain_record',
4070                           },
4071                           { columns    => [ 'usersvc' ],
4072                             table      => 'svc_acct',
4073                             references => [ 'svcnum' ]
4074                           },
4075                         ],
4076     },
4077
4078     #'svc_wo' => {
4079     #  'columns' => [
4080     #    'svcnum',    'int',    '',   '',
4081     #    'svcnum',    'int',    '',   '',
4082     #    'svcnum',    'int',    '',   '',
4083     #    'worker',    'varchar',   '',   $char_d,
4084     #    '_date',     @date_type,
4085     #  ],
4086     #  'primary_key' => 'svcnum',
4087     #  'unique' => [ [] ],
4088     #  'index' => [ [] ],
4089     #},
4090
4091     'prepay_credit' => {
4092       'columns' => [
4093         'prepaynum',   'serial',     '',   '', '', '', 
4094         'identifier',  'varchar', '', $char_d, '', '', 
4095         'amount',      @money_type, '', '', 
4096         'seconds',     'int',     'NULL', '', '', '', 
4097         'upbytes',     'bigint',     'NULL', '', '', '', 
4098         'downbytes',   'bigint',     'NULL', '', '', '', 
4099         'totalbytes',  'bigint',     'NULL', '', '', '', 
4100         'agentnum',    'int',     'NULL', '', '', '', 
4101       ],
4102       'primary_key'  => 'prepaynum',
4103       'unique'       => [ ['identifier'] ],
4104       'index'        => [ ['agentnum'] ],
4105       'foreign_keys' => [
4106                           { columns    => [ 'agentnum' ],
4107                             table      => 'agent',
4108                           },
4109                         ],
4110     },
4111
4112     'port' => {
4113       'columns' => [
4114         'portnum',  'serial',     '',   '', '', '', 
4115         'ip',       'varchar', 'NULL', 15, '', '', 
4116         'nasport',  'int',     'NULL', '', '', '', 
4117         'nasnum',   'int',     '',   '', '', '', 
4118       ],
4119       'primary_key'  => 'portnum',
4120       'unique'       => [],
4121       'index'        => [],
4122       'foreign_keys' => [
4123                           { columns    => [ 'nasnum' ],
4124                             table      => 'nas',
4125                           },
4126                         ],
4127     },
4128
4129     'nas' => {
4130       'columns' => [
4131         'nasnum',       'serial',     '',  '',              '', '', 
4132         'nasname',     'varchar',     '', 128,              '', '',
4133         'shortname',   'varchar', 'NULL',  32,              '', '',
4134         'type',        'varchar',     '',  30,         'other', '',
4135         'ports',           'int', 'NULL',  '',              '', '',
4136         'secret',      'varchar',     '',  60,        'secret', '',
4137         'server',      'varchar', 'NULL',  64,              '', '',
4138         'community',   'varchar', 'NULL',  50,              '', '',
4139         'description', 'varchar',     '', 200, 'RADIUS Client', '',
4140         'svcnum',          'int', 'NULL',  '',              '', '',
4141       ],
4142       'primary_key'  => 'nasnum',
4143       'unique'       => [ [ 'nasname' ], ],
4144       'index'        => [],
4145       'foreign_keys' => [
4146                           { columns    => [ 'svcnum' ],
4147                             table      => 'svc_broadband',#no? could be _acct?
4148                                                           #remove or cust_svc?
4149                           },
4150                         ],
4151     },
4152
4153     'export_nas' => {
4154       'columns' => [
4155         'exportnasnum', 'serial', '', '', '', '', 
4156         'exportnum',       'int', '', '', '', '', 
4157         'nasnum',          'int', '', '', '', '', 
4158       ],
4159       'primary_key'  => 'exportnasnum',
4160       'unique'       => [ [ 'exportnum', 'nasnum' ] ],
4161       'index'        => [ [ 'exportnum' ], [ 'nasnum' ] ],
4162       'foreign_keys' => [
4163                           { columns    => [ 'exportnum' ],
4164                             table      => 'part_export',
4165                           },
4166                           { columns    => [ 'nasnum' ],
4167                             table      => 'nas',
4168                           },
4169                         ],
4170     },
4171
4172     'queue' => {
4173       'columns' => [
4174         'jobnum',   'bigserial',     '',      '', '', '', 
4175         'job',        'varchar',     '',     512, '', '', 
4176         '_date',          'int',     '',      '', '', '', 
4177         'status',     'varchar',     '', $char_d, '', '', 
4178         'statustext',    'text', 'NULL',      '', '', '', 
4179         'svcnum',         'int', 'NULL',      '', '', '', 
4180         'custnum',        'int', 'NULL',      '', '', '',
4181         'secure',        'char', 'NULL',       1, '', '',
4182         'priority',       'int', 'NULL',      '', '', '',
4183       ],
4184       'primary_key'  => 'jobnum',
4185       'unique'       => [],
4186       'index'        => [ [ 'secure' ], [ 'priority' ],
4187                           [ 'job' ], [ 'svcnum' ], [ 'custnum' ], [ 'status' ],
4188                         ],
4189       'foreign_keys' => [
4190 #                          { columns    => [ 'svcnum' ],
4191 #                            table      => 'cust_svc',
4192 #                          },
4193                           { columns    => [ 'custnum' ],
4194                             table      => 'cust_main',
4195                           },
4196                         ],
4197     },
4198
4199     'queue_arg' => {
4200       'columns' => [
4201         'argnum', 'bigserial',     '', '', '', '', 
4202         'jobnum',    'bigint',     '', '', '', '', 
4203         'frozen',      'char', 'NULL',  1, '', '',
4204         'arg',         'text', 'NULL', '', '', '', 
4205       ],
4206       'primary_key'  => 'argnum',
4207       'unique'       => [],
4208       'index'        => [ [ 'jobnum' ] ],
4209       'foreign_keys' => [
4210                           { columns    => [ 'jobnum' ],
4211                             table      => 'queue',
4212                             on_delete  => 'CASCADE',
4213                           },
4214                         ],
4215     },
4216
4217     'queue_depend' => {
4218       'columns' => [
4219         'dependnum',  'bigserial', '', '', '', '', 
4220         'jobnum',        'bigint', '', '', '', '', 
4221         'depend_jobnum', 'bigint', '', '', '', '', 
4222       ],
4223       'primary_key'  => 'dependnum',
4224       'unique'       => [],
4225       'index'        => [ [ 'jobnum' ], [ 'depend_jobnum' ] ],
4226       'foreign_keys' => [
4227                           { columns    => [ 'jobnum' ],
4228                             table      => 'queue',
4229                           },
4230                           { columns    => [ 'depend_jobnum' ],
4231                             table      => 'queue',
4232                             references => [ 'jobnum' ],
4233                             on_delete  => 'CASCADE',
4234                           },
4235                         ],
4236     },
4237
4238     'queue_stat' => {
4239       'columns' => [
4240         'statnum', 'bigserial',     '',  '', '', '',
4241         'jobnum',     'bigint',     '',  '', '', '',
4242         'job',       'varchar',     '', 512, '', '', 
4243         'custnum',       'int', 'NULL',  '', '', '',
4244         'insert_date', @date_type, '', '',
4245         'start_date',  @date_type, '', '', 
4246         'end_date',    @date_type, '', '', 
4247       ],
4248       'primary_key'  => 'statnum',
4249       'unique'       => [], #[ ['jobnum'] ],
4250       'index'        => [],
4251     },
4252
4253     'export_svc' => {
4254       'columns' => [
4255         'exportsvcnum' => 'serial', '', '', '', '', 
4256         'exportnum'    => 'int', '', '', '', '', 
4257         'svcpart'      => 'int', '', '', '', '', 
4258         'role'         => 'varchar', 'NULL', 16, '', '',
4259       ],
4260       'primary_key'  => 'exportsvcnum',
4261       'unique'       => [ [ 'exportnum', 'svcpart' ] ],
4262       'index'        => [ [ 'exportnum' ], [ 'svcpart' ] ],
4263       'foreign_keys' => [
4264                           { columns    => [ 'exportnum' ],
4265                             table      => 'part_export',
4266                           },
4267                           { columns    => [ 'svcpart' ],
4268                             table      => 'part_svc',
4269                           },
4270                         ],
4271     },
4272
4273     'export_device' => {
4274       'columns' => [
4275         'exportdevicenum' => 'serial', '', '', '', '', 
4276         'exportnum'       => 'int', '', '', '', '', 
4277         'devicepart'      => 'int', '', '', '', '', 
4278       ],
4279       'primary_key'  => 'exportdevicenum',
4280       'unique'       => [ [ 'exportnum', 'devicepart' ] ],
4281       'index'        => [ [ 'exportnum' ], [ 'devicepart' ] ],
4282       'foreign_keys' => [
4283                           { columns    => [ 'exportnum' ],
4284                             table      => 'part_export',
4285                           },
4286                           { columns    => [ 'devicepart' ],
4287                             table      => 'part_device',
4288                           },
4289                         ],
4290     },
4291
4292     'part_export' => {
4293       'columns' => [
4294         'exportnum',   'serial',     '',      '', '', '', 
4295         'exportname', 'varchar', 'NULL', $char_d, '', '',
4296         'machine',    'varchar', 'NULL', $char_d, '', '',
4297         'exporttype', 'varchar',     '', $char_d, '', '', 
4298         'nodomain',      'char', 'NULL',       1, '', '', 
4299         'default_machine','int', 'NULL',      '', '', '',
4300       ],
4301       'primary_key'  => 'exportnum',
4302       'unique'       => [],
4303       'index'        => [ [ 'machine' ], [ 'exporttype' ] ],
4304       'foreign_keys' => [
4305                           { columns    => [ 'default_machine' ],
4306                             table      => 'part_export_machine',
4307                             references => [ 'machinenum' ]
4308                           },
4309                         ],
4310     },
4311
4312     'part_export_option' => {
4313       'columns' => [
4314         'optionnum', 'serial', '', '', '', '', 
4315         'exportnum', 'int', '', '', '', '', 
4316         'optionname', 'varchar', '', $char_d, '', '', 
4317         'optionvalue', 'text', 'NULL', '', '', '', 
4318       ],
4319       'primary_key'  => 'optionnum',
4320       'unique'       => [],
4321       'index'        => [ [ 'exportnum' ], [ 'optionname' ] ],
4322       'foreign_keys' => [
4323                           { columns    => [ 'exportnum' ],
4324                             table      => 'part_export',
4325                           },
4326                         ],
4327     },
4328
4329     'radius_usergroup' => {
4330       'columns' => [
4331         'usergroupnum', 'serial', '', '', '', '', 
4332         'svcnum',       'int', '', '', '', '', 
4333         'groupname',    'varchar', 'NULL', $char_d, '', '', #deprecated
4334         'groupnum',     'int', 'NULL', '', '', '', 
4335       ],
4336       'primary_key'  => 'usergroupnum',
4337       'unique'       => [],
4338       'index'        => [ [ 'svcnum' ], [ 'groupname' ] ],
4339       'foreign_keys' => [
4340                           { columns    => [ 'svcnum' ],
4341                             table      => 'cust_svc', #svc_acct / svc_broadband
4342                           },
4343                           { columns    => [ 'groupnum' ],
4344                             table      => 'radius_group',
4345                           },
4346                         ],
4347     },
4348
4349     'radius_group' => {
4350       'columns' => [
4351         'groupnum', 'serial', '', '', '', '', 
4352         'groupname',    'varchar', '', $char_d, '', '', 
4353         'description',  'varchar', 'NULL', $char_d, '', '', 
4354         'priority', 'int', '', '', '1', '',
4355         'speed_up', 'int', 'NULL', '', '', '',
4356         'speed_down', 'int', 'NULL', '', '', '',
4357       ],
4358       'primary_key' => 'groupnum',
4359       'unique'      => [ ['groupname'] ],
4360       'index'       => [],
4361     },
4362
4363     'radius_attr' => {
4364       'columns' => [
4365         'attrnum',   'serial', '',      '', '', '',
4366         'groupnum',     'int', '',      '', '', '',
4367         'attrname', 'varchar', '', $char_d, '', '',
4368         'value',    'varchar', '',     255, '', '',
4369         'attrtype',    'char', '',       1, '', '',
4370         'op',          'char', '',       2, '', '',
4371       ],
4372       'primary_key'  => 'attrnum',
4373       'unique'       => [],
4374       'index'        => [ ['groupnum'], ],
4375       'foreign_keys' => [
4376                           { columns    => [ 'groupnum' ],
4377                             table      => 'radius_group',
4378                           },
4379                         ],
4380     },
4381
4382     'msgcat' => {
4383       'columns' => [
4384         'msgnum', 'serial', '', '', '', '', 
4385         'msgcode', 'varchar', '', 255, '', '', 
4386         'locale', 'varchar', '', 16, '', '', 
4387         'msg', 'text', '', '', '', '', 
4388       ],
4389       'primary_key' => 'msgnum',
4390       'unique'      => [ [ 'msgcode', 'locale' ] ],
4391       'index'       => [],
4392     },
4393
4394     'cust_tax_exempt' => {
4395       'columns' => [
4396         'exemptnum', 'serial', '', '', '', '', 
4397         'custnum',   'int', '', '', '', '', 
4398         'taxnum',    'int', '', '', '', '', 
4399         'year',      'int', '', '', '', '', 
4400         'month',     'int', '', '', '', '', 
4401         'amount',   @money_type, '', '', 
4402       ],
4403       'primary_key'  => 'exemptnum',
4404       'unique'       => [ [ 'custnum', 'taxnum', 'year', 'month' ] ],
4405       'index'        => [],
4406       'foreign_keys' => [
4407                           { columns    => [ 'custnum' ],
4408                             table      => 'cust_main',
4409                           },
4410                           { columns    => [ 'taxnum' ],
4411                             table      => 'cust_main_county',
4412                           },
4413                         ],
4414     },
4415
4416     'cust_tax_exempt_pkg' => {
4417       'columns' => [
4418         'exemptpkgnum',  'serial', '', '', '', '', 
4419         #'custnum',      'int', '', '', '', ''
4420         'billpkgnum',   'int', '', '', '', '', 
4421         'taxnum',       'int', '', '', '', '', 
4422         'year',         'int', 'NULL', '', '', '', 
4423         'month',        'int', 'NULL', '', '', '', 
4424         'creditbillpkgnum', 'int', 'NULL', '', '', '',
4425         'amount',       @money_type, '', '', 
4426         # exemption type flags
4427         'exempt_cust',          'char', 'NULL', 1, '', '',
4428         'exempt_setup',         'char', 'NULL', 1, '', '',
4429         'exempt_recur',         'char', 'NULL', 1, '', '',
4430         'exempt_cust_taxname',  'char', 'NULL', 1, '', '',
4431         'exempt_monthly',       'char', 'NULL', 1, '', '',
4432       ],
4433       'primary_key'  => 'exemptpkgnum',
4434       'unique'       => [],
4435       'index'        => [ [ 'taxnum', 'year', 'month' ],
4436                           [ 'billpkgnum' ],
4437                           [ 'taxnum' ],
4438                           [ 'creditbillpkgnum' ],
4439                         ],
4440       'foreign_keys' => [
4441                           { columns    => [ 'billpkgnum' ],
4442                             table      => 'cust_bill_pkg',
4443                           },
4444                           { columns    => [ 'taxnum' ],
4445                             table      => 'cust_main_county',
4446                           },
4447                           { columns    => [ 'creditbillpkgnum' ],
4448                             table      => 'cust_credit_bill_pkg',
4449                           },
4450                         ],
4451     },
4452
4453     'cust_tax_exempt_pkg_void' => {
4454       'columns' => [
4455         'exemptpkgnum',  'int', '', '', '', '', 
4456         #'custnum',      'int', '', '', '', ''
4457         'billpkgnum',   'int', '', '', '', '', 
4458         'taxnum',       'int', '', '', '', '', 
4459         'year',         'int', 'NULL', '', '', '', 
4460         'month',        'int', 'NULL', '', '', '', 
4461         'creditbillpkgnum', 'int', 'NULL', '', '', '',
4462         'amount',       @money_type, '', '', 
4463         # exemption type flags
4464         'exempt_cust',          'char', 'NULL', 1, '', '',
4465         'exempt_setup',         'char', 'NULL', 1, '', '',
4466         'exempt_recur',         'char', 'NULL', 1, '', '',
4467         'exempt_cust_taxname',  'char', 'NULL', 1, '', '',
4468         'exempt_monthly',       'char', 'NULL', 1, '', '',
4469       ],
4470       'primary_key'  => 'exemptpkgnum',
4471       'unique'       => [],
4472       'index'        => [ [ 'taxnum', 'year', 'month' ],
4473                           [ 'billpkgnum' ],
4474                           [ 'taxnum' ],
4475                           [ 'creditbillpkgnum' ],
4476                         ],
4477       'foreign_keys' => [
4478                           { columns    => [ 'billpkgnum' ],
4479                             table      => 'cust_bill_pkg_void',
4480                           },
4481                           { columns    => [ 'taxnum' ],
4482                             table      => 'cust_main_county',
4483                           },
4484                           { columns    => [ 'creditbillpkgnum' ],
4485                             table      => 'cust_credit_bill_pkg',
4486                           },
4487                         ],
4488     },
4489
4490     'router' => {
4491       'columns' => [
4492         'routernum', 'serial', '', '', '', '', 
4493         'routername', 'varchar', '', $char_d, '', '', 
4494         'svcnum', 'int', 'NULL', '', '', '', 
4495         'agentnum',   'int', 'NULL', '', '', '', 
4496         'manual_addr', 'char', 'NULL', 1, '', '',
4497       ],
4498       'primary_key'  => 'routernum',
4499       'unique'       => [],
4500       'index'        => [],
4501       'foreign_keys' => [
4502                           { columns    => [ 'svcnum' ],
4503                             table      => 'cust_svc', #svc_acct / svc_broadband
4504                           },
4505                           { columns    => [ 'agentnum' ],
4506                             table      => 'agent',
4507                           },
4508                         ],
4509     },
4510
4511     'part_svc_router' => {
4512       'columns' => [
4513         'svcrouternum', 'serial', '', '', '', '', 
4514         'svcpart', 'int', '', '', '', '', 
4515         'routernum', 'int', '', '', '', '', 
4516       ],
4517       'primary_key'  => 'svcrouternum',
4518       'unique'       => [],
4519       'index'        => [],
4520       'foreign_keys' => [
4521                           { columns    => [ 'svcpart' ],
4522                             table      => 'part_svc',
4523                           },
4524                           { columns    => [ 'routernum' ],
4525                             table      => 'router',
4526                           },
4527                         ],
4528     },
4529
4530     'addr_block' => {
4531       'columns' => [
4532         'blocknum', 'serial', '', '', '', '', 
4533         'routernum', 'int', '', '', '', '', 
4534         'ip_gateway', 'varchar', '', 15, '', '', 
4535         'ip_netmask', 'int', '', '', '', '', 
4536         'agentnum',   'int', 'NULL', '', '', '', 
4537         'manual_flag', 'char', 'NULL', 1, '', '', 
4538       ],
4539       'primary_key'  => 'blocknum',
4540       'unique'       => [ [ 'blocknum', 'routernum' ] ],
4541       'index'        => [],
4542       'foreign_keys' => [
4543                           #{ columns    => [ 'routernum' ],
4544                           #   table      => 'router',
4545                           #},
4546                           { columns    => [ 'agentnum' ],
4547                             table      => 'agent',
4548                           },
4549                         ],
4550     },
4551
4552     'addr_range' => {
4553       'columns' => [
4554         'rangenum', 'serial', '', '', '', '',
4555         'start',    'varchar', '', 15, '', '',
4556         'length',   'int', '', '', '', '',
4557         'status',   'varchar', 'NULL', 32, '', '',
4558       ],
4559       'primary_key' => 'rangenum',
4560       'unique'      => [],
4561       'index'       => [],
4562     },
4563
4564     'svc_broadband' => {
4565       'columns' => [
4566         'svcnum',                  'int',     '',        '', '', '', 
4567         'description',         'varchar', 'NULL',   $char_d, '', '', 
4568         'routernum',               'int', 'NULL',        '', '', '',
4569         'blocknum',                'int', 'NULL',        '', '', '', 
4570         'sectornum',               'int', 'NULL',        '', '', '',
4571         'speed_up',                'int', 'NULL',        '', '', '', 
4572         'speed_down',              'int', 'NULL',        '', '', '', 
4573         'ip_addr',             'varchar', 'NULL',        15, '', '', 
4574         'mac_addr',            'varchar', 'NULL',        12, '', '', 
4575         'authkey',             'varchar', 'NULL',        32, '', '', 
4576         'latitude',            'decimal', 'NULL',    '10,7', '', '', 
4577         'longitude',           'decimal', 'NULL',    '10,7', '', '', 
4578         'altitude',            'decimal', 'NULL',        '', '', '', 
4579         'vlan_profile',        'varchar', 'NULL',   $char_d, '', '', 
4580         'performance_profile', 'varchar', 'NULL',   $char_d, '', '',
4581         'plan_id',             'varchar', 'NULL',   $char_d, '', '',
4582         'radio_serialnum',     'varchar', 'NULL',   $char_d, '', '',
4583         'radio_location',      'varchar', 'NULL', 2*$char_d, '', '',
4584         'poe_location',        'varchar', 'NULL', 2*$char_d, '', '',
4585         'rssi',                    'int', 'NULL',        '', '', '',
4586         'suid',                    'int', 'NULL',        '', '', '',
4587         'shared_svcnum',           'int', 'NULL',        '', '', '',
4588         'serviceid',           'varchar', 'NULL',        64, '', '',#srvexport/reportfields
4589       ],
4590       'primary_key'  => 'svcnum',
4591       'unique'       => [ [ 'ip_addr' ], [ 'mac_addr' ] ],
4592       'index'        => [],
4593       'foreign_keys' => [
4594                           { columns    => [ 'svcnum' ],
4595                             table      => 'cust_svc',
4596                           },
4597                           { columns    => [ 'routernum' ],
4598                             table      => 'router',
4599                           },
4600                           { columns    => [ 'blocknum' ],
4601                             table      => 'addr_block',
4602                           },
4603                           { columns    => [ 'sectornum' ],
4604                             table      => 'tower_sector',
4605                           },
4606                           { columns    => [ 'shared_svcnum' ],
4607                             table      => 'svc_broadband',
4608                             references => [ 'svcnum' ],
4609                           },
4610                         ],
4611     },
4612
4613     'tower' => {
4614       'columns' => [
4615         'towernum',    'serial',     '',      '', '', '',
4616         #'agentnum',       'int', 'NULL',      '', '', '',
4617         'towername',  'varchar',     '', $char_d, '', '',
4618         'disabled',      'char', 'NULL',       1, '', '',
4619         'latitude',   'decimal', 'NULL',  '10,7', '', '', 
4620         'longitude',  'decimal', 'NULL',  '10,7', '', '', 
4621         'coord_auto',    'char', 'NULL',       1, '', '',
4622         'altitude',   'decimal', 'NULL',      '', '', '', 
4623         'height',     'decimal', 'NULL',      '', '', '', 
4624         'veg_height', 'decimal', 'NULL',      '', '', '', 
4625         'color',      'varchar', 'NULL',       6, '', '',
4626       ],
4627       'primary_key' => 'towernum',
4628       'unique'      => [ [ 'towername' ] ], # , 'agentnum' ] ],
4629       'index'       => [],
4630     },
4631
4632     'tower_sector' => {
4633       'columns' => [
4634         'sectornum',     'serial',     '',      '', '', '',
4635         'towernum',         'int',     '',      '', '', '',
4636         'sectorname',   'varchar',     '', $char_d, '', '',
4637         'ip_addr',      'varchar', 'NULL',      15, '', '',
4638         'height',       'decimal', 'NULL',      '', '', '', 
4639         'freq_mhz',         'int', 'NULL',      '', '', '',
4640         'direction',        'int', 'NULL',      '', '', '',
4641         'width',            'int', 'NULL',      '', '', '',
4642         #downtilt etc? rfpath has profile files for devices/antennas you upload?
4643         'sector_range', 'decimal', 'NULL',      '', '', '',  #?
4644       ],
4645       'primary_key'  => 'sectornum',
4646       'unique'       => [ [ 'towernum', 'sectorname' ], [ 'ip_addr' ], ],
4647       'index'        => [ [ 'towernum' ] ],
4648       'foreign_keys' => [
4649                           { columns    => [ 'towernum' ],
4650                             table      => 'tower',
4651                           },
4652                         ],
4653     },
4654
4655     'part_virtual_field' => {
4656       'columns' => [
4657         'vfieldpart', 'serial', '', '', '', '', 
4658         'dbtable', 'varchar', '', 32, '', '', 
4659         'name', 'varchar', '', 32, '', '', 
4660         'length', 'int', 'NULL', '', '', '', 
4661         'label', 'varchar', 'NULL', 80, '', '', 
4662       ],
4663       'primary_key' => 'vfieldpart',
4664       'unique' => [],
4665       'index' => [],
4666     },
4667
4668     'virtual_field' => {
4669       'columns' => [
4670         'vfieldnum', 'serial', '', '', '', '', 
4671         'recnum', 'int', '', '', '', '', 
4672         'vfieldpart', 'int', '', '', '', '', 
4673         'value', 'varchar', '', 128, '', '', 
4674       ],
4675       'primary_key'  => 'vfieldnum',
4676       'unique'       => [ [ 'vfieldpart', 'recnum' ] ],
4677       'index'        => [],
4678       'foreign_keys' => [
4679                           { columns    => [ 'vfieldpart' ],
4680                             table      => 'part_virtual_field',
4681                           },
4682                         ],
4683     },
4684
4685     'acct_snarf' => {
4686       'columns' => [
4687         'snarfnum',    'serial',     '',      '', '', '', 
4688         'snarfname',  'varchar', 'NULL', $char_d, '', '', 
4689         'svcnum',         'int',     '',      '', '', '', 
4690         'machine',    'varchar',     '',     255, '', '', 
4691         'protocol',   'varchar',     '', $char_d, '', '', 
4692         'username',   'varchar',     '', $char_d, '', '', 
4693         '_password',  'varchar',     '', $char_d, '', '', 
4694         'check_freq',     'int', 'NULL',      '', '', '', 
4695         'leavemail',     'char', 'NULL',       1, '', '', 
4696         'apop',          'char', 'NULL',       1, '', '', 
4697         'tls',           'char', 'NULL',       1, '', '', 
4698         'mailbox',    'varchar', 'NULL', $char_d, '', '', 
4699       ],
4700       'primary_key'  => 'snarfnum',
4701       'unique'       => [],
4702       'index'        => [ [ 'svcnum' ] ],
4703       'foreign_keys' => [
4704                           { columns    => [ 'svcnum' ],
4705                             table      => 'svc_acct',
4706                           },
4707                         ],
4708     },
4709
4710     'svc_external' => {
4711       'columns' => [
4712         'svcnum',     'int',     '',      '', '', '', 
4713         'id',      'bigint', 'NULL',      '', '', '', 
4714         'title',  'varchar', 'NULL', $char_d, '', '', 
4715       ],
4716       'primary_key'  => 'svcnum',
4717       'unique'       => [],
4718       'index'        => [],
4719       'foreign_keys' => [
4720                           { columns    => [ 'svcnum' ],
4721                             table      => 'cust_svc',
4722                           },
4723                         ],
4724     },
4725
4726     'cust_pay_refund' => {
4727       'columns' => [
4728         'payrefundnum', 'serial', '', '', '', '', 
4729         'paynum',  'int', '', '', '', '', 
4730         'refundnum',  'int', '', '', '', '', 
4731         '_date',    @date_type, '', '', 
4732         'amount',   @money_type, '', '', 
4733       ],
4734       'primary_key'  => 'payrefundnum',
4735       'unique'       => [],
4736       'index'        => [ ['paynum'], ['refundnum'] ],
4737       'foreign_keys' => [
4738                           { columns    => [ 'paynum' ],
4739                             table      => 'cust_pay',
4740                           },
4741                           { columns    => [ 'refundnum' ],
4742                             table      => 'cust_refund',
4743                           },
4744                         ],
4745     },
4746
4747     'part_pkg_option' => {
4748       'columns' => [
4749         'optionnum', 'serial', '', '', '', '', 
4750         'pkgpart', 'int', '', '', '', '', 
4751         'optionname', 'varchar', '', $char_d, '', '', 
4752         'optionvalue', 'text', 'NULL', '', '', '', 
4753       ],
4754       'primary_key'  => 'optionnum',
4755       'unique'       => [],
4756       'index'        => [ [ 'pkgpart' ], [ 'optionname' ] ],
4757       'foreign_keys' => [
4758                           { columns    => [ 'pkgpart' ],
4759                             table      => 'part_pkg',
4760                           },
4761                         ],
4762     },
4763
4764     'part_pkg_vendor' => {
4765       'columns' => [
4766         'num', 'serial', '', '', '', '', 
4767         'pkgpart', 'int', '', '', '', '', 
4768         'exportnum', 'int', '', '', '', '', 
4769         'vendor_pkg_id', 'varchar', '', $char_d, '', '', 
4770       ],
4771       'primary_key'  => 'num',
4772       'unique'       => [ [ 'pkgpart', 'exportnum' ] ],
4773       'index'        => [ [ 'pkgpart' ] ],
4774       'foreign_keys' => [
4775                           { columns    => [ 'pkgpart' ],
4776                             table      => 'part_pkg',
4777                           },
4778                           { columns    => [ 'exportnum' ],
4779                             table      => 'part_export',
4780                           },
4781                         ],
4782     },
4783
4784     'part_pkg_report_option' => {
4785       'columns' => [
4786         'num',      'serial',   '',      '', '', '', 
4787         'name',     'varchar',  '', $char_d, '', '', 
4788         'disabled', 'char', 'NULL',       1, '', '', 
4789       ],
4790       'primary_key' => 'num',
4791       'unique' => [ [ 'name' ] ],
4792       'index' => [ [ 'disabled' ] ],
4793     },
4794
4795     'part_pkg_usage' => {
4796       'columns' => [
4797         'pkgusagepart', 'serial',   '', '', '', '',
4798         'pkgpart',  'int',      '', '', '', '',
4799         'minutes',  'double precision',      '', '', '', '',
4800         'priority', 'int',  'NULL', '', '', '',
4801         'shared',   'char', 'NULL',  1, '', '',
4802         'rollover', 'char', 'NULL',  1, '', '',
4803         'description',  'varchar', 'NULL', $char_d, '', '',
4804       ],
4805       'primary_key'  => 'pkgusagepart',
4806       'unique'       => [],
4807       'index'        => [ [ 'pkgpart' ] ],
4808       'foreign_keys' => [
4809                           { columns    => [ 'pkgpart' ],
4810                             table      => 'part_pkg',
4811                           },
4812                         ],
4813     },
4814
4815     'part_pkg_usage_class' => {
4816       'columns' => [
4817         'num',       'serial',  '', '', '', '',
4818         'pkgusagepart', 'int',  '', '', '', '',
4819         'classnum',     'int','NULL', '', '', '',
4820       ],
4821       'primary_key'  => 'num',
4822       'unique'       => [ [ 'pkgusagepart', 'classnum' ] ],
4823       'index'        => [],
4824       'foreign_keys' => [
4825                           { columns    => [ 'pkgusagepart' ],
4826                             table      => 'part_pkg_usage',
4827                           },
4828                           { columns    => [ 'classnum' ],
4829                             table      => 'usage_class',
4830                           },
4831                         ],
4832     },
4833
4834     'part_pkg_fcc_option' => {
4835       'columns' => [
4836         'num',        'serial', '', '', '', '',
4837         'fccoptionname', 'varchar', '', $char_d, '', '',
4838         'pkgpart',       'int', '', '', '', '',
4839         'optionvalue',   'varchar', 'NULL', $char_d, '', '',
4840       ],
4841       'primary_key' => 'num',
4842       'unique'      => [ [ 'fccoptionname', 'pkgpart' ] ],
4843       'index'       => [],
4844     },
4845
4846     'rate' => {
4847       'columns' => [
4848         'ratenum',          'serial',     '', '', '', '', 
4849         'ratename',        'varchar', '',$char_d, '', '', 
4850         'agentnum',            'int', 'NULL', '', '', '',
4851         'default_detailnum',   'int', 'NULL', '', '', '',
4852       ],
4853       'primary_key' => 'ratenum',
4854       'unique'      => [],
4855       'index'       => [],
4856       'foreign_keys' => [
4857                           { columns    => [ 'agentnum' ],
4858                             table      => 'agent',
4859                           },
4860                         ],
4861     },
4862
4863     'rate_detail' => {
4864       'columns' => [
4865         'ratedetailnum',   'serial',  '',     '',      '', '', 
4866         'ratenum',         'int',     '',     '',      '', '', 
4867         'orig_regionnum',  'int', 'NULL',     '',      '', '', 
4868         'dest_regionnum',  'int', 'NULL',     '',      '', '', 
4869         'min_included',    'int',     '',     '',      '', '', 
4870         'conn_charge',     'decimal', '', '10,4', '0.0000', '',
4871         'conn_cost',       'decimal', '', '10,4', '0.0000', '',
4872         'conn_sec',        'int',     '',     '',      '0', '',
4873         'min_charge',      'decimal', '', '10,5',       '', '',
4874         'min_cost',        'decimal', '', '10,5','0.00000', '',
4875         'sec_granularity', 'int',     '',     '',       '', '', 
4876         'ratetimenum',     'int', 'NULL',     '',       '', '',
4877         'classnum',        'int', 'NULL',     '',       '', '', 
4878         'cdrtypenum',      'int', 'NULL',     '',       '', '',
4879         'region_group',   'char', 'NULL',      1,       '', '', 
4880         'upstream_mult_charge',  'decimal',  '', '10,4', '0.0000', '',
4881         'upstream_mult_cost',    'decimal',  '', '10,4', '0.0000', '',
4882       ],
4883       'primary_key'  => 'ratedetailnum',
4884       'unique'       => [ [ 'ratenum', 'orig_regionnum', 'dest_regionnum' ] ],
4885       'index'        => [ [ 'ratenum', 'dest_regionnum' ],
4886                           [ 'ratenum', 'ratetimenum' ]
4887                         ],
4888       'foreign_keys' => [
4889                           { columns    => [ 'ratenum' ],
4890                             table      => 'rate',
4891                           },
4892                           { columns    => [ 'orig_regionnum' ],
4893                             table      => 'rate_region',
4894                             references => [ 'regionnum' ],
4895                           },
4896                           { columns    => [ 'dest_regionnum' ],
4897                             table      => 'rate_region',
4898                             references => [ 'regionnum' ],
4899                           },
4900                           { columns    => [ 'ratetimenum' ],
4901                             table      => 'rate_time',
4902                           },
4903                           { columns    => [ 'classnum' ],
4904                             table      => 'usage_class',
4905                           },
4906                           { columns    => [ 'cdrtypenum' ],
4907                             table      => 'cdr_type',
4908                           },
4909                         ],
4910     },
4911
4912     'rate_region' => {
4913       'columns' => [
4914         'regionnum',   'serial',      '', '', '', '', 
4915         'regionname',  'varchar',     '', $char_d, '', '', 
4916         'exact_match', 'char',    'NULL',  1, '', '',
4917       ],
4918       'primary_key' => 'regionnum',
4919       'unique'      => [],
4920       'index'       => [],
4921     },
4922
4923     'rate_prefix' => {
4924       'columns' => [
4925         'prefixnum',   'serial',      '', '', '', '', 
4926         'regionnum',   'int',         '', '', '', '', 
4927         'countrycode', 'varchar',     '',  3, '', '', 
4928         'npa',         'varchar', 'NULL', 10, '', '', #actually the whole prefix
4929         'nxx',         'varchar', 'NULL',  3, '', '', #actually not used
4930         'latanum',     'int',     'NULL',      '', '', '',
4931         'state',       'char',    'NULL',       2, '', '', 
4932         'ocn',         'char',    'NULL',       4, '', '', 
4933       ],
4934       'primary_key'  => 'prefixnum',
4935       'unique'       => [],
4936       'index'        => [ [ 'countrycode' ], [ 'npa' ], [ 'regionnum' ] ],
4937       'foreign_keys' => [
4938                           { columns    => [ 'regionnum' ],
4939                             table      => 'rate_region',
4940                           },
4941                           { columns    => [ 'latanum' ],
4942                             table      => 'lata',
4943                           },
4944                         ],
4945     },
4946
4947     'rate_time' => {
4948       'columns' => [
4949         'ratetimenum', 'serial',      '',      '', '', '',
4950         'ratetimename',   'varchar',      '', $char_d, '', '',
4951       ],
4952       'primary_key' => 'ratetimenum',
4953       'unique'      => [],
4954       'index'       => [],
4955     },
4956
4957     'rate_time_interval' => {
4958       'columns' => [
4959         'intervalnum', 'serial', '', '', '', '',
4960         'stime',          'int', '', '', '', '',
4961         'etime',          'int', '', '', '', '',
4962         'ratetimenum',    'int', '', '', '', '',
4963       ],
4964       'primary_key'  => 'intervalnum',
4965       'unique'       => [],
4966       'index'        => [],
4967       'foreign_keys' => [
4968                           { columns    => [ 'ratetimenum' ],
4969                             table      => 'rate_time',
4970                           },
4971                         ],
4972      },
4973
4974     #not really part of the above rate_ stuff (used with flat rate rather than
4975     # rated billing), but could be eventually, and its a rate
4976     'rate_tier' => {
4977       'columns' => [
4978         'tiernum',   'serial', '',      '', '', '',
4979         'tiername', 'varchar', '', $char_d, '', '',
4980       ],
4981       'primary_key' => 'tiernum',
4982       'unique'      => [ [ 'tiername'], ],
4983       'index'       => [],
4984     },
4985
4986     'rate_tier_detail' => {
4987       'columns' => [
4988         'tierdetailnum', 'serial', '',     '', '', '',
4989         'tiernum',          'int', '',     '', '', '',
4990         'min_quan',         'int', '',     '', '', '',
4991         'min_charge',   'decimal', '', '10,4', '', '',
4992       ],
4993       'primary_key'  => 'tierdetailnum',
4994       'unique'       => [],
4995       'index'        => [ ['tiernum'], ],
4996       'foreign_keys' => [
4997                           { columns    => [ 'tiernum' ],
4998                             table      => 'rate_tier',
4999                           },
5000                         ],
5001     },
5002
5003     'usage_class' => {
5004       'columns' => [
5005         'classnum',    'serial',      '',      '', '', '', 
5006         'weight',      'int',     'NULL',      '', '', '',
5007         'classname',   'varchar',     '', $char_d, '', '', 
5008         'format',      'varchar', 'NULL', $char_d, '', '', 
5009         'disabled',    'char',    'NULL',       1, '', '', 
5010       ],
5011       'primary_key' => 'classnum',
5012       'unique' => [],
5013       'index' => [ ['disabled'] ],
5014     },
5015
5016     'reg_code' => {
5017       'columns' => [
5018         'codenum',   'serial',    '', '', '', '', 
5019         'code',      'varchar',   '', $char_d, '', '', 
5020         'agentnum',  'int',       '', '', '', '', 
5021       ],
5022       'primary_key'  => 'codenum',
5023       'unique'       => [ [ 'agentnum', 'code' ] ],
5024       'index'        => [ [ 'agentnum' ] ],
5025       'foreign_keys' => [
5026                           { columns    => [ 'agentnum' ],
5027                             table      => 'agent',
5028                           },
5029                         ],
5030      },
5031
5032     'reg_code_pkg' => {
5033       'columns' => [
5034         'codepkgnum', 'serial', '', '', '', '', 
5035         'codenum',   'int',    '', '', '', '', 
5036         'pkgpart',   'int',    '', '', '', '', 
5037       ],
5038       'primary_key'  => 'codepkgnum',
5039       'unique'       => [ [ 'codenum', 'pkgpart' ] ],
5040       'index'        => [ [ 'codenum' ] ],
5041       'foreign_keys' => [
5042                           { columns    => [ 'codenum' ],
5043                             table      => 'reg_code',
5044                           },
5045                           { columns    => [ 'pkgpart' ],
5046                             table      => 'part_pkg',
5047                           },
5048                         ],
5049     },
5050
5051     'clientapi_session' => {
5052       'columns' => [
5053         'sessionnum',  'serial',  '', '', '', '', 
5054         'sessionid',  'varchar',  '', $char_d, '', '', 
5055         'namespace',  'varchar',  '', $char_d, '', '', 
5056       ],
5057       'primary_key' => 'sessionnum',
5058       'unique'      => [ [ 'sessionid', 'namespace' ] ],
5059       'index'       => [],
5060     },
5061
5062     'clientapi_session_field' => {
5063       'columns' => [
5064         'fieldnum',    'serial',     '', '', '', '', 
5065         'sessionnum',     'int',     '', '', '', '', 
5066         'fieldname',  'varchar',     '', $char_d, '', '', 
5067         'fieldvalue',    'text', 'NULL', '', '', '', 
5068       ],
5069       'primary_key'  => 'fieldnum',
5070       'unique'       => [ [ 'sessionnum', 'fieldname' ] ],
5071       'index'        => [],
5072       'foreign_keys' => [
5073                           { columns    => [ 'sessionnum' ],
5074                             table      => 'clientapi_session',
5075                           },
5076                         ],
5077     },
5078
5079     'payment_gateway' => {
5080       'columns' => [
5081         'gatewaynum',       'serial',   '',     '', '', '', 
5082         'gateway_namespace','varchar',  'NULL', $char_d, '', '', 
5083         'gateway_module',   'varchar',  '',     $char_d, '', '', 
5084         'gateway_username', 'varchar',  'NULL', $char_d, '', '', 
5085         'gateway_password', 'varchar',  'NULL', $char_d, '', '', 
5086         'gateway_action',   'varchar',  'NULL', $char_d, '', '', 
5087         'gateway_callback_url', 'varchar',  'NULL', 255, '', '', 
5088         'gateway_cancel_url',   'varchar',  'NULL', 255, '', '',
5089         'disabled',   'char',  'NULL',   1, '', '', 
5090       ],
5091       'primary_key' => 'gatewaynum',
5092       'unique' => [],
5093       'index'  => [ [ 'disabled' ] ],
5094     },
5095
5096     'payment_gateway_option' => {
5097       'columns' => [
5098         'optionnum',   'serial',  '',     '', '', '', 
5099         'gatewaynum',  'int',     '',     '', '', '', 
5100         'optionname',  'varchar', '',     $char_d, '', '', 
5101         'optionvalue', 'text',    'NULL', '', '', '', 
5102       ],
5103       'primary_key'  => 'optionnum',
5104       'unique'       => [],
5105       'index'        => [ [ 'gatewaynum' ], [ 'optionname' ] ],
5106       'foreign_keys' => [
5107                           { columns    => [ 'gatewaynum' ],
5108                             table      => 'payment_gateway',
5109                           },
5110                         ],
5111     },
5112
5113     'agent_payment_gateway' => {
5114       'columns' => [
5115         'agentgatewaynum', 'serial', '', '', '', '', 
5116         'agentnum',        'int', '', '', '', '', 
5117         'gatewaynum',      'int', '', '', '', '', 
5118         'cardtype',        'varchar', 'NULL', $char_d, '', '', 
5119         'taxclass',        'varchar', 'NULL', $char_d, '', '', 
5120       ],
5121       'primary_key'  => 'agentgatewaynum',
5122       'unique'       => [],
5123       'index'        => [ [ 'agentnum', 'cardtype' ], ],
5124
5125       'foreign_keys' => [
5126
5127                           { columns    => [ 'agentnum' ],
5128                             table      => 'agent',
5129                           },
5130                           { columns    => [ 'gatewaynum' ],
5131                             table      => 'payment_gateway',
5132                           },
5133                         ],
5134     },
5135
5136     'banned_pay' => {
5137       'columns' => [
5138         'bannum',  'serial',   '',     '', '', '', 
5139         'payby',   'char',     '',       4, '', '', 
5140         'payinfo', 'varchar',  '',     128, '', '', #say, a 512-big digest _hex encoded
5141         #'paymask', 'varchar',  'NULL', $char_d, '', ''
5142         '_date',            @date_type,         '', '', 
5143         'end_date',         @date_type,         '', '', 
5144         'otaker',  'varchar',  'NULL',      32, '', '', 
5145         'usernum',     'int',  'NULL',      '', '', '',
5146         'bantype', 'varchar',  'NULL', $char_d, '', '',
5147         'reason',  'varchar',  'NULL', $char_d, '', '', 
5148       ],
5149       'primary_key'  => 'bannum',
5150       'unique'       => [],
5151       'index'        => [ [ 'payby', 'payinfo' ], [ 'usernum' ], ],
5152       'foreign_keys' => [
5153                           { columns    => [ 'usernum' ],
5154                             table      => 'access_user',
5155                           },
5156                         ],
5157     },
5158
5159     'pkg_category' => {
5160       'columns' => [
5161         'categorynum',        'serial',     '',      '', '', '', 
5162         'categoryname',      'varchar',     '', $char_d, '', '', 
5163         'weight',                'int', 'NULL',      '', '', '',
5164         'ticketing_queueid',     'int', 'NULL',      '', '', '', 
5165         'condense',             'char', 'NULL',       1, '', '', 
5166         'disabled',             'char', 'NULL',       1, '', '', 
5167       ],
5168       'primary_key' => 'categorynum',
5169       'unique' => [],
5170       'index' => [ ['disabled'] ],
5171     },
5172
5173     'pkg_class' => {
5174       'columns' => [
5175         'classnum',    'serial',   '',      '', '', '', 
5176         'classname',   'varchar',  '', $char_d, '', '', 
5177         'categorynum', 'int',  'NULL',      '', '', '', 
5178         'disabled',    'char', 'NULL',       1, '', '', 
5179         'fcc_ds0s',      'int',     'NULL', '', '', '', 
5180       ],
5181       'primary_key'  => 'classnum',
5182       'unique'       => [],
5183       'index'        => [ ['disabled'] ],
5184       'foreign_keys' => [
5185                           { columns    => [ 'categorynum' ],
5186                             table      => 'pkg_category',
5187                           },
5188                         ],
5189     },
5190
5191     'cdr' => {
5192       'columns' => [
5193         # qw( name type null length default local );
5194
5195         ###
5196         #asterisk fields
5197         ###
5198
5199         'acctid',   'bigserial',  '', '', '', '', 
5200         #'calldate', 'TIMESTAMP with time zone', '', '', \'now()', '',
5201         'calldate', 'timestamp',   '',      '', \'now()', '',
5202         'clid',        'varchar',  '', $char_d, \"''", '', 
5203         'src',         'varchar',  '', $char_d, \"''", '', 
5204         'dst',         'varchar',  '', $char_d, \"''", '', 
5205         'dcontext',    'varchar',  '', $char_d, \"''", '', 
5206         'channel',     'varchar',  '', $char_d, \"''", '', 
5207         'dstchannel',  'varchar',  '', $char_d, \"''", '', 
5208         'lastapp',     'varchar',  '', $char_d, \"''", '', 
5209         'lastdata',    'varchar',  '',     255, \"''", '', 
5210
5211         #currently only opensips & voipswitch
5212         'src_ip_addr', 'varchar',  'NULL',  15,    '', '',
5213
5214         #currently only opensips
5215         'dst_ip_addr', 'varchar',  'NULL',  15,    '', '',
5216
5217         #currently only u4:
5218         # terminating number (as opposed to dialed destination)
5219         'dst_term',    'varchar',  'NULL', $char_d, '', '',
5220
5221         #these don't seem to be logged by most of the SQL cdr_* modules
5222         #except tds under sql-illegal names, so;
5223         # ... don't rely on them for rating?
5224         # and, what they hey, i went ahead and changed the names and data types
5225         # to freeside-style dates...
5226           #'start',  'timestamp', 'NULL',  '',    '', '',
5227           #'answer', 'timestamp', 'NULL',  '',    '', '',
5228           #'end',    'timestamp', 'NULL',  '',    '', '',
5229         'startdate',  @date_type, '', '', 
5230         'answerdate', @date_type, '', '', 
5231         'enddate',    @date_type, '', '', 
5232         #
5233
5234         'duration',    'int',      '',      '',     0, '',
5235         'billsec',     'int',      '',      '',     0, '', 
5236         'disposition', 'varchar',  '',      45, \"''", '',
5237         'amaflags',    'int',      '',      '',     0, '',
5238         'accountcode', 'varchar',  '',      32, \"''", '',
5239         'uniqueid',    'varchar',  '', $char_d, \"''", '',
5240         'userfield',   'varchar',  '',     512, \"''", '',
5241
5242         'max_callers', 'int',  'NULL',      '',    '', '',
5243
5244         ###
5245         # old fields for unitel/RSLCOM/convergent that don't map to asterisk
5246         # ones we adoped moved to "own fields" section below
5247         # charged_party, upstream_price, rated_price, carrierid, cdrtypenum
5248         ###
5249
5250         'upstream_currency',      'char', 'NULL',       3, '', '',
5251         'upstream_rateplanid',     'int', 'NULL',      '', '', '', #?
5252
5253         # how it was rated internally...
5254         'ratedetailnum',           'int', 'NULL',      '', '', '',
5255
5256         'distance',            'decimal', 'NULL',      '', '', '',
5257         'islocal',                 'int', 'NULL',      '', '', '', # '',  '', 0, '' instead?
5258
5259         #cdr_calltype: the big list in appendix 2
5260         'calltypenum',             'int', 'NULL',      '', '', '',
5261
5262         'description',         'varchar', 'NULL', $char_d, '', '',
5263         'quantity',                'int', 'NULL',      '', '', '', 
5264
5265         'upstream_rateid',         'int', 'NULL',      '', '', '',
5266
5267         ###
5268         # more fields, for GSM imports
5269         ###
5270         'servicecode',             'int', 'NULL',      '', '', '',
5271         'quantity_able',           'int', 'NULL',      '', '', '', 
5272
5273         ###
5274         #and now for our own fields
5275         ###
5276
5277         'cdrtypenum',              'int', 'NULL',      '', '', '',
5278
5279         'charged_party',       'varchar', 'NULL', $char_d, '', '',
5280         'charged_party_imsi',  'varchar', 'NULL', $char_d, '', '',
5281
5282         'upstream_price',      'decimal', 'NULL',  '10,5', '', '', 
5283
5284         #currently only voipswitch
5285         #'upstream_rate',      'decimal', 'NULL',  '10,5', '', '', 
5286
5287         'upstream_src_regionname', 'varchar', 'NULL', $char_d, '', '',
5288         'upstream_dst_regionname', 'varchar', 'NULL', $char_d, '', '',
5289
5290         # how it was rated internally...
5291         'rated_pretty_dst',       'varchar', 'NULL', $char_d, '', '',
5292         'rated_regionname',       'varchar', 'NULL', $char_d, '', '',
5293         'rated_price',            'decimal', 'NULL',  '10,4', '', '',
5294         'rated_seconds',              'int', 'NULL',      '', '', '',
5295         'rated_minutes', 'double precision', 'NULL',      '', '', '',
5296         'rated_granularity',          'int', 'NULL',      '', '', '',
5297         'rated_ratedetailnum',        'int', 'NULL',      '', '', '',
5298         'rated_classnum',             'int', 'NULL',      '', '', '', 
5299         'rated_ratename',         'varchar', 'NULL', $char_d, '', '', 
5300
5301         'carrierid',               'bigint', 'NULL',      '', '', '',
5302
5303         # service it was matched to
5304         'svcnum',             'int',   'NULL',     '',   '', '', 
5305
5306         #NULL, done (or something)
5307         'freesidestatus', 'varchar',   'NULL',     32,   '', '', 
5308
5309         #NULL, done (or something)
5310         'freesiderewritestatus', 'varchar',   'NULL',     32,   '', '', 
5311
5312         #an indexed place to put big numbers
5313         'cdrid',         'bigint',     'NULL',     '',  '', '', 
5314
5315         #for taqua accountcode rewriting, for starters
5316         'sessionnum',       'int',    'NULL',      '', '', '',
5317         'subscriber',   'varchar',    'NULL', $char_d, '', '',
5318
5319         #old
5320         'cdrbatch',     'varchar',    'NULL',     255, '', '',
5321         #new
5322         'cdrbatchnum',      'int',    'NULL',      '', '', '',
5323
5324         # FK to cust_bill_pkg_detail; having a value here absolutely means
5325         # that the CDR appears on an invoice
5326         'detailnum',     'bigint',    'NULL',      '', '', '',
5327       ],
5328       'primary_key' => 'acctid',
5329       'unique' => [],
5330       'index' => [ [ 'calldate' ],
5331                    [ 'src' ], [ 'dst' ], [ 'dcontext' ], [ 'charged_party' ],
5332                    [ 'lastapp' ],
5333                    ['accountcode'], ['uniqueid'], ['carrierid'], ['cdrid'],
5334                    [ 'sessionnum' ], [ 'subscriber' ],
5335                    [ 'freesidestatus' ], [ 'freesiderewritestatus' ],
5336                    [ 'cdrbatch' ], [ 'cdrbatchnum' ],
5337                    [ 'src_ip_addr' ], [ 'dst_ip_addr' ], [ 'dst_term' ],
5338                  ],
5339       #no FKs on cdr table... choosing not to throw errors no matter what's
5340       # thrown in here.  better to have the data.
5341     },
5342
5343     'cdr_batch' => {
5344       'columns' => [
5345         'cdrbatchnum',   'serial',    '',   '', '', '', 
5346         'cdrbatch', 'varchar', 'NULL', 255, '', '',
5347         '_date',     @date_type, '', '', 
5348       ],
5349       'primary_key' => 'cdrbatchnum',
5350       'unique' => [ [ 'cdrbatch' ] ],
5351       'index' => [],
5352     },
5353
5354     'cdr_termination' => {
5355       'columns' => [
5356         'cdrtermnum', 'bigserial',     '',      '', '', '',
5357         'acctid',        'bigint',     '',      '', '', '', 
5358         'termpart',         'int',     '',      '', '', '',#future use see below
5359         'rated_price',  'decimal', 'NULL',  '10,4', '', '',
5360         'rated_seconds',    'int', 'NULL',      '', '', '',
5361         'rated_minutes', 'double precision', 'NULL',   '', '', '',
5362         'status',       'varchar', 'NULL',      32, '', '',
5363         'svcnum',           'int', 'NULL',      '', '', '',
5364       ],
5365       'primary_key'  => 'cdrtermnum',
5366       'unique'       => [ [ 'acctid', 'termpart' ] ],
5367       'index'        => [ [ 'acctid' ], [ 'status' ], ],
5368       'foreign_keys' => [
5369                           { columns    => [ 'acctid' ],
5370                             table      => 'cdr',
5371                           },
5372                           { columns    => [ 'svcnum' ],
5373                             table      => 'cust_svc',
5374                           },
5375                         ],
5376     },
5377
5378     #to handle multiple termination/settlement passes...
5379    # 'part_termination' => {
5380    #   'columns' => [
5381    #     'termpart',       'int', '',      '', '', '',
5382    #     'termname',   'varchar', '', $char_d, '', '',
5383    #     'cdr_column', 'varchar', '', $char_d, '', '', #maybe set it here instead of in the price plan?
5384    #   ],
5385    #   'primary_key' => 'termpart',
5386    #   'unique' => [],
5387    #   'index'  => [],
5388    # },
5389
5390     #the remaining cdr_ tables are not really used
5391     'cdr_calltype' => {
5392       'columns' => [
5393         'calltypenum',   'serial',  '', '', '', '', 
5394         'calltypename',  'varchar', '', $char_d, '', '', 
5395       ],
5396       'primary_key' => 'calltypenum',
5397       'unique'      => [],
5398       'index'       => [],
5399     },
5400
5401     'cdr_type' => {
5402       'columns' => [
5403         'cdrtypenum'  => 'serial',  '', '', '', '',
5404         'cdrtypename' => 'varchar', '', $char_d, '', '',
5405       ],
5406       'primary_key' => 'cdrtypenum',
5407       'unique'      => [],
5408       'index'       => [],
5409     },
5410
5411     'cdr_carrier' => {
5412       'columns' => [
5413         'carrierid'   =>  'serial',     '',      '', '', '',
5414         'carriername' => 'varchar',     '', $char_d, '', '',
5415         'disabled'    =>    'char', 'NULL',       1, '', '', 
5416       ],
5417       'primary_key' => 'carrierid',
5418       'unique'      => [],
5419       'index'       => [],
5420     },
5421
5422     #'cdr_file' => {
5423     #  'columns' => [
5424     #    'filenum',    'serial',     '', '', '', '',
5425     #    'filename',  'varchar',     '', '', '', '',
5426     #    'status',    'varchar', 'NULL', '', '', '',
5427     #  ],
5428     #  'primary_key' => 'filenum',
5429     #  'unique' => [ [ 'filename' ], ], #just change the index if we need to
5430     #                                   # agent-virtualize or have a customer
5431     #                                   # with dup-filename needs or something
5432     #                                   # (only used by cdr.http_and_import for
5433     #                                   #  chrissakes)
5434     #  'index'  => [],
5435     #},
5436
5437     'inventory_item' => {
5438       'columns' => [
5439         'itemnum',   'serial',      '',      '', '', '',
5440         'classnum',  'int',         '',      '', '', '',
5441         'agentnum',  'int',     'NULL',      '', '', '',
5442         'item',      'varchar',     '', $char_d, '', '',
5443         'svcnum',    'int',     'NULL',      '', '', '',
5444         'svc_field', 'varchar', 'NULL', $char_d, '', '',
5445       ],
5446       'primary_key'  => 'itemnum',
5447       'unique'       => [ [ 'classnum', 'item' ] ],
5448       'index'        => [ [ 'classnum' ], [ 'agentnum' ], [ 'svcnum' ] ],
5449       'foreign_keys' => [
5450                           { columns    => [ 'classnum' ],
5451                             table      => 'inventory_class',
5452                           },
5453                           { columns    => [ 'agentnum' ],
5454                             table      => 'agent',
5455                           },
5456                           { columns    => [ 'svcnum' ],
5457                             table      => 'cust_svc',
5458                           },
5459                         ],
5460     },
5461
5462     'inventory_class' => {
5463       'columns' => [
5464         'classnum',  'serial',       '',      '', '', '',
5465         'classname', 'varchar',      '', $char_d, '', '',
5466       ],
5467       'primary_key' => 'classnum',
5468       'unique' => [],
5469       'index'  => [],
5470     },
5471
5472     'access_user_session' => {
5473       'columns' => [
5474         'sessionnum',   'serial',  '',      '', '', '', 
5475         'sessionkey',  'varchar',  '', $char_d, '', '',
5476         'usernum',         'int',  '',      '', '', '',
5477         'start_date', @date_type,               '', '',
5478         'last_date',  @date_type,               '', '',
5479       ],
5480       'primary_key'  => 'sessionnum',
5481       'unique'       => [ [ 'sessionkey' ] ],
5482       'index'        => [],
5483       'foreign_keys' => [
5484                           { columns    => [ 'usernum' ],
5485                             table      => 'access_user',
5486                           },
5487                         ],
5488     },
5489
5490     'access_user' => {
5491       'columns' => [
5492         'usernum',             'serial',     '',      '', '', '',
5493         'username',           'varchar',     '', $char_d, '', '',
5494         '_password',          'varchar', 'NULL', $char_d, '', '',
5495         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
5496         'last',               'varchar', 'NULL', $char_d, '', '', 
5497         'first',              'varchar', 'NULL', $char_d, '', '', 
5498         'user_custnum',           'int', 'NULL',      '', '', '',
5499         'report_salesnum',        'int', 'NULL',      '', '', '',
5500         'disabled',              'char', 'NULL',       1, '', '', 
5501       ],
5502       'primary_key'  => 'usernum',
5503       'unique'       => [ [ 'username' ] ],
5504       'index'        => [ [ 'user_custnum' ] ],
5505       'foreign_keys' => [
5506                           { columns    => [ 'user_custnum' ],
5507                             table      => 'cust_main',
5508                             references => [ 'custnum' ],
5509                           },
5510                           { columns    => [ 'report_salesnum' ],
5511                             table      => 'sales',
5512                             references => [ 'salesnum' ],
5513                           },
5514                         ],
5515     },
5516
5517     'access_user_pref' => {
5518       'columns' => [
5519         'prefnum',    'serial',       '', '', '', '',
5520         'usernum',     'int',       '', '', '', '',
5521         'prefname', 'varchar', '', $char_d, '', '', 
5522         'prefvalue', 'text', 'NULL', '', '', '', 
5523         'expiration', @date_type, '', '',
5524       ],
5525       'primary_key'  => 'prefnum',
5526       'unique'       => [],
5527       'index'        => [ [ 'usernum' ] ],
5528       'foreign_keys' => [
5529                           { columns    => [ 'usernum' ],
5530                             table      => 'access_user',
5531                           },
5532                         ],
5533     },
5534
5535     'access_group' => {
5536       'columns' => [
5537         'groupnum',   'serial', '',      '', '', '',
5538         'groupname', 'varchar', '', $char_d, '', '',
5539       ],
5540       'primary_key' => 'groupnum',
5541       'unique' => [ [ 'groupname' ] ],
5542       'index'  => [],
5543     },
5544
5545     'access_usergroup' => {
5546       'columns' => [
5547         'usergroupnum', 'serial', '', '', '', '',
5548         'usernum',         'int', '', '', '', '',
5549         'groupnum',        'int', '', '', '', '',
5550       ],
5551       'primary_key'  => 'usergroupnum',
5552       'unique'       => [ [ 'usernum', 'groupnum' ] ],
5553       'index'        => [ [ 'usernum' ] ],
5554       'foreign_keys' => [
5555                           { columns    => [ 'usernum' ],
5556                             table      => 'access_user',
5557                           },
5558                           { columns    => [ 'groupnum' ],
5559                             table      => 'access_group',
5560                           },
5561                         ],
5562      },
5563
5564     'access_groupagent' => {
5565       'columns' => [
5566         'groupagentnum', 'serial', '', '', '', '',
5567         'groupnum',         'int', '', '', '', '',
5568         'agentnum',         'int', '', '', '', '',
5569       ],
5570       'primary_key'  => 'groupagentnum',
5571       'unique'       => [ [ 'groupnum', 'agentnum' ] ],
5572       'index'        => [ [ 'groupnum' ] ],
5573       'foreign_keys' => [
5574                           { columns    => [ 'groupnum' ],
5575                             table      => 'access_group',
5576                           },
5577                           { columns    => [ 'agentnum' ],
5578                             table      => 'agent',
5579                           },
5580                         ],
5581     },
5582
5583     'access_right' => {
5584       'columns' => [
5585         'rightnum',   'serial', '',      '', '', '',
5586         'righttype', 'varchar', '', $char_d, '', '',
5587         'rightobjnum',   'int', '',      '', '', '',
5588         'rightname', 'varchar', '', $char_d, '', '',
5589       ],
5590       'primary_key' => 'rightnum',
5591       'unique' => [ [ 'righttype', 'rightobjnum', 'rightname' ] ],
5592       'index'  => [],
5593     },
5594
5595     'sched_item' => {
5596       'columns' => [
5597         'itemnum',   'serial',      '', '', '', '', 
5598         'usernum',      'int',  'NULL', '', '', '', 
5599         #'itemname', 'varchar', $char_d, '', '', '',
5600         'disabled',    'char',  'NULL',  1, '', '', 
5601       ],
5602       'primary_key'  => 'itemnum',
5603       'unique'       => [ [ 'usernum' ] ],
5604       'index'        => [],
5605       'foreign_keys' => [
5606                           { columns    => [ 'usernum' ],
5607                             table      => 'access_user',
5608                           },
5609                         ],
5610     },
5611
5612     #'sched_item_class'
5613
5614     'sched_avail' => {
5615       'columns' => [
5616         'availnum',      'serial', '', '', '', '', 
5617         'itemnum',          'int', '', '', '', '',
5618         'wday',             'int', '', '', '', '',
5619         'stime',            'int', '', '', '', '',
5620         'etime',            'int', '', '', '', '',
5621         'override_date',    @date_type,    '', '',
5622       ],
5623       'primary_key'  => 'availnum',
5624       'unique'       => [],
5625       'index'        => [],
5626       'foreign_keys' => [
5627                           { columns    => [ 'itemnum' ],
5628                             table      => 'sched_item',
5629                           },
5630                         ],
5631     },
5632
5633     'svc_phone' => {
5634       'columns' => [
5635         'svcnum',                         'int',     '',      '', '', '', 
5636         'countrycode',                'varchar',     '',       3, '', '', 
5637         'phonenum',                   'varchar',     '',      25, '', '', #12 ?
5638         'sim_imsi',                   'varchar', 'NULL',      15, '', '',
5639         'pin',                        'varchar', 'NULL', $char_d, '', '',
5640         'sip_password',               'varchar', 'NULL', $char_d, '', '',
5641         'phone_name',                 'varchar', 'NULL', $char_d, '', '',
5642         'pbxsvc',                         'int', 'NULL',      '', '', '',
5643         'domsvc',                         'int', 'NULL',      '', '', '', 
5644         'locationnum',                    'int', 'NULL',      '', '', '',
5645         'forwarddst',                 'varchar', 'NULL',      15, '', '', 
5646         'email',                      'varchar', 'NULL',     255, '', '', 
5647         'lnp_status',                 'varchar', 'NULL', $char_d, '', '',
5648         'portable',                      'char', 'NULL',       1, '', '', 
5649         'lrn',                           'char', 'NULL',      10, '', '', 
5650         'lnp_desired_due_date',           'int', 'NULL',      '', '', '',
5651         'lnp_due_date',                   'int', 'NULL',      '', '', '',
5652         'lnp_other_provider',         'varchar', 'NULL', $char_d, '', '',
5653         'lnp_other_provider_account', 'varchar', 'NULL', $char_d, '', '',
5654         'lnp_reject_reason',          'varchar', 'NULL', $char_d, '', '',
5655         'sms_carrierid',                  'int', 'NULL',      '', '', '',
5656         'sms_account',                'varchar', 'NULL', $char_d, '', '',
5657         'max_simultaneous',               'int', 'NULL',      '', '', '',
5658         'e911_class',                    'char', 'NULL',       1, '', '',
5659         'e911_type',                     'char', 'NULL',       1, '', '', 
5660         'circuit_svcnum',                 'int', 'NULL',      '', '', '',
5661         'sip_server',                 'varchar', 'NULL', $char_d, '', '',
5662       ],
5663       'primary_key'  => 'svcnum',
5664       'unique'       => [ [ 'sms_carrierid', 'sms_account'] ],
5665       'index'        => [ ['countrycode', 'phonenum'], ['pbxsvc'], ['domsvc'],
5666                           ['locationnum'], ['sms_carrierid'],
5667                         ],
5668       'foreign_keys' => [
5669                           { columns    => [ 'svcnum' ],
5670                             table      => 'cust_svc',
5671                           },
5672                           { columns    => [ 'pbxsvc' ],
5673                             table      => 'svc_pbx', #'cust_svc',
5674                             references => [ 'svcnum' ],
5675                           },
5676                           { columns    => [ 'domsvc' ],
5677                             table      => 'svc_domain', #'cust_svc',
5678                             references => [ 'svcnum' ],
5679                           },
5680                           { columns    => [ 'locationnum' ],
5681                             table      => 'cust_location',
5682                           },
5683                           { columns    => [ 'sms_carrierid' ],
5684                             table      => 'cdr_carrier',
5685                             references => [ 'carrierid' ],
5686                           },
5687                           { columns    => [ 'circuit_svcnum' ],
5688                             table      => 'svc_circuit',
5689                             references => [ 'svcnum' ],
5690                           },
5691                         ],
5692     },
5693
5694     'phone_device' => {
5695       'columns' => [
5696         'devicenum', 'serial',     '', '', '', '',
5697         'devicepart',   'int',     '', '', '', '',
5698         'svcnum',       'int',     '', '', '', '', 
5699         'mac_addr', 'varchar', 'NULL', 12, '', '', 
5700       ],
5701       'primary_key'  => 'devicenum',
5702       'unique'       => [ [ 'mac_addr' ], ],
5703       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
5704       'foreign_keys' => [
5705                           { columns    => [ 'devicepart' ],
5706                             table      => 'part_device',
5707                           },
5708                           { columns    => [ 'svcnum' ],
5709                             table      => 'svc_phone',
5710                           },
5711                         ],
5712     },
5713
5714     'part_device' => {
5715       'columns' => [
5716         'devicepart', 'serial',  '',      '', '', '',
5717         'devicename', 'varchar', '', $char_d, '', '',
5718         'inventory_classnum', 'int', 'NULL', '', '', '',
5719       ],
5720       'primary_key'  => 'devicepart',
5721       'unique'       => [ [ 'devicename' ] ], #?
5722       'index'        => [],
5723       'foreign_keys' => [
5724                           { columns    => [ 'inventory_classnum' ],
5725                             table      => 'inventory_class',
5726                             references => [ 'classnum' ],
5727                           },
5728                         ],
5729     },
5730
5731     'phone_avail' => {
5732       'columns' => [
5733         'availnum',    'serial',      '',      '', '', '', 
5734         'exportnum',   'int',         '',      '', '', '', 
5735         'countrycode', 'varchar',     '',       3, '', '', 
5736         'state',       'char',    'NULL',       2, '', '', 
5737         'npa',         'char',        '',       3, '', '', 
5738         'nxx',         'char',    'NULL',       3, '', '', 
5739         'station',     'char',    'NULL',       4, '', '',
5740         'name',        'varchar', 'NULL', $char_d, '', '',
5741         'rate_center_abbrev', 'varchar', 'NULL', $char_d, '', '',
5742         'latanum',      'int',     'NULL',      '', '', '',
5743         'msanum',       'int', 'NULL', '', '', '',
5744         'ordernum',      'int',     'NULL',      '', '', '',
5745         'svcnum',      'int',     'NULL',      '', '', '',
5746         'availbatch', 'varchar',  'NULL', $char_d, '', '',
5747       ],
5748       'primary_key'  => 'availnum',
5749       'unique'       => [],
5750       'index'        => [ ['exportnum','countrycode','state'],    #npa search
5751                           ['exportnum','countrycode','npa'],      #nxx search
5752                           ['exportnum','countrycode','npa','nxx'],#station srch
5753                           [ 'exportnum','countrycode','npa','nxx','station'], #
5754                           [ 'svcnum' ],
5755                           [ 'availbatch' ],
5756                           [ 'latanum' ],
5757                         ],
5758       'foreign_keys' => [
5759                           { columns    => [ 'exportnum' ],
5760                             table      => 'part_export',
5761                           },
5762                           { columns    => [ 'latanum' ],
5763                             table      => 'lata',
5764                           },
5765                           { columns    => [ 'msanum' ],
5766                             table      => 'msa',
5767                           },
5768                           { columns    => [ 'ordernum' ],
5769                             table      => 'did_order',
5770                           },
5771                           { columns    => [ 'svcnum' ],
5772                             table      => 'svc_phone',
5773                           },
5774                         ],
5775     },
5776
5777     'lata' => {
5778       'columns' => [
5779         'latanum',    'int',      '',      '', '', '', 
5780         'description',   'varchar',    '',      $char_d, '', '', 
5781         'have_usage',   'int',    'NULL',      '', '', '', 
5782       ],
5783       'primary_key' => 'latanum',
5784       'unique' => [],
5785       'index'  => [],
5786     },
5787
5788     'msa' => {
5789       'columns' => [
5790         'msanum',    'int',      '',      '', '', '', 
5791         'description',   'varchar',    '',      $char_d, '', '', 
5792       ],
5793       'primary_key' => 'msanum',
5794       'unique' => [],
5795       'index'  => [],
5796     },
5797
5798     'rate_center' => {
5799       'columns' => [
5800         'ratecenternum',    'serial',      '',      '', '', '', 
5801         'description',   'varchar',    '',      $char_d, '', '', 
5802       ],
5803       'primary_key' => 'ratecenternum',
5804       'unique' => [],
5805       'index'  => [],
5806     },
5807
5808     'did_vendor' => {
5809       'columns' => [
5810         'vendornum',    'serial',      '',      '', '', '', 
5811         'vendorname',   'varchar',        '',     $char_d, '', '', 
5812       ],
5813       'primary_key' => 'vendornum',
5814       'unique' => [],
5815       'index'  => [],
5816     },
5817
5818     'did_order_item' => {
5819       'columns' => [
5820         'orderitemnum',    'serial',      '',      '', '', '', 
5821         'ordernum',    'int',      '',      '', '', '', 
5822         'msanum',      'int',     'NULL',      '', '', '',
5823         'npa',      'int',     'NULL',      '', '', '',
5824         'latanum',      'int',     'NULL',      '', '', '',
5825         'ratecenternum',      'int',     'NULL',      '', '', '',
5826         'state',       'char',    'NULL',       2, '', '', 
5827         'quantity',      'int',     '',      '', '', '',
5828         'custnum',   'int', 'NULL', '', '', '',
5829       ],
5830       'primary_key'  => 'orderitemnum',
5831       'unique'       => [],
5832       'index'        => [],
5833       'foreign_keys' => [
5834                           { columns    => [ 'ordernum' ],
5835                             table      => 'did_order',
5836                           },
5837                           { columns    => [ 'msanum' ],
5838                             table      => 'msa',
5839                           },
5840                           { columns    => [ 'latanum' ],
5841                             table      => 'lata',
5842                           },
5843                           { columns    => [ 'ratecenternum' ],
5844                             table      => 'rate_center',
5845                           },
5846                           { columns    => [ 'custnum' ],
5847                             table      => 'cust_main',
5848                           },
5849                         ],
5850     },
5851
5852     'did_order' => {
5853       'columns' => [
5854         'ordernum',    'serial',      '',      '', '', '', 
5855         'vendornum',   'int',       '',      '', '', '', 
5856         'vendor_order_id',   'varchar',  'NULL',   $char_d, '', '', 
5857         'custnum',   'int', 'NULL', '', '', '',
5858         'submitted',      'int',     '',      '', '', '',
5859         'confirmed',      'int',     'NULL',      '', '', '',
5860         'received',      'int',     'NULL',      '', '', '',
5861       ],
5862       'primary_key'  => 'ordernum',
5863       'unique'       => [ [ 'vendornum', 'vendor_order_id' ] ],
5864       'index'        => [],
5865       'foreign_keys' => [
5866                           { columns    => [ 'vendornum' ],
5867                             table      => 'did_vendor',
5868                           },
5869                           { columns    => [ 'custnum' ],
5870                             table      => 'cust_main',
5871                           },
5872                         ],
5873     },
5874
5875     'reason_type' => {
5876       'columns' => [
5877         'typenum',   'serial',  '', '', '', '', 
5878         'class',     'char', '', 1, '', '', 
5879         'type',     'varchar', '', $char_d, '', '', 
5880       ],
5881       'primary_key' => 'typenum',
5882       'unique' => [],
5883       'index' => [],
5884     },
5885
5886     'reason' => {
5887       'columns' => [
5888         'reasonnum',     'serial',  '', '', '', '', 
5889         'reason_type',   'int',  '', '', '', '', 
5890         'reason',        'text', '', '', '', '', 
5891         'disabled',      'char',    'NULL', 1, '', '', 
5892         'unsuspend_pkgpart', 'int',  'NULL', '', '', '',
5893         'unsuspend_hold','char',    'NULL', 1, '', '',
5894         'unused_credit', 'char',    'NULL', 1, '', '',
5895       ],
5896       'primary_key'  => 'reasonnum',
5897       'unique'       => [],
5898       'index'        => [],
5899       'foreign_keys' => [
5900                           { columns    => [ 'reason_type' ],
5901                             table      => 'reason_type',
5902                             references => [ 'typenum' ],
5903                           },
5904                           { columns    => [ 'unsuspend_pkgpart' ],
5905                             table      => 'part_pkg',
5906                             references => [ 'pkgpart' ],
5907                           },
5908                         ],
5909     },
5910
5911     'conf' => {
5912       'columns' => [
5913         'confnum',  'serial',     '',      '', '', '', 
5914         'agentnum', 'int',    'NULL',      '', '', '', 
5915         'locale',   'varchar','NULL',      16, '', '',
5916         'name',     'varchar',    '', $char_d, '', '', 
5917         'value',    'text',   'NULL',      '', '', '',
5918       ],
5919       'primary_key'  => 'confnum',
5920       'unique'       => [ [ 'agentnum', 'locale', 'name' ] ],
5921       'index'        => [],
5922       'foreign_keys' => [
5923                           { columns    => [ 'agentnum' ],
5924                             table      => 'agent',
5925                           },
5926                         ],
5927     },
5928
5929     'pkg_referral' => {
5930       'columns' => [
5931         'pkgrefnum',     'serial', '', '', '', '',
5932         'pkgnum',        'int',    '', '', '', '',
5933         'refnum',        'int',    '', '', '', '',
5934       ],
5935       'primary_key'  => 'pkgrefnum',
5936       'unique'       => [ [ 'pkgnum', 'refnum' ] ],
5937       'index'        => [ [ 'pkgnum' ], [ 'refnum' ] ],
5938       'foreign_keys' => [
5939                           { columns    => [ 'pkgnum' ],
5940                             table      => 'cust_pkg',
5941                           },
5942                           { columns    => [ 'refnum' ],
5943                             table      => 'part_referral',
5944                           },
5945                         ],
5946     },
5947
5948     'svc_pbx' => {
5949       'columns' => [
5950         'svcnum',           'int',     '',      '', '', '', 
5951         'id',               'int', 'NULL',      '', '', '', 
5952         'uuid',            'char', 'NULL',      36, '', '',
5953         'title',        'varchar', 'NULL', $char_d, '', '', 
5954         'max_extensions',   'int', 'NULL',      '', '', '',
5955         'max_simultaneous', 'int', 'NULL',      '', '', '',
5956         'ip_addr',      'varchar', 'NULL',      40, '', '',
5957       ],
5958       'primary_key'  => 'svcnum',
5959       'unique'       => [],
5960       'index'        => [ [ 'id' ], [ 'uuid' ] ],
5961       'foreign_keys' => [
5962                           { columns    => [ 'svcnum' ],
5963                             table      => 'cust_svc',
5964                           },
5965                         ],
5966     },
5967
5968     'pbx_extension' => {
5969       'columns' => [
5970         'extensionnum',  'serial',     '',      '', '', '',
5971         'svcnum',           'int',     '',      '', '', '',
5972         'extension',    'varchar',     '', $char_d, '', '',
5973         'pin',          'varchar', 'NULL', $char_d, '', '',
5974         'sip_password', 'varchar', 'NULL', $char_d, '', '',
5975         'phone_name',   'varchar', 'NULL', $char_d, '', '',
5976       ],
5977       'primary_key'  => 'extensionnum',
5978       'unique'       => [ [ 'svcnum', 'extension' ] ],
5979       'index'        => [ [ 'svcnum' ] ],
5980       'foreign_keys' => [
5981                           { columns    => [ 'svcnum' ],
5982                             table      => 'svc_pbx',
5983                           },
5984                         ],
5985     },
5986
5987     'pbx_device' => {
5988       'columns' => [
5989         'devicenum', 'serial',     '', '', '', '',
5990         'devicepart',   'int',     '', '', '', '',
5991         'svcnum',       'int',     '', '', '', '', 
5992         'mac_addr', 'varchar', 'NULL', 12, '', '', 
5993       ],
5994       'primary_key'  => 'devicenum',
5995       'unique'       => [ [ 'mac_addr' ], ],
5996       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
5997       'foreign_keys' => [
5998                           { columns    => [ 'devicepart' ],
5999                             table      => 'part_device',
6000                           },
6001                           { columns    => [ 'svcnum' ],
6002                             table      => 'svc_pbx',
6003                           },
6004                         ],
6005     },
6006
6007     'extension_device' => {
6008       'columns' => [
6009         'extensiondevicenum', 'serial', '', '', '', '',
6010         'extensionnum',          'int', '', '', '', '',
6011         'devicenum',             'int', '', '', '', '',
6012       ],
6013       'primary_key'  => 'extensiondevicenum',
6014       'unique'       => [ [ 'extensionnum', 'devicenum' ] ],
6015       'index'        => [],#both?  which way do we need to query?
6016       'foreign_keys' => [
6017                           { columns  => [ 'extensionnum' ],
6018                             table    => 'pbx_extension',
6019                           },
6020                           { columns  => [ 'devicenum' ],
6021                             table    => 'pbx_device',
6022                           },
6023                         ],
6024     },
6025
6026     'svc_mailinglist' => { #svc_group?
6027       'columns' => [
6028         'svcnum',            'int',     '',            '', '', '', 
6029         'username',      'varchar',     '', $username_len, '', '',
6030         'domsvc',            'int',     '',            '', '', '', 
6031         'listnum',           'int',     '',            '', '', '',
6032         'reply_to',         'char', 'NULL',             1, '', '',#SetReplyTo
6033         'remove_from',      'char', 'NULL',             1, '', '',#RemoveAuthor
6034         'reject_auto',      'char', 'NULL',             1, '', '',#RejectAuto
6035         'remove_to_and_cc', 'char', 'NULL',             1, '', '',#RemoveToAndCc
6036       ],
6037       'primary_key'  => 'svcnum',
6038       'unique'       => [],
6039       'index'        => [ ['username'], ['domsvc'], ['listnum'] ],
6040       'foreign_keys' => [
6041                           { columns    => [ 'svcnum' ],
6042                             table      => 'cust_svc',
6043                           },
6044                           { columns    => [ 'domsvc' ],
6045                             table      => 'svc_domain', #'cust_svc',
6046                             references => [ 'svcnum' ],
6047                           },
6048                           { columns    => [ 'listnum' ],
6049                             table      => 'mailinglist',
6050                           },
6051                         ],
6052     },
6053
6054     'mailinglist' => {
6055       'columns' => [
6056         'listnum',   'serial', '',      '', '', '',
6057         'listname', 'varchar', '', $char_d, '', '',
6058       ],
6059       'primary_key' => 'listnum',
6060       'unique' => [],
6061       'index'  => [],
6062     },
6063
6064     'mailinglistmember' => {
6065       'columns' => [
6066         'membernum',        'serial',     '',   '', '', '',
6067         'listnum',             'int',     '',   '', '', '',
6068         'svcnum',              'int', 'NULL',   '', '', '', 
6069         'contactemailnum',     'int', 'NULL',   '', '', '', 
6070         'email',           'varchar', 'NULL',  255, '', '', 
6071       ],
6072       'primary_key'  => 'membernum',
6073       'unique'       => [],
6074       'index'        => [['listnum'],['svcnum'],['contactemailnum'],['email']],
6075       'foreign_keys' => [
6076                           { columns    => [ 'listnum' ],
6077                             table      => 'mailinglist',
6078                           },
6079                           { columns    => [ 'svcnum' ],
6080                             table      => 'svc_acct',
6081                           },
6082                           { columns    => [ 'contactemailnum' ],
6083                             table      => 'contact_email',
6084                           },
6085                         ],
6086     },
6087
6088     'bill_batch' => {
6089       'columns' => [
6090         'batchnum',         'serial',     '',  '', '', '',
6091         'agentnum',            'int', 'NULL',  '', '', '',
6092         'status',             'char', 'NULL', '1', '', '',
6093         'pdf',                'blob', 'NULL',  '', '', '',
6094       ],
6095       'primary_key'  => 'batchnum',
6096       'unique'       => [],
6097       'index'        => [ ['agentnum'] ],
6098       'foreign_keys' => [
6099                           { columns    => [ 'agentnum' ],
6100                             table      => 'agent',
6101                           },
6102                         ],
6103     },
6104
6105     'cust_bill_batch' => {
6106       'columns' => [
6107         'billbatchnum',     'serial',     '', '', '', '',
6108         'batchnum',            'int',     '', '', '', '',
6109         'invnum',              'int',     '', '', '', '',
6110       ],
6111       'primary_key'  => 'billbatchnum',
6112       'unique'       => [],
6113       'index'        => [ [ 'batchnum' ], [ 'invnum' ] ],
6114       'foreign_keys' => [
6115                           { columns    => [ 'batchnum' ],
6116                             table      => 'bill_batch',
6117                           },
6118                           { columns    => [ 'invnum' ],
6119                             table      => 'cust_bill',
6120                           },
6121                         ],
6122     },
6123
6124     'cust_bill_batch_option' => {
6125       'columns' => [
6126         'optionnum', 'serial', '', '', '', '', 
6127         'billbatchnum', 'int', '', '', '', '', 
6128         'optionname', 'varchar', '', $char_d, '', '', 
6129         'optionvalue', 'text', 'NULL', '', '', '', 
6130       ],
6131       'primary_key'  => 'optionnum',
6132       'unique'       => [],
6133       'index'        => [ [ 'billbatchnum' ], [ 'optionname' ] ],
6134       'foreign_keys' => [
6135                           { columns    => [ 'billbatchnum' ],
6136                             table      => 'cust_bill_batch',
6137                           },
6138                         ],
6139      },
6140
6141     'msg_template' => {
6142       'columns' => [
6143         'msgnum',     'serial',     '',      '', '', '',
6144         'msgname',   'varchar',     '', $char_d, '', '',
6145         'agentnum',      'int', 'NULL',      '', '', '',
6146         'subject',   'varchar', 'NULL',     512, '', '',
6147         'mime_type', 'varchar',     '', $char_d, '', '',
6148         'body',         'blob', 'NULL',      '', '', '',
6149         'disabled',     'char', 'NULL',       1, '', '', 
6150         'from_addr', 'varchar', 'NULL',     255, '', '',
6151         'bcc_addr',  'varchar', 'NULL',     255, '', '',
6152       ],
6153       'primary_key'  => 'msgnum',
6154       'unique'       => [ ],
6155       'index'        => [ ['agentnum'], ],
6156       'foreign_keys' => [
6157                           { columns    => [ 'agentnum' ],
6158                             table      => 'agent',
6159                           },
6160                         ],
6161     },
6162
6163     'template_content' => {
6164       'columns' => [
6165         'contentnum', 'serial',     '',      '', '', '',
6166         'msgnum',        'int',     '',      '', '', '',
6167         'locale',    'varchar', 'NULL',      16, '', '',
6168         'subject',   'varchar', 'NULL',     512, '', '',
6169         'body',         'text', 'NULL',      '', '', '',
6170       ],
6171       'primary_key'  => 'contentnum',
6172       'unique'       => [ ['msgnum', 'locale'] ],
6173       'index'        => [ ],
6174       'foreign_keys' => [
6175                           { columns    => [ 'msgnum' ],
6176                             table      => 'msg_template',
6177                           },
6178                         ],
6179     },
6180
6181     'cust_msg' => {
6182       'columns' => [
6183         'custmsgnum', 'serial',     '',     '', '', '',
6184         'custnum',       'int', 'NULL',     '', '', '',
6185         'msgnum',        'int', 'NULL',     '', '', '',
6186         '_date',    @date_type,                 '', '',
6187         'env_from',  'varchar', 'NULL',    255, '', '',
6188         'env_to',    'varchar', 'NULL',    255, '', '',
6189         'header',       'blob', 'NULL',     '', '', '',
6190         'body',         'blob', 'NULL',     '', '', '',
6191         'error',     'varchar', 'NULL',    255, '', '',
6192         'status',    'varchar',     '',$char_d, '', '',
6193         'msgtype',   'varchar', 'NULL',     16, '', '',
6194       ],
6195       'primary_key'  => 'custmsgnum',
6196       'unique'       => [ ],
6197       'index'        => [ ['custnum'], ],
6198       'foreign_keys' => [
6199                           { columns    => [ 'custnum' ],
6200                             table      => 'cust_main',
6201                           },
6202                           { columns    => [ 'msgnum' ],
6203                             table      => 'msg_template',
6204                           },
6205                         ],
6206     },
6207
6208     'svc_cert' => {
6209       'columns' => [
6210         'svcnum',                'int',     '',      '', '', '', 
6211         'recnum',                'int', 'NULL',      '', '', '',
6212         'privatekey',           'text', 'NULL',      '', '', '',
6213         'csr',                  'text', 'NULL',      '', '', '',
6214         'certificate',          'text', 'NULL',      '', '', '',
6215         'cacert',               'text', 'NULL',      '', '', '',
6216         'common_name',       'varchar', 'NULL', $char_d, '', '',
6217         'organization',      'varchar', 'NULL', $char_d, '', '',
6218         'organization_unit', 'varchar', 'NULL', $char_d, '', '',
6219         'city',              'varchar', 'NULL', $char_d, '', '',
6220         'state',             'varchar', 'NULL', $char_d, '', '',
6221         'country',              'char', 'NULL',       2, '', '',
6222         'cert_contact',      'varchar', 'NULL', $char_d, '', '',
6223       ],
6224       'primary_key'  => 'svcnum',
6225       'unique'       => [],
6226       'index'        => [], #recnum
6227       'foreign_keys' => [
6228                           { columns    => [ 'svcnum' ],
6229                             table      => 'cust_svc',
6230                           },
6231                           { columns    => [ 'recnum' ],
6232                             table      => 'domain_record',
6233                           },
6234                         ],
6235     },
6236
6237     'svc_port' => {
6238       'columns' => [
6239         'svcnum',                'int',     '',      '', '', '', 
6240         'serviceid', 'varchar', '', 64, '', '', #srvexport / reportfields
6241       ],
6242       'primary_key'  => 'svcnum',
6243       'unique'       => [],
6244       'index'        => [], #recnum
6245       'foreign_keys' => [
6246                           { columns    => [ 'svcnum' ],
6247                             table      => 'cust_svc',
6248                           },
6249                         ],
6250     },
6251
6252     'areacode'  => {
6253       'columns' => [
6254         'areanum',   'serial',        '',      '', '', '',
6255         'code',        'char',        '',       3, '', '', 
6256         'country',     'char',    'NULL',       2, '', '',
6257         'state',       'char',    'NULL',       2, '', '', 
6258         'description','varchar',  'NULL',     255, '', '',
6259       ], 
6260       'primary_key' => 'areanum',
6261       'unique' => [ [ 'areanum' ] ],
6262       'index'  => [],
6263     },
6264
6265     'upgrade_journal' => {
6266       'columns' => [
6267         'upgradenum', 'serial', '', '', '', '',
6268         '_date', 'int', '', '', '', '',
6269         'upgrade', 'varchar', '', $char_d, '', '',
6270         'status', 'varchar', '', $char_d, '', '',
6271         'statustext', 'varchar', 'NULL', $char_d, '', '',
6272       ],
6273       'primary_key' => 'upgradenum',
6274       'unique' => [],
6275       'index' => [ [ 'upgrade' ] ],
6276     },
6277
6278     'upload_target' => {
6279       'columns' => [
6280         'targetnum', 'serial', '', '', '', '',
6281         'agentnum', 'int', 'NULL', '', '', '',
6282         'protocol', 'varchar', '', 10, '', '',
6283         'hostname', 'varchar', '', $char_d, '', '',
6284         'port', 'int', 'NULL', '', '', '',
6285         'username', 'varchar', '', $char_d, '', '',
6286         'password', 'varchar', 'NULL', $char_d, '', '',
6287         'path', 'varchar', 'NULL', $char_d, '', '',
6288         'subject', 'varchar', 'NULL', '255', '', '',
6289         'handling', 'varchar', 'NULL', $char_d, '', '',
6290       ],
6291       'primary_key'   => 'targetnum',
6292       'unique'        => [ [ 'targetnum' ] ],
6293       'index'         => [],
6294       'foreign_keys' => [
6295                           { columns    => [ 'agentnum' ],
6296                             table      => 'agent',
6297                           },
6298                         ],
6299     },
6300
6301     'log' => {
6302       'columns' => [
6303         'lognum',     'serial', '', '', '', '',
6304         '_date',      'int', '', '', '', '',
6305         'agentnum',   'int', 'NULL', '', '', '',
6306         'tablename',  'varchar', 'NULL', $char_d, '', '',
6307         'tablenum',   'int',  'NULL', '', '', '', 
6308         'level',      'int',  '', '', '', '',
6309         'message',    'text', '', '', '', '',
6310       ],
6311       'primary_key'  => 'lognum',
6312       'unique'       => [],
6313       'index'        => [ ['_date'], ['level'] ],
6314       'foreign_keys' => [
6315                           { columns    => [ 'agentnum' ],
6316                             table      => 'agent',
6317                           },
6318                         ],
6319     },
6320
6321     'log_context' => {
6322       'columns' => [
6323         'logcontextnum', 'serial', '', '', '', '',
6324         'lognum', 'int', '', '', '', '',
6325         'context', 'varchar', '', $char_d, '', '',
6326       ],
6327       'primary_key'  => 'logcontextnum',
6328       'unique'       => [ [ 'lognum', 'context' ] ],
6329       'index'        => [],
6330       'foreign_keys' => [
6331                           { columns    => [ 'lognum' ],
6332                             table      => 'log',
6333                           },
6334                         ],
6335     },
6336
6337     'svc_alarm' => {
6338       'columns' => [
6339 #       name               type        null   length   default local
6340         'svcnum',          'int',      '',    '',      '',     '', 
6341         'alarmsystemnum',  'int',      '',    '',      '',     '',
6342         'alarmtypenum',    'int',      '',    '',      '',     '',
6343         'alarmstationnum', 'int',      '',    '',      '',     '',
6344         'acctnum',         'varchar',  '',    $char_d, '',     '',
6345         '_password',       'varchar',  '',    $char_d, '',     '',
6346         'location',        'varchar', 'NULL', $char_d, '',     '',
6347         'cs_receiver',     'int',     'NULL', '',      '',     '',
6348         'cs_phonenum',     'varchar', 'NULL', $char_d, '',     '',
6349         'serialnum',       'varchar', 'NULL', $char_d, '',     '',
6350         #installer (rep)
6351       ],
6352       'primary_key'  => 'svcnum',
6353       'unique'       => [],
6354       'index'        => [],
6355       'foreign_keys' => [
6356                           { columns    => [ 'svcnum' ],
6357                             table      => 'cust_svc',
6358                           },
6359                           { columns    => [ 'alarmsystemnum' ],
6360                             table      => 'alarm_system',
6361                           },
6362                           { columns    => [ 'alarmtypenum' ],
6363                             table      => 'alarm_type',
6364                           },
6365                           { columns    => [ 'alarmstationnum' ],
6366                             table      => 'alarm_station',
6367                           },
6368                         ],
6369     },
6370
6371     'alarm_system' => { #vendors
6372       'columns' => [
6373         'alarmsystemnum',  'serial',     '',      '', '', '',
6374         'agentnum',           'int', 'NULL',      '', '', '',
6375         'systemname',     'varchar',     '', $char_d, '', '',
6376         'disabled',          'char', 'NULL',       1, '', '', 
6377       ],
6378       'primary_key' => 'alarmsystemnum',
6379       'unique'      => [ ['agentnum', 'systemname'] ],
6380       'index'       => [ ['agentnum'], ['disabled'] ],
6381       'foreign_keys' => [
6382                           { columns    => [ 'agentnum' ],
6383                             table      => 'agent',
6384                           },
6385                         ],
6386     },
6387
6388     'alarm_type' => { #inputs and outputs
6389       'columns' => [
6390         'alarmtypenum', 'serial',     '',      '', '', '',
6391         'agentnum',        'int', 'NULL',      '', '', '',
6392         'inputs',          'int',     '', '', '', '',
6393         'outputs',         'int',     '', '', '', '',
6394         'disabled',       'char', 'NULL',       1, '', '', 
6395       ],
6396       'primary_key' => 'alarmtypenum',
6397       'unique'      => [ ['agentnum', 'inputs', 'outputs'] ],
6398       'index'       => [ ['agentnum'], ['disabled'] ],
6399       'foreign_keys' => [
6400                           { columns    => [ 'agentnum' ],
6401                             table      => 'agent',
6402                           },
6403                         ],
6404     },
6405
6406     'alarm_station' => { #central station (where the alarm reports to)
6407       'columns' => [
6408         'alarmstationnum', 'serial',     '',      '', '', '',
6409         'agentnum',           'int', 'NULL',      '', '', '',
6410         'stationname',    'varchar',     '', $char_d, '', '',
6411         'disabled',          'char', 'NULL',       1, '', '', 
6412       ],
6413       'primary_key' => 'alarmstationnum',
6414       'unique'      => [ ['agentnum', 'stationname'], ],
6415       'index'       => [ ['agentnum'], ['disabled'] ],
6416       'foreign_keys' => [
6417                           { columns    => [ 'agentnum' ],
6418                             table      => 'agent',
6419                           },
6420                         ],
6421     },
6422
6423     'svc_cable' => {
6424       'columns' => [
6425         'svcnum',        'int',     '',      '', '', '', 
6426         'providernum',   'int', 'NULL',      '', '', '',
6427         'ordernum',  'varchar', 'NULL', $char_d, '', '',
6428         'modelnum',      'int', 'NULL',      '', '', '',
6429         'serialnum', 'varchar', 'NULL', $char_d, '', '',
6430         'mac_addr',  'varchar', 'NULL',      12, '', '', 
6431       ],
6432       'primary_key'  => 'svcnum',
6433       'unique'       => [ ['serialnum'] , ['mac_addr'] ],
6434       'index'        => [],
6435       'foreign_keys' => [
6436                           { columns    => [ 'svcnum' ],
6437                             table      => 'cust_svc',
6438                           },
6439                           { columns    => [ 'providernum' ],
6440                             table      => 'cable_provider',
6441                           },
6442                           { columns    => [ 'modelnum' ],
6443                             table      => 'cable_model',
6444                           },
6445                         ],
6446     },
6447
6448     'cable_model' => {
6449       'columns' => [
6450         'modelnum',    'serial',     '',      '', '', '',
6451         'model_name', 'varchar',     '', $char_d, '', '',
6452         'disabled',      'char', 'NULL',       1, '', '', 
6453       ],
6454       'primary_key' => 'modelnum',
6455       'unique' => [ [ 'model_name' ], ],
6456       'index'  => [],
6457     },
6458
6459     'cable_provider' => {
6460       'columns' => [
6461         'providernum', 'serial',     '',      '', '', '',
6462         'provider',   'varchar',     '', $char_d, '', '',
6463         'disabled',      'char', 'NULL',       1, '', '', 
6464       ],
6465       'primary_key' => 'providernum',
6466       'unique' => [ [ 'provider' ], ],
6467       'index'  => [],
6468     },
6469
6470     'svc_conferencing' => {
6471       'columns' => [
6472         'svcnum',            'int',     '',      '', '', '',
6473         'conf_id',           'int', 'NULL',      '', '', '', #"system assigned"
6474         'conf_name',     'varchar',     '', $char_d, '', '',
6475         'conf_password', 'varchar',     '', $char_d, '', '',
6476         'access_code',   'varchar',     '',      16, '', '',
6477         'duration',          'int',     '',      '', '', '',
6478         'participants',      'int',     '',      '', '', '',
6479         'conftypenum',       'int',     '',      '', '', '',
6480         'confqualitynum',    'int',     '',      '', '', '',
6481         'opt_recording',    'char', 'NULL',       1, '', '',
6482         'opt_sip',          'char', 'NULL',       1, '', '',
6483         'opt_phone',        'char', 'NULL',       1, '', '',
6484       ],
6485       'primary_key' => 'svcnum',
6486       'unique' => [],
6487       'index'  => [],
6488       'foreign_keys' => [
6489                           { columns => [ 'svcnum' ],
6490                             table   => 'cust_svc',
6491                           },
6492                           { columns => [ 'conftypenum' ],
6493                             table   => 'conferencing_type',
6494                           },
6495                           { columns => [ 'confqualitynum' ],
6496                             table   => 'conferencing_quality',
6497                           },
6498                         ],
6499     },
6500
6501     'conferencing_type' => {
6502       'columns' => [
6503         'conftypenum',  'int',     '',      '', '', '',
6504         'typeid'      , 'int',     '',      '', '', '',
6505         'typename', 'varchar',     '', $char_d, '', '',
6506         'disabled',    'char', 'NULL',       1, '', '', 
6507       ],
6508       'primary_key' => 'conftypenum',
6509       'unique'      => [ [ 'typeid', 'disabled' ], [ 'typename', 'disabled' ] ],
6510       'index'       => [],
6511     },
6512
6513     'conferencing_quality' => {
6514       'columns' => [
6515         'confqualitynum',  'int',     '',      '', '', '',
6516         'qualityid'      , 'int',     '',      '', '', '',
6517         'qualityname', 'varchar',     '', $char_d, '', '',
6518         'disabled',       'char', 'NULL',       1, '', '', 
6519       ],
6520       'primary_key' => 'confqualitynum',
6521       'unique'      => [ [ 'qualityid', 'disabled' ], [ 'qualityname', 'disabled' ] ],
6522       'index'       => [],
6523     },
6524
6525     'svc_video' => {
6526       'columns' => [
6527         'svcnum',            'int', '', '', '', '',
6528         'smartcard_num', 'varchar', '', 16, '', '',
6529         'mac_addr',      'varchar', '', 12, '', '', 
6530         'duration',          'int', '', '', '', '',
6531       ],
6532       'primary_key' => 'svcnum',
6533       'unique' => [], # [ 'smartcard_num' ], [ 'mac_addr' ], ],
6534       'index'  => [],
6535       'foreign_keys' => [
6536                           { columns => [ 'svcnum' ],
6537                             table   => 'cust_svc',
6538                           },
6539                         ],
6540     },
6541
6542     'circuit_type' => {
6543       'columns' => [
6544         'typenum',     'serial',     '',      '', '', '',
6545         'typename',   'varchar',     '', $char_d, '', '',
6546         'disabled',      'char', 'NULL',       1, '', '',
6547         # speed? number of voice lines? anything else?
6548       ],
6549       'primary_key' => 'typenum',
6550       'unique' => [ [ 'typename' ] ],
6551       'index'  => [],
6552     },
6553
6554     'circuit_provider' => {
6555       'columns' => [
6556         'providernum', 'serial',     '',      '', '', '',
6557         'provider',   'varchar',     '', $char_d, '', '',
6558         'disabled',      'char', 'NULL',       1, '', '', 
6559       ],
6560       'primary_key' => 'providernum',
6561       'unique' => [ [ 'provider' ], ],
6562       'index'  => [],
6563     },
6564
6565     'circuit_termination' => {
6566       'columns' => [
6567         'termnum',     'serial',     '',      '', '', '',
6568         'termination','varchar',     '', $char_d, '', '',
6569         'disabled',      'char', 'NULL',       1, '', '',
6570       ],
6571       'primary_key' => 'termnum',
6572       'unique' => [ [ 'termination' ] ],
6573       'index' => [],
6574     },
6575
6576     'svc_circuit' => {
6577       'columns' => [
6578         'svcnum',                   'int',     '', '', '', '',
6579         'typenum',                  'int',     '', '', '', '',
6580         'providernum',              'int',     '', '', '', '',
6581         'termnum',                  'int',     '', '', '', '',
6582         'circuit_id',           'varchar',     '', 64, '', '',
6583         'desired_due_date',         'int', 'NULL', '', '', '',
6584         'due_date',                 'int', 'NULL', '', '', '',
6585         'vendor_order_id',      'varchar', 'NULL', $char_d,  '', '',
6586         'vendor_qual_id',       'varchar', 'NULL', $char_d,  '', '',
6587         'vendor_order_type',    'varchar', 'NULL', $char_d,  '', '',
6588         'vendor_order_status',  'varchar', 'NULL', $char_d,  '', '',
6589         'endpoint_ip_addr',     'varchar', 'NULL', 40, '', '',
6590         'endpoint_mac_addr',    'varchar', 'NULL', 12, '', '',
6591       ],
6592       'primary_key' => 'svcnum',
6593       'unique'      => [],
6594       'index'       => [ [ 'providernum' ], [ 'typenum' ] ],
6595       'foreign_keys' => [
6596                           { columns => [ 'svcnum' ],
6597                             table   => 'cust_svc',
6598                           },
6599                           { columns => [ 'typenum' ],
6600                             table   => 'circuit_type',
6601                           },
6602                           { columns => [ 'providernum' ],
6603                             table   => 'circuit_provider',
6604                           },
6605                           { columns => [ 'termnum' ],
6606                             table   => 'circuit_termination',
6607                           },
6608       ],
6609     },
6610
6611     'vend_main' => {
6612       'columns' => [
6613         'vendnum',   'serial',     '',      '', '', '',
6614         'vendname', 'varchar',     '', $char_d, '', '',
6615         'classnum',     'int',     '',      '', '', '',
6616         'disabled',    'char', 'NULL',       1, '', '', 
6617       ],
6618       'primary_key'  => 'vendnum',
6619       'unique'       => [ ['vendname', 'disabled'] ],
6620       'index'        => [],
6621       'foreign_keys' => [
6622                           { columns    => [ 'classnum' ],
6623                             table      => 'vend_class',
6624                           },
6625                         ],
6626     },
6627
6628     'vend_class' => {
6629       'columns' => [
6630         'classnum',     'serial',     '',      '', '', '', 
6631         'classname',   'varchar',     '', $char_d, '', '', 
6632         'disabled',       'char', 'NULL',       1, '', '', 
6633       ],
6634       'primary_key' => 'classnum',
6635       'unique'      => [],
6636       'index'       => [ ['disabled'] ],
6637     },
6638
6639     'vend_bill' => {
6640       'columns' => [
6641         'vendbillnum',    'serial',     '',      '', '', '', 
6642         'vendnum',           'int',     '',      '', '', '', 
6643         #'_date',        @date_type,                  '', '', 
6644         '_date',     'int', '', '',                   '', '', 
6645         'charged',     @money_type,                  '', '', 
6646       ],
6647       'primary_key'  => 'vendbillnum',
6648       'unique'       => [],
6649       'index'        => [ ['vendnum'], ['_date'], ],
6650       'foreign_keys' => [
6651                           { columns    => [ 'vendnum' ],
6652                             table      => 'vend_main',
6653                           },
6654                         ],
6655     },
6656
6657     'vend_pay' => {
6658       'columns' => [
6659         'vendpaynum',   'serial',    '',       '', '', '',
6660         'vendnum',         'int',    '',       '', '', '', 
6661         #'_date',     @date_type,                   '', '', 
6662         '_date',     'int', '', '',                   '', '', 
6663         'paid',      @money_type,                  '', '', 
6664       ],
6665       'primary_key'  => 'vendpaynum',
6666       'unique'       => [],
6667       'index'        => [ [ 'vendnum' ], [ '_date' ], ],
6668       'foreign_keys' => [
6669                           { columns    => [ 'vendnum' ],
6670                             table      => 'vend_main',
6671                           },
6672                         ],
6673     },
6674
6675     'vend_bill_pay' => {
6676       'columns' => [
6677         'vendbillpaynum', 'serial',     '',   '', '', '', 
6678         'vendbillnum',       'int',     '',   '', '', '', 
6679         'vendpaynum',        'int',     '',   '', '', '', 
6680         'amount',  @money_type, '', '', 
6681         #? '_date',   @date_type, '', '', 
6682       ],
6683       'primary_key'  => 'vendbillpaynum',
6684       'unique'       => [],
6685       'index'        => [ [ 'vendbillnum' ], [ 'vendpaynum' ] ],
6686       'foreign_keys' => [
6687                           { columns    => [ 'vendbillnum' ],
6688                             table      => 'vend_bill',
6689                           },
6690                           { columns    => [ 'vendpaynum' ],
6691                             table      => 'vend_pay',
6692                           },
6693                         ],
6694     },
6695
6696     %{ tables_hashref_torrus() },
6697
6698     # tables of ours for doing torrus virtual port combining
6699     'torrus_srvderive' => {
6700       'columns' => [
6701         'derivenum',     'serial',     '', '', '', '',
6702         'serviceid',    'varchar',     '', 64, '', '', #srvexport / reportfields
6703         'last_srv_date',   'date', 'NULL', '', '', '',
6704       ],
6705       'primary_key' => 'derivenum',
6706       'unique' => [ ['serviceid'] ],
6707       'index'  => [],
6708     },
6709
6710     'torrus_srvderive_component' => {
6711       'columns' => [
6712         'componentnum', 'serial', '', '', '', '',
6713         'derivenum',       'int', '', '', '', '',
6714         'serviceid',   'varchar', '', 64, '', '', #srvexport / reportfields
6715       ],
6716       'primary_key'  => 'componentnum',
6717       'unique'       => [ [ 'derivenum', 'serviceid' ], ],
6718       'index'        => [ [ 'derivenum', ], ],
6719       'foreign_keys' => [
6720                           { columns    => [ 'derivenum' ],
6721                             table      => 'torrus_srvderive',
6722                           },
6723                         ],
6724     },
6725
6726     'invoice_mode' => {
6727       'columns' => [
6728         'modenum',      'serial', '', '', '', '',
6729         'agentnum',        'int', 'NULL', '', '', '',
6730         'modename',    'varchar', '', 32, '', '',
6731       ],
6732       'primary_key' => 'modenum',
6733       'unique'      => [ ],
6734       'index'       => [ ],
6735       'foreign_keys' => [
6736                           { columns    => [ 'agentnum' ],
6737                             table      => 'agent',
6738                           },
6739                         ],
6740     },
6741
6742     'invoice_conf' => {
6743       'columns' => [
6744         'confnum',              'serial',   '', '', '', '',
6745         'modenum',              'int',      '', '', '', '',
6746         'locale',               'varchar',  'NULL', 16, '', '',
6747         'notice_name',          'varchar',  'NULL', 64, '', '',
6748         'subject',              'varchar',  'NULL', 64, '', '',
6749         'htmlnotes',            'text',     'NULL', '', '', '',
6750         'htmlfooter',           'text',     'NULL', '', '', '',
6751         'htmlsummary',          'text',     'NULL', '', '', '',
6752         'htmlreturnaddress',    'text',     'NULL', '', '', '',
6753         'latexnotes',           'text',     'NULL', '', '', '',
6754         'latexfooter',          'text',     'NULL', '', '', '',
6755         'latexsummary',         'text',     'NULL', '', '', '',
6756         'latexsmallfooter',     'text',     'NULL', '', '', '',
6757         'latexreturnaddress',   'text',     'NULL', '', '', '',
6758         'with_latexcoupon',     'char',     'NULL', '1', '', '',
6759         'lpr',                  'varchar',  'NULL', $char_d, '', '',
6760       ],
6761       'primary_key'  => 'confnum',
6762       'unique'       => [ [ 'modenum', 'locale' ] ],
6763       'index'        => [ ],
6764       'foreign_keys' => [
6765                           { columns    => [ 'modenum' ],
6766                             table      => 'invoice_mode',
6767                           },
6768                         ],
6769     },
6770
6771     'export_batch' => {
6772       'columns' => [
6773         'batchnum',    'serial',     '',      '', '', '',
6774         'exportnum',      'int',     '',      '', '', '',
6775         '_date',          'int',     '',      '', '', '',
6776         'status',     'varchar', 'NULL',      32, '', '',
6777         'statustext',    'text', 'NULL',      '', '', '',
6778       ],
6779       'primary_key'  => 'batchnum',
6780       'unique'       => [],
6781       'index'        => [ [ 'exportnum' ], [ 'status' ] ],
6782       'foreign_keys' => [
6783                           { columns    => [ 'exportnum' ],
6784                             table      => 'part_export',
6785                             references => [ 'exportnum' ]
6786                           },
6787                         ],
6788     },
6789
6790     'export_batch_item' => {
6791       'columns' => [
6792         'itemnum',     'serial',     '',      '', '', '',
6793         'batchnum',       'int',     '',      '', '', '',
6794         'svcnum',         'int',     '',      '', '', '',
6795         'action',     'varchar',     '',      32, '', '',
6796         'data',          'text', 'NULL',      '', '', '',
6797         'frozen',        'char', 'NULL',       1, '', '',
6798       ],
6799       'primary_key'  => 'itemnum',
6800       'unique'       => [],
6801       'index'        => [ [ 'batchnum' ], [ 'svcnum' ] ],
6802       'foreign_keys' => [
6803                           { columns    => [ 'batchnum' ],
6804                             table      => 'export_batch',
6805                             references => [ 'batchnum' ]
6806                           },
6807                         ],
6808     },
6809
6810     # lookup table for states, similar to msa and lata
6811     'state' => {
6812       'columns' => [
6813         'statenum', 'int',  '', '', '', '', 
6814         'country',  'char', '',  2, '', '',
6815         'state',    'char', '', $char_d, '', '', 
6816         'fips',     'char', '',  3, '', '',
6817       ],
6818       'primary_key' => 'statenum',
6819       'unique' => [ [ 'country', 'state' ], ],
6820       'index' => [],
6821     },
6822
6823     # eventually link to tower/sector?
6824     'deploy_zone' => {
6825       'columns' => [
6826         'zonenum',        'serial',  '',     '',      '', '',
6827         'description',    'char',    'NULL', $char_d, '', '',
6828         'agentnum',       'int',     '',     '',      '', '',
6829         'dbaname',        'char',    'NULL', $char_d, '', '',
6830         'zonetype',       'char',    '',     1,       '', '',
6831         'technology',     'int',     '',     '',      '', '',
6832         'spectrum',       'int',     'NULL', '',      '', '',
6833         'adv_speed_up',   'decimal', '',     '10,3', '0', '',
6834         'adv_speed_down', 'decimal', '',     '10,3', '0', '',
6835         'cir_speed_up',   'decimal', '',     '10,3', '0', '',
6836         'cir_speed_down', 'decimal', '',     '10,3', '0', '',
6837         'is_broadband',   'char',    'NULL', 1,       '', '',
6838         'is_voice',       'char',    'NULL', 1,       '', '',
6839         'is_consumer',    'char',    'NULL', 1,       '', '',
6840         'is_business',    'char',    'NULL', 1,       '', '',
6841         'active_date',    @date_type,                 '', '',
6842         'expire_date',    @date_type,                 '', '',
6843       ],
6844       'primary_key' => 'zonenum',
6845       'unique' => [],
6846       'index'  => [ [ 'agentnum' ] ],
6847       'foreign_keys' => [
6848                           { columns     => [ 'agentnum' ],
6849                             table       => 'agent',
6850                             references  => [ 'agentnum' ],
6851                           },
6852                         ],
6853     },
6854
6855     'deploy_zone_block' => {
6856       'columns' => [
6857         'blocknum',       'serial',  '',     '',      '', '',
6858         'zonenum',        'int',     '',     '',      '', '',
6859         'censusblock',    'char',    '',     15,      '', '',
6860         'censusyear',     'char',    '',      4,      '', '',
6861       ],
6862       'primary_key' => 'blocknum',
6863       'unique' => [],
6864       'index'  => [ [ 'zonenum' ] ],
6865       'foreign_keys' => [
6866                           { columns     => [ 'zonenum' ],
6867                             table       => 'deploy_zone',
6868                             references  => [ 'zonenum' ],
6869                           },
6870                         ],
6871     },
6872
6873     'deploy_zone_vertex' => {
6874       'columns' => [
6875         'vertexnum',      'serial',  '',     '',      '', '',
6876         'zonenum',        'int',     '',     '',      '', '',
6877         'latitude',       'decimal', '',     '10,7',  '', '', 
6878         'longitude',      'decimal', '',     '10,7',  '', '', 
6879       ],
6880       'primary_key' => 'vertexnum',
6881       'unique' => [ ],
6882       'index'  => [ ],
6883       'foreign_keys' => [
6884                           { columns     => [ 'zonenum' ],
6885                             table       => 'deploy_zone',
6886                             references  => [ 'zonenum' ],
6887                           },
6888                         ],
6889     },
6890
6891
6892
6893
6894
6895     # name type nullability length default local
6896
6897     #'new_table' => {
6898     #  'columns' => [
6899     #    'num', 'serial',       '', '', '', '',
6900     #  ],
6901     #  'primary_key' => 'num',
6902     #  'unique' => [],
6903     #  'index'  => [],
6904     #},
6905
6906   };
6907
6908 }
6909
6910 =back
6911
6912 =head1 BUGS
6913
6914 =head1 SEE ALSO
6915
6916 L<DBIx::DBSchema>
6917
6918 =cut
6919
6920 1;
6921