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