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