3cb1b773ab3d84891bcdf35a0314c10eff0cf874
[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       ],
2962       'primary_key'  => 'pkgpart',
2963       'unique'       => [],
2964       'index'        => [ [ 'promo_code' ], [ 'disabled' ], [ 'classnum' ],
2965                           [ 'agentnum' ], ['no_auto'],
2966                         ],
2967       'foreign_keys' => [
2968                           { columns    => [ 'classnum' ],
2969                             table      => 'pkg_class',
2970                           },
2971                           { columns    => [ 'addon_classnum' ],
2972                             table      => 'pkg_class',
2973                             references => [ 'classnum' ],
2974                           },
2975                           { columns    => [ 'taxproductnum' ],
2976                             table      => 'part_pkg_taxproduct',
2977                           },
2978                           { columns    => [ 'agentnum' ],
2979                             table      => 'agent',
2980                           },
2981                           { columns    => [ 'successor' ],
2982                             table      => 'part_pkg',
2983                             references => [ 'pkgpart' ],
2984                           },
2985                           { columns    => [ 'family_pkgpart' ],
2986                             table      => 'part_pkg',
2987                             references => [ 'pkgpart' ],
2988                           },
2989                         ],
2990     },
2991
2992     'part_pkg_msgcat' => {
2993       'columns' => [
2994         'pkgpartmsgnum',  'serial',     '',        '', '', '',
2995         'pkgpart',           'int',     '',        '', '', '',
2996         'locale',        'varchar',     '',        16, '', '',
2997         'pkg',           'varchar',     '',   $char_d, '', '', #longer/no limit?
2998         'comment',       'varchar', 'NULL', 2*$char_d, '', '', #longer/no limit?
2999       ],
3000       'primary_key'  => 'pkgpartmsgnum',
3001       'unique'       => [ [ 'pkgpart', 'locale' ] ],
3002       'index'        => [],
3003       'foreign_keys' => [
3004                           { columns    => [ 'pkgpart' ],
3005                             table      => 'part_pkg',
3006                           },
3007                         ],
3008     },
3009
3010     'part_pkg_currency' => {
3011       'columns' => [
3012         'pkgcurrencynum', 'serial', '',      '', '', '',
3013         'pkgpart',           'int', '',      '', '', '',
3014         'currency',         'char', '',       3, '', '',
3015         'optionname',    'varchar', '', $char_d, '', '', 
3016         'optionvalue',      'text', '',      '', '', '', 
3017       ],
3018       'primary_key'  => 'pkgcurrencynum',
3019       'unique'       => [ [ 'pkgpart', 'currency', 'optionname' ] ],
3020       'index'        => [ ['pkgpart'] ],
3021       'foreign_keys' => [
3022                           { columns    => [ 'pkgpart' ],
3023                             table      => 'part_pkg',
3024                           },
3025                         ],
3026     },
3027
3028     'currency_exchange' => {
3029       'columns' => [
3030         'currencyratenum', 'serial', '',    '', '', '',
3031         'from_currency',     'char', '',     3, '', '',
3032         'to_currency',       'char', '',     3, '', '',
3033         'rate',           'decimal', '', '7,6', '', '',
3034       ],
3035       'primary_key' => 'currencyratenum',
3036       'unique'      => [ [ 'from_currency', 'to_currency' ] ],
3037       'index'       => [],
3038     },
3039
3040     'part_pkg_usageprice' => {
3041       'columns' => [
3042         'usagepricepart', 'serial',      '',      '', '', '',
3043         'pkgpart',           'int',      '',      '', '', '',
3044         'price',          @money_type,                '', '', 
3045         'currency',         'char',  'NULL',       3, '', '',
3046         'action',        'varchar',      '', $char_d, '', '',
3047         'target',        'varchar',      '', $char_d, '', '',
3048         'amount',        'varchar',      '', $char_d, '', '',
3049       ],
3050       'primary_key'  => 'usagepricepart',
3051       'unique'       => [ [ 'pkgpart', 'currency', 'target' ] ],
3052       'index'        => [ [ 'pkgpart' ] ],
3053       'foreign_keys' => [
3054                           { columns    => [ 'pkgpart' ],
3055                             table      => 'part_pkg',
3056                           },
3057                         ],
3058     },
3059
3060     'cust_pkg_usageprice' => {
3061       'columns' => [
3062         'usagepricenum', 'serial',      '',      '', '', '',
3063         'pkgnum',           'int',      '',      '', '', '',
3064         'usagepricepart',   'int',      '',      '', '', '',
3065         'quantity',         'int',      '',      '', '', '',
3066       ],
3067       'primary_key'  => 'usagepricenum',
3068       'unique'       => [ [ 'pkgnum', 'usagepricepart' ] ],
3069       'index'        => [ [ 'pkgnum' ] ],
3070       'foreign_keys' => [
3071                           { columns    => [ 'pkgnum' ],
3072                             table      => 'cust_pkg',
3073                           },
3074                           { columns    => [ 'usagepricepart' ],
3075                             table      => 'part_pkg_usageprice',
3076                           },
3077                         ],
3078     },
3079
3080     'part_pkg_link' => {
3081       'columns' => [
3082         'pkglinknum',  'serial',   '',      '', '', '',
3083         'src_pkgpart', 'int',      '',      '', '', '',
3084         'dst_pkgpart', 'int',      '',      '', '', '', 
3085         'link_type',   'varchar',  '', $char_d, '', '',
3086         'hidden',      'char', 'NULL',       1, '', '',
3087       ],
3088       'primary_key'  => 'pkglinknum',
3089       'unique'       => [ ['src_pkgpart','dst_pkgpart','link_type','hidden'] ],
3090       'index'        => [ [ 'src_pkgpart' ] ],
3091       'foreign_keys' => [
3092                           { columns    => [ 'src_pkgpart' ],
3093                             table      => 'part_pkg',
3094                             references => [ 'pkgpart' ]
3095                           },
3096                           { columns    => [ 'dst_pkgpart' ],
3097                             table      => 'part_pkg',
3098                             references => [ 'pkgpart' ]
3099                           },
3100                         ],
3101     },
3102     # XXX somewhat borked unique: we don't really want a hidden and unhidden
3103     # it turns out we'd prefer to use svc, bill, and invisibill (or something)
3104
3105     'part_pkg_discount' => {
3106       'columns' => [
3107         'pkgdiscountnum', 'serial',   '',      '', '', '',
3108         'pkgpart',        'int',      '',      '', '', '',
3109         'discountnum',    'int',      '',      '', '', '', 
3110       ],
3111       'primary_key'  => 'pkgdiscountnum',
3112       'unique'       => [ [ 'pkgpart', 'discountnum' ] ],
3113       'index'        => [],
3114       'foreign_keys' => [
3115                           { columns    => [ 'pkgpart' ],
3116                             table      => 'part_pkg',
3117                           },
3118                           { columns    => [ 'discountnum' ],
3119                             table      => 'discount',
3120                           },
3121                         ],
3122     },
3123
3124     'part_pkg_taxclass' => {
3125       'columns' => [
3126         'taxclassnum',  'serial', '',       '', '', '',
3127         'taxclass',     'varchar', '', $char_d, '', '', 
3128         'disabled', 'char',   'NULL',         1, '', '', 
3129       ],
3130       'primary_key' => 'taxclassnum',
3131       'unique'      => [ [ 'taxclass' ] ],
3132       'index'       => [ [ 'disabled' ] ],
3133     },
3134
3135     'part_pkg_taxproduct' => {
3136       'columns' => [
3137         'taxproductnum', 'serial',      '',        '', '', '',
3138         'data_vendor',   'varchar', 'NULL',   $char_d, '', '', 
3139         'taxproduct',    'varchar',     '',   $char_d, '', '', 
3140         'description',   'varchar',     '', 3*$char_d, '', '', 
3141       ],
3142       'primary_key' => 'taxproductnum',
3143       'unique'      => [ [ 'data_vendor', 'taxproduct' ] ],
3144       'index'       => [],
3145     },
3146
3147     'part_pkg_taxrate' => { 
3148       'columns' => [
3149         'pkgtaxratenum', 'serial',  '',     '',      '', '',
3150         'data_vendor',   'varchar', 'NULL', $char_d, '', '', # update source
3151         'geocode',       'varchar', 'NULL', $char_d, '', '', # cch provides 10
3152         'taxproductnum', 'int',  '',     '',       '', '',          
3153         'city',             'varchar', 'NULL', $char_d, '', '', # tax_location?
3154         'county',           'varchar', 'NULL', $char_d, '', '', 
3155         'state',            'varchar', 'NULL', $char_d, '', '', 
3156         'local',            'varchar', 'NULL', $char_d, '', '', 
3157         'country',          'char',    'NULL', 2,       '', '',
3158         'taxclassnumtaxed', 'int',     'NULL', '',      '', '', 
3159         'taxcattaxed',      'varchar', 'NULL', $char_d, '', '', 
3160         'taxclassnum',      'int',     'NULL', '',      '', '', 
3161         'effdate',          @date_type, '', '', 
3162         'taxable',          'char',    'NULL', 1,       '', '', 
3163       ],
3164       'primary_key'  => 'pkgtaxratenum',
3165       'unique'       => [],
3166       'index'        => [ [ 'data_vendor', 'geocode', 'taxproductnum' ] ],
3167       'foreign_keys' => [
3168                           { columns    => [ 'taxproductnum' ],
3169                             table      => 'part_pkg_taxproduct',
3170                           },
3171                           { columns    => [ 'taxclassnumtaxed' ],
3172                             table      => 'tax_class',
3173                             references => [ 'taxclassnum' ],
3174                           },
3175                           { columns    => [ 'taxclassnum' ],
3176                             table      => 'tax_class',
3177                           },
3178                         ],
3179     },
3180
3181     'part_pkg_taxoverride' => { 
3182       'columns' => [
3183         'taxoverridenum', 'serial', '', '', '', '',
3184         'pkgpart',           'int', '', '', '', '',
3185         'taxclassnum',       'int', '', '', '', '',
3186         'usage_class',    'varchar', 'NULL', $char_d, '', '', 
3187       ],
3188       'primary_key'  => 'taxoverridenum',
3189       'unique'       => [],
3190       'index'        => [ [ 'pkgpart' ], [ 'taxclassnum' ] ],
3191       'foreign_keys' => [
3192                           { columns    => [ 'pkgpart' ],
3193                             table      => 'part_pkg',
3194                           },
3195                           { columns    => [ 'taxclassnum' ],
3196                             table      => 'tax_class',
3197                           },
3198                         ],
3199     },
3200
3201 #    'part_title' => {
3202 #      'columns' => [
3203 #        'titlenum',   'int',    '',   '',
3204 #        'title',      'varchar',   '',   $char_d,
3205 #      ],
3206 #      'primary_key' => 'titlenum',
3207 #      'unique' => [ [] ],
3208 #      'index' => [ [] ],
3209 #    },
3210
3211     'pkg_svc' => {
3212       'columns' => [
3213         'pkgsvcnum',   'serial',    '', '', '', '', 
3214         'pkgpart',        'int',    '', '', '', '', 
3215         'svcpart',        'int',    '', '', '', '', 
3216         'quantity',       'int',    '', '', '', '', 
3217         'primary_svc',   'char', 'NULL', 1, '', '', 
3218         'hidden',        'char', 'NULL', 1, '', '',
3219         'bulk_skip',     'char', 'NULL', 1, '', '',
3220       ],
3221       'primary_key'  => 'pkgsvcnum',
3222       'unique'       => [ ['pkgpart', 'svcpart'] ],
3223       'index'        => [ ['pkgpart'], ['quantity'] ],
3224       'foreign_keys' => [
3225                           { columns    => [ 'pkgpart' ],
3226                             table      => 'part_pkg',
3227                           },
3228                           { columns    => [ 'svcpart' ],
3229                             table      => 'part_svc',
3230                           },
3231                         ],
3232     },
3233
3234     'part_referral' => {
3235       'columns' => [
3236         'refnum',   'serial',     '',        '', '', '', 
3237         'referral', 'varchar',    '',   $char_d, '', '', 
3238         'disabled', 'char',   'NULL',         1, '', '', 
3239         'agentnum', 'int',    'NULL',        '', '', '', 
3240       ],
3241       'primary_key'  => 'refnum',
3242       'unique'       => [],
3243       'index'        => [ ['disabled'], ['agentnum'], ],
3244       'foreign_keys' => [
3245                           { columns    => [ 'agentnum' ],
3246                             table      => 'agent',
3247                           },
3248                         ],
3249     },
3250
3251     'part_svc' => {
3252       'columns' => [
3253         'svcpart',             'serial',     '',        '', '', '', 
3254         'svc',                'varchar',     '',   $char_d, '', '', 
3255         'svcdb',              'varchar',     '',   $char_d, '', '', 
3256         'disabled',              'char', 'NULL',         1, '', '', 
3257         'preserve',              'char', 'NULL',         1, '', '',
3258         'selfservice_access', 'varchar', 'NULL',   $char_d, '', '',
3259         'classnum',               'int', 'NULL',        '', '', '',
3260         'restrict_edit_password','char', 'NULL',         1, '', '',
3261         'has_router',            'char', 'NULL',         1, '', '',
3262 ],
3263       'primary_key'  => 'svcpart',
3264       'unique'       => [],
3265       'index'        => [ [ 'disabled' ] ],
3266       'foreign_keys' => [
3267                           { columns    => [ 'classnum' ],
3268                             table      => 'part_svc_class',
3269                           },
3270                         ],
3271     },
3272
3273     'part_svc_column' => {
3274       'columns' => [
3275         'columnnum',   'serial',      '',      '', '', '', 
3276         'svcpart',     'int',         '',      '', '', '', 
3277         'columnname',  'varchar',     '',      64, '', '', 
3278         'columnlabel', 'varchar', 'NULL', $char_d, '', '',
3279         'columnvalue', 'varchar', 'NULL',     512, '', '', 
3280         'columnflag',  'char',    'NULL',       1, '', '', 
3281       ],
3282       'primary_key'  => 'columnnum',
3283       'unique'       => [ [ 'svcpart', 'columnname' ] ],
3284       'index'        => [ [ 'svcpart' ] ],
3285       'foreign_keys' => [
3286                           { columns    => [ 'svcpart' ],
3287                             table      => 'part_svc',
3288                           },
3289                         ],
3290     },
3291
3292     'part_svc_class' => {
3293       'columns' => [
3294         'classnum',    'serial',   '',      '', '', '', 
3295         'classname',   'varchar',  '', $char_d, '', '', 
3296         'disabled',    'char', 'NULL',       1, '', '', 
3297       ],
3298       'primary_key' => 'classnum',
3299       'unique' => [],
3300       'index' => [ ['disabled'] ],
3301     },
3302
3303     #(this should be renamed to part_pop)
3304     'svc_acct_pop' => {
3305       'columns' => [
3306         'popnum',    'serial',    '',   '', '', '', 
3307         'city',      'varchar',   '',   $char_d, '', '', 
3308         'state',     'varchar',   '',   $char_d, '', '', 
3309         'ac',        'char',   '',   3, '', '', 
3310         'exch',      'char',   '',   3, '', '', 
3311         'loc',       'char',   'NULL',   4, '', '', #NULL for legacy purposes
3312       ],
3313       'primary_key' => 'popnum',
3314       'unique' => [],
3315       'index' => [ [ 'state' ] ],
3316     },
3317
3318     'part_pop_local' => {
3319       'columns' => [
3320         'localnum',  'serial',     '',     '', '', '', 
3321         'popnum',    'int',     '',     '', '', '', 
3322         'city',      'varchar', 'NULL', $char_d, '', '', 
3323         'state',     'char',    'NULL', 2, '', '', 
3324         'npa',       'char',    '',     3, '', '', 
3325         'nxx',       'char',    '',     3, '', '', 
3326       ],
3327       'primary_key'  => 'localnum',
3328       'unique'       => [],
3329       'index'        => [ [ 'npa', 'nxx' ], [ 'popnum' ] ],
3330       'foreign_keys' => [
3331                          { columns    => [ 'popnum' ],
3332                            table      => 'svc_acct_pop',
3333                          },
3334                        ],
3335     },
3336
3337     'qual' => {
3338       'columns' => [
3339         'qualnum',  'serial',     '',     '', '', '', 
3340         'custnum',    'int',     'NULL',     '', '', '',
3341         'prospectnum',    'int',     'NULL',     '', '', '',
3342         'locationnum',    'int',     'NULL',     '', '', '',
3343         'phonenum',     'varchar', 'NULL',       24, '', '',
3344         'exportnum',      'int', 'NULL', '', '', '', 
3345         'vendor_qual_id',      'varchar', 'NULL', $char_d, '', '', 
3346         'status',      'char', '', 1, '', '', 
3347       ],
3348       'primary_key'  => 'qualnum',
3349       'unique'       => [],
3350       'index'        => [ ['locationnum'], ['custnum'], ['prospectnum'],
3351                           ['phonenum'], ['vendor_qual_id'],
3352                         ],
3353       'foreign_keys' => [
3354                           { columns    => [ 'custnum' ],
3355                             table      => 'cust_main',
3356                           },
3357                           { columns    => [ 'prospectnum' ],
3358                             table      => 'prospect_main',
3359                           },
3360                           { columns    => [ 'locationnum' ],
3361                             table      => 'cust_location',
3362                           },
3363                           { columns    => [ 'exportnum' ],
3364                             table      => 'part_export',
3365                           },
3366                         ],
3367     },
3368
3369     'qual_option' => {
3370       'columns' => [
3371         'optionnum', 'serial', '', '', '', '', 
3372         'qualnum',  'int',     '',     '', '', '', 
3373         'optionname', 'varchar', '', $char_d, '', '', 
3374         'optionvalue', 'text', 'NULL', '', '', '', 
3375       ],
3376       'primary_key'  => 'optionnum',
3377       'unique'       => [],
3378       'index'        => [],
3379       'foreign_keys' => [
3380                           { columns    => [ 'qualnum' ],
3381                             table      => 'qual',
3382                           },
3383                         ],
3384     },
3385
3386     'svc_acct' => {
3387       'columns' => [
3388         'svcnum',    'int',    '',   '', '', '', 
3389         'username',  'varchar',   '',   $username_len, '', '',
3390         '_password', 'varchar',   'NULL',  512, '', '',
3391         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
3392         'sec_phrase', 'varchar',  'NULL',   $char_d, '', '', 
3393         'popnum',    'int',    'NULL',   '', '', '', 
3394         'sectornum', 'int', 'NULL',      '', '', '',
3395         'uid',       'int', 'NULL',   '', '', '', 
3396         'gid',       'int', 'NULL',   '', '', '', 
3397         'finger',    'varchar',   'NULL',   2*$char_d, '', '', 
3398         'dir',       'varchar',   'NULL',   $char_d, '', '', 
3399         'shell',     'varchar',   'NULL',   $char_d, '', '', 
3400         'quota',     'varchar',   'NULL',   $char_d, '', '', 
3401         'slipip',    'varchar',   'NULL',   15, '', '', #four TINYINTs, bah.
3402         # IP address mgmt
3403         'routernum', 'int', 'NULL',      '', '', '',
3404         'blocknum',  'int', 'NULL',      '', '', '', 
3405         'seconds',   'int', 'NULL',   '', '', '', #uhhhh
3406         'seconds_threshold',   'int', 'NULL',   '', '', '',
3407         'upbytes',   'bigint', 'NULL',   '', '', '', 
3408         'upbytes_threshold',   'bigint', 'NULL',   '', '', '',
3409         'downbytes', 'bigint', 'NULL',   '', '', '',
3410         'downbytes_threshold',   'bigint', 'NULL',   '', '', '',
3411         'totalbytes','bigint', 'NULL',   '', '', '',
3412         'totalbytes_threshold',   'bigint', 'NULL',   '', '', '',
3413         'domsvc',    'int',     '', '', '', '', 
3414         'pbxsvc',    'int', 'NULL', '', '', '',
3415         'last_login',  @date_type, '', '', 
3416         'last_logout', @date_type, '', '', 
3417         #cardfortress field(s)
3418         'cf_privatekey',      'text', 'NULL',      '', '', '',
3419         #communigate pro fields (quota = MaxAccountSize)
3420         'cgp_aliases',     'varchar', 'NULL',     255, '', '',
3421         #settings
3422         'cgp_type',        'varchar', 'NULL', $char_d, '', '', #AccountType
3423         'file_quota',      'varchar', 'NULL', $char_d, '', '', #MaxWebSize
3424         'file_maxnum',     'varchar', 'NULL', $char_d, '', '', #MaxWebFiles
3425         'file_maxsize',    'varchar', 'NULL', $char_d, '', '', #MaxFileSize
3426         'cgp_accessmodes', 'varchar', 'NULL',     255, '', '', #AccessModes
3427         'password_selfchange','char', 'NULL',       1, '', '', #PWDAllowed
3428         'password_recover',   'char', 'NULL',       1, 'Y','', #PasswordRecovery
3429         'cgp_rulesallowed','varchar', 'NULL', $char_d, '', '', #RulesAllowed
3430         'cgp_rpopallowed',    'char', 'NULL',       1, '', '', #RPOPAllowed
3431         'cgp_mailtoall',      'char', 'NULL',       1, '', '', #MailToAll
3432         'cgp_addmailtrailer', 'char', 'NULL',       1, '', '', #AddMailTrailer
3433         'cgp_archiveafter',    'int', 'NULL',      '', '', '', #ArchiveMessagesAfter
3434         #XXX mailing lists
3435         #preferences
3436         'cgp_deletemode',     'varchar', 'NULL', $char_d, '', '',#DeleteMode
3437         'cgp_emptytrash',     'varchar', 'NULL', $char_d, '', '',#EmptyTrash
3438         'cgp_language',       'varchar', 'NULL', $char_d, '', '',#Language
3439         'cgp_timezone',       'varchar', 'NULL', $char_d, '', '',#TimeZone
3440         'cgp_skinname',       'varchar', 'NULL', $char_d, '', '',#SkinName
3441         'cgp_prontoskinname', 'varchar', 'NULL', $char_d, '', '',#ProntoSkinName
3442         'cgp_sendmdnmode',    'varchar', 'NULL', $char_d, '', '',#SendMDNMode
3443         #mail
3444         #XXX RPOP settings
3445         #
3446       ],
3447       'primary_key'  => 'svcnum',
3448       #'unique'       => [ [ 'username', 'domsvc' ] ],
3449       'unique'       => [],
3450       'index'        => [ ['username'], ['domsvc'], ['pbxsvc'] ],
3451       'foreign_keys' => [
3452                           { columns    => [ 'svcnum' ],
3453                             table      => 'cust_svc',
3454                           },
3455                           { columns    => [ 'popnum' ],
3456                             table      => 'svc_acct_pop',
3457                           },
3458                           { columns    => [ 'sectornum' ],
3459                             table      => 'tower_sector',
3460                           },
3461                           { columns    => [ 'routernum' ],
3462                             table      => 'router',
3463                           },
3464                           { columns    => [ 'blocknum' ],
3465                             table      => 'addr_block',
3466                           },
3467                           { columns    => [ 'domsvc' ],
3468                             table      => 'svc_domain', #'cust_svc',
3469                             references => [ 'svcnum' ],
3470                           },
3471                           { columns    => [ 'pbxsvc' ],
3472                             table      => 'svc_pbx', #'cust_svc',
3473                             references => [ 'svcnum' ],
3474                           },
3475                         ],
3476     },
3477
3478     'acct_rt_transaction' => {
3479       'columns' => [
3480         'svcrtid',   'int',    '',   '', '', '', #why am i not a serial
3481         'svcnum',    'int',    '',   '', '', '', 
3482         'transaction_id',       'int', '',   '', '', '', 
3483         '_date',   @date_type, '', '',
3484         'seconds',   'int', '',   '', '', '', #uhhhh
3485         'support',   'int', '',   '', '', '',
3486       ],
3487       'primary_key'  => 'svcrtid',
3488       'unique'       => [],
3489       'index'        => [ ['svcnum', 'transaction_id'] ],
3490       'foreign_keys' => [
3491                           { columns    => [ 'svcnum' ],
3492                             table      => 'svc_acct', #'cust_svc',
3493                           },
3494                           # 1. RT tables aren't part of our data structure, so
3495                           #     we can't make sure Queue is created already
3496                           # 2. This is our internal hack for time tracking, not
3497                           #     a user-facing feature
3498                           #{ columns    => [ 'transaction_id' ],
3499                           #  table      => 'Transaction',
3500                           #  references => [ 'id' ],
3501                           #},
3502                         ],
3503     },
3504
3505     #'svc_charge' => {
3506     #  'columns' => [
3507     #    'svcnum',    'int',    '',   '',
3508     #    'amount',    @money_type,
3509     #  ],
3510     #  'primary_key' => 'svcnum',
3511     #  'unique' => [ [] ],
3512     #  'index' => [ [] ],
3513     #},
3514
3515     'svc_domain' => {
3516       'columns' => [
3517         'svcnum',           'int',    '',        '', '', '',
3518         'domain',       'varchar',    '',   $char_d, '', '',
3519         'suffix',       'varchar', 'NULL',  $char_d, '', '',
3520         'catchall',         'int', 'NULL',       '', '', '',
3521         'parent_svcnum',    'int', 'NULL',       '', '', '',
3522         'registrarnum',     'int', 'NULL',       '', '', '',
3523         'registrarkey', 'varchar', 'NULL',      512, '', '',
3524         'setup_date',      @date_type, '', '',
3525         'renewal_interval', 'int', 'NULL',       '', '', '',
3526         'expiration_date', @date_type, '', '',
3527         'au_registrant_name',       'varchar', 'NULL',  $char_d, '', '',
3528         'au_eligibility_type',      'varchar', 'NULL',  $char_d, '', '',
3529         #communigate pro fields (quota = MaxAccountSize)
3530         'max_accounts',     'int', 'NULL',       '', '', '',
3531         'trailer',         'text', 'NULL',       '', '', '',
3532         'cgp_aliases',  'varchar', 'NULL',      255, '', '',
3533         'cgp_accessmodes','varchar','NULL',     255, '', '', #DomainAccessModes
3534         'cgp_certificatetype','varchar','NULL', $char_d, '', '',
3535         #settings
3536         'acct_def_password_selfchange',   'char', 'NULL',       1,  '', '', 
3537         'acct_def_password_recover',      'char', 'NULL',       1, 'Y', '', 
3538         'acct_def_cgp_accessmodes',    'varchar', 'NULL',     255,  '', '',
3539         'acct_def_quota',              'varchar', 'NULL', $char_d,  '', '',
3540         'acct_def_file_quota',         'varchar', 'NULL', $char_d,  '', '',
3541         'acct_def_file_maxnum',        'varchar', 'NULL', $char_d,  '', '',
3542         'acct_def_file_maxsize',       'varchar', 'NULL', $char_d,  '', '',
3543         'acct_def_cgp_rulesallowed',   'varchar', 'NULL', $char_d,  '', '',
3544         'acct_def_cgp_rpopallowed',       'char', 'NULL',       1,  '', '', 
3545         'acct_def_cgp_mailtoall',         'char', 'NULL',       1,  '', '', 
3546         'acct_def_cgp_addmailtrailer',    'char', 'NULL',       1,  '', '', 
3547         'acct_def_cgp_archiveafter',       'int', 'NULL',      '',  '', '',
3548         #preferences
3549         'acct_def_cgp_deletemode',     'varchar', 'NULL', $char_d,  '', '',
3550         'acct_def_cgp_emptytrash',     'varchar', 'NULL', $char_d,  '', '',
3551         'acct_def_cgp_language',       'varchar', 'NULL', $char_d,  '', '',
3552         'acct_def_cgp_timezone',       'varchar', 'NULL', $char_d,  '', '',
3553         'acct_def_cgp_skinname',       'varchar', 'NULL', $char_d,  '', '',
3554         'acct_def_cgp_prontoskinname', 'varchar', 'NULL', $char_d,  '', '',
3555         'acct_def_cgp_sendmdnmode',    'varchar', 'NULL', $char_d,  '', '',
3556       ],
3557       'primary_key'  => 'svcnum',
3558       'unique'       => [],
3559       'index'        => [ ['domain'] ],
3560       'foreign_keys' => [
3561                           { columns    => [ 'svcnum' ],
3562                             table      => 'cust_svc',
3563                           },
3564                           { columns    => [ 'catchall' ],
3565                             table      => 'svc_acct',
3566                             references => [ 'svcnum' ],
3567                           },
3568                           { columns    => [ 'parent_svcnum' ],
3569                             table      => 'cust_svc',
3570                             references => [ 'svcnum' ],
3571                           },
3572                           { columns    => [ 'registrarnum' ],
3573                             table      => 'registrar',
3574                           },
3575                         ],
3576     },
3577
3578     'svc_dsl' => {
3579       'columns' => [
3580         'svcnum',                    'int',    '',        '', '', '',
3581         'pushed',                    'int', 'NULL',       '', '', '',
3582         'desired_due_date',          'int', 'NULL',       '', '', '',
3583         'due_date',                  'int', 'NULL',       '', '', '',
3584         'vendor_order_id',       'varchar', 'NULL', $char_d,  '', '',
3585         'vendor_qual_id',        'varchar', 'NULL', $char_d,  '', '',
3586         'vendor_order_type',     'varchar', 'NULL', $char_d,  '', '',
3587         'vendor_order_status',   'varchar', 'NULL', $char_d,  '', '',
3588         'first',                 'varchar', 'NULL', $char_d,  '', '',
3589         'last',                  'varchar', 'NULL', $char_d,  '', '',
3590         'company',               'varchar', 'NULL', $char_d,  '', '',
3591         'phonenum',              'varchar', 'NULL',      24, '', '',
3592         'gateway_access_number', 'varchar', 'NULL',      24, '', '',
3593         'loop_type',                'char', 'NULL',       1, '', '', 
3594         'local_voice_provider',  'varchar', 'NULL', $char_d, '', '',
3595         'circuitnum',            'varchar', 'NULL', $char_d, '', '',
3596         'rate_band',             'varchar', 'NULL', $char_d, '', '',
3597         'vpi',                       'int', 'NULL',      '', '', '',
3598         'vci',                       'int', 'NULL',      '', '', '',
3599         'isp_chg',                  'char', 'NULL',       1, '', '', 
3600         'isp_prev',              'varchar', 'NULL', $char_d, '', '',
3601         'username',              'varchar', 'NULL', $char_d, '', '',
3602         'password',              'varchar', 'NULL', $char_d, '', '',
3603         'staticips',                'text', 'NULL',      '', '', '',
3604         'monitored',                'char', 'NULL',       1, '', '', 
3605         'last_pull',                 'int', 'NULL',      '', '', '',
3606       ],
3607       'primary_key'  => 'svcnum',
3608       'unique'       => [ ],
3609       'index'        => [ ['phonenum'], ['vendor_order_id'] ],
3610       'foreign_keys' => [
3611                           { columns    => [ 'svcnum' ],
3612                             table      => 'cust_svc',
3613                           },
3614                         ],
3615     },
3616
3617     'dsl_device' => {
3618       'columns' => [
3619         'devicenum', 'serial',     '', '', '', '',
3620         #part_device?  or our own part_dsl_device?
3621         #'devicepart',   'int',     '', '', '', '',
3622         'svcnum',       'int',     '', '', '', '', 
3623         'mac_addr', 'varchar',     '', 12, '', '', 
3624       ],
3625       'primary_key'  => 'devicenum',
3626       'unique'       => [ [ 'mac_addr' ], ],
3627       'index'        => [ [ 'svcnum' ], ], # [ 'devicepart' ] ],
3628       'foreign_keys' => [
3629                           { columns    => [ 'svcnum' ],
3630                             table      => 'svc_dsl',
3631                           },
3632                         ],
3633     },
3634
3635     'dsl_note' => {
3636       'columns' => [
3637         'notenum',           'serial',    '',        '', '', '',
3638         'svcnum',     'int', '',       '', '', '',
3639         'author',     'varchar', 'NULL', $char_d,  '', '',
3640         'priority',   'char', 'NULL',       1,  '', '', 
3641         '_date',     'int', 'NULL',       '', '', '',
3642         'note',     'text', '',       '', '', '',
3643       ],
3644       'primary_key'  => 'notenum',
3645       'unique'       => [],
3646       'index'        => [ ['svcnum'] ],
3647       'foreign_keys' => [
3648                           { columns    => [ 'svcnum' ],
3649                             table      => 'svc_dsl',
3650                           },
3651                         ],
3652     },
3653
3654     'svc_dish' => {
3655       'columns' => [
3656         'svcnum',   'int',     '',     '', '', '',
3657         'acctnum',  'varchar', '',     16, '', '',
3658         'installdate', @date_type,         '', '', 
3659         'note',     'text',    'NULL', '', '', '',
3660       ],
3661       'primary_key'  => 'svcnum',
3662       'unique'       => [],
3663       'index'        => [],
3664       'foreign_keys' => [
3665                           { columns    => [ 'svcnum' ],
3666                             table      => 'cust_svc',
3667                           },
3668                         ],
3669     },
3670
3671     'svc_hardware' => {
3672       'columns' => [
3673         'svcnum',   'int',     '',          '', '', '',
3674         'typenum',  'int',     '',          '', '', '',
3675         'serial',   'varchar', 'NULL', $char_d, '', '',
3676         'ip_addr',  'varchar', 'NULL',      40, '', '',
3677         'hw_addr',  'varchar', 'NULL',      12, '', '',
3678         'smartcard','varchar', 'NULL',      30, '', '',
3679         'statusnum','int',     'NULL',      '', '', '',
3680         'note',     'text',    'NULL',      '', '', '',
3681       ],
3682       'primary_key'  => 'svcnum',
3683       'unique'       => [],
3684       'index'        => [],
3685       'foreign_keys' => [
3686                           { columns    => [ 'svcnum' ],
3687                             table      => 'cust_svc',
3688                           },
3689                           { columns    => [ 'typenum' ],
3690                             table      => 'hardware_type',
3691                           },
3692                           { columns    => [ 'statusnum' ],
3693                             table      => 'hardware_status',
3694                           },
3695                         ],
3696     },
3697
3698     'hardware_class' => {
3699       'columns' => [
3700         'classnum',   'serial', '',      '', '', '',
3701         'classname', 'varchar', '', $char_d, '', '',
3702       ],
3703       'primary_key' => 'classnum',
3704       'unique' => [],
3705       'index'  => [],
3706     },
3707
3708     'hardware_type' => {
3709       'columns' => [
3710         'typenum',  'serial',     '',      '', '', '',
3711         'classnum',    'int',     '',      '', '', '',
3712         'model',   'varchar',     '', $char_d, '', '',
3713         'revision','varchar', 'NULL', $char_d, '', '',
3714       ],
3715       'primary_key'  => 'typenum',
3716       'unique'       => [ [ 'classnum', 'model', 'revision' ] ],
3717       'index'        => [],
3718       'foreign_keys' => [
3719                           { columns    => [ 'classnum' ],
3720                             table      => 'hardware_class',
3721                           },
3722                         ],
3723     },
3724
3725     'hardware_status' => {
3726       'columns' => [
3727         'statusnum', 'serial', '',      '', '', '',
3728         'label'    ,'varchar', '', $char_d, '', '',
3729         'disabled',    'char', 'NULL',   1, '', '', 
3730       ],
3731       'primary_key' => 'statusnum',
3732       'unique' => [],
3733       'index'  => [],
3734     },
3735
3736     'domain_record' => {
3737       'columns' => [
3738         'recnum',    'serial',     '',  '', '', '', 
3739         'svcnum',    'int',     '',  '', '', '', 
3740         'reczone',   'varchar', '',  255, '', '', 
3741         'recaf',     'char',    '',  2, '', '', 
3742         'rectype',   'varchar',    '',  5, '', '', 
3743         'recdata',   'varchar', '',  255, '', '', 
3744         'ttl',       'int',     'NULL', '', '', '',
3745       ],
3746       'primary_key'  => 'recnum',
3747       'unique'       => [],
3748       'index'        => [ ['svcnum'] ],
3749       'foreign_keys' => [
3750                           { columns    => [ 'svcnum' ],
3751                             table      => 'svc_domain',
3752                           },
3753                         ],
3754     },
3755
3756     'registrar' => {
3757       'columns' => [
3758         'registrarnum',   'serial', '',      '', '', '',
3759         'registrarname', 'varchar', '', $char_d, '', '',
3760       ],
3761       'primary_key' => 'registrarnum',
3762       'unique'      => [],
3763       'index'       => [],
3764     },
3765
3766     'cgp_rule' => {
3767       'columns' => [
3768         'rulenum',  'serial',     '',      '', '', '',
3769         'name',    'varchar',     '', $char_d, '', '',
3770         'comment', 'varchar', 'NULL', $char_d, '', '',
3771         'svcnum',      'int',     '',      '', '', '',
3772         'priority',    'int',     '',      '', '', '',
3773       ],
3774       'primary_key' => 'rulenum',
3775       'unique'      => [ [ 'svcnum', 'name' ] ],
3776       'index'       => [ [ 'svcnum' ] ],
3777       'foreign_keys' => [
3778                           { columns    => [ 'svcnum' ],
3779                             table      => 'cust_svc', #svc_acct / svc_domain
3780                           },
3781                         ],
3782     },
3783
3784     'cgp_rule_condition' => {
3785       'columns' => [
3786         'ruleconditionnum',  'serial',     '',      '', '', '',
3787         'conditionname',    'varchar',     '', $char_d, '', '',
3788         'op',               'varchar', 'NULL', $char_d, '', '',
3789         'params',           'varchar', 'NULL',     255, '', '',
3790         'rulenum',              'int',     '',      '', '', '',
3791       ],
3792       'primary_key'  => 'ruleconditionnum',
3793       'unique'       => [],
3794       'index'        => [ [ 'rulenum' ] ],
3795       'foreign_keys' => [
3796                           { columns    => [ 'rulenum' ],
3797                             table      => 'cgp_rule',
3798                           },
3799                         ],
3800     },
3801
3802     'cgp_rule_action' => {
3803        'columns' => [
3804         'ruleactionnum',  'serial',     '',      '', '', '',
3805         'action',        'varchar',     '', $char_d, '', '',
3806         'params',        'varchar', 'NULL',     255, '', '',
3807         'rulenum',           'int',     '',      '', '', '',
3808       ],
3809       'primary_key'  => 'ruleactionnum',
3810       'unique'       => [],
3811       'index'        => [ [ 'rulenum' ] ],
3812       'foreign_keys' => [
3813                           { columns    => [ 'rulenum' ],
3814                             table      => 'cgp_rule',
3815                           },
3816                         ],
3817    },
3818
3819     'svc_forward' => {
3820       'columns' => [
3821         'svcnum',   'int',            '',   '', '', '', 
3822         'srcsvc',   'int',        'NULL',   '', '', '', 
3823         'src',      'varchar',    'NULL',  255, '', '', 
3824         'dstsvc',   'int',        'NULL',   '', '', '', 
3825         'dst',      'varchar',    'NULL',  255, '', '', 
3826       ],
3827       'primary_key'  => 'svcnum',
3828       'unique'       => [],
3829       'index'        => [ ['srcsvc'], ['dstsvc'] ],
3830       'foreign_keys' => [
3831                           { columns    => [ 'svcnum' ],
3832                             table      => 'cust_svc',
3833                           },
3834                           { columns    => [ 'srcsvc' ],
3835                             table      => 'svc_acct',
3836                             references => [ 'svcnum' ]
3837                           },
3838                           { columns    => [ 'dstsvc' ],
3839                             table      => 'svc_acct',
3840                             references => [ 'svcnum' ]
3841                           },
3842                         ],
3843     },
3844
3845     'svc_www' => {
3846       'columns' => [
3847         'svcnum',   'int',      '',  '', '', '', 
3848         'recnum',   'int',      '',  '', '', '', 
3849         'usersvc',  'int',  'NULL',  '', '', '', 
3850         'config',   'text', 'NULL',  '', '', '', 
3851       ],
3852       'primary_key' => 'svcnum',
3853       'unique'      => [],
3854       'index'       => [],
3855       'foreign_keys' => [
3856                           { columns    => [ 'svcnum' ],
3857                             table      => 'cust_svc',
3858                           },
3859                           { columns    => [ 'recnum' ],
3860                             table      => 'domain_record',
3861                           },
3862                           { columns    => [ 'usersvc' ],
3863                             table      => 'svc_acct',
3864                             references => [ 'svcnum' ]
3865                           },
3866                         ],
3867     },
3868
3869     #'svc_wo' => {
3870     #  'columns' => [
3871     #    'svcnum',    'int',    '',   '',
3872     #    'svcnum',    'int',    '',   '',
3873     #    'svcnum',    'int',    '',   '',
3874     #    'worker',    'varchar',   '',   $char_d,
3875     #    '_date',     @date_type,
3876     #  ],
3877     #  'primary_key' => 'svcnum',
3878     #  'unique' => [ [] ],
3879     #  'index' => [ [] ],
3880     #},
3881
3882     'prepay_credit' => {
3883       'columns' => [
3884         'prepaynum',   'serial',     '',   '', '', '', 
3885         'identifier',  'varchar', '', $char_d, '', '', 
3886         'amount',      @money_type, '', '', 
3887         'seconds',     'int',     'NULL', '', '', '', 
3888         'upbytes',     'bigint',     'NULL', '', '', '', 
3889         'downbytes',   'bigint',     'NULL', '', '', '', 
3890         'totalbytes',  'bigint',     'NULL', '', '', '', 
3891         'agentnum',    'int',     'NULL', '', '', '', 
3892       ],
3893       'primary_key'  => 'prepaynum',
3894       'unique'       => [ ['identifier'] ],
3895       'index'        => [],
3896       'foreign_keys' => [
3897                           { columns    => [ 'agentnum' ],
3898                             table      => 'agent',
3899                           },
3900                         ],
3901     },
3902
3903     'port' => {
3904       'columns' => [
3905         'portnum',  'serial',     '',   '', '', '', 
3906         'ip',       'varchar', 'NULL', 15, '', '', 
3907         'nasport',  'int',     'NULL', '', '', '', 
3908         'nasnum',   'int',     '',   '', '', '', 
3909       ],
3910       'primary_key'  => 'portnum',
3911       'unique'       => [],
3912       'index'        => [],
3913       'foreign_keys' => [
3914                           { columns    => [ 'nasnum' ],
3915                             table      => 'nas',
3916                           },
3917                         ],
3918     },
3919
3920     'nas' => {
3921       'columns' => [
3922         'nasnum',       'serial',     '',  '',              '', '', 
3923         'nasname',     'varchar',     '', 128,              '', '',
3924         'shortname',   'varchar', 'NULL',  32,              '', '',
3925         'type',        'varchar',     '',  30,         'other', '',
3926         'ports',           'int', 'NULL',  '',              '', '',
3927         'secret',      'varchar',     '',  60,        'secret', '',
3928         'server',      'varchar', 'NULL',  64,              '', '',
3929         'community',   'varchar', 'NULL',  50,              '', '',
3930         'description', 'varchar',     '', 200, 'RADIUS Client', '',
3931         'svcnum',          'int', 'NULL',  '',              '', '',
3932       ],
3933       'primary_key'  => 'nasnum',
3934       'unique'       => [ [ 'nasname' ], ],
3935       'index'        => [],
3936       'foreign_keys' => [
3937                           { columns    => [ 'svcnum' ],
3938                             table      => 'svc_broadband',#no? could be _acct?
3939                                                           #remove or cust_svc?
3940                           },
3941                         ],
3942     },
3943
3944     'export_nas' => {
3945       'columns' => [
3946         'exportnasnum', 'serial', '', '', '', '', 
3947         'exportnum',       'int', '', '', '', '', 
3948         'nasnum',          'int', '', '', '', '', 
3949       ],
3950       'primary_key'  => 'exportnasnum',
3951       'unique'       => [ [ 'exportnum', 'nasnum' ] ],
3952       'index'        => [ [ 'exportnum' ], [ 'nasnum' ] ],
3953       'foreign_keys' => [
3954                           { columns    => [ 'exportnum' ],
3955                             table      => 'part_export',
3956                           },
3957                           { columns    => [ 'nasnum' ],
3958                             table      => 'nas',
3959                           },
3960                         ],
3961     },
3962
3963     'queue' => {
3964       'columns' => [
3965         'jobnum',   'bigserial',     '',      '', '', '', 
3966         'job',        'varchar',     '',     512, '', '', 
3967         '_date',          'int',     '',      '', '', '', 
3968         'status',     'varchar',     '', $char_d, '', '', 
3969         'statustext',    'text', 'NULL',      '', '', '', 
3970         'svcnum',         'int', 'NULL',      '', '', '', 
3971         'custnum',        'int', 'NULL',      '', '', '',
3972         'secure',        'char', 'NULL',       1, '', '',
3973         'priority',       'int', 'NULL',      '', '', '',
3974       ],
3975       'primary_key'  => 'jobnum',
3976       'unique'       => [],
3977       'index'        => [ [ 'secure' ], [ 'priority' ],
3978                           [ 'job' ], [ 'svcnum' ], [ 'custnum' ], [ 'status' ],
3979                         ],
3980       'foreign_keys' => [
3981                           { columns    => [ 'svcnum' ],
3982                             table      => 'cust_svc',
3983                           },
3984                           { columns    => [ 'custnum' ],
3985                             table      => 'cust_main',
3986                           },
3987                         ],
3988     },
3989
3990     'queue_arg' => {
3991       'columns' => [
3992         'argnum', 'bigserial',     '', '', '', '', 
3993         'jobnum',    'bigint',     '', '', '', '', 
3994         'frozen',      'char', 'NULL',  1, '', '',
3995         'arg',         'text', 'NULL', '', '', '', 
3996       ],
3997       'primary_key'  => 'argnum',
3998       'unique'       => [],
3999       'index'        => [ [ 'jobnum' ] ],
4000       'foreign_keys' => [
4001                           { columns    => [ 'jobnum' ],
4002                             table      => 'queue',
4003                             on_delete  => 'CASCADE',
4004                           },
4005                         ],
4006     },
4007
4008     'queue_depend' => {
4009       'columns' => [
4010         'dependnum',  'bigserial', '', '', '', '', 
4011         'jobnum',        'bigint', '', '', '', '', 
4012         'depend_jobnum', 'bigint', '', '', '', '', 
4013       ],
4014       'primary_key'  => 'dependnum',
4015       'unique'       => [],
4016       'index'        => [ [ 'jobnum' ], [ 'depend_jobnum' ] ],
4017       'foreign_keys' => [
4018                           { columns    => [ 'jobnum' ],
4019                             table      => 'queue',
4020                           },
4021                           { columns    => [ 'depend_jobnum' ],
4022                             table      => 'queue',
4023                             references => [ 'jobnum' ],
4024                             on_delete  => 'CASCADE',
4025                           },
4026                         ],
4027     },
4028
4029     'export_svc' => {
4030       'columns' => [
4031         'exportsvcnum' => 'serial', '', '', '', '', 
4032         'exportnum'    => 'int', '', '', '', '', 
4033         'svcpart'      => 'int', '', '', '', '', 
4034       ],
4035       'primary_key'  => 'exportsvcnum',
4036       'unique'       => [ [ 'exportnum', 'svcpart' ] ],
4037       'index'        => [ [ 'exportnum' ], [ 'svcpart' ] ],
4038       'foreign_keys' => [
4039                           { columns    => [ 'exportnum' ],
4040                             table      => 'part_export',
4041                           },
4042                           { columns    => [ 'svcpart' ],
4043                             table      => 'part_svc',
4044                           },
4045                         ],
4046     },
4047
4048     'export_device' => {
4049       'columns' => [
4050         'exportdevicenum' => 'serial', '', '', '', '', 
4051         'exportnum'       => 'int', '', '', '', '', 
4052         'devicepart'      => 'int', '', '', '', '', 
4053       ],
4054       'primary_key'  => 'exportdevicenum',
4055       'unique'       => [ [ 'exportnum', 'devicepart' ] ],
4056       'index'        => [ [ 'exportnum' ], [ 'devicepart' ] ],
4057       'foreign_keys' => [
4058                           { columns    => [ 'exportnum' ],
4059                             table      => 'part_export',
4060                           },
4061                           { columns    => [ 'devicepart' ],
4062                             table      => 'part_device',
4063                           },
4064                         ],
4065     },
4066
4067     'part_export' => {
4068       'columns' => [
4069         'exportnum',   'serial',     '',      '', '', '', 
4070         'exportname', 'varchar', 'NULL', $char_d, '', '',
4071         'machine',    'varchar', 'NULL', $char_d, '', '',
4072         'exporttype', 'varchar',     '', $char_d, '', '', 
4073         'nodomain',      'char', 'NULL',       1, '', '', 
4074         'default_machine','int', 'NULL',      '', '', '',
4075       ],
4076       'primary_key'  => 'exportnum',
4077       'unique'       => [],
4078       'index'        => [ [ 'machine' ], [ 'exporttype' ] ],
4079       'foreign_keys' => [
4080                           { columns    => [ 'default_machine' ],
4081                             table      => 'part_export_machine',
4082                             references => [ 'machinenum' ]
4083                           },
4084                         ],
4085     },
4086
4087     'part_export_option' => {
4088       'columns' => [
4089         'optionnum', 'serial', '', '', '', '', 
4090         'exportnum', 'int', '', '', '', '', 
4091         'optionname', 'varchar', '', $char_d, '', '', 
4092         'optionvalue', 'text', 'NULL', '', '', '', 
4093       ],
4094       'primary_key'  => 'optionnum',
4095       'unique'       => [],
4096       'index'        => [ [ 'exportnum' ], [ 'optionname' ] ],
4097       'foreign_keys' => [
4098                           { columns    => [ 'exportnum' ],
4099                             table      => 'part_export',
4100                           },
4101                         ],
4102     },
4103
4104     'radius_usergroup' => {
4105       'columns' => [
4106         'usergroupnum', 'serial', '', '', '', '', 
4107         'svcnum',       'int', '', '', '', '', 
4108         'groupname',    'varchar', 'NULL', $char_d, '', '', #deprecated
4109         'groupnum',     'int', 'NULL', '', '', '', 
4110       ],
4111       'primary_key'  => 'usergroupnum',
4112       'unique'       => [],
4113       'index'        => [ [ 'svcnum' ], [ 'groupname' ] ],
4114       'foreign_keys' => [
4115                           { columns    => [ 'svcnum' ],
4116                             table      => 'cust_svc', #svc_acct / svc_broadband
4117                           },
4118                           { columns    => [ 'groupnum' ],
4119                             table      => 'radius_group',
4120                           },
4121                         ],
4122     },
4123
4124     'radius_group' => {
4125       'columns' => [
4126         'groupnum', 'serial', '', '', '', '', 
4127         'groupname',    'varchar', '', $char_d, '', '', 
4128         'description',  'varchar', 'NULL', $char_d, '', '', 
4129         'priority', 'int', '', '', '1', '',
4130         'speed_up', 'int', 'NULL', '', '', '',
4131         'speed_down', 'int', 'NULL', '', '', '',
4132       ],
4133       'primary_key' => 'groupnum',
4134       'unique'      => [ ['groupname'] ],
4135       'index'       => [],
4136     },
4137
4138     'radius_attr' => {
4139       'columns' => [
4140         'attrnum',   'serial', '',      '', '', '',
4141         'groupnum',     'int', '',      '', '', '',
4142         'attrname', 'varchar', '', $char_d, '', '',
4143         'value',    'varchar', '',     255, '', '',
4144         'attrtype',    'char', '',       1, '', '',
4145         'op',          'char', '',       2, '', '',
4146       ],
4147       'primary_key'  => 'attrnum',
4148       'unique'       => [],
4149       'index'        => [ ['groupnum'], ],
4150       'foreign_keys' => [
4151                           { columns    => [ 'groupnum' ],
4152                             table      => 'radius_group',
4153                           },
4154                         ],
4155     },
4156
4157     'msgcat' => {
4158       'columns' => [
4159         'msgnum', 'serial', '', '', '', '', 
4160         'msgcode', 'varchar', '', 255, '', '', 
4161         'locale', 'varchar', '', 16, '', '', 
4162         'msg', 'text', '', '', '', '', 
4163       ],
4164       'primary_key' => 'msgnum',
4165       'unique'      => [ [ 'msgcode', 'locale' ] ],
4166       'index'       => [],
4167     },
4168
4169     'cust_tax_exempt' => {
4170       'columns' => [
4171         'exemptnum', 'serial', '', '', '', '', 
4172         'custnum',   'int', '', '', '', '', 
4173         'taxnum',    'int', '', '', '', '', 
4174         'year',      'int', '', '', '', '', 
4175         'month',     'int', '', '', '', '', 
4176         'amount',   @money_type, '', '', 
4177       ],
4178       'primary_key'  => 'exemptnum',
4179       'unique'       => [ [ 'custnum', 'taxnum', 'year', 'month' ] ],
4180       'index'        => [],
4181       'foreign_keys' => [
4182                           { columns    => [ 'custnum' ],
4183                             table      => 'cust_main',
4184                           },
4185                           { columns    => [ 'taxnum' ],
4186                             table      => 'cust_main_county',
4187                           },
4188                         ],
4189     },
4190
4191     'cust_tax_exempt_pkg' => {
4192       'columns' => [
4193         'exemptpkgnum',  'serial', '', '', '', '', 
4194         #'custnum',      'int', '', '', '', ''
4195         'billpkgnum',   'int', '', '', '', '', 
4196         'taxnum',       'int', '', '', '', '', 
4197         'year',         'int', 'NULL', '', '', '', 
4198         'month',        'int', 'NULL', '', '', '', 
4199         'creditbillpkgnum', 'int', 'NULL', '', '', '',
4200         'amount',       @money_type, '', '', 
4201         # exemption type flags
4202         'exempt_cust',          'char', 'NULL', 1, '', '',
4203         'exempt_setup',         'char', 'NULL', 1, '', '',
4204         'exempt_recur',         'char', 'NULL', 1, '', '',
4205         'exempt_cust_taxname',  'char', 'NULL', 1, '', '',
4206         'exempt_monthly',       'char', 'NULL', 1, '', '',
4207       ],
4208       'primary_key'  => 'exemptpkgnum',
4209       'unique'       => [],
4210       'index'        => [ [ 'taxnum', 'year', 'month' ],
4211                           [ 'billpkgnum' ],
4212                           [ 'taxnum' ],
4213                           [ 'creditbillpkgnum' ],
4214                         ],
4215       'foreign_keys' => [
4216                           { columns    => [ 'billpkgnum' ],
4217                             table      => 'cust_bill_pkg',
4218                           },
4219                           { columns    => [ 'taxnum' ],
4220                             table      => 'cust_main_county',
4221                           },
4222                           { columns    => [ 'creditbillpkgnum' ],
4223                             table      => 'cust_credit_bill_pkg',
4224                           },
4225                         ],
4226     },
4227
4228     'cust_tax_exempt_pkg_void' => {
4229       'columns' => [
4230         'exemptpkgnum',  'int', '', '', '', '', 
4231         #'custnum',      'int', '', '', '', ''
4232         'billpkgnum',   'int', '', '', '', '', 
4233         'taxnum',       'int', '', '', '', '', 
4234         'year',         'int', 'NULL', '', '', '', 
4235         'month',        'int', 'NULL', '', '', '', 
4236         'creditbillpkgnum', 'int', 'NULL', '', '', '',
4237         'amount',       @money_type, '', '', 
4238         # exemption type flags
4239         'exempt_cust',          'char', 'NULL', 1, '', '',
4240         'exempt_setup',         'char', 'NULL', 1, '', '',
4241         'exempt_recur',         'char', 'NULL', 1, '', '',
4242         'exempt_cust_taxname',  'char', 'NULL', 1, '', '',
4243         'exempt_monthly',       'char', 'NULL', 1, '', '',
4244       ],
4245       'primary_key'  => 'exemptpkgnum',
4246       'unique'       => [],
4247       'index'        => [ [ 'taxnum', 'year', 'month' ],
4248                           [ 'billpkgnum' ],
4249                           [ 'taxnum' ],
4250                           [ 'creditbillpkgnum' ],
4251                         ],
4252       'foreign_keys' => [
4253                           { columns    => [ 'billpkgnum' ],
4254                             table      => 'cust_bill_pkg_void',
4255                           },
4256                           { columns    => [ 'taxnum' ],
4257                             table      => 'cust_main_county',
4258                           },
4259                           { columns    => [ 'creditbillpkgnum' ],
4260                             table      => 'cust_credit_bill_pkg',
4261                           },
4262                         ],
4263     },
4264
4265     'router' => {
4266       'columns' => [
4267         'routernum', 'serial', '', '', '', '', 
4268         'routername', 'varchar', '', $char_d, '', '', 
4269         'svcnum', 'int', 'NULL', '', '', '', 
4270         'agentnum',   'int', 'NULL', '', '', '', 
4271         'manual_addr', 'char', 'NULL', 1, '', '',
4272       ],
4273       'primary_key'  => 'routernum',
4274       'unique'       => [],
4275       'index'        => [],
4276       'foreign_keys' => [
4277                           { columns    => [ 'svcnum' ],
4278                             table      => 'cust_svc', #svc_acct / svc_broadband
4279                           },
4280                           { columns    => [ 'agentnum' ],
4281                             table      => 'agent',
4282                           },
4283                         ],
4284     },
4285
4286     'part_svc_router' => {
4287       'columns' => [
4288         'svcrouternum', 'serial', '', '', '', '', 
4289         'svcpart', 'int', '', '', '', '', 
4290         'routernum', 'int', '', '', '', '', 
4291       ],
4292       'primary_key'  => 'svcrouternum',
4293       'unique'       => [],
4294       'index'        => [],
4295       'foreign_keys' => [
4296                           { columns    => [ 'svcpart' ],
4297                             table      => 'part_svc',
4298                           },
4299                           { columns    => [ 'routernum' ],
4300                             table      => 'router',
4301                           },
4302                         ],
4303     },
4304
4305     'addr_block' => {
4306       'columns' => [
4307         'blocknum', 'serial', '', '', '', '', 
4308         'routernum', 'int', '', '', '', '', 
4309         'ip_gateway', 'varchar', '', 15, '', '', 
4310         'ip_netmask', 'int', '', '', '', '', 
4311         'agentnum',   'int', 'NULL', '', '', '', 
4312         'manual_flag', 'char', 'NULL', 1, '', '', 
4313       ],
4314       'primary_key'  => 'blocknum',
4315       'unique'       => [ [ 'blocknum', 'routernum' ] ],
4316       'index'        => [],
4317       'foreign_keys' => [
4318                           { columns    => [ 'routernum' ],
4319                             table      => 'router',
4320                           },
4321                           { columns    => [ 'agentnum' ],
4322                             table      => 'agent',
4323                           },
4324                         ],
4325     },
4326
4327     'addr_range' => {
4328       'columns' => [
4329         'rangenum', 'serial', '', '', '', '',
4330         'start',    'varchar', '', 15, '', '',
4331         'length',   'int', '', '', '', '',
4332         'status',   'varchar', 'NULL', 32, '', '',
4333       ],
4334       'primary_key' => 'rangenum',
4335       'unique'      => [],
4336       'index'       => [],
4337     },
4338
4339     'svc_broadband' => {
4340       'columns' => [
4341         'svcnum',                  'int',     '',        '', '', '', 
4342         'description',         'varchar', 'NULL',   $char_d, '', '', 
4343         'routernum',               'int', 'NULL',        '', '', '',
4344         'blocknum',                'int', 'NULL',        '', '', '', 
4345         'sectornum',               'int', 'NULL',        '', '', '',
4346         'speed_up',                'int', 'NULL',        '', '', '', 
4347         'speed_down',              'int', 'NULL',        '', '', '', 
4348         'ip_addr',             'varchar', 'NULL',        15, '', '', 
4349         'mac_addr',            'varchar', 'NULL',        12, '', '', 
4350         'authkey',             'varchar', 'NULL',        32, '', '', 
4351         'latitude',            'decimal', 'NULL',    '10,7', '', '', 
4352         'longitude',           'decimal', 'NULL',    '10,7', '', '', 
4353         'altitude',            'decimal', 'NULL',        '', '', '', 
4354         'vlan_profile',        'varchar', 'NULL',   $char_d, '', '', 
4355         'performance_profile', 'varchar', 'NULL',   $char_d, '', '',
4356         'plan_id',             'varchar', 'NULL',   $char_d, '', '',
4357         'radio_serialnum',     'varchar', 'NULL',   $char_d, '', '',
4358         'radio_location',      'varchar', 'NULL', 2*$char_d, '', '',
4359         'poe_location',        'varchar', 'NULL', 2*$char_d, '', '',
4360         'rssi',                    'int', 'NULL',        '', '', '',
4361         'suid',                    'int', 'NULL',        '', '', '',
4362         'shared_svcnum',           'int', 'NULL',        '', '', '',
4363       ],
4364       'primary_key'  => 'svcnum',
4365       'unique'       => [ [ 'ip_addr' ], [ 'mac_addr' ] ],
4366       'index'        => [],
4367       'foreign_keys' => [
4368                           { columns    => [ 'svcnum' ],
4369                             table      => 'cust_svc',
4370                           },
4371                           { columns    => [ 'routernum' ],
4372                             table      => 'router',
4373                           },
4374                           { columns    => [ 'blocknum' ],
4375                             table      => 'addr_block',
4376                           },
4377                           { columns    => [ 'sectornum' ],
4378                             table      => 'tower_sector',
4379                           },
4380                           { columns    => [ 'shared_svcnum' ],
4381                             table      => 'svc_broadband',
4382                             references => [ 'svcnum' ],
4383                           },
4384                         ],
4385     },
4386
4387     'tower' => {
4388       'columns' => [
4389         'towernum',    'serial',     '',      '', '', '',
4390         #'agentnum',       'int', 'NULL',      '', '', '',
4391         'towername',  'varchar',     '', $char_d, '', '',
4392         'disabled',      'char', 'NULL',       1, '', '',
4393         'latitude',   'decimal', 'NULL',  '10,7', '', '', 
4394         'longitude',  'decimal', 'NULL',  '10,7', '', '', 
4395         'coord_auto',    'char', 'NULL',       1, '', '',
4396         'altitude',   'decimal', 'NULL',      '', '', '', 
4397         'height',     'decimal', 'NULL',      '', '', '', 
4398         'veg_height', 'decimal', 'NULL',      '', '', '', 
4399         'color',      'varchar', 'NULL',       6, '', '',
4400       ],
4401       'primary_key' => 'towernum',
4402       'unique'      => [ [ 'towername' ] ], # , 'agentnum' ] ],
4403       'index'       => [],
4404     },
4405
4406     'tower_sector' => {
4407       'columns' => [
4408         'sectornum',   'serial',     '',      '', '', '',
4409         'towernum',       'int',     '',      '', '', '',
4410         'sectorname', 'varchar',     '', $char_d, '', '',
4411         'ip_addr',    'varchar', 'NULL',      15, '', '',
4412         'height',     'decimal', 'NULL',      '', '', '', 
4413         'freq_mhz',       'int', 'NULL',      '', '', '',
4414         'direction',      'int', 'NULL',      '', '', '',
4415         'width',          'int', 'NULL',      '', '', '',
4416         #downtilt etc? rfpath has profile files for devices/antennas you upload?
4417         'range',      'decimal', 'NULL',      '', '', '',  #?
4418       ],
4419       'primary_key'  => 'sectornum',
4420       'unique'       => [ [ 'towernum', 'sectorname' ], [ 'ip_addr' ], ],
4421       'index'        => [ [ 'towernum' ] ],
4422       'foreign_keys' => [
4423                           { columns    => [ 'towernum' ],
4424                             table      => 'tower',
4425                           },
4426                         ],
4427     },
4428
4429     'part_virtual_field' => {
4430       'columns' => [
4431         'vfieldpart', 'serial', '', '', '', '', 
4432         'dbtable', 'varchar', '', 32, '', '', 
4433         'name', 'varchar', '', 32, '', '', 
4434         'length', 'int', 'NULL', '', '', '', 
4435         'label', 'varchar', 'NULL', 80, '', '', 
4436       ],
4437       'primary_key' => 'vfieldpart',
4438       'unique' => [],
4439       'index' => [],
4440     },
4441
4442     'virtual_field' => {
4443       'columns' => [
4444         'vfieldnum', 'serial', '', '', '', '', 
4445         'recnum', 'int', '', '', '', '', 
4446         'vfieldpart', 'int', '', '', '', '', 
4447         'value', 'varchar', '', 128, '', '', 
4448       ],
4449       'primary_key'  => 'vfieldnum',
4450       'unique'       => [ [ 'vfieldpart', 'recnum' ] ],
4451       'index'        => [],
4452       'foreign_keys' => [
4453                           { columns    => [ 'vfieldpart' ],
4454                             table      => 'part_virtual_field',
4455                           },
4456                         ],
4457     },
4458
4459     'acct_snarf' => {
4460       'columns' => [
4461         'snarfnum',    'serial',     '',      '', '', '', 
4462         'snarfname',  'varchar', 'NULL', $char_d, '', '', 
4463         'svcnum',         'int',     '',      '', '', '', 
4464         'machine',    'varchar',     '',     255, '', '', 
4465         'protocol',   'varchar',     '', $char_d, '', '', 
4466         'username',   'varchar',     '', $char_d, '', '', 
4467         '_password',  'varchar',     '', $char_d, '', '', 
4468         'check_freq',     'int', 'NULL',      '', '', '', 
4469         'leavemail',     'char', 'NULL',       1, '', '', 
4470         'apop',          'char', 'NULL',       1, '', '', 
4471         'tls',           'char', 'NULL',       1, '', '', 
4472         'mailbox',    'varchar', 'NULL', $char_d, '', '', 
4473       ],
4474       'primary_key'  => 'snarfnum',
4475       'unique'       => [],
4476       'index'        => [ [ 'svcnum' ] ],
4477       'foreign_keys' => [
4478                           { columns    => [ 'svcnum' ],
4479                             table      => 'svc_acct',
4480                           },
4481                         ],
4482     },
4483
4484     'svc_external' => {
4485       'columns' => [
4486         'svcnum',     'int',     '',      '', '', '', 
4487         'id',      'bigint', 'NULL',      '', '', '', 
4488         'title',  'varchar', 'NULL', $char_d, '', '', 
4489       ],
4490       'primary_key'  => 'svcnum',
4491       'unique'       => [],
4492       'index'        => [],
4493       'foreign_keys' => [
4494                           { columns    => [ 'svcnum' ],
4495                             table      => 'cust_svc',
4496                           },
4497                         ],
4498     },
4499
4500     'cust_pay_refund' => {
4501       'columns' => [
4502         'payrefundnum', 'serial', '', '', '', '', 
4503         'paynum',  'int', '', '', '', '', 
4504         'refundnum',  'int', '', '', '', '', 
4505         '_date',    @date_type, '', '', 
4506         'amount',   @money_type, '', '', 
4507       ],
4508       'primary_key'  => 'payrefundnum',
4509       'unique'       => [],
4510       'index'        => [ ['paynum'], ['refundnum'] ],
4511       'foreign_keys' => [
4512                           { columns    => [ 'paynum' ],
4513                             table      => 'cust_pay',
4514                           },
4515                           { columns    => [ 'refundnum' ],
4516                             table      => 'cust_refund',
4517                           },
4518                         ],
4519     },
4520
4521     'part_pkg_option' => {
4522       'columns' => [
4523         'optionnum', 'serial', '', '', '', '', 
4524         'pkgpart', 'int', '', '', '', '', 
4525         'optionname', 'varchar', '', $char_d, '', '', 
4526         'optionvalue', 'text', 'NULL', '', '', '', 
4527       ],
4528       'primary_key'  => 'optionnum',
4529       'unique'       => [],
4530       'index'        => [ [ 'pkgpart' ], [ 'optionname' ] ],
4531       'foreign_keys' => [
4532                           { columns    => [ 'pkgpart' ],
4533                             table      => 'part_pkg',
4534                           },
4535                         ],
4536     },
4537
4538     'part_pkg_vendor' => {
4539       'columns' => [
4540         'num', 'serial', '', '', '', '', 
4541         'pkgpart', 'int', '', '', '', '', 
4542         'exportnum', 'int', '', '', '', '', 
4543         'vendor_pkg_id', 'varchar', '', $char_d, '', '', 
4544       ],
4545       'primary_key'  => 'num',
4546       'unique'       => [ [ 'pkgpart', 'exportnum' ] ],
4547       'index'        => [ [ 'pkgpart' ] ],
4548       'foreign_keys' => [
4549                           { columns    => [ 'pkgpart' ],
4550                             table      => 'part_pkg',
4551                           },
4552                           { columns    => [ 'exportnum' ],
4553                             table      => 'part_export',
4554                           },
4555                         ],
4556     },
4557
4558     'part_pkg_report_option' => {
4559       'columns' => [
4560         'num',      'serial',   '',      '', '', '', 
4561         'name',     'varchar',  '', $char_d, '', '', 
4562         'disabled', 'char', 'NULL',       1, '', '', 
4563       ],
4564       'primary_key' => 'num',
4565       'unique' => [ [ 'name' ] ],
4566       'index' => [ [ 'disabled' ] ],
4567     },
4568
4569     'part_pkg_usage' => {
4570       'columns' => [
4571         'pkgusagepart', 'serial',   '', '', '', '',
4572         'pkgpart',  'int',      '', '', '', '',
4573         'minutes',  'int',      '', '', '', '',
4574         'priority', 'int',  'NULL', '', '', '',
4575         'shared',   'char', 'NULL',  1, '', '',
4576         'rollover', 'char', 'NULL',  1, '', '',
4577         'description',  'varchar', 'NULL', $char_d, '', '',
4578       ],
4579       'primary_key'  => 'pkgusagepart',
4580       'unique'       => [],
4581       'index'        => [ [ 'pkgpart' ] ],
4582       'foreign_keys' => [
4583                           { columns    => [ 'pkgpart' ],
4584                             table      => 'part_pkg',
4585                           },
4586                         ],
4587     },
4588
4589     'part_pkg_usage_class' => {
4590       'columns' => [
4591         'num',       'serial',  '', '', '', '',
4592         'pkgusagepart', 'int',  '', '', '', '',
4593         'classnum',     'int','NULL', '', '', '',
4594       ],
4595       'primary_key'  => 'num',
4596       'unique'       => [ [ 'pkgusagepart', 'classnum' ] ],
4597       'index'        => [],
4598       'foreign_keys' => [
4599                           { columns    => [ 'pkgusagepart' ],
4600                             table      => 'part_pkg_usage',
4601                           },
4602                           { columns    => [ 'classnum' ],
4603                             table      => 'usage_class',
4604                           },
4605                         ],
4606     },
4607
4608     'rate' => {
4609       'columns' => [
4610         'ratenum',  'serial', '', '', '', '', 
4611         'ratename', 'varchar', '', $char_d, '', '', 
4612       ],
4613       'primary_key' => 'ratenum',
4614       'unique'      => [],
4615       'index'       => [],
4616     },
4617
4618     'rate_detail' => {
4619       'columns' => [
4620         'ratedetailnum',   'serial',  '',     '',      '', '', 
4621         'ratenum',         'int',     '',     '',      '', '', 
4622         'orig_regionnum',  'int', 'NULL',     '',      '', '', 
4623         'dest_regionnum',  'int',     '',     '',      '', '', 
4624         'min_included',    'int',     '',     '',      '', '', 
4625         'conn_charge',     'decimal', '', '10,4', '0.0000', '',
4626         'conn_sec',        'int',     '',     '',      '0', '',
4627         'min_charge',      'decimal', '', '10,5',       '', '',
4628         'sec_granularity', 'int',     '',     '',       '', '', 
4629         'ratetimenum',     'int', 'NULL',     '',       '', '',
4630         'classnum',        'int', 'NULL',     '',       '', '', 
4631         'cdrtypenum',      'int', 'NULL',     '',       '', '',
4632         'region_group', 'char', 'NULL',        1,       '', '', 
4633       ],
4634       'primary_key'  => 'ratedetailnum',
4635       'unique'       => [ [ 'ratenum', 'orig_regionnum', 'dest_regionnum' ] ],
4636       'index'        => [ [ 'ratenum', 'dest_regionnum' ],
4637                           [ 'ratenum', 'ratetimenum' ]
4638                         ],
4639       'foreign_keys' => [
4640                           { columns    => [ 'ratenum' ],
4641                             table      => 'rate',
4642                           },
4643                           { columns    => [ 'orig_regionnum' ],
4644                             table      => 'rate_region',
4645                             references => [ 'regionnum' ],
4646                           },
4647                           { columns    => [ 'dest_regionnum' ],
4648                             table      => 'rate_region',
4649                             references => [ 'regionnum' ],
4650                           },
4651                           { columns    => [ 'ratetimenum' ],
4652                             table      => 'rate_time',
4653                           },
4654                           { columns    => [ 'classnum' ],
4655                             table      => 'usage_class',
4656                           },
4657                           { columns    => [ 'cdrtypenum' ],
4658                             table      => 'cdr_type',
4659                           },
4660                         ],
4661     },
4662
4663     'rate_region' => {
4664       'columns' => [
4665         'regionnum',   'serial',      '', '', '', '', 
4666         'regionname',  'varchar',     '', $char_d, '', '', 
4667         'exact_match', 'char',    'NULL',  1, '', '',
4668       ],
4669       'primary_key' => 'regionnum',
4670       'unique'      => [],
4671       'index'       => [],
4672     },
4673
4674     'rate_prefix' => {
4675       'columns' => [
4676         'prefixnum',   'serial',      '', '', '', '', 
4677         'regionnum',   'int',         '', '', '', '', 
4678         'countrycode', 'varchar',     '',  3, '', '', 
4679         'npa',         'varchar', 'NULL', 10, '', '', #actually the whole prefix
4680         'nxx',         'varchar', 'NULL',  3, '', '', #actually not used
4681         'latanum',     'int',     'NULL',      '', '', '',
4682         'state',       'char',    'NULL',       2, '', '', 
4683         'ocn',         'char',    'NULL',       4, '', '', 
4684       ],
4685       'primary_key'  => 'prefixnum',
4686       'unique'       => [],
4687       'index'        => [ [ 'countrycode' ], [ 'npa' ], [ 'regionnum' ] ],
4688       'foreign_keys' => [
4689                           { columns    => [ 'regionnum' ],
4690                             table      => 'rate_region',
4691                           },
4692                           { columns    => [ 'latanum' ],
4693                             table      => 'lata',
4694                           },
4695                         ],
4696     },
4697
4698     'rate_time' => {
4699       'columns' => [
4700         'ratetimenum', 'serial',      '',      '', '', '',
4701         'ratetimename',   'varchar',      '', $char_d, '', '',
4702       ],
4703       'primary_key' => 'ratetimenum',
4704       'unique'      => [],
4705       'index'       => [],
4706     },
4707
4708     'rate_time_interval' => {
4709       'columns' => [
4710         'intervalnum', 'serial', '', '', '', '',
4711         'stime',          'int', '', '', '', '',
4712         'etime',          'int', '', '', '', '',
4713         'ratetimenum',    'int', '', '', '', '',
4714       ],
4715       'primary_key'  => 'intervalnum',
4716       'unique'       => [],
4717       'index'        => [],
4718       'foreign_keys' => [
4719                           { columns    => [ 'ratetimenum' ],
4720                             table      => 'rate_time',
4721                           },
4722                         ],
4723      },
4724
4725     #not really part of the above rate_ stuff (used with flat rate rather than
4726     # rated billing), but could be eventually, and its a rate
4727     'rate_tier' => {
4728       'columns' => [
4729         'tiernum',   'serial', '',      '', '', '',
4730         'tiername', 'varchar', '', $char_d, '', '',
4731       ],
4732       'primary_key' => 'tiernum',
4733       'unique'      => [ [ 'tiername'], ],
4734       'index'       => [],
4735     },
4736
4737     'rate_tier_detail' => {
4738       'columns' => [
4739         'tierdetailnum', 'serial', '',     '', '', '',
4740         'tiernum',          'int', '',     '', '', '',
4741         'min_quan',         'int', '',     '', '', '',
4742         'min_charge',   'decimal', '', '10,4', '', '',
4743       ],
4744       'primary_key'  => 'tierdetailnum',
4745       'unique'       => [],
4746       'index'        => [ ['tiernum'], ],
4747       'foreign_keys' => [
4748                           { columns    => [ 'tiernum' ],
4749                             table      => 'rate_tier',
4750                           },
4751                         ],
4752     },
4753
4754     'usage_class' => {
4755       'columns' => [
4756         'classnum',    'serial',      '',      '', '', '', 
4757         'weight',      'int',     'NULL',      '', '', '',
4758         'classname',   'varchar',     '', $char_d, '', '', 
4759         'format',      'varchar', 'NULL', $char_d, '', '', 
4760         'disabled',    'char',    'NULL',       1, '', '', 
4761       ],
4762       'primary_key' => 'classnum',
4763       'unique' => [],
4764       'index' => [ ['disabled'] ],
4765     },
4766
4767     'reg_code' => {
4768       'columns' => [
4769         'codenum',   'serial',    '', '', '', '', 
4770         'code',      'varchar',   '', $char_d, '', '', 
4771         'agentnum',  'int',       '', '', '', '', 
4772       ],
4773       'primary_key'  => 'codenum',
4774       'unique'       => [ [ 'agentnum', 'code' ] ],
4775       'index'        => [ [ 'agentnum' ] ],
4776       'foreign_keys' => [
4777                           { columns    => [ 'agentnum' ],
4778                             table      => 'agent',
4779                           },
4780                         ],
4781      },
4782
4783     'reg_code_pkg' => {
4784       'columns' => [
4785         'codepkgnum', 'serial', '', '', '', '', 
4786         'codenum',   'int',    '', '', '', '', 
4787         'pkgpart',   'int',    '', '', '', '', 
4788       ],
4789       'primary_key'  => 'codepkgnum',
4790       'unique'       => [ [ 'codenum', 'pkgpart' ] ],
4791       'index'        => [ [ 'codenum' ] ],
4792       'foreign_keys' => [
4793                           { columns    => [ 'codenum' ],
4794                             table      => 'reg_code',
4795                           },
4796                           { columns    => [ 'pkgpart' ],
4797                             table      => 'part_pkg',
4798                           },
4799                         ],
4800     },
4801
4802     'clientapi_session' => {
4803       'columns' => [
4804         'sessionnum',  'serial',  '', '', '', '', 
4805         'sessionid',  'varchar',  '', $char_d, '', '', 
4806         'namespace',  'varchar',  '', $char_d, '', '', 
4807       ],
4808       'primary_key' => 'sessionnum',
4809       'unique'      => [ [ 'sessionid', 'namespace' ] ],
4810       'index'       => [],
4811     },
4812
4813     'clientapi_session_field' => {
4814       'columns' => [
4815         'fieldnum',    'serial',     '', '', '', '', 
4816         'sessionnum',     'int',     '', '', '', '', 
4817         'fieldname',  'varchar',     '', $char_d, '', '', 
4818         'fieldvalue',    'text', 'NULL', '', '', '', 
4819       ],
4820       'primary_key'  => 'fieldnum',
4821       'unique'       => [ [ 'sessionnum', 'fieldname' ] ],
4822       'index'        => [],
4823       'foreign_keys' => [
4824                           { columns    => [ 'sessionnum' ],
4825                             table      => 'clientapi_session',
4826                           },
4827                         ],
4828     },
4829
4830     'payment_gateway' => {
4831       'columns' => [
4832         'gatewaynum',       'serial',   '',     '', '', '', 
4833         'gateway_namespace','varchar',  'NULL', $char_d, '', '', 
4834         'gateway_module',   'varchar',  '',     $char_d, '', '', 
4835         'gateway_username', 'varchar',  'NULL', $char_d, '', '', 
4836         'gateway_password', 'varchar',  'NULL', $char_d, '', '', 
4837         'gateway_action',   'varchar',  'NULL', $char_d, '', '', 
4838         'gateway_callback_url', 'varchar',  'NULL', 255, '', '', 
4839         'gateway_cancel_url',   'varchar',  'NULL', 255, '', '',
4840         'disabled',   'char',  'NULL',   1, '', '', 
4841       ],
4842       'primary_key' => 'gatewaynum',
4843       'unique' => [],
4844       'index'  => [ [ 'disabled' ] ],
4845     },
4846
4847     'payment_gateway_option' => {
4848       'columns' => [
4849         'optionnum',   'serial',  '',     '', '', '', 
4850         'gatewaynum',  'int',     '',     '', '', '', 
4851         'optionname',  'varchar', '',     $char_d, '', '', 
4852         'optionvalue', 'text',    'NULL', '', '', '', 
4853       ],
4854       'primary_key'  => 'optionnum',
4855       'unique'       => [],
4856       'index'        => [ [ 'gatewaynum' ], [ 'optionname' ] ],
4857       'foreign_keys' => [
4858                           { columns    => [ 'gatewaynum' ],
4859                             table      => 'payment_gateway',
4860                           },
4861                         ],
4862     },
4863
4864     'agent_payment_gateway' => {
4865       'columns' => [
4866         'agentgatewaynum', 'serial', '', '', '', '', 
4867         'agentnum',        'int', '', '', '', '', 
4868         'gatewaynum',      'int', '', '', '', '', 
4869         'cardtype',        'varchar', 'NULL', $char_d, '', '', 
4870         'taxclass',        'varchar', 'NULL', $char_d, '', '', 
4871       ],
4872       'primary_key'  => 'agentgatewaynum',
4873       'unique'       => [],
4874       'index'        => [ [ 'agentnum', 'cardtype' ], ],
4875
4876       'foreign_keys' => [
4877
4878                           { columns    => [ 'agentnum' ],
4879                             table      => 'agent',
4880                           },
4881                           { columns    => [ 'gatewaynum' ],
4882                             table      => 'payment_gateway',
4883                           },
4884                         ],
4885     },
4886
4887     'banned_pay' => {
4888       'columns' => [
4889         'bannum',  'serial',   '',     '', '', '', 
4890         'payby',   'char',     '',       4, '', '', 
4891         'payinfo', 'varchar',  '',     128, '', '', #say, a 512-big digest _hex encoded
4892         #'paymask', 'varchar',  'NULL', $char_d, '', ''
4893         '_date',            @date_type,         '', '', 
4894         'end_date',         @date_type,         '', '', 
4895         'otaker',  'varchar',  'NULL',      32, '', '', 
4896         'usernum',     'int',  'NULL',      '', '', '',
4897         'bantype', 'varchar',  'NULL', $char_d, '', '',
4898         'reason',  'varchar',  'NULL', $char_d, '', '', 
4899       ],
4900       'primary_key'  => 'bannum',
4901       'unique'       => [],
4902       'index'        => [ [ 'payby', 'payinfo' ], [ 'usernum' ], ],
4903       'foreign_keys' => [
4904                           { columns    => [ 'usernum' ],
4905                             table      => 'access_user',
4906                           },
4907                         ],
4908     },
4909
4910     'pkg_category' => {
4911       'columns' => [
4912         'categorynum',   'serial',  '', '', '', '', 
4913         'categoryname',  'varchar', '', $char_d, '', '', 
4914         'weight',         'int', 'NULL',  '', '', '',
4915         'condense',      'char', 'NULL',   1, '', '', 
4916         'disabled',      'char', 'NULL',   1, '', '', 
4917       ],
4918       'primary_key' => 'categorynum',
4919       'unique' => [],
4920       'index' => [ ['disabled'] ],
4921     },
4922
4923     'pkg_class' => {
4924       'columns' => [
4925         'classnum',    'serial',   '',      '', '', '', 
4926         'classname',   'varchar',  '', $char_d, '', '', 
4927         'categorynum', 'int',  'NULL',      '', '', '', 
4928         'disabled',    'char', 'NULL',       1, '', '', 
4929         'fcc_ds0s',      'int',     'NULL', '', '', '', 
4930       ],
4931       'primary_key'  => 'classnum',
4932       'unique'       => [],
4933       'index'        => [ ['disabled'] ],
4934       'foreign_keys' => [
4935                           { columns    => [ 'categorynum' ],
4936                             table      => 'pkg_category',
4937                           },
4938                         ],
4939     },
4940
4941     'cdr' => {
4942       'columns' => [
4943         # qw( name type null length default local );
4944
4945         ###
4946         #asterisk fields
4947         ###
4948
4949         'acctid',   'bigserial',  '', '', '', '', 
4950         #'calldate', 'TIMESTAMP with time zone', '', '', \'now()', '',
4951         'calldate', 'timestamp',   '',      '', \'now()', '',
4952         'clid',        'varchar',  '', $char_d, \"''", '', 
4953         'src',         'varchar',  '', $char_d, \"''", '', 
4954         'dst',         'varchar',  '', $char_d, \"''", '', 
4955         'dcontext',    'varchar',  '', $char_d, \"''", '', 
4956         'channel',     'varchar',  '', $char_d, \"''", '', 
4957         'dstchannel',  'varchar',  '', $char_d, \"''", '', 
4958         'lastapp',     'varchar',  '', $char_d, \"''", '', 
4959         'lastdata',    'varchar',  '',     255, \"''", '', 
4960
4961         #currently only opensips
4962         'src_ip_addr', 'varchar',  'NULL',  15,    '', '',
4963         'dst_ip_addr', 'varchar',  'NULL',  15,    '', '',
4964
4965         #currently only u4:
4966         # terminating number (as opposed to dialed destination)
4967         'dst_term',    'varchar',  'NULL', $char_d, '', '',
4968
4969         #these don't seem to be logged by most of the SQL cdr_* modules
4970         #except tds under sql-illegal names, so;
4971         # ... don't rely on them for rating?
4972         # and, what they hey, i went ahead and changed the names and data types
4973         # to freeside-style dates...
4974           #'start',  'timestamp', 'NULL',  '',    '', '',
4975           #'answer', 'timestamp', 'NULL',  '',    '', '',
4976           #'end',    'timestamp', 'NULL',  '',    '', '',
4977         'startdate',  @date_type, '', '', 
4978         'answerdate', @date_type, '', '', 
4979         'enddate',    @date_type, '', '', 
4980         #
4981
4982         'duration',    'int',      '',      '',     0, '',
4983         'billsec',     'int',      '',      '',     0, '', 
4984         'disposition', 'varchar',  '',      45, \"''", '',
4985         'amaflags',    'int',      '',      '',     0, '',
4986         'accountcode', 'varchar',  '',      20, \"''", '',
4987         'uniqueid',    'varchar',  '', $char_d, \"''", '',
4988         'userfield',   'varchar',  '',     512, \"''", '',
4989
4990         'max_callers', 'int',  'NULL',      '',    '', '',
4991
4992         ###
4993         # old fields for unitel/RSLCOM/convergent that don't map to asterisk
4994         # ones we adoped moved to "own fields" section below
4995         # charged_party, upstream_price, rated_price, carrierid, cdrtypenum
4996         ###
4997
4998         'upstream_currency',      'char', 'NULL',       3, '', '',
4999         'upstream_rateplanid',     'int', 'NULL',      '', '', '', #?
5000
5001         # how it was rated internally...
5002         'ratedetailnum',           'int', 'NULL',      '', '', '',
5003
5004         'distance',            'decimal', 'NULL',      '', '', '',
5005         'islocal',                 'int', 'NULL',      '', '', '', # '',  '', 0, '' instead?
5006
5007         #cdr_calltype: the big list in appendix 2
5008         'calltypenum',             'int', 'NULL',      '', '', '',
5009
5010         'description',         'varchar', 'NULL', $char_d, '', '',
5011         'quantity',                'int', 'NULL',      '', '', '', 
5012
5013         'upstream_rateid',         'int', 'NULL',      '', '', '',
5014
5015         ###
5016         # more fields, for GSM imports
5017         ###
5018         'servicecode',             'int', 'NULL',      '', '', '',
5019         'quantity_able',           'int', 'NULL',      '', '', '', 
5020
5021         ###
5022         #and now for our own fields
5023         ###
5024
5025         'cdrtypenum',              'int', 'NULL',      '', '', '',
5026
5027         'charged_party',       'varchar', 'NULL', $char_d, '', '',
5028         'charged_party_imsi',  'varchar', 'NULL', $char_d, '', '',
5029
5030         'upstream_price',      'decimal', 'NULL',  '10,5', '', '', 
5031         'upstream_src_regionname', 'varchar', 'NULL', $char_d, '', '',
5032         'upstream_dst_regionname', 'varchar', 'NULL', $char_d, '', '',
5033
5034         # how it was rated internally...
5035         'rated_pretty_dst',       'varchar', 'NULL', $char_d, '', '',
5036         'rated_regionname',       'varchar', 'NULL', $char_d, '', '',
5037         'rated_price',            'decimal', 'NULL',  '10,4', '', '',
5038         'rated_seconds',              'int', 'NULL',      '', '', '',
5039         'rated_minutes', 'double precision', 'NULL',      '', '', '',
5040         'rated_granularity',          'int', 'NULL',      '', '', '',
5041         'rated_ratedetailnum',        'int', 'NULL',      '', '', '',
5042         'rated_classnum',             'int', 'NULL',      '', '', '', 
5043         'rated_ratename',         'varchar', 'NULL', $char_d, '', '', 
5044
5045         'carrierid',               'bigint', 'NULL',      '', '', '',
5046
5047         # service it was matched to
5048         'svcnum',             'int',   'NULL',     '',   '', '', 
5049
5050         #NULL, done (or something)
5051         'freesidestatus', 'varchar',   'NULL',     32,   '', '', 
5052
5053         #NULL, done (or something)
5054         'freesiderewritestatus', 'varchar',   'NULL',     32,   '', '', 
5055
5056         #an indexed place to put big numbers
5057         'cdrid',         'bigint',     'NULL',     '',  '', '', 
5058
5059         #for taqua accountcode rewriting, for starters
5060         'sessionnum',       'int',    'NULL',      '', '', '',
5061         'subscriber',   'varchar',    'NULL', $char_d, '', '',
5062
5063         #old
5064         'cdrbatch',     'varchar',    'NULL',     255, '', '',
5065         #new
5066         'cdrbatchnum',      'int',    'NULL',      '', '', '',
5067
5068       ],
5069       'primary_key' => 'acctid',
5070       'unique' => [],
5071       'index' => [ [ 'calldate' ],
5072                    [ 'src' ], [ 'dst' ], [ 'dcontext' ], [ 'charged_party' ],
5073                    [ 'lastapp' ],
5074                    ['accountcode'], ['uniqueid'], ['carrierid'], ['cdrid'],
5075                    [ 'sessionnum' ], [ 'subscriber' ],
5076                    [ 'freesidestatus' ], [ 'freesiderewritestatus' ],
5077                    [ 'cdrbatch' ], [ 'cdrbatchnum' ],
5078                    [ 'src_ip_addr' ], [ 'dst_ip_addr' ], [ 'dst_term' ],
5079                  ],
5080       #no FKs on cdr table... choosing not to throw errors no matter what's
5081       # thrown in here.  better to have the data.
5082     },
5083
5084     'cdr_batch' => {
5085       'columns' => [
5086         'cdrbatchnum',   'serial',    '',   '', '', '', 
5087         'cdrbatch', 'varchar', 'NULL', 255, '', '',
5088         '_date',     @date_type, '', '', 
5089       ],
5090       'primary_key' => 'cdrbatchnum',
5091       'unique' => [ [ 'cdrbatch' ] ],
5092       'index' => [],
5093     },
5094
5095     'cdr_termination' => {
5096       'columns' => [
5097         'cdrtermnum', 'bigserial',     '',      '', '', '',
5098         'acctid',        'bigint',     '',      '', '', '', 
5099         'termpart',         'int',     '',      '', '', '',#future use see below
5100         'rated_price',  'decimal', 'NULL',  '10,4', '', '',
5101         'rated_seconds',    'int', 'NULL',      '', '', '',
5102         'rated_minutes', 'double precision', 'NULL',   '', '', '',
5103         'status',       'varchar', 'NULL',      32, '', '',
5104         'svcnum',           'int', 'NULL',      '', '', '',
5105       ],
5106       'primary_key'  => 'cdrtermnum',
5107       'unique'       => [ [ 'acctid', 'termpart' ] ],
5108       'index'        => [ [ 'acctid' ], [ 'status' ], ],
5109       'foreign_keys' => [
5110                           { columns    => [ 'acctid' ],
5111                             table      => 'cdr',
5112                           },
5113                           { columns    => [ 'svcnum' ],
5114                             table      => 'cust_svc',
5115                           },
5116                         ],
5117     },
5118
5119     #to handle multiple termination/settlement passes...
5120    # 'part_termination' => {
5121    #   'columns' => [
5122    #     'termpart',       'int', '',      '', '', '',
5123    #     'termname',   'varchar', '', $char_d, '', '',
5124    #     'cdr_column', 'varchar', '', $char_d, '', '', #maybe set it here instead of in the price plan?
5125    #   ],
5126    #   'primary_key' => 'termpart',
5127    #   'unique' => [],
5128    #   'index'  => [],
5129    # },
5130
5131     #the remaining cdr_ tables are not really used
5132     'cdr_calltype' => {
5133       'columns' => [
5134         'calltypenum',   'serial',  '', '', '', '', 
5135         'calltypename',  'varchar', '', $char_d, '', '', 
5136       ],
5137       'primary_key' => 'calltypenum',
5138       'unique'      => [],
5139       'index'       => [],
5140     },
5141
5142     'cdr_type' => {
5143       'columns' => [
5144         'cdrtypenum'  => 'serial',  '', '', '', '',
5145         'cdrtypename' => 'varchar', '', $char_d, '', '',
5146       ],
5147       'primary_key' => 'cdrtypenum',
5148       'unique'      => [],
5149       'index'       => [],
5150     },
5151
5152     'cdr_carrier' => {
5153       'columns' => [
5154         'carrierid'   =>  'serial',     '',      '', '', '',
5155         'carriername' => 'varchar',     '', $char_d, '', '',
5156         'disabled'    =>    'char', 'NULL',       1, '', '', 
5157       ],
5158       'primary_key' => 'carrierid',
5159       'unique'      => [],
5160       'index'       => [],
5161     },
5162
5163     #'cdr_file' => {
5164     #  'columns' => [
5165     #    'filenum',    'serial',     '', '', '', '',
5166     #    'filename',  'varchar',     '', '', '', '',
5167     #    'status',    'varchar', 'NULL', '', '', '',
5168     #  ],
5169     #  'primary_key' => 'filenum',
5170     #  'unique' => [ [ 'filename' ], ], #just change the index if we need to
5171     #                                   # agent-virtualize or have a customer
5172     #                                   # with dup-filename needs or something
5173     #                                   # (only used by cdr.http_and_import for
5174     #                                   #  chrissakes)
5175     #  'index'  => [],
5176     #},
5177
5178     'inventory_item' => {
5179       'columns' => [
5180         'itemnum',   'serial',      '',      '', '', '',
5181         'classnum',  'int',         '',      '', '', '',
5182         'agentnum',  'int',     'NULL',      '', '', '',
5183         'item',      'varchar',     '', $char_d, '', '',
5184         'svcnum',    'int',     'NULL',      '', '', '',
5185         'svc_field', 'varchar', 'NULL', $char_d, '', '',
5186       ],
5187       'primary_key'  => 'itemnum',
5188       'unique'       => [ [ 'classnum', 'item' ] ],
5189       'index'        => [ [ 'classnum' ], [ 'agentnum' ], [ 'svcnum' ] ],
5190       'foreign_keys' => [
5191                           { columns    => [ 'classnum' ],
5192                             table      => 'inventory_class',
5193                           },
5194                           { columns    => [ 'agentnum' ],
5195                             table      => 'agent',
5196                           },
5197                           { columns    => [ 'svcnum' ],
5198                             table      => 'cust_svc',
5199                           },
5200                         ],
5201     },
5202
5203     'inventory_class' => {
5204       'columns' => [
5205         'classnum',  'serial',       '',      '', '', '',
5206         'classname', 'varchar',      '', $char_d, '', '',
5207       ],
5208       'primary_key' => 'classnum',
5209       'unique' => [],
5210       'index'  => [],
5211     },
5212
5213     'access_user_session' => {
5214       'columns' => [
5215         'sessionnum',   'serial',  '',      '', '', '', 
5216         'sessionkey',  'varchar',  '', $char_d, '', '',
5217         'usernum',         'int',  '',      '', '', '',
5218         'start_date', @date_type,               '', '',
5219         'last_date',  @date_type,               '', '',
5220       ],
5221       'primary_key'  => 'sessionnum',
5222       'unique'       => [ [ 'sessionkey' ] ],
5223       'index'        => [],
5224       'foreign_keys' => [
5225                           { columns    => [ 'usernum' ],
5226                             table      => 'access_user',
5227                           },
5228                         ],
5229     },
5230
5231     'access_user' => {
5232       'columns' => [
5233         'usernum',             'serial',     '',      '', '', '',
5234         'username',           'varchar',     '', $char_d, '', '',
5235         '_password',          'varchar', 'NULL', $char_d, '', '',
5236         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
5237         'last',               'varchar', 'NULL', $char_d, '', '', 
5238         'first',              'varchar', 'NULL', $char_d, '', '', 
5239         'user_custnum',           'int', 'NULL',      '', '', '',
5240         'report_salesnum',        'int', 'NULL',      '', '', '',
5241         'disabled',              'char', 'NULL',       1, '', '', 
5242       ],
5243       'primary_key'  => 'usernum',
5244       'unique'       => [ [ 'username' ] ],
5245       'index'        => [ [ 'user_custnum' ] ],
5246       'foreign_keys' => [
5247                           { columns    => [ 'user_custnum' ],
5248                             table      => 'cust_main',
5249                             references => [ 'custnum' ],
5250                           },
5251                           { columns    => [ 'report_salesnum' ],
5252                             table      => 'sales',
5253                             references => [ 'salesnum' ],
5254                           },
5255                         ],
5256     },
5257
5258     'access_user_pref' => {
5259       'columns' => [
5260         'prefnum',    'serial',       '', '', '', '',
5261         'usernum',     'int',       '', '', '', '',
5262         'prefname', 'varchar', '', $char_d, '', '', 
5263         'prefvalue', 'text', 'NULL', '', '', '', 
5264         'expiration', @date_type, '', '',
5265       ],
5266       'primary_key'  => 'prefnum',
5267       'unique'       => [],
5268       'index'        => [ [ 'usernum' ] ],
5269       'foreign_keys' => [
5270                           { columns    => [ 'usernum' ],
5271                             table      => 'access_user',
5272                           },
5273                         ],
5274     },
5275
5276     'access_group' => {
5277       'columns' => [
5278         'groupnum',   'serial', '',      '', '', '',
5279         'groupname', 'varchar', '', $char_d, '', '',
5280       ],
5281       'primary_key' => 'groupnum',
5282       'unique' => [ [ 'groupname' ] ],
5283       'index'  => [],
5284     },
5285
5286     'access_usergroup' => {
5287       'columns' => [
5288         'usergroupnum', 'serial', '', '', '', '',
5289         'usernum',         'int', '', '', '', '',
5290         'groupnum',        'int', '', '', '', '',
5291       ],
5292       'primary_key'  => 'usergroupnum',
5293       'unique'       => [ [ 'usernum', 'groupnum' ] ],
5294       'index'        => [ [ 'usernum' ] ],
5295       'foreign_keys' => [
5296                           { columns    => [ 'usernum' ],
5297                             table      => 'access_user',
5298                           },
5299                           { columns    => [ 'groupnum' ],
5300                             table      => 'access_group',
5301                           },
5302                         ],
5303      },
5304
5305     'access_groupagent' => {
5306       'columns' => [
5307         'groupagentnum', 'serial', '', '', '', '',
5308         'groupnum',         'int', '', '', '', '',
5309         'agentnum',         'int', '', '', '', '',
5310       ],
5311       'primary_key'  => 'groupagentnum',
5312       'unique'       => [ [ 'groupnum', 'agentnum' ] ],
5313       'index'        => [ [ 'groupnum' ] ],
5314       'foreign_keys' => [
5315                           { columns    => [ 'groupnum' ],
5316                             table      => 'access_group',
5317                           },
5318                           { columns    => [ 'agentnum' ],
5319                             table      => 'agent',
5320                           },
5321                         ],
5322     },
5323
5324     'access_right' => {
5325       'columns' => [
5326         'rightnum',   'serial', '',      '', '', '',
5327         'righttype', 'varchar', '', $char_d, '', '',
5328         'rightobjnum',   'int', '',      '', '', '',
5329         'rightname', 'varchar', '', $char_d, '', '',
5330       ],
5331       'primary_key' => 'rightnum',
5332       'unique' => [ [ 'righttype', 'rightobjnum', 'rightname' ] ],
5333       'index'  => [],
5334     },
5335
5336     'svc_phone' => {
5337       'columns' => [
5338         'svcnum',                         'int',     '',      '', '', '', 
5339         'countrycode',                'varchar',     '',       3, '', '', 
5340         'phonenum',                   'varchar',     '',      25, '', '', #12 ?
5341         'sim_imsi',                   'varchar', 'NULL',      15, '', '',
5342         'pin',                        'varchar', 'NULL', $char_d, '', '',
5343         'sip_password',               'varchar', 'NULL', $char_d, '', '',
5344         'phone_name',                 'varchar', 'NULL', $char_d, '', '',
5345         'pbxsvc',                         'int', 'NULL',      '', '', '',
5346         'domsvc',                         'int', 'NULL',      '', '', '', 
5347         'locationnum',                    'int', 'NULL',      '', '', '',
5348         'forwarddst',                 'varchar', 'NULL',      15, '', '', 
5349         'email',                      'varchar', 'NULL',     255, '', '', 
5350         'lnp_status',                 'varchar', 'NULL', $char_d, '', '',
5351         'portable',                      'char', 'NULL',       1, '', '', 
5352         'lrn',                           'char', 'NULL',      10, '', '', 
5353         'lnp_desired_due_date',           'int', 'NULL',      '', '', '',
5354         'lnp_due_date',                   'int', 'NULL',      '', '', '',
5355         'lnp_other_provider',         'varchar', 'NULL', $char_d, '', '',
5356         'lnp_other_provider_account', 'varchar', 'NULL', $char_d, '', '',
5357         'lnp_reject_reason',          'varchar', 'NULL', $char_d, '', '',
5358         'sms_carrierid',                  'int', 'NULL',      '', '', '',
5359         'sms_account',                'varchar', 'NULL', $char_d, '', '',
5360         'max_simultaneous',               'int', 'NULL',      '', '', '',
5361       ],
5362       'primary_key'  => 'svcnum',
5363       'unique'       => [ [ 'sms_carrierid', 'sms_account'] ],
5364       'index'        => [ ['countrycode', 'phonenum'], ['pbxsvc'], ['domsvc'],
5365                           ['locationnum'], ['sms_carrierid'],
5366                         ],
5367       'foreign_keys' => [
5368                           { columns    => [ 'svcnum' ],
5369                             table      => 'cust_svc',
5370                           },
5371                           { columns    => [ 'pbxsvc' ],
5372                             table      => 'svc_pbx', #'cust_svc',
5373                             references => [ 'svcnum' ],
5374                           },
5375                           { columns    => [ 'domsvc' ],
5376                             table      => 'svc_domain', #'cust_svc',
5377                             references => [ 'svcnum' ],
5378                           },
5379                           { columns    => [ 'locationnum' ],
5380                             table      => 'cust_location',
5381                           },
5382                           { columns    => [ 'sms_carrierid' ],
5383                             table      => 'cdr_carrier',
5384                             references => [ 'carrierid' ],
5385                           },
5386                         ],
5387     },
5388
5389     'phone_device' => {
5390       'columns' => [
5391         'devicenum', 'serial',     '', '', '', '',
5392         'devicepart',   'int',     '', '', '', '',
5393         'svcnum',       'int',     '', '', '', '', 
5394         'mac_addr', 'varchar', 'NULL', 12, '', '', 
5395       ],
5396       'primary_key'  => 'devicenum',
5397       'unique'       => [ [ 'mac_addr' ], ],
5398       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
5399       'foreign_keys' => [
5400                           { columns    => [ 'devicepart' ],
5401                             table      => 'part_device',
5402                           },
5403                           { columns    => [ 'svcnum' ],
5404                             table      => 'svc_phone',
5405                           },
5406                         ],
5407     },
5408
5409     'part_device' => {
5410       'columns' => [
5411         'devicepart', 'serial',  '',      '', '', '',
5412         'devicename', 'varchar', '', $char_d, '', '',
5413         'inventory_classnum', 'int', 'NULL', '', '', '',
5414       ],
5415       'primary_key'  => 'devicepart',
5416       'unique'       => [ [ 'devicename' ] ], #?
5417       'index'        => [],
5418       'foreign_keys' => [
5419                           { columns    => [ 'inventory_classnum' ],
5420                             table      => 'inventory_class',
5421                             references => [ 'classnum' ],
5422                           },
5423                         ],
5424     },
5425
5426     'phone_avail' => {
5427       'columns' => [
5428         'availnum',    'serial',      '',      '', '', '', 
5429         'exportnum',   'int',         '',      '', '', '', 
5430         'countrycode', 'varchar',     '',       3, '', '', 
5431         'state',       'char',    'NULL',       2, '', '', 
5432         'npa',         'char',        '',       3, '', '', 
5433         'nxx',         'char',    'NULL',       3, '', '', 
5434         'station',     'char',    'NULL',       4, '', '',
5435         'name',        'varchar', 'NULL', $char_d, '', '',
5436         'rate_center_abbrev', 'varchar', 'NULL', $char_d, '', '',
5437         'latanum',      'int',     'NULL',      '', '', '',
5438         'msanum',       'int', 'NULL', '', '', '',
5439         'ordernum',      'int',     'NULL',      '', '', '',
5440         'svcnum',      'int',     'NULL',      '', '', '',
5441         'availbatch', 'varchar',  'NULL', $char_d, '', '',
5442       ],
5443       'primary_key'  => 'availnum',
5444       'unique'       => [],
5445       'index'        => [ ['exportnum','countrycode','state'],    #npa search
5446                           ['exportnum','countrycode','npa'],      #nxx search
5447                           ['exportnum','countrycode','npa','nxx'],#station srch
5448                           [ 'exportnum','countrycode','npa','nxx','station'], #
5449                           [ 'svcnum' ],
5450                           [ 'availbatch' ],
5451                           [ 'latanum' ],
5452                         ],
5453       'foreign_keys' => [
5454                           { columns    => [ 'exportnum' ],
5455                             table      => 'part_export',
5456                           },
5457                           { columns    => [ 'latanum' ],
5458                             table      => 'lata',
5459                           },
5460                           { columns    => [ 'msanum' ],
5461                             table      => 'msa',
5462                           },
5463                           { columns    => [ 'ordernum' ],
5464                             table      => 'did_order',
5465                           },
5466                           { columns    => [ 'svcnum' ],
5467                             table      => 'svc_phone',
5468                           },
5469                         ],
5470     },
5471
5472     'lata' => {
5473       'columns' => [
5474         'latanum',    'int',      '',      '', '', '', 
5475         'description',   'varchar',    '',      $char_d, '', '', 
5476         'have_usage',   'int',    'NULL',      '', '', '', 
5477       ],
5478       'primary_key' => 'latanum',
5479       'unique' => [],
5480       'index'  => [],
5481     },
5482
5483     'msa' => {
5484       'columns' => [
5485         'msanum',    'int',      '',      '', '', '', 
5486         'description',   'varchar',    '',      $char_d, '', '', 
5487       ],
5488       'primary_key' => 'msanum',
5489       'unique' => [],
5490       'index'  => [],
5491     },
5492
5493     'rate_center' => {
5494       'columns' => [
5495         'ratecenternum',    'serial',      '',      '', '', '', 
5496         'description',   'varchar',    '',      $char_d, '', '', 
5497       ],
5498       'primary_key' => 'ratecenternum',
5499       'unique' => [],
5500       'index'  => [],
5501     },
5502
5503     'did_vendor' => {
5504       'columns' => [
5505         'vendornum',    'serial',      '',      '', '', '', 
5506         'vendorname',   'varchar',        '',     $char_d, '', '', 
5507       ],
5508       'primary_key' => 'vendornum',
5509       'unique' => [],
5510       'index'  => [],
5511     },
5512
5513     'did_order_item' => {
5514       'columns' => [
5515         'orderitemnum',    'serial',      '',      '', '', '', 
5516         'ordernum',    'int',      '',      '', '', '', 
5517         'msanum',      'int',     'NULL',      '', '', '',
5518         'npa',      'int',     'NULL',      '', '', '',
5519         'latanum',      'int',     'NULL',      '', '', '',
5520         'ratecenternum',      'int',     'NULL',      '', '', '',
5521         'state',       'char',    'NULL',       2, '', '', 
5522         'quantity',      'int',     '',      '', '', '',
5523         'custnum',   'int', 'NULL', '', '', '',
5524       ],
5525       'primary_key'  => 'orderitemnum',
5526       'unique'       => [],
5527       'index'        => [],
5528       'foreign_keys' => [
5529                           { columns    => [ 'ordernum' ],
5530                             table      => 'did_order',
5531                           },
5532                           { columns    => [ 'msanum' ],
5533                             table      => 'msa',
5534                           },
5535                           { columns    => [ 'latanum' ],
5536                             table      => 'lata',
5537                           },
5538                           { columns    => [ 'ratecenternum' ],
5539                             table      => 'rate_center',
5540                           },
5541                           { columns    => [ 'custnum' ],
5542                             table      => 'cust_main',
5543                           },
5544                         ],
5545     },
5546
5547     'did_order' => {
5548       'columns' => [
5549         'ordernum',    'serial',      '',      '', '', '', 
5550         'vendornum',   'int',       '',      '', '', '', 
5551         'vendor_order_id',   'varchar',  'NULL',   $char_d, '', '', 
5552         'custnum',   'int', 'NULL', '', '', '',
5553         'submitted',      'int',     '',      '', '', '',
5554         'confirmed',      'int',     'NULL',      '', '', '',
5555         'received',      'int',     'NULL',      '', '', '',
5556       ],
5557       'primary_key'  => 'ordernum',
5558       'unique'       => [ [ 'vendornum', 'vendor_order_id' ] ],
5559       'index'        => [],
5560       'foreign_keys' => [
5561                           { columns    => [ 'vendornum' ],
5562                             table      => 'did_vendor',
5563                           },
5564                           { columns    => [ 'custnum' ],
5565                             table      => 'cust_main',
5566                           },
5567                         ],
5568     },
5569
5570     'reason_type' => {
5571       'columns' => [
5572         'typenum',   'serial',  '', '', '', '', 
5573         'class',     'char', '', 1, '', '', 
5574         'type',     'varchar', '', $char_d, '', '', 
5575       ],
5576       'primary_key' => 'typenum',
5577       'unique' => [],
5578       'index' => [],
5579     },
5580
5581     'reason' => {
5582       'columns' => [
5583         'reasonnum',     'serial',  '', '', '', '', 
5584         'reason_type',   'int',  '', '', '', '', 
5585         'reason',        'text', '', '', '', '', 
5586         'disabled',      'char',    'NULL', 1, '', '', 
5587         'unsuspend_pkgpart', 'int',  'NULL', '', '', '',
5588         'unsuspend_hold','char',    'NULL', 1, '', '',
5589       ],
5590       'primary_key'  => 'reasonnum',
5591       'unique'       => [],
5592       'index'        => [],
5593       'foreign_keys' => [
5594                           { columns    => [ 'reason_type' ],
5595                             table      => 'reason_type',
5596                             references => [ 'typenum' ],
5597                           },
5598                           { columns    => [ 'unsuspend_pkgpart' ],
5599                             table      => 'part_pkg',
5600                             references => [ 'pkgpart' ],
5601                           },
5602                         ],
5603     },
5604
5605     'conf' => {
5606       'columns' => [
5607         'confnum',  'serial',     '',      '', '', '', 
5608         'agentnum', 'int',    'NULL',      '', '', '', 
5609         'locale',   'varchar','NULL',      16, '', '',
5610         'name',     'varchar',    '', $char_d, '', '', 
5611         'value',    'text',   'NULL',      '', '', '',
5612       ],
5613       'primary_key'  => 'confnum',
5614       'unique'       => [ [ 'agentnum', 'locale', 'name' ] ],
5615       'index'        => [],
5616       'foreign_keys' => [
5617                           { columns    => [ 'agentnum' ],
5618                             table      => 'agent',
5619                           },
5620                         ],
5621     },
5622
5623     'pkg_referral' => {
5624       'columns' => [
5625         'pkgrefnum',     'serial', '', '', '', '',
5626         'pkgnum',        'int',    '', '', '', '',
5627         'refnum',        'int',    '', '', '', '',
5628       ],
5629       'primary_key'  => 'pkgrefnum',
5630       'unique'       => [ [ 'pkgnum', 'refnum' ] ],
5631       'index'        => [ [ 'pkgnum' ], [ 'refnum' ] ],
5632       'foreign_keys' => [
5633                           { columns    => [ 'pkgnum' ],
5634                             table      => 'cust_pkg',
5635                           },
5636                           { columns    => [ 'refnum' ],
5637                             table      => 'part_referral',
5638                           },
5639                         ],
5640     },
5641
5642     'svc_pbx' => {
5643       'columns' => [
5644         'svcnum',           'int',     '',      '', '', '', 
5645         'id',               'int', 'NULL',      '', '', '', 
5646         'title',        'varchar', 'NULL', $char_d, '', '', 
5647         'max_extensions',   'int', 'NULL',      '', '', '',
5648         'max_simultaneous', 'int', 'NULL',      '', '', '',
5649       ],
5650       'primary_key'  => 'svcnum',
5651       'unique'       => [],
5652       'index'        => [ [ 'id' ] ],
5653       'foreign_keys' => [
5654                           { columns    => [ 'svcnum' ],
5655                             table      => 'cust_svc',
5656                           },
5657                         ],
5658     },
5659
5660     'svc_mailinglist' => { #svc_group?
5661       'columns' => [
5662         'svcnum',            'int',     '',            '', '', '', 
5663         'username',      'varchar',     '', $username_len, '', '',
5664         'domsvc',            'int',     '',            '', '', '', 
5665         'listnum',           'int',     '',            '', '', '',
5666         'reply_to',         'char', 'NULL',             1, '', '',#SetReplyTo
5667         'remove_from',      'char', 'NULL',             1, '', '',#RemoveAuthor
5668         'reject_auto',      'char', 'NULL',             1, '', '',#RejectAuto
5669         'remove_to_and_cc', 'char', 'NULL',             1, '', '',#RemoveToAndCc
5670       ],
5671       'primary_key'  => 'svcnum',
5672       'unique'       => [],
5673       'index'        => [ ['username'], ['domsvc'], ['listnum'] ],
5674       'foreign_keys' => [
5675                           { columns    => [ 'svcnum' ],
5676                             table      => 'cust_svc',
5677                           },
5678                           { columns    => [ 'domsvc' ],
5679                             table      => 'svc_domain', #'cust_svc',
5680                             references => [ 'svcnum' ],
5681                           },
5682                           { columns    => [ 'listnum' ],
5683                             table      => 'mailinglist',
5684                           },
5685                         ],
5686     },
5687
5688     'mailinglist' => {
5689       'columns' => [
5690         'listnum',   'serial', '',      '', '', '',
5691         'listname', 'varchar', '', $char_d, '', '',
5692       ],
5693       'primary_key' => 'listnum',
5694       'unique' => [],
5695       'index'  => [],
5696     },
5697
5698     'mailinglistmember' => {
5699       'columns' => [
5700         'membernum',        'serial',     '',   '', '', '',
5701         'listnum',             'int',     '',   '', '', '',
5702         'svcnum',              'int', 'NULL',   '', '', '', 
5703         'contactemailnum',     'int', 'NULL',   '', '', '', 
5704         'email',           'varchar', 'NULL',  255, '', '', 
5705       ],
5706       'primary_key'  => 'membernum',
5707       'unique'       => [],
5708       'index'        => [['listnum'],['svcnum'],['contactemailnum'],['email']],
5709       'foreign_keys' => [
5710                           { columns    => [ 'listnum' ],
5711                             table      => 'mailinglist',
5712                           },
5713                           { columns    => [ 'svcnum' ],
5714                             table      => 'svc_acct',
5715                           },
5716                           { columns    => [ 'contactemailnum' ],
5717                             table      => 'contact_email',
5718                           },
5719                         ],
5720     },
5721
5722     'bill_batch' => {
5723       'columns' => [
5724         'batchnum',         'serial',     '',  '', '', '',
5725         'agentnum',            'int', 'NULL',  '', '', '',
5726         'status',             'char', 'NULL', '1', '', '',
5727         'pdf',                'blob', 'NULL',  '', '', '',
5728       ],
5729       'primary_key'  => 'batchnum',
5730       'unique'       => [],
5731       'index'        => [ ['agentnum'] ],
5732       'foreign_keys' => [
5733                           { columns    => [ 'agentnum' ],
5734                             table      => 'agent',
5735                           },
5736                         ],
5737     },
5738
5739     'cust_bill_batch' => {
5740       'columns' => [
5741         'billbatchnum',     'serial',     '', '', '', '',
5742         'batchnum',            'int',     '', '', '', '',
5743         'invnum',              'int',     '', '', '', '',
5744       ],
5745       'primary_key'  => 'billbatchnum',
5746       'unique'       => [],
5747       'index'        => [ [ 'batchnum' ], [ 'invnum' ] ],
5748       'foreign_keys' => [
5749                           { columns    => [ 'batchnum' ],
5750                             table      => 'bill_batch',
5751                           },
5752                           { columns    => [ 'invnum' ],
5753                             table      => 'cust_bill',
5754                           },
5755                         ],
5756     },
5757
5758     'cust_bill_batch_option' => {
5759       'columns' => [
5760         'optionnum', 'serial', '', '', '', '', 
5761         'billbatchnum', 'int', '', '', '', '', 
5762         'optionname', 'varchar', '', $char_d, '', '', 
5763         'optionvalue', 'text', 'NULL', '', '', '', 
5764       ],
5765       'primary_key'  => 'optionnum',
5766       'unique'       => [],
5767       'index'        => [ [ 'billbatchnum' ], [ 'optionname' ] ],
5768       'foreign_keys' => [
5769                           { columns    => [ 'billbatchnum' ],
5770                             table      => 'cust_bill_batch',
5771                           },
5772                         ],
5773      },
5774
5775     'msg_template' => {
5776       'columns' => [
5777         'msgnum',     'serial',     '',      '', '', '',
5778         'msgname',   'varchar',     '', $char_d, '', '',
5779         'agentnum',      'int', 'NULL',      '', '', '',
5780         'subject',   'varchar', 'NULL',     512, '', '',
5781         'mime_type', 'varchar',     '', $char_d, '', '',
5782         'body',         'blob', 'NULL',      '', '', '',
5783         'disabled',     'char', 'NULL',       1, '', '', 
5784         'from_addr', 'varchar', 'NULL',     255, '', '',
5785         'bcc_addr',  'varchar', 'NULL',     255, '', '',
5786       ],
5787       'primary_key'  => 'msgnum',
5788       'unique'       => [ ],
5789       'index'        => [ ['agentnum'], ],
5790       'foreign_keys' => [
5791                           { columns    => [ 'agentnum' ],
5792                             table      => 'agent',
5793                           },
5794                         ],
5795     },
5796
5797     'template_content' => {
5798       'columns' => [
5799         'contentnum', 'serial',     '',      '', '', '',
5800         'msgnum',        'int',     '',      '', '', '',
5801         'locale',    'varchar', 'NULL',      16, '', '',
5802         'subject',   'varchar', 'NULL',     512, '', '',
5803         'body',         'text', 'NULL',      '', '', '',
5804       ],
5805       'primary_key'  => 'contentnum',
5806       'unique'       => [ ['msgnum', 'locale'] ],
5807       'index'        => [ ],
5808       'foreign_keys' => [
5809                           { columns    => [ 'msgnum' ],
5810                             table      => 'msg_template',
5811                           },
5812                         ],
5813     },
5814
5815     'cust_msg' => {
5816       'columns' => [
5817         'custmsgnum', 'serial',     '',     '', '', '',
5818         'custnum',       'int',     '',     '', '', '',
5819         'msgnum',        'int', 'NULL',     '', '', '',
5820         '_date',    @date_type,                 '', '',
5821         'env_from',  'varchar', 'NULL',    255, '', '',
5822         'env_to',    'varchar', 'NULL',    255, '', '',
5823         'header',       'blob', 'NULL',     '', '', '',
5824         'body',         'blob', 'NULL',     '', '', '',
5825         'error',     'varchar', 'NULL',    255, '', '',
5826         'status',    'varchar',     '',$char_d, '', '',
5827       ],
5828       'primary_key'  => 'custmsgnum',
5829       'unique'       => [ ],
5830       'index'        => [ ['custnum'], ],
5831       'foreign_keys' => [
5832                           { columns    => [ 'custnum' ],
5833                             table      => 'cust_main',
5834                           },
5835                           { columns    => [ 'msgnum' ],
5836                             table      => 'msg_template',
5837                           },
5838                         ],
5839     },
5840
5841     'svc_cert' => {
5842       'columns' => [
5843         'svcnum',                'int',     '',      '', '', '', 
5844         'recnum',                'int', 'NULL',      '', '', '',
5845         'privatekey',           'text', 'NULL',      '', '', '',
5846         'csr',                  'text', 'NULL',      '', '', '',
5847         'certificate',          'text', 'NULL',      '', '', '',
5848         'cacert',               'text', 'NULL',      '', '', '',
5849         'common_name',       'varchar', 'NULL', $char_d, '', '',
5850         'organization',      'varchar', 'NULL', $char_d, '', '',
5851         'organization_unit', 'varchar', 'NULL', $char_d, '', '',
5852         'city',              'varchar', 'NULL', $char_d, '', '',
5853         'state',             'varchar', 'NULL', $char_d, '', '',
5854         'country',              'char', 'NULL',       2, '', '',
5855         'cert_contact',      'varchar', 'NULL', $char_d, '', '',
5856       ],
5857       'primary_key'  => 'svcnum',
5858       'unique'       => [],
5859       'index'        => [], #recnum
5860       'foreign_keys' => [
5861                           { columns    => [ 'svcnum' ],
5862                             table      => 'cust_svc',
5863                           },
5864                           { columns    => [ 'recnum' ],
5865                             table      => 'domain_record',
5866                           },
5867                         ],
5868     },
5869
5870     'svc_port' => {
5871       'columns' => [
5872         'svcnum',                'int',     '',      '', '', '', 
5873         'serviceid', 'varchar', '', 64, '', '', #srvexport / reportfields
5874       ],
5875       'primary_key'  => 'svcnum',
5876       'unique'       => [],
5877       'index'        => [], #recnum
5878       'foreign_keys' => [
5879                           { columns    => [ 'svcnum' ],
5880                             table      => 'cust_svc',
5881                           },
5882                         ],
5883     },
5884
5885     'areacode'  => {
5886       'columns' => [
5887         'areanum',   'serial',        '',      '', '', '',
5888         'code',        'char',        '',       3, '', '', 
5889         'country',     'char',    'NULL',       2, '', '',
5890         'state',       'char',    'NULL',       2, '', '', 
5891         'description','varchar',  'NULL',     255, '', '',
5892       ], 
5893       'primary_key' => 'areanum',
5894       'unique' => [ [ 'areanum' ] ],
5895       'index'  => [],
5896     },
5897
5898     'upgrade_journal' => {
5899       'columns' => [
5900         'upgradenum', 'serial', '', '', '', '',
5901         '_date', 'int', '', '', '', '',
5902         'upgrade', 'varchar', '', $char_d, '', '',
5903         'status', 'varchar', '', $char_d, '', '',
5904         'statustext', 'varchar', 'NULL', $char_d, '', '',
5905       ],
5906       'primary_key' => 'upgradenum',
5907       'unique' => [],
5908       'index' => [ [ 'upgrade' ] ],
5909     },
5910
5911     'upload_target' => {
5912       'columns' => [
5913         'targetnum', 'serial', '', '', '', '',
5914         'agentnum', 'int', 'NULL', '', '', '',
5915         'protocol', 'varchar', '', 10, '', '',
5916         'hostname', 'varchar', '', $char_d, '', '',
5917         'port', 'int', 'NULL', '', '', '',
5918         'username', 'varchar', '', $char_d, '', '',
5919         'password', 'varchar', 'NULL', $char_d, '', '',
5920         'path', 'varchar', 'NULL', $char_d, '', '',
5921         'subject', 'varchar', 'NULL', '255', '', '',
5922         'handling', 'varchar', 'NULL', $char_d, '', '',
5923       ],
5924       'primary_key'   => 'targetnum',
5925       'unique'        => [ [ 'targetnum' ] ],
5926       'index'         => [],
5927       'foreign_keys' => [
5928                           { columns    => [ 'agentnum' ],
5929                             table      => 'agent',
5930                           },
5931                         ],
5932     },
5933
5934     'log' => {
5935       'columns' => [
5936         'lognum',     'serial', '', '', '', '',
5937         '_date',      'int', '', '', '', '',
5938         'agentnum',   'int', 'NULL', '', '', '',
5939         'tablename',  'varchar', 'NULL', $char_d, '', '',
5940         'tablenum',   'int',  'NULL', '', '', '', 
5941         'level',      'int',  '', '', '', '',
5942         'message',    'text', '', '', '', '',
5943       ],
5944       'primary_key'  => 'lognum',
5945       'unique'       => [],
5946       'index'        => [ ['_date'], ['level'] ],
5947       'foreign_keys' => [
5948                           { columns    => [ 'agentnum' ],
5949                             table      => 'agent',
5950                           },
5951                         ],
5952     },
5953
5954     'log_context' => {
5955       'columns' => [
5956         'logcontextnum', 'serial', '', '', '', '',
5957         'lognum', 'int', '', '', '', '',
5958         'context', 'varchar', '', 32, '', '',
5959       ],
5960       'primary_key'  => 'logcontextnum',
5961       'unique'       => [ [ 'lognum', 'context' ] ],
5962       'index'        => [],
5963       'foreign_keys' => [
5964                           { columns    => [ 'lognum' ],
5965                             table      => 'log',
5966                           },
5967                         ],
5968     },
5969
5970     'svc_alarm' => {
5971       'columns' => [
5972         'svcnum',          'int',      '',      '', '', '', 
5973         'alarmsystemnum',  'int',      '',      '', '', '',
5974         'alarmtypenum',    'int',      '',      '', '', '',
5975         'alarmstationnum', 'int',      '',      '', '', '',
5976         'acctnum',      'varchar',     '', $char_d, '', '',
5977         '_password',    'varchar',     '', $char_d, '', '',
5978         'location',     'varchar', 'NULL', $char_d, '', '',
5979         #installer (rep)
5980       ],
5981       'primary_key'  => 'svcnum',
5982       'unique'       => [],
5983       'index'        => [],
5984       'foreign_keys' => [
5985                           { columns    => [ 'svcnum' ],
5986                             table      => 'cust_svc',
5987                           },
5988                           { columns    => [ 'alarmsystemnum' ],
5989                             table      => 'alarm_system',
5990                           },
5991                           { columns    => [ 'alarmtypenum' ],
5992                             table      => 'alarm_type',
5993                           },
5994                           { columns    => [ 'alarmstationnum' ],
5995                             table      => 'alarm_station',
5996                           },
5997                         ],
5998     },
5999
6000     'alarm_system' => { #vendors
6001       'columns' => [
6002         'alarmsystemnum',  'serial',     '',      '', '', '',
6003         'agentnum',           'int', 'NULL',      '', '', '',
6004         'systemname',     'varchar',     '', $char_d, '', '',
6005         'disabled',          'char', 'NULL',       1, '', '', 
6006       ],
6007       'primary_key' => 'alarmsystemnum',
6008       'unique'      => [ ['agentnum', 'systemname'] ],
6009       'index'       => [ ['agentnum'], ['disabled'] ],
6010       'foreign_keys' => [
6011                           { columns    => [ 'agentnum' ],
6012                             table      => 'agent',
6013                           },
6014                         ],
6015     },
6016
6017     'alarm_type' => { #inputs and outputs
6018       'columns' => [
6019         'alarmtypenum', 'serial',     '',      '', '', '',
6020         'agentnum',        'int', 'NULL',      '', '', '',
6021         'inputs',          'int',     '', '', '', '',
6022         'outputs',         'int',     '', '', '', '',
6023         'disabled',       'char', 'NULL',       1, '', '', 
6024       ],
6025       'primary_key' => 'alarmtypenum',
6026       'unique'      => [ ['agentnum', 'inputs', 'outputs'] ],
6027       'index'       => [ ['agentnum'], ['disabled'] ],
6028       'foreign_keys' => [
6029                           { columns    => [ 'agentnum' ],
6030                             table      => 'agent',
6031                           },
6032                         ],
6033     },
6034
6035     'alarm_station' => { #central station (where the alarm reports to)
6036       'columns' => [
6037         'alarmstationnum', 'serial',     '',      '', '', '',
6038         'agentnum',           'int', 'NULL',      '', '', '',
6039         'stationname',    'varchar',     '', $char_d, '', '',
6040         'disabled',          'char', 'NULL',       1, '', '', 
6041       ],
6042       'primary_key' => 'alarmstationnum',
6043       'unique'      => [ ['agentnum', 'stationname'], ],
6044       'index'       => [ ['agentnum'], ['disabled'] ],
6045       'foreign_keys' => [
6046                           { columns    => [ 'agentnum' ],
6047                             table      => 'agent',
6048                           },
6049                         ],
6050     },
6051
6052     'svc_cable' => {
6053       'columns' => [
6054         'svcnum',        'int',     '',      '', '', '', 
6055         'providernum',   'int', 'NULL',      '', '', '',
6056         'ordernum',  'varchar', 'NULL', $char_d, '', '',
6057         'modelnum',      'int', 'NULL',      '', '', '',
6058         'serialnum', 'varchar', 'NULL', $char_d, '', '',
6059         'mac_addr',  'varchar', 'NULL',      12, '', '', 
6060       ],
6061       'primary_key'  => 'svcnum',
6062       'unique'       => [],
6063       'index'        => [],
6064       'foreign_keys' => [
6065                           { columns    => [ 'svcnum' ],
6066                             table      => 'cust_svc',
6067                           },
6068                           { columns    => [ 'providernum' ],
6069                             table      => 'cable_provider',
6070                           },
6071                           { columns    => [ 'modelnum' ],
6072                             table      => 'cable_model',
6073                           },
6074                         ],
6075     },
6076
6077     'cable_model' => {
6078       'columns' => [
6079         'modelnum',    'serial',     '',      '', '', '',
6080         'model_name', 'varchar',     '', $char_d, '', '',
6081         'disabled',      'char', 'NULL',       1, '', '', 
6082       ],
6083       'primary_key' => 'modelnum',
6084       'unique' => [ [ 'model_name' ], ],
6085       'index'  => [],
6086     },
6087
6088     'cable_provider' => {
6089       'columns' => [
6090         'providernum', 'serial',     '',      '', '', '',
6091         'provider',   'varchar',     '', $char_d, '', '',
6092         'disabled',      'char', 'NULL',       1, '', '', 
6093       ],
6094       'primary_key' => 'providernum',
6095       'unique' => [ [ 'provider' ], ],
6096       'index'  => [],
6097     },
6098
6099     'svc_conferencing' => {
6100       'columns' => [
6101         'svcnum',            'int',     '',      '', '', '',
6102         'conf_id',           'int', 'NULL',      '', '', '', #"system assigned"
6103         'conf_name',     'varchar',     '', $char_d, '', '',
6104         'conf_password', 'varchar',     '', $char_d, '', '',
6105         'access_code',   'varchar',     '',      16, '', '',
6106         'duration',          'int',     '',      '', '', '',
6107         'participants',      'int',     '',      '', '', '',
6108         'conftypenum',       'int',     '',      '', '', '',
6109         'confqualitynum',    'int',     '',      '', '', '',
6110         'opt_recording',    'char', 'NULL',       1, '', '',
6111         'opt_sip',          'char', 'NULL',       1, '', '',
6112         'opt_phone',        'char', 'NULL',       1, '', '',
6113       ],
6114       'primary_key' => 'svcnum',
6115       'unique' => [],
6116       'index'  => [],
6117       'foreign_keys' => [
6118                           { columns => [ 'svcnum' ],
6119                             table   => 'cust_svc',
6120                           },
6121                           { columns => [ 'conftypenum' ],
6122                             table   => 'conferencing_type',
6123                           },
6124                           { columns => [ 'confqualitynum' ],
6125                             table   => 'conferencing_quality',
6126                           },
6127                         ],
6128     },
6129
6130     'conferencing_type' => {
6131       'columns' => [
6132         'conftypenum',  'int',     '',      '', '', '',
6133         'typeid'      , 'int',     '',      '', '', '',
6134         'typename', 'varchar',     '', $char_d, '', '',
6135         'disabled',    'char', 'NULL',       1, '', '', 
6136       ],
6137       'primary_key' => 'conftypenum',
6138       'unique'      => [ [ 'typeid', 'disabled' ], [ 'typename', 'disabled' ] ],
6139       'index'       => [],
6140     },
6141
6142     'conferencing_quality' => {
6143       'columns' => [
6144         'confqualitynum',  'int',     '',      '', '', '',
6145         'qualityid'      , 'int',     '',      '', '', '',
6146         'qualityname', 'varchar',     '', $char_d, '', '',
6147         'disabled',       'char', 'NULL',       1, '', '', 
6148       ],
6149       'primary_key' => 'confqualitynum',
6150       'unique'      => [ [ 'qualityid', 'disabled' ], [ 'qualityname', 'disabled' ] ],
6151       'index'       => [],
6152     },
6153
6154     'svc_video' => {
6155       'columns' => [
6156         'svcnum',            'int', '', '', '', '',
6157         'smartcard_num', 'varchar', '', 16, '', '',
6158         'mac_addr',      'varchar', '', 12, '', '', 
6159         'duration',          'int', '', '', '', '',
6160       ],
6161       'primary_key' => 'svcnum',
6162       'unique' => [], # [ 'smartcard_num' ], [ 'mac_addr' ], ],
6163       'index'  => [],
6164       'foreign_keys' => [
6165                           { columns => [ 'svcnum' ],
6166                             table   => 'cust_svc',
6167                           },
6168                         ],
6169     },
6170
6171     'vend_main' => {
6172       'columns' => [
6173         'vendnum',   'serial',     '',      '', '', '',
6174         'vendname', 'varchar',     '', $char_d, '', '',
6175         'classnum',     'int',     '',      '', '', '',
6176         'disabled',    'char', 'NULL',       1, '', '', 
6177       ],
6178       'primary_key'  => 'vendnum',
6179       'unique'       => [ ['vendname', 'disabled'] ],
6180       'index'        => [],
6181       'foreign_keys' => [
6182                           { columns    => [ 'classnum' ],
6183                             table      => 'vend_class',
6184                           },
6185                         ],
6186     },
6187
6188     'vend_class' => {
6189       'columns' => [
6190         'classnum',     'serial',     '',      '', '', '', 
6191         'classname',   'varchar',     '', $char_d, '', '', 
6192         'disabled',       'char', 'NULL',       1, '', '', 
6193       ],
6194       'primary_key' => 'classnum',
6195       'unique'      => [],
6196       'index'       => [ ['disabled'] ],
6197     },
6198
6199     'vend_bill' => {
6200       'columns' => [
6201         'vendbillnum',    'serial',     '',      '', '', '', 
6202         'vendnum',           'int',     '',      '', '', '', 
6203         '_date',        @date_type,                  '', '', 
6204         'charged',     @money_type,                  '', '', 
6205       ],
6206       'primary_key'  => 'vendbillnum',
6207       'unique'       => [],
6208       'index'        => [ ['vendnum'], ['_date'], ],
6209       'foreign_keys' => [
6210                           { columns    => [ 'vendnum' ],
6211                             table      => 'vend_main',
6212                           },
6213                         ],
6214     },
6215
6216     'vend_pay' => {
6217       'columns' => [
6218         'vendpaynum',   'serial',    '',       '', '', '',
6219         'vendnum',         'int',    '',       '', '', '', 
6220         '_date',     @date_type,                   '', '', 
6221         'paid',      @money_type,                  '', '', 
6222       ],
6223       'primary_key'  => 'vendpaynum',
6224       'unique'       => [],
6225       'index'        => [ [ 'vendnum' ], [ '_date' ], ],
6226       'foreign_keys' => [
6227                           { columns    => [ 'vendnum' ],
6228                             table      => 'vend_main',
6229                           },
6230                         ],
6231     },
6232
6233     'vend_bill_pay' => {
6234       'columns' => [
6235         'vendbillpaynum', 'serial',     '',   '', '', '', 
6236         'vendbillnum',       'int',     '',   '', '', '', 
6237         'vendpaynum',        'int',     '',   '', '', '', 
6238         'amount',  @money_type, '', '', 
6239         #? '_date',   @date_type, '', '', 
6240       ],
6241       'primary_key'  => 'vendbillpaynum',
6242       'unique'       => [],
6243       'index'        => [ [ 'vendbillnum' ], [ 'vendpaynum' ] ],
6244       'foreign_keys' => [
6245                           { columns    => [ 'vendbillnum' ],
6246                             table      => 'vend_bill',
6247                           },
6248                           { columns    => [ 'vendpaynum' ],
6249                             table      => 'vend_pay',
6250                           },
6251                         ],
6252     },
6253
6254     %{ tables_hashref_torrus() },
6255
6256     # tables of ours for doing torrus virtual port combining
6257     'torrus_srvderive' => {
6258       'columns' => [
6259         'derivenum',     'serial',     '', '', '', '',
6260         'serviceid',    'varchar',     '', 64, '', '', #srvexport / reportfields
6261         'last_srv_date',   'date', 'NULL', '', '', '',
6262       ],
6263       'primary_key' => 'derivenum',
6264       'unique' => [ ['serviceid'] ],
6265       'index'  => [],
6266     },
6267
6268     'torrus_srvderive_component' => {
6269       'columns' => [
6270         'componentnum', 'serial', '', '', '', '',
6271         'derivenum',       'int', '', '', '', '',
6272         'serviceid',   'varchar', '', 64, '', '', #srvexport / reportfields
6273       ],
6274       'primary_key'  => 'componentnum',
6275       'unique'       => [ [ 'derivenum', 'serviceid' ], ],
6276       'index'        => [ [ 'derivenum', ], ],
6277       'foreign_keys' => [
6278                           { columns    => [ 'derivenum' ],
6279                             table      => 'torrus_srvderive',
6280                           },
6281                         ],
6282     },
6283
6284     'invoice_mode' => {
6285       'columns' => [
6286         'modenum',      'serial', '', '', '', '',
6287         'agentnum',        'int', 'NULL', '', '', '',
6288         'modename',    'varchar', '', 32, '', '',
6289       ],
6290       'primary_key' => 'modenum',
6291       'unique'      => [ ],
6292       'index'       => [ ],
6293       'foreign_keys' => [
6294                           { columns    => [ 'agentnum' ],
6295                             table      => 'agent',
6296                           },
6297                         ],
6298     },
6299
6300     'invoice_conf' => {
6301       'columns' => [
6302         'confnum',              'serial',   '', '', '', '',
6303         'modenum',              'int',      '', '', '', '',
6304         'locale',               'varchar',  'NULL', 16, '', '',
6305         'notice_name',          'varchar',  'NULL', 64, '', '',
6306         'subject',              'varchar',  'NULL', 64, '', '',
6307         'htmlnotes',            'text',     'NULL', '', '', '',
6308         'htmlfooter',           'text',     'NULL', '', '', '',
6309         'htmlsummary',          'text',     'NULL', '', '', '',
6310         'htmlreturnaddress',    'text',     'NULL', '', '', '',
6311         'latexnotes',           'text',     'NULL', '', '', '',
6312         'latexfooter',          'text',     'NULL', '', '', '',
6313         'latexsummary',         'text',     'NULL', '', '', '',
6314         'latexcoupon',          'text',     'NULL', '', '', '',
6315         'latexsmallfooter',     'text',     'NULL', '', '', '',
6316         'latexreturnaddress',   'text',     'NULL', '', '', '',
6317         'latextopmargin',       'varchar',  'NULL', 16, '', '',
6318         'latexheadsep',         'varchar',  'NULL', 16, '', '',
6319         'latexaddresssep',      'varchar',  'NULL', 16, '', '',
6320         'latextextheight',      'varchar',  'NULL', 16, '', '',
6321         'latexextracouponspace','varchar',  'NULL', 16, '', '',
6322         'latexcouponfootsep',   'varchar',  'NULL', 16, '', '',
6323         'latexcouponamountenclosedsep', 'varchar',  'NULL', 16, '', '',
6324         'latexcoupontoaddresssep',      'varchar',  'NULL', 16, '', '',
6325         'latexverticalreturnaddress',      'char',  'NULL',  1, '', '',
6326         'latexcouponaddcompanytoaddress',  'char',  'NULL',  1, '', '',
6327         'logo_png',             'blob',     'NULL', '', '', '',
6328         'logo_eps',             'blob',     'NULL', '', '', '',
6329         'lpr',                  'varchar',  'NULL', $char_d, '', '',
6330       ],
6331       'primary_key'  => 'confnum',
6332       'unique'       => [ [ 'modenum', 'locale' ] ],
6333       'index'        => [ ],
6334       'foreign_keys' => [
6335                           { columns    => [ 'modenum' ],
6336                             table      => 'invoice_mode',
6337                           },
6338                         ],
6339     },
6340
6341     # name type nullability length default local
6342
6343     #'new_table' => {
6344     #  'columns' => [
6345     #    'num', 'serial',       '', '', '', '',
6346     #  ],
6347     #  'primary_key' => 'num',
6348     #  'unique' => [],
6349     #  'index'  => [],
6350     #},
6351
6352   };
6353
6354 }
6355
6356 =back
6357
6358 =head1 BUGS
6359
6360 =head1 SEE ALSO
6361
6362 L<DBIx::DBSchema>
6363
6364 =cut
6365
6366 1;
6367