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