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