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