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