added part_pkg.agent_pkgpartid, RT#27214
[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     'cust_recon' => {  # (some sort of not-well understood thing for OnPac)
1627       'columns' => [
1628         'reconid',      'serial',  '',          '', '', '', 
1629         'recondate',    @date_type,                 '', '', 
1630         'custnum',      'int'   ,  '',          '', '', '', 
1631         'agentnum',     'int',     '',          '', '', '', 
1632         'last',         'varchar', '',     $char_d, '', '', 
1633         'first',        'varchar', '',     $char_d, '', '', 
1634         'address1',     'varchar', '',     $char_d, '', '', 
1635         'address2',     'varchar', 'NULL', $char_d, '', '', 
1636         'city',         'varchar', '',     $char_d, '', '', 
1637         'state',        'varchar', 'NULL', $char_d, '', '', 
1638         'zip',          'varchar', 'NULL',      10, '', '', 
1639         'pkg',          'varchar', 'NULL', $char_d, '', '', 
1640         'adjourn',      @date_type,                 '', '',
1641         'status',       'varchar', 'NULL',      10, '', '', 
1642         'agent_custid', 'varchar',  '',    $char_d, '', '',
1643         'agent_pkg',    'varchar', 'NULL', $char_d, '', '', 
1644         'agent_adjourn', @date_type,                '', '',
1645         'comments',     'text',    'NULL',      '', '', '', 
1646       ],
1647       'primary_key' => 'reconid',
1648       'unique' => [],
1649       'index' => [],
1650     },
1651
1652     'contact_class' => {
1653       'columns' => [
1654         'classnum',    'serial',   '',      '', '', '', 
1655         'classname',   'varchar',  '', $char_d, '', '', 
1656         'disabled',    'char', 'NULL',       1, '', '', 
1657       ],
1658       'primary_key' => 'classnum',
1659       'unique' => [],
1660       'index' => [ ['disabled'] ],
1661     },
1662
1663     'contact' => {
1664       'columns' => [
1665         'contactnum', 'serial',     '',      '', '', '',
1666         'prospectnum',   'int', 'NULL',      '', '', '',
1667         'custnum',       'int', 'NULL',      '', '', '',
1668         'locationnum',   'int', 'NULL',      '', '', '', #not yet
1669         'classnum',      'int', 'NULL',      '', '', '',
1670 #        'titlenum',      'int', 'NULL',      '', '', '', #eg Mr. Mrs. Dr. Rev.
1671         'last',      'varchar',     '', $char_d, '', '', 
1672 #        'middle',    'varchar', 'NULL', $char_d, '', '', 
1673         'first',     'varchar',     '', $char_d, '', '', 
1674         'title',     'varchar', 'NULL', $char_d, '', '', #eg Head Bottle Washer
1675         'comment',   'varchar', 'NULL',     255, '', '', 
1676         'selfservice_access',    'char', 'NULL',       1, '', '',
1677         '_password',          'varchar', 'NULL', $char_d, '', '',
1678         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
1679         'disabled',              'char', 'NULL',       1, '', '', 
1680       ],
1681       'primary_key'  => 'contactnum',
1682       'unique'       => [],
1683       'index'        => [ [ 'prospectnum' ], [ 'custnum' ], [ 'locationnum' ],
1684                           [ 'last' ], [ 'first' ],
1685                         ],
1686       'foreign_keys' => [
1687                           { columns    => [ 'prospectnum' ],
1688                             table      => 'prospect_main',
1689                           },
1690                           { columns    => [ 'custnum' ],
1691                             table      => 'cust_main',
1692                           },
1693                           { columns    => [ 'locationnum' ],
1694                             table      => 'cust_location',
1695                           },
1696                           { columns    => [ 'classnum' ],
1697                             table      => 'contact_class',
1698                           },
1699                         ],
1700     },
1701
1702     'contact_phone' => {
1703       'columns' => [
1704         'contactphonenum', 'serial',     '', '', '', '',
1705         'contactnum',         'int',     '', '', '', '',
1706         'phonetypenum',       'int',     '', '', '', '',
1707         'countrycode',    'varchar',     '',  3, '', '', 
1708         'phonenum',       'varchar',     '', 14, '', '', 
1709         'extension',      'varchar', 'NULL',  7, '', '',
1710         #?#'comment',        'varchar',     '', $char_d, '', '', 
1711       ],
1712       'primary_key'  => 'contactphonenum',
1713       'unique'       => [],
1714       'index'        => [],
1715       'foreign_keys' => [
1716                           { columns    => [ 'contactnum' ],
1717                             table      => 'contact',
1718                           },
1719                           { columns    => [ 'phonetypenum' ],
1720                             table      => 'phone_type',
1721                           },
1722                         ],
1723     },
1724
1725     'phone_type' => {
1726       'columns' => [
1727         'phonetypenum',  'serial', '',      '', '', '',
1728         'typename',     'varchar', '', $char_d, '', '',
1729         'weight',           'int', '',      '', '', '', 
1730       ],
1731       'primary_key' => 'phonetypenum',
1732       'unique'      => [ [ 'typename' ], ],
1733       'index'       => [],
1734     },
1735
1736     'contact_email' => {
1737       'columns' => [
1738         'contactemailnum', 'serial', '',      '', '', '',
1739         'contactnum',         'int', '',      '', '', '',
1740         'emailaddress',   'varchar', '', $char_d, '', '',
1741       ],
1742       'primary_key'  => 'contactemailnum',
1743       #'unique'       => [ [ 'contactnum', 'emailaddress' ], ],
1744       'unique'       => [ [ 'emailaddress' ], ],
1745       'index'        => [],
1746       'foreign_keys' => [
1747                           { columns    => [ 'contactnum' ],
1748                             table      => 'contact',
1749                           },
1750                         ],
1751     },
1752
1753     'prospect_main' => {
1754       'columns' => [
1755         'prospectnum',  'serial',     '',      '', '', '',
1756         'agentnum',        'int',     '',      '', '', '',
1757         'company',     'varchar', 'NULL', $char_d, '', '',
1758         'add_date',   @date_type,                  '', '', 
1759         'disabled',       'char', 'NULL',       1, '', '', 
1760         'custnum',         'int', 'NULL',      '', '', '',
1761       ],
1762       'primary_key'  => 'prospectnum',
1763       'unique'       => [],
1764       'index'        => [ [ 'company' ], [ 'agentnum' ], [ 'disabled' ] ],
1765       'foreign_keys' => [
1766                           { columns    => [ 'agentnum' ],
1767                             table      => 'agent',
1768                           },
1769                           { columns    => [ 'custnum' ],
1770                             table      => 'cust_main',
1771                           },
1772                         ],
1773     },
1774
1775     'quotation' => {
1776       'columns' => [
1777         #regular fields
1778         'quotationnum',   'serial',     '', '', '', '', 
1779         'prospectnum',       'int', 'NULL', '', '', '',
1780         'custnum',           'int', 'NULL', '', '', '',
1781         '_date',        @date_type,             '', '', 
1782         'disabled',         'char', 'NULL',  1, '', '', 
1783         'usernum',           'int', 'NULL', '', '', '',
1784         #'total',      @money_type,       '', '', 
1785         #'quotation_term', 'varchar', 'NULL', $char_d, '', '',
1786       ],
1787       'primary_key'  => 'quotationnum',
1788       'unique'       => [],
1789       'index'        => [ [ 'prospectnum' ], ['custnum'], ],
1790       'foreign_keys' => [
1791                           { columns    => [ 'prospectnum' ],
1792                             table      => 'prospect_main',
1793                           },
1794                           { columns    => [ 'custnum' ],
1795                             table      => 'cust_main',
1796                           },
1797                           { columns    => [ 'usernum' ],
1798                             table      => 'access_user',
1799                           },
1800                         ],
1801     },
1802
1803     'quotation_pkg' => {
1804       'columns' => [
1805         'quotationpkgnum',   'serial',     '', '', '', '', 
1806         'quotationnum',         'int', 'NULL', '', '', '', #shouldn't be null,
1807                                                            # but history...
1808         'pkgpart',              'int',     '', '', '', '', 
1809         'locationnum',          'int', 'NULL', '', '', '',
1810         'start_date',      @date_type,             '', '', 
1811         'contract_end',    @date_type,             '', '',
1812         'quantity',             'int', 'NULL', '', '', '',
1813         'waive_setup',         'char', 'NULL',  1, '', '', 
1814       ],
1815       'primary_key'  => 'quotationpkgnum',
1816       'unique'       => [],
1817       'index'        => [ ['pkgpart'], ],
1818       'foreign_keys' => [
1819                           { columns    => [ 'quotationnum' ],
1820                             table      => 'quotation',
1821                           },
1822                           { columns    => [ 'pkgpart' ],
1823                             table      => 'part_pkg',
1824                           },
1825                           { columns    => [ 'locationnum' ],
1826                             table      => 'cust_location',
1827                           },
1828                         ],
1829     },
1830
1831     'quotation_pkg_discount' => {
1832       'columns' => [
1833         'quotationpkgdiscountnum', 'serial', '', '', '', '',
1834         'quotationpkgnum',            'int', '', '', '', '', 
1835         'discountnum',                'int', '', '', '', '',
1836         #'end_date',              @date_type,         '', '',
1837       ],
1838       'primary_key'  => 'quotationpkgdiscountnum',
1839       'unique'       => [],
1840       'index'        => [ [ 'quotationpkgnum' ], ], #[ 'discountnum' ] ],
1841       'foreign_keys' => [
1842                           { columns    => [ 'quotationpkgnum' ],
1843                             table      => 'quotation_pkg',
1844                           },
1845                           { columns    => [ 'discountnum' ],
1846                             table      => 'discount',
1847                           },
1848                         ],
1849     },
1850
1851     'cust_location' => { #'location' now that its prospects too, but...
1852       'columns' => [
1853         'locationnum',      'serial',     '',      '', '', '',
1854         'prospectnum',         'int', 'NULL',      '', '', '',
1855         'custnum',             'int', 'NULL',      '', '', '',
1856         'address1',        'varchar',     '', $char_d, '', '', 
1857         'address2',        'varchar', 'NULL', $char_d, '', '', 
1858         'city',            'varchar',     '', $char_d, '', '', 
1859         'county',          'varchar', 'NULL', $char_d, '', '', 
1860         'state',           'varchar', 'NULL', $char_d, '', '', 
1861         'zip',             'varchar', 'NULL',      10, '', '', 
1862         'latitude',        'decimal', 'NULL',  '10,7', '', '', 
1863         'longitude',       'decimal', 'NULL',  '10,7', '', '', 
1864         'coord_auto',         'char', 'NULL',       1, '', '',
1865         'addr_clean',         'char', 'NULL',       1, '', '',
1866         'country',            'char',     '',       2, '', '', 
1867         'geocode',         'varchar', 'NULL',      20, '', '',
1868         'district',        'varchar', 'NULL',      20, '', '',
1869         'censustract',     'varchar', 'NULL',      20, '', '',
1870         'censusyear',         'char', 'NULL',       4, '', '',
1871         'location_type',   'varchar', 'NULL',      20, '', '',
1872         'location_number', 'varchar', 'NULL',      20, '', '',
1873         'location_kind',      'char', 'NULL',       1, '', '',
1874         'disabled',           'char', 'NULL',       1, '', '', 
1875       ],
1876       'primary_key'  => 'locationnum',
1877       'unique'       => [],
1878       'index'        => [ [ 'prospectnum' ], [ 'custnum' ],
1879                           [ 'county' ], [ 'state' ], [ 'country' ], [ 'zip' ],
1880                           [ 'city' ], [ 'district' ]
1881                         ],
1882       'foreign_keys' => [
1883                           { columns    => [ 'prospectnum' ],
1884                             table      => 'prospect_main',
1885                           },
1886                           { columns    => [ 'custnum' ],
1887                             table      => 'cust_main',
1888                           },
1889                         ],
1890     },
1891
1892     'cust_main_invoice' => {
1893       'columns' => [
1894         'destnum',  'serial',  '',     '', '', '', 
1895         'custnum',  'int',  '',     '', '', '', 
1896         'dest',     'varchar', '',  $char_d, '', '', 
1897       ],
1898       'primary_key'  => 'destnum',
1899       'unique'       => [],
1900       'index'        => [ ['custnum'], ],
1901       'foreign_keys' => [
1902                           { columns    => [ 'custnum' ],
1903                             table      => 'cust_main',
1904                           },
1905                         ],
1906     },
1907
1908     'cust_main_note' => {
1909       'columns' => [
1910         'notenum',  'serial',  '',     '', '', '', 
1911         'custnum',  'int',  '',     '', '', '', 
1912         'classnum',      'int',     'NULL', '', '', '', 
1913         '_date',    @date_type, '', '', 
1914         'otaker',   'varchar', 'NULL',    32, '', '', 
1915         'usernum',   'int', 'NULL', '', '', '',
1916         'comments', 'text', 'NULL', '', '', '', 
1917       ],
1918       'primary_key'  => 'notenum',
1919       'unique'       => [],
1920       'index'        => [ [ 'custnum' ], [ '_date' ], [ 'usernum' ], ],
1921       'foreign_keys' => [
1922                           { columns    => [ 'custnum' ],
1923                             table      => 'cust_main',
1924                           },
1925                           { columns    => [ 'classnum' ],
1926                             table      => 'cust_note_class',
1927                           },
1928                           { columns    => [ 'usernum' ],
1929                             table      => 'access_user',
1930                           },
1931                         ],
1932     },
1933
1934     'cust_note_class' => {
1935       'columns' => [
1936         'classnum',    'serial',   '',      '', '', '', 
1937         'classname',   'varchar',  '', $char_d, '', '', 
1938         'disabled',    'char', 'NULL',       1, '', '', 
1939       ],
1940       'primary_key' => 'classnum',
1941       'unique' => [],
1942       'index' => [ ['disabled'] ],
1943     },
1944
1945     'cust_category' => {
1946       'columns' => [
1947         'categorynum',   'serial',  '', '', '', '', 
1948         'categoryname',  'varchar', '', $char_d, '', '', 
1949         'weight',         'int', 'NULL',  '', '', '',
1950         'disabled',      'char', 'NULL',   1, '', '', 
1951       ],
1952       'primary_key' => 'categorynum',
1953       'unique' => [],
1954       'index' => [ ['disabled'] ],
1955     },
1956
1957     'cust_class' => {
1958       'columns' => [
1959         'classnum',     'serial',     '',      '', '', '', 
1960         'classname',   'varchar',     '', $char_d, '', '', 
1961         'categorynum',     'int', 'NULL',      '', '', '', 
1962         'tax',            'char', 'NULL',       1, '', '', 
1963         'disabled',       'char', 'NULL',       1, '', '', 
1964       ],
1965       'primary_key'  => 'classnum',
1966       'unique'       => [],
1967       'index'        => [ ['disabled'] ],
1968       'foreign_keys' => [
1969                           { columns    => [ 'categorynum' ],
1970                             table      => 'cust_category',
1971                           },
1972                         ],
1973     },
1974  
1975     'cust_tag' => {
1976       'columns' => [
1977         'custtagnum', 'serial', '', '', '', '',
1978         'custnum',       'int', '', '', '', '',
1979         'tagnum',        'int', '', '', '', '',
1980       ],
1981       'primary_key'  => 'custtagnum',
1982       'unique'       => [ [ 'custnum', 'tagnum' ] ],
1983       'index'        => [ [ 'custnum' ] ],
1984       'foreign_keys' => [
1985                           { columns    => [ 'custnum' ],
1986                             table      => 'cust_main',
1987                           },
1988                           { columns    => [ 'tagnum' ],
1989                             table      => 'part_tag',
1990                           },
1991                         ],
1992     },
1993
1994     'part_tag' => {
1995       'columns' => [
1996         'tagnum',    'serial',     '',      '', '', '',
1997         'tagname',  'varchar',     '', $char_d, '', '',
1998         'tagdesc',  'varchar', 'NULL', $char_d, '', '',
1999         'tagcolor', 'varchar', 'NULL',       6, '', '',
2000         'by_default',  'char', 'NULL',       1, '', '',
2001         'disabled',    'char', 'NULL',       1, '', '', 
2002       ],
2003       'primary_key' => 'tagnum',
2004       'unique'      => [], #[ [ 'tagname' ] ], #?
2005       'index'       => [ [ 'disabled' ] ],
2006     },
2007
2008     'cust_main_exemption' => {
2009       'columns' => [
2010         'exemptionnum',   'serial',     '',      '', '', '',
2011         'custnum',           'int',     '',      '', '', '', 
2012         'taxname',       'varchar',     '', $char_d, '', '',
2013         'exempt_number', 'varchar', 'NULL', $char_d, '', '',
2014         #start/end dates?  for reporting?
2015       ],
2016       'primary_key'  => 'exemptionnum',
2017       'unique'       => [],
2018       'index'        => [ [ 'custnum' ] ],
2019       'foreign_keys' => [
2020                           { columns    => [ 'custnum' ],
2021                             table      => 'cust_main',
2022                           },
2023                         ],
2024     },
2025
2026     'cust_tax_adjustment' => {
2027       'columns' => [
2028         'adjustmentnum', 'serial',     '',      '', '', '',
2029         'custnum',          'int',     '',      '', '', '',
2030         'taxname',      'varchar',     '', $char_d, '', '',
2031         'amount',     @money_type,                  '', '', 
2032         'currency',        'char', 'NULL',       3, '', '',
2033         'comment',      'varchar', 'NULL', $char_d, '', '', 
2034         'billpkgnum',       'int', 'NULL',      '', '', '',
2035         #more?  no cust_bill_pkg_tax_location?
2036       ],
2037       'primary_key'  => 'adjustmentnum',
2038       'unique'       => [],
2039       'index'        => [ [ 'custnum' ], [ 'billpkgnum' ] ],
2040       'foreign_keys' => [
2041                           { columns    => [ 'custnum' ],
2042                             table      => 'cust_main',
2043                           },
2044                           { columns    => [ 'billpkgnum' ],
2045                             table      => 'cust_bill_pkg',
2046                           },
2047                         ],
2048     },
2049
2050     'cust_main_county' => { #district+city+county+state+country are checked 
2051                             #off the cust_main_county for validation and to 
2052                             #provide a tax rate.
2053       'columns' => [
2054         'taxnum',    'serial',     '',      '', '', '', 
2055         'district', 'varchar', 'NULL',      20, '', '',
2056         'city',     'varchar', 'NULL', $char_d, '', '',
2057         'county',   'varchar', 'NULL', $char_d, '', '', 
2058         'state',    'varchar', 'NULL', $char_d, '', '', 
2059         'country',     'char',     '',       2, '', '', 
2060         'taxclass', 'varchar', 'NULL', $char_d, '', '', 
2061         'exempt_amount', @money_type,            '', '', 
2062         'exempt_amount_currency', 'char', 'NULL', 3, '', '',
2063         'tax',         'real',     '',      '', '', '', #tax %
2064         'taxname',  'varchar', 'NULL', $char_d, '', '', 
2065         'setuptax',    'char', 'NULL',       1, '', '', # Y = setup tax exempt
2066         'recurtax',    'char', 'NULL',       1, '', '', # Y = recur tax exempt
2067       ],
2068       'primary_key' => 'taxnum',
2069       'unique' => [],
2070   #    'unique' => [ ['taxnum'], ['state', 'county'] ],
2071       'index' => [ [ 'district' ], [ 'city' ], [ 'county' ], [ 'state' ], 
2072                    [ 'country' ],
2073                    [ 'taxclass' ],
2074                  ],
2075     },
2076
2077     'tax_rate'    => {
2078       'columns' => [
2079         'taxnum',       'serial',     '',      '', '', '', 
2080         'geocode',     'varchar', 'NULL', $char_d, '', '',#cch provides 10 char
2081         'data_vendor', 'varchar', 'NULL', $char_d, '', '',#auto update source
2082         'location',    'varchar', 'NULL', $char_d, '', '',#provided by tax authority
2083         'taxclassnum', 'int',      '',      '', '', '', 
2084         'effective_date', @date_type, '', '', 
2085         'tax',        @taxrate_type,      '', '',        # tax %
2086         'excessrate', @taxrate_typen,     '', '',        # second tax %
2087         'taxbase',    @money_typen, '', '',              # amount at first tax rate
2088         'taxmax',     @money_typen, '', '',              # maximum about at both rates
2089         'usetax',        @taxrate_typen,     '', '',     # tax % when non-local
2090         'useexcessrate', @taxrate_typen,     '', '',     # second tax % when non-local
2091         'unittype',    'int',  'NULL', '', '', '',      # for fee
2092         'fee',         @taxrate_typen,     '', '',      # amount tax per unit
2093         'excessfee',   @taxrate_typen,     '', '',      # second amount tax per unit
2094         'feebase',     @taxrate_typen,     '', '',      # units taxed at first rate
2095         'feemax',      @taxrate_typen,     '', '',      # maximum number of unit taxed
2096         'maxtype',     'int',  'NULL', '', '', '',      # indicator of how thresholds accumulate
2097         'taxname', 'varchar',  'NULL', $char_d, '', '', # may appear on invoice
2098         'taxauth',     'int',  'NULL', '', '', '',      # tax authority
2099         'basetype',    'int',  'NULL', '', '', '', # indicator of basis for tax
2100         'passtype',    'int',  'NULL', '', '', '', # indicator declaring how item should be shown
2101         'passflag',    'char', 'NULL', 1, '', '',  # Y = required to list as line item, N = Prohibited
2102         'setuptax',    'char', 'NULL', 1, '', '',  # Y = setup tax exempt
2103         'recurtax',    'char', 'NULL', 1, '', '',  # Y = recur tax exempt
2104         'inoutcity',   'char', 'NULL', 1, '', '',  # '', 'I', or 'O'
2105         'inoutlocal',  'char', 'NULL', 1, '', '',  # '', 'I', or 'O'
2106         'manual',      'char', 'NULL', 1, '', '',  # Y = manually edited
2107         'disabled',    'char', 'NULL', 1, '', '',  # Y = tax disabled
2108       ],
2109       'primary_key'  => 'taxnum',
2110       'unique'       => [],
2111       'index'        => [ ['taxclassnum'], ['data_vendor', 'geocode'] ],
2112       'foreign_keys' => [
2113                           { columns    => [ 'taxclassnum' ],
2114                             table      => 'tax_class',
2115                           },
2116                         ],
2117     },
2118
2119     'tax_rate_location' => { 
2120       'columns' => [
2121         'taxratelocationnum', 'serial',  '',     '', '', '', 
2122         'data_vendor',        'varchar', 'NULL', $char_d, '', '',
2123         'geocode',            'varchar', '',     20,      '', '', 
2124         'city',               'varchar', 'NULL', $char_d, '', '',
2125         'county',             'varchar', 'NULL', $char_d, '', '',
2126         'state',              'char',    'NULL',       2, '', '', 
2127         'disabled',           'char',    'NULL', 1, '', '',
2128       ],
2129       'primary_key' => 'taxratelocationnum',
2130       'unique' => [],
2131       'index' => [ [ 'data_vendor', 'geocode', 'disabled' ] ],
2132     },
2133
2134     'cust_tax_location' => { 
2135       'columns' => [
2136         'custlocationnum', 'serial',  '',     '', '', '', 
2137         'data_vendor',     'varchar', 'NULL', $char_d, '', '', # update source
2138         'city',            'varchar', 'NULL', $char_d, '', '',
2139         'postalcity',      'varchar', 'NULL', $char_d, '', '',
2140         'county',          'varchar', 'NULL', $char_d, '', '',
2141         'zip',             'char',    '',     5,  '', '', 
2142         'state',           'char',    '',     2,  '', '', 
2143         'plus4hi',         'char',    'NULL', 4,  '', '', 
2144         'plus4lo',         'char',    'NULL', 4,  '', '', 
2145         'default_location','char',    'NULL', 1,  '', '', # Y = default for zip
2146         'cityflag',        'char',    'NULL', 1,  '', '', # I(n)/O(out)/B(oth)/NULL
2147         'geocode',         'varchar', '',    20,  '', '', 
2148       ],
2149       'primary_key' => 'custlocationnum',
2150       'unique' => [],
2151       'index' => [ [ 'zip', 'plus4lo', 'plus4hi' ] ],
2152     },
2153
2154     'tax_class' => { 
2155       'columns' => [
2156         'taxclassnum',  'serial',  '',            '', '', '',
2157         'data_vendor',  'varchar', 'NULL',   $char_d, '', '',
2158         'taxclass',     'varchar', '',       $char_d, '', '',          
2159         'description',  'varchar', '',     2*$char_d, '', '',          
2160       ],
2161       'primary_key' => 'taxclassnum',
2162       'unique' => [ [ 'data_vendor', 'taxclass' ] ],
2163       'index' => [],
2164     },
2165
2166     'cust_pay_pending' => {
2167       'columns' => [
2168         'paypendingnum',      'serial',     '',      '', '', '',
2169         'custnum',               'int',     '',      '', '', '', 
2170         'paid',            @money_type,                  '', '', 
2171         'currency',             'char', 'NULL',       3, '', '',
2172         '_date',            @date_type,                  '', '', 
2173         'payby',                'char',     '',       4, '', '',
2174         'payinfo',           'varchar', 'NULL',     512, '', '',
2175         'paymask',           'varchar', 'NULL', $char_d, '', '', 
2176         'paydate',           'varchar', 'NULL',     10, '', '', 
2177         'recurring_billing', 'varchar', 'NULL', $char_d, '', '',
2178         'payunique',         'varchar', 'NULL', $char_d, '', '', #separate paybatch "unique" functions from current usage
2179
2180         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
2181         'status',       'varchar',     '', $char_d, '', '', 
2182         'session_id',   'varchar', 'NULL', $char_d, '', '', #only need 32
2183         'statustext',   'text',    'NULL',  '', '', '', 
2184         'gatewaynum',   'int',     'NULL',  '', '', '',
2185         #'cust_balance', @money_type,            '', '',
2186         'paynum',       'int',     'NULL',  '', '', '',
2187         'jobnum',    'bigint',     'NULL',  '', '', '', 
2188         'invnum',       'int',     'NULL',  '', '', '',
2189         'manual',       'char',    'NULL',   1, '', '',
2190         'discount_term','int',     'NULL',  '', '', '',
2191         'failure_status','varchar','NULL',  16, '', '',
2192       ],
2193       'primary_key'  => 'paypendingnum',
2194       'unique'       => [ [ 'payunique' ] ],
2195       'index'        => [ [ 'custnum' ], [ 'status' ], ],
2196       'foreign_keys' => [
2197                           { columns    => [ 'custnum' ],
2198                             table      => 'cust_main',
2199                           },
2200                           { columns    => [ 'pkgnum' ],
2201                             table      => 'cust_pkg',
2202                           },
2203                           { columns    => [ 'gatewaynum' ],
2204                             table      => 'payment_gateway',
2205                           },
2206                           { columns    => [ 'paynum' ],
2207                             table      => 'cust_pay',
2208                           },
2209                           { columns    => [ 'jobnum' ],
2210                             table      => 'queue',
2211                           },
2212                           { columns    => [ 'invnum' ],
2213                             table      => 'cust_bill',
2214                           },
2215                         ],
2216     },
2217
2218     'cust_pay' => {
2219       'columns' => [
2220         'paynum',       'serial',    '',       '', '', '',
2221         'custnum',         'int',    '',       '', '', '', 
2222         '_date',     @date_type,                   '', '', 
2223         'paid',      @money_type,                  '', '', 
2224         'currency',       'char', 'NULL',       3, '', '',
2225         'otaker',      'varchar', 'NULL',      32, '', '',
2226         'usernum',         'int', 'NULL',      '', '', '',
2227         'payby',          'char',     '',       4, '', '',
2228         'payinfo',     'varchar', 'NULL',     512, '', '',
2229         'paymask',     'varchar', 'NULL', $char_d, '', '', 
2230         'paydate',     'varchar', 'NULL',      10, '', '', 
2231         'paybatch',    'varchar', 'NULL', $char_d, '', '',#for auditing purposes
2232         'payunique',   'varchar', 'NULL', $char_d, '', '',#separate paybatch "unique" functions from current usage
2233         'closed',         'char', 'NULL',       1, '', '', 
2234         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
2235
2236         # cash/check deposit info fields
2237         'bank',        'varchar', 'NULL', $char_d, '', '',
2238         'depositor',   'varchar', 'NULL', $char_d, '', '',
2239         'account',     'varchar', 'NULL',      20, '', '',
2240         'teller',      'varchar', 'NULL',      20, '', '',
2241
2242         'batchnum',        'int', 'NULL',      '', '', '',#pay_batch foreign key
2243
2244         # credit card/EFT fields (formerly in paybatch)
2245         'gatewaynum',      'int', 'NULL',      '', '', '', # payment_gateway FK
2246         'processor',   'varchar', 'NULL', $char_d, '', '', # module name
2247         'auth',        'varchar', 'NULL',      16, '', '', # CC auth number
2248         'order_number','varchar', 'NULL', $char_d, '', '', # transaction number
2249       ],
2250       'primary_key'  => 'paynum',
2251       #i guess not now, with cust_pay_pending, if we actually make it here, we _do_ want to record it# 'unique' => [ [ 'payunique' ] ],
2252       'index'        => [ ['custnum'], ['paybatch'], ['payby'], ['_date'],
2253                           ['usernum'],
2254                         ],
2255       'foreign_keys' => [
2256                           { columns    => [ 'custnum' ],
2257                             table      => 'cust_main',
2258                           },
2259                           { columns    => [ 'usernum' ],
2260                             table      => 'access_user',
2261                           },
2262                           { columns    => [ 'pkgnum' ],
2263                             table      => 'cust_pkg',
2264                           },
2265                           { columns    => [ 'batchnum' ],
2266                             table      => 'pay_batch',
2267                           },
2268                           { columns    => [ 'gatewaynum' ],
2269                             table      => 'payment_gateway',
2270                           },
2271                         ],
2272     },
2273
2274     'cust_pay_void' => {
2275       'columns' => [
2276         'paynum',          'int',    '',       '', '', '', 
2277         'custnum',         'int',    '',       '', '', '', 
2278         '_date',      @date_type,                  '', '', 
2279         'paid',      @money_type,                  '', '', 
2280         'currency',       'char', 'NULL',       3, '', '',
2281         'otaker',      'varchar', 'NULL',      32, '', '', 
2282         'usernum',         'int', 'NULL',      '', '', '',
2283         'payby',          'char',     '',       4, '', '',
2284         'payinfo',     'varchar', 'NULL',     512, '', '',
2285         'paymask',     'varchar', 'NULL', $char_d, '', '', 
2286         #'paydate' ?
2287         'paybatch',    'varchar', 'NULL', $char_d, '', '', #for auditing purposes.
2288         'closed',        'char',  'NULL',       1, '', '', 
2289         'pkgnum', 'int',   'NULL', '', '', '', #desired pkgnum for pkg-balances
2290
2291         # cash/check deposit info fields
2292         'bank',       'varchar', 'NULL', $char_d, '', '',
2293         'depositor',  'varchar', 'NULL', $char_d, '', '',
2294         'account',    'varchar', 'NULL',      20, '', '',
2295         'teller',     'varchar', 'NULL',      20, '', '',
2296         'batchnum',       'int', 'NULL',      '', '', '', #pay_batch foreign key
2297
2298         # credit card/EFT fields (formerly in paybatch)
2299         'gatewaynum',      'int', 'NULL',      '', '', '', # payment_gateway FK
2300         'processor',   'varchar', 'NULL', $char_d, '', '', # module name
2301         'auth',        'varchar', 'NULL',      16, '', '', # CC auth number
2302         'order_number','varchar', 'NULL', $char_d, '', '', # transaction number
2303
2304         #void fields
2305         'void_date',  @date_type,                  '', '', 
2306         'reason',      'varchar', 'NULL', $char_d, '', '', 
2307         'void_usernum',    'int', 'NULL',      '', '', '',
2308       ],
2309       'primary_key'  => 'paynum',
2310       'unique'       => [],
2311       'index'        => [ ['custnum'], ['usernum'], ['void_usernum'] ],
2312       'foreign_keys' => [
2313                           { columns    => [ 'custnum' ],
2314                             table      => 'cust_main',
2315                           },
2316                           { columns    => [ 'usernum' ],
2317                             table      => 'access_user',
2318                           },
2319                           { columns    => [ 'pkgnum' ],
2320                             table      => 'cust_pkg',
2321                           },
2322                           { columns    => [ 'batchnum' ],
2323                             table      => 'pay_batch',
2324                           },
2325                           { columns    => [ 'gatewaynum' ],
2326                             table      => 'payment_gateway',
2327                           },
2328                           { columns    => [ 'void_usernum' ],
2329                             table      => 'access_user',
2330                             references => [ 'usernum' ],
2331                           },
2332                         ],
2333     },
2334
2335     'cust_bill_pay' => {
2336       'columns' => [
2337         'billpaynum', 'serial',     '',   '', '', '', 
2338         'invnum',  'int',     '',   '', '', '', 
2339         'paynum',  'int',     '',   '', '', '', 
2340         'amount',  @money_type, '', '', 
2341         '_date',   @date_type, '', '', 
2342         'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances
2343       ],
2344       'primary_key'  => 'billpaynum',
2345       'unique'       => [],
2346       'index'        => [ [ 'paynum' ], [ 'invnum' ] ],
2347       'foreign_keys' => [
2348                           { columns    => [ 'invnum' ],
2349                             table      => 'cust_bill',
2350                           },
2351                           { columns    => [ 'paynum' ],
2352                             table      => 'cust_pay',
2353                           },
2354                           { columns    => [ 'pkgnum' ],
2355                             table      => 'cust_pkg',
2356                           },
2357                         ],
2358     },
2359
2360     'cust_bill_pay_batch' => {
2361       'columns' => [
2362         'billpaynum', 'serial',     '',   '', '', '', 
2363         'invnum',  'int',     '',   '', '', '', 
2364         'paybatchnum',  'int',     '',   '', '', '', 
2365         'amount',  @money_type, '', '', 
2366         '_date',   @date_type, '', '', 
2367       ],
2368       'primary_key'  => 'billpaynum',
2369       'unique'       => [],
2370       'index'        => [ [ 'paybatchnum' ], [ 'invnum' ] ],
2371       'foreign_keys' => [
2372                           { columns    => [ 'invnum' ],
2373                             table      => 'cust_bill',
2374                           },
2375                           { columns    => [ 'paybatchnum' ],
2376                             table      => 'cust_pay_batch',
2377                           },
2378                         ],
2379     },
2380
2381     'cust_bill_pay_pkg' => {
2382       'columns' => [
2383         'billpaypkgnum', 'serial', '', '', '', '',
2384         'billpaynum',       'int', '', '', '', '',
2385         'billpkgnum',       'int', '', '', '', '',
2386         'billpkgtaxlocationnum', 'int', 'NULL', '', '', '',
2387         'billpkgtaxratelocationnum', 'int', 'NULL', '', '', '',
2388         'amount',         @money_type,     '', '',
2389         'setuprecur',      'varchar', '', $char_d, '', '',
2390         'sdate',   @date_type, '', '', 
2391         'edate',   @date_type, '', '', 
2392       ],
2393       'primary_key'  => 'billpaypkgnum',
2394       'unique'       => [],
2395       'index'        => [ [ 'billpaynum' ], [ 'billpkgnum' ], ],
2396       'foreign_keys' => [
2397                           { columns    => [ 'billpaynum' ],
2398                             table      => 'cust_bill_pay',
2399                           },
2400                           { columns    => [ 'billpkgnum' ],
2401                             table      => 'cust_bill_pkg',
2402                           },
2403                           { columns    => [ 'billpkgtaxlocationnum' ],
2404                             table      => 'cust_bill_pkg_tax_location',
2405                           },
2406                           { columns    => [ 'billpkgtaxratelocationnum' ],
2407                             table      => 'cust_bill_pkg_tax_rate_location',
2408                           },
2409                         ],
2410     },
2411
2412     'pay_batch' => { #batches of payments to an external processor
2413       'columns' => [
2414         'batchnum', 'serial',     '', '', '', '', 
2415         'agentnum',    'int', 'NULL', '', '', '', 
2416         'payby',      'char',     '',  4, '', '', # CARD/CHEK
2417         'status',     'char', 'NULL',  1, '', '', 
2418         'download',       @date_type,     '', '', 
2419         'upload',         @date_type,     '', '', 
2420         'title',   'varchar', 'NULL',255, '', '',
2421       ],
2422       'primary_key'  => 'batchnum',
2423       'unique'       => [],
2424       'index'        => [],
2425       'foreign_keys' => [
2426                           { columns    => [ 'agentnum' ],
2427                             table      => 'agent',
2428                           },
2429                         ],
2430     },
2431
2432     'cust_pay_batch' => { #list of customers in current CARD/CHEK batch
2433       'columns' => [
2434         'paybatchnum',    'serial',     '',      '', '', '', 
2435         'batchnum',          'int',     '',      '', '', '', 
2436         'invnum',            'int',     '',      '', '', '', 
2437         'custnum',           'int',     '',      '', '', '', 
2438         'last',          'varchar',     '', $char_d, '', '', 
2439         'first',         'varchar',     '', $char_d, '', '', 
2440         'address1',      'varchar',     '', $char_d, '', '', 
2441         'address2',      'varchar', 'NULL', $char_d, '', '', 
2442         'city',          'varchar',     '', $char_d, '', '', 
2443         'state',         'varchar', 'NULL', $char_d, '', '', 
2444         'zip',           'varchar', 'NULL',      10, '', '', 
2445         'country',          'char',     '',       2, '', '', 
2446         'payby',            'char',     '',       4, '', '',
2447         'payinfo',       'varchar', 'NULL',     512, '', '', 
2448         #'exp',          @date_type,                  '', '',
2449         'exp',           'varchar', 'NULL',      11, '', '', 
2450         'payname',       'varchar', 'NULL', $char_d, '', '', 
2451         'amount',      @money_type,                  '', '', 
2452         'currency',         'char', 'NULL',       3, '', '',
2453         'status',        'varchar', 'NULL', $char_d, '', '', 
2454         'failure_status','varchar', 'NULL',      16, '', '',
2455         'error_message', 'varchar', 'NULL', $char_d, '', '',
2456       ],
2457       'primary_key'  => 'paybatchnum',
2458       'unique'       => [],
2459       'index'        => [ ['batchnum'], ['invnum'], ['custnum'] ],
2460       'foreign_keys' => [
2461                           { columns    => [ 'batchnum' ],
2462                             table      => 'pay_batch',
2463                           },
2464                           { columns    => [ 'invnum' ],
2465                             table      => 'cust_bill',
2466                           },
2467                           { columns    => [ 'custnum' ],
2468                             table      => 'cust_main',
2469                           },
2470                         ],
2471     },
2472
2473     'fcc477map' => {
2474       'columns' => [
2475         'formkey',   'varchar',     '', 255, '', '',
2476         'formvalue',    'text', 'NULL',  '', '', '',
2477       ],
2478       'primary_key' => 'formkey',
2479       'unique'      => [],
2480       'index'       => [],
2481     },
2482
2483     'cust_pkg' => {
2484       'columns' => [
2485         'pkgnum',           'serial',     '', '', '', '', 
2486         'custnum',             'int',     '', '', '', '', 
2487         'pkgpart',             'int',     '', '', '', '', 
2488         'pkgbatch',        'varchar', 'NULL', $char_d, '', '',
2489         'contactnum',          'int', 'NULL', '', '', '', 
2490         'locationnum',         'int', 'NULL', '', '', '',
2491         'otaker',          'varchar', 'NULL', 32, '', '', 
2492         'usernum',             'int', 'NULL', '', '', '',
2493         'salesnum',            'int', 'NULL', '', '', '', 
2494         'order_date',     @date_type,             '', '', 
2495         'start_date',     @date_type,             '', '', 
2496         'setup',          @date_type,             '', '', 
2497         'bill',           @date_type,             '', '', 
2498         'last_bill',      @date_type,             '', '', 
2499         'susp',           @date_type,             '', '', 
2500         'adjourn',        @date_type,             '', '', 
2501         'resume',         @date_type,             '', '', 
2502         'cancel',         @date_type,             '', '', 
2503         'uncancel',       @date_type,             '', '', 
2504         'uncancel_pkgnum',     'int', 'NULL', '', '', '',
2505         'expire',         @date_type,             '', '', 
2506         'contract_end',   @date_type,             '', '',
2507         'dundate',        @date_type,             '', '',
2508         'change_date',    @date_type,             '', '',
2509         'change_pkgnum',       'int', 'NULL', '', '', '',
2510         'change_pkgpart',      'int', 'NULL', '', '', '',
2511         'change_locationnum',  'int', 'NULL', '', '', '',
2512         'change_custnum',      'int', 'NULL', '', '', '',
2513         'main_pkgnum',         'int', 'NULL', '', '', '',
2514         'pkglinknum',          'int', 'NULL', '', '', '',
2515         'manual_flag',        'char', 'NULL',  1, '', '', 
2516         'no_auto',            'char', 'NULL',  1, '', '', 
2517         'quantity',            'int', 'NULL', '', '', '',
2518         'agent_pkgid',         'int', 'NULL', '', '', '',
2519         'waive_setup',        'char', 'NULL',  1, '', '', 
2520         'recur_show_zero',    'char', 'NULL',  1, '', '',
2521         'setup_show_zero',    'char', 'NULL',  1, '', '',
2522         'change_to_pkgnum',    'int', 'NULL', '', '', '',
2523       ],
2524       'primary_key'  => 'pkgnum',
2525       'unique'       => [],
2526       'index'        => [ ['custnum'], ['pkgpart'], ['pkgbatch'],
2527                           ['locationnum'], ['usernum'], ['agent_pkgid'],
2528                           ['order_date'], [ 'start_date' ], ['setup'], ['bill'],
2529                           ['last_bill'], ['susp'], ['adjourn'], ['cancel'],
2530                           ['expire'], ['contract_end'], ['change_date'],
2531                           ['no_auto'],
2532                         ],
2533       'foreign_keys' => [
2534                           { columns    => [ 'custnum' ],
2535                             table      => 'cust_main',
2536                           },
2537                           { columns    => [ 'pkgpart' ],
2538                             table      => 'part_pkg',
2539                           },
2540                           { columns    => [ 'contactnum' ],
2541                             table      => 'contact',
2542                           },
2543                           { columns    => [ 'locationnum' ],
2544                             table      => 'cust_location',
2545                           },
2546                           { columns    => [ 'usernum' ],
2547                             table      => 'access_user',
2548                           },
2549                           { columns    => [ 'salesnum' ],
2550                             table      => 'sales',
2551                           },
2552                           { columns    => [ 'uncancel_pkgnum' ],
2553                             table      => 'cust_pkg',
2554                             references => [ 'pkgnum' ],
2555                           },
2556                           { columns    => [ 'change_pkgnum' ],
2557                             table      => 'cust_pkg',
2558                             references => [ 'pkgnum' ],
2559                           },
2560                           { columns    => [ 'change_pkgpart' ],
2561                             table      => 'part_pkg',
2562                             references => [ 'pkgpart' ],
2563                           },
2564                           { columns    => [ 'change_locationnum' ],
2565                             table      => 'cust_location',
2566                             references => [ 'locationnum' ],
2567                           },
2568                           { columns    => [ 'change_custnum' ],
2569                             table      => 'cust_main',
2570                             references => [ 'custnum' ],
2571                           },
2572                           { columns    => [ 'main_pkgnum' ],
2573                             table      => 'cust_pkg',
2574                             references => [ 'pkgnum' ],
2575                           },
2576                           { columns    => [ 'pkglinknum' ],
2577                             table      => 'part_pkg_link',
2578                           },
2579                           { columns    => [ 'change_to_pkgnum' ],
2580                             table      => 'cust_pkg',
2581                             references => [ 'pkgnum' ],
2582                           },
2583                         ],
2584    },
2585
2586     'cust_pkg_option' => {
2587       'columns' => [
2588         'optionnum', 'serial', '', '', '', '', 
2589         'pkgnum', 'int', '', '', '', '', 
2590         'optionname', 'varchar', '', $char_d, '', '', 
2591         'optionvalue', 'text', 'NULL', '', '', '', 
2592       ],
2593       'primary_key'  => 'optionnum',
2594       'unique'       => [],
2595       'index'        => [ [ 'pkgnum' ], [ 'optionname' ] ],
2596       'foreign_keys' => [
2597                           { columns    => [ 'pkgnum' ],
2598                             table      => 'cust_pkg',
2599                           },
2600                         ],
2601     },
2602
2603     'cust_pkg_detail' => {
2604       'columns' => [
2605         'pkgdetailnum', 'serial', '',      '', '', '',
2606         'pkgnum',          'int', '',      '', '', '',
2607         'detail',      'varchar', '', $char_d, '', '', 
2608         'detailtype',     'char', '',       1, '', '', # "I"nvoice or "C"omment
2609         'weight',          'int', '',      '', '', '',
2610       ],
2611       'primary_key'  => 'pkgdetailnum',
2612       'unique'       => [],
2613       'index'        => [ [ 'pkgnum', 'detailtype' ] ],
2614       'foreign_keys' => [
2615                           { columns    => [ 'pkgnum' ],
2616                             table      => 'cust_pkg',
2617                           },
2618                         ],
2619     },
2620
2621     'cust_pkg_reason' => {
2622       'columns' => [
2623         'num',      'serial',    '',   '', '', '', 
2624         'pkgnum',   'int',    '',   '', '', '', 
2625         'reasonnum','int',    '',   '', '', '', 
2626         'action',   'char', 'NULL', 1, '', '',     #should not be nullable
2627         'otaker',   'varchar', 'NULL', 32, '', '', 
2628         'usernum',   'int', 'NULL', '', '', '',
2629         'date',     @date_type, '', '', 
2630       ],
2631       'primary_key'  => 'num',
2632       'unique'       => [],
2633       'index'        => [ ['pkgnum'], ['reasonnum'], ['action'], ['usernum'], ],
2634       'foreign_keys' => [
2635                           { columns    => [ 'pkgnum' ],
2636                             table      => 'cust_pkg',
2637                           },
2638                           { columns    => [ 'reasonnum' ],
2639                             table      => 'reason',
2640                           },
2641                           { columns    => [ 'usernum' ],
2642                             table      => 'access_user',
2643                           },
2644                         ],
2645     },
2646
2647     'cust_pkg_discount' => {
2648       'columns' => [
2649         'pkgdiscountnum', 'serial', '',        '', '', '',
2650         'pkgnum',            'int', '',        '', '', '', 
2651         'discountnum',       'int', '',        '', '', '',
2652         'months_used',   'decimal', 'NULL', '7,4', '', '',
2653         'end_date',     @date_type,                '', '',
2654         'otaker',        'varchar', 'NULL',    32, '', '', 
2655         'usernum',           'int', 'NULL',    '', '', '',
2656         'disabled',         'char', 'NULL',     1, '', '', 
2657       ],
2658       'primary_key'  => 'pkgdiscountnum',
2659       'unique'       => [],
2660       'index'        => [ [ 'pkgnum' ], [ 'discountnum' ], [ 'usernum' ], ],
2661       'foreign_keys' => [
2662                           { columns    => [ 'pkgnum' ],
2663                             table      => 'cust_pkg',
2664                           },
2665                           { columns    => [ 'discountnum' ],
2666                             table      => 'discount',
2667                           },
2668                           { columns    => [ 'usernum' ],
2669                             table      => 'access_user',
2670                           },
2671                         ],
2672     },
2673
2674     'cust_pkg_usage' => {
2675       'columns' => [
2676         'pkgusagenum', 'serial', '', '', '', '',
2677         'pkgnum',         'int', '', '', '', '',
2678         'minutes',        'int', '', '', '', '',
2679         'pkgusagepart',   'int', '', '', '', '',
2680       ],
2681       'primary_key'  => 'pkgusagenum',
2682       'unique'       => [],
2683       'index'        => [ [ 'pkgnum' ], [ 'pkgusagepart' ] ],
2684       'foreign_keys' => [
2685                           { columns    => [ 'pkgnum' ],
2686                             table      => 'cust_pkg',
2687                           },
2688                           { columns    => [ 'pkgusagepart' ],
2689                             table      => 'part_pkg_usage',
2690                           },
2691                         ],
2692     },
2693
2694     'cdr_cust_pkg_usage' => {
2695       'columns' => [
2696         'cdrusagenum', 'bigserial', '', '', '', '',
2697         'acctid',      'bigint',    '', '', '', '',
2698         'pkgusagenum', 'int',       '', '', '', '',
2699         'minutes',     'int',       '', '', '', '',
2700       ],
2701       'primary_key'  => 'cdrusagenum',
2702       'unique'       => [],
2703       'index'        => [ [ 'pkgusagenum' ], [ 'acctid' ] ],
2704       'foreign_keys' => [
2705                           { columns    => [ 'acctid' ],
2706                             table      => 'cdr',
2707                           },
2708                           { columns    => [ 'pkgusagenum' ],
2709                             table      => 'cust_pkg_usage',
2710                           },
2711                         ],
2712     },
2713
2714     'cust_bill_pkg_discount' => {
2715       'columns' => [
2716         'billpkgdiscountnum', 'serial',        '', '', '', '',
2717         'billpkgnum',            'int',        '', '', '', '', 
2718         'pkgdiscountnum',        'int',        '', '', '', '', 
2719         'amount',          @money_type,                '', '', 
2720         'months',            'decimal', 'NULL', '7,4', '', '',
2721       ],
2722       'primary_key'  => 'billpkgdiscountnum',
2723       'unique'       => [],
2724       'index'        => [ [ 'billpkgnum' ], [ 'pkgdiscountnum' ] ],
2725       'foreign_keys' => [
2726                           { columns    => [ 'billpkgnum' ],
2727                             table      => 'cust_bill_pkg',
2728                           },
2729                           { columns    => [ 'pkgdiscountnum' ],
2730                             table      => 'cust_pkg_discount',
2731                           },
2732                         ],
2733     },
2734
2735     'cust_bill_pkg_discount_void' => {
2736       'columns' => [
2737         'billpkgdiscountnum',    'int',        '', '', '', '',
2738         'billpkgnum',            'int',        '', '', '', '', 
2739         'pkgdiscountnum',        'int',        '', '', '', '', 
2740         'amount',          @money_type,                '', '', 
2741         'months',            'decimal', 'NULL', '7,4', '', '',
2742       ],
2743       'primary_key'  => 'billpkgdiscountnum',
2744       'unique'       => [],
2745       'index'        => [ [ 'billpkgnum' ], [ 'pkgdiscountnum' ] ],
2746       'foreign_keys' => [
2747                           { columns    => [ 'billpkgnum' ],
2748                             table      => 'cust_bill_pkg_void',
2749                           },
2750                           { columns    => [ 'pkgdiscountnum' ],
2751                             table      => 'cust_pkg_discount',
2752                           },
2753                         ],
2754     },
2755
2756     'discount' => {
2757       'columns' => [
2758         'discountnum', 'serial',     '',      '', '', '',
2759         #'agentnum',       'int', 'NULL',      '', '', '', 
2760         'classnum',       'int', 'NULL',      '', '', '',
2761         'name',       'varchar', 'NULL', $char_d, '', '',
2762         'amount',   @money_type,                  '', '', 
2763         'percent',    'decimal',     '',   '7,4', '', '',
2764         'months',     'decimal', 'NULL',   '7,4', '', '',
2765         'disabled',      'char', 'NULL',       1, '', '', 
2766         'setup',         'char', 'NULL',       1, '', '', 
2767         #'linked',        'char', 'NULL',       1, '', '',
2768       ],
2769       'primary_key'  => 'discountnum',
2770       'unique'       => [],
2771       'index'        => [], # [ 'agentnum' ], ],
2772       'foreign_keys' => [
2773                           { columns    => [ 'classnum' ],
2774                             table      => 'discount_class',
2775                           },
2776                         ],
2777     },
2778
2779     'discount_class' => {
2780       'columns' => [
2781         'classnum',    'serial',   '',      '', '', '', 
2782         'classname',   'varchar',  '', $char_d, '', '', 
2783         #'categorynum', 'int',  'NULL',      '', '', '', 
2784         'disabled',    'char', 'NULL',       1, '', '', 
2785       ],
2786       'primary_key' => 'classnum',
2787       'unique' => [],
2788       'index' => [ ['disabled'] ],
2789     },
2790
2791     'cust_refund' => {
2792       'columns' => [
2793         'refundnum',    'serial',    '',   '', '', '', 
2794         'custnum',  'int',    '',   '', '', '', 
2795         '_date',        @date_type, '', '', 
2796         'refund',       @money_type, '', '', 
2797         'currency',       'char', 'NULL',       3, '', '',
2798         'otaker',       'varchar',   'NULL',   32, '', '', 
2799         'usernum',   'int', 'NULL', '', '', '',
2800         'reason',       'varchar',   '',   $char_d, '', '', 
2801         'payby',        'char',   '',     4, '', '', # CARD/BILL/COMP, should
2802                                                      # be index into payby
2803                                                      # table eventually
2804         'payinfo',      'varchar',   'NULL', 512, '', '', #see cust_main above
2805         'paymask', 'varchar', 'NULL', $char_d, '', '', 
2806         'paybatch',     'varchar',   'NULL', $char_d, '', '', 
2807         'closed',    'char', 'NULL', 1, '', '', 
2808         # credit card/EFT fields (formerly in paybatch)
2809         'gatewaynum',     'int', 'NULL', '', '', '', # payment_gateway FK
2810         'processor',  'varchar', 'NULL', $char_d, '', '', # module name
2811         'auth',       'varchar','NULL',16, '', '', # CC auth number
2812         'order_number', 'varchar','NULL',$char_d, '', '', # transaction number
2813       ],
2814       'primary_key'  => 'refundnum',
2815       'unique'       => [],
2816       'index'        => [ ['custnum'], ['_date'], [ 'usernum' ], ],
2817       'foreign_keys' => [
2818                           { columns    => [ 'custnum' ],
2819                             table      => 'cust_main',
2820                           },
2821                           { columns    => [ 'usernum' ],
2822                             table      => 'access_user',
2823                           },
2824                           { columns    => [ 'gatewaynum' ],
2825                             table      => 'payment_gateway',
2826                           },
2827                         ],
2828     },
2829
2830     'cust_credit_refund' => {
2831       'columns' => [
2832         'creditrefundnum', 'serial',     '',   '', '', '', 
2833         'crednum',  'int',     '',   '', '', '', 
2834         'refundnum',  'int',     '',   '', '', '', 
2835         'amount',  @money_type, '', '', 
2836         '_date',   @date_type, '', '', 
2837       ],
2838       'primary_key'  => 'creditrefundnum',
2839       'unique'       => [],
2840       'index'        => [ ['crednum'], ['refundnum'] ],
2841       'foreign_keys' => [
2842                           { columns    => [ 'crednum' ],
2843                             table      => 'cust_credit',
2844                           },
2845                           { columns    => [ 'refundnum' ],
2846                             table      => 'cust_refund',
2847                           },
2848                         ],
2849     },
2850
2851
2852     'cust_svc' => {
2853       'columns' => [
2854         'svcnum',      'serial',     '', '', '', '', 
2855         'pkgnum',         'int', 'NULL', '', '', '', 
2856         'svcpart',        'int',     '', '', '', '', 
2857         'agent_svcid',    'int', 'NULL', '', '', '',
2858         'overlimit',           @date_type,   '', '', 
2859       ],
2860       'primary_key'  => 'svcnum',
2861       'unique'       => [],
2862       'index'        => [ ['svcnum'], ['pkgnum'], ['svcpart'],
2863                           ['agent_svcid'],
2864                         ],
2865       'foreign_keys' => [
2866                           { columns    => [ 'pkgnum' ],
2867                             table      => 'cust_pkg',
2868                           },
2869                           { columns    => [ 'svcpart' ],
2870                             table      => 'part_svc',
2871                           },
2872                         ],
2873     },
2874
2875     'cust_svc_option' => {
2876       'columns' => [
2877         'optionnum',   'serial', '', '', '', '', 
2878         'svcnum',      'int', '', '', '', '', 
2879         'optionname',  'varchar', '', $char_d, '', '', 
2880         'optionvalue', 'text', 'NULL', '', '', '', 
2881       ],
2882       'primary_key'  => 'optionnum',
2883       'unique'       => [],
2884       'index'        => [ [ 'svcnum' ], [ 'optionname' ] ],
2885       'foreign_keys' => [
2886                           { columns    => [ 'svcnum' ],
2887                             table      => 'cust_svc',
2888                           },
2889                         ],
2890     },
2891
2892     'svc_export_machine' => {
2893       'columns' => [
2894         'svcexportmachinenum', 'serial', '', '', '', '',
2895         'svcnum',                 'int', '', '', '', '', 
2896         'exportnum',              'int', '', '', '', '', 
2897         'machinenum',             'int', '', '', '', '',
2898       ],
2899       'primary_key'  => 'svcexportmachinenum',
2900       'unique'       => [ ['svcnum', 'exportnum'] ],
2901       'index'        => [],
2902       'foreign_keys' => [
2903                           { columns    => [ 'svcnum' ],
2904                             table      => 'cust_svc',
2905                           },
2906                           { columns    => [ 'exportnum' ],
2907                             table      => 'part_export',
2908                           },
2909                           { columns    => [ 'machinenum' ],
2910                             table      => 'part_export_machine',
2911                           },
2912                         ],
2913     },
2914
2915     'part_export_machine' => {
2916       'columns' => [
2917         'machinenum', 'serial', '', '', '', '',
2918         'exportnum',     'int', '', '', '', '',
2919         'machine',    'varchar', 'NULL', $char_d, '', '', 
2920         'disabled',      'char', 'NULL',       1, '', '',
2921       ],
2922       'primary_key'  => 'machinenum',
2923       'unique'       => [ [ 'exportnum', 'machine' ] ],
2924       'index'        => [ [ 'exportnum' ] ],
2925       'foreign_keys' => [
2926                           { columns    => [ 'exportnum' ],
2927                             table      => 'part_export',
2928                           },
2929                         ],
2930     },
2931
2932     'part_pkg' => {
2933       'columns' => [
2934         'pkgpart',       'serial',    '',   '', '', '', 
2935         'pkg',           'varchar',   '',   $char_d, '', '', 
2936         'comment',       'varchar', 'NULL', 2*$char_d, '', '', 
2937         'promo_code',    'varchar', 'NULL', $char_d, '', '', 
2938         'freq',          'varchar',   '',   $char_d, '', '', #billing frequency
2939         'setuptax',      'char', 'NULL', 1, '', '', 
2940         'recurtax',      'char', 'NULL', 1, '', '', 
2941         'plan',          'varchar', 'NULL', $char_d, '', '', 
2942         'disabled',      'char', 'NULL', 1, '', '', 
2943         'custom',        'char', 'NULL', 1, '', '', 
2944         'taxclass',      'varchar', 'NULL', $char_d, '', '', 
2945         'classnum',      'int',     'NULL', '', '', '', 
2946         'addon_classnum','int',     'NULL', '', '', '', 
2947         'taxproductnum', 'int',     'NULL', '', '', '', 
2948         'setup_cost',    @money_typen,          '', '',
2949         'recur_cost',    @money_typen,          '', '',
2950         'pay_weight',    'real',    'NULL', '', '', '',
2951         'credit_weight', 'real',    'NULL', '', '', '',
2952         'agentnum',      'int',     'NULL', '', '', '', 
2953         'fcc_ds0s',      'int',     'NULL', '', '', '', 
2954         'fcc_voip_class','char',    'NULL',  1, '', '',
2955         'no_auto',          'char', 'NULL',  1, '', '', 
2956         'recur_show_zero',  'char', 'NULL',  1, '', '',
2957         'setup_show_zero',  'char', 'NULL',  1, '', '',
2958         'successor',     'int',     'NULL', '', '', '',
2959         'family_pkgpart','int',     'NULL', '', '', '',
2960         'delay_start',   'int',     'NULL', '', '', '',
2961         'agent_pkgpartid', 'varchar', 'NULL', 20, '', '',
2962       ],
2963       'primary_key'  => 'pkgpart',
2964       'unique'       => [],
2965       'index'        => [ [ 'promo_code' ], [ 'disabled' ], [ 'classnum' ],
2966                           [ 'agentnum' ], ['no_auto'], ['agent_pkgpartid'],
2967                         ],
2968       'foreign_keys' => [
2969                           { columns    => [ 'classnum' ],
2970                             table      => 'pkg_class',
2971                           },
2972                           { columns    => [ 'addon_classnum' ],
2973                             table      => 'pkg_class',
2974                             references => [ 'classnum' ],
2975                           },
2976                           { columns    => [ 'taxproductnum' ],
2977                             table      => 'part_pkg_taxproduct',
2978                           },
2979                           { columns    => [ 'agentnum' ],
2980                             table      => 'agent',
2981                           },
2982                           { columns    => [ 'successor' ],
2983                             table      => 'part_pkg',
2984                             references => [ 'pkgpart' ],
2985                           },
2986                           { columns    => [ 'family_pkgpart' ],
2987                             table      => 'part_pkg',
2988                             references => [ 'pkgpart' ],
2989                           },
2990                         ],
2991     },
2992
2993     'part_pkg_msgcat' => {
2994       'columns' => [
2995         'pkgpartmsgnum',  'serial',     '',        '', '', '',
2996         'pkgpart',           'int',     '',        '', '', '',
2997         'locale',        'varchar',     '',        16, '', '',
2998         'pkg',           'varchar',     '',   $char_d, '', '', #longer/no limit?
2999         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
3000       ],
3001       'primary_key'  => 'pkgpartmsgnum',
3002       'unique'       => [ [ 'pkgpart', 'locale' ] ],
3003       'index'        => [],
3004       'foreign_keys' => [
3005                           { columns    => [ 'pkgpart' ],
3006                             table      => 'part_pkg',
3007                           },
3008                         ],
3009     },
3010
3011     'part_pkg_currency' => {
3012       'columns' => [
3013         'pkgcurrencynum', 'serial', '',      '', '', '',
3014         'pkgpart',           'int', '',      '', '', '',
3015         'currency',         'char', '',       3, '', '',
3016         'optionname',    'varchar', '', $char_d, '', '', 
3017         'optionvalue',      'text', '',      '', '', '', 
3018       ],
3019       'primary_key'  => 'pkgcurrencynum',
3020       'unique'       => [ [ 'pkgpart', 'currency', 'optionname' ] ],
3021       'index'        => [ ['pkgpart'] ],
3022       'foreign_keys' => [
3023                           { columns    => [ 'pkgpart' ],
3024                             table      => 'part_pkg',
3025                           },
3026                         ],
3027     },
3028
3029     'currency_exchange' => {
3030       'columns' => [
3031         'currencyratenum', 'serial', '',    '', '', '',
3032         'from_currency',     'char', '',     3, '', '',
3033         'to_currency',       'char', '',     3, '', '',
3034         'rate',           'decimal', '', '7,6', '', '',
3035       ],
3036       'primary_key' => 'currencyratenum',
3037       'unique'      => [ [ 'from_currency', 'to_currency' ] ],
3038       'index'       => [],
3039     },
3040
3041     'part_pkg_usageprice' => {
3042       'columns' => [
3043         'usagepricepart', 'serial',      '',      '', '', '',
3044         'pkgpart',           'int',      '',      '', '', '',
3045         'price',          @money_type,                '', '', 
3046         'currency',         'char',  'NULL',       3, '', '',
3047         'action',        'varchar',      '', $char_d, '', '',
3048         'target',        'varchar',      '', $char_d, '', '',
3049         'amount',        'varchar',      '', $char_d, '', '',
3050       ],
3051       'primary_key'  => 'usagepricepart',
3052       'unique'       => [ [ 'pkgpart', 'currency', 'target' ] ],
3053       'index'        => [ [ 'pkgpart' ] ],
3054       'foreign_keys' => [
3055                           { columns    => [ 'pkgpart' ],
3056                             table      => 'part_pkg',
3057                           },
3058                         ],
3059     },
3060
3061     'cust_pkg_usageprice' => {
3062       'columns' => [
3063         'usagepricenum', 'serial',      '',      '', '', '',
3064         'pkgnum',           'int',      '',      '', '', '',
3065         'usagepricepart',   'int',      '',      '', '', '',
3066         'quantity',         'int',      '',      '', '', '',
3067       ],
3068       'primary_key'  => 'usagepricenum',
3069       'unique'       => [ [ 'pkgnum', 'usagepricepart' ] ],
3070       'index'        => [ [ 'pkgnum' ] ],
3071       'foreign_keys' => [
3072                           { columns    => [ 'pkgnum' ],
3073                             table      => 'cust_pkg',
3074                           },
3075                           { columns    => [ 'usagepricepart' ],
3076                             table      => 'part_pkg_usageprice',
3077                           },
3078                         ],
3079     },
3080
3081     'part_pkg_link' => {
3082       'columns' => [
3083         'pkglinknum',  'serial',   '',      '', '', '',
3084         'src_pkgpart', 'int',      '',      '', '', '',
3085         'dst_pkgpart', 'int',      '',      '', '', '', 
3086         'link_type',   'varchar',  '', $char_d, '', '',
3087         'hidden',      'char', 'NULL',       1, '', '',
3088       ],
3089       'primary_key'  => 'pkglinknum',
3090       'unique'       => [ ['src_pkgpart','dst_pkgpart','link_type','hidden'] ],
3091       'index'        => [ [ 'src_pkgpart' ] ],
3092       'foreign_keys' => [
3093                           { columns    => [ 'src_pkgpart' ],
3094                             table      => 'part_pkg',
3095                             references => [ 'pkgpart' ]
3096                           },
3097                           { columns    => [ 'dst_pkgpart' ],
3098                             table      => 'part_pkg',
3099                             references => [ 'pkgpart' ]
3100                           },
3101                         ],
3102     },
3103     # XXX somewhat borked unique: we don't really want a hidden and unhidden
3104     # it turns out we'd prefer to use svc, bill, and invisibill (or something)
3105
3106     'part_pkg_discount' => {
3107       'columns' => [
3108         'pkgdiscountnum', 'serial',   '',      '', '', '',
3109         'pkgpart',        'int',      '',      '', '', '',
3110         'discountnum',    'int',      '',      '', '', '', 
3111       ],
3112       'primary_key'  => 'pkgdiscountnum',
3113       'unique'       => [ [ 'pkgpart', 'discountnum' ] ],
3114       'index'        => [],
3115       'foreign_keys' => [
3116                           { columns    => [ 'pkgpart' ],
3117                             table      => 'part_pkg',
3118                           },
3119                           { columns    => [ 'discountnum' ],
3120                             table      => 'discount',
3121                           },
3122                         ],
3123     },
3124
3125     'part_pkg_taxclass' => {
3126       'columns' => [
3127         'taxclassnum',  'serial', '',       '', '', '',
3128         'taxclass',     'varchar', '', $char_d, '', '', 
3129         'disabled', 'char',   'NULL',         1, '', '', 
3130       ],
3131       'primary_key' => 'taxclassnum',
3132       'unique'      => [ [ 'taxclass' ] ],
3133       'index'       => [ [ 'disabled' ] ],
3134     },
3135
3136     'part_pkg_taxproduct' => {
3137       'columns' => [
3138         'taxproductnum', 'serial',      '',        '', '', '',
3139         'data_vendor',   'varchar', 'NULL',   $char_d, '', '', 
3140         'taxproduct',    'varchar',     '',   $char_d, '', '', 
3141         'description',   'varchar',     '', 3*$char_d, '', '', 
3142       ],
3143       'primary_key' => 'taxproductnum',
3144       'unique'      => [ [ 'data_vendor', 'taxproduct' ] ],
3145       'index'       => [],
3146     },
3147
3148     'part_pkg_taxrate' => { 
3149       'columns' => [
3150         'pkgtaxratenum', 'serial',  '',     '',      '', '',
3151         'data_vendor',   'varchar', 'NULL', $char_d, '', '', # update source
3152         'geocode',       'varchar', 'NULL', $char_d, '', '', # cch provides 10
3153         'taxproductnum', 'int',  '',     '',       '', '',          
3154         'city',             'varchar', 'NULL', $char_d, '', '', # tax_location?
3155         'county',           'varchar', 'NULL', $char_d, '', '', 
3156         'state',            'varchar', 'NULL', $char_d, '', '', 
3157         'local',            'varchar', 'NULL', $char_d, '', '', 
3158         'country',          'char',    'NULL', 2,       '', '',
3159         'taxclassnumtaxed', 'int',     'NULL', '',      '', '', 
3160         'taxcattaxed',      'varchar', 'NULL', $char_d, '', '', 
3161         'taxclassnum',      'int',     'NULL', '',      '', '', 
3162         'effdate',          @date_type, '', '', 
3163         'taxable',          'char',    'NULL', 1,       '', '', 
3164       ],
3165       'primary_key'  => 'pkgtaxratenum',
3166       'unique'       => [],
3167       'index'        => [ [ 'data_vendor', 'geocode', 'taxproductnum' ] ],
3168       'foreign_keys' => [
3169                           { columns    => [ 'taxproductnum' ],
3170                             table      => 'part_pkg_taxproduct',
3171                           },
3172                           { columns    => [ 'taxclassnumtaxed' ],
3173                             table      => 'tax_class',
3174                             references => [ 'taxclassnum' ],
3175                           },
3176                           { columns    => [ 'taxclassnum' ],
3177                             table      => 'tax_class',
3178                           },
3179                         ],
3180     },
3181
3182     'part_pkg_taxoverride' => { 
3183       'columns' => [
3184         'taxoverridenum', 'serial', '', '', '', '',
3185         'pkgpart',           'int', '', '', '', '',
3186         'taxclassnum',       'int', '', '', '', '',
3187         'usage_class',    'varchar', 'NULL', $char_d, '', '', 
3188       ],
3189       'primary_key'  => 'taxoverridenum',
3190       'unique'       => [],
3191       'index'        => [ [ 'pkgpart' ], [ 'taxclassnum' ] ],
3192       'foreign_keys' => [
3193                           { columns    => [ 'pkgpart' ],
3194                             table      => 'part_pkg',
3195                           },
3196                           { columns    => [ 'taxclassnum' ],
3197                             table      => 'tax_class',
3198                           },
3199                         ],
3200     },
3201
3202 #    'part_title' => {
3203 #      'columns' => [
3204 #        'titlenum',   'int',    '',   '',
3205 #        'title',      'varchar',   '',   $char_d,
3206 #      ],
3207 #      'primary_key' => 'titlenum',
3208 #      'unique' => [ [] ],
3209 #      'index' => [ [] ],
3210 #    },
3211
3212     'pkg_svc' => {
3213       'columns' => [
3214         'pkgsvcnum',   'serial',    '', '', '', '', 
3215         'pkgpart',        'int',    '', '', '', '', 
3216         'svcpart',        'int',    '', '', '', '', 
3217         'quantity',       'int',    '', '', '', '', 
3218         'primary_svc',   'char', 'NULL', 1, '', '', 
3219         'hidden',        'char', 'NULL', 1, '', '',
3220         'bulk_skip',     'char', 'NULL', 1, '', '',
3221       ],
3222       'primary_key'  => 'pkgsvcnum',
3223       'unique'       => [ ['pkgpart', 'svcpart'] ],
3224       'index'        => [ ['pkgpart'], ['quantity'] ],
3225       'foreign_keys' => [
3226                           { columns    => [ 'pkgpart' ],
3227                             table      => 'part_pkg',
3228                           },
3229                           { columns    => [ 'svcpart' ],
3230                             table      => 'part_svc',
3231                           },
3232                         ],
3233     },
3234
3235     'part_referral' => {
3236       'columns' => [
3237         'refnum',   'serial',     '',        '', '', '', 
3238         'referral', 'varchar',    '',   $char_d, '', '', 
3239         'disabled', 'char',   'NULL',         1, '', '', 
3240         'agentnum', 'int',    'NULL',        '', '', '', 
3241       ],
3242       'primary_key'  => 'refnum',
3243       'unique'       => [],
3244       'index'        => [ ['disabled'], ['agentnum'], ],
3245       'foreign_keys' => [
3246                           { columns    => [ 'agentnum' ],
3247                             table      => 'agent',
3248                           },
3249                         ],
3250     },
3251
3252     'part_svc' => {
3253       'columns' => [
3254         'svcpart',             'serial',     '',        '', '', '', 
3255         'svc',                'varchar',     '',   $char_d, '', '', 
3256         'svcdb',              'varchar',     '',   $char_d, '', '', 
3257         'disabled',              'char', 'NULL',         1, '', '', 
3258         'preserve',              'char', 'NULL',         1, '', '',
3259         'selfservice_access', 'varchar', 'NULL',   $char_d, '', '',
3260         'classnum',               'int', 'NULL',        '', '', '',
3261         'restrict_edit_password','char', 'NULL',         1, '', '',
3262         'has_router',            'char', 'NULL',         1, '', '',
3263 ],
3264       'primary_key'  => 'svcpart',
3265       'unique'       => [],
3266       'index'        => [ [ 'disabled' ] ],
3267       'foreign_keys' => [
3268                           { columns    => [ 'classnum' ],
3269                             table      => 'part_svc_class',
3270                           },
3271                         ],
3272     },
3273
3274     'part_svc_column' => {
3275       'columns' => [
3276         'columnnum',   'serial',      '',      '', '', '', 
3277         'svcpart',     'int',         '',      '', '', '', 
3278         'columnname',  'varchar',     '',      64, '', '', 
3279         'columnlabel', 'varchar', 'NULL', $char_d, '', '',
3280         'columnvalue', 'varchar', 'NULL',     512, '', '', 
3281         'columnflag',  'char',    'NULL',       1, '', '', 
3282       ],
3283       'primary_key'  => 'columnnum',
3284       'unique'       => [ [ 'svcpart', 'columnname' ] ],
3285       'index'        => [ [ 'svcpart' ] ],
3286       'foreign_keys' => [
3287                           { columns    => [ 'svcpart' ],
3288                             table      => 'part_svc',
3289                           },
3290                         ],
3291     },
3292
3293     'part_svc_class' => {
3294       'columns' => [
3295         'classnum',    'serial',   '',      '', '', '', 
3296         'classname',   'varchar',  '', $char_d, '', '', 
3297         'disabled',    'char', 'NULL',       1, '', '', 
3298       ],
3299       'primary_key' => 'classnum',
3300       'unique' => [],
3301       'index' => [ ['disabled'] ],
3302     },
3303
3304     #(this should be renamed to part_pop)
3305     'svc_acct_pop' => {
3306       'columns' => [
3307         'popnum',    'serial',    '',   '', '', '', 
3308         'city',      'varchar',   '',   $char_d, '', '', 
3309         'state',     'varchar',   '',   $char_d, '', '', 
3310         'ac',        'char',   '',   3, '', '', 
3311         'exch',      'char',   '',   3, '', '', 
3312         'loc',       'char',   'NULL',   4, '', '', #NULL for legacy purposes
3313       ],
3314       'primary_key' => 'popnum',
3315       'unique' => [],
3316       'index' => [ [ 'state' ] ],
3317     },
3318
3319     'part_pop_local' => {
3320       'columns' => [
3321         'localnum',  'serial',     '',     '', '', '', 
3322         'popnum',    'int',     '',     '', '', '', 
3323         'city',      'varchar', 'NULL', $char_d, '', '', 
3324         'state',     'char',    'NULL', 2, '', '', 
3325         'npa',       'char',    '',     3, '', '', 
3326         'nxx',       'char',    '',     3, '', '', 
3327       ],
3328       'primary_key'  => 'localnum',
3329       'unique'       => [],
3330       'index'        => [ [ 'npa', 'nxx' ], [ 'popnum' ] ],
3331       'foreign_keys' => [
3332                          { columns    => [ 'popnum' ],
3333                            table      => 'svc_acct_pop',
3334                          },
3335                        ],
3336     },
3337
3338     'qual' => {
3339       'columns' => [
3340         'qualnum',  'serial',     '',     '', '', '', 
3341         'custnum',    'int',     'NULL',     '', '', '',
3342         'prospectnum',    'int',     'NULL',     '', '', '',
3343         'locationnum',    'int',     'NULL',     '', '', '',
3344         'phonenum',     'varchar', 'NULL',       24, '', '',
3345         'exportnum',      'int', 'NULL', '', '', '', 
3346         'vendor_qual_id',      'varchar', 'NULL', $char_d, '', '', 
3347         'status',      'char', '', 1, '', '', 
3348       ],
3349       'primary_key'  => 'qualnum',
3350       'unique'       => [],
3351       'index'        => [ ['locationnum'], ['custnum'], ['prospectnum'],
3352                           ['phonenum'], ['vendor_qual_id'],
3353                         ],
3354       'foreign_keys' => [
3355                           { columns    => [ 'custnum' ],
3356                             table      => 'cust_main',
3357                           },
3358                           { columns    => [ 'prospectnum' ],
3359                             table      => 'prospect_main',
3360                           },
3361                           { columns    => [ 'locationnum' ],
3362                             table      => 'cust_location',
3363                           },
3364                           { columns    => [ 'exportnum' ],
3365                             table      => 'part_export',
3366                           },
3367                         ],
3368     },
3369
3370     'qual_option' => {
3371       'columns' => [
3372         'optionnum', 'serial', '', '', '', '', 
3373         'qualnum',  'int',     '',     '', '', '', 
3374         'optionname', 'varchar', '', $char_d, '', '', 
3375         'optionvalue', 'text', 'NULL', '', '', '', 
3376       ],
3377       'primary_key'  => 'optionnum',
3378       'unique'       => [],
3379       'index'        => [],
3380       'foreign_keys' => [
3381                           { columns    => [ 'qualnum' ],
3382                             table      => 'qual',
3383                           },
3384                         ],
3385     },
3386
3387     'svc_acct' => {
3388       'columns' => [
3389         'svcnum',    'int',    '',   '', '', '', 
3390         'username',  'varchar',   '',   $username_len, '', '',
3391         '_password', 'varchar',   'NULL',  512, '', '',
3392         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
3393         'sec_phrase', 'varchar',  'NULL',   $char_d, '', '', 
3394         'popnum',    'int',    'NULL',   '', '', '', 
3395         'sectornum', 'int', 'NULL',      '', '', '',
3396         'uid',       'int', 'NULL',   '', '', '', 
3397         'gid',       'int', 'NULL',   '', '', '', 
3398         'finger',    'varchar',   'NULL',   2*$char_d, '', '', 
3399         'dir',       'varchar',   'NULL',   $char_d, '', '', 
3400         'shell',     'varchar',   'NULL',   $char_d, '', '', 
3401         'quota',     'varchar',   'NULL',   $char_d, '', '', 
3402         'slipip',    'varchar',   'NULL',   15, '', '', #four TINYINTs, bah.
3403         # IP address mgmt
3404         'routernum', 'int', 'NULL',      '', '', '',
3405         'blocknum',  'int', 'NULL',      '', '', '', 
3406         'seconds',   'int', 'NULL',   '', '', '', #uhhhh
3407         'seconds_threshold',   'int', 'NULL',   '', '', '',
3408         'upbytes',   'bigint', 'NULL',   '', '', '', 
3409         'upbytes_threshold',   'bigint', 'NULL',   '', '', '',
3410         'downbytes', 'bigint', 'NULL',   '', '', '',
3411         'downbytes_threshold',   'bigint', 'NULL',   '', '', '',
3412         'totalbytes','bigint', 'NULL',   '', '', '',
3413         'totalbytes_threshold',   'bigint', 'NULL',   '', '', '',
3414         'domsvc',    'int',     '', '', '', '', 
3415         'pbxsvc',    'int', 'NULL', '', '', '',
3416         'last_login',  @date_type, '', '', 
3417         'last_logout', @date_type, '', '', 
3418         #cardfortress field(s)
3419         'cf_privatekey',      'text', 'NULL',      '', '', '',
3420         #communigate pro fields (quota = MaxAccountSize)
3421         'cgp_aliases',     'varchar', 'NULL',     255, '', '',
3422         #settings
3423         'cgp_type',        'varchar', 'NULL', $char_d, '', '', #AccountType
3424         'file_quota',      'varchar', 'NULL', $char_d, '', '', #MaxWebSize
3425         'file_maxnum',     'varchar', 'NULL', $char_d, '', '', #MaxWebFiles
3426         'file_maxsize',    'varchar', 'NULL', $char_d, '', '', #MaxFileSize
3427         'cgp_accessmodes', 'varchar', 'NULL',     255, '', '', #AccessModes
3428         'password_selfchange','char', 'NULL',       1, '', '', #PWDAllowed
3429         'password_recover',   'char', 'NULL',       1, 'Y','', #PasswordRecovery
3430         'cgp_rulesallowed','varchar', 'NULL', $char_d, '', '', #RulesAllowed
3431         'cgp_rpopallowed',    'char', 'NULL',       1, '', '', #RPOPAllowed
3432         'cgp_mailtoall',      'char', 'NULL',       1, '', '', #MailToAll
3433         'cgp_addmailtrailer', 'char', 'NULL',       1, '', '', #AddMailTrailer
3434         'cgp_archiveafter',    'int', 'NULL',      '', '', '', #ArchiveMessagesAfter
3435         #XXX mailing lists
3436         #preferences
3437         'cgp_deletemode',     'varchar', 'NULL', $char_d, '', '',#DeleteMode
3438         'cgp_emptytrash',     'varchar', 'NULL', $char_d, '', '',#EmptyTrash
3439         'cgp_language',       'varchar', 'NULL', $char_d, '', '',#Language
3440         'cgp_timezone',       'varchar', 'NULL', $char_d, '', '',#TimeZone
3441         'cgp_skinname',       'varchar', 'NULL', $char_d, '', '',#SkinName
3442         'cgp_prontoskinname', 'varchar', 'NULL', $char_d, '', '',#ProntoSkinName
3443         'cgp_sendmdnmode',    'varchar', 'NULL', $char_d, '', '',#SendMDNMode
3444         #mail
3445         #XXX RPOP settings
3446         #
3447       ],
3448       'primary_key'  => 'svcnum',
3449       #'unique'       => [ [ 'username', 'domsvc' ] ],
3450       'unique'       => [],
3451       'index'        => [ ['username'], ['domsvc'], ['pbxsvc'] ],
3452       'foreign_keys' => [
3453                           { columns    => [ 'svcnum' ],
3454                             table      => 'cust_svc',
3455                           },
3456                           { columns    => [ 'popnum' ],
3457                             table      => 'svc_acct_pop',
3458                           },
3459                           { columns    => [ 'sectornum' ],
3460                             table      => 'tower_sector',
3461                           },
3462                           { columns    => [ 'routernum' ],
3463                             table      => 'router',
3464                           },
3465                           { columns    => [ 'blocknum' ],
3466                             table      => 'addr_block',
3467                           },
3468                           { columns    => [ 'domsvc' ],
3469                             table      => 'svc_domain', #'cust_svc',
3470                             references => [ 'svcnum' ],
3471                           },
3472                           { columns    => [ 'pbxsvc' ],
3473                             table      => 'svc_pbx', #'cust_svc',
3474                             references => [ 'svcnum' ],
3475                           },
3476                         ],
3477     },
3478
3479     'acct_rt_transaction' => {
3480       'columns' => [
3481         'svcrtid',   'int',    '',   '', '', '', #why am i not a serial
3482         'svcnum',    'int',    '',   '', '', '', 
3483         'transaction_id',       'int', '',   '', '', '', 
3484         '_date',   @date_type, '', '',
3485         'seconds',   'int', '',   '', '', '', #uhhhh
3486         'support',   'int', '',   '', '', '',
3487       ],
3488       'primary_key'  => 'svcrtid',
3489       'unique'       => [],
3490       'index'        => [ ['svcnum', 'transaction_id'] ],
3491       'foreign_keys' => [
3492                           { columns    => [ 'svcnum' ],
3493                             table      => 'svc_acct', #'cust_svc',
3494                           },
3495                           # 1. RT tables aren't part of our data structure, so
3496                           #     we can't make sure Queue is created already
3497                           # 2. This is our internal hack for time tracking, not
3498                           #     a user-facing feature
3499                           #{ columns    => [ 'transaction_id' ],
3500                           #  table      => 'Transaction',
3501                           #  references => [ 'id' ],
3502                           #},
3503                         ],
3504     },
3505
3506     #'svc_charge' => {
3507     #  'columns' => [
3508     #    'svcnum',    'int',    '',   '',
3509     #    'amount',    @money_type,
3510     #  ],
3511     #  'primary_key' => 'svcnum',
3512     #  'unique' => [ [] ],
3513     #  'index' => [ [] ],
3514     #},
3515
3516     'svc_domain' => {
3517       'columns' => [
3518         'svcnum',           'int',    '',        '', '', '',
3519         'domain',       'varchar',    '',   $char_d, '', '',
3520         'suffix',       'varchar', 'NULL',  $char_d, '', '',
3521         'catchall',         'int', 'NULL',       '', '', '',
3522         'parent_svcnum',    'int', 'NULL',       '', '', '',
3523         'registrarnum',     'int', 'NULL',       '', '', '',
3524         'registrarkey', 'varchar', 'NULL',      512, '', '',
3525         'setup_date',      @date_type, '', '',
3526         'renewal_interval', 'int', 'NULL',       '', '', '',
3527         'expiration_date', @date_type, '', '',
3528         'au_registrant_name',       'varchar', 'NULL',  $char_d, '', '',
3529         'au_eligibility_type',      'varchar', 'NULL',  $char_d, '', '',
3530         #communigate pro fields (quota = MaxAccountSize)
3531         'max_accounts',     'int', 'NULL',       '', '', '',
3532         'trailer',         'text', 'NULL',       '', '', '',
3533         'cgp_aliases',  'varchar', 'NULL',      255, '', '',
3534         'cgp_accessmodes','varchar','NULL',     255, '', '', #DomainAccessModes
3535         'cgp_certificatetype','varchar','NULL', $char_d, '', '',
3536         #settings
3537         'acct_def_password_selfchange',   'char', 'NULL',       1,  '', '', 
3538         'acct_def_password_recover',      'char', 'NULL',       1, 'Y', '', 
3539         'acct_def_cgp_accessmodes',    'varchar', 'NULL',     255,  '', '',
3540         'acct_def_quota',              'varchar', 'NULL', $char_d,  '', '',
3541         'acct_def_file_quota',         'varchar', 'NULL', $char_d,  '', '',
3542         'acct_def_file_maxnum',        'varchar', 'NULL', $char_d,  '', '',
3543         'acct_def_file_maxsize',       'varchar', 'NULL', $char_d,  '', '',
3544         'acct_def_cgp_rulesallowed',   'varchar', 'NULL', $char_d,  '', '',
3545         'acct_def_cgp_rpopallowed',       'char', 'NULL',       1,  '', '', 
3546         'acct_def_cgp_mailtoall',         'char', 'NULL',       1,  '', '', 
3547         'acct_def_cgp_addmailtrailer',    'char', 'NULL',       1,  '', '', 
3548         'acct_def_cgp_archiveafter',       'int', 'NULL',      '',  '', '',
3549         #preferences
3550         'acct_def_cgp_deletemode',     'varchar', 'NULL', $char_d,  '', '',
3551         'acct_def_cgp_emptytrash',     'varchar', 'NULL', $char_d,  '', '',
3552         'acct_def_cgp_language',       'varchar', 'NULL', $char_d,  '', '',
3553         'acct_def_cgp_timezone',       'varchar', 'NULL', $char_d,  '', '',
3554         'acct_def_cgp_skinname',       'varchar', 'NULL', $char_d,  '', '',
3555         'acct_def_cgp_prontoskinname', 'varchar', 'NULL', $char_d,  '', '',
3556         'acct_def_cgp_sendmdnmode',    'varchar', 'NULL', $char_d,  '', '',
3557       ],
3558       'primary_key'  => 'svcnum',
3559       'unique'       => [],
3560       'index'        => [ ['domain'] ],
3561       'foreign_keys' => [
3562                           { columns    => [ 'svcnum' ],
3563                             table      => 'cust_svc',
3564                           },
3565                           { columns    => [ 'catchall' ],
3566                             table      => 'svc_acct',
3567                             references => [ 'svcnum' ],
3568                           },
3569                           { columns    => [ 'parent_svcnum' ],
3570                             table      => 'cust_svc',
3571                             references => [ 'svcnum' ],
3572                           },
3573                           { columns    => [ 'registrarnum' ],
3574                             table      => 'registrar',
3575                           },
3576                         ],
3577     },
3578
3579     'svc_dsl' => {
3580       'columns' => [
3581         'svcnum',                    'int',    '',        '', '', '',
3582         'pushed',                    'int', 'NULL',       '', '', '',
3583         'desired_due_date',          'int', 'NULL',       '', '', '',
3584         'due_date',                  'int', 'NULL',       '', '', '',
3585         'vendor_order_id',       'varchar', 'NULL', $char_d,  '', '',
3586         'vendor_qual_id',        'varchar', 'NULL', $char_d,  '', '',
3587         'vendor_order_type',     'varchar', 'NULL', $char_d,  '', '',
3588         'vendor_order_status',   'varchar', 'NULL', $char_d,  '', '',
3589         'first',                 'varchar', 'NULL', $char_d,  '', '',
3590         'last',                  'varchar', 'NULL', $char_d,  '', '',
3591         'company',               'varchar', 'NULL', $char_d,  '', '',
3592         'phonenum',              'varchar', 'NULL',      24, '', '',
3593         'gateway_access_number', 'varchar', 'NULL',      24, '', '',
3594         'loop_type',                'char', 'NULL',       1, '', '', 
3595         'local_voice_provider',  'varchar', 'NULL', $char_d, '', '',
3596         'circuitnum',            'varchar', 'NULL', $char_d, '', '',
3597         'rate_band',             'varchar', 'NULL', $char_d, '', '',
3598         'vpi',                       'int', 'NULL',      '', '', '',
3599         'vci',                       'int', 'NULL',      '', '', '',
3600         'isp_chg',                  'char', 'NULL',       1, '', '', 
3601         'isp_prev',              'varchar', 'NULL', $char_d, '', '',
3602         'username',              'varchar', 'NULL', $char_d, '', '',
3603         'password',              'varchar', 'NULL', $char_d, '', '',
3604         'staticips',                'text', 'NULL',      '', '', '',
3605         'monitored',                'char', 'NULL',       1, '', '', 
3606         'last_pull',                 'int', 'NULL',      '', '', '',
3607       ],
3608       'primary_key'  => 'svcnum',
3609       'unique'       => [ ],
3610       'index'        => [ ['phonenum'], ['vendor_order_id'] ],
3611       'foreign_keys' => [
3612                           { columns    => [ 'svcnum' ],
3613                             table      => 'cust_svc',
3614                           },
3615                         ],
3616     },
3617
3618     'dsl_device' => {
3619       'columns' => [
3620         'devicenum', 'serial',     '', '', '', '',
3621         #part_device?  or our own part_dsl_device?
3622         #'devicepart',   'int',     '', '', '', '',
3623         'svcnum',       'int',     '', '', '', '', 
3624         'mac_addr', 'varchar',     '', 12, '', '', 
3625       ],
3626       'primary_key'  => 'devicenum',
3627       'unique'       => [ [ 'mac_addr' ], ],
3628       'index'        => [ [ 'svcnum' ], ], # [ 'devicepart' ] ],
3629       'foreign_keys' => [
3630                           { columns    => [ 'svcnum' ],
3631                             table      => 'svc_dsl',
3632                           },
3633                         ],
3634     },
3635
3636     'dsl_note' => {
3637       'columns' => [
3638         'notenum',           'serial',    '',        '', '', '',
3639         'svcnum',     'int', '',       '', '', '',
3640         'author',     'varchar', 'NULL', $char_d,  '', '',
3641         'priority',   'char', 'NULL',       1,  '', '', 
3642         '_date',     'int', 'NULL',       '', '', '',
3643         'note',     'text', '',       '', '', '',
3644       ],
3645       'primary_key'  => 'notenum',
3646       'unique'       => [],
3647       'index'        => [ ['svcnum'] ],
3648       'foreign_keys' => [
3649                           { columns    => [ 'svcnum' ],
3650                             table      => 'svc_dsl',
3651                           },
3652                         ],
3653     },
3654
3655     'svc_dish' => {
3656       'columns' => [
3657         'svcnum',   'int',     '',     '', '', '',
3658         'acctnum',  'varchar', '',     16, '', '',
3659         'installdate', @date_type,         '', '', 
3660         'note',     'text',    'NULL', '', '', '',
3661       ],
3662       'primary_key'  => 'svcnum',
3663       'unique'       => [],
3664       'index'        => [],
3665       'foreign_keys' => [
3666                           { columns    => [ 'svcnum' ],
3667                             table      => 'cust_svc',
3668                           },
3669                         ],
3670     },
3671
3672     'svc_hardware' => {
3673       'columns' => [
3674         'svcnum',   'int',     '',          '', '', '',
3675         'typenum',  'int',     '',          '', '', '',
3676         'serial',   'varchar', 'NULL', $char_d, '', '',
3677         'ip_addr',  'varchar', 'NULL',      40, '', '',
3678         'hw_addr',  'varchar', 'NULL',      12, '', '',
3679         'smartcard','varchar', 'NULL',      30, '', '',
3680         'statusnum','int',     'NULL',      '', '', '',
3681         'note',     'text',    'NULL',      '', '', '',
3682       ],
3683       'primary_key'  => 'svcnum',
3684       'unique'       => [],
3685       'index'        => [],
3686       'foreign_keys' => [
3687                           { columns    => [ 'svcnum' ],
3688                             table      => 'cust_svc',
3689                           },
3690                           { columns    => [ 'typenum' ],
3691                             table      => 'hardware_type',
3692                           },
3693                           { columns    => [ 'statusnum' ],
3694                             table      => 'hardware_status',
3695                           },
3696                         ],
3697     },
3698
3699     'hardware_class' => {
3700       'columns' => [
3701         'classnum',   'serial', '',      '', '', '',
3702         'classname', 'varchar', '', $char_d, '', '',
3703       ],
3704       'primary_key' => 'classnum',
3705       'unique' => [],
3706       'index'  => [],
3707     },
3708
3709     'hardware_type' => {
3710       'columns' => [
3711         'typenum',  'serial',     '',      '', '', '',
3712         'classnum',    'int',     '',      '', '', '',
3713         'model',   'varchar',     '', $char_d, '', '',
3714         'revision','varchar', 'NULL', $char_d, '', '',
3715       ],
3716       'primary_key'  => 'typenum',
3717       'unique'       => [ [ 'classnum', 'model', 'revision' ] ],
3718       'index'        => [],
3719       'foreign_keys' => [
3720                           { columns    => [ 'classnum' ],
3721                             table      => 'hardware_class',
3722                           },
3723                         ],
3724     },
3725
3726     'hardware_status' => {
3727       'columns' => [
3728         'statusnum', 'serial', '',      '', '', '',
3729         'label'    ,'varchar', '', $char_d, '', '',
3730         'disabled',    'char', 'NULL',   1, '', '', 
3731       ],
3732       'primary_key' => 'statusnum',
3733       'unique' => [],
3734       'index'  => [],
3735     },
3736
3737     'domain_record' => {
3738       'columns' => [
3739         'recnum',    'serial',     '',  '', '', '', 
3740         'svcnum',    'int',     '',  '', '', '', 
3741         'reczone',   'varchar', '',  255, '', '', 
3742         'recaf',     'char',    '',  2, '', '', 
3743         'rectype',   'varchar',    '',  5, '', '', 
3744         'recdata',   'varchar', '',  255, '', '', 
3745         'ttl',       'int',     'NULL', '', '', '',
3746       ],
3747       'primary_key'  => 'recnum',
3748       'unique'       => [],
3749       'index'        => [ ['svcnum'] ],
3750       'foreign_keys' => [
3751                           { columns    => [ 'svcnum' ],
3752                             table      => 'svc_domain',
3753                           },
3754                         ],
3755     },
3756
3757     'registrar' => {
3758       'columns' => [
3759         'registrarnum',   'serial', '',      '', '', '',
3760         'registrarname', 'varchar', '', $char_d, '', '',
3761       ],
3762       'primary_key' => 'registrarnum',
3763       'unique'      => [],
3764       'index'       => [],
3765     },
3766
3767     'cgp_rule' => {
3768       'columns' => [
3769         'rulenum',  'serial',     '',      '', '', '',
3770         'name',    'varchar',     '', $char_d, '', '',
3771         'comment', 'varchar', 'NULL', $char_d, '', '',
3772         'svcnum',      'int',     '',      '', '', '',
3773         'priority',    'int',     '',      '', '', '',
3774       ],
3775       'primary_key' => 'rulenum',
3776       'unique'      => [ [ 'svcnum', 'name' ] ],
3777       'index'       => [ [ 'svcnum' ] ],
3778       'foreign_keys' => [
3779                           { columns    => [ 'svcnum' ],
3780                             table      => 'cust_svc', #svc_acct / svc_domain
3781                           },
3782                         ],
3783     },
3784
3785     'cgp_rule_condition' => {
3786       'columns' => [
3787         'ruleconditionnum',  'serial',     '',      '', '', '',
3788         'conditionname',    'varchar',     '', $char_d, '', '',
3789         'op',               'varchar', 'NULL', $char_d, '', '',
3790         'params',           'varchar', 'NULL',     255, '', '',
3791         'rulenum',              'int',     '',      '', '', '',
3792       ],
3793       'primary_key'  => 'ruleconditionnum',
3794       'unique'       => [],
3795       'index'        => [ [ 'rulenum' ] ],
3796       'foreign_keys' => [
3797                           { columns    => [ 'rulenum' ],
3798                             table      => 'cgp_rule',
3799                           },
3800                         ],
3801     },
3802
3803     'cgp_rule_action' => {
3804        'columns' => [
3805         'ruleactionnum',  'serial',     '',      '', '', '',
3806         'action',        'varchar',     '', $char_d, '', '',
3807         'params',        'varchar', 'NULL',     255, '', '',
3808         'rulenum',           'int',     '',      '', '', '',
3809       ],
3810       'primary_key'  => 'ruleactionnum',
3811       'unique'       => [],
3812       'index'        => [ [ 'rulenum' ] ],
3813       'foreign_keys' => [
3814                           { columns    => [ 'rulenum' ],
3815                             table      => 'cgp_rule',
3816                           },
3817                         ],
3818    },
3819
3820     'svc_forward' => {
3821       'columns' => [
3822         'svcnum',   'int',            '',   '', '', '', 
3823         'srcsvc',   'int',        'NULL',   '', '', '', 
3824         'src',      'varchar',    'NULL',  255, '', '', 
3825         'dstsvc',   'int',        'NULL',   '', '', '', 
3826         'dst',      'varchar',    'NULL',  255, '', '', 
3827       ],
3828       'primary_key'  => 'svcnum',
3829       'unique'       => [],
3830       'index'        => [ ['srcsvc'], ['dstsvc'] ],
3831       'foreign_keys' => [
3832                           { columns    => [ 'svcnum' ],
3833                             table      => 'cust_svc',
3834                           },
3835                           { columns    => [ 'srcsvc' ],
3836                             table      => 'svc_acct',
3837                             references => [ 'svcnum' ]
3838                           },
3839                           { columns    => [ 'dstsvc' ],
3840                             table      => 'svc_acct',
3841                             references => [ 'svcnum' ]
3842                           },
3843                         ],
3844     },
3845
3846     'svc_www' => {
3847       'columns' => [
3848         'svcnum',   'int',      '',  '', '', '', 
3849         'recnum',   'int',      '',  '', '', '', 
3850         'usersvc',  'int',  'NULL',  '', '', '', 
3851         'config',   'text', 'NULL',  '', '', '', 
3852       ],
3853       'primary_key' => 'svcnum',
3854       'unique'      => [],
3855       'index'       => [],
3856       'foreign_keys' => [
3857                           { columns    => [ 'svcnum' ],
3858                             table      => 'cust_svc',
3859                           },
3860                           { columns    => [ 'recnum' ],
3861                             table      => 'domain_record',
3862                           },
3863                           { columns    => [ 'usersvc' ],
3864                             table      => 'svc_acct',
3865                             references => [ 'svcnum' ]
3866                           },
3867                         ],
3868     },
3869
3870     #'svc_wo' => {
3871     #  'columns' => [
3872     #    'svcnum',    'int',    '',   '',
3873     #    'svcnum',    'int',    '',   '',
3874     #    'svcnum',    'int',    '',   '',
3875     #    'worker',    'varchar',   '',   $char_d,
3876     #    '_date',     @date_type,
3877     #  ],
3878     #  'primary_key' => 'svcnum',
3879     #  'unique' => [ [] ],
3880     #  'index' => [ [] ],
3881     #},
3882
3883     'prepay_credit' => {
3884       'columns' => [
3885         'prepaynum',   'serial',     '',   '', '', '', 
3886         'identifier',  'varchar', '', $char_d, '', '', 
3887         'amount',      @money_type, '', '', 
3888         'seconds',     'int',     'NULL', '', '', '', 
3889         'upbytes',     'bigint',     'NULL', '', '', '', 
3890         'downbytes',   'bigint',     'NULL', '', '', '', 
3891         'totalbytes',  'bigint',     'NULL', '', '', '', 
3892         'agentnum',    'int',     'NULL', '', '', '', 
3893       ],
3894       'primary_key'  => 'prepaynum',
3895       'unique'       => [ ['identifier'] ],
3896       'index'        => [],
3897       'foreign_keys' => [
3898                           { columns    => [ 'agentnum' ],
3899                             table      => 'agent',
3900                           },
3901                         ],
3902     },
3903
3904     'port' => {
3905       'columns' => [
3906         'portnum',  'serial',     '',   '', '', '', 
3907         'ip',       'varchar', 'NULL', 15, '', '', 
3908         'nasport',  'int',     'NULL', '', '', '', 
3909         'nasnum',   'int',     '',   '', '', '', 
3910       ],
3911       'primary_key'  => 'portnum',
3912       'unique'       => [],
3913       'index'        => [],
3914       'foreign_keys' => [
3915                           { columns    => [ 'nasnum' ],
3916                             table      => 'nas',
3917                           },
3918                         ],
3919     },
3920
3921     'nas' => {
3922       'columns' => [
3923         'nasnum',       'serial',     '',  '',              '', '', 
3924         'nasname',     'varchar',     '', 128,              '', '',
3925         'shortname',   'varchar', 'NULL',  32,              '', '',
3926         'type',        'varchar',     '',  30,         'other', '',
3927         'ports',           'int', 'NULL',  '',              '', '',
3928         'secret',      'varchar',     '',  60,        'secret', '',
3929         'server',      'varchar', 'NULL',  64,              '', '',
3930         'community',   'varchar', 'NULL',  50,              '', '',
3931         'description', 'varchar',     '', 200, 'RADIUS Client', '',
3932         'svcnum',          'int', 'NULL',  '',              '', '',
3933       ],
3934       'primary_key'  => 'nasnum',
3935       'unique'       => [ [ 'nasname' ], ],
3936       'index'        => [],
3937       'foreign_keys' => [
3938                           { columns    => [ 'svcnum' ],
3939                             table      => 'svc_broadband',#no? could be _acct?
3940                                                           #remove or cust_svc?
3941                           },
3942                         ],
3943     },
3944
3945     'export_nas' => {
3946       'columns' => [
3947         'exportnasnum', 'serial', '', '', '', '', 
3948         'exportnum',       'int', '', '', '', '', 
3949         'nasnum',          'int', '', '', '', '', 
3950       ],
3951       'primary_key'  => 'exportnasnum',
3952       'unique'       => [ [ 'exportnum', 'nasnum' ] ],
3953       'index'        => [ [ 'exportnum' ], [ 'nasnum' ] ],
3954       'foreign_keys' => [
3955                           { columns    => [ 'exportnum' ],
3956                             table      => 'part_export',
3957                           },
3958                           { columns    => [ 'nasnum' ],
3959                             table      => 'nas',
3960                           },
3961                         ],
3962     },
3963
3964     'queue' => {
3965       'columns' => [
3966         'jobnum',   'bigserial',     '',      '', '', '', 
3967         'job',        'varchar',     '',     512, '', '', 
3968         '_date',          'int',     '',      '', '', '', 
3969         'status',     'varchar',     '', $char_d, '', '', 
3970         'statustext',    'text', 'NULL',      '', '', '', 
3971         'svcnum',         'int', 'NULL',      '', '', '', 
3972         'custnum',        'int', 'NULL',      '', '', '',
3973         'secure',        'char', 'NULL',       1, '', '',
3974         'priority',       'int', 'NULL',      '', '', '',
3975       ],
3976       'primary_key'  => 'jobnum',
3977       'unique'       => [],
3978       'index'        => [ [ 'secure' ], [ 'priority' ],
3979                           [ 'job' ], [ 'svcnum' ], [ 'custnum' ], [ 'status' ],
3980                         ],
3981       'foreign_keys' => [
3982                           { columns    => [ 'svcnum' ],
3983                             table      => 'cust_svc',
3984                           },
3985                           { columns    => [ 'custnum' ],
3986                             table      => 'cust_main',
3987                           },
3988                         ],
3989     },
3990
3991     'queue_arg' => {
3992       'columns' => [
3993         'argnum', 'bigserial',     '', '', '', '', 
3994         'jobnum',    'bigint',     '', '', '', '', 
3995         'frozen',      'char', 'NULL',  1, '', '',
3996         'arg',         'text', 'NULL', '', '', '', 
3997       ],
3998       'primary_key'  => 'argnum',
3999       'unique'       => [],
4000       'index'        => [ [ 'jobnum' ] ],
4001       'foreign_keys' => [
4002                           { columns    => [ 'jobnum' ],
4003                             table      => 'queue',
4004                             on_delete  => 'CASCADE',
4005                           },
4006                         ],
4007     },
4008
4009     'queue_depend' => {
4010       'columns' => [
4011         'dependnum',  'bigserial', '', '', '', '', 
4012         'jobnum',        'bigint', '', '', '', '', 
4013         'depend_jobnum', 'bigint', '', '', '', '', 
4014       ],
4015       'primary_key'  => 'dependnum',
4016       'unique'       => [],
4017       'index'        => [ [ 'jobnum' ], [ 'depend_jobnum' ] ],
4018       'foreign_keys' => [
4019                           { columns    => [ 'jobnum' ],
4020                             table      => 'queue',
4021                           },
4022                           { columns    => [ 'depend_jobnum' ],
4023                             table      => 'queue',
4024                             references => [ 'jobnum' ],
4025                             on_delete  => 'CASCADE',
4026                           },
4027                         ],
4028     },
4029
4030     'export_svc' => {
4031       'columns' => [
4032         'exportsvcnum' => 'serial', '', '', '', '', 
4033         'exportnum'    => 'int', '', '', '', '', 
4034         'svcpart'      => 'int', '', '', '', '', 
4035       ],
4036       'primary_key'  => 'exportsvcnum',
4037       'unique'       => [ [ 'exportnum', 'svcpart' ] ],
4038       'index'        => [ [ 'exportnum' ], [ 'svcpart' ] ],
4039       'foreign_keys' => [
4040                           { columns    => [ 'exportnum' ],
4041                             table      => 'part_export',
4042                           },
4043                           { columns    => [ 'svcpart' ],
4044                             table      => 'part_svc',
4045                           },
4046                         ],
4047     },
4048
4049     'export_device' => {
4050       'columns' => [
4051         'exportdevicenum' => 'serial', '', '', '', '', 
4052         'exportnum'       => 'int', '', '', '', '', 
4053         'devicepart'      => 'int', '', '', '', '', 
4054       ],
4055       'primary_key'  => 'exportdevicenum',
4056       'unique'       => [ [ 'exportnum', 'devicepart' ] ],
4057       'index'        => [ [ 'exportnum' ], [ 'devicepart' ] ],
4058       'foreign_keys' => [
4059                           { columns    => [ 'exportnum' ],
4060                             table      => 'part_export',
4061                           },
4062                           { columns    => [ 'devicepart' ],
4063                             table      => 'part_device',
4064                           },
4065                         ],
4066     },
4067
4068     'part_export' => {
4069       'columns' => [
4070         'exportnum',   'serial',     '',      '', '', '', 
4071         'exportname', 'varchar', 'NULL', $char_d, '', '',
4072         'machine',    'varchar', 'NULL', $char_d, '', '',
4073         'exporttype', 'varchar',     '', $char_d, '', '', 
4074         'nodomain',      'char', 'NULL',       1, '', '', 
4075         'default_machine','int', 'NULL',      '', '', '',
4076       ],
4077       'primary_key'  => 'exportnum',
4078       'unique'       => [],
4079       'index'        => [ [ 'machine' ], [ 'exporttype' ] ],
4080       'foreign_keys' => [
4081                           { columns    => [ 'default_machine' ],
4082                             table      => 'part_export_machine',
4083                             references => [ 'machinenum' ]
4084                           },
4085                         ],
4086     },
4087
4088     'part_export_option' => {
4089       'columns' => [
4090         'optionnum', 'serial', '', '', '', '', 
4091         'exportnum', 'int', '', '', '', '', 
4092         'optionname', 'varchar', '', $char_d, '', '', 
4093         'optionvalue', 'text', 'NULL', '', '', '', 
4094       ],
4095       'primary_key'  => 'optionnum',
4096       'unique'       => [],
4097       'index'        => [ [ 'exportnum' ], [ 'optionname' ] ],
4098       'foreign_keys' => [
4099                           { columns    => [ 'exportnum' ],
4100                             table      => 'part_export',
4101                           },
4102                         ],
4103     },
4104
4105     'radius_usergroup' => {
4106       'columns' => [
4107         'usergroupnum', 'serial', '', '', '', '', 
4108         'svcnum',       'int', '', '', '', '', 
4109         'groupname',    'varchar', 'NULL', $char_d, '', '', #deprecated
4110         'groupnum',     'int', 'NULL', '', '', '', 
4111       ],
4112       'primary_key'  => 'usergroupnum',
4113       'unique'       => [],
4114       'index'        => [ [ 'svcnum' ], [ 'groupname' ] ],
4115       'foreign_keys' => [
4116                           { columns    => [ 'svcnum' ],
4117                             table      => 'cust_svc', #svc_acct / svc_broadband
4118                           },
4119                           { columns    => [ 'groupnum' ],
4120                             table      => 'radius_group',
4121                           },
4122                         ],
4123     },
4124
4125     'radius_group' => {
4126       'columns' => [
4127         'groupnum', 'serial', '', '', '', '', 
4128         'groupname',    'varchar', '', $char_d, '', '', 
4129         'description',  'varchar', 'NULL', $char_d, '', '', 
4130         'priority', 'int', '', '', '1', '',
4131         'speed_up', 'int', 'NULL', '', '', '',
4132         'speed_down', 'int', 'NULL', '', '', '',
4133       ],
4134       'primary_key' => 'groupnum',
4135       'unique'      => [ ['groupname'] ],
4136       'index'       => [],
4137     },
4138
4139     'radius_attr' => {
4140       'columns' => [
4141         'attrnum',   'serial', '',      '', '', '',
4142         'groupnum',     'int', '',      '', '', '',
4143         'attrname', 'varchar', '', $char_d, '', '',
4144         'value',    'varchar', '',     255, '', '',
4145         'attrtype',    'char', '',       1, '', '',
4146         'op',          'char', '',       2, '', '',
4147       ],
4148       'primary_key'  => 'attrnum',
4149       'unique'       => [],
4150       'index'        => [ ['groupnum'], ],
4151       'foreign_keys' => [
4152                           { columns    => [ 'groupnum' ],
4153                             table      => 'radius_group',
4154                           },
4155                         ],
4156     },
4157
4158     'msgcat' => {
4159       'columns' => [
4160         'msgnum', 'serial', '', '', '', '', 
4161         'msgcode', 'varchar', '', 255, '', '', 
4162         'locale', 'varchar', '', 16, '', '', 
4163         'msg', 'text', '', '', '', '', 
4164       ],
4165       'primary_key' => 'msgnum',
4166       'unique'      => [ [ 'msgcode', 'locale' ] ],
4167       'index'       => [],
4168     },
4169
4170     'cust_tax_exempt' => {
4171       'columns' => [
4172         'exemptnum', 'serial', '', '', '', '', 
4173         'custnum',   'int', '', '', '', '', 
4174         'taxnum',    'int', '', '', '', '', 
4175         'year',      'int', '', '', '', '', 
4176         'month',     'int', '', '', '', '', 
4177         'amount',   @money_type, '', '', 
4178       ],
4179       'primary_key'  => 'exemptnum',
4180       'unique'       => [ [ 'custnum', 'taxnum', 'year', 'month' ] ],
4181       'index'        => [],
4182       'foreign_keys' => [
4183                           { columns    => [ 'custnum' ],
4184                             table      => 'cust_main',
4185                           },
4186                           { columns    => [ 'taxnum' ],
4187                             table      => 'cust_main_county',
4188                           },
4189                         ],
4190     },
4191
4192     'cust_tax_exempt_pkg' => {
4193       'columns' => [
4194         'exemptpkgnum',  'serial', '', '', '', '', 
4195         #'custnum',      'int', '', '', '', ''
4196         'billpkgnum',   'int', '', '', '', '', 
4197         'taxnum',       'int', '', '', '', '', 
4198         'year',         'int', 'NULL', '', '', '', 
4199         'month',        'int', 'NULL', '', '', '', 
4200         'creditbillpkgnum', 'int', 'NULL', '', '', '',
4201         'amount',       @money_type, '', '', 
4202         # exemption type flags
4203         'exempt_cust',          'char', 'NULL', 1, '', '',
4204         'exempt_setup',         'char', 'NULL', 1, '', '',
4205         'exempt_recur',         'char', 'NULL', 1, '', '',
4206         'exempt_cust_taxname',  'char', 'NULL', 1, '', '',
4207         'exempt_monthly',       'char', 'NULL', 1, '', '',
4208       ],
4209       'primary_key'  => 'exemptpkgnum',
4210       'unique'       => [],
4211       'index'        => [ [ 'taxnum', 'year', 'month' ],
4212                           [ 'billpkgnum' ],
4213                           [ 'taxnum' ],
4214                           [ 'creditbillpkgnum' ],
4215                         ],
4216       'foreign_keys' => [
4217                           { columns    => [ 'billpkgnum' ],
4218                             table      => 'cust_bill_pkg',
4219                           },
4220                           { columns    => [ 'taxnum' ],
4221                             table      => 'cust_main_county',
4222                           },
4223                           { columns    => [ 'creditbillpkgnum' ],
4224                             table      => 'cust_credit_bill_pkg',
4225                           },
4226                         ],
4227     },
4228
4229     'cust_tax_exempt_pkg_void' => {
4230       'columns' => [
4231         'exemptpkgnum',  'int', '', '', '', '', 
4232         #'custnum',      'int', '', '', '', ''
4233         'billpkgnum',   'int', '', '', '', '', 
4234         'taxnum',       'int', '', '', '', '', 
4235         'year',         'int', 'NULL', '', '', '', 
4236         'month',        'int', 'NULL', '', '', '', 
4237         'creditbillpkgnum', 'int', 'NULL', '', '', '',
4238         'amount',       @money_type, '', '', 
4239         # exemption type flags
4240         'exempt_cust',          'char', 'NULL', 1, '', '',
4241         'exempt_setup',         'char', 'NULL', 1, '', '',
4242         'exempt_recur',         'char', 'NULL', 1, '', '',
4243         'exempt_cust_taxname',  'char', 'NULL', 1, '', '',
4244         'exempt_monthly',       'char', 'NULL', 1, '', '',
4245       ],
4246       'primary_key'  => 'exemptpkgnum',
4247       'unique'       => [],
4248       'index'        => [ [ 'taxnum', 'year', 'month' ],
4249                           [ 'billpkgnum' ],
4250                           [ 'taxnum' ],
4251                           [ 'creditbillpkgnum' ],
4252                         ],
4253       'foreign_keys' => [
4254                           { columns    => [ 'billpkgnum' ],
4255                             table      => 'cust_bill_pkg_void',
4256                           },
4257                           { columns    => [ 'taxnum' ],
4258                             table      => 'cust_main_county',
4259                           },
4260                           { columns    => [ 'creditbillpkgnum' ],
4261                             table      => 'cust_credit_bill_pkg',
4262                           },
4263                         ],
4264     },
4265
4266     'router' => {
4267       'columns' => [
4268         'routernum', 'serial', '', '', '', '', 
4269         'routername', 'varchar', '', $char_d, '', '', 
4270         'svcnum', 'int', 'NULL', '', '', '', 
4271         'agentnum',   'int', 'NULL', '', '', '', 
4272         'manual_addr', 'char', 'NULL', 1, '', '',
4273       ],
4274       'primary_key'  => 'routernum',
4275       'unique'       => [],
4276       'index'        => [],
4277       'foreign_keys' => [
4278                           { columns    => [ 'svcnum' ],
4279                             table      => 'cust_svc', #svc_acct / svc_broadband
4280                           },
4281                           { columns    => [ 'agentnum' ],
4282                             table      => 'agent',
4283                           },
4284                         ],
4285     },
4286
4287     'part_svc_router' => {
4288       'columns' => [
4289         'svcrouternum', 'serial', '', '', '', '', 
4290         'svcpart', 'int', '', '', '', '', 
4291         'routernum', 'int', '', '', '', '', 
4292       ],
4293       'primary_key'  => 'svcrouternum',
4294       'unique'       => [],
4295       'index'        => [],
4296       'foreign_keys' => [
4297                           { columns    => [ 'svcpart' ],
4298                             table      => 'part_svc',
4299                           },
4300                           { columns    => [ 'routernum' ],
4301                             table      => 'router',
4302                           },
4303                         ],
4304     },
4305
4306     'addr_block' => {
4307       'columns' => [
4308         'blocknum', 'serial', '', '', '', '', 
4309         'routernum', 'int', '', '', '', '', 
4310         'ip_gateway', 'varchar', '', 15, '', '', 
4311         'ip_netmask', 'int', '', '', '', '', 
4312         'agentnum',   'int', 'NULL', '', '', '', 
4313         'manual_flag', 'char', 'NULL', 1, '', '', 
4314       ],
4315       'primary_key'  => 'blocknum',
4316       'unique'       => [ [ 'blocknum', 'routernum' ] ],
4317       'index'        => [],
4318       'foreign_keys' => [
4319                           { columns    => [ 'routernum' ],
4320                             table      => 'router',
4321                           },
4322                           { columns    => [ 'agentnum' ],
4323                             table      => 'agent',
4324                           },
4325                         ],
4326     },
4327
4328     'addr_range' => {
4329       'columns' => [
4330         'rangenum', 'serial', '', '', '', '',
4331         'start',    'varchar', '', 15, '', '',
4332         'length',   'int', '', '', '', '',
4333         'status',   'varchar', 'NULL', 32, '', '',
4334       ],
4335       'primary_key' => 'rangenum',
4336       'unique'      => [],
4337       'index'       => [],
4338     },
4339
4340     'svc_broadband' => {
4341       'columns' => [
4342         'svcnum',                  'int',     '',        '', '', '', 
4343         'description',         'varchar', 'NULL',   $char_d, '', '', 
4344         'routernum',               'int', 'NULL',        '', '', '',
4345         'blocknum',                'int', 'NULL',        '', '', '', 
4346         'sectornum',               'int', 'NULL',        '', '', '',
4347         'speed_up',                'int', 'NULL',        '', '', '', 
4348         'speed_down',              'int', 'NULL',        '', '', '', 
4349         'ip_addr',             'varchar', 'NULL',        15, '', '', 
4350         'mac_addr',            'varchar', 'NULL',        12, '', '', 
4351         'authkey',             'varchar', 'NULL',        32, '', '', 
4352         'latitude',            'decimal', 'NULL',    '10,7', '', '', 
4353         'longitude',           'decimal', 'NULL',    '10,7', '', '', 
4354         'altitude',            'decimal', 'NULL',        '', '', '', 
4355         'vlan_profile',        'varchar', 'NULL',   $char_d, '', '', 
4356         'performance_profile', 'varchar', 'NULL',   $char_d, '', '',
4357         'plan_id',             'varchar', 'NULL',   $char_d, '', '',
4358         'radio_serialnum',     'varchar', 'NULL',   $char_d, '', '',
4359         'radio_location',      'varchar', 'NULL', 2*$char_d, '', '',
4360         'poe_location',        'varchar', 'NULL', 2*$char_d, '', '',
4361         'rssi',                    'int', 'NULL',        '', '', '',
4362         'suid',                    'int', 'NULL',        '', '', '',
4363         'shared_svcnum',           'int', 'NULL',        '', '', '',
4364       ],
4365       'primary_key'  => 'svcnum',
4366       'unique'       => [ [ 'ip_addr' ], [ 'mac_addr' ] ],
4367       'index'        => [],
4368       'foreign_keys' => [
4369                           { columns    => [ 'svcnum' ],
4370                             table      => 'cust_svc',
4371                           },
4372                           { columns    => [ 'routernum' ],
4373                             table      => 'router',
4374                           },
4375                           { columns    => [ 'blocknum' ],
4376                             table      => 'addr_block',
4377                           },
4378                           { columns    => [ 'sectornum' ],
4379                             table      => 'tower_sector',
4380                           },
4381                           { columns    => [ 'shared_svcnum' ],
4382                             table      => 'svc_broadband',
4383                             references => [ 'svcnum' ],
4384                           },
4385                         ],
4386     },
4387
4388     'tower' => {
4389       'columns' => [
4390         'towernum',    'serial',     '',      '', '', '',
4391         #'agentnum',       'int', 'NULL',      '', '', '',
4392         'towername',  'varchar',     '', $char_d, '', '',
4393         'disabled',      'char', 'NULL',       1, '', '',
4394         'latitude',   'decimal', 'NULL',  '10,7', '', '', 
4395         'longitude',  'decimal', 'NULL',  '10,7', '', '', 
4396         'coord_auto',    'char', 'NULL',       1, '', '',
4397         'altitude',   'decimal', 'NULL',      '', '', '', 
4398         'height',     'decimal', 'NULL',      '', '', '', 
4399         'veg_height', 'decimal', 'NULL',      '', '', '', 
4400         'color',      'varchar', 'NULL',       6, '', '',
4401       ],
4402       'primary_key' => 'towernum',
4403       'unique'      => [ [ 'towername' ] ], # , 'agentnum' ] ],
4404       'index'       => [],
4405     },
4406
4407     'tower_sector' => {
4408       'columns' => [
4409         'sectornum',   'serial',     '',      '', '', '',
4410         'towernum',       'int',     '',      '', '', '',
4411         'sectorname', 'varchar',     '', $char_d, '', '',
4412         'ip_addr',    'varchar', 'NULL',      15, '', '',
4413         'height',     'decimal', 'NULL',      '', '', '', 
4414         'freq_mhz',       'int', 'NULL',      '', '', '',
4415         'direction',      'int', 'NULL',      '', '', '',
4416         'width',          'int', 'NULL',      '', '', '',
4417         #downtilt etc? rfpath has profile files for devices/antennas you upload?
4418         'range',      'decimal', 'NULL',      '', '', '',  #?
4419       ],
4420       'primary_key'  => 'sectornum',
4421       'unique'       => [ [ 'towernum', 'sectorname' ], [ 'ip_addr' ], ],
4422       'index'        => [ [ 'towernum' ] ],
4423       'foreign_keys' => [
4424                           { columns    => [ 'towernum' ],
4425                             table      => 'tower',
4426                           },
4427                         ],
4428     },
4429
4430     'part_virtual_field' => {
4431       'columns' => [
4432         'vfieldpart', 'serial', '', '', '', '', 
4433         'dbtable', 'varchar', '', 32, '', '', 
4434         'name', 'varchar', '', 32, '', '', 
4435         'length', 'int', 'NULL', '', '', '', 
4436         'label', 'varchar', 'NULL', 80, '', '', 
4437       ],
4438       'primary_key' => 'vfieldpart',
4439       'unique' => [],
4440       'index' => [],
4441     },
4442
4443     'virtual_field' => {
4444       'columns' => [
4445         'vfieldnum', 'serial', '', '', '', '', 
4446         'recnum', 'int', '', '', '', '', 
4447         'vfieldpart', 'int', '', '', '', '', 
4448         'value', 'varchar', '', 128, '', '', 
4449       ],
4450       'primary_key'  => 'vfieldnum',
4451       'unique'       => [ [ 'vfieldpart', 'recnum' ] ],
4452       'index'        => [],
4453       'foreign_keys' => [
4454                           { columns    => [ 'vfieldpart' ],
4455                             table      => 'part_virtual_field',
4456                           },
4457                         ],
4458     },
4459
4460     'acct_snarf' => {
4461       'columns' => [
4462         'snarfnum',    'serial',     '',      '', '', '', 
4463         'snarfname',  'varchar', 'NULL', $char_d, '', '', 
4464         'svcnum',         'int',     '',      '', '', '', 
4465         'machine',    'varchar',     '',     255, '', '', 
4466         'protocol',   'varchar',     '', $char_d, '', '', 
4467         'username',   'varchar',     '', $char_d, '', '', 
4468         '_password',  'varchar',     '', $char_d, '', '', 
4469         'check_freq',     'int', 'NULL',      '', '', '', 
4470         'leavemail',     'char', 'NULL',       1, '', '', 
4471         'apop',          'char', 'NULL',       1, '', '', 
4472         'tls',           'char', 'NULL',       1, '', '', 
4473         'mailbox',    'varchar', 'NULL', $char_d, '', '', 
4474       ],
4475       'primary_key'  => 'snarfnum',
4476       'unique'       => [],
4477       'index'        => [ [ 'svcnum' ] ],
4478       'foreign_keys' => [
4479                           { columns    => [ 'svcnum' ],
4480                             table      => 'svc_acct',
4481                           },
4482                         ],
4483     },
4484
4485     'svc_external' => {
4486       'columns' => [
4487         'svcnum',     'int',     '',      '', '', '', 
4488         'id',      'bigint', 'NULL',      '', '', '', 
4489         'title',  'varchar', 'NULL', $char_d, '', '', 
4490       ],
4491       'primary_key'  => 'svcnum',
4492       'unique'       => [],
4493       'index'        => [],
4494       'foreign_keys' => [
4495                           { columns    => [ 'svcnum' ],
4496                             table      => 'cust_svc',
4497                           },
4498                         ],
4499     },
4500
4501     'cust_pay_refund' => {
4502       'columns' => [
4503         'payrefundnum', 'serial', '', '', '', '', 
4504         'paynum',  'int', '', '', '', '', 
4505         'refundnum',  'int', '', '', '', '', 
4506         '_date',    @date_type, '', '', 
4507         'amount',   @money_type, '', '', 
4508       ],
4509       'primary_key'  => 'payrefundnum',
4510       'unique'       => [],
4511       'index'        => [ ['paynum'], ['refundnum'] ],
4512       'foreign_keys' => [
4513                           { columns    => [ 'paynum' ],
4514                             table      => 'cust_pay',
4515                           },
4516                           { columns    => [ 'refundnum' ],
4517                             table      => 'cust_refund',
4518                           },
4519                         ],
4520     },
4521
4522     'part_pkg_option' => {
4523       'columns' => [
4524         'optionnum', 'serial', '', '', '', '', 
4525         'pkgpart', 'int', '', '', '', '', 
4526         'optionname', 'varchar', '', $char_d, '', '', 
4527         'optionvalue', 'text', 'NULL', '', '', '', 
4528       ],
4529       'primary_key'  => 'optionnum',
4530       'unique'       => [],
4531       'index'        => [ [ 'pkgpart' ], [ 'optionname' ] ],
4532       'foreign_keys' => [
4533                           { columns    => [ 'pkgpart' ],
4534                             table      => 'part_pkg',
4535                           },
4536                         ],
4537     },
4538
4539     'part_pkg_vendor' => {
4540       'columns' => [
4541         'num', 'serial', '', '', '', '', 
4542         'pkgpart', 'int', '', '', '', '', 
4543         'exportnum', 'int', '', '', '', '', 
4544         'vendor_pkg_id', 'varchar', '', $char_d, '', '', 
4545       ],
4546       'primary_key'  => 'num',
4547       'unique'       => [ [ 'pkgpart', 'exportnum' ] ],
4548       'index'        => [ [ 'pkgpart' ] ],
4549       'foreign_keys' => [
4550                           { columns    => [ 'pkgpart' ],
4551                             table      => 'part_pkg',
4552                           },
4553                           { columns    => [ 'exportnum' ],
4554                             table      => 'part_export',
4555                           },
4556                         ],
4557     },
4558
4559     'part_pkg_report_option' => {
4560       'columns' => [
4561         'num',      'serial',   '',      '', '', '', 
4562         'name',     'varchar',  '', $char_d, '', '', 
4563         'disabled', 'char', 'NULL',       1, '', '', 
4564       ],
4565       'primary_key' => 'num',
4566       'unique' => [ [ 'name' ] ],
4567       'index' => [ [ 'disabled' ] ],
4568     },
4569
4570     'part_pkg_usage' => {
4571       'columns' => [
4572         'pkgusagepart', 'serial',   '', '', '', '',
4573         'pkgpart',  'int',      '', '', '', '',
4574         'minutes',  'int',      '', '', '', '',
4575         'priority', 'int',  'NULL', '', '', '',
4576         'shared',   'char', 'NULL',  1, '', '',
4577         'rollover', 'char', 'NULL',  1, '', '',
4578         'description',  'varchar', 'NULL', $char_d, '', '',
4579       ],
4580       'primary_key'  => 'pkgusagepart',
4581       'unique'       => [],
4582       'index'        => [ [ 'pkgpart' ] ],
4583       'foreign_keys' => [
4584                           { columns    => [ 'pkgpart' ],
4585                             table      => 'part_pkg',
4586                           },
4587                         ],
4588     },
4589
4590     'part_pkg_usage_class' => {
4591       'columns' => [
4592         'num',       'serial',  '', '', '', '',
4593         'pkgusagepart', 'int',  '', '', '', '',
4594         'classnum',     'int','NULL', '', '', '',
4595       ],
4596       'primary_key'  => 'num',
4597       'unique'       => [ [ 'pkgusagepart', 'classnum' ] ],
4598       'index'        => [],
4599       'foreign_keys' => [
4600                           { columns    => [ 'pkgusagepart' ],
4601                             table      => 'part_pkg_usage',
4602                           },
4603                           { columns    => [ 'classnum' ],
4604                             table      => 'usage_class',
4605                           },
4606                         ],
4607     },
4608
4609     'rate' => {
4610       'columns' => [
4611         'ratenum',  'serial', '', '', '', '', 
4612         'ratename', 'varchar', '', $char_d, '', '', 
4613       ],
4614       'primary_key' => 'ratenum',
4615       'unique'      => [],
4616       'index'       => [],
4617     },
4618
4619     'rate_detail' => {
4620       'columns' => [
4621         'ratedetailnum',   'serial',  '',     '',      '', '', 
4622         'ratenum',         'int',     '',     '',      '', '', 
4623         'orig_regionnum',  'int', 'NULL',     '',      '', '', 
4624         'dest_regionnum',  'int',     '',     '',      '', '', 
4625         'min_included',    'int',     '',     '',      '', '', 
4626         'conn_charge',     'decimal', '', '10,4', '0.0000', '',
4627         'conn_sec',        'int',     '',     '',      '0', '',
4628         'min_charge',      'decimal', '', '10,5',       '', '',
4629         'sec_granularity', 'int',     '',     '',       '', '', 
4630         'ratetimenum',     'int', 'NULL',     '',       '', '',
4631         'classnum',        'int', 'NULL',     '',       '', '', 
4632         'cdrtypenum',      'int', 'NULL',     '',       '', '',
4633         'region_group', 'char', 'NULL',        1,       '', '', 
4634       ],
4635       'primary_key'  => 'ratedetailnum',
4636       'unique'       => [ [ 'ratenum', 'orig_regionnum', 'dest_regionnum' ] ],
4637       'index'        => [ [ 'ratenum', 'dest_regionnum' ],
4638                           [ 'ratenum', 'ratetimenum' ]
4639                         ],
4640       'foreign_keys' => [
4641                           { columns    => [ 'ratenum' ],
4642                             table      => 'rate',
4643                           },
4644                           { columns    => [ 'orig_regionnum' ],
4645                             table      => 'rate_region',
4646                             references => [ 'regionnum' ],
4647                           },
4648                           { columns    => [ 'dest_regionnum' ],
4649                             table      => 'rate_region',
4650                             references => [ 'regionnum' ],
4651                           },
4652                           { columns    => [ 'ratetimenum' ],
4653                             table      => 'rate_time',
4654                           },
4655                           { columns    => [ 'classnum' ],
4656                             table      => 'usage_class',
4657                           },
4658                           { columns    => [ 'cdrtypenum' ],
4659                             table      => 'cdr_type',
4660                           },
4661                         ],
4662     },
4663
4664     'rate_region' => {
4665       'columns' => [
4666         'regionnum',   'serial',      '', '', '', '', 
4667         'regionname',  'varchar',     '', $char_d, '', '', 
4668         'exact_match', 'char',    'NULL',  1, '', '',
4669       ],
4670       'primary_key' => 'regionnum',
4671       'unique'      => [],
4672       'index'       => [],
4673     },
4674
4675     'rate_prefix' => {
4676       'columns' => [
4677         'prefixnum',   'serial',      '', '', '', '', 
4678         'regionnum',   'int',         '', '', '', '', 
4679         'countrycode', 'varchar',     '',  3, '', '', 
4680         'npa',         'varchar', 'NULL', 10, '', '', #actually the whole prefix
4681         'nxx',         'varchar', 'NULL',  3, '', '', #actually not used
4682         'latanum',     'int',     'NULL',      '', '', '',
4683         'state',       'char',    'NULL',       2, '', '', 
4684         'ocn',         'char',    'NULL',       4, '', '', 
4685       ],
4686       'primary_key'  => 'prefixnum',
4687       'unique'       => [],
4688       'index'        => [ [ 'countrycode' ], [ 'npa' ], [ 'regionnum' ] ],
4689       'foreign_keys' => [
4690                           { columns    => [ 'regionnum' ],
4691                             table      => 'rate_region',
4692                           },
4693                           { columns    => [ 'latanum' ],
4694                             table      => 'lata',
4695                           },
4696                         ],
4697     },
4698
4699     'rate_time' => {
4700       'columns' => [
4701         'ratetimenum', 'serial',      '',      '', '', '',
4702         'ratetimename',   'varchar',      '', $char_d, '', '',
4703       ],
4704       'primary_key' => 'ratetimenum',
4705       'unique'      => [],
4706       'index'       => [],
4707     },
4708
4709     'rate_time_interval' => {
4710       'columns' => [
4711         'intervalnum', 'serial', '', '', '', '',
4712         'stime',          'int', '', '', '', '',
4713         'etime',          'int', '', '', '', '',
4714         'ratetimenum',    'int', '', '', '', '',
4715       ],
4716       'primary_key'  => 'intervalnum',
4717       'unique'       => [],
4718       'index'        => [],
4719       'foreign_keys' => [
4720                           { columns    => [ 'ratetimenum' ],
4721                             table      => 'rate_time',
4722                           },
4723                         ],
4724      },
4725
4726     #not really part of the above rate_ stuff (used with flat rate rather than
4727     # rated billing), but could be eventually, and its a rate
4728     'rate_tier' => {
4729       'columns' => [
4730         'tiernum',   'serial', '',      '', '', '',
4731         'tiername', 'varchar', '', $char_d, '', '',
4732       ],
4733       'primary_key' => 'tiernum',
4734       'unique'      => [ [ 'tiername'], ],
4735       'index'       => [],
4736     },
4737
4738     'rate_tier_detail' => {
4739       'columns' => [
4740         'tierdetailnum', 'serial', '',     '', '', '',
4741         'tiernum',          'int', '',     '', '', '',
4742         'min_quan',         'int', '',     '', '', '',
4743         'min_charge',   'decimal', '', '10,4', '', '',
4744       ],
4745       'primary_key'  => 'tierdetailnum',
4746       'unique'       => [],
4747       'index'        => [ ['tiernum'], ],
4748       'foreign_keys' => [
4749                           { columns    => [ 'tiernum' ],
4750                             table      => 'rate_tier',
4751                           },
4752                         ],
4753     },
4754
4755     'usage_class' => {
4756       'columns' => [
4757         'classnum',    'serial',      '',      '', '', '', 
4758         'weight',      'int',     'NULL',      '', '', '',
4759         'classname',   'varchar',     '', $char_d, '', '', 
4760         'format',      'varchar', 'NULL', $char_d, '', '', 
4761         'disabled',    'char',    'NULL',       1, '', '', 
4762       ],
4763       'primary_key' => 'classnum',
4764       'unique' => [],
4765       'index' => [ ['disabled'] ],
4766     },
4767
4768     'reg_code' => {
4769       'columns' => [
4770         'codenum',   'serial',    '', '', '', '', 
4771         'code',      'varchar',   '', $char_d, '', '', 
4772         'agentnum',  'int',       '', '', '', '', 
4773       ],
4774       'primary_key'  => 'codenum',
4775       'unique'       => [ [ 'agentnum', 'code' ] ],
4776       'index'        => [ [ 'agentnum' ] ],
4777       'foreign_keys' => [
4778                           { columns    => [ 'agentnum' ],
4779                             table      => 'agent',
4780                           },
4781                         ],
4782      },
4783
4784     'reg_code_pkg' => {
4785       'columns' => [
4786         'codepkgnum', 'serial', '', '', '', '', 
4787         'codenum',   'int',    '', '', '', '', 
4788         'pkgpart',   'int',    '', '', '', '', 
4789       ],
4790       'primary_key'  => 'codepkgnum',
4791       'unique'       => [ [ 'codenum', 'pkgpart' ] ],
4792       'index'        => [ [ 'codenum' ] ],
4793       'foreign_keys' => [
4794                           { columns    => [ 'codenum' ],
4795                             table      => 'reg_code',
4796                           },
4797                           { columns    => [ 'pkgpart' ],
4798                             table      => 'part_pkg',
4799                           },
4800                         ],
4801     },
4802
4803     'clientapi_session' => {
4804       'columns' => [
4805         'sessionnum',  'serial',  '', '', '', '', 
4806         'sessionid',  'varchar',  '', $char_d, '', '', 
4807         'namespace',  'varchar',  '', $char_d, '', '', 
4808       ],
4809       'primary_key' => 'sessionnum',
4810       'unique'      => [ [ 'sessionid', 'namespace' ] ],
4811       'index'       => [],
4812     },
4813
4814     'clientapi_session_field' => {
4815       'columns' => [
4816         'fieldnum',    'serial',     '', '', '', '', 
4817         'sessionnum',     'int',     '', '', '', '', 
4818         'fieldname',  'varchar',     '', $char_d, '', '', 
4819         'fieldvalue',    'text', 'NULL', '', '', '', 
4820       ],
4821       'primary_key'  => 'fieldnum',
4822       'unique'       => [ [ 'sessionnum', 'fieldname' ] ],
4823       'index'        => [],
4824       'foreign_keys' => [
4825                           { columns    => [ 'sessionnum' ],
4826                             table      => 'clientapi_session',
4827                           },
4828                         ],
4829     },
4830
4831     'payment_gateway' => {
4832       'columns' => [
4833         'gatewaynum',       'serial',   '',     '', '', '', 
4834         'gateway_namespace','varchar',  'NULL', $char_d, '', '', 
4835         'gateway_module',   'varchar',  '',     $char_d, '', '', 
4836         'gateway_username', 'varchar',  'NULL', $char_d, '', '', 
4837         'gateway_password', 'varchar',  'NULL', $char_d, '', '', 
4838         'gateway_action',   'varchar',  'NULL', $char_d, '', '', 
4839         'gateway_callback_url', 'varchar',  'NULL', 255, '', '', 
4840         'gateway_cancel_url',   'varchar',  'NULL', 255, '', '',
4841         'disabled',   'char',  'NULL',   1, '', '', 
4842       ],
4843       'primary_key' => 'gatewaynum',
4844       'unique' => [],
4845       'index'  => [ [ 'disabled' ] ],
4846     },
4847
4848     'payment_gateway_option' => {
4849       'columns' => [
4850         'optionnum',   'serial',  '',     '', '', '', 
4851         'gatewaynum',  'int',     '',     '', '', '', 
4852         'optionname',  'varchar', '',     $char_d, '', '', 
4853         'optionvalue', 'text',    'NULL', '', '', '', 
4854       ],
4855       'primary_key'  => 'optionnum',
4856       'unique'       => [],
4857       'index'        => [ [ 'gatewaynum' ], [ 'optionname' ] ],
4858       'foreign_keys' => [
4859                           { columns    => [ 'gatewaynum' ],
4860                             table      => 'payment_gateway',
4861                           },
4862                         ],
4863     },
4864
4865     'agent_payment_gateway' => {
4866       'columns' => [
4867         'agentgatewaynum', 'serial', '', '', '', '', 
4868         'agentnum',        'int', '', '', '', '', 
4869         'gatewaynum',      'int', '', '', '', '', 
4870         'cardtype',        'varchar', 'NULL', $char_d, '', '', 
4871         'taxclass',        'varchar', 'NULL', $char_d, '', '', 
4872       ],
4873       'primary_key'  => 'agentgatewaynum',
4874       'unique'       => [],
4875       'index'        => [ [ 'agentnum', 'cardtype' ], ],
4876
4877       'foreign_keys' => [
4878
4879                           { columns    => [ 'agentnum' ],
4880                             table      => 'agent',
4881                           },
4882                           { columns    => [ 'gatewaynum' ],
4883                             table      => 'payment_gateway',
4884                           },
4885                         ],
4886     },
4887
4888     'banned_pay' => {
4889       'columns' => [
4890         'bannum',  'serial',   '',     '', '', '', 
4891         'payby',   'char',     '',       4, '', '', 
4892         'payinfo', 'varchar',  '',     128, '', '', #say, a 512-big digest _hex encoded
4893         #'paymask', 'varchar',  'NULL', $char_d, '', ''
4894         '_date',            @date_type,         '', '', 
4895         'end_date',         @date_type,         '', '', 
4896         'otaker',  'varchar',  'NULL',      32, '', '', 
4897         'usernum',     'int',  'NULL',      '', '', '',
4898         'bantype', 'varchar',  'NULL', $char_d, '', '',
4899         'reason',  'varchar',  'NULL', $char_d, '', '', 
4900       ],
4901       'primary_key'  => 'bannum',
4902       'unique'       => [],
4903       'index'        => [ [ 'payby', 'payinfo' ], [ 'usernum' ], ],
4904       'foreign_keys' => [
4905                           { columns    => [ 'usernum' ],
4906                             table      => 'access_user',
4907                           },
4908                         ],
4909     },
4910
4911     'pkg_category' => {
4912       'columns' => [
4913         'categorynum',   'serial',  '', '', '', '', 
4914         'categoryname',  'varchar', '', $char_d, '', '', 
4915         'weight',         'int', 'NULL',  '', '', '',
4916         'condense',      'char', 'NULL',   1, '', '', 
4917         'disabled',      'char', 'NULL',   1, '', '', 
4918       ],
4919       'primary_key' => 'categorynum',
4920       'unique' => [],
4921       'index' => [ ['disabled'] ],
4922     },
4923
4924     'pkg_class' => {
4925       'columns' => [
4926         'classnum',    'serial',   '',      '', '', '', 
4927         'classname',   'varchar',  '', $char_d, '', '', 
4928         'categorynum', 'int',  'NULL',      '', '', '', 
4929         'disabled',    'char', 'NULL',       1, '', '', 
4930         'fcc_ds0s',      'int',     'NULL', '', '', '', 
4931       ],
4932       'primary_key'  => 'classnum',
4933       'unique'       => [],
4934       'index'        => [ ['disabled'] ],
4935       'foreign_keys' => [
4936                           { columns    => [ 'categorynum' ],
4937                             table      => 'pkg_category',
4938                           },
4939                         ],
4940     },
4941
4942     'cdr' => {
4943       'columns' => [
4944         # qw( name type null length default local );
4945
4946         ###
4947         #asterisk fields
4948         ###
4949
4950         'acctid',   'bigserial',  '', '', '', '', 
4951         #'calldate', 'TIMESTAMP with time zone', '', '', \'now()', '',
4952         'calldate', 'timestamp',   '',      '', \'now()', '',
4953         'clid',        'varchar',  '', $char_d, \"''", '', 
4954         'src',         'varchar',  '', $char_d, \"''", '', 
4955         'dst',         'varchar',  '', $char_d, \"''", '', 
4956         'dcontext',    'varchar',  '', $char_d, \"''", '', 
4957         'channel',     'varchar',  '', $char_d, \"''", '', 
4958         'dstchannel',  'varchar',  '', $char_d, \"''", '', 
4959         'lastapp',     'varchar',  '', $char_d, \"''", '', 
4960         'lastdata',    'varchar',  '',     255, \"''", '', 
4961
4962         #currently only opensips
4963         'src_ip_addr', 'varchar',  'NULL',  15,    '', '',
4964         'dst_ip_addr', 'varchar',  'NULL',  15,    '', '',
4965
4966         #currently only u4:
4967         # terminating number (as opposed to dialed destination)
4968         'dst_term',    'varchar',  'NULL', $char_d, '', '',
4969
4970         #these don't seem to be logged by most of the SQL cdr_* modules
4971         #except tds under sql-illegal names, so;
4972         # ... don't rely on them for rating?
4973         # and, what they hey, i went ahead and changed the names and data types
4974         # to freeside-style dates...
4975           #'start',  'timestamp', 'NULL',  '',    '', '',
4976           #'answer', 'timestamp', 'NULL',  '',    '', '',
4977           #'end',    'timestamp', 'NULL',  '',    '', '',
4978         'startdate',  @date_type, '', '', 
4979         'answerdate', @date_type, '', '', 
4980         'enddate',    @date_type, '', '', 
4981         #
4982
4983         'duration',    'int',      '',      '',     0, '',
4984         'billsec',     'int',      '',      '',     0, '', 
4985         'disposition', 'varchar',  '',      45, \"''", '',
4986         'amaflags',    'int',      '',      '',     0, '',
4987         'accountcode', 'varchar',  '',      20, \"''", '',
4988         'uniqueid',    'varchar',  '', $char_d, \"''", '',
4989         'userfield',   'varchar',  '',     512, \"''", '',
4990
4991         'max_callers', 'int',  'NULL',      '',    '', '',
4992
4993         ###
4994         # old fields for unitel/RSLCOM/convergent that don't map to asterisk
4995         # ones we adoped moved to "own fields" section below
4996         # charged_party, upstream_price, rated_price, carrierid, cdrtypenum
4997         ###
4998
4999         'upstream_currency',      'char', 'NULL',       3, '', '',
5000         'upstream_rateplanid',     'int', 'NULL',      '', '', '', #?
5001
5002         # how it was rated internally...
5003         'ratedetailnum',           'int', 'NULL',      '', '', '',
5004
5005         'distance',            'decimal', 'NULL',      '', '', '',
5006         'islocal',                 'int', 'NULL',      '', '', '', # '',  '', 0, '' instead?
5007
5008         #cdr_calltype: the big list in appendix 2
5009         'calltypenum',             'int', 'NULL',      '', '', '',
5010
5011         'description',         'varchar', 'NULL', $char_d, '', '',
5012         'quantity',                'int', 'NULL',      '', '', '', 
5013
5014         'upstream_rateid',         'int', 'NULL',      '', '', '',
5015
5016         ###
5017         # more fields, for GSM imports
5018         ###
5019         'servicecode',             'int', 'NULL',      '', '', '',
5020         'quantity_able',           'int', 'NULL',      '', '', '', 
5021
5022         ###
5023         #and now for our own fields
5024         ###
5025
5026         'cdrtypenum',              'int', 'NULL',      '', '', '',
5027
5028         'charged_party',       'varchar', 'NULL', $char_d, '', '',
5029         'charged_party_imsi',  'varchar', 'NULL', $char_d, '', '',
5030
5031         'upstream_price',      'decimal', 'NULL',  '10,5', '', '', 
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