c0dd2b4bc2260493047e2d125f65fc88f61d2f44
[freeside.git] / FS / FS / Schema.pm
1 package FS::Schema;
2
3 use vars qw(@ISA @EXPORT_OK $DEBUG $setup_hack %dbdef_cache);
4 use subs qw(reload_dbdef);
5 use Exporter;
6 use DBIx::DBSchema 0.44; #for foreign keys with MATCH / ON DELETE/UPDATE
7 use DBIx::DBSchema::Table;
8 use DBIx::DBSchema::Column;
9 use DBIx::DBSchema::Index;
10 use DBIx::DBSchema::ForeignKey;
11 #can't use this yet, dependency bs #use FS::Conf;
12
13 @ISA = qw(Exporter);
14 @EXPORT_OK = qw( dbdef dbdef_dist reload_dbdef );
15
16 $DEBUG = 0;
17 $me = '[FS::Schema]';
18
19 =head1 NAME
20
21 FS::Schema - Freeside database schema
22
23 =head1 SYNOPSYS
24
25     use FS::Schema qw(dbdef dbdef_dist reload_dbdef);
26
27     $dbdef = reload_dbdef;
28     $dbdef = reload_dbdef "/non/standard/filename";
29     $dbdef = dbdef;
30     $dbdef_dist = dbdef_dist;
31
32 =head1 DESCRIPTION
33
34 This class represents the database schema.
35
36 =head1 METHODS
37
38 =over 4
39
40 =item reload_dbdef([FILENAME])
41
42 Load a database definition (see L<DBIx::DBSchema>), optionally from a
43 non-default filename.  This command is executed at startup unless
44 I<$FS::Schema::setup_hack> is true.  Returns a DBIx::DBSchema object.
45
46 =cut
47
48 sub reload_dbdef {
49   my $file = shift;
50
51   unless ( exists $dbdef_cache{$file} ) {
52     warn "[debug]$me loading dbdef for $file\n" if $DEBUG;
53     $dbdef_cache{$file} = DBIx::DBSchema->load( $file )
54       or die "can't load database schema from $file: $DBIx::DBSchema::errstr\n";
55   } else {
56     warn "[debug]$me re-using cached dbdef for $file\n" if $DEBUG;
57   }
58   $dbdef = $dbdef_cache{$file};
59 }
60
61 =item dbdef
62
63 Returns the current database definition (represents the current database,
64 assuming it is up-to-date).  See L<DBIx::DBSchema>.
65
66 =cut
67
68 sub dbdef { $dbdef; }
69
70 =item dbdef_dist [ DATASRC ]
71
72 Returns the current canoical database definition as defined in this file.
73
74 Optionally, pass a DBI data source to enable syntax specific to that database.
75 Currently, this enables "ENGINE=InnoDB" for MySQL databases.
76
77 =cut
78
79 sub dbdef_dist {
80   my $datasrc = @_ && !ref($_[0]) ? shift : '';
81   my $opt = @_ ? shift : {};
82   
83   my $local_options = '';
84   if ( $datasrc =~ /^dbi:mysql/i ) {
85     $local_options = 'ENGINE=InnoDB';
86   }
87
88   ###
89   # create a dbdef object from the old data structure
90   ###
91
92   my $tables_hashref = tables_hashref();
93
94   #turn it into objects
95   my $dbdef = new DBIx::DBSchema map {  
96
97     my $tablename = $_;
98     my $indexnum = 1;
99
100     my @columns;
101     while (@{$tables_hashref->{$tablename}{'columns'}}) {
102       #my($name, $type, $null, $length, $default, $local) =
103       my @coldef = 
104         splice @{$tables_hashref->{$tablename}{'columns'}}, 0, 6;
105       my %hash = map { $_ => shift @coldef }
106                      qw( name type null length default local );
107
108       #can be removed once we depend on DBIx::DBSchema 0.39;
109       $hash{'type'} = 'LONGTEXT'
110         if $hash{'type'} =~ /^TEXT$/i && $datasrc =~ /^dbi:mysql/i;
111
112       unless ( defined $hash{'default'} ) {
113         warn "$tablename:\n".
114              join('', map "$_ => $hash{$_}\n", keys %hash) ;# $stop = <STDIN>;
115       }
116
117       push @columns, new DBIx::DBSchema::Column ( \%hash );
118     }
119
120     #false laziness w/sub indices in DBIx::DBSchema::DBD (well, sorta)
121     #and sub sql_create_table in DBIx::DBSchema::Table (slighty more?)
122     my $unique = $tables_hashref->{$tablename}{'unique'};
123     warn "missing index for $tablename\n" unless defined $tables_hashref->{$tablename}{'index'};
124     my @index  = @{ $tables_hashref->{$tablename}{'index'} };
125
126     # kludge to avoid avoid "BLOB/TEXT column 'statustext' used in key
127     #  specification without a key length".
128     # better solution: teach DBIx::DBSchema to specify a default length for
129     #  MySQL indices on text columns, or just to support an index length at all
130     #  so we can pass something in.
131     # best solution: eliminate need for this index in cust_main::retry_realtime
132     @index = grep { @{$_}[0] ne 'statustext' } @index
133       if $datasrc =~ /^dbi:mysql/i;
134
135     my @indices = ();
136     push @indices, map {
137                          DBIx::DBSchema::Index->new({
138                            'name'    => $tablename. $indexnum++,
139                            'unique'  => 1,
140                            'columns' => $_,
141                          });
142                        }
143                        @$unique;
144     push @indices, map {
145                          DBIx::DBSchema::Index->new({
146                            'name'    => $tablename. $indexnum++,
147                            'unique'  => 0,
148                            'columns' => $_,
149                          });
150                        }
151                        @index;
152
153     my @foreign_keys =
154       map DBIx::DBSchema::ForeignKey->new($_),
155         @{ $tables_hashref->{$tablename}{'foreign_keys'} || [] };
156
157     DBIx::DBSchema::Table->new({
158       name          => $tablename,
159       primary_key   => $tables_hashref->{$tablename}{'primary_key'},
160       columns       => \@columns,
161       indices       => \@indices,
162       foreign_keys  => \@foreign_keys,
163       local_options => $local_options,
164     });
165
166   } keys %$tables_hashref;
167
168   if ( $DEBUG ) {
169     warn "[debug]$me initial dbdef_dist created ($dbdef) with tables:\n";
170     warn "[debug]$me   $_\n" foreach $dbdef->tables;
171   }
172   
173   #add radius attributes to svc_acct
174   #
175   #my($svc_acct)=$dbdef->table('svc_acct');
176   # 
177   #my($attribute);
178   #foreach $attribute (@attributes) {
179   #  $svc_acct->addcolumn ( new DBIx::DBSchema::Column (
180   #    'radius_'. $attribute,
181   #    'varchar',
182   #    'NULL',
183   #    $char_d,
184   #  ));
185   #}
186   # 
187   #foreach $attribute (@check_attributes) {
188   #  $svc_acct->addcolumn( new DBIx::DBSchema::Column (
189   #    'rc_'. $attribute,
190   #    'varchar',
191   #    'NULL',
192   #    $char_d,
193   #  ));
194   #}
195
196   my $tables_hashref_torrus = tables_hashref_torrus();
197
198   #create history tables
199   foreach my $table (
200     grep {    ! /^(clientapi|access_user)_session/
201            && ! /^h_/
202            && ! /^log(_context)?$/
203            && ! /^legacy_cust_history$/
204            && ( ! /^queue(_arg|_depend|_stat)?$/ || ! $opt->{'queue-no_history'} )
205            && ! $tables_hashref_torrus->{$_}
206          }
207       $dbdef->tables
208   ) {
209     my $tableobj = $dbdef->table($table)
210       or die "unknown table $table";
211
212     my %h_indices = ();
213
214     unless ( $table eq 'cust_event' || $table eq 'cdr' ) { #others?
215
216       my %indices = $tableobj->indices;
217     
218       %h_indices = map { 
219                          ( "h_$_" =>
220                              DBIx::DBSchema::Index->new({
221                                'name'    => 'h_'. $indices{$_}->name,
222                                'unique'  => 0,
223                                'columns' => [ @{$indices{$_}->columns} ],
224                              })
225                          );
226                        }
227                        keys %indices;
228
229       $h_indices{"h_${table}_srckey"} =
230         DBIx::DBSchema::Index->new({
231           'name'    => "h_${table}_srckey",
232           'unique'  => 0,
233           'columns' => [ 'history_action', #right?
234                          $tableobj->primary_key,
235                        ],
236         });
237
238       $h_indices{"h_${table}_srckey2"} =
239          DBIx::DBSchema::Index->new({
240            'name'    => "h_${table}_srckey2",
241            'unique'  => 0,
242            'columns' => [ 'history_date',
243                           $tableobj->primary_key,
244                         ],
245          });
246
247         #necessary for queries that want to look at *who* made changes
248       $h_indices{"h_${table}_usernum"} =
249          DBIx::DBSchema::Index->new({
250            'name'    => "h_${table}_usernum",
251            'unique'  => 0,
252            'columns' => [ 'history_usernum'],
253          });
254
255         # necessary because of the evil OR username for older data, be really nice if everything was just migrated to usernum and we could drop username
256         # This will not be helpful to mysql, but postgres smartly does a bitmap across both indexes, mysql will just use one
257
258       $h_indices{"h_${table}_user"} =
259          DBIx::DBSchema::Index->new({
260            'name'    => "h_${table}_user",
261            'unique'  => 0,
262            'columns' => [ 'history_user'],
263          });
264     }
265
266     my $primary_key_col = $tableobj->column($tableobj->primary_key)
267       or die "$table: primary key declared as ". $tableobj->primary_key.
268              ", but no column of that name\n";
269
270     my $historynum_type = ( $tableobj->column($tableobj->primary_key)->type
271                               =~ /^(bigserial|bigint|int8)$/i
272                                 ? 'bigserial'
273                                 : 'serial'
274                           );
275
276     my $h_tableobj = DBIx::DBSchema::Table->new( {
277       'name'          => "h_$table",
278       'primary_key'   => 'historynum',
279       'indices'       => \%h_indices,
280       'local_options' => $local_options,
281       'columns'       => [
282           DBIx::DBSchema::Column->new( {
283             'name'    => 'historynum',
284             'type'    => $historynum_type,
285             'null'    => 'NOT NULL',
286             'length'  => '',
287             'default' => '',
288             'local'   => '',
289           } ),
290           DBIx::DBSchema::Column->new( {
291             'name'    => 'history_date',
292             'type'    => 'int',
293             'null'    => 'NULL',
294             'length'  => '',
295             'default' => '',
296             'local'   => '',
297           } ),
298           DBIx::DBSchema::Column->new( {
299             'name'    => 'history_user',
300             'type'    => 'varchar',
301             'null'    => 'NULL',
302             'length'  => '80',
303             'default' => '',
304             'local'   => '',
305           } ),
306           DBIx::DBSchema::Column->new( {
307             'name'    => 'history_usernum',
308             'type'    => 'int',
309             'null'    => 'NULL',
310             'length'  => '',
311             'default' => '',
312             'local'   => '',
313           } ),
314           DBIx::DBSchema::Column->new( {
315             'name'    => 'history_action',
316             'type'    => 'varchar',
317             'null'    => 'NOT NULL',
318             'length'  => '80',
319             'default' => '',
320             'local'   => '',
321           } ),
322           map {
323             my $column = $tableobj->column($_);
324     
325             #clone so as to not disturb the original
326             $column = DBIx::DBSchema::Column->new( {
327               map { $_ => $column->$_() }
328                 qw( name type null length default local )
329             } );
330     
331             if ( $column->type =~ /^(\w*)SERIAL$/i ) {
332               $column->type(uc($1).'INT');
333               $column->null('NULL');
334             }
335             #$column->default('')
336             #  if $column->default =~ /^nextval\(/i;
337             #( my $local = $column->local ) =~ s/AUTO_INCREMENT//i;
338             #$column->local($local);
339             $column;
340           } $tableobj->columns
341       ],
342     } );
343     $dbdef->addtable($h_tableobj);
344   }
345
346   if ( $datasrc =~ /^dbi:mysql/i ) {
347
348     my $dup_lock_table = DBIx::DBSchema::Table->new( {
349       'name'          => 'duplicate_lock',
350       'primary_key'   => 'duplocknum',
351       'local_options' => $local_options,
352       'columns'       => [
353         DBIx::DBSchema::Column->new( {
354           'name'    => 'duplocknum',
355           'type'    => 'serial',
356           'null'    => 'NOT NULL',
357           'length'  => '',
358           'default' => '',
359           'local'   => '',
360         } ),
361         DBIx::DBSchema::Column->new( {
362           'name'    => 'lockname',
363           'type'    => 'varchar',
364           'null'    => 'NOT NULL',
365           'length'  => '80',
366           'default' => '',
367           'local'   => '',
368         } ),
369       ],
370       'indices' => { 'duplicate_lock1' =>
371                        DBIx::DBSchema::Index->new({
372                          'name'    => 'duplicate_lock1',
373                          'unique'  => 1,
374                          'columns' => [ 'lockname' ],
375                        })
376                    },
377     } );
378
379     $dbdef->addtable($dup_lock_table);
380
381   }
382
383   $dbdef;
384
385 }
386
387 #torrus tables http://torrus.org/reporting_setup.pod.html#create_sql_tables
388 sub tables_hashref_torrus {
389
390   return {
391
392     # Collector export table. It usually grows at several megabytes
393     # per month, and is updated every 5 minutes
394     'srvexport' => {
395       'columns' => [
396         'id',         'serial', '', '', '', '',
397         'srv_date',     'date', '', '', '', '',#date and time of the data sample
398         'srv_time',     'time', '', '', '', '',
399         'serviceid', 'varchar', '', 64, '', '',#unique service ID per counter
400         'value',     'double precision', '', '', '', '',#collected rate or gauge value
401         'intvl', 'int', '', '', '', '', # collection interval - for counter volume calculation
402       ],
403       'primary_key' => 'id',
404       'unique' => [],
405       'index'  => [ ['srv_date'], ['srv_date', 'srv_time'], ['serviceid'], ],
406     },
407
408     #Tables for (currently monthly only) report contents.
409     #These are updated usually once per month, and read at the moment of
410     #rendering the report output (HTML now, PDF or XML or Excel or whatever
411     #in the future)
412
413     #DBIx::Sequence backend, theplatform-independent inplementation
414     #of sequences
415     'dbix_sequence_state' => {
416       'columns' => [
417         'id',       'serial', '', '', '', '',
418         'dataset', 'varchar', '', 50, '', '',
419         'state_id',    'int', '', '', '', '',
420       ],
421       'primary_key' => 'id',
422       #CONSTRAINT pk_dbix_sequence PRIMARY KEY (dataset, state_id)
423       'unique' => [ [ 'dataset', 'state_id' ], ],
424       'index'  => [],
425     },
426
427     'dbix_sequence_release' => {
428       'columns' => [
429         'id',       'serial', '', '', '', '',
430         'dataset', 'varchar', '', 50, '', '',
431         'released_id', 'int', '', '', '', '',
432       ],
433       'primary_key' => 'id',
434       #CONSTRAINT pk_dbi_release PRIMARY KEY (dataset, released_id)
435       'unique' => [ [ 'dataset', 'released_id', ] ],
436       'index'  => [],
437     },
438
439     #Each report is characterized by name, date and time.
440     #Monthly reports are automatically assigned 00:00 of the 1st day
441     #in the month. The report contains fields for every service ID
442     #defined across all datasource trees.
443     'reports' => {
444       'columns' => [
445         'id',          'serial', '', '', '', '',
446         'rep_date',      'date', '', '', '', '',#Start date of the report
447         'rep_time',      'time', '', '', '', '',#Start time of the report
448         'reportname', 'varchar', '', 64, '', '',#Report name, such as
449                                                 # MonthlyUsage
450         'iscomplete',     'int', '', '', '', '',#0 when the report is in
451                                                 # progress, 1 when it is ready
452       ],
453       'primary_key' => 'id',
454       'unique' => [ [ qw(rep_date rep_time reportname) ] ],
455       'index'  => [ [ 'rep_date' ] ],
456     },
457
458     #Each report contains fields. For each service ID,
459     #the report may contain several fields for various statistics.
460     #Each field contains information about the units of the value it
461     #contains
462     'reportfields' => {
463       'columns' => [
464         'id',              'serial',     '', '',    '', '',
465         'rep_id',             'int', 'NULL', '',    '', '',
466         'name',           'varchar',     '', 64,    '', '',#name of the field,
467                                                            # such as AVG or MAX
468         'serviceid',      'varchar',     '', 64,    '', '',#service ID
469         'value', 'double precision',     '', '',    '', '',#Numeric value
470         'units',          'varchar',     '', 64, \"''", '',#Units, such as bytes
471                                                            # or Mbps
472       ],
473       'primary_key', => 'id',
474       'unique' => [ [ qw(rep_id name serviceid) ] ],
475       'index'  => [],
476     },
477
478   };
479
480 }
481
482 sub tables_hashref {
483
484   my $char_d = 80; #default maxlength for text fields
485
486   #my(@date_type)  = ( 'timestamp', '', ''     );
487   my @date_type = ( 'int', 'NULL', ''     );
488   my @perl_type = ( 'text', 'NULL', ''  ); 
489   my @money_type = ( 'decimal',   '', '10,2' );
490   my @money_typen = ( 'decimal',   'NULL', '10,2' );
491   my @taxrate_type  = ( 'decimal',   '',     '14,8' ); # requires pg 8 for 
492   my @taxrate_typen = ( 'decimal',   'NULL', '14,8' ); # fs-upgrade to work
493
494   my $username_len = 64; #usernamemax config file
495
496     # name type nullability length default local
497
498   return {
499
500     'agent' => {
501       'columns' => [
502         'agentnum',          'serial',    '',       '', '', '', 
503         'agent',            'varchar',    '',  $char_d, '', '', 
504         'typenum',              'int',    '',       '', '', '', 
505         'ticketing_queueid',    'int', 'NULL',      '', '', '', 
506         'invoice_template', 'varchar', 'NULL', $char_d, '', '',
507         'agent_custnum',        'int', 'NULL',      '', '', '',
508         'disabled',            'char', 'NULL',       1, '', '', 
509         'username',         'varchar', 'NULL', $char_d, '', '',
510         '_password',        'varchar', 'NULL', $char_d, '', '',
511         'freq',              'int', 'NULL', '', '', '', #deprecated (never used)
512         'prog',                     @perl_type, '', '', #deprecated (never used)
513       ],
514       'primary_key'  => 'agentnum',
515       #'unique' => [ [ 'agent_custnum' ] ], #one agent per customer?
516                                             #insert is giving it a value, tho..
517       #'index' => [ ['typenum'], ['disabled'] ],
518       'unique'       => [],
519       'index'        => [ ['typenum'], ['disabled'], ['agent_custnum'] ],
520       'foreign_keys' => [
521                           { columns    => [ 'typenum' ],
522                             table      => 'agent_type',
523                           },
524                           # 1. RT tables aren't part of our data structure, so
525                           #     we can't make sure Queue is created already
526                           # 2. Future ability to plug in other ticketing systems
527                           #{ columns    => [ 'ticketing_queueid' ],
528                           #  table      => 'Queue',
529                           #  references => [ 'id' ],
530                           #},
531                           { columns    => [ 'agent_custnum' ],
532                             table      => 'cust_main',
533                             references => [ 'custnum' ],
534                           },
535                         ],
536     },
537
538     'agent_pkg_class' => {
539       'columns' => [
540         'agentpkgclassnum',    'serial',     '',    '', '', '',
541         'agentnum',               'int',     '',    '', '', '',
542         'classnum',               'int', 'NULL',    '', '', '',
543         'commission_percent', 'decimal',     '', '7,4', '', '',
544       ],
545       'primary_key'  => 'agentpkgclassnum',
546       'unique'       => [ [ 'agentnum', 'classnum' ], ],
547       'index'        => [],
548       'foreign_keys' => [
549                           { columns    => [ 'agentnum' ],
550                             table      => 'agent',
551                           },
552                           { columns    => [ 'classnum' ],
553                             table      => 'pkg_class',
554                           },
555                         ],
556     },
557
558     'agent_type' => {
559       'columns' => [
560         'typenum',  'serial',      '',      '', '', '',
561         'atype',    'varchar',     '', $char_d, '', '',
562         'disabled',    'char', 'NULL',       1, '', '',
563       ],
564       'primary_key' => 'typenum',
565       'unique' => [],
566       'index' => [ ['disabled'] ],
567     },
568
569     'type_pkgs' => {
570       'columns' => [
571         'typepkgnum', 'serial', '', '', '', '', 
572         'typenum',   'int',  '', '', '', '', 
573         'pkgpart',   'int',  '', '', '', '', 
574       ],
575       'primary_key'  => 'typepkgnum',
576       'unique'       => [ ['typenum', 'pkgpart'] ],
577       'index'        => [ ['typenum'] ],
578       'foreign_keys' => [
579                           { columns    => [ 'typenum' ],
580                             table      => 'agent_type',
581                           },
582                           { columns    => [ 'pkgpart' ],
583                             table      => 'part_pkg',
584                           },
585                         ],
586     },
587
588     'agent_currency' => {
589       'columns' => [
590         'agentcurrencynum', 'serial', '', '', '', '',
591         'agentnum',            'int', '', '', '', '',
592         'currency',           'char', '',  3, '', '',
593       ],
594       'primary_key'  => 'agentcurrencynum',
595       'unique'       => [],
596       'index'        => [ ['agentnum'] ],
597       'foreign_keys' => [
598                           { columns    => [ 'agentnum' ],
599                             table      => 'agent',
600                           },
601                         ],
602     },
603
604     'sales' => {
605       'columns' => [
606         'salesnum',          'serial',    '',       '', '', '', 
607         'salesperson',      'varchar',    '',  $char_d, '', '', 
608         'agentnum',             'int', 'NULL',      '', '', '', 
609         'sales_custnum',        'int', 'NULL',      '', '', '',
610         'disabled',            'char', 'NULL',       1, '', '', 
611       ],
612       'primary_key'  => 'salesnum',
613       'unique'       => [],
614       'index'        => [ ['salesnum'], ['disabled'] ],
615       'foreign_keys' => [
616                           { columns    => [ 'agentnum' ],
617                             table      => 'agent',
618                           },
619                           { columns    => [ 'sales_custnum' ],
620                             table      => 'cust_main',
621                             references => [ 'custnum' ],
622                           },
623                         ],
624     },
625
626     'sales_pkg_class' => {
627       'columns' => [
628         'salespkgclassnum',    'serial',     '',    '', '', '',
629         'salesnum',               'int',     '',    '', '', '',
630         'classnum',               'int', 'NULL',    '', '', '',
631         'commission_percent', 'decimal',     '', '7,4', '', '',
632         'commission_duration',    'int', 'NULL',    '', '', '',
633       ],
634       'primary_key'  => 'salespkgclassnum',
635       'unique'       => [ [ 'salesnum', 'classnum' ], ],
636       'index'        => [],
637       'foreign_keys' => [
638                           { columns    => [ 'salesnum' ],
639                             table      => 'sales',
640                           },
641                           { columns    => [ 'classnum' ],
642                             table      => 'pkg_class',
643                           },
644                         ],
645     },
646
647     'cust_attachment' => {
648       'columns' => [
649         'attachnum', 'serial', '', '', '', '',
650         'custnum',   'int', '', '', '', '',
651         '_date',     @date_type, '', '',
652         'otaker',    'varchar', 'NULL', 32, '', '',
653         'usernum',   'int', 'NULL', '', '', '',
654         'filename',  'varchar', '', 255, '', '',
655         'mime_type', 'varchar', '', $char_d, '', '',
656         'title',     'varchar', 'NULL', $char_d, '', '',
657         'body',      'blob', 'NULL', '', '', '',
658         'disabled',  @date_type, '', '',
659       ],
660       'primary_key'  => 'attachnum',
661       'unique'       => [],
662       'index'        => [ ['custnum'], ['usernum'], ],
663       'foreign_keys' => [
664                           { columns    => [ 'custnum' ],
665                             table      => 'cust_main',
666                           },
667                           { columns    => [ 'usernum' ],
668                             table      => 'access_user',
669                           },
670                         ],
671    },
672
673     'cust_bill' => {
674       'columns' => [
675         #regular fields
676         'invnum',         'serial',     '',      '', '', '', 
677         'custnum',           'int',     '',      '', '', '', 
678         '_date',        @date_type,                  '', '', 
679         'charged',     @money_type,                  '', '', 
680         'currency',         'char', 'NULL',       3, '', '',
681         'invoice_terms', 'varchar', 'NULL', $char_d, '', '',
682
683         #customer balance info at invoice generation time
684         #(deprecated)
685         'previous_balance',   @money_typen, '', '',  #eventually not nullable
686         'billing_balance',    @money_typen, '', '',  #eventually not nullable
687
688         #deprecated (unused by now, right?)
689         'printed',      'int',     '', '', '', '', 
690
691         #specific use cases
692         'closed',      'char', 'NULL',  1, '', '', #not yet used much
693         'statementnum', 'int', 'NULL', '', '', '', #invoice aggregate statements
694         'agent_invid',  'int', 'NULL', '', '', '', #(varchar?) importing legacy
695         'promised_date', @date_type,       '', '',
696         
697         'pending',     'char', 'NULL',  1, '', '',
698       ],
699       'primary_key'  => 'invnum',
700       'unique'       => [ [ 'custnum', 'agent_invid' ] ], #agentnum?  huh
701       'index'        => [ ['custnum'], ['_date'], ['statementnum'],
702                           ['agent_invid'],
703                         ],
704       'foreign_keys' => [
705                           { columns    => [ 'custnum' ],
706                             table      => 'cust_main',
707                           },
708                           { columns    => [ 'statementnum' ],
709                             table      => 'cust_statement',
710                           },
711                         ],
712     },
713
714     'cust_bill_void' => {
715       'columns' => [
716         #regular fields
717         'invnum',            'int',     '',      '', '', '', 
718         'custnum',           'int',     '',      '', '', '', 
719         '_date',        @date_type,                  '', '', 
720         'charged',     @money_type,                  '', '', 
721         'currency',         'char', 'NULL',       3, '', '',
722         'invoice_terms', 'varchar', 'NULL', $char_d, '', '',
723
724         #customer balance info at invoice generation time
725         'previous_balance',   @money_typen, '', '',  #eventually not nullable
726         'billing_balance',    @money_typen, '', '',  #eventually not nullable
727
728         #specific use cases
729         'closed',      'char', 'NULL',  1, '', '', #not yet used much
730         'statementnum', 'int', 'NULL', '', '', '', #invoice aggregate statements
731         'agent_invid',  'int', 'NULL', '', '', '', #(varchar?) importing legacy
732         'promised_date', @date_type,       '', '',
733
734         #void fields
735         'void_date', @date_type, '', '', 
736         'reason',    'varchar',   'NULL', $char_d, '', '', 
737         'void_usernum',   'int', 'NULL', '', '', '',
738       ],
739       'primary_key'  => 'invnum',
740       'unique'       => [ [ 'custnum', 'agent_invid' ] ], #agentnum?  huh
741       'index'        => [ ['custnum'], ['_date'], ['statementnum'],
742                           ['agent_invid'], [ 'void_usernum' ],
743                         ],
744       'foreign_keys' => [
745                           { columns    => [ 'custnum' ],
746                             table      => 'cust_main',
747                           },
748                           { columns    => [ 'statementnum' ],
749                             table      => 'cust_statement', #_void? both?
750                           },
751                           { columns    => [ 'void_usernum' ],
752                             table      => 'access_user',
753                             references => [ 'usernum' ],
754                           },
755                         ],
756     },
757
758     #for importing invoices from a legacy system for display purposes only
759     # no effect upon balance
760     'legacy_cust_bill' => {
761       'columns' => [
762         'legacyinvnum',  'serial',     '',      '', '', '',
763         'legacyid',     'varchar', 'NULL', $char_d, '', '',
764         'custnum',          'int',     '',      '', '', '', 
765         '_date',       @date_type,                  '', '', 
766         'charged',    @money_type,                  '', '', 
767         'currency',        'char', 'NULL',       3, '', '',
768         'content_pdf',     'blob', 'NULL',      '', '', '',
769         'content_html',    'text', 'NULL',      '', '', '',
770         'locale',       'varchar', 'NULL',      16, '', '', 
771       ],
772       'primary_key'  => 'legacyinvnum',
773       'unique'       => [],
774       'index'        => [ ['legacyid', 'custnum', 'locale' ], ],
775       'foreign_keys' => [
776                           { columns    => [ 'custnum' ],
777                             table      => 'cust_main',
778                           },
779                         ],
780     },
781
782     'legacy_cust_history' => {
783       'columns' => [
784         'legacyhistorynum', 'serial',     '',        '', '', '',
785         'custnum',             'int',     '',        '', '', '',
786         'history_action',  'varchar',     '',   $char_d, '', '',
787         'history_date',           @date_type,            '', '',
788         'history_usernum',     'int', 'NULL',        '', '', '',
789         'item',            'varchar', 'NULL',   $char_d, '', '',
790         'description',     'varchar', 'NULL', 2*$char_d, '', '',
791         'change_data',        'text', 'NULL',        '', '', '',
792       ],
793       'primary_key'  => 'legacyhistorynum',
794       'unique'       => [],
795       'index'        => [ ['custnum'], ['history_date'], ],
796       'foreign_keys' => [
797                           { columns    => [ 'custnum' ],
798                             table      => 'cust_main',
799                           },
800                           { columns    => [ 'history_usernum' ],
801                             table      => 'access_user',
802                             references => [ 'usernum' ],
803                           },
804                         ],
805     },
806
807     'cust_statement' => {
808       'columns' => [
809         'statementnum', 'serial', '', '', '', '',
810         'custnum',         'int', '', '', '', '',
811         '_date',           @date_type,    '', '',
812       ],
813       'primary_key'  => 'statementnum',
814       'unique'       => [],
815       'index'        => [ ['custnum'], ['_date'], ],
816       'foreign_keys' => [
817                           { columns    => [ 'custnum' ],
818                             table      => 'cust_main',
819                           },
820                         ],
821     },
822
823     'part_event' => {
824       'columns' => [
825         'eventpart',   'serial',      '',      '', '', '', 
826         'agentnum',    'int',     'NULL',      '', '', '', 
827         'event',       'varchar',     '', $char_d, '', '', 
828         'eventtable',  'varchar',     '', $char_d, '', '',
829         'check_freq',  'varchar', 'NULL', $char_d, '', '', 
830         'weight',      'int',         '',      '', '', '', 
831         'action',      'varchar',     '', $char_d, '', '',
832         'disabled',     'char',   'NULL',       1, '', '', 
833       ],
834       'primary_key'  => 'eventpart',
835       'unique'       => [],
836       'index'        => [ ['agentnum'], ['eventtable'], ['check_freq'],
837                           ['disabled'],
838                         ],
839       'foreign_keys' => [
840                           { columns    => [ 'agentnum' ],
841                             table      => 'agent',
842                           },
843                         ],
844     },
845
846     'part_event_option' => {
847       'columns' => [
848         'optionnum', 'serial', '', '', '', '', 
849         'eventpart', 'int', '', '', '', '', 
850         'optionname', 'varchar', '', $char_d, '', '', 
851         'optionvalue', 'text', 'NULL', '', '', '', 
852       ],
853       'primary_key'  => 'optionnum',
854       'unique'       => [],
855       'index'        => [ [ 'eventpart' ], [ 'optionname' ] ],
856       'foreign_keys' => [
857                           { columns    => [ 'eventpart' ],
858                             table      => 'part_event',
859                           },
860                         ],
861     },
862
863     'part_event_condition' => {
864       'columns' => [
865         'eventconditionnum', 'serial', '', '', '', '', 
866         'eventpart', 'int', '', '', '', '', 
867         'conditionname', 'varchar', '', $char_d, '', '', 
868       ],
869       'primary_key'  => 'eventconditionnum',
870       'unique'       => [],
871       'index'        => [ [ 'eventpart' ], [ 'conditionname' ] ],
872       'foreign_keys' => [
873                           { columns    => [ 'eventpart' ],
874                             table      => 'part_event',
875                           },
876                         ],
877     },
878
879     'part_event_condition_option' => {
880       'columns' => [
881         'optionnum', 'serial', '', '', '', '', 
882         'eventconditionnum', 'int', '', '', '', '', 
883         'optionname', 'varchar', '', $char_d, '', '', 
884         'optionvalue', 'text', 'NULL', '', '', '', 
885       ],
886       'primary_key'  => 'optionnum',
887       'unique'       => [],
888       'index'        => [ [ 'eventconditionnum' ], [ 'optionname' ] ],
889       'foreign_keys' => [
890                           { columns    => [ 'eventconditionnum' ],
891                             table      => 'part_event_condition',
892                           },
893                         ],
894     },
895
896     'part_event_condition_option_option' => {
897       'columns' => [
898         'optionoptionnum', 'serial', '', '', '', '', 
899         'optionnum', 'int', '', '', '', '', 
900         'optionname', 'varchar', '', $char_d, '', '', 
901         'optionvalue', 'text', 'NULL', '', '', '', 
902       ],
903       'primary_key'  => 'optionoptionnum',
904       'unique'       => [],
905       'index'        => [ [ 'optionnum' ], [ 'optionname' ] ],
906       'foreign_keys' => [
907                           { columns    => [ 'optionnum' ],
908                             table      => 'part_event_condition_option',
909                           },
910                         ],
911     },
912
913     'cust_event' => {
914       'columns' => [
915         'eventnum',    'serial',  '', '', '', '', 
916         'eventpart',   'int',  '', '', '', '', 
917         'tablenum',   'int',  '', '', '', '', 
918         '_date',     @date_type, '', '', 
919         'status', 'varchar', '', $char_d, '', '', 
920         'statustext', 'text', 'NULL', '', '', '', 
921       ],
922       'primary_key'  => 'eventnum',
923       #no... there are retries now #'unique' => [ [ 'eventpart', 'invnum' ] ],
924       'unique'       => [],
925       'index'        => [ ['eventpart'], ['tablenum'], ['status'],
926                           ['statustext'], ['_date'],
927                         ],
928       'foreign_keys' => [
929                           { columns    => [ 'eventpart' ],
930                             table      => 'part_event',
931                           },
932                         ],
933     },
934
935     'cust_event_fee' => {
936       'columns' => [
937         'eventfeenum', 'serial', '', '', '', '',
938         'eventnum',       'int', '', '', '', '',
939         'billpkgnum',     'int', 'NULL', '', '', '',
940         'feepart',        'int', '', '', '', '',
941         'nextbill',      'char', 'NULL',  1, '', '',
942       ],
943       'primary_key'  => 'eventfeenum', # I'd rather just use eventnum
944       'unique' => [ [ 'billpkgnum' ], [ 'eventnum' ] ], # one-to-one link
945       'index'  => [ [ 'feepart' ] ],
946       'foreign_keys' => [
947                           { columns => [ 'eventnum' ],
948                             table   => 'cust_event',
949                           },
950                           #{ columns => [ 'billpkgnum' ],
951                           #  table   => 'cust_bill_pkg',
952                           #},
953                           { columns => [ 'feepart' ],
954                             table   => 'part_fee',
955                           },
956                         ],
957     },
958
959     'cust_bill_pkg' => {
960       'columns' => [
961         'billpkgnum',          'serial',     '',      '', '', '', 
962         'invnum',                 'int',     '',      '', '', '', 
963         'pkgnum',                 'int',     '',      '', '', '', 
964         'pkgpart_override',       'int', 'NULL',      '', '', '', 
965         'setup',                 @money_type,             '', '', 
966         'unitsetup',             @money_typen,            '', '', 
967         'setup_billed_currency', 'char', 'NULL',       3, '', '',
968         'setup_billed_amount',   @money_typen,            '', '',
969         'recur',                 @money_type,             '', '', 
970         'unitrecur',             @money_typen,            '', '', 
971         'recur_billed_currency', 'char', 'NULL',       3, '', '',
972         'recur_billed_amount',   @money_typen,            '', '',
973         'sdate',                 @date_type,              '', '', 
974         'edate',                 @date_type,              '', '', 
975         'itemdesc',           'varchar', 'NULL', $char_d, '', '', 
976         'itemcomment',        'varchar', 'NULL', $char_d, '', '', 
977         'section',            'varchar', 'NULL', $char_d, '', '', 
978         'freq',               'varchar', 'NULL', $char_d, '', '',
979         'quantity',               'int', 'NULL',      '', '', '',
980         'hidden',                'char', 'NULL',       1, '', '',
981         'feepart',                'int', 'NULL',      '', '', '',
982       ],
983       'primary_key'  => 'billpkgnum',
984       'unique'       => [],
985       'index'        => [ ['invnum'], [ 'pkgnum' ], [ 'itemdesc' ], ],
986       'foreign_keys' => [
987                           { columns    => [ 'invnum' ],
988                             table      => 'cust_bill',
989                           },
990                           #pkgnum 0 and -1 are used for special things
991                           #{ columns    => [ 'pkgnum' ],
992                           #  table      => 'cust_pkg',
993                           #},
994                           { columns    => [ 'pkgpart_override' ],
995                             table      => 'part_pkg',
996                             references => [ 'pkgpart' ],
997                           },
998                           { columns    => [ 'feepart' ],
999                             table      => 'part_fee',
1000                           },
1001                         ],
1002     },
1003
1004     'cust_bill_pkg_detail' => {
1005       'columns' => [
1006         'detailnum', 'serial', '', '', '', '', 
1007           # bigserial? this table will eventually be as big as cdr...
1008         'billpkgnum', 'int', 'NULL', '', '', '',        # should not be nullable
1009         'pkgnum',  'int', 'NULL', '', '', '',           # deprecated
1010         'invnum',  'int', 'NULL', '', '', '',           # deprecated
1011         'amount',  'decimal', 'NULL', '10,4', '', '',
1012         'format',  'char', 'NULL', 1, '', '',
1013         'classnum', 'int', 'NULL', '', '', '',
1014         'duration', 'int', 'NULL', '',  0, '',
1015         'phonenum', 'varchar', 'NULL', 255, '', '', # has to hold a service label
1016         'accountcode', 'varchar',  'NULL',      32, '', '',
1017         'startdate',  @date_type, '', '', 
1018         'regionname', 'varchar', 'NULL', $char_d, '', '',
1019         'detail',  'varchar', '', 255, '', '',
1020       ],
1021       'primary_key'  => 'detailnum',
1022       'unique'       => [],
1023       'index'        => [ [ 'billpkgnum' ], [ 'classnum' ],
1024                           [ 'pkgnum', 'invnum' ],
1025                         ],
1026       'foreign_keys' => [
1027                           { columns    => [ 'billpkgnum' ],
1028                             table      => 'cust_bill_pkg',
1029                           },
1030                           #{ columns    => [ 'pkgnum' ],
1031                           #  table      => 'cust_pkg',
1032                           #},
1033                           #{ columns    => [ 'invnum' ],
1034                           #  table      => 'cust_bill',
1035                           #},
1036                           { columns    => [ 'classnum' ],
1037                             table      => 'usage_class',
1038                           },
1039                         ],
1040     },
1041
1042     'cust_bill_pkg_display' => {
1043       'columns' => [
1044         'billpkgdisplaynum', 'serial', '', '', '', '',
1045         'billpkgnum', 'int', '', '', '', '', 
1046         'section',  'varchar', 'NULL', $char_d, '', '', 
1047         #'unitsetup', @money_typen, '', '',     #override the linked real one?
1048         #'unitrecur', @money_typen, '', '',     #this too?
1049         'post_total', 'char', 'NULL', 1, '', '',
1050         'type',       'char', 'NULL', 1, '', '',
1051         'summary',    'char', 'NULL', 1, '', '',
1052       ],
1053       'primary_key'  => 'billpkgdisplaynum',
1054       'unique'       => [],
1055       'index'        => [ ['billpkgnum'], ],
1056       'foreign_keys' => [
1057                           { columns    => [ 'billpkgnum' ],
1058                             table      => 'cust_bill_pkg',
1059                           },
1060                         ],
1061     },
1062
1063     'cust_bill_pkg_fee' => {
1064       'columns' => [
1065         'billpkgfeenum',    'serial', '', '', '', '',
1066         'billpkgnum',          'int', '', '', '', '',
1067         'base_invnum',       'int', '', '', '', '',
1068         'base_billpkgnum',   'int', 'NULL', '', '', '',
1069         'amount',        @money_type,         '', '',
1070       ],
1071       'primary_key' => 'billpkgfeenum',
1072       'unique'      => [],
1073       'index'       => [ ['billpkgnum'],
1074                          ['base_invnum'],
1075                          ['base_billpkgnum'],
1076                        ],
1077       'foreign_keys' => [
1078                           { columns     => [ 'billpkgnum' ],
1079                             table       => 'cust_bill_pkg',
1080                           },
1081                         ],
1082     },
1083
1084     'cust_bill_pkg_fee_void' => {
1085       'columns' => [
1086         'billpkgfeenum',    'serial', '', '', '', '',
1087         'billpkgnum',          'int', '', '', '', '',
1088         'base_invnum',       'int', '', '', '', '',
1089         'base_billpkgnum',   'int', 'NULL', '', '', '',
1090         'amount',        @money_type,         '', '',
1091       ],
1092       'primary_key' => 'billpkgfeenum',
1093       'unique'      => [],
1094       'index'       => [ ['billpkgnum'],
1095                          ['base_invnum'],
1096                          ['base_billpkgnum'],
1097                        ],
1098       'foreign_keys' => [
1099                           { columns     => [ 'billpkgnum' ],
1100                             table       => 'cust_bill_pkg_void',
1101                           },
1102                         ],
1103     },
1104
1105
1106     'cust_bill_pkg_tax_location' => {
1107       'columns' => [
1108         'billpkgtaxlocationnum', 'serial',     '',      '', '', '',
1109         'billpkgnum',               'int',     '',      '', '', '',
1110         'taxnum',                   'int',     '',      '', '', '',
1111         'taxtype',              'varchar',     '', $char_d, '', '',
1112         'pkgnum',                   'int',     '',      '', '', '', #redundant
1113         'locationnum',              'int',     '',      '', '', '', #redundant
1114         'amount',             @money_type,                  '', '',
1115         'currency',                'char', 'NULL',       3, '', '',
1116         'taxable_billpkgnum',       'int', 'NULL',      '', '', '',
1117       ],
1118       'primary_key'  => 'billpkgtaxlocationnum',
1119       'unique'       => [],
1120       'index'        => [ [ 'billpkgnum' ], 
1121                           [ 'taxnum' ],
1122                           [ 'pkgnum' ],
1123                           [ 'locationnum' ],
1124                           [ 'taxable_billpkgnum' ],
1125                         ],
1126       'foreign_keys' => [
1127                           { columns    => [ 'billpkgnum' ],
1128                             table      => 'cust_bill_pkg',
1129                           },
1130                           #{ columns    => [ 'pkgnum' ],
1131                           #  table      => 'cust_pkg',
1132                           #}, # taxes can apply to fees
1133                           { columns    => [ 'locationnum' ],
1134                             table      => 'cust_location',
1135                           },
1136                           #{ columns    => [ 'taxable_billpkgnum' ],
1137                           #  table      => 'cust_bill_pkg',
1138                           #  references => [ 'billpkgnum' ],
1139                           #},
1140                         ],
1141     },
1142
1143     'cust_bill_pkg_tax_rate_location' => {
1144       'columns' => [
1145         'billpkgtaxratelocationnum', 'serial',      '',      '', '', '',
1146         'billpkgnum',                   'int',      '',      '', '', '',
1147         'taxnum',                       'int',      '',      '', '', '',
1148         'taxtype',                  'varchar',      '', $char_d, '', '',
1149         'locationtaxid',            'varchar',  'NULL', $char_d, '', '',
1150         'taxratelocationnum',           'int',      '',      '', '', '',
1151         'amount',                 @money_type,                   '', '',
1152         'currency',                    'char', 'NULL',        3, '', '',
1153         'taxable_billpkgnum',           'int', 'NULL',       '', '', '',
1154       ],
1155       'primary_key'  => 'billpkgtaxratelocationnum',
1156       'unique'       => [],
1157       'index'        => [ ['billpkgnum'], ['taxnum'], ['taxratelocationnum'],
1158                           ['taxable_billpkgnum'],
1159                         ],
1160       'foreign_keys' => [
1161                           { columns    => [ 'billpkgnum' ],
1162                             table      => 'cust_bill_pkg',
1163                           },
1164                           { columns    => [ 'taxratelocationnum' ],
1165                             table      => 'tax_rate_location',
1166                           },
1167                           #{ columns    => [ 'taxable_billpkgnum' ],
1168                           #  table      => 'cust_bill_pkg',
1169                           #  references => [ 'billpkgnum' ],
1170                           #},
1171                         ],
1172     },
1173
1174     'cust_bill_pkg_void' => {
1175       'columns' => [
1176         'billpkgnum',           'int',     '',      '', '', '', 
1177         'invnum',               'int',     '',      '', '', '', 
1178         'pkgnum',               'int',     '',      '', '', '', 
1179         'pkgpart_override',     'int', 'NULL',      '', '', '', 
1180         'setup',               @money_type,             '', '', 
1181         'recur',               @money_type,             '', '', 
1182         #XXX a currency for a line item?  or just one for the entire invoice
1183         #'currency',            'char', 'NULL',       3, '', '',
1184         'sdate',               @date_type,              '', '', 
1185         'edate',               @date_type,              '', '', 
1186         'itemdesc',         'varchar', 'NULL', $char_d, '', '', 
1187         'itemcomment',      'varchar', 'NULL', $char_d, '', '', 
1188         'section',          'varchar', 'NULL', $char_d, '', '', 
1189         'freq',             'varchar', 'NULL', $char_d, '', '',
1190         'quantity',             'int', 'NULL',      '', '', '',
1191         'unitsetup',           @money_typen,            '', '', 
1192         'unitrecur',           @money_typen,            '', '', 
1193         'hidden',              'char', 'NULL',       1, '', '',
1194         'feepart',              'int', 'NULL',      '', '', '',
1195         #void fields
1196         'void_date', @date_type, '', '', 
1197         'reason',    'varchar',   'NULL', $char_d, '', '', 
1198         'void_usernum',   'int', 'NULL', '', '', '',
1199       ],
1200       'primary_key'  => 'billpkgnum',
1201       'unique'       => [],
1202       'index'        => [ ['invnum'], ['pkgnum'], ['itemdesc'],
1203                           ['void_usernum'],
1204                         ],
1205       'foreign_keys' => [
1206                           { columns    => [ 'invnum' ],
1207                             table      => 'cust_bill_void',
1208                           },
1209                           #pkgnum 0 and -1 are used for special things
1210                           #{ columns    => [ 'pkgnum' ],
1211                           #  table      => 'cust_pkg',
1212                           #},
1213                           { columns    => [ 'pkgpart_override' ],
1214                             table      => 'part_pkg',
1215                             references => [ 'pkgpart' ],
1216                           },
1217                           { columns    => [ 'void_usernum' ],
1218                             table      => 'access_user',
1219                             references => [ 'usernum' ],
1220                           },
1221                         ],
1222     },
1223
1224     'cust_bill_pkg_detail_void' => {
1225       'columns' => [
1226         'detailnum',  'int', '', '', '', '', 
1227         'billpkgnum', 'int', 'NULL', '', '', '',        # should not be nullable
1228         'pkgnum',  'int', 'NULL', '', '', '',           # deprecated
1229         'invnum',  'int', 'NULL', '', '', '',           # deprecated
1230         'amount',  'decimal', 'NULL', '10,4', '', '',
1231         'format',  'char', 'NULL', 1, '', '',
1232         'classnum', 'int', 'NULL', '', '', '',
1233         'duration', 'int', 'NULL', '',  0, '',
1234         'phonenum', 'varchar', 'NULL', 255, '', '',
1235         'accountcode', 'varchar',  'NULL',      32, '', '',
1236         'startdate',  @date_type, '', '', 
1237         'regionname', 'varchar', 'NULL', $char_d, '', '',
1238         'detail',  'varchar', '', 255, '', '', 
1239       ],
1240       'primary_key'  => 'detailnum',
1241       'unique'       => [],
1242       'index'        => [ ['billpkgnum'], ['classnum'], ['pkgnum', 'invnum'] ],
1243       'foreign_keys' => [
1244                           { columns    => [ 'billpkgnum' ],
1245                             table      => 'cust_bill_pkg_void',
1246                           },
1247                           #{ columns    => [ 'pkgnum' ],
1248                           #  table      => 'cust_pkg',
1249                           #},
1250                           #{ columns    => [ 'invnum' ],
1251                           #  table      => 'cust_bill',
1252                           #},
1253                           { columns    => [ 'classnum' ],
1254                             table      => 'usage_class',
1255                           },
1256                         ],
1257     },
1258
1259     'cust_bill_pkg_display_void' => {
1260       'columns' => [
1261         'billpkgdisplaynum',    'int', '', '', '', '', 
1262         'billpkgnum', 'int', '', '', '', '', 
1263         'section',  'varchar', 'NULL', $char_d, '', '', 
1264         #'unitsetup', @money_typen, '', '',     #override the linked real one?
1265         #'unitrecur', @money_typen, '', '',     #this too?
1266         'post_total', 'char', 'NULL', 1, '', '',
1267         'type',       'char', 'NULL', 1, '', '',
1268         'summary',    'char', 'NULL', 1, '', '',
1269       ],
1270       'primary_key'  => 'billpkgdisplaynum',
1271       'unique'       => [],
1272       'index'        => [ ['billpkgnum'], ],
1273       'foreign_keys' => [
1274                           { columns    => [ 'billpkgnum' ],
1275                             table      => 'cust_bill_pkg_void',
1276                           },
1277                         ],
1278     },
1279
1280     'cust_bill_pkg_tax_location_void' => {
1281       'columns' => [
1282         'billpkgtaxlocationnum',    'int',     '',      '', '', '',
1283         'billpkgnum',               'int',     '',      '', '', '',
1284         'taxnum',                   'int',     '',      '', '', '',
1285         'taxtype',              'varchar',     '', $char_d, '', '',
1286         'pkgnum',                   'int',     '',      '', '', '',
1287         'locationnum',              'int',     '',      '', '', '', #redundant?
1288         'amount',             @money_type,                  '', '',
1289         'currency',                'char', 'NULL',       3, '', '',
1290         'taxable_billpkgnum',       'int', 'NULL',      '', '', '',
1291       ],
1292       'primary_key'  => 'billpkgtaxlocationnum',
1293       'unique'       => [],
1294       'index'        => [ ['billpkgnum'], ['taxnum'], ['pkgnum'],
1295                           ['locationnum'],
1296                         ],
1297       'foreign_keys' => [
1298                           { columns    => [ 'billpkgnum' ],
1299                             table      => 'cust_bill_pkg_void',
1300                           },
1301                           { columns    => [ 'locationnum' ],
1302                             table      => 'cust_location',
1303                           },
1304                           #{ columns    => [ 'taxable_billpkgnum' ],
1305                           #  table      => 'cust_bill_pkg_void',
1306                           #  references => [ 'billpkgnum' ],
1307                           #},
1308                         ],
1309     },
1310
1311     'cust_bill_pkg_tax_rate_location_void' => {
1312       'columns' => [
1313         'billpkgtaxratelocationnum',    'int',     '',      '', '', '',
1314         'billpkgnum',                   'int',     '',      '', '', '',
1315         'taxnum',                       'int',     '',      '', '', '',
1316         'taxtype',                  'varchar',     '', $char_d, '', '',
1317         'locationtaxid',            'varchar', 'NULL', $char_d, '', '',
1318         'taxratelocationnum',           'int',     '',      '', '', '',
1319         'amount',                 @money_type,                  '', '',
1320         'currency',                    'char', 'NULL',       3, '', '',
1321       ],
1322       'primary_key'  => 'billpkgtaxratelocationnum',
1323       'unique'       => [],
1324       'index'        => [ ['billpkgnum'], ['taxnum'], ['taxratelocationnum'] ],
1325       'foreign_keys' => [
1326                           { columns    => [ 'billpkgnum' ],
1327                             table      => 'cust_bill_pkg_void',
1328                           },
1329                           { columns    => [ 'taxratelocationnum' ],
1330                             table      => 'tax_rate_location',
1331                           },
1332                         ],
1333     },
1334
1335     'cust_credit' => {
1336       'columns' => [
1337         'crednum',  'serial',     '', '', '', '', 
1338         'custnum',     'int',     '', '', '', '', 
1339         '_date',  @date_type,             '', '', 
1340         'amount',@money_type,             '', '', 
1341         'currency',   'char', 'NULL',  3, '', '',
1342         'otaker',  'varchar', 'NULL', 32, '', '', 
1343         'usernum',     'int', 'NULL', '', '', '',
1344         'reason',     'text', 'NULL', '', '', '', 
1345         'reasonnum',   'int', 'NULL', '', '', '', 
1346         'addlinfo',   'text', 'NULL', '', '', '',
1347         'closed',     'char', 'NULL',  1, '', '', 
1348         'pkgnum',      'int', 'NULL', '', '','',#desired pkgnum for pkg-balances
1349         'eventnum',    'int', 'NULL', '', '','',#triggering event for commission
1350         'commission_agentnum', 'int', 'NULL', '', '', '', #
1351         'commission_salesnum', 'int', 'NULL', '', '', '', #
1352         'commission_pkgnum',   'int', 'NULL', '', '', '', #
1353         'credbatch',    'varchar', 'NULL', $char_d, '', '',
1354       ],
1355       'primary_key'  => 'crednum',
1356       'unique'       => [],
1357       'index'        => [ ['custnum'], ['_date'], ['usernum'], ['eventnum'],
1358                           ['commission_salesnum'], ['credbatch'],
1359                         ],
1360       'foreign_keys' => [
1361                           { columns    => [ 'custnum' ],
1362                             table      => 'cust_main',
1363                           },
1364                           { columns    => [ 'usernum' ],
1365                             table      => 'access_user',
1366                           },
1367                           { columns    => [ 'reasonnum' ],
1368                             table      => 'reason',
1369                           },
1370                           { columns    => [ 'pkgnum' ],
1371                             table      => 'cust_pkg',
1372                           },
1373                           { columns    => [ 'eventnum' ],
1374                             table      => 'cust_event',
1375                           },
1376                           { columns    => [ 'commission_agentnum' ],
1377                             table      => 'agent',
1378                             references => [ 'agentnum' ],
1379                           },
1380                           { columns    => [ 'commission_salesnum' ],
1381                             table      => 'sales',
1382                             references => [ 'salesnum' ],
1383                           },
1384                           { columns    => [ 'commission_pkgnum' ],
1385                             table      => 'cust_pkg',
1386                             references => [ 'pkgnum' ],
1387                           },
1388                         ],
1389     },
1390
1391     'cust_credit_void' => {
1392       'columns' => [
1393         'crednum',  'serial',     '', '', '', '', 
1394         'custnum',     'int',     '', '', '', '', 
1395         '_date',  @date_type,             '', '', 
1396         'amount',@money_type,             '', '', 
1397         'currency',   'char', 'NULL',  3, '', '',
1398         'otaker',  'varchar', 'NULL', 32, '', '', 
1399         'usernum',     'int', 'NULL', '', '', '',
1400         'reason',     'text', 'NULL', '', '', '', 
1401         'reasonnum',   'int', 'NULL', '', '', '', 
1402         'addlinfo',   'text', 'NULL', '', '', '',
1403         'closed',     'char', 'NULL',  1, '', '', 
1404         'pkgnum',      'int', 'NULL', '', '','',
1405         'eventnum',    'int', 'NULL', '', '','',
1406         'commission_agentnum', 'int', 'NULL', '', '', '',
1407         'commission_salesnum', 'int', 'NULL', '', '', '',
1408         'commission_pkgnum',   'int', 'NULL', '', '', '',
1409         #void fields
1410         'void_date',  @date_type,                  '', '', 
1411         'void_reason', 'varchar', 'NULL', $char_d, '', '', 
1412         'void_reasonnum', 'int', 'NULL', '', '', '', 
1413         'void_usernum',    'int', 'NULL',      '', '', '',
1414       ],
1415       'primary_key'  => 'crednum',
1416       'unique'       => [],
1417       'index'        => [ ['custnum'], ['_date'], ['usernum'], ['eventnum'],
1418                           ['commission_salesnum'],
1419                         ],
1420       'foreign_keys' => [
1421                           { columns    => [ 'custnum' ],
1422                             table      => 'cust_main',
1423                           },
1424                           { columns    => [ 'usernum' ],
1425                             table      => 'access_user',
1426                           },
1427                           { columns    => [ 'reasonnum' ],
1428                             table      => 'reason',
1429                           },
1430                           { columns    => [ 'pkgnum' ],
1431                             table      => 'cust_pkg',
1432                           },
1433                           { columns    => [ 'eventnum' ],
1434                             table      => 'cust_event',
1435                           },
1436                           { columns    => [ 'commission_agentnum' ],
1437                             table      => 'agent',
1438                             references => [ 'agentnum' ],
1439                           },
1440                           { columns    => [ 'commission_salesnum' ],
1441                             table      => 'sales',
1442                             references => [ 'salesnum' ],
1443                           },
1444                           { columns    => [ 'commission_pkgnum' ],
1445                             table      => 'cust_pkg',
1446                             references => [ 'pkgnum' ],
1447                           },
1448                           { columns    => [ 'void_reasonnum' ],
1449                             table      => 'reason',
1450                             references => [ 'reasonnum' ],
1451                           },
1452                           { columns    => [ 'void_usernum' ],
1453                             table      => 'access_user',
1454                             references => [ 'usernum' ],
1455                           },
1456                         ],
1457     },
1458
1459
1460     'cust_credit_bill' => {
1461       'columns' => [
1462         'creditbillnum', 'serial', '', '', '', '', 
1463         'crednum',  'int', '', '', '', '', 
1464         'invnum',  'int', '', '', '', '', 
1465         '_date',    @date_type, '', '', 
1466         'amount',   @money_type, '', '', 
1467         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
1468       ],
1469       'primary_key'  => 'creditbillnum',
1470       'unique'       => [],
1471       'index'        => [ ['crednum'], ['invnum'] ],
1472       'foreign_keys' => [
1473                           { columns    => [ 'crednum' ],
1474                             table      => 'cust_credit',
1475                           },
1476                           { columns    => [ 'invnum' ],
1477                             table      => 'cust_bill',
1478                           },
1479                           { columns    => [ 'pkgnum' ],
1480                             table      => 'cust_pkg',
1481                           },
1482                         ],
1483     },
1484
1485     'cust_credit_bill_pkg' => {
1486       'columns' => [
1487         'creditbillpkgnum', 'serial', '',      '', '', '',
1488         'creditbillnum',       'int', '',      '', '', '',
1489         'billpkgnum',          'int', '',      '', '', '',
1490         'billpkgtaxlocationnum', 'int', 'NULL', '', '', '',
1491         'billpkgtaxratelocationnum', 'int', 'NULL', '', '', '',
1492         'amount',            @money_type,          '', '',
1493         'setuprecur',      'varchar', '', $char_d, '', '',
1494         'sdate',   @date_type, '', '', 
1495         'edate',   @date_type, '', '', 
1496       ],
1497       'primary_key'  => 'creditbillpkgnum',
1498       'unique'       => [],
1499       'index'        => [ [ 'creditbillnum' ],
1500                           [ 'billpkgnum' ], 
1501                           [ 'billpkgtaxlocationnum' ],
1502                           [ 'billpkgtaxratelocationnum' ],
1503                         ],
1504       'foreign_keys' => [
1505                           { columns    => [ 'creditbillnum' ],
1506                             table      => 'cust_credit_bill',
1507                           },
1508                           { columns    => [ 'billpkgnum' ],
1509                             table      => 'cust_bill_pkg',
1510                           },
1511                           { columns    => [ 'billpkgtaxlocationnum' ],
1512                             table      => 'cust_bill_pkg_tax_location',
1513                           },
1514                           { columns    => [ 'billpkgtaxratelocationnum' ],
1515                             table      => 'cust_bill_pkg_tax_rate_location',
1516                           },
1517                         ],
1518     },
1519
1520     'cust_credit_source_bill_pkg' => {
1521       'columns' => [
1522         'creditsourcebillpkgnum', 'serial',     '', '', '', '',
1523         'crednum',                   'int',     '', '', '', '',
1524         'billpkgnum',                'int',     '', '', '', '',
1525         'amount',              @money_type,             '', '',
1526         'currency',                 'char', 'NULL',  3, '', '',
1527       ],
1528       'primary_key'  => 'creditsourcebillpkgnum',
1529       'unique'       => [],
1530       'index'        => [ ['crednum'], ['billpkgnum'] ],
1531       'foreign_keys' => [
1532                           { columns => ['billpkgnum'],
1533                             table   => 'cust_bill_pkg',
1534                           },
1535                           { columns => ['crednum'],
1536                             table   => 'cust_credit',
1537                           },
1538                         ],
1539     },
1540
1541     'cust_main' => {
1542       'columns' => [
1543         'custnum',  'serial',  '',     '', '', '', 
1544         'agentnum', 'int',  '',     '', '', '', 
1545         'salesnum', 'int',  'NULL', '', '', '', 
1546         'agent_custid', 'varchar', 'NULL', $char_d, '', '',
1547         'classnum', 'int', 'NULL', '', '', '',
1548         'custbatch', 'varchar', 'NULL', $char_d, '', '',
1549 #        'titlenum', 'int',  'NULL',   '', '', '', 
1550         'last',     'varchar', '',   2*$char_d, '', '', 
1551 #        'middle',   'varchar', 'NULL', $char_d, '', '', 
1552         'first',    'varchar', '',     $char_d, '', '', 
1553         'ss',       'varchar', 'NULL', 11, '', '', 
1554         'stateid', 'varchar', 'NULL', $char_d, '', '', 
1555         'stateid_state', 'varchar', 'NULL', $char_d, '', '', 
1556         'national_id', 'varchar', 'NULL', $char_d, '', '',
1557         'birthdate' ,@date_type, '', '', 
1558         'spouse_last',  'varchar', 'NULL', 2*$char_d, '', '',
1559         'spouse_first', 'varchar', 'NULL', $char_d, '', '',
1560         'spouse_birthdate', @date_type, '', '', 
1561         'anniversary_date', @date_type, '', '', 
1562         'signupdate',@date_type, '', '', 
1563         'dundate',   @date_type, '', '', 
1564         'company',  'varchar', 'NULL', $char_d, '', '', 
1565         'address1', 'varchar', 'NULL', $char_d, '', '', 
1566         'address2', 'varchar', 'NULL', $char_d, '', '', 
1567         'city',     'varchar', 'NULL', $char_d, '', '', 
1568         'county',   'varchar', 'NULL', $char_d, '', '', 
1569         'state',    'varchar', 'NULL', $char_d, '', '', 
1570         'zip',      'varchar', 'NULL', 10, '', '', 
1571         'country',  'char',    'NULL',  2, '', '', 
1572         'latitude', 'decimal', 'NULL', '10,7', '', '', 
1573         'longitude','decimal', 'NULL', '10,7', '', '', 
1574         'coord_auto',  'char', 'NULL',  1, '', '',
1575         'addr_clean',  'char', 'NULL',  1, '', '',
1576         'daytime',  'varchar', 'NULL', 20, '', '', 
1577         'night',    'varchar', 'NULL', 20, '', '', 
1578         'fax',      'varchar', 'NULL', 12, '', '', 
1579         'mobile',   'varchar', 'NULL', 12, '', '', 
1580         'ship_last',     'varchar', 'NULL', 2*$char_d, '', '', 
1581 #        'ship_middle',   'varchar', 'NULL', $char_d, '', '', 
1582         'ship_first',    'varchar', 'NULL', $char_d, '', '', 
1583         'ship_company',  'varchar', 'NULL', $char_d, '', '', 
1584         'ship_address1', 'varchar', 'NULL', $char_d, '', '', 
1585         'ship_address2', 'varchar', 'NULL', $char_d, '', '', 
1586         'ship_city',     'varchar', 'NULL', $char_d, '', '', 
1587         'ship_county',   'varchar', 'NULL', $char_d, '', '', 
1588         'ship_state',    'varchar', 'NULL', $char_d, '', '', 
1589         'ship_zip',      'varchar', 'NULL', 10, '', '', 
1590         'ship_country',  'char', 'NULL', 2, '', '', 
1591         'ship_latitude', 'decimal', 'NULL', '10,7', '', '', 
1592         'ship_longitude','decimal', 'NULL', '10,7', '', '', 
1593         'ship_coord_auto',  'char', 'NULL',  1, '', '',
1594         'ship_addr_clean',  'char', 'NULL',  1, '', '',
1595         'ship_daytime',  'varchar', 'NULL', 20, '', '', 
1596         'ship_night',    'varchar', 'NULL', 20, '', '', 
1597         'ship_fax',      'varchar', 'NULL', 12, '', '', 
1598         'ship_mobile',   'varchar', 'NULL', 12, '', '', 
1599         'currency',         'char', 'NULL',  3, '', '',
1600
1601         #deprecated, info moved to cust_payby
1602         'payby',    'char', 'NULL',     4, '', '', 
1603         'payinfo',  'varchar', 'NULL', 512, '', '', 
1604         'paycvv',   'varchar', 'NULL', 512, '', '', 
1605         'paymask', 'varchar', 'NULL', $char_d, '', '', 
1606         #'paydate',  @date_type, '', '', 
1607         'paydate',  'varchar', 'NULL', 10, '', '', 
1608         'paystart_month', 'int', 'NULL', '', '', '', 
1609         'paystart_year',  'int', 'NULL', '', '', '', 
1610         'payissue', 'varchar', 'NULL', 2, '', '', 
1611         'payname',  'varchar', 'NULL', 2*$char_d, '', '', 
1612         'paystate', 'varchar', 'NULL', $char_d, '', '', 
1613         'paytype',  'varchar', 'NULL', $char_d, '', '', 
1614         'payip',    'varchar', 'NULL', 15, '', '', 
1615
1616         'geocode',  'varchar', 'NULL', 20,  '', '',
1617         'censustract', 'varchar', 'NULL', 20,  '', '', # 7 to save space?
1618         'censusyear', 'char', 'NULL', 4, '', '',
1619         'district', 'varchar', 'NULL', 20, '', '',
1620         'tax',      'char', 'NULL', 1, '', '', 
1621         'otaker',   'varchar', 'NULL',    32, '', '', 
1622         'usernum',   'int', 'NULL', '', '', '',
1623         'refnum',   'int',  '',     '', '', '', 
1624         'referral_custnum', 'int',  'NULL', '', '', '', 
1625         'comments', 'text', 'NULL', '', '', '', 
1626         'spool_cdr','char', 'NULL', 1, '', '', 
1627         'squelch_cdr','char', 'NULL', 1, '', '', 
1628         'cdr_termination_percentage', 'decimal', 'NULL', '7,4', '', '',
1629         'invoice_terms', 'varchar', 'NULL', $char_d, '', '',
1630         'credit_limit', @money_typen, '', '',
1631         'credit_limit_currency', 'char', 'NULL',  3, '', '',
1632         'archived', 'char', 'NULL', 1, '', '',
1633         'email_csv_cdr', 'char', 'NULL', 1, '', '',
1634         'accountcode_cdr', 'char', 'NULL', 1, '', '',
1635         'billday',   'int', 'NULL', '', '', '',
1636         'prorate_day',   'int', 'NULL', '', '', '',
1637         'edit_subject', 'char', 'NULL', 1, '', '',
1638         'locale', 'varchar', 'NULL', 16, '', '', 
1639         'calling_list_exempt', 'char', 'NULL', 1, '', '',
1640         'invoice_noemail', 'char', 'NULL', 1, '', '',
1641         'message_noemail', 'char', 'NULL', 1, '', '',
1642         'bill_locationnum', 'int', 'NULL', '', '', '',
1643         'ship_locationnum', 'int', 'NULL', '', '', '',
1644         'taxstatusnum',   'char', 'NULL',      32, '', '',
1645         'complimentary', 'char', 'NULL', 1, '', '',
1646         'po_number', 'varchar', 'NULL', $char_d, '', '',
1647         'invoice_attn', 'varchar', 'NULL', $char_d, '', '',
1648         'invoice_ship_address', 'char', 'NULL', 1, '', '',
1649       ],
1650       'primary_key'  => 'custnum',
1651       'unique'       => [ [ 'agentnum', 'agent_custid' ] ],
1652       #'index'        => [ ['last'], ['company'] ],
1653       'index'        => [
1654                           ['agentnum'], ['refnum'], ['classnum'], ['usernum'],
1655                           [ 'custbatch' ],
1656                           [ 'referral_custnum' ],
1657                           [ 'payby' ], [ 'paydate' ],
1658                           [ 'archived' ],
1659                           [ 'ship_locationnum' ],
1660                           [ 'bill_locationnum' ],
1661                         ],
1662       'foreign_keys' => [
1663                           { columns    => [ 'agentnum' ],
1664                             table      => 'agent',
1665                           },
1666                           { columns    => [ 'salesnum' ],
1667                             table      => 'sales',
1668                           },
1669                           { columns    => [ 'refnum' ],
1670                             table      => 'part_referral',
1671                           },
1672                           { columns    => [ 'classnum' ],
1673                             table      => 'cust_class',
1674                           },
1675                           { columns    => [ 'usernum' ],
1676                             table      => 'access_user',
1677                           },
1678                           { columns    => [ 'referral_custnum' ],
1679                             table      => 'cust_main',
1680                             references => [ 'custnum' ],
1681                           },
1682                           { columns    => [ 'bill_locationnum' ],
1683                             table      => 'cust_location',
1684                             references => [ 'locationnum' ],
1685                           },
1686                           { columns    => [ 'ship_locationnum' ],
1687                             table      => 'cust_location',
1688                             references => [ 'locationnum' ],
1689                           },
1690                         ],
1691     },
1692
1693     'cust_payby' => {
1694       'columns' => [
1695         'custpaybynum', 'serial',     '',        '', '', '', 
1696         'custnum',         'int',     '',        '', '', '',
1697         'weight',          'int', 'NULL',        '', '', '', 
1698         'payby',          'char',     '',         4, '', '', 
1699         'payinfo',     'varchar', 'NULL',       512, '', '', 
1700         'cardtype',    'varchar', 'NULL',   $char_d, '', '',
1701         'paycvv',      'varchar', 'NULL',       512, '', '', 
1702         'paymask',     'varchar', 'NULL',   $char_d, '', '', 
1703         #'paydate',   @date_type, '', '', 
1704         'paydate',     'varchar', 'NULL',        10, '', '', 
1705         'paystart_month',  'int', 'NULL',        '', '', '', 
1706         'paystart_year',   'int', 'NULL',        '', '', '', 
1707         'payissue',    'varchar', 'NULL',         2, '', '', 
1708         'payname',     'varchar', 'NULL', 2*$char_d, '', '', 
1709         'paystate',    'varchar', 'NULL',   $char_d, '', '', 
1710         'paytype',     'varchar', 'NULL',   $char_d, '', '', 
1711         'payip',       'varchar', 'NULL',        15, '', '', 
1712         'locationnum',     'int', 'NULL',        '', '', '',
1713       ],
1714       'primary_key'  => 'custpaybynum',
1715       'unique'       => [],
1716       'index'        => [ [ 'custnum' ] ],
1717       'foreign_keys' => [
1718                           { columns    => [ 'custnum' ],
1719                             table      => 'cust_main',
1720                           },
1721                           { columns    => [ 'locationnum' ],
1722                             table      => 'cust_location',
1723                           },
1724                         ],
1725     },
1726
1727     'contact_class' => {
1728       'columns' => [
1729         'classnum',    'serial',   '',      '', '', '', 
1730         'classname',   'varchar',  '', $char_d, '', '', 
1731         'disabled',    'char', 'NULL',       1, '', '', 
1732       ],
1733       'primary_key' => 'classnum',
1734       'unique' => [],
1735       'index' => [ ['disabled'] ],
1736     },
1737
1738     'cust_contact' => {
1739       'columns' => [
1740         'custcontactnum',     'serial',     '',  '', '', '',
1741         'custnum',               'int',     '',  '', '', '',
1742         'contactnum',            'int',     '',  '', '', '',
1743         'classnum',              'int', 'NULL',  '', '', '',
1744         'comment',           'varchar', 'NULL', 255, '', '',
1745         'selfservice_access',   'char', 'NULL',   1, '', '',
1746       ],
1747       'primary_key'  => 'custcontactnum',
1748       'unique'       => [ [ 'custnum', 'contactnum' ], ],
1749       'index'        => [ [ 'custnum' ], [ 'contactnum' ], ],
1750       'foreign_keys' => [
1751                           { columns    => [ 'custnum' ],
1752                             table      => 'cust_main',
1753                           },
1754                           { columns    => [ 'contactnum' ],
1755                             table      => 'contact',
1756                           },
1757                           { columns    => [ 'classnum' ],
1758                             table      => 'contact_class',
1759                           },
1760                         ],
1761     },
1762
1763     'prospect_contact' => {
1764       'columns' => [
1765         'prospectcontactnum', 'serial',     '',  '', '', '',
1766         'prospectnum',       'int',     '',  '', '', '',
1767         'contactnum',        'int',     '',  '', '', '',
1768         'classnum',          'int', 'NULL',  '', '', '',
1769         'comment',       'varchar', 'NULL', 255, '', '',
1770       ],
1771       'primary_key'  => 'prospectcontactnum',
1772       'unique'       => [ [ 'prospectnum', 'contactnum' ], ],
1773       'index'        => [ [ 'prospectnum' ], [ 'contactnum' ], ],
1774       'foreign_keys' => [
1775                           { columns    => [ 'prospectnum' ],
1776                             table      => 'prospect_main',
1777                           },
1778                           { columns    => [ 'contactnum' ],
1779                             table      => 'contact',
1780                           },
1781                           { columns    => [ 'classnum' ],
1782                             table      => 'contact_class',
1783                           },
1784                         ],
1785     },
1786
1787     'contact' => {
1788       'columns' => [
1789         'contactnum', 'serial',     '',      '', '', '',
1790         'prospectnum',   'int', 'NULL',      '', '', '', #deprecated, now prospect_contact table
1791         'custnum',       'int', 'NULL',      '', '', '', #deprecated, now cust_contact table
1792         'locationnum',   'int', 'NULL',      '', '', '', #not yet
1793         'classnum',      'int', 'NULL',      '', '', '', #deprecated, now prospect_contact or cust_contact
1794 #        'titlenum',      'int', 'NULL',      '', '', '', #eg Mr. Mrs. Dr. Rev.
1795         'last',      'varchar',     '', $char_d, '', '', 
1796 #        'middle',    'varchar', 'NULL', $char_d, '', '', 
1797         'first',     'varchar',     '', $char_d, '', '', 
1798         'title',     'varchar', 'NULL', $char_d, '', '', #eg Head Bottle Washer
1799         'comment',   'varchar', 'NULL',     255, '', '',  #depredated, now prospect_contact or cust_contact
1800         'selfservice_access',    'char', 'NULL',       1, '', '', #deprecated, now cust_contact
1801         '_password',          'varchar', 'NULL', $char_d, '', '',
1802         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
1803         'disabled',              'char', 'NULL',       1, '', '', 
1804       ],
1805       'primary_key'  => 'contactnum',
1806       'unique'       => [],
1807       'index'        => [ [ 'prospectnum' ], [ 'custnum' ], [ 'locationnum' ],
1808                           [ 'last' ], [ 'first' ],
1809                         ],
1810       'foreign_keys' => [
1811                           { columns    => [ 'prospectnum' ],
1812                             table      => 'prospect_main',
1813                           },
1814                           { columns    => [ 'custnum' ],
1815                             table      => 'cust_main',
1816                           },
1817                           { columns    => [ 'locationnum' ],
1818                             table      => 'cust_location',
1819                           },
1820                           { columns    => [ 'classnum' ],
1821                             table      => 'contact_class',
1822                           },
1823                         ],
1824     },
1825
1826     'contact_phone' => {
1827       'columns' => [
1828         'contactphonenum', 'serial',     '', '', '', '',
1829         'contactnum',         'int',     '', '', '', '',
1830         'phonetypenum',       'int',     '', '', '', '',
1831         'countrycode',    'varchar',     '',  3, '', '', 
1832         'phonenum',       'varchar',     '', 14, '', '', 
1833         'extension',      'varchar', 'NULL',  7, '', '',
1834         #?#'comment',        'varchar',     '', $char_d, '', '', 
1835       ],
1836       'primary_key'  => 'contactphonenum',
1837       'unique'       => [],
1838       'index'        => [],
1839       'foreign_keys' => [
1840                           { columns    => [ 'contactnum' ],
1841                             table      => 'contact',
1842                           },
1843                           { columns    => [ 'phonetypenum' ],
1844                             table      => 'phone_type',
1845                           },
1846                         ],
1847     },
1848
1849     'phone_type' => {
1850       'columns' => [
1851         'phonetypenum',  'serial', '',      '', '', '',
1852         'typename',     'varchar', '', $char_d, '', '',
1853         'weight',           'int', '',      '', '', '', 
1854       ],
1855       'primary_key' => 'phonetypenum',
1856       'unique'      => [ [ 'typename' ], ],
1857       'index'       => [],
1858     },
1859
1860     'contact_email' => {
1861       'columns' => [
1862         'contactemailnum', 'serial', '',      '', '', '',
1863         'contactnum',         'int', '',      '', '', '',
1864         'emailaddress',   'varchar', '', $char_d, '', '',
1865       ],
1866       'primary_key'  => 'contactemailnum',
1867       #'unique'       => [ [ 'contactnum', 'emailaddress' ], ],
1868       'unique'       => [ [ 'emailaddress' ], ],
1869       'index'        => [],
1870       'foreign_keys' => [
1871                           { columns    => [ 'contactnum' ],
1872                             table      => 'contact',
1873                           },
1874                         ],
1875     },
1876
1877     'prospect_main' => {
1878       'columns' => [
1879         'prospectnum',  'serial',     '',      '', '', '',
1880         'agentnum',        'int',     '',      '', '', '',
1881         'company',     'varchar', 'NULL', $char_d, '', '',
1882         'add_date',   @date_type,                  '', '', 
1883         'disabled',       'char', 'NULL',       1, '', '', 
1884         'custnum',         'int', 'NULL',      '', '', '',
1885         'refnum',          'int', 'NULL',      '', '', '', 
1886       ],
1887       'primary_key'  => 'prospectnum',
1888       'unique'       => [],
1889       'index'        => [ ['company'], ['agentnum'], ['disabled'], ['refnum'] ],
1890       'foreign_keys' => [
1891                           { columns    => [ 'agentnum' ],
1892                             table      => 'agent',
1893                           },
1894                           { columns    => [ 'custnum' ],
1895                             table      => 'cust_main',
1896                           },
1897                           { columns    => [ 'refnum' ],
1898                             table      => 'part_referral',
1899                           },
1900                         ],
1901     },
1902
1903     'quotation' => {
1904       'columns' => [
1905         #regular fields
1906         'quotationnum',   'serial',     '', '', '', '', 
1907         'prospectnum',       'int', 'NULL', '', '', '',
1908         'custnum',           'int', 'NULL', '', '', '',
1909         '_date',        @date_type,             '', '', 
1910         'disabled',         'char', 'NULL',  1, '', '', 
1911         'usernum',           'int', 'NULL', '', '', '',
1912         #'total',      @money_type,       '', '', 
1913         #'quotation_term', 'varchar', 'NULL', $char_d, '', '',
1914       ],
1915       'primary_key'  => 'quotationnum',
1916       'unique'       => [],
1917       'index'        => [ [ 'prospectnum' ], ['custnum'], ['disabled'], ],
1918       'foreign_keys' => [
1919                           { columns    => [ 'prospectnum' ],
1920                             table      => 'prospect_main',
1921                           },
1922                           { columns    => [ 'custnum' ],
1923                             table      => 'cust_main',
1924                           },
1925                           { columns    => [ 'usernum' ],
1926                             table      => 'access_user',
1927                           },
1928                         ],
1929     },
1930
1931     'quotation_pkg' => {
1932       'columns' => [
1933         'quotationpkgnum',   'serial',     '', '', '', '', 
1934         'quotationnum',         'int', 'NULL', '', '', '', #shouldn't be null,
1935                                                            # but history...
1936         'pkgpart',              'int',     '', '', '', '', 
1937         'locationnum',          'int', 'NULL', '', '', '',
1938         'start_date',      @date_type,             '', '', 
1939         'contract_end',    @date_type,             '', '',
1940         'quantity',             'int', 'NULL', '', '', '',
1941         'waive_setup',         'char', 'NULL',  1, '', '', 
1942         'unitsetup',     @money_typen,             '', '',
1943         'unitrecur',     @money_typen,             '', '',
1944       ],
1945       'primary_key'  => 'quotationpkgnum',
1946       'unique'       => [],
1947       'index'        => [ ['pkgpart'], ],
1948       'foreign_keys' => [
1949                           { columns    => [ 'quotationnum' ],
1950                             table      => 'quotation',
1951                           },
1952                           { columns    => [ 'pkgpart' ],
1953                             table      => 'part_pkg',
1954                           },
1955                           { columns    => [ 'locationnum' ],
1956                             table      => 'cust_location',
1957                           },
1958                         ],
1959     },
1960
1961     'quotation_pkg_discount' => {
1962       'columns' => [
1963         'quotationpkgdiscountnum', 'serial', '', '', '', '',
1964         'quotationpkgnum',            'int', '', '', '', '', 
1965         'discountnum',                'int', '', '', '', '',
1966         'setup_amount',        @money_typen,         '', '',
1967         'recur_amount',        @money_typen,         '', '',
1968         #'end_date',              @date_type,         '', '',
1969       ],
1970       'primary_key'  => 'quotationpkgdiscountnum',
1971       'unique'       => [],
1972       'index'        => [ [ 'quotationpkgnum' ], ], #[ 'discountnum' ] ],
1973       'foreign_keys' => [
1974                           { columns    => [ 'quotationpkgnum' ],
1975                             table      => 'quotation_pkg',
1976                           },
1977                           { columns    => [ 'discountnum' ],
1978                             table      => 'discount',
1979                           },
1980                         ],
1981     },
1982
1983     'quotation_pkg_tax' => {
1984       'columns' => [
1985         'quotationtaxnum',  'serial',     '',      '', '', '',
1986         'quotationpkgnum',     'int',     '',      '', '', '',
1987         'itemdesc',        'varchar',     '', $char_d, '', '',
1988         'taxnum',              'int',     '',      '', '', '', 
1989         'taxtype',         'varchar',     '', $char_d, '', '',
1990         'setup_amount',    @money_type,                '', '',
1991         'recur_amount',    @money_type,                '', '',
1992       ],
1993       'primary_key' => 'quotationtaxnum',,
1994       'unique' => [],
1995       'index'  => [ [ 'quotationpkgnum' ] ],
1996       'foreign_keys' => [
1997                           { columns    => [ 'quotationpkgnum' ],
1998                             table      => 'quotation_pkg',
1999                           },
2000                         ],
2001 },
2002
2003     'cust_location' => { #'location' now that its prospects too, but...
2004       'columns' => [
2005         'locationnum',      'serial',     '',      '', '', '',
2006         'prospectnum',         'int', 'NULL',      '', '', '',
2007         'custnum',             'int', 'NULL',      '', '', '',
2008         'locationname',    'varchar', 'NULL', $char_d, '', '',
2009         'address1',        'varchar',     '', $char_d, '', '', 
2010         'address2',        'varchar', 'NULL', $char_d, '', '', 
2011         'city',            'varchar',     '', $char_d, '', '', 
2012         'county',          'varchar', 'NULL', $char_d, '', '', 
2013         'state',           'varchar', 'NULL', $char_d, '', '', 
2014         'zip',             'varchar', 'NULL',      10, '', '', 
2015         'latitude',        'decimal', 'NULL',  '10,7', '', '', 
2016         'longitude',       'decimal', 'NULL',  '10,7', '', '', 
2017         'coord_auto',         'char', 'NULL',       1, '', '',
2018         'addr_clean',         'char', 'NULL',       1, '', '',
2019         'country',            'char',     '',       2, '', '', 
2020         'geocode',         'varchar', 'NULL',      20, '', '',
2021         'district',        'varchar', 'NULL',      20, '', '',
2022         'censustract',     'varchar', 'NULL',      20, '', '',
2023         'censusyear',         'char', 'NULL',       4, '', '',
2024         'location_type',   'varchar', 'NULL',      20, '', '',
2025         'location_number', 'varchar', 'NULL',      20, '', '',
2026         'location_kind',      'char', 'NULL',       1, '', '',
2027         'incorporated',       'char', 'NULL',       1, '', '',
2028         'disabled',           'char', 'NULL',       1, '', '', 
2029       ],
2030       'primary_key'  => 'locationnum',
2031       'unique'       => [],
2032       'index'        => [ [ 'prospectnum' ], [ 'custnum' ],
2033                           [ 'county' ], [ 'state' ], [ 'country' ], [ 'zip' ],
2034                           [ 'city' ], [ 'district' ]
2035                         ],
2036       'foreign_keys' => [
2037                           { columns    => [ 'prospectnum' ],
2038                             table      => 'prospect_main',
2039                           },
2040                           { columns    => [ 'custnum' ],
2041                             table      => 'cust_main',
2042                           },
2043                         ],
2044     },
2045
2046     'cust_main_invoice' => {
2047       'columns' => [
2048         'destnum',  'serial',  '',     '', '', '', 
2049         'custnum',  'int',  '',     '', '', '', 
2050         'dest',     'varchar', '',  $char_d, '', '', 
2051       ],
2052       'primary_key'  => 'destnum',
2053       'unique'       => [],
2054       'index'        => [ ['custnum'], ],
2055       'foreign_keys' => [
2056                           { columns    => [ 'custnum' ],
2057                             table      => 'cust_main',
2058                           },
2059                         ],
2060     },
2061
2062     'cust_main_credit_limit' => {
2063       'columns' => [
2064         'creditlimitnum',   'serial', '', '', '', '',
2065         'custnum',             'int', '', '', '', '', 
2066         '_date',          @date_type,         '', '', 
2067         'amount',       @money_typen,         '', '',
2068         #'amount_currency', 'char', 'NULL',  3, '', '',
2069         'credit_limit', @money_typen,         '', '',
2070         #'credit_limit_currency', 'char', 'NULL',  3, '', '',
2071       ],
2072       'primary_key'  => 'creditlimitnum',
2073       'unique'       => [],
2074       'index'        => [ ['custnum'], ],
2075       'foreign_keys' => [
2076                           { columns    => [ 'custnum' ],
2077                             table      => 'cust_main',
2078                           },
2079                         ],
2080     },
2081
2082     'cust_main_note' => {
2083       'columns' => [
2084         'notenum',   'serial',    '',  '', '', '', 
2085         'custnum',      'int',    '',  '', '', '', 
2086         'classnum',     'int', 'NULL', '', '', '', 
2087         '_date',          @date_type,      '', '', 
2088         'otaker',   'varchar', 'NULL', 32, '', '', 
2089         'usernum',      'int', 'NULL', '', '', '',
2090         'comments',    'text', 'NULL', '', '', '', 
2091         'sticky',       'int',     '', '',  0, '',
2092       ],
2093       'primary_key'  => 'notenum',
2094       'unique'       => [],
2095       'index'        => [ [ 'custnum' ], [ '_date' ], [ 'usernum' ], ],
2096       'foreign_keys' => [
2097                           { columns    => [ 'custnum' ],
2098                             table      => 'cust_main',
2099                           },
2100                           { columns    => [ 'classnum' ],
2101                             table      => 'cust_note_class',
2102                           },
2103                           { columns    => [ 'usernum' ],
2104                             table      => 'access_user',
2105                           },
2106                         ],
2107     },
2108
2109     'cust_note_class' => {
2110       'columns' => [
2111         'classnum',    'serial',   '',      '', '', '', 
2112         'classname',   'varchar',  '', $char_d, '', '', 
2113         'disabled',    'char', 'NULL',       1, '', '', 
2114       ],
2115       'primary_key' => 'classnum',
2116       'unique' => [],
2117       'index' => [ ['disabled'] ],
2118     },
2119
2120     'cust_category' => {
2121       'columns' => [
2122         'categorynum',   'serial',  '', '', '', '', 
2123         'categoryname',  'varchar', '', $char_d, '', '', 
2124         'weight',         'int', 'NULL',  '', '', '',
2125         'disabled',      'char', 'NULL',   1, '', '', 
2126       ],
2127       'primary_key' => 'categorynum',
2128       'unique' => [],
2129       'index' => [ ['disabled'] ],
2130     },
2131
2132     'cust_class' => {
2133       'columns' => [
2134         'classnum',     'serial',     '',      '', '', '', 
2135         'classname',   'varchar',     '', $char_d, '', '', 
2136         'categorynum',     'int', 'NULL',      '', '', '', 
2137         'tax',            'char', 'NULL',       1, '', '', 
2138         'disabled',       'char', 'NULL',       1, '', '', 
2139       ],
2140       'primary_key'  => 'classnum',
2141       'unique'       => [],
2142       'index'        => [ ['disabled'] ],
2143       'foreign_keys' => [
2144                           { columns    => [ 'categorynum' ],
2145                             table      => 'cust_category',
2146                           },
2147                         ],
2148     },
2149  
2150     'cust_tag' => {
2151       'columns' => [
2152         'custtagnum', 'serial', '', '', '', '',
2153         'custnum',       'int', '', '', '', '',
2154         'tagnum',        'int', '', '', '', '',
2155       ],
2156       'primary_key'  => 'custtagnum',
2157       'unique'       => [ [ 'custnum', 'tagnum' ] ],
2158       'index'        => [ [ 'custnum' ] ],
2159       'foreign_keys' => [
2160                           { columns    => [ 'custnum' ],
2161                             table      => 'cust_main',
2162                           },
2163                           { columns    => [ 'tagnum' ],
2164                             table      => 'part_tag',
2165                           },
2166                         ],
2167     },
2168
2169     'part_tag' => {
2170       'columns' => [
2171         'tagnum',    'serial',     '',      '', '', '',
2172         'tagname',  'varchar',     '', $char_d, '', '',
2173         'tagdesc',  'varchar', 'NULL', $char_d, '', '',
2174         'tagcolor', 'varchar', 'NULL',       6, '', '',
2175         'by_default',  'char', 'NULL',       1, '', '',
2176         'disabled',    'char', 'NULL',       1, '', '', 
2177       ],
2178       'primary_key' => 'tagnum',
2179       'unique'      => [], #[ [ 'tagname' ] ], #?
2180       'index'       => [ [ 'disabled' ] ],
2181     },
2182
2183     'cust_main_exemption' => {
2184       'columns' => [
2185         'exemptionnum',   'serial',     '',      '', '', '',
2186         'custnum',           'int',     '',      '', '', '', 
2187         'taxname',       'varchar',     '', $char_d, '', '',
2188         'exempt_number', 'varchar', 'NULL', $char_d, '', '',
2189         #start/end dates?  for reporting?
2190       ],
2191       'primary_key'  => 'exemptionnum',
2192       'unique'       => [],
2193       'index'        => [ [ 'custnum' ] ],
2194       'foreign_keys' => [
2195                           { columns    => [ 'custnum' ],
2196                             table      => 'cust_main',
2197                           },
2198                         ],
2199     },
2200
2201     'cust_tax_adjustment' => {
2202       'columns' => [
2203         'adjustmentnum', 'serial',     '',      '', '', '',
2204         'custnum',          'int',     '',      '', '', '',
2205         'taxname',      'varchar',     '', $char_d, '', '',
2206         'amount',     @money_type,                  '', '', 
2207         'currency',        'char', 'NULL',       3, '', '',
2208         'comment',      'varchar', 'NULL', $char_d, '', '', 
2209         'billpkgnum',       'int', 'NULL',      '', '', '',
2210         #more?  no cust_bill_pkg_tax_location?
2211       ],
2212       'primary_key'  => 'adjustmentnum',
2213       'unique'       => [],
2214       'index'        => [ [ 'custnum' ], [ 'billpkgnum' ] ],
2215       'foreign_keys' => [
2216                           { columns    => [ 'custnum' ],
2217                             table      => 'cust_main',
2218                           },
2219                           { columns    => [ 'billpkgnum' ],
2220                             table      => 'cust_bill_pkg',
2221                           },
2222                         ],
2223     },
2224
2225     'cust_main_county' => { #district+city+county+state+country are checked 
2226                             #off the cust_main_county for validation and to 
2227                             #provide a tax rate.
2228       'columns' => [
2229         'taxnum',    'serial',     '',      '', '', '', 
2230         'district', 'varchar', 'NULL',      20, '', '',
2231         'city',     'varchar', 'NULL', $char_d, '', '',
2232         'county',   'varchar', 'NULL', $char_d, '', '', 
2233         'state',    'varchar', 'NULL', $char_d, '', '', 
2234         'country',     'char',     '',       2, '', '', 
2235         'taxclass', 'varchar', 'NULL', $char_d, '', '', 
2236         'exempt_amount', @money_type,            '', '', 
2237         'exempt_amount_currency', 'char', 'NULL', 3, '', '',
2238         'tax',         'real',     '',      '', '', '', #tax %
2239         'taxname',  'varchar', 'NULL', $char_d, '', '', 
2240         'setuptax',    'char', 'NULL',       1, '', '', # Y = setup tax exempt
2241         'recurtax',    'char', 'NULL',       1, '', '', # Y = recur tax exempt
2242       ],
2243       'primary_key' => 'taxnum',
2244       'unique' => [],
2245   #    'unique' => [ ['taxnum'], ['state', 'county'] ],
2246       'index' => [ [ 'district' ], [ 'city' ], [ 'county' ], [ 'state' ], 
2247                    [ 'country' ],
2248                    [ 'taxclass' ],
2249                  ],
2250     },
2251
2252     'tax_rate'    => {
2253       'columns' => [
2254         'taxnum',       'serial',     '',      '', '', '', 
2255         'geocode',     'varchar', 'NULL', $char_d, '', '',#cch provides 10 char
2256         'data_vendor', 'varchar', 'NULL', $char_d, '', '',#auto update source
2257         'location',    'varchar', 'NULL', $char_d, '', '',#provided by tax authority
2258         'taxclassnum', 'int',     'NULL',      '', '', '', 
2259         'effective_date', @date_type, '', '', 
2260         'tax',        @taxrate_type,      '', '',        # tax %
2261         'excessrate', @taxrate_typen,     '', '',        # second tax %
2262         'taxbase',    @money_typen, '', '',              # amount at first tax rate
2263         'taxmax',     @money_typen, '', '',              # maximum about at both rates
2264         'usetax',        @taxrate_typen,     '', '',     # tax % when non-local
2265         'useexcessrate', @taxrate_typen,     '', '',     # second tax % when non-local
2266         'unittype',    'int',  'NULL', '', '', '',      # for fee
2267         'fee',         @taxrate_typen,     '', '',      # amount tax per unit
2268         'excessfee',   @taxrate_typen,     '', '',      # second amount tax per unit
2269         'feebase',     @taxrate_typen,     '', '',      # units taxed at first rate
2270         'feemax',      @taxrate_typen,     '', '',      # maximum number of unit taxed
2271         'maxtype',     'int',  'NULL', '', '', '',      # indicator of how thresholds accumulate
2272         'taxname', 'varchar',  'NULL', $char_d, '', '', # may appear on invoice
2273         'taxauth',     'int',  'NULL', '', '', '',      # tax authority
2274         'basetype',    'int',  'NULL', '', '', '', # indicator of basis for tax
2275         'passtype',    'int',  'NULL', '', '', '', # indicator declaring how item should be shown
2276         'passflag',    'char', 'NULL', 1, '', '',  # Y = required to list as line item, N = Prohibited
2277         'setuptax',    'char', 'NULL', 1, '', '',  # Y = setup tax exempt
2278         'recurtax',    'char', 'NULL', 1, '', '',  # Y = recur tax exempt
2279         'inoutcity',   'char', 'NULL', 1, '', '',  # '', 'I', or 'O'
2280         'inoutlocal',  'char', 'NULL', 1, '', '',  # '', 'I', or 'O'
2281         'manual',      'char', 'NULL', 1, '', '',  # Y = manually edited
2282         'disabled',    'char', 'NULL', 1, '', '',  # Y = tax disabled
2283       ],
2284       'primary_key'  => 'taxnum',
2285       'unique'       => [],
2286       'index'        => [ ['taxclassnum'], ['data_vendor', 'geocode'] ],
2287       'foreign_keys' => [
2288                           { columns    => [ 'taxclassnum' ],
2289                             table      => 'tax_class',
2290                           },
2291                         ],
2292     },
2293
2294     'tax_rate_location' => { 
2295       'columns' => [
2296         'taxratelocationnum', 'serial',  '',     '', '', '', 
2297         'data_vendor',        'varchar', 'NULL', $char_d, '', '',
2298         'geocode',            'varchar', '',     20,      '', '', 
2299         'city',               'varchar', 'NULL', $char_d, '', '',
2300         'county',             'varchar', 'NULL', $char_d, '', '',
2301         'state',              'char',    'NULL',       2, '', '', 
2302         'country',            'char',    'NULL',       2, '', '',
2303         'disabled',           'char',    'NULL', 1, '', '',
2304       ],
2305       'primary_key' => 'taxratelocationnum',
2306       'unique' => [],
2307       'index' => [ [ 'data_vendor', 'geocode', 'disabled' ] ],
2308     },
2309
2310     'cust_tax_location' => { 
2311       'columns' => [
2312         'custlocationnum', 'serial',  '',     '', '', '', 
2313         'data_vendor',     'varchar', 'NULL', $char_d, '', '', # update source
2314         'city',            'varchar', 'NULL', $char_d, '', '',
2315         'postalcity',      'varchar', 'NULL', $char_d, '', '',
2316         'county',          'varchar', 'NULL', $char_d, '', '',
2317         'zip',             'char',    'NULL', 5,  '', '', 
2318         'state',           'char',    '',     2,  '', '', 
2319         'country',         'char',    'NULL', 2,  '', '', # should not actually be NULL, but cch...
2320         'ziphi',           'char',    'NULL', 10, '', '',
2321         'ziplo',           'char',    'NULL', 10, '', '',
2322         'plus4hi',         'char',    'NULL', 4,  '', '', 
2323         'plus4lo',         'char',    'NULL', 4,  '', '', 
2324         'default_location','char',    'NULL', 1,  '', '', # Y = default for zip
2325         'cityflag',        'char',    'NULL', 1,  '', '', # I(n)/O(out)/B(oth)/NULL
2326         'geocode',         'varchar', '',    20,  '', '', 
2327       ],
2328       'primary_key' => 'custlocationnum',
2329       'unique' => [],
2330       'index' => [ [ 'zip', 'plus4lo', 'plus4hi', 'ziphi', 'ziplo' ] ],
2331     },
2332
2333     'tax_class' => { 
2334       'columns' => [
2335         'taxclassnum',  'serial',  '',            '', '', '',
2336         'data_vendor',  'varchar', 'NULL',   $char_d, '', '',
2337         'taxclass',     'varchar', '',       $char_d, '', '',          
2338         'description',  'varchar', '',     2*$char_d, '', '',          
2339       ],
2340       'primary_key' => 'taxclassnum',
2341       'unique' => [ [ 'data_vendor', 'taxclass' ] ],
2342       'index' => [],
2343     },
2344
2345     'tax_status' => {
2346       'columns' => [
2347         'taxstatusnum', 'serial', '',             '', '', '',
2348         'data_vendor',  'varchar', 'NULL',   $char_d, '', '',
2349         'taxstatus',    'varchar', '',       $char_d, '', '',          
2350         'description',  'varchar', '',       $char_d, '', '',
2351       ],
2352       'primary_key' => 'taxstatusnum',
2353       'unique'      => [ [ 'data_vendor', 'taxstatus' ] ],
2354       'index' => [],
2355     },
2356
2357     'cust_pay_pending' => {
2358       'columns' => [
2359         'paypendingnum',      'serial',     '',      '', '', '',
2360         'custnum',               'int',     '',      '', '', '', 
2361         'paid',            @money_type,                  '', '', 
2362         'currency',             'char', 'NULL',       3, '', '',
2363         '_date',            @date_type,                  '', '', 
2364         'payby',                'char',     '',       4, '', '',
2365         'payinfo',           'varchar', 'NULL',     512, '', '',
2366         'paymask',           'varchar', 'NULL', $char_d, '', '', 
2367         'paydate',           'varchar', 'NULL',     10, '', '', 
2368         'recurring_billing', 'varchar', 'NULL', $char_d, '', '',
2369         'payunique',         'varchar', 'NULL', $char_d, '', '', #separate paybatch "unique" functions from current usage
2370
2371         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
2372         'status',       'varchar',     '', $char_d, '', '', 
2373         'session_id',   'varchar', 'NULL', 1024, '', '', # SHA-512-hex
2374         'statustext',   'text',    'NULL',  '', '', '', 
2375         'gatewaynum',   'int',     'NULL',  '', '', '',
2376         #'cust_balance', @money_type,            '', '',
2377         'paynum',       'int',     'NULL',  '', '', '',
2378         'void_paynum',  'int',     'NULL',  '', '', '',
2379         'jobnum',    'bigint',     'NULL',  '', '', '', 
2380         'invnum',       'int',     'NULL',  '', '', '',
2381         'manual',       'char',    'NULL',   1, '', '',
2382         'discount_term','int',     'NULL',  '', '', '',
2383         'failure_status','varchar','NULL',  16, '', '',
2384       ],
2385       'primary_key'  => 'paypendingnum',
2386       'unique'       => [ [ 'payunique' ] ],
2387       'index'        => [ [ 'custnum' ], [ 'status' ],
2388                           ['paynum'], ['void_paynum'], ['jobnum'], ['invnum'],
2389                         ],
2390       'foreign_keys' => [
2391                           { columns    => [ 'custnum' ],
2392                             table      => 'cust_main',
2393                           },
2394                           { columns    => [ 'pkgnum' ],
2395                             table      => 'cust_pkg',
2396                           },
2397                           { columns    => [ 'gatewaynum' ],
2398                             table      => 'payment_gateway',
2399                           },
2400                           { columns    => [ 'paynum' ],
2401                             table      => 'cust_pay',
2402                           },
2403                           { columns    => [ 'void_paynum' ],
2404                             table      => 'cust_pay_void',
2405                             references => [ 'paynum' ],
2406                           },
2407                           { columns    => [ 'jobnum' ],
2408                             table      => 'queue',
2409                           },
2410                           { columns    => [ 'invnum' ],
2411                             table      => 'cust_bill',
2412                           },
2413                         ],
2414     },
2415
2416     'cust_pay' => {
2417       'columns' => [
2418         'paynum',       'serial',    '',       '', '', '',
2419         'custnum',         'int',    '',       '', '', '', 
2420         '_date',     @date_type,                   '', '', 
2421         'paid',      @money_type,                  '', '', 
2422         'currency',       'char', 'NULL',       3, '', '',
2423         'otaker',      'varchar', 'NULL',      32, '', '',
2424         'usernum',         'int', 'NULL',      '', '', '',
2425         'payby',          'char',     '',       4, '', '',
2426         'payinfo',     'varchar', 'NULL',     512, '', '',
2427         'paymask',     'varchar', 'NULL', $char_d, '', '', 
2428         'paydate',     'varchar', 'NULL',      10, '', '', 
2429         'paybatch',    'varchar', 'NULL', $char_d, '', '',#for auditing purposes
2430         'payunique',   'varchar', 'NULL', $char_d, '', '',#separate paybatch "unique" functions from current usage
2431         'closed',         'char', 'NULL',       1, '', '', 
2432         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
2433
2434         # cash/check deposit info fields
2435         'bank',        'varchar', 'NULL', $char_d, '', '',
2436         'depositor',   'varchar', 'NULL', $char_d, '', '',
2437         'account',     'varchar', 'NULL',      20, '', '',
2438         'teller',      'varchar', 'NULL',      20, '', '',
2439
2440         'batchnum',        'int', 'NULL',      '', '', '',#pay_batch foreign key
2441
2442         # credit card/EFT fields (formerly in paybatch)
2443         'gatewaynum',      'int', 'NULL',      '', '', '', # payment_gateway FK
2444         'processor',   'varchar', 'NULL', $char_d, '', '', # module name
2445         'auth',        'varchar', 'NULL',      16, '', '', # CC auth number
2446         'order_number','varchar', 'NULL', $char_d, '', '', # transaction number
2447       ],
2448       'primary_key'  => 'paynum',
2449       #i guess not now, with cust_pay_pending, if we actually make it here, we _do_ want to record it# 'unique' => [ [ 'payunique' ] ],
2450       'index'        => [ ['custnum'], ['paybatch'], ['payby'], ['_date'],
2451                           ['usernum'],
2452                         ],
2453       'foreign_keys' => [
2454                           { columns    => [ 'custnum' ],
2455                             table      => 'cust_main',
2456                           },
2457                           { columns    => [ 'usernum' ],
2458                             table      => 'access_user',
2459                           },
2460                           { columns    => [ 'pkgnum' ],
2461                             table      => 'cust_pkg',
2462                           },
2463                           { columns    => [ 'batchnum' ],
2464                             table      => 'pay_batch',
2465                           },
2466                           { columns    => [ 'gatewaynum' ],
2467                             table      => 'payment_gateway',
2468                           },
2469                         ],
2470     },
2471
2472     'cust_pay_void' => {
2473       'columns' => [
2474         'paynum',          'int',    '',       '', '', '', 
2475         'custnum',         'int',    '',       '', '', '', 
2476         '_date',      @date_type,                  '', '', 
2477         'paid',      @money_type,                  '', '', 
2478         'currency',       'char', 'NULL',       3, '', '',
2479         'otaker',      'varchar', 'NULL',      32, '', '', 
2480         'usernum',         'int', 'NULL',      '', '', '',
2481         'payby',          'char',     '',       4, '', '',
2482         'payinfo',     'varchar', 'NULL',     512, '', '',
2483         'paymask',     'varchar', 'NULL', $char_d, '', '', 
2484         #'paydate' ?
2485         'paybatch',    'varchar', 'NULL', $char_d, '', '', #for auditing purposes.
2486         'closed',        'char',  'NULL',       1, '', '', 
2487         'pkgnum', 'int',   'NULL', '', '', '', #desired pkgnum for pkg-balances
2488
2489         # cash/check deposit info fields
2490         'bank',       'varchar', 'NULL', $char_d, '', '',
2491         'depositor',  'varchar', 'NULL', $char_d, '', '',
2492         'account',    'varchar', 'NULL',      20, '', '',
2493         'teller',     'varchar', 'NULL',      20, '', '',
2494         'batchnum',       'int', 'NULL',      '', '', '', #pay_batch foreign key
2495
2496         # credit card/EFT fields (formerly in paybatch)
2497         'gatewaynum',      'int', 'NULL',      '', '', '', # payment_gateway FK
2498         'processor',   'varchar', 'NULL', $char_d, '', '', # module name
2499         'auth',        'varchar', 'NULL',      16, '', '', # CC auth number
2500         'order_number','varchar', 'NULL', $char_d, '', '', # transaction number
2501
2502         #void fields
2503         'void_date',  @date_type,                  '', '', 
2504         'reason',      'varchar', 'NULL', $char_d, '', '', 
2505         'void_usernum',    'int', 'NULL',      '', '', '',
2506       ],
2507       'primary_key'  => 'paynum',
2508       'unique'       => [],
2509       'index'        => [ ['custnum'], ['usernum'], ['void_usernum'] ],
2510       'foreign_keys' => [
2511                           { columns    => [ 'custnum' ],
2512                             table      => 'cust_main',
2513                           },
2514                           { columns    => [ 'usernum' ],
2515                             table      => 'access_user',
2516                           },
2517                           { columns    => [ 'pkgnum' ],
2518                             table      => 'cust_pkg',
2519                           },
2520                           { columns    => [ 'batchnum' ],
2521                             table      => 'pay_batch',
2522                           },
2523                           { columns    => [ 'gatewaynum' ],
2524                             table      => 'payment_gateway',
2525                           },
2526                           { columns    => [ 'void_usernum' ],
2527                             table      => 'access_user',
2528                             references => [ 'usernum' ],
2529                           },
2530                         ],
2531     },
2532
2533     'cust_bill_pay' => {
2534       'columns' => [
2535         'billpaynum', 'serial',     '',   '', '', '', 
2536         'invnum',  'int',     '',   '', '', '', 
2537         'paynum',  'int',     '',   '', '', '', 
2538         'amount',  @money_type, '', '', 
2539         '_date',   @date_type, '', '', 
2540         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
2541       ],
2542       'primary_key'  => 'billpaynum',
2543       'unique'       => [],
2544       'index'        => [ [ 'paynum' ], [ 'invnum' ] ],
2545       'foreign_keys' => [
2546                           { columns    => [ 'invnum' ],
2547                             table      => 'cust_bill',
2548                           },
2549                           { columns    => [ 'paynum' ],
2550                             table      => 'cust_pay',
2551                           },
2552                           { columns    => [ 'pkgnum' ],
2553                             table      => 'cust_pkg',
2554                           },
2555                         ],
2556     },
2557
2558     'cust_bill_pay_batch' => {
2559       'columns' => [
2560         'billpaynum', 'serial',     '',   '', '', '', 
2561         'invnum',  'int',     '',   '', '', '', 
2562         'paybatchnum',  'int',     '',   '', '', '', 
2563         'amount',  @money_type, '', '', 
2564         '_date',   @date_type, '', '', 
2565       ],
2566       'primary_key'  => 'billpaynum',
2567       'unique'       => [],
2568       'index'        => [ [ 'paybatchnum' ], [ 'invnum' ] ],
2569       'foreign_keys' => [
2570                           { columns    => [ 'invnum' ],
2571                             table      => 'cust_bill',
2572                           },
2573                           { columns    => [ 'paybatchnum' ],
2574                             table      => 'cust_pay_batch',
2575                           },
2576                         ],
2577     },
2578
2579     'cust_bill_pay_pkg' => {
2580       'columns' => [
2581         'billpaypkgnum', 'serial', '', '', '', '',
2582         'billpaynum',       'int', '', '', '', '',
2583         'billpkgnum',       'int', '', '', '', '',
2584         'billpkgtaxlocationnum', 'int', 'NULL', '', '', '',
2585         'billpkgtaxratelocationnum', 'int', 'NULL', '', '', '',
2586         'amount',         @money_type,     '', '',
2587         'setuprecur',      'varchar', '', $char_d, '', '',
2588         'sdate',   @date_type, '', '', 
2589         'edate',   @date_type, '', '', 
2590       ],
2591       'primary_key'  => 'billpaypkgnum',
2592       'unique'       => [],
2593       'index'        => [ [ 'billpaynum' ], [ 'billpkgnum' ], ],
2594       'foreign_keys' => [
2595                           { columns    => [ 'billpaynum' ],
2596                             table      => 'cust_bill_pay',
2597                           },
2598                           { columns    => [ 'billpkgnum' ],
2599                             table      => 'cust_bill_pkg',
2600                           },
2601                           { columns    => [ 'billpkgtaxlocationnum' ],
2602                             table      => 'cust_bill_pkg_tax_location',
2603                           },
2604                           { columns    => [ 'billpkgtaxratelocationnum' ],
2605                             table      => 'cust_bill_pkg_tax_rate_location',
2606                           },
2607                         ],
2608     },
2609
2610     'pay_batch' => { #batches of payments to an external processor
2611       'columns' => [
2612         'batchnum', 'serial',     '', '', '', '', 
2613         'agentnum',    'int', 'NULL', '', '', '', 
2614         'payby',      'char',     '',  4, '', '', # CARD/CHEK
2615         'status',     'char', 'NULL',  1, '', '', 
2616         'download',       @date_type,     '', '', 
2617         'upload',         @date_type,     '', '', 
2618         'title',   'varchar', 'NULL',255, '', '',
2619         'processor_id',   'varchar', 'NULL',255, '', '',
2620       ],
2621       'primary_key'  => 'batchnum',
2622       'unique'       => [],
2623       'index'        => [],
2624       'foreign_keys' => [
2625                           { columns    => [ 'agentnum' ],
2626                             table      => 'agent',
2627                           },
2628                         ],
2629     },
2630
2631     'cust_pay_batch' => { #list of customers in current CARD/CHEK batch
2632       'columns' => [
2633         'paybatchnum',    'serial',     '',      '', '', '', 
2634         'batchnum',          'int',     '',      '', '', '', 
2635         'invnum',            'int',     '',      '', '', '', 
2636         'custnum',           'int',     '',      '', '', '', 
2637         'last',          'varchar',     '', $char_d, '', '', 
2638         'first',         'varchar',     '', $char_d, '', '', 
2639         'address1',      'varchar',     '', $char_d, '', '', 
2640         'address2',      'varchar', 'NULL', $char_d, '', '', 
2641         'city',          'varchar',     '', $char_d, '', '', 
2642         'state',         'varchar', 'NULL', $char_d, '', '', 
2643         'zip',           'varchar', 'NULL',      10, '', '', 
2644         'country',          'char',     '',       2, '', '', 
2645         'payby',            'char',     '',       4, '', '',
2646         'payinfo',       'varchar', 'NULL',     512, '', '', 
2647         #'exp',          @date_type,                  '', '',
2648         'exp',           'varchar', 'NULL',      11, '', '', 
2649         'payname',       'varchar', 'NULL', $char_d, '', '', 
2650         'amount',      @money_type,                  '', '', 
2651         'currency',         'char', 'NULL',       3, '', '',
2652         'status',        'varchar', 'NULL', $char_d, '', '', 
2653         'failure_status','varchar', 'NULL',      16, '', '',
2654         'error_message', 'varchar', 'NULL', $char_d, '', '',
2655       ],
2656       'primary_key'  => 'paybatchnum',
2657       'unique'       => [],
2658       'index'        => [ ['batchnum'], ['invnum'], ['custnum'] ],
2659       'foreign_keys' => [
2660                           { columns    => [ 'batchnum' ],
2661                             table      => 'pay_batch',
2662                           },
2663                           { columns    => [ 'invnum' ],
2664                             table      => 'cust_bill',
2665                           },
2666                           { columns    => [ 'custnum' ],
2667                             table      => 'cust_main',
2668                           },
2669                         ],
2670     },
2671
2672     'fcc477map' => {
2673       'columns' => [
2674         'formkey',   'varchar',     '', 255, '', '',
2675         'formvalue',    'text', 'NULL',  '', '', '',
2676       ],
2677       'primary_key' => 'formkey',
2678       'unique'      => [],
2679       'index'       => [],
2680     },
2681
2682     'cust_pkg' => {
2683       'columns' => [
2684         'pkgnum',           'serial',     '', '', '', '', 
2685         'custnum',             'int',     '', '', '', '', 
2686         'pkgpart',             'int',     '', '', '', '', 
2687         'pkgbatch',        'varchar', 'NULL', $char_d, '', '',
2688         'contactnum',          'int', 'NULL', '', '', '', 
2689         'locationnum',         'int', 'NULL', '', '', '',
2690         'otaker',          'varchar', 'NULL', 32, '', '', 
2691         'usernum',             'int', 'NULL', '', '', '',
2692         'salesnum',            'int', 'NULL', '', '', '', 
2693         'order_date',     @date_type,             '', '', 
2694         'start_date',     @date_type,             '', '', 
2695         'setup',          @date_type,             '', '', 
2696         'bill',           @date_type,             '', '', 
2697         'last_bill',      @date_type,             '', '', 
2698         'susp',           @date_type,             '', '', 
2699         'adjourn',        @date_type,             '', '', 
2700         'resume',         @date_type,             '', '', 
2701         'cancel',         @date_type,             '', '', 
2702         'uncancel',       @date_type,             '', '', 
2703         'uncancel_pkgnum',     'int', 'NULL', '', '', '',
2704         'expire',         @date_type,             '', '', 
2705         'contract_end',   @date_type,             '', '',
2706         'dundate',        @date_type,             '', '',
2707         'change_date',    @date_type,             '', '',
2708         'change_pkgnum',       'int', 'NULL', '', '', '',
2709         'change_pkgpart',      'int', 'NULL', '', '', '',
2710         'change_locationnum',  'int', 'NULL', '', '', '',
2711         'change_custnum',      'int', 'NULL', '', '', '',
2712         'main_pkgnum',         'int', 'NULL', '', '', '',
2713         'pkglinknum',          'int', 'NULL', '', '', '',
2714         'manual_flag',        'char', 'NULL',  1, '', '', 
2715         'no_auto',            'char', 'NULL',  1, '', '', 
2716         'quantity',            'int', 'NULL', '', '', '',
2717         'agent_pkgid',     'varchar', 'NULL', $char_d, '', '',
2718         'waive_setup',        'char', 'NULL',  1, '', '', 
2719         'recur_show_zero',    'char', 'NULL',  1, '', '',
2720         'setup_show_zero',    'char', 'NULL',  1, '', '',
2721         'change_to_pkgnum',    'int', 'NULL', '', '', '',
2722         'separate_bill',      'char', 'NULL',  1, '', '',
2723       ],
2724       'primary_key'  => 'pkgnum',
2725       'unique'       => [],
2726       'index'        => [ ['custnum'], ['pkgpart'], ['pkgbatch'],
2727                           ['locationnum'], ['usernum'], ['agent_pkgid'],
2728                           ['order_date'], [ 'start_date' ], ['setup'], ['bill'],
2729                           ['last_bill'], ['susp'], ['adjourn'], ['resume'],
2730                           ['cancel'], ['expire'], ['contract_end'],
2731                           ['change_date'],
2732                           ['no_auto'],
2733                           #['contactnum'],
2734                           ['salesnum'],
2735                           #['uncancel_pkgnum'],
2736                           #['change_pkgnum'], ['change_locationnum'],
2737                           #['change_custnum'],
2738                           ['main_pkgnum'],
2739                           #['pkglinknum'], ['change_to_pkgnum'],
2740                         ],
2741       'foreign_keys' => [
2742                           { columns    => [ 'custnum' ],
2743                             table      => 'cust_main',
2744                           },
2745                           { columns    => [ 'pkgpart' ],
2746                             table      => 'part_pkg',
2747                           },
2748                           { columns    => [ 'contactnum' ],
2749                             table      => 'contact',
2750                           },
2751                           { columns    => [ 'locationnum' ],
2752                             table      => 'cust_location',
2753                           },
2754                           { columns    => [ 'usernum' ],
2755                             table      => 'access_user',
2756                           },
2757                           { columns    => [ 'salesnum' ],
2758                             table      => 'sales',
2759                           },
2760                           { columns    => [ 'uncancel_pkgnum' ],
2761                             table      => 'cust_pkg',
2762                             references => [ 'pkgnum' ],
2763                           },
2764                           { columns    => [ 'change_pkgnum' ],
2765                             table      => 'cust_pkg',
2766                             references => [ 'pkgnum' ],
2767                           },
2768                           { columns    => [ 'change_pkgpart' ],
2769                             table      => 'part_pkg',
2770                             references => [ 'pkgpart' ],
2771                           },
2772                           { columns    => [ 'change_locationnum' ],
2773                             table      => 'cust_location',
2774                             references => [ 'locationnum' ],
2775                           },
2776                           { columns    => [ 'change_custnum' ],
2777                             table      => 'cust_main',
2778                             references => [ 'custnum' ],
2779                           },
2780                           { columns    => [ 'main_pkgnum' ],
2781                             table      => 'cust_pkg',
2782                             references => [ 'pkgnum' ],
2783                           },
2784                           { columns    => [ 'pkglinknum' ],
2785                             table      => 'part_pkg_link',
2786                           },
2787                           { columns    => [ 'change_to_pkgnum' ],
2788                             table      => 'cust_pkg',
2789                             references => [ 'pkgnum' ],
2790                           },
2791                         ],
2792    },
2793
2794     'cust_pkg_option' => {
2795       'columns' => [
2796         'optionnum', 'serial', '', '', '', '', 
2797         'pkgnum', 'int', '', '', '', '', 
2798         'optionname', 'varchar', '', $char_d, '', '', 
2799         'optionvalue', 'text', 'NULL', '', '', '', 
2800       ],
2801       'primary_key'  => 'optionnum',
2802       'unique'       => [],
2803       'index'        => [ [ 'pkgnum' ], [ 'optionname' ] ],
2804       'foreign_keys' => [
2805                           { columns    => [ 'pkgnum' ],
2806                             table      => 'cust_pkg',
2807                           },
2808                         ],
2809     },
2810
2811     'cust_pkg_detail' => {
2812       'columns' => [
2813         'pkgdetailnum', 'serial', '',        '', '', '',
2814         'pkgnum',          'int', '',        '', '', '',
2815         'detail',      'varchar', '', 2*$char_d, '', '', 
2816         'detailtype',     'char', '',         1, '', '', #"I"nvoice or "C"omment
2817         'weight',          'int', '',        '', '', '',
2818       ],
2819       'primary_key'  => 'pkgdetailnum',
2820       'unique'       => [],
2821       'index'        => [ [ 'pkgnum', 'detailtype' ] ],
2822       'foreign_keys' => [
2823                           { columns    => [ 'pkgnum' ],
2824                             table      => 'cust_pkg',
2825                           },
2826                         ],
2827     },
2828
2829     'cust_pkg_reason' => {
2830       'columns' => [
2831         'num',      'serial',    '',   '', '', '', 
2832         'pkgnum',   'int',    '',   '', '', '', 
2833         'reasonnum','int',    '',   '', '', '', 
2834         'action',   'char', 'NULL', 1, '', '',     #should not be nullable
2835         'otaker',   'varchar', 'NULL', 32, '', '', 
2836         'usernum',   'int', 'NULL', '', '', '',
2837         'date',     @date_type, '', '', 
2838       ],
2839       'primary_key'  => 'num',
2840       'unique'       => [],
2841       'index'        => [ ['pkgnum'], ['reasonnum'], ['action'], ['usernum'], ],
2842       'foreign_keys' => [
2843                           { columns    => [ 'pkgnum' ],
2844                             table      => 'cust_pkg',
2845                           },
2846                           { columns    => [ 'reasonnum' ],
2847                             table      => 'reason',
2848                           },
2849                           { columns    => [ 'usernum' ],
2850                             table      => 'access_user',
2851                           },
2852                         ],
2853     },
2854
2855     'cust_pkg_reason_fee' => {
2856       'columns' => [
2857         'pkgreasonfeenum', 'serial', '', '', '', '',
2858         'pkgreasonnum',       'int', '', '', '', '',
2859         'billpkgnum',         'int', 'NULL', '', '', '',
2860         'feepart',            'int', '', '', '', '',
2861         'nextbill',          'char', 'NULL',  1, '', '',
2862       ],
2863       'primary_key'  => 'pkgreasonfeenum',
2864       'unique' => [ [ 'billpkgnum' ], [ 'pkgreasonnum' ] ], # one-to-one link
2865       'index'  => [ [ 'feepart' ] ],
2866       'foreign_keys' => [
2867                           { columns     => [ 'pkgreasonnum' ],
2868                             table       => 'cust_pkg_reason',
2869                             references  => [ 'num' ],
2870                           },
2871                           { columns     => [ 'feepart' ],
2872                             table       => 'part_fee',
2873                           },
2874                           # can't link billpkgnum, because of voids
2875       ],
2876     },
2877
2878     'cust_pkg_discount' => {
2879       'columns' => [
2880         'pkgdiscountnum', 'serial', '',        '', '', '',
2881         'pkgnum',            'int', '',        '', '', '', 
2882         'discountnum',       'int', '',        '', '', '',
2883         'months_used',   'decimal', 'NULL', '7,4', '', '',
2884         'end_date',     @date_type,                '', '',
2885         'otaker',        'varchar', 'NULL',    32, '', '', 
2886         'usernum',           'int', 'NULL',    '', '', '',
2887         'disabled',         'char', 'NULL',     1, '', '', 
2888       ],
2889       'primary_key'  => 'pkgdiscountnum',
2890       'unique'       => [],
2891       'index'        => [ [ 'pkgnum' ], [ 'discountnum' ], [ 'usernum' ], ],
2892       'foreign_keys' => [
2893                           { columns    => [ 'pkgnum' ],
2894                             table      => 'cust_pkg',
2895                           },
2896                           { columns    => [ 'discountnum' ],
2897                             table      => 'discount',
2898                           },
2899                           { columns    => [ 'usernum' ],
2900                             table      => 'access_user',
2901                           },
2902                         ],
2903     },
2904
2905     'cust_pkg_usage' => {
2906       'columns' => [
2907         'pkgusagenum', 'serial', '', '', '', '',
2908         'pkgnum',         'int', '', '', '', '',
2909         'minutes',        'double precision', '', '', '', '',
2910         'pkgusagepart',   'int', '', '', '', '',
2911       ],
2912       'primary_key'  => 'pkgusagenum',
2913       'unique'       => [],
2914       'index'        => [ [ 'pkgnum' ], [ 'pkgusagepart' ] ],
2915       'foreign_keys' => [
2916                           { columns    => [ 'pkgnum' ],
2917                             table      => 'cust_pkg',
2918                           },
2919                           { columns    => [ 'pkgusagepart' ],
2920                             table      => 'part_pkg_usage',
2921                           },
2922                         ],
2923     },
2924
2925     'cdr_cust_pkg_usage' => {
2926       'columns' => [
2927         'cdrusagenum', 'bigserial', '', '', '', '',
2928         'acctid',      'bigint',    '', '', '', '',
2929         'pkgusagenum', 'int',       '', '', '', '',
2930         'minutes',     'double precision',       '', '', '', '',
2931       ],
2932       'primary_key'  => 'cdrusagenum',
2933       'unique'       => [],
2934       'index'        => [ [ 'pkgusagenum' ], [ 'acctid' ] ],
2935       'foreign_keys' => [
2936                           { columns    => [ 'acctid' ],
2937                             table      => 'cdr',
2938                           },
2939                           { columns    => [ 'pkgusagenum' ],
2940                             table      => 'cust_pkg_usage',
2941                           },
2942                         ],
2943     },
2944
2945     'cust_bill_pkg_discount' => {
2946       'columns' => [
2947         'billpkgdiscountnum', 'serial',        '', '', '', '',
2948         'billpkgnum',            'int',        '', '', '', '', 
2949         'pkgdiscountnum',        'int',        '', '', '', '', 
2950         'amount',          @money_type,                '', '', 
2951         'months',            'decimal', 'NULL', '7,4', '', '',
2952       ],
2953       'primary_key'  => 'billpkgdiscountnum',
2954       'unique'       => [],
2955       'index'        => [ [ 'billpkgnum' ], [ 'pkgdiscountnum' ] ],
2956       'foreign_keys' => [
2957                           { columns    => [ 'billpkgnum' ],
2958                             table      => 'cust_bill_pkg',
2959                           },
2960                           { columns    => [ 'pkgdiscountnum' ],
2961                             table      => 'cust_pkg_discount',
2962                           },
2963                         ],
2964     },
2965
2966     'cust_bill_pkg_discount_void' => {
2967       'columns' => [
2968         'billpkgdiscountnum',    'int',        '', '', '', '',
2969         'billpkgnum',            'int',        '', '', '', '', 
2970         'pkgdiscountnum',        'int',        '', '', '', '', 
2971         'amount',          @money_type,                '', '', 
2972         'months',            'decimal', 'NULL', '7,4', '', '',
2973       ],
2974       'primary_key'  => 'billpkgdiscountnum',
2975       'unique'       => [],
2976       'index'        => [ [ 'billpkgnum' ], [ 'pkgdiscountnum' ] ],
2977       'foreign_keys' => [
2978                           { columns    => [ 'billpkgnum' ],
2979                             table      => 'cust_bill_pkg_void',
2980                           },
2981                           { columns    => [ 'pkgdiscountnum' ],
2982                             table      => 'cust_pkg_discount',
2983                           },
2984                         ],
2985     },
2986
2987     'discount' => {
2988       'columns' => [
2989         'discountnum', 'serial',     '',      '', '', '',
2990         #'agentnum',       'int', 'NULL',      '', '', '', 
2991         'classnum',       'int', 'NULL',      '', '', '',
2992         'name',       'varchar', 'NULL', $char_d, '', '',
2993         'amount',   @money_type,                  '', '', 
2994         'percent',    'decimal',     '',   '7,4', '', '',
2995         'months',     'decimal', 'NULL',   '7,4', '', '',
2996         'disabled',      'char', 'NULL',       1, '', '', 
2997         'setup',         'char', 'NULL',       1, '', '', 
2998         #'linked',        'char', 'NULL',       1, '', '',
2999       ],
3000       'primary_key'  => 'discountnum',
3001       'unique'       => [],
3002       'index'        => [], # [ 'agentnum' ], ],
3003       'foreign_keys' => [
3004                           { columns    => [ 'classnum' ],
3005                             table      => 'discount_class',
3006                           },
3007                         ],
3008     },
3009
3010     'discount_class' => {
3011       'columns' => [
3012         'classnum',    'serial',   '',      '', '', '', 
3013         'classname',   'varchar',  '', $char_d, '', '', 
3014         #'categorynum', 'int',  'NULL',      '', '', '', 
3015         'disabled',    'char', 'NULL',       1, '', '', 
3016       ],
3017       'primary_key' => 'classnum',
3018       'unique' => [],
3019       'index' => [ ['disabled'] ],
3020     },
3021
3022     'cust_refund' => {
3023       'columns' => [
3024         'refundnum',    'serial',    '',   '', '', '', 
3025         'custnum',  'int',    '',   '', '', '', 
3026         '_date',        @date_type, '', '', 
3027         'refund',       @money_type, '', '', 
3028         'currency',       'char', 'NULL',       3, '', '',
3029         'otaker',       'varchar',   'NULL',   32, '', '', 
3030         'usernum',   'int', 'NULL', '', '', '',
3031         'reason',       'varchar',   'NULL',   $char_d, '', '', 
3032         'reasonnum',   'int', 'NULL', '', '', '',
3033         'payby',        'char',   '',     4, '', '', # CARD/BILL/COMP, should
3034                                                      # be index into payby
3035                                                      # table eventually
3036         'payinfo',      'varchar',   'NULL', 512, '', '', #see cust_main above
3037         'paymask', 'varchar', 'NULL', $char_d, '', '', 
3038         'paybatch',     'varchar',   'NULL', $char_d, '', '', 
3039         'closed',    'char', 'NULL', 1, '', '', 
3040         # credit card/EFT fields (formerly in paybatch)
3041         'gatewaynum',     'int', 'NULL', '', '', '', # payment_gateway FK
3042         'processor',  'varchar', 'NULL', $char_d, '', '', # module name
3043         'auth',       'varchar','NULL',16, '', '', # CC auth number
3044         'order_number', 'varchar','NULL',$char_d, '', '', # transaction number
3045       ],
3046       'primary_key'  => 'refundnum',
3047       'unique'       => [],
3048       'index'        => [ ['custnum'], ['_date'], [ 'usernum' ], ],
3049       'foreign_keys' => [
3050                           { columns    => [ 'custnum' ],
3051                             table      => 'cust_main',
3052                           },
3053                           { columns    => [ 'usernum' ],
3054                             table      => 'access_user',
3055                           },
3056                           { columns    => [ 'reasonnum' ],
3057                             table      => 'reason',
3058                           },
3059                           { columns    => [ 'gatewaynum' ],
3060                             table      => 'payment_gateway',
3061                           },
3062                         ],
3063     },
3064
3065     'cust_credit_refund' => {
3066       'columns' => [
3067         'creditrefundnum', 'serial',     '',   '', '', '', 
3068         'crednum',  'int',     '',   '', '', '', 
3069         'refundnum',  'int',     '',   '', '', '', 
3070         'amount',  @money_type, '', '', 
3071         '_date',   @date_type, '', '', 
3072       ],
3073       'primary_key'  => 'creditrefundnum',
3074       'unique'       => [],
3075       'index'        => [ ['crednum'], ['refundnum'] ],
3076       'foreign_keys' => [
3077                           { columns    => [ 'crednum' ],
3078                             table      => 'cust_credit',
3079                           },
3080                           { columns    => [ 'refundnum' ],
3081                             table      => 'cust_refund',
3082                           },
3083                         ],
3084     },
3085
3086
3087     'cust_svc' => {
3088       'columns' => [
3089         'svcnum',      'serial',     '', '', '', '', 
3090         'pkgnum',         'int', 'NULL', '', '', '', 
3091         'svcpart',        'int',     '', '', '', '', 
3092         'agent_svcid',    'int', 'NULL', '', '', '',
3093         'overlimit',           @date_type,   '', '', 
3094       ],
3095       'primary_key'  => 'svcnum',
3096       'unique'       => [],
3097       'index'        => [ ['svcnum'], ['pkgnum'], ['svcpart'],
3098                           ['agent_svcid'],
3099                         ],
3100       'foreign_keys' => [
3101                           { columns    => [ 'pkgnum' ],
3102                             table      => 'cust_pkg',
3103                           },
3104                           { columns    => [ 'svcpart' ],
3105                             table      => 'part_svc',
3106                           },
3107                         ],
3108     },
3109
3110     'cust_svc_option' => {
3111       'columns' => [
3112         'optionnum',   'serial', '', '', '', '', 
3113         'svcnum',      'int', '', '', '', '', 
3114         'optionname',  'varchar', '', $char_d, '', '', 
3115         'optionvalue', 'text', 'NULL', '', '', '', 
3116       ],
3117       'primary_key'  => 'optionnum',
3118       'unique'       => [],
3119       'index'        => [ [ 'svcnum' ], [ 'optionname' ] ],
3120       'foreign_keys' => [
3121                           { columns    => [ 'svcnum' ],
3122                             table      => 'cust_svc',
3123                           },
3124                         ],
3125     },
3126
3127     'svc_export_machine' => {
3128       'columns' => [
3129         'svcexportmachinenum', 'serial', '', '', '', '',
3130         'svcnum',                 'int', '', '', '', '', 
3131         'exportnum',              'int', '', '', '', '', 
3132         'machinenum',             'int', '', '', '', '',
3133       ],
3134       'primary_key'  => 'svcexportmachinenum',
3135       'unique'       => [ ['svcnum', 'exportnum'] ],
3136       'index'        => [],
3137       'foreign_keys' => [
3138                           { columns    => [ 'svcnum' ],
3139                             table      => 'cust_svc',
3140                           },
3141                           { columns    => [ 'exportnum' ],
3142                             table      => 'part_export',
3143                           },
3144                           { columns    => [ 'machinenum' ],
3145                             table      => 'part_export_machine',
3146                           },
3147                         ],
3148     },
3149
3150     'part_export_machine' => {
3151       'columns' => [
3152         'machinenum', 'serial', '', '', '', '',
3153         'exportnum',     'int', '', '', '', '',
3154         'machine',    'varchar', 'NULL', $char_d, '', '', 
3155         'disabled',      'char', 'NULL',       1, '', '',
3156       ],
3157       'primary_key'  => 'machinenum',
3158       'unique'       => [ [ 'exportnum', 'machine' ] ],
3159       'index'        => [ [ 'exportnum' ] ],
3160       'foreign_keys' => [
3161                           { columns    => [ 'exportnum' ],
3162                             table      => 'part_export',
3163                           },
3164                         ],
3165     },
3166
3167     'part_pkg' => {
3168       'columns' => [
3169         'pkgpart',       'serial',    '',   '', '', '', 
3170         'pkgpartbatch',  'varchar', 'NULL', $char_d, '', '',
3171         'pkg',           'varchar',   '',   $char_d, '', '', 
3172         'comment',       'varchar', 'NULL', 2*$char_d, '', '', 
3173         'promo_code',    'varchar', 'NULL', $char_d, '', '', 
3174         'freq',          'varchar',   '',   $char_d, '', '', #billing frequency
3175         'setuptax',      'char', 'NULL', 1, '', '', 
3176         'recurtax',      'char', 'NULL', 1, '', '', 
3177         'plan',          'varchar', 'NULL', $char_d, '', '', 
3178         'disabled',      'char', 'NULL', 1, '', '', 
3179         'custom',        'char', 'NULL', 1, '', '', 
3180         'taxclass',      'varchar', 'NULL', $char_d, '', '', 
3181         'classnum',      'int',     'NULL', '', '', '', 
3182         'addon_classnum','int',     'NULL', '', '', '', 
3183         'taxproductnum', 'int',     'NULL', '', '', '', 
3184         'setup_cost',    @money_typen,          '', '',
3185         'recur_cost',    @money_typen,          '', '',
3186         'pay_weight',    'real',    'NULL', '', '', '',
3187         'credit_weight', 'real',    'NULL', '', '', '',
3188         'agentnum',      'int',     'NULL', '', '', '', 
3189         'fcc_ds0s',      'int',     'NULL', '', '', '', 
3190         'fcc_voip_class','char',    'NULL',  1, '', '',
3191         'no_auto',          'char', 'NULL',  1, '', '', 
3192         'recur_show_zero',  'char', 'NULL',  1, '', '',
3193         'setup_show_zero',  'char', 'NULL',  1, '', '',
3194         'successor',     'int',     'NULL', '', '', '',
3195         'family_pkgpart','int',     'NULL', '', '', '',
3196         'delay_start',   'int',     'NULL', '', '', '',
3197         'start_on_hold', 'char',    'NULL',  1, '', '',
3198         'agent_pkgpartid', 'varchar', 'NULL', 20, '', '',
3199       ],
3200       'primary_key'  => 'pkgpart',
3201       'unique'       => [],
3202       'index'        => [ [ 'promo_code' ], [ 'disabled' ], [ 'classnum' ],
3203                           [ 'agentnum' ], ['no_auto'], ['agent_pkgpartid'],
3204                         ],
3205       'foreign_keys' => [
3206                           { columns    => [ 'classnum' ],
3207                             table      => 'pkg_class',
3208                           },
3209                           { columns    => [ 'addon_classnum' ],
3210                             table      => 'pkg_class',
3211                             references => [ 'classnum' ],
3212                           },
3213                           { columns    => [ 'taxproductnum' ],
3214                             table      => 'part_pkg_taxproduct',
3215                           },
3216                           { columns    => [ 'agentnum' ],
3217                             table      => 'agent',
3218                           },
3219                           { columns    => [ 'successor' ],
3220                             table      => 'part_pkg',
3221                             references => [ 'pkgpart' ],
3222                           },
3223                           { columns    => [ 'family_pkgpart' ],
3224                             table      => 'part_pkg',
3225                             references => [ 'pkgpart' ],
3226                           },
3227                         ],
3228     },
3229
3230     'part_pkg_msgcat' => {
3231       'columns' => [
3232         'pkgpartmsgnum',  'serial',     '',        '', '', '',
3233         'pkgpart',           'int',     '',        '', '', '',
3234         'locale',        'varchar',     '',        16, '', '',
3235         'pkg',           'varchar',     '',   $char_d, '', '', #longer/no limit?
3236         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
3237       ],
3238       'primary_key'  => 'pkgpartmsgnum',
3239       'unique'       => [ [ 'pkgpart', 'locale' ] ],
3240       'index'        => [],
3241       'foreign_keys' => [
3242                           { columns    => [ 'pkgpart' ],
3243                             table      => 'part_pkg',
3244                           },
3245                         ],
3246     },
3247
3248     'part_pkg_currency' => {
3249       'columns' => [
3250         'pkgcurrencynum', 'serial', '',      '', '', '',
3251         'pkgpart',           'int', '',      '', '', '',
3252         'currency',         'char', '',       3, '', '',
3253         'optionname',    'varchar', '', $char_d, '', '', 
3254         'optionvalue',      'text', '',      '', '', '', 
3255       ],
3256       'primary_key'  => 'pkgcurrencynum',
3257       'unique'       => [ [ 'pkgpart', 'currency', 'optionname' ] ],
3258       'index'        => [ ['pkgpart'] ],
3259       'foreign_keys' => [
3260                           { columns    => [ 'pkgpart' ],
3261                             table      => 'part_pkg',
3262                           },
3263                         ],
3264     },
3265
3266     'currency_exchange' => {
3267       'columns' => [
3268         'currencyratenum', 'serial', '',    '', '', '',
3269         'from_currency',     'char', '',     3, '', '',
3270         'to_currency',       'char', '',     3, '', '',
3271         'rate',           'decimal', '', '7,6', '', '',
3272       ],
3273       'primary_key' => 'currencyratenum',
3274       'unique'      => [ [ 'from_currency', 'to_currency' ] ],
3275       'index'       => [],
3276     },
3277
3278     'part_pkg_usageprice' => {
3279       'columns' => [
3280         'usagepricepart', 'serial',      '',      '', '', '',
3281         'pkgpart',           'int',      '',      '', '', '',
3282         'price',          @money_type,                '', '', 
3283         'currency',         'char',  'NULL',       3, '', '',
3284         'action',        'varchar',      '', $char_d, '', '',
3285         'target',        'varchar',      '', $char_d, '', '',
3286         'amount',        'varchar',      '', $char_d, '', '',
3287       ],
3288       'primary_key'  => 'usagepricepart',
3289       'unique'       => [ [ 'pkgpart', 'currency', 'target' ] ],
3290       'index'        => [ [ 'pkgpart' ] ],
3291       'foreign_keys' => [
3292                           { columns    => [ 'pkgpart' ],
3293                             table      => 'part_pkg',
3294                           },
3295                         ],
3296     },
3297
3298     'cust_pkg_usageprice' => {
3299       'columns' => [
3300         'usagepricenum', 'serial',      '',      '', '', '',
3301         'pkgnum',           'int',      '',      '', '', '',
3302         'usagepricepart',   'int',      '',      '', '', '',
3303         'quantity',         'int',      '',      '', '', '',
3304       ],
3305       'primary_key'  => 'usagepricenum',
3306       'unique'       => [ [ 'pkgnum', 'usagepricepart' ] ],
3307       'index'        => [ [ 'pkgnum' ] ],
3308       'foreign_keys' => [
3309                           { columns    => [ 'pkgnum' ],
3310                             table      => 'cust_pkg',
3311                           },
3312                           { columns    => [ 'usagepricepart' ],
3313                             table      => 'part_pkg_usageprice',
3314                           },
3315                         ],
3316     },
3317
3318     'part_fee' => {
3319       'columns' => [
3320         'feepart',       'serial',    '',   '', '', '',
3321         'itemdesc',      'varchar',   '',   $char_d,   '', '',
3322         'comment',       'varchar', 'NULL', 2*$char_d, '', '',
3323         'disabled',      'char',    'NULL',  1, '', '',
3324         'classnum',      'int',     'NULL', '', '', '',
3325         'taxclass',      'varchar', 'NULL', $char_d, '', '',
3326         'taxproductnum', 'int',     'NULL', '', '', '',
3327         'pay_weight',    'real',    'NULL', '', '', '',
3328         'credit_weight', 'real',    'NULL', '', '', '',
3329         'agentnum',      'int',     'NULL', '', '', '',
3330         'amount',   @money_type,                '', '', 
3331         'percent',     'decimal',    '', '7,4', '', '',
3332         'basis',         'varchar',  '',    16, '', '',
3333         'minimum',    @money_typen,             '', '',
3334         'maximum',    @money_typen,             '', '',
3335         'limit_credit',  'char',    'NULL',  1, '', '',
3336         'setuprecur',    'char',     '',     5, '', '',
3337         'taxable',       'char',    'NULL',  1, '', '',
3338       ],
3339       'primary_key'  => 'feepart',
3340       'unique'       => [],
3341       'index'        => [ [ 'disabled' ], [ 'classnum' ], [ 'agentnum' ]
3342                         ],
3343       'foreign_keys' => [
3344                           { columns    => [ 'classnum' ],
3345                             table      => 'pkg_class',
3346                           },
3347                           { columns    => [ 'taxproductnum' ],
3348                             table      => 'part_pkg_taxproduct',
3349                           },
3350                           { columns    => [ 'agentnum' ],
3351                             table      => 'agent',
3352                           },
3353                         ],
3354     },
3355
3356     'part_fee_msgcat' => {
3357       'columns' => [
3358         'feepartmsgnum',  'serial',     '',        '', '', '',
3359         'feepart',           'int',     '',        '', '', '',
3360         'locale',        'varchar',     '',        16, '', '',
3361         'itemdesc',      'varchar',     '',   $char_d, '', '', #longer/no limit?
3362         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
3363       ],
3364       'primary_key'  => 'feepartmsgnum',
3365       'unique'       => [ [ 'feepart', 'locale' ] ],
3366       'index'        => [],
3367       'foreign_keys' => [
3368                           { columns    => [ 'feepart' ],
3369                             table      => 'part_fee',
3370                           },
3371                         ],
3372     },
3373
3374     'part_fee_usage' => {
3375       'columns' => [
3376         'feepartusagenum','serial',     '',        '', '', '',
3377         'feepart',           'int',     '',        '', '', '',
3378         'classnum',          'int',     '',        '', '', '',
3379         'amount',   @money_type,                '', '',
3380         'percent',     'decimal',    '', '7,4', '', '',
3381       ],
3382       'primary_key'  => 'feepartusagenum',
3383       'unique'       => [ [ 'feepart', 'classnum' ] ],
3384       'index'        => [],
3385       'foreign_keys' => [
3386                           { columns    => [ 'feepart' ],
3387                             table      => 'part_fee',
3388                           },
3389                           { columns    => [ 'classnum' ],
3390                             table      => 'usage_class',
3391                           },
3392                         ],
3393     },
3394
3395     'part_pkg_link' => {
3396       'columns' => [
3397         'pkglinknum',  'serial',   '',      '', '', '',
3398         'src_pkgpart', 'int',      '',      '', '', '',
3399         'dst_pkgpart', 'int',      '',      '', '', '', 
3400         'link_type',   'varchar',  '', $char_d, '', '',
3401         'hidden',      'char', 'NULL',       1, '', '',
3402       ],
3403       'primary_key'  => 'pkglinknum',
3404       'unique'       => [ ['src_pkgpart','dst_pkgpart','link_type','hidden'] ],
3405       'index'        => [ [ 'src_pkgpart' ] ],
3406       'foreign_keys' => [
3407                           { columns    => [ 'src_pkgpart' ],
3408                             table      => 'part_pkg',
3409                             references => [ 'pkgpart' ]
3410                           },
3411                           { columns    => [ 'dst_pkgpart' ],
3412                             table      => 'part_pkg',
3413                             references => [ 'pkgpart' ]
3414                           },
3415                         ],
3416     },
3417     # XXX somewhat borked unique: we don't really want a hidden and unhidden
3418     # it turns out we'd prefer to use svc, bill, and invisibill (or something)
3419
3420     'part_pkg_discount' => {
3421       'columns' => [
3422         'pkgdiscountnum', 'serial',   '',      '', '', '',
3423         'pkgpart',        'int',      '',      '', '', '',
3424         'discountnum',    'int',      '',      '', '', '', 
3425       ],
3426       'primary_key'  => 'pkgdiscountnum',
3427       'unique'       => [ [ 'pkgpart', 'discountnum' ] ],
3428       'index'        => [],
3429       'foreign_keys' => [
3430                           { columns    => [ 'pkgpart' ],
3431                             table      => 'part_pkg',
3432                           },
3433                           { columns    => [ 'discountnum' ],
3434                             table      => 'discount',
3435                           },
3436                         ],
3437     },
3438
3439     'part_pkg_taxclass' => {
3440       'columns' => [
3441         'taxclassnum',  'serial', '',       '', '', '',
3442         'taxclass',     'varchar', '', $char_d, '', '', 
3443         'disabled', 'char',   'NULL',         1, '', '', 
3444       ],
3445       'primary_key' => 'taxclassnum',
3446       'unique'      => [ [ 'taxclass' ] ],
3447       'index'       => [ [ 'disabled' ] ],
3448     },
3449
3450     'part_pkg_taxproduct' => {
3451       'columns' => [
3452         'taxproductnum', 'serial',      '',        '', '', '',
3453         'data_vendor',   'varchar', 'NULL',   $char_d, '', '', 
3454         'taxproduct',    'varchar',     '',   $char_d, '', '', 
3455         'description',   'varchar',     '', 3*$char_d, '', '', 
3456         'note',             'text', 'NULL',        '', '', '',
3457       ],
3458       'primary_key' => 'taxproductnum',
3459       'unique'      => [ [ 'data_vendor', 'taxproduct' ] ],
3460       'index'       => [],
3461     },
3462
3463     'part_pkg_taxrate' => { 
3464       'columns' => [
3465         'pkgtaxratenum', 'serial',  '',     '',      '', '',
3466         'data_vendor',   'varchar', 'NULL', $char_d, '', '', # update source
3467         'geocode',       'varchar', 'NULL', $char_d, '', '', # cch provides 10
3468         'taxproductnum', 'int',  '',     '',       '', '',          
3469         'city',             'varchar', 'NULL', $char_d, '', '', # tax_location?
3470         'county',           'varchar', 'NULL', $char_d, '', '', 
3471         'state',            'varchar', 'NULL', $char_d, '', '', 
3472         'local',            'varchar', 'NULL', $char_d, '', '', 
3473         'country',          'char',    'NULL', 2,       '', '',
3474         'taxclassnumtaxed', 'int',     'NULL', '',      '', '', 
3475         'taxcattaxed',      'varchar', 'NULL', $char_d, '', '', 
3476         'taxclassnum',      'int',     'NULL', '',      '', '', 
3477         'effdate',          @date_type, '', '', 
3478         'taxable',          'char',    'NULL', 1,       '', '', 
3479       ],
3480       'primary_key'  => 'pkgtaxratenum',
3481       'unique'       => [],
3482       'index'        => [ [ 'data_vendor', 'geocode', 'taxproductnum' ] ],
3483       'foreign_keys' => [
3484                           { columns    => [ 'taxproductnum' ],
3485                             table      => 'part_pkg_taxproduct',
3486                           },
3487                           { columns    => [ 'taxclassnumtaxed' ],
3488                             table      => 'tax_class',
3489                             references => [ 'taxclassnum' ],
3490                           },
3491                           { columns    => [ 'taxclassnum' ],
3492                             table      => 'tax_class',
3493                           },
3494                         ],
3495     },
3496
3497     'part_pkg_taxoverride' => { 
3498       'columns' => [
3499         'taxoverridenum', 'serial', '', '', '', '',
3500         'pkgpart',           'int', '', '', '', '',
3501         'taxclassnum',       'int', '', '', '', '',
3502         'usage_class',    'varchar', 'NULL', $char_d, '', '', 
3503       ],
3504       'primary_key'  => 'taxoverridenum',
3505       'unique'       => [],
3506       'index'        => [ [ 'pkgpart' ], [ 'taxclassnum' ] ],
3507       'foreign_keys' => [
3508                           { columns    => [ 'pkgpart' ],
3509                             table      => 'part_pkg',
3510                           },
3511                           { columns    => [ 'taxclassnum' ],
3512                             table      => 'tax_class',
3513                           },
3514                         ],
3515     },
3516
3517 #    'part_title' => {
3518 #      'columns' => [
3519 #        'titlenum',   'int',    '',   '',
3520 #        'title',      'varchar',   '',   $char_d,
3521 #      ],
3522 #      'primary_key' => 'titlenum',
3523 #      'unique' => [ [] ],
3524 #      'index' => [ [] ],
3525 #    },
3526
3527     'pkg_svc' => {
3528       'columns' => [
3529         'pkgsvcnum',   'serial',    '', '', '', '', 
3530         'pkgpart',        'int',    '', '', '', '', 
3531         'svcpart',        'int',    '', '', '', '', 
3532         'quantity',       'int',    '', '', '', '', 
3533         'primary_svc',   'char', 'NULL', 1, '', '', 
3534         'hidden',        'char', 'NULL', 1, '', '',
3535         'bulk_skip',     'char', 'NULL', 1, '', '',
3536       ],
3537       'primary_key'  => 'pkgsvcnum',
3538       'unique'       => [ ['pkgpart', 'svcpart'] ],
3539       'index'        => [ ['pkgpart'], ['quantity'] ],
3540       'foreign_keys' => [
3541                           { columns    => [ 'pkgpart' ],
3542                             table      => 'part_pkg',
3543                           },
3544                           { columns    => [ 'svcpart' ],
3545                             table      => 'part_svc',
3546                           },
3547                         ],
3548     },
3549
3550     'part_referral' => {
3551       'columns' => [
3552         'refnum',   'serial',     '',        '', '', '', 
3553         'referral', 'varchar',    '',   $char_d, '', '', 
3554         'disabled', 'char',   'NULL',         1, '', '', 
3555         'agentnum', 'int',    'NULL',        '', '', '', 
3556       ],
3557       'primary_key'  => 'refnum',
3558       'unique'       => [],
3559       'index'        => [ ['disabled'], ['agentnum'], ],
3560       'foreign_keys' => [
3561                           { columns    => [ 'agentnum' ],
3562                             table      => 'agent',
3563                           },
3564                         ],
3565     },
3566
3567     'part_svc' => {
3568       'columns' => [
3569         'svcpart',             'serial',     '',        '', '', '', 
3570         'svc',                'varchar',     '',   $char_d, '', '', 
3571         'svcdb',              'varchar',     '',   $char_d, '', '', 
3572         'disabled',              'char', 'NULL',         1, '', '', 
3573         'preserve',              'char', 'NULL',         1, '', '',
3574         'selfservice_access', 'varchar', 'NULL',   $char_d, '', '',
3575         'classnum',               'int', 'NULL',        '', '', '',
3576         'restrict_edit_password','char', 'NULL',         1, '', '',
3577         'has_router',            'char', 'NULL',         1, '', '',
3578 ],
3579       'primary_key'  => 'svcpart',
3580       'unique'       => [],
3581       'index'        => [ [ 'disabled' ] ],
3582       'foreign_keys' => [
3583                           { columns    => [ 'classnum' ],
3584                             table      => 'part_svc_class',
3585                           },
3586                         ],
3587     },
3588
3589     'part_svc_column' => {
3590       'columns' => [
3591         'columnnum',   'serial',      '',      '', '', '', 
3592         'svcpart',     'int',         '',      '', '', '', 
3593         'columnname',  'varchar',     '',      64, '', '', 
3594         'columnlabel', 'varchar', 'NULL', $char_d, '', '',
3595         'columnvalue', 'varchar', 'NULL',     512, '', '', 
3596         'columnflag',  'char',    'NULL',       1, '', '', 
3597       ],
3598       'primary_key'  => 'columnnum',
3599       'unique'       => [ [ 'svcpart', 'columnname' ] ],
3600       'index'        => [ [ 'svcpart' ] ],
3601       'foreign_keys' => [
3602                           { columns    => [ 'svcpart' ],
3603                             table      => 'part_svc',
3604                           },
3605                         ],
3606     },
3607
3608     'part_svc_class' => {
3609       'columns' => [
3610         'classnum',    'serial',   '',      '', '', '', 
3611         'classname',   'varchar',  '', $char_d, '', '', 
3612         'disabled',    'char', 'NULL',       1, '', '', 
3613       ],
3614       'primary_key' => 'classnum',
3615       'unique' => [],
3616       'index' => [ ['disabled'] ],
3617     },
3618
3619     #(this should be renamed to part_pop)
3620     'svc_acct_pop' => {
3621       'columns' => [
3622         'popnum',    'serial',    '',   '', '', '', 
3623         'city',      'varchar',   '',   $char_d, '', '', 
3624         'state',     'varchar',   '',   $char_d, '', '', 
3625         'ac',        'char',   '',   3, '', '', 
3626         'exch',      'char',   '',   3, '', '', 
3627         'loc',       'char',   'NULL',   4, '', '', #NULL for legacy purposes
3628       ],
3629       'primary_key' => 'popnum',
3630       'unique' => [],
3631       'index' => [ [ 'state' ] ],
3632     },
3633
3634     'part_pop_local' => {
3635       'columns' => [
3636         'localnum',  'serial',     '',     '', '', '', 
3637         'popnum',    'int',     '',     '', '', '', 
3638         'city',      'varchar', 'NULL', $char_d, '', '', 
3639         'state',     'char',    'NULL', 2, '', '', 
3640         'npa',       'char',    '',     3, '', '', 
3641         'nxx',       'char',    '',     3, '', '', 
3642       ],
3643       'primary_key'  => 'localnum',
3644       'unique'       => [],
3645       'index'        => [ [ 'npa', 'nxx' ], [ 'popnum' ] ],
3646       'foreign_keys' => [
3647                          { columns    => [ 'popnum' ],
3648                            table      => 'svc_acct_pop',
3649                          },
3650                        ],
3651     },
3652
3653     'qual' => {
3654       'columns' => [
3655         'qualnum',  'serial',     '',     '', '', '', 
3656         'custnum',    'int',     'NULL',     '', '', '',
3657         'prospectnum',    'int',     'NULL',     '', '', '',
3658         'locationnum',    'int',     'NULL',     '', '', '',
3659         'phonenum',     'varchar', 'NULL',       24, '', '',
3660         'exportnum',      'int', 'NULL', '', '', '', 
3661         'vendor_qual_id',      'varchar', 'NULL', $char_d, '', '', 
3662         'status',      'char', '', 1, '', '', 
3663       ],
3664       'primary_key'  => 'qualnum',
3665       'unique'       => [],
3666       'index'        => [ ['locationnum'], ['custnum'], ['prospectnum'],
3667                           ['phonenum'], ['vendor_qual_id'],
3668                         ],
3669       'foreign_keys' => [
3670                           { columns    => [ 'custnum' ],
3671                             table      => 'cust_main',
3672                           },
3673                           { columns    => [ 'prospectnum' ],
3674                             table      => 'prospect_main',
3675                           },
3676                           { columns    => [ 'locationnum' ],
3677                             table      => 'cust_location',
3678                           },
3679                           { columns    => [ 'exportnum' ],
3680                             table      => 'part_export',
3681                           },
3682                         ],
3683     },
3684
3685     'qual_option' => {
3686       'columns' => [
3687         'optionnum', 'serial', '', '', '', '', 
3688         'qualnum',  'int',     '',     '', '', '', 
3689         'optionname', 'varchar', '', $char_d, '', '', 
3690         'optionvalue', 'text', 'NULL', '', '', '', 
3691       ],
3692       'primary_key'  => 'optionnum',
3693       'unique'       => [],
3694       'index'        => [],
3695       'foreign_keys' => [
3696                           { columns    => [ 'qualnum' ],
3697                             table      => 'qual',
3698                           },
3699                         ],
3700     },
3701
3702     'svc_acct' => {
3703       'columns' => [
3704         'svcnum',    'int',    '',   '', '', '', 
3705         'username',  'varchar',   '',   $username_len, '', '',
3706         '_password', 'varchar',   'NULL',  512, '', '',
3707         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
3708         'sec_phrase', 'varchar',  'NULL',   $char_d, '', '', 
3709         'popnum',    'int',    'NULL',   '', '', '', 
3710         'sectornum', 'int', 'NULL',      '', '', '',
3711         'uid',       'int', 'NULL',   '', '', '', 
3712         'gid',       'int', 'NULL',   '', '', '', 
3713         'finger',    'varchar',   'NULL',   2*$char_d, '', '', 
3714         'dir',       'varchar',   'NULL',   $char_d, '', '', 
3715         'shell',     'varchar',   'NULL',   $char_d, '', '', 
3716         'quota',     'varchar',   'NULL',   $char_d, '', '', 
3717         'slipip',    'varchar',   'NULL',   15, '', '', #four TINYINTs, bah.
3718         # IP address mgmt
3719         'routernum', 'int', 'NULL',      '', '', '',
3720         'blocknum',  'int', 'NULL',      '', '', '', 
3721         'seconds',   'int', 'NULL',   '', '', '', #uhhhh
3722         'seconds_threshold',   'int', 'NULL',   '', '', '',
3723         'upbytes',   'bigint', 'NULL',   '', '', '', 
3724         'upbytes_threshold',   'bigint', 'NULL',   '', '', '',
3725         'downbytes', 'bigint', 'NULL',   '', '', '',
3726         'downbytes_threshold',   'bigint', 'NULL',   '', '', '',
3727         'totalbytes','bigint', 'NULL',   '', '', '',
3728         'totalbytes_threshold',   'bigint', 'NULL',   '', '', '',
3729         'domsvc',    'int',     '', '', '', '', 
3730         'pbxsvc',    'int', 'NULL', '', '', '',
3731         'last_login',  @date_type, '', '', 
3732         'last_logout', @date_type, '', '', 
3733         #cardfortress field(s)
3734         'cf_privatekey',      'text', 'NULL',      '', '', '',
3735         #communigate pro fields (quota = MaxAccountSize)
3736         'cgp_aliases',     'varchar', 'NULL',     255, '', '',
3737         #settings
3738         'cgp_type',        'varchar', 'NULL', $char_d, '', '', #AccountType
3739         'file_quota',      'varchar', 'NULL', $char_d, '', '', #MaxWebSize
3740         'file_maxnum',     'varchar', 'NULL', $char_d, '', '', #MaxWebFiles
3741         'file_maxsize',    'varchar', 'NULL', $char_d, '', '', #MaxFileSize
3742         'cgp_accessmodes', 'varchar', 'NULL',     255, '', '', #AccessModes
3743         'password_selfchange','char', 'NULL',       1, '', '', #PWDAllowed
3744         'password_recover',   'char', 'NULL',       1, 'Y','', #PasswordRecovery
3745         'cgp_rulesallowed','varchar', 'NULL', $char_d, '', '', #RulesAllowed
3746         'cgp_rpopallowed',    'char', 'NULL',       1, '', '', #RPOPAllowed
3747         'cgp_mailtoall',      'char', 'NULL',       1, '', '', #MailToAll
3748         'cgp_addmailtrailer', 'char', 'NULL',       1, '', '', #AddMailTrailer
3749         'cgp_archiveafter',    'int', 'NULL',      '', '', '', #ArchiveMessagesAfter
3750         #XXX mailing lists
3751         #preferences
3752         'cgp_deletemode',     'varchar', 'NULL', $char_d, '', '',#DeleteMode
3753         'cgp_emptytrash',     'varchar', 'NULL', $char_d, '', '',#EmptyTrash
3754         'cgp_language',       'varchar', 'NULL', $char_d, '', '',#Language
3755         'cgp_timezone',       'varchar', 'NULL', $char_d, '', '',#TimeZone
3756         'cgp_skinname',       'varchar', 'NULL', $char_d, '', '',#SkinName
3757         'cgp_prontoskinname', 'varchar', 'NULL', $char_d, '', '',#ProntoSkinName
3758         'cgp_sendmdnmode',    'varchar', 'NULL', $char_d, '', '',#SendMDNMode
3759         #mail
3760         #XXX RPOP settings
3761         #
3762       ],
3763       'primary_key'  => 'svcnum',
3764       #'unique'       => [ [ 'username', 'domsvc' ] ],
3765       'unique'       => [],
3766       'index'        => [ ['username'], ['domsvc'], ['pbxsvc'] ],
3767       'foreign_keys' => [
3768                           { columns    => [ 'svcnum' ],
3769                             table      => 'cust_svc',
3770                           },
3771                           { columns    => [ 'popnum' ],
3772                             table      => 'svc_acct_pop',
3773                           },
3774                           { columns    => [ 'sectornum' ],
3775                             table      => 'tower_sector',
3776                           },
3777                           { columns    => [ 'routernum' ],
3778                             table      => 'router',
3779                           },
3780                           { columns    => [ 'blocknum' ],
3781                             table      => 'addr_block',
3782                           },
3783                           { columns    => [ 'domsvc' ],
3784                             table      => 'svc_domain', #'cust_svc',
3785                             references => [ 'svcnum' ],
3786                           },
3787                           { columns    => [ 'pbxsvc' ],
3788                             table      => 'svc_pbx', #'cust_svc',
3789                             references => [ 'svcnum' ],
3790                           },
3791                         ],
3792     },
3793
3794     'acct_rt_transaction' => {
3795       'columns' => [
3796         'svcrtid',   'int',    '',   '', '', '', #why am i not a serial
3797         'svcnum',    'int',    '',   '', '', '', 
3798         'transaction_id',       'int', '',   '', '', '', 
3799         '_date',   @date_type, '', '',
3800         'seconds',   'int', '',   '', '', '', #uhhhh
3801         'support',   'int', '',   '', '', '',
3802       ],
3803       'primary_key'  => 'svcrtid',
3804       'unique'       => [],
3805       'index'        => [ ['svcnum', 'transaction_id'] ],
3806       'foreign_keys' => [
3807                           { columns    => [ 'svcnum' ],
3808                             table      => 'svc_acct', #'cust_svc',
3809                           },
3810                           # 1. RT tables aren't part of our data structure, so
3811                           #     we can't make sure Queue is created already
3812                           # 2. This is our internal hack for time tracking, not
3813                           #     a user-facing feature
3814                           #{ columns    => [ 'transaction_id' ],
3815                           #  table      => 'Transaction',
3816                           #  references => [ 'id' ],
3817                           #},
3818                         ],
3819     },
3820
3821     #'svc_charge' => {
3822     #  'columns' => [
3823     #    'svcnum',    'int',    '',   '',
3824     #    'amount',    @money_type,
3825     #  ],
3826     #  'primary_key' => 'svcnum',
3827     #  'unique' => [ [] ],
3828     #  'index' => [ [] ],
3829     #},
3830
3831     'svc_domain' => {
3832       'columns' => [
3833         'svcnum',           'int',    '',        '', '', '',
3834         'domain',       'varchar',    '',   $char_d, '', '',
3835         'suffix',       'varchar', 'NULL',  $char_d, '', '',
3836         'catchall',         'int', 'NULL',       '', '', '',
3837         'parent_svcnum',    'int', 'NULL',       '', '', '',
3838         'quota',        'varchar', 'NULL',  $char_d, '', '', 
3839
3840         #registration info
3841         'registrarnum',     'int', 'NULL',       '', '', '',
3842         'registrarkey', 'varchar', 'NULL',      512, '', '',
3843         'setup_date',      @date_type, '', '',
3844         'renewal_interval', 'int', 'NULL',       '', '', '',
3845         'expiration_date', @date_type, '', '',
3846
3847         #some weird shit australia-specific shit?  yuck.. seems totally unused
3848         'au_registrant_name',       'varchar', 'NULL',  $char_d, '', '',
3849         'au_eligibility_type',      'varchar', 'NULL',  $char_d, '', '',
3850
3851         #communigate pro fields (quota = MaxAccountSize)
3852         'max_accounts',     'int', 'NULL',       '', '', '',
3853         'trailer',         'text', 'NULL',       '', '', '',
3854         'cgp_aliases',  'varchar', 'NULL',      255, '', '',
3855         'cgp_accessmodes','varchar','NULL',     255, '', '', #DomainAccessModes
3856         'cgp_certificatetype','varchar','NULL', $char_d, '', '',
3857
3858         #(account default) settings
3859         'acct_def_password_selfchange',   'char', 'NULL',       1,  '', '', 
3860         'acct_def_password_recover',      'char', 'NULL',       1, 'Y', '', 
3861         'acct_def_cgp_accessmodes',    'varchar', 'NULL',     255,  '', '',
3862         'acct_def_quota',              'varchar', 'NULL', $char_d,  '', '',
3863         'acct_def_file_quota',         'varchar', 'NULL', $char_d,  '', '',
3864         'acct_def_file_maxnum',        'varchar', 'NULL', $char_d,  '', '',
3865         'acct_def_file_maxsize',       'varchar', 'NULL', $char_d,  '', '',
3866         'acct_def_cgp_rulesallowed',   'varchar', 'NULL', $char_d,  '', '',
3867         'acct_def_cgp_rpopallowed',       'char', 'NULL',       1,  '', '', 
3868         'acct_def_cgp_mailtoall',         'char', 'NULL',       1,  '', '', 
3869         'acct_def_cgp_addmailtrailer',    'char', 'NULL',       1,  '', '', 
3870         'acct_def_cgp_archiveafter',       'int', 'NULL',      '',  '', '',
3871
3872         #(account default) preferences
3873         'acct_def_cgp_deletemode',     'varchar', 'NULL', $char_d,  '', '',
3874         'acct_def_cgp_emptytrash',     'varchar', 'NULL', $char_d,  '', '',
3875         'acct_def_cgp_language',       'varchar', 'NULL', $char_d,  '', '',
3876         'acct_def_cgp_timezone',       'varchar', 'NULL', $char_d,  '', '',
3877         'acct_def_cgp_skinname',       'varchar', 'NULL', $char_d,  '', '',
3878         'acct_def_cgp_prontoskinname', 'varchar', 'NULL', $char_d,  '', '',
3879         'acct_def_cgp_sendmdnmode',    'varchar', 'NULL', $char_d,  '', '',
3880       ],
3881       'primary_key'  => 'svcnum',
3882       'unique'       => [],
3883       'index'        => [ ['domain'] ],
3884       'foreign_keys' => [
3885                           { columns    => [ 'svcnum' ],
3886                             table      => 'cust_svc',
3887                           },
3888                           { columns    => [ 'catchall' ],
3889                             table      => 'svc_acct',
3890                             references => [ 'svcnum' ],
3891                           },
3892                           { columns    => [ 'parent_svcnum' ],
3893                             table      => 'cust_svc',
3894                             references => [ 'svcnum' ],
3895                           },
3896                           { columns    => [ 'registrarnum' ],
3897                             table      => 'registrar',
3898                           },
3899                         ],
3900     },
3901
3902     'svc_dsl' => {
3903       'columns' => [
3904         'svcnum',                    'int',    '',        '', '', '',
3905         'pushed',                    'int', 'NULL',       '', '', '',
3906         'desired_due_date',          'int', 'NULL',       '', '', '',
3907         'due_date',                  'int', 'NULL',       '', '', '',
3908         'vendor_order_id',       'varchar', 'NULL', $char_d,  '', '',
3909         'vendor_qual_id',        'varchar', 'NULL', $char_d,  '', '',
3910         'vendor_order_type',     'varchar', 'NULL', $char_d,  '', '',
3911         'vendor_order_status',   'varchar', 'NULL', $char_d,  '', '',
3912         'first',                 'varchar', 'NULL', $char_d,  '', '',
3913         'last',                  'varchar', 'NULL', $char_d,  '', '',
3914         'company',               'varchar', 'NULL', $char_d,  '', '',
3915         'phonenum',              'varchar', 'NULL',      24, '', '',
3916         'gateway_access_number', 'varchar', 'NULL',      24, '', '',
3917         'loop_type',                'char', 'NULL',       1, '', '', 
3918         'local_voice_provider',  'varchar', 'NULL', $char_d, '', '',
3919         'circuitnum',            'varchar', 'NULL', $char_d, '', '',
3920         'rate_band',             'varchar', 'NULL', $char_d, '', '',
3921         'vpi',                       'int', 'NULL',      '', '', '',
3922         'vci',                       'int', 'NULL',      '', '', '',
3923         'isp_chg',                  'char', 'NULL',       1, '', '', 
3924         'isp_prev',              'varchar', 'NULL', $char_d, '', '',
3925         'username',              'varchar', 'NULL', $char_d, '', '',
3926         'password',              'varchar', 'NULL', $char_d, '', '',
3927         'staticips',                'text', 'NULL',      '', '', '',
3928         'monitored',                'char', 'NULL',       1, '', '', 
3929         'last_pull',                 'int', 'NULL',      '', '', '',
3930       ],
3931       'primary_key'  => 'svcnum',
3932       'unique'       => [ ],
3933       'index'        => [ ['phonenum'], ['vendor_order_id'] ],
3934       'foreign_keys' => [
3935                           { columns    => [ 'svcnum' ],
3936                             table      => 'cust_svc',
3937                           },
3938                         ],
3939     },
3940
3941     'dsl_device' => {
3942       'columns' => [
3943         'devicenum', 'serial',     '', '', '', '',
3944         #part_device?  or our own part_dsl_device?
3945         #'devicepart',   'int',     '', '', '', '',
3946         'svcnum',       'int',     '', '', '', '', 
3947         'mac_addr', 'varchar',     '', 12, '', '', 
3948       ],
3949       'primary_key'  => 'devicenum',
3950       'unique'       => [ [ 'mac_addr' ], ],
3951       'index'        => [ [ 'svcnum' ], ], # [ 'devicepart' ] ],
3952       'foreign_keys' => [
3953                           { columns    => [ 'svcnum' ],
3954                             table      => 'svc_dsl',
3955                           },
3956                         ],
3957     },
3958
3959     'dsl_note' => {
3960       'columns' => [
3961         'notenum',           'serial',    '',        '', '', '',
3962         'svcnum',     'int', '',       '', '', '',
3963         'author',     'varchar', 'NULL', $char_d,  '', '',
3964         'priority',   'char', 'NULL',       1,  '', '', 
3965         '_date',     'int', 'NULL',       '', '', '',
3966         'note',     'text', '',       '', '', '',
3967       ],
3968       'primary_key'  => 'notenum',
3969       'unique'       => [],
3970       'index'        => [ ['svcnum'] ],
3971       'foreign_keys' => [
3972                           { columns    => [ 'svcnum' ],
3973                             table      => 'svc_dsl',
3974                           },
3975                         ],
3976     },
3977
3978     'svc_dish' => {
3979       'columns' => [
3980         'svcnum',   'int',     '',     '', '', '',
3981         'acctnum',  'varchar', '',     16, '', '',
3982         'installdate', @date_type,         '', '', 
3983         'note',     'text',    'NULL', '', '', '',
3984       ],
3985       'primary_key'  => 'svcnum',
3986       'unique'       => [],
3987       'index'        => [],
3988       'foreign_keys' => [
3989                           { columns    => [ 'svcnum' ],
3990                             table      => 'cust_svc',
3991                           },
3992                         ],
3993     },
3994
3995     'svc_hardware' => {
3996       'columns' => [
3997         'svcnum',   'int',     '',          '', '', '',
3998         'typenum',  'int',     '',          '', '', '',
3999         'serial',   'varchar', 'NULL', $char_d, '', '',
4000         'ip_addr',  'varchar', 'NULL',      40, '', '',
4001         'hw_addr',  'varchar', 'NULL',      12, '', '',
4002         'smartcard','varchar', 'NULL',      30, '', '',
4003         'statusnum','int',     'NULL',      '', '', '',
4004         'note',     'text',    'NULL',      '', '', '',
4005       ],
4006       'primary_key'  => 'svcnum',
4007       'unique'       => [],
4008       'index'        => [],
4009       'foreign_keys' => [
4010                           { columns    => [ 'svcnum' ],
4011                             table      => 'cust_svc',
4012                           },
4013                           { columns    => [ 'typenum' ],
4014                             table      => 'hardware_type',
4015                           },
4016                           { columns    => [ 'statusnum' ],
4017                             table      => 'hardware_status',
4018                           },
4019                         ],
4020     },
4021
4022     'hardware_class' => {
4023       'columns' => [
4024         'classnum',   'serial', '',      '', '', '',
4025         'classname', 'varchar', '', $char_d, '', '',
4026       ],
4027       'primary_key' => 'classnum',
4028       'unique' => [],
4029       'index'  => [],
4030     },
4031
4032     'hardware_type' => {
4033       'columns' => [
4034         'typenum',  'serial',     '',      '', '', '',
4035         'classnum',    'int',     '',      '', '', '',
4036         'model',   'varchar',     '', $char_d, '', '',
4037         'revision','varchar', 'NULL', $char_d, '', '',
4038       ],
4039       'primary_key'  => 'typenum',
4040       'unique'       => [ [ 'classnum', 'model', 'revision' ] ],
4041       'index'        => [],
4042       'foreign_keys' => [
4043                           { columns    => [ 'classnum' ],
4044                             table      => 'hardware_class',
4045                           },
4046                         ],
4047     },
4048
4049     'hardware_status' => {
4050       'columns' => [
4051         'statusnum', 'serial', '',      '', '', '',
4052         'label'    ,'varchar', '', $char_d, '', '',
4053         'disabled',    'char', 'NULL',   1, '', '', 
4054       ],
4055       'primary_key' => 'statusnum',
4056       'unique' => [],
4057       'index'  => [],
4058     },
4059
4060     'domain_record' => {
4061       'columns' => [
4062         'recnum',    'serial',     '',  '', '', '', 
4063         'svcnum',    'int',     '',  '', '', '', 
4064         'reczone',   'varchar', '',  255, '', '', 
4065         'recaf',     'char',    '',  2, '', '', 
4066         'rectype',   'varchar',    '',  5, '', '', 
4067         'recdata',   'varchar', '',  255, '', '', 
4068         'ttl',       'int',     'NULL', '', '', '',
4069       ],
4070       'primary_key'  => 'recnum',
4071       'unique'       => [],
4072       'index'        => [ ['svcnum'] ],
4073       'foreign_keys' => [
4074                           { columns    => [ 'svcnum' ],
4075                             table      => 'svc_domain',
4076                           },
4077                         ],
4078     },
4079
4080     'registrar' => {
4081       'columns' => [
4082         'registrarnum',   'serial', '',      '', '', '',
4083         'registrarname', 'varchar', '', $char_d, '', '',
4084       ],
4085       'primary_key' => 'registrarnum',
4086       'unique'      => [],
4087       'index'       => [],
4088     },
4089
4090     'cgp_rule' => {
4091       'columns' => [
4092         'rulenum',  'serial',     '',      '', '', '',
4093         'name',    'varchar',     '', $char_d, '', '',
4094         'comment', 'varchar', 'NULL', $char_d, '', '',
4095         'svcnum',      'int',     '',      '', '', '',
4096         'priority',    'int',     '',      '', '', '',
4097       ],
4098       'primary_key' => 'rulenum',
4099       'unique'      => [ [ 'svcnum', 'name' ] ],
4100       'index'       => [ [ 'svcnum' ] ],
4101       'foreign_keys' => [
4102                           { columns    => [ 'svcnum' ],
4103                             table      => 'cust_svc', #svc_acct / svc_domain
4104                           },
4105                         ],
4106     },
4107
4108     'cgp_rule_condition' => {
4109       'columns' => [
4110         'ruleconditionnum',  'serial',     '',      '', '', '',
4111         'conditionname',    'varchar',     '', $char_d, '', '',
4112         'op',               'varchar', 'NULL', $char_d, '', '',
4113         'params',           'varchar', 'NULL',     255, '', '',
4114         'rulenum',              'int',     '',      '', '', '',
4115       ],
4116       'primary_key'  => 'ruleconditionnum',
4117       'unique'       => [],
4118       'index'        => [ [ 'rulenum' ] ],
4119       'foreign_keys' => [
4120                           { columns    => [ 'rulenum' ],
4121                             table      => 'cgp_rule',
4122                           },
4123                         ],
4124     },
4125
4126     'cgp_rule_action' => {
4127        'columns' => [
4128         'ruleactionnum',  'serial',     '',      '', '', '',
4129         'action',        'varchar',     '', $char_d, '', '',
4130         'params',        'varchar', 'NULL',     255, '', '',
4131         'rulenum',           'int',     '',      '', '', '',
4132       ],
4133       'primary_key'  => 'ruleactionnum',
4134       'unique'       => [],
4135       'index'        => [ [ 'rulenum' ] ],
4136       'foreign_keys' => [
4137                           { columns    => [ 'rulenum' ],
4138                             table      => 'cgp_rule',
4139                           },
4140                         ],
4141    },
4142
4143     'svc_forward' => {
4144       'columns' => [
4145         'svcnum',   'int',            '',   '', '', '', 
4146         'srcsvc',   'int',        'NULL',   '', '', '', 
4147         'src',      'varchar',    'NULL',  255, '', '', 
4148         'dstsvc',   'int',        'NULL',   '', '', '', 
4149         'dst',      'varchar',    'NULL',  255, '', '', 
4150       ],
4151       'primary_key'  => 'svcnum',
4152       'unique'       => [],
4153       'index'        => [ ['srcsvc'], ['dstsvc'] ],
4154       'foreign_keys' => [
4155                           { columns    => [ 'svcnum' ],
4156                             table      => 'cust_svc',
4157                           },
4158                           { columns    => [ 'srcsvc' ],
4159                             table      => 'svc_acct',
4160                             references => [ 'svcnum' ]
4161                           },
4162                           { columns    => [ 'dstsvc' ],
4163                             table      => 'svc_acct',
4164                             references => [ 'svcnum' ]
4165                           },
4166                         ],
4167     },
4168
4169     'svc_www' => {
4170       'columns' => [
4171         'svcnum',   'int',      '',  '', '', '', 
4172         'recnum',   'int',      '',  '', '', '', 
4173         'usersvc',  'int',  'NULL',  '', '', '', 
4174         'config',   'text', 'NULL',  '', '', '', 
4175       ],
4176       'primary_key' => 'svcnum',
4177       'unique'      => [],
4178       'index'       => [],
4179       'foreign_keys' => [
4180                           { columns    => [ 'svcnum' ],
4181                             table      => 'cust_svc',
4182                           },
4183                           { columns    => [ 'recnum' ],
4184                             table      => 'domain_record',
4185                           },
4186                           { columns    => [ 'usersvc' ],
4187                             table      => 'svc_acct',
4188                             references => [ 'svcnum' ]
4189                           },
4190                         ],
4191     },
4192
4193     #'svc_wo' => {
4194     #  'columns' => [
4195     #    'svcnum',    'int',    '',   '',
4196     #    'svcnum',    'int',    '',   '',
4197     #    'svcnum',    'int',    '',   '',
4198     #    'worker',    'varchar',   '',   $char_d,
4199     #    '_date',     @date_type,
4200     #  ],
4201     #  'primary_key' => 'svcnum',
4202     #  'unique' => [ [] ],
4203     #  'index' => [ [] ],
4204     #},
4205
4206     'prepay_credit' => {
4207       'columns' => [
4208         'prepaynum',   'serial',     '',   '', '', '', 
4209         'identifier',  'varchar', '', $char_d, '', '', 
4210         'amount',      @money_type, '', '', 
4211         'seconds',     'int',     'NULL', '', '', '', 
4212         'upbytes',     'bigint',     'NULL', '', '', '', 
4213         'downbytes',   'bigint',     'NULL', '', '', '', 
4214         'totalbytes',  'bigint',     'NULL', '', '', '', 
4215         'agentnum',    'int',     'NULL', '', '', '', 
4216       ],
4217       'primary_key'  => 'prepaynum',
4218       'unique'       => [ ['identifier'] ],
4219       'index'        => [ ['agentnum'] ],
4220       'foreign_keys' => [
4221                           { columns    => [ 'agentnum' ],
4222                             table      => 'agent',
4223                           },
4224                         ],
4225     },
4226
4227     'port' => {
4228       'columns' => [
4229         'portnum',  'serial',     '',   '', '', '', 
4230         'ip',       'varchar', 'NULL', 15, '', '', 
4231         'nasport',  'int',     'NULL', '', '', '', 
4232         'nasnum',   'int',     '',   '', '', '', 
4233       ],
4234       'primary_key'  => 'portnum',
4235       'unique'       => [],
4236       'index'        => [],
4237       'foreign_keys' => [
4238                           { columns    => [ 'nasnum' ],
4239                             table      => 'nas',
4240                           },
4241                         ],
4242     },
4243
4244     'nas' => {
4245       'columns' => [
4246         'nasnum',       'serial',     '',  '',              '', '', 
4247         'nasname',     'varchar',     '', 128,              '', '',
4248         'shortname',   'varchar', 'NULL',  32,              '', '',
4249         'type',        'varchar',     '',  30,         'other', '',
4250         'ports',           'int', 'NULL',  '',              '', '',
4251         'secret',      'varchar',     '',  60,        'secret', '',
4252         'server',      'varchar', 'NULL',  64,              '', '',
4253         'community',   'varchar', 'NULL',  50,              '', '',
4254         'description', 'varchar',     '', 200, 'RADIUS Client', '',
4255         'svcnum',          'int', 'NULL',  '',              '', '',
4256       ],
4257       'primary_key'  => 'nasnum',
4258       'unique'       => [ [ 'nasname' ], ],
4259       'index'        => [],
4260       'foreign_keys' => [
4261                           { columns    => [ 'svcnum' ],
4262                             table      => 'svc_broadband',#no? could be _acct?
4263                                                           #remove or cust_svc?
4264                           },
4265                         ],
4266     },
4267
4268     'export_nas' => {
4269       'columns' => [
4270         'exportnasnum', 'serial', '', '', '', '', 
4271         'exportnum',       'int', '', '', '', '', 
4272         'nasnum',          'int', '', '', '', '', 
4273       ],
4274       'primary_key'  => 'exportnasnum',
4275       'unique'       => [ [ 'exportnum', 'nasnum' ] ],
4276       'index'        => [ [ 'exportnum' ], [ 'nasnum' ] ],
4277       'foreign_keys' => [
4278                           { columns    => [ 'exportnum' ],
4279                             table      => 'part_export',
4280                           },
4281                           { columns    => [ 'nasnum' ],
4282                             table      => 'nas',
4283                           },
4284                         ],
4285     },
4286
4287     'queue' => {
4288       'columns' => [
4289         'jobnum',   'bigserial',     '',      '', '', '', 
4290         'job',        'varchar',     '',     512, '', '', 
4291         '_date',          'int',     '',      '', '', '', 
4292         'status',     'varchar',     '', $char_d, '', '', 
4293         'statustext',    'text', 'NULL',      '', '', '', 
4294         'svcnum',         'int', 'NULL',      '', '', '', 
4295         'custnum',        'int', 'NULL',      '', '', '',
4296         'secure',        'char', 'NULL',       1, '', '',
4297         'priority',       'int', 'NULL',      '', '', '',
4298       ],
4299       'primary_key'  => 'jobnum',
4300       'unique'       => [],
4301       'index'        => [ [ 'secure' ], [ 'priority' ],
4302                           [ 'job' ], [ 'svcnum' ], [ 'custnum' ], [ 'status' ],
4303                         ],
4304       'foreign_keys' => [
4305 #                          { columns    => [ 'svcnum' ],
4306 #                            table      => 'cust_svc',
4307 #                          },
4308                           { columns    => [ 'custnum' ],
4309                             table      => 'cust_main',
4310                           },
4311                         ],
4312     },
4313
4314     'queue_arg' => {
4315       'columns' => [
4316         'argnum', 'bigserial',     '', '', '', '', 
4317         'jobnum',    'bigint',     '', '', '', '', 
4318         'frozen',      'char', 'NULL',  1, '', '',
4319         'arg',         'text', 'NULL', '', '', '', 
4320       ],
4321       'primary_key'  => 'argnum',
4322       'unique'       => [],
4323       'index'        => [ [ 'jobnum' ] ],
4324       'foreign_keys' => [
4325                           { columns    => [ 'jobnum' ],
4326                             table      => 'queue',
4327                             on_delete  => 'CASCADE',
4328                           },
4329                         ],
4330     },
4331
4332     'queue_depend' => {
4333       'columns' => [
4334         'dependnum',  'bigserial', '', '', '', '', 
4335         'jobnum',        'bigint', '', '', '', '', 
4336         'depend_jobnum', 'bigint', '', '', '', '', 
4337       ],
4338       'primary_key'  => 'dependnum',
4339       'unique'       => [],
4340       'index'        => [ [ 'jobnum' ], [ 'depend_jobnum' ] ],
4341       'foreign_keys' => [
4342                           { columns    => [ 'jobnum' ],
4343                             table      => 'queue',
4344                           },
4345                           { columns    => [ 'depend_jobnum' ],
4346                             table      => 'queue',
4347                             references => [ 'jobnum' ],
4348                             on_delete  => 'CASCADE',
4349                           },
4350                         ],
4351     },
4352
4353     'queue_stat' => {
4354       'columns' => [
4355         'statnum', 'bigserial',     '',  '', '', '',
4356         'jobnum',     'bigint',     '',  '', '', '',
4357         'job',       'varchar',     '', 512, '', '', 
4358         'custnum',       'int', 'NULL',  '', '', '',
4359         'insert_date', @date_type, '', '',
4360         'start_date',  @date_type, '', '', 
4361         'end_date',    @date_type, '', '', 
4362       ],
4363       'primary_key'  => 'statnum',
4364       'unique'       => [], #[ ['jobnum'] ],
4365       'index'        => [],
4366     },
4367
4368     'export_svc' => {
4369       'columns' => [
4370         'exportsvcnum' => 'serial', '', '', '', '', 
4371         'exportnum'    => 'int', '', '', '', '', 
4372         'svcpart'      => 'int', '', '', '', '', 
4373         'role'         => 'varchar', 'NULL', 16, '', '',
4374       ],
4375       'primary_key'  => 'exportsvcnum',
4376       'unique'       => [ [ 'exportnum', 'svcpart' ] ],
4377       'index'        => [ [ 'exportnum' ], [ 'svcpart' ] ],
4378       'foreign_keys' => [
4379                           { columns    => [ 'exportnum' ],
4380                             table      => 'part_export',
4381                           },
4382                           { columns    => [ 'svcpart' ],
4383                             table      => 'part_svc',
4384                           },
4385                         ],
4386     },
4387
4388     'export_device' => {
4389       'columns' => [
4390         'exportdevicenum' => 'serial', '', '', '', '', 
4391         'exportnum'       => 'int', '', '', '', '', 
4392         'devicepart'      => 'int', '', '', '', '', 
4393       ],
4394       'primary_key'  => 'exportdevicenum',
4395       'unique'       => [ [ 'exportnum', 'devicepart' ] ],
4396       'index'        => [ [ 'exportnum' ], [ 'devicepart' ] ],
4397       'foreign_keys' => [
4398                           { columns    => [ 'exportnum' ],
4399                             table      => 'part_export',
4400                           },
4401                           { columns    => [ 'devicepart' ],
4402                             table      => 'part_device',
4403                           },
4404                         ],
4405     },
4406
4407     'part_export' => {
4408       'columns' => [
4409         'exportnum',   'serial',     '',      '', '', '', 
4410         'exportname', 'varchar', 'NULL', $char_d, '', '',
4411         'machine',    'varchar', 'NULL', $char_d, '', '',
4412         'exporttype', 'varchar',     '', $char_d, '', '', 
4413         'nodomain',      'char', 'NULL',       1, '', '', 
4414         'default_machine','int', 'NULL',      '', '', '',
4415       ],
4416       'primary_key'  => 'exportnum',
4417       'unique'       => [],
4418       'index'        => [ [ 'machine' ], [ 'exporttype' ] ],
4419       'foreign_keys' => [
4420                           { columns    => [ 'default_machine' ],
4421                             table      => 'part_export_machine',
4422                             references => [ 'machinenum' ]
4423                           },
4424                         ],
4425     },
4426
4427     'part_export_option' => {
4428       'columns' => [
4429         'optionnum', 'serial', '', '', '', '', 
4430         'exportnum', 'int', '', '', '', '', 
4431         'optionname', 'varchar', '', $char_d, '', '', 
4432         'optionvalue', 'text', 'NULL', '', '', '', 
4433       ],
4434       'primary_key'  => 'optionnum',
4435       'unique'       => [],
4436       'index'        => [ [ 'exportnum' ], [ 'optionname' ] ],
4437       'foreign_keys' => [
4438                           { columns    => [ 'exportnum' ],
4439                             table      => 'part_export',
4440                           },
4441                         ],
4442     },
4443
4444     'radius_usergroup' => {
4445       'columns' => [
4446         'usergroupnum', 'serial', '', '', '', '', 
4447         'svcnum',       'int', '', '', '', '', 
4448         'groupname',    'varchar', 'NULL', $char_d, '', '', #deprecated
4449         'groupnum',     'int', 'NULL', '', '', '', 
4450       ],
4451       'primary_key'  => 'usergroupnum',
4452       'unique'       => [],
4453       'index'        => [ [ 'svcnum' ], [ 'groupname' ] ],
4454       'foreign_keys' => [
4455                           { columns    => [ 'svcnum' ],
4456                             table      => 'cust_svc', #svc_acct / svc_broadband
4457                           },
4458                           { columns    => [ 'groupnum' ],
4459                             table      => 'radius_group',
4460                           },
4461                         ],
4462     },
4463
4464     'radius_group' => {
4465       'columns' => [
4466         'groupnum', 'serial', '', '', '', '', 
4467         'groupname',    'varchar', '', $char_d, '', '', 
4468         'description',  'varchar', 'NULL', $char_d, '', '', 
4469         'priority', 'int', '', '', '1', '',
4470         'speed_up', 'int', 'NULL', '', '', '',
4471         'speed_down', 'int', 'NULL', '', '', '',
4472       ],
4473       'primary_key' => 'groupnum',
4474       'unique'      => [ ['groupname'] ],
4475       'index'       => [],
4476     },
4477
4478     'radius_attr' => {
4479       'columns' => [
4480         'attrnum',   'serial', '',      '', '', '',
4481         'groupnum',     'int', '',      '', '', '',
4482         'attrname', 'varchar', '', $char_d, '', '',
4483         'value',    'varchar', '',     255, '', '',
4484         'attrtype',    'char', '',       1, '', '',
4485         'op',          'char', '',       2, '', '',
4486       ],
4487       'primary_key'  => 'attrnum',
4488       'unique'       => [],
4489       'index'        => [ ['groupnum'], ],
4490       'foreign_keys' => [
4491                           { columns    => [ 'groupnum' ],
4492                             table      => 'radius_group',
4493                           },
4494                         ],
4495     },
4496
4497     'msgcat' => {
4498       'columns' => [
4499         'msgnum', 'serial', '', '', '', '', 
4500         'msgcode', 'varchar', '', 255, '', '', 
4501         'locale', 'varchar', '', 16, '', '', 
4502         'msg', 'text', '', '', '', '', 
4503       ],
4504       'primary_key' => 'msgnum',
4505       'unique'      => [ [ 'msgcode', 'locale' ] ],
4506       'index'       => [],
4507     },
4508
4509     'cust_tax_exempt' => {
4510       'columns' => [
4511         'exemptnum', 'serial', '', '', '', '', 
4512         'custnum',   'int', '', '', '', '', 
4513         'taxnum',    'int', '', '', '', '', 
4514         'year',      'int', '', '', '', '', 
4515         'month',     'int', '', '', '', '', 
4516         'amount',   @money_type, '', '', 
4517       ],
4518       'primary_key'  => 'exemptnum',
4519       'unique'       => [ [ 'custnum', 'taxnum', 'year', 'month' ] ],
4520       'index'        => [],
4521       'foreign_keys' => [
4522                           { columns    => [ 'custnum' ],
4523                             table      => 'cust_main',
4524                           },
4525                           { columns    => [ 'taxnum' ],
4526                             table      => 'cust_main_county',
4527                           },
4528                         ],
4529     },
4530
4531     'cust_tax_exempt_pkg' => {
4532       'columns' => [
4533         'exemptpkgnum',  'serial', '', '', '', '', 
4534         #'custnum',      'int', '', '', '', ''
4535         'billpkgnum',   'int', '', '', '', '', 
4536         'taxnum',       'int', '', '', '', '', 
4537         'year',         'int', 'NULL', '', '', '', 
4538         'month',        'int', 'NULL', '', '', '', 
4539         'creditbillpkgnum', 'int', 'NULL', '', '', '',
4540         'amount',       @money_type, '', '', 
4541         # exemption type flags
4542         'exempt_cust',          'char', 'NULL', 1, '', '',
4543         'exempt_setup',         'char', 'NULL', 1, '', '',
4544         'exempt_recur',         'char', 'NULL', 1, '', '',
4545         'exempt_cust_taxname',  'char', 'NULL', 1, '', '',
4546         'exempt_monthly',       'char', 'NULL', 1, '', '',
4547       ],
4548       'primary_key'  => 'exemptpkgnum',
4549       'unique'       => [],
4550       'index'        => [ [ 'taxnum', 'year', 'month' ],
4551                           [ 'billpkgnum' ],
4552                           [ 'taxnum' ],
4553                           [ 'creditbillpkgnum' ],
4554                         ],
4555       'foreign_keys' => [
4556                           { columns    => [ 'billpkgnum' ],
4557                             table      => 'cust_bill_pkg',
4558                           },
4559                           { columns    => [ 'taxnum' ],
4560                             table      => 'cust_main_county',
4561                           },
4562                           { columns    => [ 'creditbillpkgnum' ],
4563                             table      => 'cust_credit_bill_pkg',
4564                           },
4565                         ],
4566     },
4567
4568     'cust_tax_exempt_pkg_void' => {
4569       'columns' => [
4570         'exemptpkgnum',  'int', '', '', '', '', 
4571         #'custnum',      'int', '', '', '', ''
4572         'billpkgnum',   'int', '', '', '', '', 
4573         'taxnum',       'int', '', '', '', '', 
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' ],
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