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