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