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