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