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