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