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