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