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