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