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