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