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