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