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