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