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