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