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