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