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