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