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