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