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