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