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