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