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