upstream-markup call rating and global default rates, #30633
[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         'default_detailnum',   'int', 'NULL', '', '', '',
4815       ],
4816       'primary_key' => 'ratenum',
4817       'unique'      => [],
4818       'index'       => [],
4819       'foreign_keys' => [
4820                           { columns    => [ 'agentnum' ],
4821                             table      => 'agent',
4822                           },
4823                         ],
4824     },
4825
4826     'rate_detail' => {
4827       'columns' => [
4828         'ratedetailnum',   'serial',  '',     '',      '', '', 
4829         'ratenum',         'int',     '',     '',      '', '', 
4830         'orig_regionnum',  'int', 'NULL',     '',      '', '', 
4831         'dest_regionnum',  'int', 'NULL',     '',      '', '', 
4832         'min_included',    'int',     '',     '',      '', '', 
4833         'conn_charge',     'decimal', '', '10,4', '0.0000', '',
4834         'conn_cost',       'decimal', '', '10,4', '0.0000', '',
4835         'conn_sec',        'int',     '',     '',      '0', '',
4836         'min_charge',      'decimal', '', '10,5',       '', '',
4837         'min_cost',        'decimal', '', '10,5','0.00000', '',
4838         'sec_granularity', 'int',     '',     '',       '', '', 
4839         'ratetimenum',     'int', 'NULL',     '',       '', '',
4840         'classnum',        'int', 'NULL',     '',       '', '', 
4841         'cdrtypenum',      'int', 'NULL',     '',       '', '',
4842         'region_group',   'char', 'NULL',      1,       '', '', 
4843         'upstream_mult_charge',  'decimal',  '', '10,4', '0.0000', '',
4844         'upstream_mult_cost',    'decimal',  '', '10,4', '0.0000', '',
4845       ],
4846       'primary_key'  => 'ratedetailnum',
4847       'unique'       => [ [ 'ratenum', 'orig_regionnum', 'dest_regionnum' ] ],
4848       'index'        => [ [ 'ratenum', 'dest_regionnum' ],
4849                           [ 'ratenum', 'ratetimenum' ]
4850                         ],
4851       'foreign_keys' => [
4852                           { columns    => [ 'ratenum' ],
4853                             table      => 'rate',
4854                           },
4855                           { columns    => [ 'orig_regionnum' ],
4856                             table      => 'rate_region',
4857                             references => [ 'regionnum' ],
4858                           },
4859                           { columns    => [ 'dest_regionnum' ],
4860                             table      => 'rate_region',
4861                             references => [ 'regionnum' ],
4862                           },
4863                           { columns    => [ 'ratetimenum' ],
4864                             table      => 'rate_time',
4865                           },
4866                           { columns    => [ 'classnum' ],
4867                             table      => 'usage_class',
4868                           },
4869                           { columns    => [ 'cdrtypenum' ],
4870                             table      => 'cdr_type',
4871                           },
4872                         ],
4873     },
4874
4875     'rate_region' => {
4876       'columns' => [
4877         'regionnum',   'serial',      '', '', '', '', 
4878         'regionname',  'varchar',     '', $char_d, '', '', 
4879         'exact_match', 'char',    'NULL',  1, '', '',
4880       ],
4881       'primary_key' => 'regionnum',
4882       'unique'      => [],
4883       'index'       => [],
4884     },
4885
4886     'rate_prefix' => {
4887       'columns' => [
4888         'prefixnum',   'serial',      '', '', '', '', 
4889         'regionnum',   'int',         '', '', '', '', 
4890         'countrycode', 'varchar',     '',  3, '', '', 
4891         'npa',         'varchar', 'NULL', 10, '', '', #actually the whole prefix
4892         'nxx',         'varchar', 'NULL',  3, '', '', #actually not used
4893         'latanum',     'int',     'NULL',      '', '', '',
4894         'state',       'char',    'NULL',       2, '', '', 
4895         'ocn',         'char',    'NULL',       4, '', '', 
4896       ],
4897       'primary_key'  => 'prefixnum',
4898       'unique'       => [],
4899       'index'        => [ [ 'countrycode' ], [ 'npa' ], [ 'regionnum' ] ],
4900       'foreign_keys' => [
4901                           { columns    => [ 'regionnum' ],
4902                             table      => 'rate_region',
4903                           },
4904                           { columns    => [ 'latanum' ],
4905                             table      => 'lata',
4906                           },
4907                         ],
4908     },
4909
4910     'rate_time' => {
4911       'columns' => [
4912         'ratetimenum', 'serial',      '',      '', '', '',
4913         'ratetimename',   'varchar',      '', $char_d, '', '',
4914       ],
4915       'primary_key' => 'ratetimenum',
4916       'unique'      => [],
4917       'index'       => [],
4918     },
4919
4920     'rate_time_interval' => {
4921       'columns' => [
4922         'intervalnum', 'serial', '', '', '', '',
4923         'stime',          'int', '', '', '', '',
4924         'etime',          'int', '', '', '', '',
4925         'ratetimenum',    'int', '', '', '', '',
4926       ],
4927       'primary_key'  => 'intervalnum',
4928       'unique'       => [],
4929       'index'        => [],
4930       'foreign_keys' => [
4931                           { columns    => [ 'ratetimenum' ],
4932                             table      => 'rate_time',
4933                           },
4934                         ],
4935      },
4936
4937     #not really part of the above rate_ stuff (used with flat rate rather than
4938     # rated billing), but could be eventually, and its a rate
4939     'rate_tier' => {
4940       'columns' => [
4941         'tiernum',   'serial', '',      '', '', '',
4942         'tiername', 'varchar', '', $char_d, '', '',
4943       ],
4944       'primary_key' => 'tiernum',
4945       'unique'      => [ [ 'tiername'], ],
4946       'index'       => [],
4947     },
4948
4949     'rate_tier_detail' => {
4950       'columns' => [
4951         'tierdetailnum', 'serial', '',     '', '', '',
4952         'tiernum',          'int', '',     '', '', '',
4953         'min_quan',         'int', '',     '', '', '',
4954         'min_charge',   'decimal', '', '10,4', '', '',
4955       ],
4956       'primary_key'  => 'tierdetailnum',
4957       'unique'       => [],
4958       'index'        => [ ['tiernum'], ],
4959       'foreign_keys' => [
4960                           { columns    => [ 'tiernum' ],
4961                             table      => 'rate_tier',
4962                           },
4963                         ],
4964     },
4965
4966     'usage_class' => {
4967       'columns' => [
4968         'classnum',    'serial',      '',      '', '', '', 
4969         'weight',      'int',     'NULL',      '', '', '',
4970         'classname',   'varchar',     '', $char_d, '', '', 
4971         'format',      'varchar', 'NULL', $char_d, '', '', 
4972         'disabled',    'char',    'NULL',       1, '', '', 
4973       ],
4974       'primary_key' => 'classnum',
4975       'unique' => [],
4976       'index' => [ ['disabled'] ],
4977     },
4978
4979     'reg_code' => {
4980       'columns' => [
4981         'codenum',   'serial',    '', '', '', '', 
4982         'code',      'varchar',   '', $char_d, '', '', 
4983         'agentnum',  'int',       '', '', '', '', 
4984       ],
4985       'primary_key'  => 'codenum',
4986       'unique'       => [ [ 'agentnum', 'code' ] ],
4987       'index'        => [ [ 'agentnum' ] ],
4988       'foreign_keys' => [
4989                           { columns    => [ 'agentnum' ],
4990                             table      => 'agent',
4991                           },
4992                         ],
4993      },
4994
4995     'reg_code_pkg' => {
4996       'columns' => [
4997         'codepkgnum', 'serial', '', '', '', '', 
4998         'codenum',   'int',    '', '', '', '', 
4999         'pkgpart',   'int',    '', '', '', '', 
5000       ],
5001       'primary_key'  => 'codepkgnum',
5002       'unique'       => [ [ 'codenum', 'pkgpart' ] ],
5003       'index'        => [ [ 'codenum' ] ],
5004       'foreign_keys' => [
5005                           { columns    => [ 'codenum' ],
5006                             table      => 'reg_code',
5007                           },
5008                           { columns    => [ 'pkgpart' ],
5009                             table      => 'part_pkg',
5010                           },
5011                         ],
5012     },
5013
5014     'clientapi_session' => {
5015       'columns' => [
5016         'sessionnum',  'serial',  '', '', '', '', 
5017         'sessionid',  'varchar',  '', $char_d, '', '', 
5018         'namespace',  'varchar',  '', $char_d, '', '', 
5019       ],
5020       'primary_key' => 'sessionnum',
5021       'unique'      => [ [ 'sessionid', 'namespace' ] ],
5022       'index'       => [],
5023     },
5024
5025     'clientapi_session_field' => {
5026       'columns' => [
5027         'fieldnum',    'serial',     '', '', '', '', 
5028         'sessionnum',     'int',     '', '', '', '', 
5029         'fieldname',  'varchar',     '', $char_d, '', '', 
5030         'fieldvalue',    'text', 'NULL', '', '', '', 
5031       ],
5032       'primary_key'  => 'fieldnum',
5033       'unique'       => [ [ 'sessionnum', 'fieldname' ] ],
5034       'index'        => [],
5035       'foreign_keys' => [
5036                           { columns    => [ 'sessionnum' ],
5037                             table      => 'clientapi_session',
5038                           },
5039                         ],
5040     },
5041
5042     'payment_gateway' => {
5043       'columns' => [
5044         'gatewaynum',       'serial',   '',     '', '', '', 
5045         'gateway_namespace','varchar',  'NULL', $char_d, '', '', 
5046         'gateway_module',   'varchar',  '',     $char_d, '', '', 
5047         'gateway_username', 'varchar',  'NULL', $char_d, '', '', 
5048         'gateway_password', 'varchar',  'NULL', $char_d, '', '', 
5049         'gateway_action',   'varchar',  'NULL', $char_d, '', '', 
5050         'gateway_callback_url', 'varchar',  'NULL', 255, '', '', 
5051         'gateway_cancel_url',   'varchar',  'NULL', 255, '', '',
5052         'disabled',   'char',  'NULL',   1, '', '', 
5053       ],
5054       'primary_key' => 'gatewaynum',
5055       'unique' => [],
5056       'index'  => [ [ 'disabled' ] ],
5057     },
5058
5059     'payment_gateway_option' => {
5060       'columns' => [
5061         'optionnum',   'serial',  '',     '', '', '', 
5062         'gatewaynum',  'int',     '',     '', '', '', 
5063         'optionname',  'varchar', '',     $char_d, '', '', 
5064         'optionvalue', 'text',    'NULL', '', '', '', 
5065       ],
5066       'primary_key'  => 'optionnum',
5067       'unique'       => [],
5068       'index'        => [ [ 'gatewaynum' ], [ 'optionname' ] ],
5069       'foreign_keys' => [
5070                           { columns    => [ 'gatewaynum' ],
5071                             table      => 'payment_gateway',
5072                           },
5073                         ],
5074     },
5075
5076     'agent_payment_gateway' => {
5077       'columns' => [
5078         'agentgatewaynum', 'serial', '', '', '', '', 
5079         'agentnum',        'int', '', '', '', '', 
5080         'gatewaynum',      'int', '', '', '', '', 
5081         'cardtype',        'varchar', 'NULL', $char_d, '', '', 
5082         'taxclass',        'varchar', 'NULL', $char_d, '', '', 
5083       ],
5084       'primary_key'  => 'agentgatewaynum',
5085       'unique'       => [],
5086       'index'        => [ [ 'agentnum', 'cardtype' ], ],
5087
5088       'foreign_keys' => [
5089
5090                           { columns    => [ 'agentnum' ],
5091                             table      => 'agent',
5092                           },
5093                           { columns    => [ 'gatewaynum' ],
5094                             table      => 'payment_gateway',
5095                           },
5096                         ],
5097     },
5098
5099     'banned_pay' => {
5100       'columns' => [
5101         'bannum',  'serial',   '',     '', '', '', 
5102         'payby',   'char',     '',       4, '', '', 
5103         'payinfo', 'varchar',  '',     128, '', '', #say, a 512-big digest _hex encoded
5104         #'paymask', 'varchar',  'NULL', $char_d, '', ''
5105         '_date',            @date_type,         '', '', 
5106         'end_date',         @date_type,         '', '', 
5107         'otaker',  'varchar',  'NULL',      32, '', '', 
5108         'usernum',     'int',  'NULL',      '', '', '',
5109         'bantype', 'varchar',  'NULL', $char_d, '', '',
5110         'reason',  'varchar',  'NULL', $char_d, '', '', 
5111       ],
5112       'primary_key'  => 'bannum',
5113       'unique'       => [],
5114       'index'        => [ [ 'payby', 'payinfo' ], [ 'usernum' ], ],
5115       'foreign_keys' => [
5116                           { columns    => [ 'usernum' ],
5117                             table      => 'access_user',
5118                           },
5119                         ],
5120     },
5121
5122     'pkg_category' => {
5123       'columns' => [
5124         'categorynum',        'serial',     '',      '', '', '', 
5125         'categoryname',      'varchar',     '', $char_d, '', '', 
5126         'weight',                'int', 'NULL',      '', '', '',
5127         'ticketing_queueid',     'int', 'NULL',      '', '', '', 
5128         'condense',             'char', 'NULL',       1, '', '', 
5129         'disabled',             'char', 'NULL',       1, '', '', 
5130       ],
5131       'primary_key' => 'categorynum',
5132       'unique' => [],
5133       'index' => [ ['disabled'] ],
5134     },
5135
5136     'pkg_class' => {
5137       'columns' => [
5138         'classnum',    'serial',   '',      '', '', '', 
5139         'classname',   'varchar',  '', $char_d, '', '', 
5140         'categorynum', 'int',  'NULL',      '', '', '', 
5141         'disabled',    'char', 'NULL',       1, '', '', 
5142         'fcc_ds0s',      'int',     'NULL', '', '', '', 
5143       ],
5144       'primary_key'  => 'classnum',
5145       'unique'       => [],
5146       'index'        => [ ['disabled'] ],
5147       'foreign_keys' => [
5148                           { columns    => [ 'categorynum' ],
5149                             table      => 'pkg_category',
5150                           },
5151                         ],
5152     },
5153
5154     'cdr' => {
5155       'columns' => [
5156         # qw( name type null length default local );
5157
5158         ###
5159         #asterisk fields
5160         ###
5161
5162         'acctid',   'bigserial',  '', '', '', '', 
5163         #'calldate', 'TIMESTAMP with time zone', '', '', \'now()', '',
5164         'calldate', 'timestamp',   '',      '', \'now()', '',
5165         'clid',        'varchar',  '', $char_d, \"''", '', 
5166         'src',         'varchar',  '', $char_d, \"''", '', 
5167         'dst',         'varchar',  '', $char_d, \"''", '', 
5168         'dcontext',    'varchar',  '', $char_d, \"''", '', 
5169         'channel',     'varchar',  '', $char_d, \"''", '', 
5170         'dstchannel',  'varchar',  '', $char_d, \"''", '', 
5171         'lastapp',     'varchar',  '', $char_d, \"''", '', 
5172         'lastdata',    'varchar',  '',     255, \"''", '', 
5173
5174         #currently only opensips & voipswitch
5175         'src_ip_addr', 'varchar',  'NULL',  15,    '', '',
5176
5177         #currently only opensips
5178         'dst_ip_addr', 'varchar',  'NULL',  15,    '', '',
5179
5180         #currently only u4:
5181         # terminating number (as opposed to dialed destination)
5182         'dst_term',    'varchar',  'NULL', $char_d, '', '',
5183
5184         #these don't seem to be logged by most of the SQL cdr_* modules
5185         #except tds under sql-illegal names, so;
5186         # ... don't rely on them for rating?
5187         # and, what they hey, i went ahead and changed the names and data types
5188         # to freeside-style dates...
5189           #'start',  'timestamp', 'NULL',  '',    '', '',
5190           #'answer', 'timestamp', 'NULL',  '',    '', '',
5191           #'end',    'timestamp', 'NULL',  '',    '', '',
5192         'startdate',  @date_type, '', '', 
5193         'answerdate', @date_type, '', '', 
5194         'enddate',    @date_type, '', '', 
5195         #
5196
5197         'duration',    'int',      '',      '',     0, '',
5198         'billsec',     'int',      '',      '',     0, '', 
5199         'disposition', 'varchar',  '',      45, \"''", '',
5200         'amaflags',    'int',      '',      '',     0, '',
5201         'accountcode', 'varchar',  '',      20, \"''", '',
5202         'uniqueid',    'varchar',  '', $char_d, \"''", '',
5203         'userfield',   'varchar',  '',     512, \"''", '',
5204
5205         'max_callers', 'int',  'NULL',      '',    '', '',
5206
5207         ###
5208         # old fields for unitel/RSLCOM/convergent that don't map to asterisk
5209         # ones we adoped moved to "own fields" section below
5210         # charged_party, upstream_price, rated_price, carrierid, cdrtypenum
5211         ###
5212
5213         'upstream_currency',      'char', 'NULL',       3, '', '',
5214         'upstream_rateplanid',     'int', 'NULL',      '', '', '', #?
5215
5216         # how it was rated internally...
5217         'ratedetailnum',           'int', 'NULL',      '', '', '',
5218
5219         'distance',            'decimal', 'NULL',      '', '', '',
5220         'islocal',                 'int', 'NULL',      '', '', '', # '',  '', 0, '' instead?
5221
5222         #cdr_calltype: the big list in appendix 2
5223         'calltypenum',             'int', 'NULL',      '', '', '',
5224
5225         'description',         'varchar', 'NULL', $char_d, '', '',
5226         'quantity',                'int', 'NULL',      '', '', '', 
5227
5228         'upstream_rateid',         'int', 'NULL',      '', '', '',
5229
5230         ###
5231         # more fields, for GSM imports
5232         ###
5233         'servicecode',             'int', 'NULL',      '', '', '',
5234         'quantity_able',           'int', 'NULL',      '', '', '', 
5235
5236         ###
5237         #and now for our own fields
5238         ###
5239
5240         'cdrtypenum',              'int', 'NULL',      '', '', '',
5241
5242         'charged_party',       'varchar', 'NULL', $char_d, '', '',
5243         'charged_party_imsi',  'varchar', 'NULL', $char_d, '', '',
5244
5245         'upstream_price',      'decimal', 'NULL',  '10,5', '', '', 
5246
5247         #currently only voipswitch
5248         #'upstream_rate',      'decimal', 'NULL',  '10,5', '', '', 
5249
5250         'upstream_src_regionname', 'varchar', 'NULL', $char_d, '', '',
5251         'upstream_dst_regionname', 'varchar', 'NULL', $char_d, '', '',
5252
5253         # how it was rated internally...
5254         'rated_pretty_dst',       'varchar', 'NULL', $char_d, '', '',
5255         'rated_regionname',       'varchar', 'NULL', $char_d, '', '',
5256         'rated_price',            'decimal', 'NULL',  '10,4', '', '',
5257         'rated_seconds',              'int', 'NULL',      '', '', '',
5258         'rated_minutes', 'double precision', 'NULL',      '', '', '',
5259         'rated_granularity',          'int', 'NULL',      '', '', '',
5260         'rated_ratedetailnum',        'int', 'NULL',      '', '', '',
5261         'rated_classnum',             'int', 'NULL',      '', '', '', 
5262         'rated_ratename',         'varchar', 'NULL', $char_d, '', '', 
5263
5264         'carrierid',               'bigint', 'NULL',      '', '', '',
5265
5266         # service it was matched to
5267         'svcnum',             'int',   'NULL',     '',   '', '', 
5268
5269         #NULL, done (or something)
5270         'freesidestatus', 'varchar',   'NULL',     32,   '', '', 
5271
5272         #NULL, done (or something)
5273         'freesiderewritestatus', 'varchar',   'NULL',     32,   '', '', 
5274
5275         #an indexed place to put big numbers
5276         'cdrid',         'bigint',     'NULL',     '',  '', '', 
5277
5278         #for taqua accountcode rewriting, for starters
5279         'sessionnum',       'int',    'NULL',      '', '', '',
5280         'subscriber',   'varchar',    'NULL', $char_d, '', '',
5281
5282         #old
5283         'cdrbatch',     'varchar',    'NULL',     255, '', '',
5284         #new
5285         'cdrbatchnum',      'int',    'NULL',      '', '', '',
5286
5287       ],
5288       'primary_key' => 'acctid',
5289       'unique' => [],
5290       'index' => [ [ 'calldate' ],
5291                    [ 'src' ], [ 'dst' ], [ 'dcontext' ], [ 'charged_party' ],
5292                    [ 'lastapp' ],
5293                    ['accountcode'], ['uniqueid'], ['carrierid'], ['cdrid'],
5294                    [ 'sessionnum' ], [ 'subscriber' ],
5295                    [ 'freesidestatus' ], [ 'freesiderewritestatus' ],
5296                    [ 'cdrbatch' ], [ 'cdrbatchnum' ],
5297                    [ 'src_ip_addr' ], [ 'dst_ip_addr' ], [ 'dst_term' ],
5298                  ],
5299       #no FKs on cdr table... choosing not to throw errors no matter what's
5300       # thrown in here.  better to have the data.
5301     },
5302
5303     'cdr_batch' => {
5304       'columns' => [
5305         'cdrbatchnum',   'serial',    '',   '', '', '', 
5306         'cdrbatch', 'varchar', 'NULL', 255, '', '',
5307         '_date',     @date_type, '', '', 
5308       ],
5309       'primary_key' => 'cdrbatchnum',
5310       'unique' => [ [ 'cdrbatch' ] ],
5311       'index' => [],
5312     },
5313
5314     'cdr_termination' => {
5315       'columns' => [
5316         'cdrtermnum', 'bigserial',     '',      '', '', '',
5317         'acctid',        'bigint',     '',      '', '', '', 
5318         'termpart',         'int',     '',      '', '', '',#future use see below
5319         'rated_price',  'decimal', 'NULL',  '10,4', '', '',
5320         'rated_seconds',    'int', 'NULL',      '', '', '',
5321         'rated_minutes', 'double precision', 'NULL',   '', '', '',
5322         'status',       'varchar', 'NULL',      32, '', '',
5323         'svcnum',           'int', 'NULL',      '', '', '',
5324       ],
5325       'primary_key'  => 'cdrtermnum',
5326       'unique'       => [ [ 'acctid', 'termpart' ] ],
5327       'index'        => [ [ 'acctid' ], [ 'status' ], ],
5328       'foreign_keys' => [
5329                           { columns    => [ 'acctid' ],
5330                             table      => 'cdr',
5331                           },
5332                           { columns    => [ 'svcnum' ],
5333                             table      => 'cust_svc',
5334                           },
5335                         ],
5336     },
5337
5338     #to handle multiple termination/settlement passes...
5339    # 'part_termination' => {
5340    #   'columns' => [
5341    #     'termpart',       'int', '',      '', '', '',
5342    #     'termname',   'varchar', '', $char_d, '', '',
5343    #     'cdr_column', 'varchar', '', $char_d, '', '', #maybe set it here instead of in the price plan?
5344    #   ],
5345    #   'primary_key' => 'termpart',
5346    #   'unique' => [],
5347    #   'index'  => [],
5348    # },
5349
5350     #the remaining cdr_ tables are not really used
5351     'cdr_calltype' => {
5352       'columns' => [
5353         'calltypenum',   'serial',  '', '', '', '', 
5354         'calltypename',  'varchar', '', $char_d, '', '', 
5355       ],
5356       'primary_key' => 'calltypenum',
5357       'unique'      => [],
5358       'index'       => [],
5359     },
5360
5361     'cdr_type' => {
5362       'columns' => [
5363         'cdrtypenum'  => 'serial',  '', '', '', '',
5364         'cdrtypename' => 'varchar', '', $char_d, '', '',
5365       ],
5366       'primary_key' => 'cdrtypenum',
5367       'unique'      => [],
5368       'index'       => [],
5369     },
5370
5371     'cdr_carrier' => {
5372       'columns' => [
5373         'carrierid'   =>  'serial',     '',      '', '', '',
5374         'carriername' => 'varchar',     '', $char_d, '', '',
5375         'disabled'    =>    'char', 'NULL',       1, '', '', 
5376       ],
5377       'primary_key' => 'carrierid',
5378       'unique'      => [],
5379       'index'       => [],
5380     },
5381
5382     #'cdr_file' => {
5383     #  'columns' => [
5384     #    'filenum',    'serial',     '', '', '', '',
5385     #    'filename',  'varchar',     '', '', '', '',
5386     #    'status',    'varchar', 'NULL', '', '', '',
5387     #  ],
5388     #  'primary_key' => 'filenum',
5389     #  'unique' => [ [ 'filename' ], ], #just change the index if we need to
5390     #                                   # agent-virtualize or have a customer
5391     #                                   # with dup-filename needs or something
5392     #                                   # (only used by cdr.http_and_import for
5393     #                                   #  chrissakes)
5394     #  'index'  => [],
5395     #},
5396
5397     'inventory_item' => {
5398       'columns' => [
5399         'itemnum',   'serial',      '',      '', '', '',
5400         'classnum',  'int',         '',      '', '', '',
5401         'agentnum',  'int',     'NULL',      '', '', '',
5402         'item',      'varchar',     '', $char_d, '', '',
5403         'svcnum',    'int',     'NULL',      '', '', '',
5404         'svc_field', 'varchar', 'NULL', $char_d, '', '',
5405       ],
5406       'primary_key'  => 'itemnum',
5407       'unique'       => [ [ 'classnum', 'item' ] ],
5408       'index'        => [ [ 'classnum' ], [ 'agentnum' ], [ 'svcnum' ] ],
5409       'foreign_keys' => [
5410                           { columns    => [ 'classnum' ],
5411                             table      => 'inventory_class',
5412                           },
5413                           { columns    => [ 'agentnum' ],
5414                             table      => 'agent',
5415                           },
5416                           { columns    => [ 'svcnum' ],
5417                             table      => 'cust_svc',
5418                           },
5419                         ],
5420     },
5421
5422     'inventory_class' => {
5423       'columns' => [
5424         'classnum',  'serial',       '',      '', '', '',
5425         'classname', 'varchar',      '', $char_d, '', '',
5426       ],
5427       'primary_key' => 'classnum',
5428       'unique' => [],
5429       'index'  => [],
5430     },
5431
5432     'access_user_session' => {
5433       'columns' => [
5434         'sessionnum',   'serial',  '',      '', '', '', 
5435         'sessionkey',  'varchar',  '', $char_d, '', '',
5436         'usernum',         'int',  '',      '', '', '',
5437         'start_date', @date_type,               '', '',
5438         'last_date',  @date_type,               '', '',
5439       ],
5440       'primary_key'  => 'sessionnum',
5441       'unique'       => [ [ 'sessionkey' ] ],
5442       'index'        => [],
5443       'foreign_keys' => [
5444                           { columns    => [ 'usernum' ],
5445                             table      => 'access_user',
5446                           },
5447                         ],
5448     },
5449
5450     'access_user' => {
5451       'columns' => [
5452         'usernum',             'serial',     '',      '', '', '',
5453         'username',           'varchar',     '', $char_d, '', '',
5454         '_password',          'varchar', 'NULL', $char_d, '', '',
5455         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
5456         'last',               'varchar', 'NULL', $char_d, '', '', 
5457         'first',              'varchar', 'NULL', $char_d, '', '', 
5458         'user_custnum',           'int', 'NULL',      '', '', '',
5459         'report_salesnum',        'int', 'NULL',      '', '', '',
5460         'disabled',              'char', 'NULL',       1, '', '', 
5461       ],
5462       'primary_key'  => 'usernum',
5463       'unique'       => [ [ 'username' ] ],
5464       'index'        => [ [ 'user_custnum' ] ],
5465       'foreign_keys' => [
5466                           { columns    => [ 'user_custnum' ],
5467                             table      => 'cust_main',
5468                             references => [ 'custnum' ],
5469                           },
5470                           { columns    => [ 'report_salesnum' ],
5471                             table      => 'sales',
5472                             references => [ 'salesnum' ],
5473                           },
5474                         ],
5475     },
5476
5477     'access_user_pref' => {
5478       'columns' => [
5479         'prefnum',    'serial',       '', '', '', '',
5480         'usernum',     'int',       '', '', '', '',
5481         'prefname', 'varchar', '', $char_d, '', '', 
5482         'prefvalue', 'text', 'NULL', '', '', '', 
5483         'expiration', @date_type, '', '',
5484       ],
5485       'primary_key'  => 'prefnum',
5486       'unique'       => [],
5487       'index'        => [ [ 'usernum' ] ],
5488       'foreign_keys' => [
5489                           { columns    => [ 'usernum' ],
5490                             table      => 'access_user',
5491                           },
5492                         ],
5493     },
5494
5495     'access_group' => {
5496       'columns' => [
5497         'groupnum',   'serial', '',      '', '', '',
5498         'groupname', 'varchar', '', $char_d, '', '',
5499       ],
5500       'primary_key' => 'groupnum',
5501       'unique' => [ [ 'groupname' ] ],
5502       'index'  => [],
5503     },
5504
5505     'access_usergroup' => {
5506       'columns' => [
5507         'usergroupnum', 'serial', '', '', '', '',
5508         'usernum',         'int', '', '', '', '',
5509         'groupnum',        'int', '', '', '', '',
5510       ],
5511       'primary_key'  => 'usergroupnum',
5512       'unique'       => [ [ 'usernum', 'groupnum' ] ],
5513       'index'        => [ [ 'usernum' ] ],
5514       'foreign_keys' => [
5515                           { columns    => [ 'usernum' ],
5516                             table      => 'access_user',
5517                           },
5518                           { columns    => [ 'groupnum' ],
5519                             table      => 'access_group',
5520                           },
5521                         ],
5522      },
5523
5524     'access_groupagent' => {
5525       'columns' => [
5526         'groupagentnum', 'serial', '', '', '', '',
5527         'groupnum',         'int', '', '', '', '',
5528         'agentnum',         'int', '', '', '', '',
5529       ],
5530       'primary_key'  => 'groupagentnum',
5531       'unique'       => [ [ 'groupnum', 'agentnum' ] ],
5532       'index'        => [ [ 'groupnum' ] ],
5533       'foreign_keys' => [
5534                           { columns    => [ 'groupnum' ],
5535                             table      => 'access_group',
5536                           },
5537                           { columns    => [ 'agentnum' ],
5538                             table      => 'agent',
5539                           },
5540                         ],
5541     },
5542
5543     'access_right' => {
5544       'columns' => [
5545         'rightnum',   'serial', '',      '', '', '',
5546         'righttype', 'varchar', '', $char_d, '', '',
5547         'rightobjnum',   'int', '',      '', '', '',
5548         'rightname', 'varchar', '', $char_d, '', '',
5549       ],
5550       'primary_key' => 'rightnum',
5551       'unique' => [ [ 'righttype', 'rightobjnum', 'rightname' ] ],
5552       'index'  => [],
5553     },
5554
5555     'sched_item' => {
5556       'columns' => [
5557         'itemnum',   'serial',      '', '', '', '', 
5558         'usernum',      'int',  'NULL', '', '', '', 
5559         #'itemname', 'varchar', $char_d, '', '', '',
5560         'disabled',    'char',  'NULL',  1, '', '', 
5561       ],
5562       'primary_key'  => 'itemnum',
5563       'unique'       => [ [ 'usernum' ] ],
5564       'index'        => [],
5565       'foreign_keys' => [
5566                           { columns    => [ 'usernum' ],
5567                             table      => 'access_user',
5568                           },
5569                         ],
5570     },
5571
5572     #'sched_item_class'
5573
5574     'sched_avail' => {
5575       'columns' => [
5576         'availnum',      'serial', '', '', '', '', 
5577         'itemnum',          'int', '', '', '', '',
5578         'wday',             'int', '', '', '', '',
5579         'stime',            'int', '', '', '', '',
5580         'etime',            'int', '', '', '', '',
5581         'override_date',    @date_type,    '', '',
5582       ],
5583       'primary_key'  => 'availnum',
5584       'unique'       => [],
5585       'index'        => [],
5586       'foreign_keys' => [
5587                           { columns    => [ 'itemnum' ],
5588                             table      => 'sched_item',
5589                           },
5590                         ],
5591     },
5592
5593     'svc_phone' => {
5594       'columns' => [
5595         'svcnum',                         'int',     '',      '', '', '', 
5596         'countrycode',                'varchar',     '',       3, '', '', 
5597         'phonenum',                   'varchar',     '',      25, '', '', #12 ?
5598         'sim_imsi',                   'varchar', 'NULL',      15, '', '',
5599         'pin',                        'varchar', 'NULL', $char_d, '', '',
5600         'sip_password',               'varchar', 'NULL', $char_d, '', '',
5601         'phone_name',                 'varchar', 'NULL', $char_d, '', '',
5602         'pbxsvc',                         'int', 'NULL',      '', '', '',
5603         'domsvc',                         'int', 'NULL',      '', '', '', 
5604         'locationnum',                    'int', 'NULL',      '', '', '',
5605         'forwarddst',                 'varchar', 'NULL',      15, '', '', 
5606         'email',                      'varchar', 'NULL',     255, '', '', 
5607         'lnp_status',                 'varchar', 'NULL', $char_d, '', '',
5608         'portable',                      'char', 'NULL',       1, '', '', 
5609         'lrn',                           'char', 'NULL',      10, '', '', 
5610         'lnp_desired_due_date',           'int', 'NULL',      '', '', '',
5611         'lnp_due_date',                   'int', 'NULL',      '', '', '',
5612         'lnp_other_provider',         'varchar', 'NULL', $char_d, '', '',
5613         'lnp_other_provider_account', 'varchar', 'NULL', $char_d, '', '',
5614         'lnp_reject_reason',          'varchar', 'NULL', $char_d, '', '',
5615         'sms_carrierid',                  'int', 'NULL',      '', '', '',
5616         'sms_account',                'varchar', 'NULL', $char_d, '', '',
5617         'max_simultaneous',               'int', 'NULL',      '', '', '',
5618         'e911_class',                    'char', 'NULL',       1, '', '',
5619         'e911_type',                     'char', 'NULL',       1, '', '', 
5620       ],
5621       'primary_key'  => 'svcnum',
5622       'unique'       => [ [ 'sms_carrierid', 'sms_account'] ],
5623       'index'        => [ ['countrycode', 'phonenum'], ['pbxsvc'], ['domsvc'],
5624                           ['locationnum'], ['sms_carrierid'],
5625                         ],
5626       'foreign_keys' => [
5627                           { columns    => [ 'svcnum' ],
5628                             table      => 'cust_svc',
5629                           },
5630                           { columns    => [ 'pbxsvc' ],
5631                             table      => 'svc_pbx', #'cust_svc',
5632                             references => [ 'svcnum' ],
5633                           },
5634                           { columns    => [ 'domsvc' ],
5635                             table      => 'svc_domain', #'cust_svc',
5636                             references => [ 'svcnum' ],
5637                           },
5638                           { columns    => [ 'locationnum' ],
5639                             table      => 'cust_location',
5640                           },
5641                           { columns    => [ 'sms_carrierid' ],
5642                             table      => 'cdr_carrier',
5643                             references => [ 'carrierid' ],
5644                           },
5645                         ],
5646     },
5647
5648     'phone_device' => {
5649       'columns' => [
5650         'devicenum', 'serial',     '', '', '', '',
5651         'devicepart',   'int',     '', '', '', '',
5652         'svcnum',       'int',     '', '', '', '', 
5653         'mac_addr', 'varchar', 'NULL', 12, '', '', 
5654       ],
5655       'primary_key'  => 'devicenum',
5656       'unique'       => [ [ 'mac_addr' ], ],
5657       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
5658       'foreign_keys' => [
5659                           { columns    => [ 'devicepart' ],
5660                             table      => 'part_device',
5661                           },
5662                           { columns    => [ 'svcnum' ],
5663                             table      => 'svc_phone',
5664                           },
5665                         ],
5666     },
5667
5668     'part_device' => {
5669       'columns' => [
5670         'devicepart', 'serial',  '',      '', '', '',
5671         'devicename', 'varchar', '', $char_d, '', '',
5672         'inventory_classnum', 'int', 'NULL', '', '', '',
5673       ],
5674       'primary_key'  => 'devicepart',
5675       'unique'       => [ [ 'devicename' ] ], #?
5676       'index'        => [],
5677       'foreign_keys' => [
5678                           { columns    => [ 'inventory_classnum' ],
5679                             table      => 'inventory_class',
5680                             references => [ 'classnum' ],
5681                           },
5682                         ],
5683     },
5684
5685     'phone_avail' => {
5686       'columns' => [
5687         'availnum',    'serial',      '',      '', '', '', 
5688         'exportnum',   'int',         '',      '', '', '', 
5689         'countrycode', 'varchar',     '',       3, '', '', 
5690         'state',       'char',    'NULL',       2, '', '', 
5691         'npa',         'char',        '',       3, '', '', 
5692         'nxx',         'char',    'NULL',       3, '', '', 
5693         'station',     'char',    'NULL',       4, '', '',
5694         'name',        'varchar', 'NULL', $char_d, '', '',
5695         'rate_center_abbrev', 'varchar', 'NULL', $char_d, '', '',
5696         'latanum',      'int',     'NULL',      '', '', '',
5697         'msanum',       'int', 'NULL', '', '', '',
5698         'ordernum',      'int',     'NULL',      '', '', '',
5699         'svcnum',      'int',     'NULL',      '', '', '',
5700         'availbatch', 'varchar',  'NULL', $char_d, '', '',
5701       ],
5702       'primary_key'  => 'availnum',
5703       'unique'       => [],
5704       'index'        => [ ['exportnum','countrycode','state'],    #npa search
5705                           ['exportnum','countrycode','npa'],      #nxx search
5706                           ['exportnum','countrycode','npa','nxx'],#station srch
5707                           [ 'exportnum','countrycode','npa','nxx','station'], #
5708                           [ 'svcnum' ],
5709                           [ 'availbatch' ],
5710                           [ 'latanum' ],
5711                         ],
5712       'foreign_keys' => [
5713                           { columns    => [ 'exportnum' ],
5714                             table      => 'part_export',
5715                           },
5716                           { columns    => [ 'latanum' ],
5717                             table      => 'lata',
5718                           },
5719                           { columns    => [ 'msanum' ],
5720                             table      => 'msa',
5721                           },
5722                           { columns    => [ 'ordernum' ],
5723                             table      => 'did_order',
5724                           },
5725                           { columns    => [ 'svcnum' ],
5726                             table      => 'svc_phone',
5727                           },
5728                         ],
5729     },
5730
5731     'lata' => {
5732       'columns' => [
5733         'latanum',    'int',      '',      '', '', '', 
5734         'description',   'varchar',    '',      $char_d, '', '', 
5735         'have_usage',   'int',    'NULL',      '', '', '', 
5736       ],
5737       'primary_key' => 'latanum',
5738       'unique' => [],
5739       'index'  => [],
5740     },
5741
5742     'msa' => {
5743       'columns' => [
5744         'msanum',    'int',      '',      '', '', '', 
5745         'description',   'varchar',    '',      $char_d, '', '', 
5746       ],
5747       'primary_key' => 'msanum',
5748       'unique' => [],
5749       'index'  => [],
5750     },
5751
5752     'rate_center' => {
5753       'columns' => [
5754         'ratecenternum',    'serial',      '',      '', '', '', 
5755         'description',   'varchar',    '',      $char_d, '', '', 
5756       ],
5757       'primary_key' => 'ratecenternum',
5758       'unique' => [],
5759       'index'  => [],
5760     },
5761
5762     'did_vendor' => {
5763       'columns' => [
5764         'vendornum',    'serial',      '',      '', '', '', 
5765         'vendorname',   'varchar',        '',     $char_d, '', '', 
5766       ],
5767       'primary_key' => 'vendornum',
5768       'unique' => [],
5769       'index'  => [],
5770     },
5771
5772     'did_order_item' => {
5773       'columns' => [
5774         'orderitemnum',    'serial',      '',      '', '', '', 
5775         'ordernum',    'int',      '',      '', '', '', 
5776         'msanum',      'int',     'NULL',      '', '', '',
5777         'npa',      'int',     'NULL',      '', '', '',
5778         'latanum',      'int',     'NULL',      '', '', '',
5779         'ratecenternum',      'int',     'NULL',      '', '', '',
5780         'state',       'char',    'NULL',       2, '', '', 
5781         'quantity',      'int',     '',      '', '', '',
5782         'custnum',   'int', 'NULL', '', '', '',
5783       ],
5784       'primary_key'  => 'orderitemnum',
5785       'unique'       => [],
5786       'index'        => [],
5787       'foreign_keys' => [
5788                           { columns    => [ 'ordernum' ],
5789                             table      => 'did_order',
5790                           },
5791                           { columns    => [ 'msanum' ],
5792                             table      => 'msa',
5793                           },
5794                           { columns    => [ 'latanum' ],
5795                             table      => 'lata',
5796                           },
5797                           { columns    => [ 'ratecenternum' ],
5798                             table      => 'rate_center',
5799                           },
5800                           { columns    => [ 'custnum' ],
5801                             table      => 'cust_main',
5802                           },
5803                         ],
5804     },
5805
5806     'did_order' => {
5807       'columns' => [
5808         'ordernum',    'serial',      '',      '', '', '', 
5809         'vendornum',   'int',       '',      '', '', '', 
5810         'vendor_order_id',   'varchar',  'NULL',   $char_d, '', '', 
5811         'custnum',   'int', 'NULL', '', '', '',
5812         'submitted',      'int',     '',      '', '', '',
5813         'confirmed',      'int',     'NULL',      '', '', '',
5814         'received',      'int',     'NULL',      '', '', '',
5815       ],
5816       'primary_key'  => 'ordernum',
5817       'unique'       => [ [ 'vendornum', 'vendor_order_id' ] ],
5818       'index'        => [],
5819       'foreign_keys' => [
5820                           { columns    => [ 'vendornum' ],
5821                             table      => 'did_vendor',
5822                           },
5823                           { columns    => [ 'custnum' ],
5824                             table      => 'cust_main',
5825                           },
5826                         ],
5827     },
5828
5829     'reason_type' => {
5830       'columns' => [
5831         'typenum',   'serial',  '', '', '', '', 
5832         'class',     'char', '', 1, '', '', 
5833         'type',     'varchar', '', $char_d, '', '', 
5834       ],
5835       'primary_key' => 'typenum',
5836       'unique' => [],
5837       'index' => [],
5838     },
5839
5840     'reason' => {
5841       'columns' => [
5842         'reasonnum',     'serial',  '', '', '', '', 
5843         'reason_type',   'int',  '', '', '', '', 
5844         'reason',        'text', '', '', '', '', 
5845         'disabled',      'char',    'NULL', 1, '', '', 
5846         'unsuspend_pkgpart', 'int',  'NULL', '', '', '',
5847         'unsuspend_hold','char',    'NULL', 1, '', '',
5848       ],
5849       'primary_key'  => 'reasonnum',
5850       'unique'       => [],
5851       'index'        => [],
5852       'foreign_keys' => [
5853                           { columns    => [ 'reason_type' ],
5854                             table      => 'reason_type',
5855                             references => [ 'typenum' ],
5856                           },
5857                           { columns    => [ 'unsuspend_pkgpart' ],
5858                             table      => 'part_pkg',
5859                             references => [ 'pkgpart' ],
5860                           },
5861                         ],
5862     },
5863
5864     'conf' => {
5865       'columns' => [
5866         'confnum',  'serial',     '',      '', '', '', 
5867         'agentnum', 'int',    'NULL',      '', '', '', 
5868         'locale',   'varchar','NULL',      16, '', '',
5869         'name',     'varchar',    '', $char_d, '', '', 
5870         'value',    'text',   'NULL',      '', '', '',
5871       ],
5872       'primary_key'  => 'confnum',
5873       'unique'       => [ [ 'agentnum', 'locale', 'name' ] ],
5874       'index'        => [],
5875       'foreign_keys' => [
5876                           { columns    => [ 'agentnum' ],
5877                             table      => 'agent',
5878                           },
5879                         ],
5880     },
5881
5882     'pkg_referral' => {
5883       'columns' => [
5884         'pkgrefnum',     'serial', '', '', '', '',
5885         'pkgnum',        'int',    '', '', '', '',
5886         'refnum',        'int',    '', '', '', '',
5887       ],
5888       'primary_key'  => 'pkgrefnum',
5889       'unique'       => [ [ 'pkgnum', 'refnum' ] ],
5890       'index'        => [ [ 'pkgnum' ], [ 'refnum' ] ],
5891       'foreign_keys' => [
5892                           { columns    => [ 'pkgnum' ],
5893                             table      => 'cust_pkg',
5894                           },
5895                           { columns    => [ 'refnum' ],
5896                             table      => 'part_referral',
5897                           },
5898                         ],
5899     },
5900
5901     'svc_pbx' => {
5902       'columns' => [
5903         'svcnum',           'int',     '',      '', '', '', 
5904         'id',               'int', 'NULL',      '', '', '', 
5905         'title',        'varchar', 'NULL', $char_d, '', '', 
5906         'max_extensions',   'int', 'NULL',      '', '', '',
5907         'max_simultaneous', 'int', 'NULL',      '', '', '',
5908       ],
5909       'primary_key'  => 'svcnum',
5910       'unique'       => [],
5911       'index'        => [ [ 'id' ] ],
5912       'foreign_keys' => [
5913                           { columns    => [ 'svcnum' ],
5914                             table      => 'cust_svc',
5915                           },
5916                         ],
5917     },
5918
5919     'pbx_extension' => {
5920       'columns' => [
5921         'extensionnum',  'serial',     '',      '', '', '',
5922         'svcnum',           'int',     '',      '', '', '',
5923         'extension',    'varchar',     '', $char_d, '', '',
5924         'pin',          'varchar', 'NULL', $char_d, '', '',
5925         'sip_password', 'varchar', 'NULL', $char_d, '', '',
5926         'phone_name',   'varchar', 'NULL', $char_d, '', '',
5927       ],
5928       'primary_key'  => 'extensionnum',
5929       'unique'       => [ [ 'svcnum', 'extension' ] ],
5930       'index'        => [ [ 'svcnum' ] ],
5931       'foreign_keys' => [
5932                           { columns    => [ 'svcnum' ],
5933                             table      => 'svc_pbx',
5934                           },
5935                         ],
5936     },
5937
5938     'pbx_device' => {
5939       'columns' => [
5940         'devicenum', 'serial',     '', '', '', '',
5941         'devicepart',   'int',     '', '', '', '',
5942         'svcnum',       'int',     '', '', '', '', 
5943         'mac_addr', 'varchar', 'NULL', 12, '', '', 
5944       ],
5945       'primary_key'  => 'devicenum',
5946       'unique'       => [ [ 'mac_addr' ], ],
5947       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
5948       'foreign_keys' => [
5949                           { columns    => [ 'devicepart' ],
5950                             table      => 'part_device',
5951                           },
5952                           { columns    => [ 'svcnum' ],
5953                             table      => 'svc_pbx',
5954                           },
5955                         ],
5956     },
5957
5958     'extension_device' => {
5959       'columns' => [
5960         'extensiondevicenum', 'serial', '', '', '', '',
5961         'extensionnum',          'int', '', '', '', '',
5962         'devicenum',             'int', '', '', '', '',
5963       ],
5964       'primary_key'  => 'extensiondevicenum',
5965       'unique'       => [ [ 'extensionnum', 'devicenum' ] ],
5966       'index'        => [],#both?  which way do we need to query?
5967       'foreign_keys' => [
5968                           { columns  => [ 'extensionnum' ],
5969                             table    => 'pbx_extension',
5970                           },
5971                           { columns  => [ 'devicenum' ],
5972                             table    => 'pbx_device',
5973                           },
5974                         ],
5975     },
5976
5977     'svc_mailinglist' => { #svc_group?
5978       'columns' => [
5979         'svcnum',            'int',     '',            '', '', '', 
5980         'username',      'varchar',     '', $username_len, '', '',
5981         'domsvc',            'int',     '',            '', '', '', 
5982         'listnum',           'int',     '',            '', '', '',
5983         'reply_to',         'char', 'NULL',             1, '', '',#SetReplyTo
5984         'remove_from',      'char', 'NULL',             1, '', '',#RemoveAuthor
5985         'reject_auto',      'char', 'NULL',             1, '', '',#RejectAuto
5986         'remove_to_and_cc', 'char', 'NULL',             1, '', '',#RemoveToAndCc
5987       ],
5988       'primary_key'  => 'svcnum',
5989       'unique'       => [],
5990       'index'        => [ ['username'], ['domsvc'], ['listnum'] ],
5991       'foreign_keys' => [
5992                           { columns    => [ 'svcnum' ],
5993                             table      => 'cust_svc',
5994                           },
5995                           { columns    => [ 'domsvc' ],
5996                             table      => 'svc_domain', #'cust_svc',
5997                             references => [ 'svcnum' ],
5998                           },
5999                           { columns    => [ 'listnum' ],
6000                             table      => 'mailinglist',
6001                           },
6002                         ],
6003     },
6004
6005     'mailinglist' => {
6006       'columns' => [
6007         'listnum',   'serial', '',      '', '', '',
6008         'listname', 'varchar', '', $char_d, '', '',
6009       ],
6010       'primary_key' => 'listnum',
6011       'unique' => [],
6012       'index'  => [],
6013     },
6014
6015     'mailinglistmember' => {
6016       'columns' => [
6017         'membernum',        'serial',     '',   '', '', '',
6018         'listnum',             'int',     '',   '', '', '',
6019         'svcnum',              'int', 'NULL',   '', '', '', 
6020         'contactemailnum',     'int', 'NULL',   '', '', '', 
6021         'email',           'varchar', 'NULL',  255, '', '', 
6022       ],
6023       'primary_key'  => 'membernum',
6024       'unique'       => [],
6025       'index'        => [['listnum'],['svcnum'],['contactemailnum'],['email']],
6026       'foreign_keys' => [
6027                           { columns    => [ 'listnum' ],
6028                             table      => 'mailinglist',
6029                           },
6030                           { columns    => [ 'svcnum' ],
6031                             table      => 'svc_acct',
6032                           },
6033                           { columns    => [ 'contactemailnum' ],
6034                             table      => 'contact_email',
6035                           },
6036                         ],
6037     },
6038
6039     'bill_batch' => {
6040       'columns' => [
6041         'batchnum',         'serial',     '',  '', '', '',
6042         'agentnum',            'int', 'NULL',  '', '', '',
6043         'status',             'char', 'NULL', '1', '', '',
6044         'pdf',                'blob', 'NULL',  '', '', '',
6045       ],
6046       'primary_key'  => 'batchnum',
6047       'unique'       => [],
6048       'index'        => [ ['agentnum'] ],
6049       'foreign_keys' => [
6050                           { columns    => [ 'agentnum' ],
6051                             table      => 'agent',
6052                           },
6053                         ],
6054     },
6055
6056     'cust_bill_batch' => {
6057       'columns' => [
6058         'billbatchnum',     'serial',     '', '', '', '',
6059         'batchnum',            'int',     '', '', '', '',
6060         'invnum',              'int',     '', '', '', '',
6061       ],
6062       'primary_key'  => 'billbatchnum',
6063       'unique'       => [],
6064       'index'        => [ [ 'batchnum' ], [ 'invnum' ] ],
6065       'foreign_keys' => [
6066                           { columns    => [ 'batchnum' ],
6067                             table      => 'bill_batch',
6068                           },
6069                           { columns    => [ 'invnum' ],
6070                             table      => 'cust_bill',
6071                           },
6072                         ],
6073     },
6074
6075     'cust_bill_batch_option' => {
6076       'columns' => [
6077         'optionnum', 'serial', '', '', '', '', 
6078         'billbatchnum', 'int', '', '', '', '', 
6079         'optionname', 'varchar', '', $char_d, '', '', 
6080         'optionvalue', 'text', 'NULL', '', '', '', 
6081       ],
6082       'primary_key'  => 'optionnum',
6083       'unique'       => [],
6084       'index'        => [ [ 'billbatchnum' ], [ 'optionname' ] ],
6085       'foreign_keys' => [
6086                           { columns    => [ 'billbatchnum' ],
6087                             table      => 'cust_bill_batch',
6088                           },
6089                         ],
6090      },
6091
6092     'msg_template' => {
6093       'columns' => [
6094         'msgnum',     'serial',     '',      '', '', '',
6095         'msgname',   'varchar',     '', $char_d, '', '',
6096         'agentnum',      'int', 'NULL',      '', '', '',
6097         'subject',   'varchar', 'NULL',     512, '', '',
6098         'mime_type', 'varchar',     '', $char_d, '', '',
6099         'body',         'blob', 'NULL',      '', '', '',
6100         'disabled',     'char', 'NULL',       1, '', '', 
6101         'from_addr', 'varchar', 'NULL',     255, '', '',
6102         'bcc_addr',  'varchar', 'NULL',     255, '', '',
6103       ],
6104       'primary_key'  => 'msgnum',
6105       'unique'       => [ ],
6106       'index'        => [ ['agentnum'], ],
6107       'foreign_keys' => [
6108                           { columns    => [ 'agentnum' ],
6109                             table      => 'agent',
6110                           },
6111                         ],
6112     },
6113
6114     'template_content' => {
6115       'columns' => [
6116         'contentnum', 'serial',     '',      '', '', '',
6117         'msgnum',        'int',     '',      '', '', '',
6118         'locale',    'varchar', 'NULL',      16, '', '',
6119         'subject',   'varchar', 'NULL',     512, '', '',
6120         'body',         'text', 'NULL',      '', '', '',
6121       ],
6122       'primary_key'  => 'contentnum',
6123       'unique'       => [ ['msgnum', 'locale'] ],
6124       'index'        => [ ],
6125       'foreign_keys' => [
6126                           { columns    => [ 'msgnum' ],
6127                             table      => 'msg_template',
6128                           },
6129                         ],
6130     },
6131
6132     'cust_msg' => {
6133       'columns' => [
6134         'custmsgnum', 'serial',     '',     '', '', '',
6135         'custnum',       'int', 'NULL',     '', '', '',
6136         'msgnum',        'int', 'NULL',     '', '', '',
6137         '_date',    @date_type,                 '', '',
6138         'env_from',  'varchar', 'NULL',    255, '', '',
6139         'env_to',    'varchar', 'NULL',    255, '', '',
6140         'header',       'blob', 'NULL',     '', '', '',
6141         'body',         'blob', 'NULL',     '', '', '',
6142         'error',     'varchar', 'NULL',    255, '', '',
6143         'status',    'varchar',     '',$char_d, '', '',
6144         'msgtype',   'varchar', 'NULL',     16, '', '',
6145       ],
6146       'primary_key'  => 'custmsgnum',
6147       'unique'       => [ ],
6148       'index'        => [ ['custnum'], ],
6149       'foreign_keys' => [
6150                           { columns    => [ 'custnum' ],
6151                             table      => 'cust_main',
6152                           },
6153                           { columns    => [ 'msgnum' ],
6154                             table      => 'msg_template',
6155                           },
6156                         ],
6157     },
6158
6159     'svc_cert' => {
6160       'columns' => [
6161         'svcnum',                'int',     '',      '', '', '', 
6162         'recnum',                'int', 'NULL',      '', '', '',
6163         'privatekey',           'text', 'NULL',      '', '', '',
6164         'csr',                  'text', 'NULL',      '', '', '',
6165         'certificate',          'text', 'NULL',      '', '', '',
6166         'cacert',               'text', 'NULL',      '', '', '',
6167         'common_name',       'varchar', 'NULL', $char_d, '', '',
6168         'organization',      'varchar', 'NULL', $char_d, '', '',
6169         'organization_unit', 'varchar', 'NULL', $char_d, '', '',
6170         'city',              'varchar', 'NULL', $char_d, '', '',
6171         'state',             'varchar', 'NULL', $char_d, '', '',
6172         'country',              'char', 'NULL',       2, '', '',
6173         'cert_contact',      'varchar', 'NULL', $char_d, '', '',
6174       ],
6175       'primary_key'  => 'svcnum',
6176       'unique'       => [],
6177       'index'        => [], #recnum
6178       'foreign_keys' => [
6179                           { columns    => [ 'svcnum' ],
6180                             table      => 'cust_svc',
6181                           },
6182                           { columns    => [ 'recnum' ],
6183                             table      => 'domain_record',
6184                           },
6185                         ],
6186     },
6187
6188     'svc_port' => {
6189       'columns' => [
6190         'svcnum',                'int',     '',      '', '', '', 
6191         'serviceid', 'varchar', '', 64, '', '', #srvexport / reportfields
6192       ],
6193       'primary_key'  => 'svcnum',
6194       'unique'       => [],
6195       'index'        => [], #recnum
6196       'foreign_keys' => [
6197                           { columns    => [ 'svcnum' ],
6198                             table      => 'cust_svc',
6199                           },
6200                         ],
6201     },
6202
6203     'areacode'  => {
6204       'columns' => [
6205         'areanum',   'serial',        '',      '', '', '',
6206         'code',        'char',        '',       3, '', '', 
6207         'country',     'char',    'NULL',       2, '', '',
6208         'state',       'char',    'NULL',       2, '', '', 
6209         'description','varchar',  'NULL',     255, '', '',
6210       ], 
6211       'primary_key' => 'areanum',
6212       'unique' => [ [ 'areanum' ] ],
6213       'index'  => [],
6214     },
6215
6216     'upgrade_journal' => {
6217       'columns' => [
6218         'upgradenum', 'serial', '', '', '', '',
6219         '_date', 'int', '', '', '', '',
6220         'upgrade', 'varchar', '', $char_d, '', '',
6221         'status', 'varchar', '', $char_d, '', '',
6222         'statustext', 'varchar', 'NULL', $char_d, '', '',
6223       ],
6224       'primary_key' => 'upgradenum',
6225       'unique' => [],
6226       'index' => [ [ 'upgrade' ] ],
6227     },
6228
6229     'upload_target' => {
6230       'columns' => [
6231         'targetnum', 'serial', '', '', '', '',
6232         'agentnum', 'int', 'NULL', '', '', '',
6233         'protocol', 'varchar', '', 10, '', '',
6234         'hostname', 'varchar', '', $char_d, '', '',
6235         'port', 'int', 'NULL', '', '', '',
6236         'username', 'varchar', '', $char_d, '', '',
6237         'password', 'varchar', 'NULL', $char_d, '', '',
6238         'path', 'varchar', 'NULL', $char_d, '', '',
6239         'subject', 'varchar', 'NULL', '255', '', '',
6240         'handling', 'varchar', 'NULL', $char_d, '', '',
6241       ],
6242       'primary_key'   => 'targetnum',
6243       'unique'        => [ [ 'targetnum' ] ],
6244       'index'         => [],
6245       'foreign_keys' => [
6246                           { columns    => [ 'agentnum' ],
6247                             table      => 'agent',
6248                           },
6249                         ],
6250     },
6251
6252     'log' => {
6253       'columns' => [
6254         'lognum',     'serial', '', '', '', '',
6255         '_date',      'int', '', '', '', '',
6256         'agentnum',   'int', 'NULL', '', '', '',
6257         'tablename',  'varchar', 'NULL', $char_d, '', '',
6258         'tablenum',   'int',  'NULL', '', '', '', 
6259         'level',      'int',  '', '', '', '',
6260         'message',    'text', '', '', '', '',
6261       ],
6262       'primary_key'  => 'lognum',
6263       'unique'       => [],
6264       'index'        => [ ['_date'], ['level'] ],
6265       'foreign_keys' => [
6266                           { columns    => [ 'agentnum' ],
6267                             table      => 'agent',
6268                           },
6269                         ],
6270     },
6271
6272     'log_context' => {
6273       'columns' => [
6274         'logcontextnum', 'serial', '', '', '', '',
6275         'lognum', 'int', '', '', '', '',
6276         'context', 'varchar', '', $char_d, '', '',
6277       ],
6278       'primary_key'  => 'logcontextnum',
6279       'unique'       => [ [ 'lognum', 'context' ] ],
6280       'index'        => [],
6281       'foreign_keys' => [
6282                           { columns    => [ 'lognum' ],
6283                             table      => 'log',
6284                           },
6285                         ],
6286     },
6287
6288     'svc_alarm' => {
6289       'columns' => [
6290 #       name               type        null   length   default local
6291         'svcnum',          'int',      '',    '',      '',     '', 
6292         'alarmsystemnum',  'int',      '',    '',      '',     '',
6293         'alarmtypenum',    'int',      '',    '',      '',     '',
6294         'alarmstationnum', 'int',      '',    '',      '',     '',
6295         'acctnum',         'varchar',  '',    $char_d, '',     '',
6296         '_password',       'varchar',  '',    $char_d, '',     '',
6297         'location',        'varchar', 'NULL', $char_d, '',     '',
6298         'cs_receiver',     'int',     'NULL', '',      '',     '',
6299         'cs_phonenum',     'varchar', 'NULL', $char_d, '',     '',
6300         'serialnum',       'varchar', 'NULL', $char_d, '',     '',
6301         #installer (rep)
6302       ],
6303       'primary_key'  => 'svcnum',
6304       'unique'       => [],
6305       'index'        => [],
6306       'foreign_keys' => [
6307                           { columns    => [ 'svcnum' ],
6308                             table      => 'cust_svc',
6309                           },
6310                           { columns    => [ 'alarmsystemnum' ],
6311                             table      => 'alarm_system',
6312                           },
6313                           { columns    => [ 'alarmtypenum' ],
6314                             table      => 'alarm_type',
6315                           },
6316                           { columns    => [ 'alarmstationnum' ],
6317                             table      => 'alarm_station',
6318                           },
6319                         ],
6320     },
6321
6322     'alarm_system' => { #vendors
6323       'columns' => [
6324         'alarmsystemnum',  'serial',     '',      '', '', '',
6325         'agentnum',           'int', 'NULL',      '', '', '',
6326         'systemname',     'varchar',     '', $char_d, '', '',
6327         'disabled',          'char', 'NULL',       1, '', '', 
6328       ],
6329       'primary_key' => 'alarmsystemnum',
6330       'unique'      => [ ['agentnum', 'systemname'] ],
6331       'index'       => [ ['agentnum'], ['disabled'] ],
6332       'foreign_keys' => [
6333                           { columns    => [ 'agentnum' ],
6334                             table      => 'agent',
6335                           },
6336                         ],
6337     },
6338
6339     'alarm_type' => { #inputs and outputs
6340       'columns' => [
6341         'alarmtypenum', 'serial',     '',      '', '', '',
6342         'agentnum',        'int', 'NULL',      '', '', '',
6343         'inputs',          'int',     '', '', '', '',
6344         'outputs',         'int',     '', '', '', '',
6345         'disabled',       'char', 'NULL',       1, '', '', 
6346       ],
6347       'primary_key' => 'alarmtypenum',
6348       'unique'      => [ ['agentnum', 'inputs', 'outputs'] ],
6349       'index'       => [ ['agentnum'], ['disabled'] ],
6350       'foreign_keys' => [
6351                           { columns    => [ 'agentnum' ],
6352                             table      => 'agent',
6353                           },
6354                         ],
6355     },
6356
6357     'alarm_station' => { #central station (where the alarm reports to)
6358       'columns' => [
6359         'alarmstationnum', 'serial',     '',      '', '', '',
6360         'agentnum',           'int', 'NULL',      '', '', '',
6361         'stationname',    'varchar',     '', $char_d, '', '',
6362         'disabled',          'char', 'NULL',       1, '', '', 
6363       ],
6364       'primary_key' => 'alarmstationnum',
6365       'unique'      => [ ['agentnum', 'stationname'], ],
6366       'index'       => [ ['agentnum'], ['disabled'] ],
6367       'foreign_keys' => [
6368                           { columns    => [ 'agentnum' ],
6369                             table      => 'agent',
6370                           },
6371                         ],
6372     },
6373
6374     'svc_cable' => {
6375       'columns' => [
6376         'svcnum',        'int',     '',      '', '', '', 
6377         'providernum',   'int', 'NULL',      '', '', '',
6378         'ordernum',  'varchar', 'NULL', $char_d, '', '',
6379         'modelnum',      'int', 'NULL',      '', '', '',
6380         'serialnum', 'varchar', 'NULL', $char_d, '', '',
6381         'mac_addr',  'varchar', 'NULL',      12, '', '', 
6382       ],
6383       'primary_key'  => 'svcnum',
6384       'unique'       => [ ['serialnum'] , ['mac_addr'] ],
6385       'index'        => [],
6386       'foreign_keys' => [
6387                           { columns    => [ 'svcnum' ],
6388                             table      => 'cust_svc',
6389                           },
6390                           { columns    => [ 'providernum' ],
6391                             table      => 'cable_provider',
6392                           },
6393                           { columns    => [ 'modelnum' ],
6394                             table      => 'cable_model',
6395                           },
6396                         ],
6397     },
6398
6399     'cable_model' => {
6400       'columns' => [
6401         'modelnum',    'serial',     '',      '', '', '',
6402         'model_name', 'varchar',     '', $char_d, '', '',
6403         'disabled',      'char', 'NULL',       1, '', '', 
6404       ],
6405       'primary_key' => 'modelnum',
6406       'unique' => [ [ 'model_name' ], ],
6407       'index'  => [],
6408     },
6409
6410     'cable_provider' => {
6411       'columns' => [
6412         'providernum', 'serial',     '',      '', '', '',
6413         'provider',   'varchar',     '', $char_d, '', '',
6414         'disabled',      'char', 'NULL',       1, '', '', 
6415       ],
6416       'primary_key' => 'providernum',
6417       'unique' => [ [ 'provider' ], ],
6418       'index'  => [],
6419     },
6420
6421     'svc_conferencing' => {
6422       'columns' => [
6423         'svcnum',            'int',     '',      '', '', '',
6424         'conf_id',           'int', 'NULL',      '', '', '', #"system assigned"
6425         'conf_name',     'varchar',     '', $char_d, '', '',
6426         'conf_password', 'varchar',     '', $char_d, '', '',
6427         'access_code',   'varchar',     '',      16, '', '',
6428         'duration',          'int',     '',      '', '', '',
6429         'participants',      'int',     '',      '', '', '',
6430         'conftypenum',       'int',     '',      '', '', '',
6431         'confqualitynum',    'int',     '',      '', '', '',
6432         'opt_recording',    'char', 'NULL',       1, '', '',
6433         'opt_sip',          'char', 'NULL',       1, '', '',
6434         'opt_phone',        'char', 'NULL',       1, '', '',
6435       ],
6436       'primary_key' => 'svcnum',
6437       'unique' => [],
6438       'index'  => [],
6439       'foreign_keys' => [
6440                           { columns => [ 'svcnum' ],
6441                             table   => 'cust_svc',
6442                           },
6443                           { columns => [ 'conftypenum' ],
6444                             table   => 'conferencing_type',
6445                           },
6446                           { columns => [ 'confqualitynum' ],
6447                             table   => 'conferencing_quality',
6448                           },
6449                         ],
6450     },
6451
6452     'conferencing_type' => {
6453       'columns' => [
6454         'conftypenum',  'int',     '',      '', '', '',
6455         'typeid'      , 'int',     '',      '', '', '',
6456         'typename', 'varchar',     '', $char_d, '', '',
6457         'disabled',    'char', 'NULL',       1, '', '', 
6458       ],
6459       'primary_key' => 'conftypenum',
6460       'unique'      => [ [ 'typeid', 'disabled' ], [ 'typename', 'disabled' ] ],
6461       'index'       => [],
6462     },
6463
6464     'conferencing_quality' => {
6465       'columns' => [
6466         'confqualitynum',  'int',     '',      '', '', '',
6467         'qualityid'      , 'int',     '',      '', '', '',
6468         'qualityname', 'varchar',     '', $char_d, '', '',
6469         'disabled',       'char', 'NULL',       1, '', '', 
6470       ],
6471       'primary_key' => 'confqualitynum',
6472       'unique'      => [ [ 'qualityid', 'disabled' ], [ 'qualityname', 'disabled' ] ],
6473       'index'       => [],
6474     },
6475
6476     'svc_video' => {
6477       'columns' => [
6478         'svcnum',            'int', '', '', '', '',
6479         'smartcard_num', 'varchar', '', 16, '', '',
6480         'mac_addr',      'varchar', '', 12, '', '', 
6481         'duration',          'int', '', '', '', '',
6482       ],
6483       'primary_key' => 'svcnum',
6484       'unique' => [], # [ 'smartcard_num' ], [ 'mac_addr' ], ],
6485       'index'  => [],
6486       'foreign_keys' => [
6487                           { columns => [ 'svcnum' ],
6488                             table   => 'cust_svc',
6489                           },
6490                         ],
6491     },
6492
6493     'vend_main' => {
6494       'columns' => [
6495         'vendnum',   'serial',     '',      '', '', '',
6496         'vendname', 'varchar',     '', $char_d, '', '',
6497         'classnum',     'int',     '',      '', '', '',
6498         'disabled',    'char', 'NULL',       1, '', '', 
6499       ],
6500       'primary_key'  => 'vendnum',
6501       'unique'       => [ ['vendname', 'disabled'] ],
6502       'index'        => [],
6503       'foreign_keys' => [
6504                           { columns    => [ 'classnum' ],
6505                             table      => 'vend_class',
6506                           },
6507                         ],
6508     },
6509
6510     'vend_class' => {
6511       'columns' => [
6512         'classnum',     'serial',     '',      '', '', '', 
6513         'classname',   'varchar',     '', $char_d, '', '', 
6514         'disabled',       'char', 'NULL',       1, '', '', 
6515       ],
6516       'primary_key' => 'classnum',
6517       'unique'      => [],
6518       'index'       => [ ['disabled'] ],
6519     },
6520
6521     'vend_bill' => {
6522       'columns' => [
6523         'vendbillnum',    'serial',     '',      '', '', '', 
6524         'vendnum',           'int',     '',      '', '', '', 
6525         #'_date',        @date_type,                  '', '', 
6526         '_date',     'int', '', '',                   '', '', 
6527         'charged',     @money_type,                  '', '', 
6528       ],
6529       'primary_key'  => 'vendbillnum',
6530       'unique'       => [],
6531       'index'        => [ ['vendnum'], ['_date'], ],
6532       'foreign_keys' => [
6533                           { columns    => [ 'vendnum' ],
6534                             table      => 'vend_main',
6535                           },
6536                         ],
6537     },
6538
6539     'vend_pay' => {
6540       'columns' => [
6541         'vendpaynum',   'serial',    '',       '', '', '',
6542         'vendnum',         'int',    '',       '', '', '', 
6543         #'_date',     @date_type,                   '', '', 
6544         '_date',     'int', '', '',                   '', '', 
6545         'paid',      @money_type,                  '', '', 
6546       ],
6547       'primary_key'  => 'vendpaynum',
6548       'unique'       => [],
6549       'index'        => [ [ 'vendnum' ], [ '_date' ], ],
6550       'foreign_keys' => [
6551                           { columns    => [ 'vendnum' ],
6552                             table      => 'vend_main',
6553                           },
6554                         ],
6555     },
6556
6557     'vend_bill_pay' => {
6558       'columns' => [
6559         'vendbillpaynum', 'serial',     '',   '', '', '', 
6560         'vendbillnum',       'int',     '',   '', '', '', 
6561         'vendpaynum',        'int',     '',   '', '', '', 
6562         'amount',  @money_type, '', '', 
6563         #? '_date',   @date_type, '', '', 
6564       ],
6565       'primary_key'  => 'vendbillpaynum',
6566       'unique'       => [],
6567       'index'        => [ [ 'vendbillnum' ], [ 'vendpaynum' ] ],
6568       'foreign_keys' => [
6569                           { columns    => [ 'vendbillnum' ],
6570                             table      => 'vend_bill',
6571                           },
6572                           { columns    => [ 'vendpaynum' ],
6573                             table      => 'vend_pay',
6574                           },
6575                         ],
6576     },
6577
6578     %{ tables_hashref_torrus() },
6579
6580     # tables of ours for doing torrus virtual port combining
6581     'torrus_srvderive' => {
6582       'columns' => [
6583         'derivenum',     'serial',     '', '', '', '',
6584         'serviceid',    'varchar',     '', 64, '', '', #srvexport / reportfields
6585         'last_srv_date',   'date', 'NULL', '', '', '',
6586       ],
6587       'primary_key' => 'derivenum',
6588       'unique' => [ ['serviceid'] ],
6589       'index'  => [],
6590     },
6591
6592     'torrus_srvderive_component' => {
6593       'columns' => [
6594         'componentnum', 'serial', '', '', '', '',
6595         'derivenum',       'int', '', '', '', '',
6596         'serviceid',   'varchar', '', 64, '', '', #srvexport / reportfields
6597       ],
6598       'primary_key'  => 'componentnum',
6599       'unique'       => [ [ 'derivenum', 'serviceid' ], ],
6600       'index'        => [ [ 'derivenum', ], ],
6601       'foreign_keys' => [
6602                           { columns    => [ 'derivenum' ],
6603                             table      => 'torrus_srvderive',
6604                           },
6605                         ],
6606     },
6607
6608     'invoice_mode' => {
6609       'columns' => [
6610         'modenum',      'serial', '', '', '', '',
6611         'agentnum',        'int', 'NULL', '', '', '',
6612         'modename',    'varchar', '', 32, '', '',
6613       ],
6614       'primary_key' => 'modenum',
6615       'unique'      => [ ],
6616       'index'       => [ ],
6617       'foreign_keys' => [
6618                           { columns    => [ 'agentnum' ],
6619                             table      => 'agent',
6620                           },
6621                         ],
6622     },
6623
6624     'invoice_conf' => {
6625       'columns' => [
6626         'confnum',              'serial',   '', '', '', '',
6627         'modenum',              'int',      '', '', '', '',
6628         'locale',               'varchar',  'NULL', 16, '', '',
6629         'notice_name',          'varchar',  'NULL', 64, '', '',
6630         'subject',              'varchar',  'NULL', 64, '', '',
6631         'htmlnotes',            'text',     'NULL', '', '', '',
6632         'htmlfooter',           'text',     'NULL', '', '', '',
6633         'htmlsummary',          'text',     'NULL', '', '', '',
6634         'htmlreturnaddress',    'text',     'NULL', '', '', '',
6635         'latexnotes',           'text',     'NULL', '', '', '',
6636         'latexfooter',          'text',     'NULL', '', '', '',
6637         'latexsummary',         'text',     'NULL', '', '', '',
6638         'latexsmallfooter',     'text',     'NULL', '', '', '',
6639         'latexreturnaddress',   'text',     'NULL', '', '', '',
6640         'with_latexcoupon',     'char',     'NULL', '1', '', '',
6641         'lpr',                  'varchar',  'NULL', $char_d, '', '',
6642       ],
6643       'primary_key'  => 'confnum',
6644       'unique'       => [ [ 'modenum', 'locale' ] ],
6645       'index'        => [ ],
6646       'foreign_keys' => [
6647                           { columns    => [ 'modenum' ],
6648                             table      => 'invoice_mode',
6649                           },
6650                         ],
6651     },
6652
6653     'export_batch' => {
6654       'columns' => [
6655         'batchnum',    'serial',     '',      '', '', '',
6656         'exportnum',      'int',     '',      '', '', '',
6657         '_date',          'int',     '',      '', '', '',
6658         'status',     'varchar', 'NULL',      32, '', '',
6659         'statustext',    'text', 'NULL',      '', '', '',
6660       ],
6661       'primary_key'  => 'batchnum',
6662       'unique'       => [],
6663       'index'        => [ [ 'exportnum' ], [ 'status' ] ],
6664       'foreign_keys' => [
6665                           { columns    => [ 'exportnum' ],
6666                             table      => 'part_export',
6667                             references => [ 'exportnum' ]
6668                           },
6669                         ],
6670     },
6671
6672     'export_batch_item' => {
6673       'columns' => [
6674         'itemnum',     'serial',     '',      '', '', '',
6675         'batchnum',       'int',     '',      '', '', '',
6676         'svcnum',         'int',     '',      '', '', '',
6677         'action',     'varchar',     '',      32, '', '',
6678         'data',          'text', 'NULL',      '', '', '',
6679         'frozen',        'char', 'NULL',       1, '', '',
6680       ],
6681       'primary_key'  => 'itemnum',
6682       'unique'       => [],
6683       'index'        => [ [ 'batchnum' ], [ 'svcnum' ] ],
6684       'foreign_keys' => [
6685                           { columns    => [ 'batchnum' ],
6686                             table      => 'export_batch',
6687                             references => [ 'batchnum' ]
6688                           },
6689                         ],
6690     },
6691
6692     # lookup table for states, similar to msa and lata
6693     'state' => {
6694       'columns' => [
6695         'statenum', 'int',  '', '', '', '', 
6696         'country',  'char', '',  2, '', '',
6697         'state',    'char', '', $char_d, '', '', 
6698         'fips',     'char', '',  3, '', '',
6699       ],
6700       'primary_key' => 'statenum',
6701       'unique' => [ [ 'country', 'state' ], ],
6702       'index' => [],
6703     },
6704
6705     # eventually link to tower/sector?
6706     'deploy_zone' => {
6707       'columns' => [
6708         'zonenum',        'serial',  '',     '',      '', '',
6709         'description',    'char',    'NULL', $char_d, '', '',
6710         'agentnum',       'int',     '',     '',      '', '',
6711         'dbaname',        'char',    'NULL', $char_d, '', '',
6712         'zonetype',       'char',    '',     1,       '', '',
6713         'technology',     'int',     '',     '',      '', '',
6714         'spectrum',       'int',     'NULL', '',      '', '',
6715         'adv_speed_up',   'decimal', '',     '10,3', '0', '',
6716         'adv_speed_down', 'decimal', '',     '10,3', '0', '',
6717         'cir_speed_up',   'decimal', '',     '10,3', '0', '',
6718         'cir_speed_down', 'decimal', '',     '10,3', '0', '',
6719         'is_broadband',   'char',    'NULL', 1,       '', '',
6720         'is_voice',       'char',    'NULL', 1,       '', '',
6721         'is_consumer',    'char',    'NULL', 1,       '', '',
6722         'is_business',    'char',    'NULL', 1,       '', '',
6723         'active_date',    @date_type,                 '', '',
6724         'expire_date',    @date_type,                 '', '',
6725       ],
6726       'primary_key' => 'zonenum',
6727       'unique' => [],
6728       'index'  => [ [ 'agentnum' ] ],
6729       'foreign_keys' => [
6730                           { columns     => [ 'agentnum' ],
6731                             table       => 'agent',
6732                             references  => [ 'agentnum' ],
6733                           },
6734                         ],
6735     },
6736
6737     'deploy_zone_block' => {
6738       'columns' => [
6739         'blocknum',       'serial',  '',     '',      '', '',
6740         'zonenum',        'int',     '',     '',      '', '',
6741         'censusblock',    'char',    '',     15,      '', '',
6742         'censusyear',     'char',    '',      4,      '', '',
6743       ],
6744       'primary_key' => 'blocknum',
6745       'unique' => [],
6746       'index'  => [ [ 'zonenum' ] ],
6747       'foreign_keys' => [
6748                           { columns     => [ 'zonenum' ],
6749                             table       => 'deploy_zone',
6750                             references  => [ 'zonenum' ],
6751                           },
6752                         ],
6753     },
6754
6755     'deploy_zone_vertex' => {
6756       'columns' => [
6757         'vertexnum',      'serial',  '',     '',      '', '',
6758         'zonenum',        'int',     '',     '',      '', '',
6759         'latitude',       'decimal', '',     '10,7',  '', '', 
6760         'longitude',      'decimal', '',     '10,7',  '', '', 
6761       ],
6762       'primary_key' => 'vertexnum',
6763       'unique' => [ ],
6764       'index'  => [ ],
6765       'foreign_keys' => [
6766                           { columns     => [ 'zonenum' ],
6767                             table       => 'deploy_zone',
6768                             references  => [ 'zonenum' ],
6769                           },
6770                         ],
6771     },
6772
6773
6774
6775
6776
6777     # name type nullability length default local
6778
6779     #'new_table' => {
6780     #  'columns' => [
6781     #    'num', 'serial',       '', '', '', '',
6782     #  ],
6783     #  'primary_key' => 'num',
6784     #  'unique' => [],
6785     #  'index'  => [],
6786     #},
6787
6788   };
6789
6790 }
6791
6792 =back
6793
6794 =head1 BUGS
6795
6796 =head1 SEE ALSO
6797
6798 L<DBIx::DBSchema>
6799
6800 =cut
6801
6802 1;
6803