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