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