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