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