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