6e5637c075b3c7b56796872369318fbda0113fa8
[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         'status',       'varchar', 'NULL',      32, '', '',
5617         'svcnum',           'int', 'NULL',      '', '', '',
5618       ],
5619       'primary_key'  => 'cdrtermnum',
5620       'unique'       => [ [ 'acctid', 'termpart' ] ],
5621       'index'        => [ [ 'acctid' ], [ 'status' ], ],
5622       'foreign_keys' => [
5623                           { columns    => [ 'acctid' ],
5624                             table      => 'cdr',
5625                           },
5626                           { columns    => [ 'svcnum' ],
5627                             table      => 'cust_svc',
5628                           },
5629                         ],
5630     },
5631
5632     #to handle multiple termination/settlement passes...
5633    # 'part_termination' => {
5634    #   'columns' => [
5635    #     'termpart',       'int', '',      '', '', '',
5636    #     'termname',   'varchar', '', $char_d, '', '',
5637    #     'cdr_column', 'varchar', '', $char_d, '', '', #maybe set it here instead of in the price plan?
5638    #   ],
5639    #   'primary_key' => 'termpart',
5640    #   'unique' => [],
5641    #   'index'  => [],
5642    # },
5643
5644     #the remaining cdr_ tables are not really used
5645     'cdr_calltype' => {
5646       'columns' => [
5647         'calltypenum',   'serial',  '', '', '', '', 
5648         'calltypename',  'varchar', '', $char_d, '', '', 
5649       ],
5650       'primary_key' => 'calltypenum',
5651       'unique'      => [],
5652       'index'       => [],
5653     },
5654
5655     'cdr_type' => {
5656       'columns' => [
5657         'cdrtypenum'  => 'serial',  '', '', '', '',
5658         'cdrtypename' => 'varchar', '', $char_d, '', '',
5659       ],
5660       'primary_key' => 'cdrtypenum',
5661       'unique'      => [],
5662       'index'       => [],
5663     },
5664
5665     'cdr_carrier' => {
5666       'columns' => [
5667         'carrierid'   =>  'serial',     '',      '', '', '',
5668         'carriername' => 'varchar',     '', $char_d, '', '',
5669         'disabled'    =>    'char', 'NULL',       1, '', '', 
5670       ],
5671       'primary_key' => 'carrierid',
5672       'unique'      => [],
5673       'index'       => [],
5674     },
5675
5676     #'cdr_file' => {
5677     #  'columns' => [
5678     #    'filenum',    'serial',     '', '', '', '',
5679     #    'filename',  'varchar',     '', '', '', '',
5680     #    'status',    'varchar', 'NULL', '', '', '',
5681     #  ],
5682     #  'primary_key' => 'filenum',
5683     #  'unique' => [ [ 'filename' ], ], #just change the index if we need to
5684     #                                   # agent-virtualize or have a customer
5685     #                                   # with dup-filename needs or something
5686     #                                   # (only used by cdr.http_and_import for
5687     #                                   #  chrissakes)
5688     #  'index'  => [],
5689     #},
5690
5691     'inventory_item' => {
5692       'columns' => [
5693         'itemnum',   'serial',      '',      '', '', '',
5694         'classnum',  'int',         '',      '', '', '',
5695         'agentnum',  'int',     'NULL',      '', '', '',
5696         'item',      'varchar',     '', $char_d, '', '',
5697         'svcnum',    'int',     'NULL',      '', '', '',
5698         'svc_field', 'varchar', 'NULL', $char_d, '', '',
5699       ],
5700       'primary_key'  => 'itemnum',
5701       'unique'       => [ [ 'classnum', 'item' ] ],
5702       'index'        => [ [ 'classnum' ], [ 'agentnum' ], [ 'svcnum' ] ],
5703       'foreign_keys' => [
5704                           { columns    => [ 'classnum' ],
5705                             table      => 'inventory_class',
5706                           },
5707                           { columns    => [ 'agentnum' ],
5708                             table      => 'agent',
5709                           },
5710                           { columns    => [ 'svcnum' ],
5711                             table      => 'cust_svc',
5712                           },
5713                         ],
5714     },
5715
5716     'inventory_class' => {
5717       'columns' => [
5718         'classnum',  'serial',       '',      '', '', '',
5719         'classname', 'varchar',      '', $char_d, '', '',
5720       ],
5721       'primary_key' => 'classnum',
5722       'unique' => [],
5723       'index'  => [],
5724     },
5725
5726     'access_user_session' => {
5727       'columns' => [
5728         'sessionnum',   'serial',  '',      '', '', '', 
5729         'sessionkey',  'varchar',  '', $char_d, '', '',
5730         'usernum',         'int',  '',      '', '', '',
5731         'start_date', @date_type,               '', '',
5732         'last_date',  @date_type,               '', '',
5733       ],
5734       'primary_key'  => 'sessionnum',
5735       'unique'       => [ [ 'sessionkey' ] ],
5736       'index'        => [],
5737       'foreign_keys' => [
5738                           { columns    => [ 'usernum' ],
5739                             table      => 'access_user',
5740                           },
5741                         ],
5742     },
5743
5744     'access_user' => {
5745       'columns' => [
5746         'usernum',             'serial',     '',      '', '', '',
5747         'username',           'varchar',     '', $char_d, '', '',
5748         '_password',          'varchar', 'NULL', $char_d, '', '',
5749         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
5750         'last',               'varchar', 'NULL', $char_d, '', '', 
5751         'first',              'varchar', 'NULL', $char_d, '', '', 
5752         'user_custnum',           'int', 'NULL',      '', '', '',
5753         'report_salesnum',        'int', 'NULL',      '', '', '',
5754         'disabled',              'char', 'NULL',       1, '', '', 
5755       ],
5756       'primary_key'  => 'usernum',
5757       'unique'       => [ [ 'username' ] ],
5758       'index'        => [ [ 'user_custnum' ] ],
5759       'foreign_keys' => [
5760                           { columns    => [ 'user_custnum' ],
5761                             table      => 'cust_main',
5762                             references => [ 'custnum' ],
5763                           },
5764                           { columns    => [ 'report_salesnum' ],
5765                             table      => 'sales',
5766                             references => [ 'salesnum' ],
5767                           },
5768                         ],
5769     },
5770
5771     'access_user_pref' => {
5772       'columns' => [
5773         'prefnum',    'serial',       '', '', '', '',
5774         'usernum',     'int',       '', '', '', '',
5775         'prefname', 'varchar', '', $char_d, '', '', 
5776         'prefvalue', 'text', 'NULL', '', '', '', 
5777         'expiration', @date_type, '', '',
5778       ],
5779       'primary_key'  => 'prefnum',
5780       'unique'       => [],
5781       'index'        => [ [ 'usernum' ] ],
5782       'foreign_keys' => [
5783                           { columns    => [ 'usernum' ],
5784                             table      => 'access_user',
5785                           },
5786                         ],
5787     },
5788
5789     'access_group' => {
5790       'columns' => [
5791         'groupnum',   'serial', '',      '', '', '',
5792         'groupname', 'varchar', '', $char_d, '', '',
5793       ],
5794       'primary_key' => 'groupnum',
5795       'unique' => [ [ 'groupname' ] ],
5796       'index'  => [],
5797     },
5798
5799     'access_usergroup' => {
5800       'columns' => [
5801         'usergroupnum', 'serial', '', '', '', '',
5802         'usernum',         'int', '', '', '', '',
5803         'groupnum',        'int', '', '', '', '',
5804       ],
5805       'primary_key'  => 'usergroupnum',
5806       'unique'       => [ [ 'usernum', 'groupnum' ] ],
5807       'index'        => [ [ 'usernum' ] ],
5808       'foreign_keys' => [
5809                           { columns    => [ 'usernum' ],
5810                             table      => 'access_user',
5811                           },
5812                           { columns    => [ 'groupnum' ],
5813                             table      => 'access_group',
5814                           },
5815                         ],
5816      },
5817
5818     'access_groupagent' => {
5819       'columns' => [
5820         'groupagentnum', 'serial', '', '', '', '',
5821         'groupnum',         'int', '', '', '', '',
5822         'agentnum',         'int', '', '', '', '',
5823       ],
5824       'primary_key'  => 'groupagentnum',
5825       'unique'       => [ [ 'groupnum', 'agentnum' ] ],
5826       'index'        => [ [ 'groupnum' ] ],
5827       'foreign_keys' => [
5828                           { columns    => [ 'groupnum' ],
5829                             table      => 'access_group',
5830                           },
5831                           { columns    => [ 'agentnum' ],
5832                             table      => 'agent',
5833                           },
5834                         ],
5835     },
5836
5837     'access_right' => {
5838       'columns' => [
5839         'rightnum',   'serial', '',      '', '', '',
5840         'righttype', 'varchar', '', $char_d, '', '',
5841         'rightobjnum',   'int', '',      '', '', '',
5842         'rightname', 'varchar', '', $char_d, '', '',
5843       ],
5844       'primary_key' => 'rightnum',
5845       'unique' => [ [ 'righttype', 'rightobjnum', 'rightname' ] ],
5846       'index'  => [],
5847     },
5848
5849     'access_user_log' => {
5850       'columns'      => [
5851         'lognum',          'serial',     '',        '', '', '',
5852         'usernum',            'int',     '',        '', '', '',
5853         'path',           'varchar',     '', 2*$char_d, '', '',
5854         '_date',                   @date_type,          '', '',
5855         'render_seconds',     'int', 'NULL',        '', '', '',
5856       ],
5857       'primary_key'  => 'lognum',
5858       'unique'       => [],
5859       'index'        => [ ['usernum'], ['path'], ['_date'] ],
5860     },
5861
5862     'access_user_page_pref' => {
5863       'columns'     => [
5864         'prefnum'     =>  'serial',     '',      '', '', '',
5865         'usernum'     =>     'int',     '',      '', '', '',
5866         'path'        =>    'text',     '',      '', '', '',
5867         'tablenum'    =>     'int', 'NULL',      '', '', '',
5868         '_date'       =>    @date_type,              '', '',
5869         'prefname'    =>    'varchar',  '', $char_d, '', '',
5870         'prefvalue'   =>    'text',     '',      '', '', '',
5871       ],
5872       'primary_key' => 'prefnum',
5873       'unique'      => [ [ 'usernum', 'path', 'tablenum', 'prefname' ] ],
5874       'index'       => [],
5875       'foreign_keys' => [
5876                           { columns   => [ 'usernum' ],
5877                             table     => 'access_user'
5878                           },
5879                         ],
5880     },
5881
5882     'sched_item' => {
5883       'columns' => [
5884         'itemnum',   'serial',      '', '', '', '', 
5885         'usernum',      'int',  'NULL', '', '', '', 
5886         #'itemname', 'varchar', $char_d, '', '', '',
5887         'disabled',    'char',  'NULL',  1, '', '', 
5888       ],
5889       'primary_key'  => 'itemnum',
5890       'unique'       => [ [ 'usernum' ] ],
5891       'index'        => [],
5892       'foreign_keys' => [
5893                           { columns    => [ 'usernum' ],
5894                             table      => 'access_user',
5895                           },
5896                         ],
5897     },
5898
5899     #'sched_item_class'
5900
5901     'sched_avail' => {
5902       'columns' => [
5903         'availnum',      'serial', '', '', '', '', 
5904         'itemnum',          'int', '', '', '', '',
5905         'wday',             'int', '', '', '', '',
5906         'stime',            'int', '', '', '', '',
5907         'etime',            'int', '', '', '', '',
5908         'override_date',    @date_type,    '', '',
5909       ],
5910       'primary_key'  => 'availnum',
5911       'unique'       => [],
5912       'index'        => [],
5913       'foreign_keys' => [
5914                           { columns    => [ 'itemnum' ],
5915                             table      => 'sched_item',
5916                           },
5917                         ],
5918     },
5919
5920     'svc_phone' => {
5921       'columns' => [
5922         'svcnum',                         'int',     '',      '', '', '', 
5923         'countrycode',                'varchar',     '',       3, '', '', 
5924         'phonenum',                   'varchar',     '',      25, '', '', #12 ?
5925         'sim_imsi',                   'varchar', 'NULL',      15, '', '',
5926         'pin',                        'varchar', 'NULL', $char_d, '', '',
5927         'sip_password',               'varchar', 'NULL', $char_d, '', '',
5928         'phone_name',                 'varchar', 'NULL', $char_d, '', '',
5929         'pbxsvc',                         'int', 'NULL',      '', '', '',
5930         'domsvc',                         'int', 'NULL',      '', '', '', 
5931         'locationnum',                    'int', 'NULL',      '', '', '',
5932         'forward_svcnum',                 'int', 'NULL',      '', '', '',
5933         'forwarddst',                 'varchar', 'NULL',      15, '', '', 
5934         'email',                      'varchar', 'NULL',     255, '', '', 
5935         'lnp_status',                 'varchar', 'NULL', $char_d, '', '',
5936         'portable',                      'char', 'NULL',       1, '', '', 
5937         'lrn',                           'char', 'NULL',      10, '', '', 
5938         'lnp_desired_due_date',           'int', 'NULL',      '', '', '',
5939         'lnp_due_date',                   'int', 'NULL',      '', '', '',
5940         'lnp_other_provider',         'varchar', 'NULL', $char_d, '', '',
5941         'lnp_other_provider_account', 'varchar', 'NULL', $char_d, '', '',
5942         'lnp_reject_reason',          'varchar', 'NULL', $char_d, '', '',
5943         'sms_carrierid',                  'int', 'NULL',      '', '', '',
5944         'sms_account',                'varchar', 'NULL', $char_d, '', '',
5945         'max_simultaneous',               'int', 'NULL',      '', '', '',
5946         'e911_class',                    'char', 'NULL',       1, '', '',
5947         'e911_type',                     'char', 'NULL',       1, '', '', 
5948         'circuit_svcnum',                 'int', 'NULL',      '', '', '',
5949         'sip_server',                 'varchar', 'NULL', $char_d, '', '',
5950       ],
5951       'primary_key'  => 'svcnum',
5952       'unique'       => [ [ 'sms_carrierid', 'sms_account'] ],
5953       'index'        => [ ['countrycode', 'phonenum'], ['pbxsvc'], ['domsvc'],
5954                           ['locationnum'], ['sms_carrierid'],
5955                         ],
5956       'foreign_keys' => [
5957                           { columns    => [ 'svcnum' ],
5958                             table      => 'cust_svc',
5959                           },
5960                           { columns    => [ 'pbxsvc' ],
5961                             table      => 'svc_pbx', #'cust_svc',
5962                             references => [ 'svcnum' ],
5963                           },
5964                           { columns    => [ 'domsvc' ],
5965                             table      => 'svc_domain', #'cust_svc',
5966                             references => [ 'svcnum' ],
5967                           },
5968                           { columns    => [ 'locationnum' ],
5969                             table      => 'cust_location',
5970                           },
5971                           { columns    => [ 'sms_carrierid' ],
5972                             table      => 'cdr_carrier',
5973                             references => [ 'carrierid' ],
5974                           },
5975                           { columns    => [ 'circuit_svcnum' ],
5976                             table      => 'svc_circuit',
5977                             references => [ 'svcnum' ],
5978                           },
5979                         ],
5980     },
5981
5982     'phone_device' => {
5983       'columns' => [
5984         'devicenum', 'serial',     '', '', '', '',
5985         'devicepart',   'int',     '', '', '', '',
5986         'svcnum',       'int',     '', '', '', '', 
5987         'mac_addr', 'varchar', 'NULL', 12, '', '', 
5988       ],
5989       'primary_key'  => 'devicenum',
5990       'unique'       => [ [ 'mac_addr' ], ],
5991       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
5992       'foreign_keys' => [
5993                           { columns    => [ 'devicepart' ],
5994                             table      => 'part_device',
5995                           },
5996                           { columns    => [ 'svcnum' ],
5997                             table      => 'svc_phone',
5998                           },
5999                         ],
6000     },
6001
6002     'part_device' => {
6003       'columns' => [
6004         'devicepart', 'serial',  '',      '', '', '',
6005         'devicename', 'varchar', '', $char_d, '', '',
6006         'inventory_classnum', 'int', 'NULL', '', '', '',
6007         'title',      'varchar', 'NULL', $char_d, '', '',
6008       ],
6009       'primary_key'  => 'devicepart',
6010       'unique'       => [ [ 'devicename' ] ], #?
6011       'index'        => [],
6012       'foreign_keys' => [
6013                           { columns    => [ 'inventory_classnum' ],
6014                             table      => 'inventory_class',
6015                             references => [ 'classnum' ],
6016                           },
6017                         ],
6018     },
6019
6020     'phone_avail' => {
6021       'columns' => [
6022         'availnum',    'serial',      '',      '', '', '', 
6023         'exportnum',   'int',         '',      '', '', '', 
6024         'countrycode', 'varchar',     '',       3, '', '', 
6025         'state',       'char',    'NULL',       2, '', '', 
6026         'npa',         'char',        '',       3, '', '', 
6027         'nxx',         'char',    'NULL',       3, '', '', 
6028         'station',     'char',    'NULL',       4, '', '',
6029         'name',        'varchar', 'NULL', $char_d, '', '',
6030         'rate_center_abbrev', 'varchar', 'NULL', $char_d, '', '',
6031         'latanum',      'int',     'NULL',      '', '', '',
6032         'msanum',       'int', 'NULL', '', '', '',
6033         'ordernum',      'int',     'NULL',      '', '', '',
6034         'svcnum',      'int',     'NULL',      '', '', '',
6035         'availbatch', 'varchar',  'NULL', $char_d, '', '',
6036       ],
6037       'primary_key'  => 'availnum',
6038       'unique'       => [],
6039       'index'        => [ ['exportnum','countrycode','state'],    #npa search
6040                           ['exportnum','countrycode','npa'],      #nxx search
6041                           ['exportnum','countrycode','npa','nxx'],#station srch
6042                           [ 'exportnum','countrycode','npa','nxx','station'], #
6043                           [ 'svcnum' ],
6044                           [ 'availbatch' ],
6045                           [ 'latanum' ],
6046                         ],
6047       'foreign_keys' => [
6048                           { columns    => [ 'exportnum' ],
6049                             table      => 'part_export',
6050                           },
6051                           { columns    => [ 'latanum' ],
6052                             table      => 'lata',
6053                           },
6054                           { columns    => [ 'msanum' ],
6055                             table      => 'msa',
6056                           },
6057                           { columns    => [ 'ordernum' ],
6058                             table      => 'did_order',
6059                           },
6060                           { columns    => [ 'svcnum' ],
6061                             table      => 'svc_phone',
6062                           },
6063                         ],
6064     },
6065
6066     'lata' => {
6067       'columns' => [
6068         'latanum',    'int',      '',      '', '', '', 
6069         'description',   'varchar',    '',      $char_d, '', '', 
6070         'have_usage',   'int',    'NULL',      '', '', '', 
6071       ],
6072       'primary_key' => 'latanum',
6073       'unique' => [],
6074       'index'  => [],
6075     },
6076
6077     'msa' => {
6078       'columns' => [
6079         'msanum',    'int',      '',      '', '', '', 
6080         'description',   'varchar',    '',      $char_d, '', '', 
6081       ],
6082       'primary_key' => 'msanum',
6083       'unique' => [],
6084       'index'  => [],
6085     },
6086
6087     'rate_center' => {
6088       'columns' => [
6089         'ratecenternum',    'serial',      '',      '', '', '', 
6090         'description',   'varchar',    '',      $char_d, '', '', 
6091       ],
6092       'primary_key' => 'ratecenternum',
6093       'unique' => [],
6094       'index'  => [],
6095     },
6096
6097     'did_vendor' => {
6098       'columns' => [
6099         'vendornum',    'serial',      '',      '', '', '', 
6100         'vendorname',   'varchar',        '',     $char_d, '', '', 
6101       ],
6102       'primary_key' => 'vendornum',
6103       'unique' => [],
6104       'index'  => [],
6105     },
6106
6107     'did_order_item' => {
6108       'columns' => [
6109         'orderitemnum',    'serial',      '',      '', '', '', 
6110         'ordernum',    'int',      '',      '', '', '', 
6111         'msanum',      'int',     'NULL',      '', '', '',
6112         'npa',      'int',     'NULL',      '', '', '',
6113         'latanum',      'int',     'NULL',      '', '', '',
6114         'ratecenternum',      'int',     'NULL',      '', '', '',
6115         'state',       'char',    'NULL',       2, '', '', 
6116         'quantity',      'int',     '',      '', '', '',
6117         'custnum',   'int', 'NULL', '', '', '',
6118       ],
6119       'primary_key'  => 'orderitemnum',
6120       'unique'       => [],
6121       'index'        => [],
6122       'foreign_keys' => [
6123                           { columns    => [ 'ordernum' ],
6124                             table      => 'did_order',
6125                           },
6126                           { columns    => [ 'msanum' ],
6127                             table      => 'msa',
6128                           },
6129                           { columns    => [ 'latanum' ],
6130                             table      => 'lata',
6131                           },
6132                           { columns    => [ 'ratecenternum' ],
6133                             table      => 'rate_center',
6134                           },
6135                           { columns    => [ 'custnum' ],
6136                             table      => 'cust_main',
6137                           },
6138                         ],
6139     },
6140
6141     'did_order' => {
6142       'columns' => [
6143         'ordernum',    'serial',      '',      '', '', '', 
6144         'vendornum',   'int',       '',      '', '', '', 
6145         'vendor_order_id',   'varchar',  'NULL',   $char_d, '', '', 
6146         'custnum',   'int', 'NULL', '', '', '',
6147         'submitted',      'int',     '',      '', '', '',
6148         'confirmed',      'int',     'NULL',      '', '', '',
6149         'received',      'int',     'NULL',      '', '', '',
6150       ],
6151       'primary_key'  => 'ordernum',
6152       'unique'       => [ [ 'vendornum', 'vendor_order_id' ] ],
6153       'index'        => [],
6154       'foreign_keys' => [
6155                           { columns    => [ 'vendornum' ],
6156                             table      => 'did_vendor',
6157                           },
6158                           { columns    => [ 'custnum' ],
6159                             table      => 'cust_main',
6160                           },
6161                         ],
6162     },
6163
6164     'reason_type' => {
6165       'columns' => [
6166         'typenum',   'serial',  '', '', '', '', 
6167         'class',     'char', '', 1, '', '', 
6168         'type',     'varchar', '', $char_d, '', '', 
6169       ],
6170       'primary_key' => 'typenum',
6171       'unique' => [],
6172       'index' => [],
6173     },
6174
6175     'reason' => {
6176       'columns' => [
6177         'reasonnum',     'serial',  '', '', '', '', 
6178         'reason_type',   'int',  '', '', '', '', 
6179         'reason',        'text', '', '', '', '', 
6180         'disabled',      'char',    'NULL', 1, '', '', 
6181         'unsuspend_pkgpart', 'int',  'NULL', '', '', '',
6182         'unsuspend_hold','char',    'NULL', 1, '', '',
6183         'unused_credit', 'char',    'NULL', 1, '', '',
6184         'feepart',        'int', 'NULL', '', '', '',
6185         'fee_on_unsuspend','char',  'NULL', 1, '', '',
6186         'fee_hold',      'char',    'NULL', 1, '', '',
6187       ],
6188       'primary_key'  => 'reasonnum',
6189       'unique'       => [],
6190       'index'        => [],
6191       'foreign_keys' => [
6192                           { columns    => [ 'reason_type' ],
6193                             table      => 'reason_type',
6194                             references => [ 'typenum' ],
6195                           },
6196                           { columns    => [ 'unsuspend_pkgpart' ],
6197                             table      => 'part_pkg',
6198                             references => [ 'pkgpart' ],
6199                           },
6200                         ],
6201     },
6202
6203     'conf' => {
6204       'columns' => [
6205         'confnum',  'serial',     '',      '', '', '', 
6206         'agentnum', 'int',    'NULL',      '', '', '', 
6207         'locale',   'varchar','NULL',      16, '', '',
6208         'name',     'varchar',    '', $char_d, '', '', 
6209         'value',    'text',   'NULL',      '', '', '',
6210       ],
6211       'primary_key'  => 'confnum',
6212       'unique'       => [ [ 'agentnum', 'locale', 'name' ] ],
6213       'index'        => [],
6214       'foreign_keys' => [
6215                           { columns    => [ 'agentnum' ],
6216                             table      => 'agent',
6217                           },
6218                         ],
6219     },
6220
6221     'pkg_referral' => {
6222       'columns' => [
6223         'pkgrefnum',     'serial', '', '', '', '',
6224         'pkgnum',        'int',    '', '', '', '',
6225         'refnum',        'int',    '', '', '', '',
6226       ],
6227       'primary_key'  => 'pkgrefnum',
6228       'unique'       => [ [ 'pkgnum', 'refnum' ] ],
6229       'index'        => [ [ 'pkgnum' ], [ 'refnum' ] ],
6230       'foreign_keys' => [
6231                           { columns    => [ 'pkgnum' ],
6232                             table      => 'cust_pkg',
6233                           },
6234                           { columns    => [ 'refnum' ],
6235                             table      => 'part_referral',
6236                           },
6237                         ],
6238     },
6239
6240     'svc_pbx' => {
6241       'columns' => [
6242         'svcnum',           'int',     '',      '', '', '', 
6243         'id',               'int', 'NULL',      '', '', '', 
6244         'uuid',            'char', 'NULL',      36, '', '',
6245         'title',        'varchar', 'NULL', $char_d, '', '', 
6246         'max_extensions',   'int', 'NULL',      '', '', '',
6247         'max_simultaneous', 'int', 'NULL',      '', '', '',
6248         'ip_addr',      'varchar', 'NULL',      40, '', '',
6249       ],
6250       'primary_key'  => 'svcnum',
6251       'unique'       => [],
6252       'index'        => [ [ 'id' ], [ 'uuid' ] ],
6253       'foreign_keys' => [
6254                           { columns    => [ 'svcnum' ],
6255                             table      => 'cust_svc',
6256                           },
6257                         ],
6258     },
6259
6260     'pbx_extension' => {
6261       'columns' => [
6262         'extensionnum',  'serial',     '',      '', '', '',
6263         'svcnum',           'int',     '',      '', '', '',
6264         'extension',    'varchar',     '', $char_d, '', '',
6265         'pin',          'varchar', 'NULL', $char_d, '', '',
6266         'sip_password', 'varchar', 'NULL', $char_d, '', '',
6267         'phone_name',   'varchar', 'NULL', $char_d, '', '',
6268       ],
6269       'primary_key'  => 'extensionnum',
6270       'unique'       => [ [ 'svcnum', 'extension' ] ],
6271       'index'        => [ [ 'svcnum' ] ],
6272       'foreign_keys' => [
6273                           { columns    => [ 'svcnum' ],
6274                             table      => 'svc_pbx',
6275                           },
6276                         ],
6277     },
6278
6279     'pbx_device' => {
6280       'columns' => [
6281         'devicenum', 'serial',     '', '', '', '',
6282         'devicepart',   'int',     '', '', '', '',
6283         'svcnum',       'int',     '', '', '', '', 
6284         'mac_addr', 'varchar', 'NULL', 12, '', '', 
6285       ],
6286       'primary_key'  => 'devicenum',
6287       'unique'       => [ [ 'mac_addr' ], ],
6288       'index'        => [ [ 'devicepart' ], [ 'svcnum' ], ],
6289       'foreign_keys' => [
6290                           { columns    => [ 'devicepart' ],
6291                             table      => 'part_device',
6292                           },
6293                           { columns    => [ 'svcnum' ],
6294                             table      => 'svc_pbx',
6295                           },
6296                         ],
6297     },
6298
6299     'extension_device' => {
6300       'columns' => [
6301         'extensiondevicenum', 'serial', '', '', '', '',
6302         'extensionnum',          'int', '', '', '', '',
6303         'devicenum',             'int', '', '', '', '',
6304       ],
6305       'primary_key'  => 'extensiondevicenum',
6306       'unique'       => [ [ 'extensionnum', 'devicenum' ] ],
6307       'index'        => [],#both?  which way do we need to query?
6308       'foreign_keys' => [
6309                           { columns  => [ 'extensionnum' ],
6310                             table    => 'pbx_extension',
6311                           },
6312                           { columns  => [ 'devicenum' ],
6313                             table    => 'pbx_device',
6314                           },
6315                         ],
6316     },
6317
6318     'svc_mailinglist' => { #svc_group?
6319       'columns' => [
6320         'svcnum',            'int',     '',            '', '', '', 
6321         'username',      'varchar',     '', $username_len, '', '',
6322         'domsvc',            'int',     '',            '', '', '', 
6323         'listnum',           'int',     '',            '', '', '',
6324         'reply_to',         'char', 'NULL',             1, '', '',#SetReplyTo
6325         'remove_from',      'char', 'NULL',             1, '', '',#RemoveAuthor
6326         'reject_auto',      'char', 'NULL',             1, '', '',#RejectAuto
6327         'remove_to_and_cc', 'char', 'NULL',             1, '', '',#RemoveToAndCc
6328       ],
6329       'primary_key'  => 'svcnum',
6330       'unique'       => [],
6331       'index'        => [ ['username'], ['domsvc'], ['listnum'] ],
6332       'foreign_keys' => [
6333                           { columns    => [ 'svcnum' ],
6334                             table      => 'cust_svc',
6335                           },
6336                           { columns    => [ 'domsvc' ],
6337                             table      => 'svc_domain', #'cust_svc',
6338                             references => [ 'svcnum' ],
6339                           },
6340                           { columns    => [ 'listnum' ],
6341                             table      => 'mailinglist',
6342                           },
6343                         ],
6344     },
6345
6346     'mailinglist' => {
6347       'columns' => [
6348         'listnum',   'serial', '',      '', '', '',
6349         'listname', 'varchar', '', $char_d, '', '',
6350       ],
6351       'primary_key' => 'listnum',
6352       'unique' => [],
6353       'index'  => [],
6354     },
6355
6356     'mailinglistmember' => {
6357       'columns' => [
6358         'membernum',        'serial',     '',   '', '', '',
6359         'listnum',             'int',     '',   '', '', '',
6360         'svcnum',              'int', 'NULL',   '', '', '', 
6361         'contactemailnum',     'int', 'NULL',   '', '', '', 
6362         'email',           'varchar', 'NULL',  255, '', '', 
6363       ],
6364       'primary_key'  => 'membernum',
6365       'unique'       => [],
6366       'index'        => [['listnum'],['svcnum'],['contactemailnum'],['email']],
6367       'foreign_keys' => [
6368                           { columns    => [ 'listnum' ],
6369                             table      => 'mailinglist',
6370                           },
6371                           { columns    => [ 'svcnum' ],
6372                             table      => 'svc_acct',
6373                           },
6374                           { columns    => [ 'contactemailnum' ],
6375                             table      => 'contact_email',
6376                           },
6377                         ],
6378     },
6379
6380     'bill_batch' => {
6381       'columns' => [
6382         'batchnum',         'serial',     '',  '', '', '',
6383         'agentnum',            'int', 'NULL',  '', '', '',
6384         'status',             'char', 'NULL', '1', '', '',
6385         'pdf',                'blob', 'NULL',  '', '', '',
6386       ],
6387       'primary_key'  => 'batchnum',
6388       'unique'       => [],
6389       'index'        => [ ['agentnum'] ],
6390       'foreign_keys' => [
6391                           { columns    => [ 'agentnum' ],
6392                             table      => 'agent',
6393                           },
6394                         ],
6395     },
6396
6397     'cust_bill_batch' => {
6398       'columns' => [
6399         'billbatchnum',     'serial',     '', '', '', '',
6400         'batchnum',            'int',     '', '', '', '',
6401         'invnum',              'int',     '', '', '', '',
6402       ],
6403       'primary_key'  => 'billbatchnum',
6404       'unique'       => [],
6405       'index'        => [ [ 'batchnum' ], [ 'invnum' ] ],
6406       'foreign_keys' => [
6407                           { columns    => [ 'batchnum' ],
6408                             table      => 'bill_batch',
6409                           },
6410                           { columns    => [ 'invnum' ],
6411                             table      => 'cust_bill',
6412                           },
6413                         ],
6414     },
6415
6416     'cust_bill_batch_option' => {
6417       'columns' => [
6418         'optionnum', 'serial', '', '', '', '', 
6419         'billbatchnum', 'int', '', '', '', '', 
6420         'optionname', 'varchar', '', $char_d, '', '', 
6421         'optionvalue', 'text', 'NULL', '', '', '', 
6422       ],
6423       'primary_key'  => 'optionnum',
6424       'unique'       => [],
6425       'index'        => [ [ 'billbatchnum' ], [ 'optionname' ] ],
6426       'foreign_keys' => [
6427                           { columns    => [ 'billbatchnum' ],
6428                             table      => 'cust_bill_batch',
6429                           },
6430                         ],
6431      },
6432
6433     'msg_template' => {
6434       'columns' => [
6435         'msgnum',     'serial',     '',      '', '', '',
6436         'msgname',   'varchar',     '', $char_d, '', '',
6437         'agentnum',      'int', 'NULL',      '', '', '',
6438         'subject',   'varchar', 'NULL',     512, '', '',
6439         'mime_type', 'varchar',     '', $char_d, '', '',
6440         'body',         'blob', 'NULL',      '', '', '',
6441         'disabled',     'char', 'NULL',       1, '', '', 
6442           # migrate these to msg_template_email
6443         'from_addr', 'varchar', 'NULL',     255, '', '',
6444         'bcc_addr',  'varchar', 'NULL',     255, '', '',
6445           # change to not null on v5
6446         'msgclass',  'varchar', 'NULL',      16, '', '',
6447       ],
6448       'primary_key'  => 'msgnum',
6449       'unique'       => [ ],
6450       'index'        => [ ['agentnum'], ],
6451       'foreign_keys' => [
6452                           { columns    => [ 'agentnum' ],
6453                             table      => 'agent',
6454                           },
6455                         ],
6456     },
6457
6458     'msg_template_http' => {
6459       'columns' => [
6460         'num',          'serial',     '',      '', '', '',
6461         'msgnum',          'int',     '',      '', '', '',
6462         'prepare_url', 'varchar', 'NULL',     255, '', '',
6463         'send_url',    'varchar', 'NULL',     255, '', '',
6464         'username',    'varchar', 'NULL', $char_d, '', '',
6465         'password',    'varchar', 'NULL', $char_d, '', '',
6466         'content',        'text', 'NULL',      '', '', '',
6467       ],
6468       'primary_key'  => 'num',
6469       'unique'       => [ [ 'msgnum' ], ],
6470       'index'        => [ ],
6471       'foreign_keys' => [
6472                           { columns    => [ 'msgnum' ],
6473                             table      => 'msg_template',
6474                           },
6475                         ],
6476     },
6477
6478     'template_content' => {
6479       'columns' => [
6480         'contentnum', 'serial',     '',      '', '', '',
6481         'msgnum',        'int',     '',      '', '', '',
6482         'locale',    'varchar', 'NULL',      16, '', '',
6483         'subject',   'varchar', 'NULL',     512, '', '',
6484         'body',         'text', 'NULL',      '', '', '',
6485       ],
6486       'primary_key'  => 'contentnum',
6487       'unique'       => [ ['msgnum', 'locale'] ],
6488       'index'        => [ ],
6489       'foreign_keys' => [
6490                           { columns    => [ 'msgnum' ],
6491                             table      => 'msg_template',
6492                           },
6493                         ],
6494     },
6495
6496     'template_image' => {
6497       'columns' => [
6498         'imgnum',     'serial',     '',      '', '', '',
6499         'name',      'varchar',     '', $char_d, '', '',
6500         'agentnum',      'int', 'NULL',      '', '', '',
6501         'mime_type', 'varchar',     '', $char_d, '', '',
6502         'base64',       'text',     '',      '', '', '',
6503       ],
6504       'primary_key'  => 'imgnum',
6505       'unique'       => [ ],
6506       'index'        => [ ['name'], ['agentnum'] ],
6507     },
6508
6509     'cust_msg' => {
6510       'columns' => [
6511         'custmsgnum', 'serial',     '',     '', '', '',
6512         'custnum',       'int', 'NULL',     '', '', '',
6513         'msgnum',        'int', 'NULL',     '', '', '',
6514         '_date',    @date_type,                 '', '',
6515         'env_from',  'varchar', 'NULL',    255, '', '',
6516         'env_to',    'varchar', 'NULL',    255, '', '',
6517         'header',       'blob', 'NULL',     '', '', '',
6518         'body',         'blob', 'NULL',     '', '', '',
6519         'error',     'varchar', 'NULL',    255, '', '',
6520         'status',    'varchar',     '',$char_d, '', '',
6521         'msgtype',   'varchar', 'NULL',     16, '', '',
6522         'preview',      'text', 'NULL',     '', '', '',
6523       ],
6524       'primary_key'  => 'custmsgnum',
6525       'unique'       => [ ],
6526       'index'        => [ ['custnum'], ],
6527       'foreign_keys' => [
6528                           { columns    => [ 'custnum' ],
6529                             table      => 'cust_main',
6530                           },
6531                           { columns    => [ 'msgnum' ],
6532                             table      => 'msg_template',
6533                           },
6534                         ],
6535     },
6536
6537     'svc_cert' => {
6538       'columns' => [
6539         'svcnum',                'int',     '',      '', '', '', 
6540         'recnum',                'int', 'NULL',      '', '', '',
6541         'privatekey',           'text', 'NULL',      '', '', '',
6542         'csr',                  'text', 'NULL',      '', '', '',
6543         'certificate',          'text', 'NULL',      '', '', '',
6544         'cacert',               'text', 'NULL',      '', '', '',
6545         'common_name',       'varchar', 'NULL', $char_d, '', '',
6546         'organization',      'varchar', 'NULL', $char_d, '', '',
6547         'organization_unit', 'varchar', 'NULL', $char_d, '', '',
6548         'city',              'varchar', 'NULL', $char_d, '', '',
6549         'state',             'varchar', 'NULL', $char_d, '', '',
6550         'country',              'char', 'NULL',       2, '', '',
6551         'cert_contact',      'varchar', 'NULL', $char_d, '', '',
6552       ],
6553       'primary_key'  => 'svcnum',
6554       'unique'       => [],
6555       'index'        => [], #recnum
6556       'foreign_keys' => [
6557                           { columns    => [ 'svcnum' ],
6558                             table      => 'cust_svc',
6559                           },
6560                           { columns    => [ 'recnum' ],
6561                             table      => 'domain_record',
6562                           },
6563                         ],
6564     },
6565
6566     'svc_port' => {
6567       'columns' => [
6568         'svcnum',                'int',     '',      '', '', '', 
6569         'serviceid', 'varchar', '', 64, '', '', #srvexport / reportfields
6570       ],
6571       'primary_key'  => 'svcnum',
6572       'unique'       => [],
6573       'index'        => [], #recnum
6574       'foreign_keys' => [
6575                           { columns    => [ 'svcnum' ],
6576                             table      => 'cust_svc',
6577                           },
6578                         ],
6579     },
6580
6581     'areacode'  => {
6582       'columns' => [
6583         'areanum',   'serial',        '',      '', '', '',
6584         'code',        'char',        '',       3, '', '', 
6585         'country',     'char',    'NULL',       2, '', '',
6586         'state',       'char',    'NULL',       2, '', '', 
6587         'description','varchar',  'NULL',     255, '', '',
6588       ], 
6589       'primary_key' => 'areanum',
6590       'unique' => [ [ 'areanum' ] ],
6591       'index'  => [],
6592     },
6593
6594     'upgrade_journal' => {
6595       'columns' => [
6596         'upgradenum', 'serial', '', '', '', '',
6597         '_date', 'int', '', '', '', '',
6598         'upgrade', 'varchar', '', $char_d, '', '',
6599         'status', 'varchar', '', $char_d, '', '',
6600         'statustext', 'varchar', 'NULL', $char_d, '', '',
6601       ],
6602       'primary_key' => 'upgradenum',
6603       'unique' => [],
6604       'index' => [ [ 'upgrade' ] ],
6605     },
6606
6607     'upload_target' => {
6608       'columns' => [
6609         'targetnum', 'serial', '', '', '', '',
6610         'agentnum', 'int', 'NULL', '', '', '',
6611         'protocol', 'varchar', '', 10, '', '',
6612         'hostname', 'varchar', '', $char_d, '', '',
6613         'port', 'int', 'NULL', '', '', '',
6614         'username', 'varchar', '', $char_d, '', '',
6615         'password', 'varchar', 'NULL', $char_d, '', '',
6616         'path', 'varchar', 'NULL', $char_d, '', '',
6617         'subject', 'varchar', 'NULL', '255', '', '',
6618         'handling', 'varchar', 'NULL', $char_d, '', '',
6619       ],
6620       'primary_key'   => 'targetnum',
6621       'unique'        => [ [ 'targetnum' ] ],
6622       'index'         => [],
6623       'foreign_keys' => [
6624                           { columns    => [ 'agentnum' ],
6625                             table      => 'agent',
6626                           },
6627                         ],
6628     },
6629
6630     'log' => {
6631       'columns' => [
6632         'lognum',     'serial', '', '', '', '',
6633         '_date',      'int', '', '', '', '',
6634         'agentnum',   'int', 'NULL', '', '', '',
6635         'tablename',  'varchar', 'NULL', $char_d, '', '',
6636         'tablenum',   'int',  'NULL', '', '', '', 
6637         'level',      'int',  '', '', '', '',
6638         'message',    'text', '', '', '', '',
6639       ],
6640       'primary_key'  => 'lognum',
6641       'unique'       => [],
6642       'index'        => [ ['_date'], ['level'] ],
6643       'foreign_keys' => [
6644                           { columns    => [ 'agentnum' ],
6645                             table      => 'agent',
6646                           },
6647                         ],
6648     },
6649
6650     'log_context' => {
6651       'columns' => [
6652         'logcontextnum', 'serial', '', '', '', '',
6653         'lognum', 'int', '', '', '', '',
6654         'context', 'varchar', '', $char_d, '', '',
6655       ],
6656       'primary_key'  => 'logcontextnum',
6657       'unique'       => [ [ 'lognum', 'context' ] ],
6658       'index'        => [],
6659       'foreign_keys' => [
6660                           { columns    => [ 'lognum' ],
6661                             table      => 'log',
6662                           },
6663                         ],
6664     },
6665
6666     'log_email' => {
6667       'columns' => [
6668         'logemailnum', 'serial', '', '', '', '',
6669         'context', 'varchar', 'NULL', $char_d, '', '',
6670         'min_level', 'int',  'NULL', '', '', '',
6671         'msgnum', 'int', '',  '', '', '',
6672         'to_addr', 'varchar', 'NULL',     255, '', '',
6673         'context_height',  'int', 'NULL', '', '', '', 
6674       ],
6675       'primary_key'  => 'logemailnum',
6676       'unique'       => [],
6677       'index'        => [ ['context'], ['min_level'] ],
6678       'foreign_keys' => [
6679                           { columns    => [ 'msgnum' ],
6680                             table      => 'msg_template',
6681                             references => [ 'msgnum' ],
6682                           },
6683                         ],
6684     },
6685
6686     'svc_alarm' => {
6687       'columns' => [
6688 #       name               type        null   length   default local
6689         'svcnum',          'int',      '',    '',      '',     '', 
6690         'alarmsystemnum',  'int',      '',    '',      '',     '',
6691         'alarmtypenum',    'int',      '',    '',      '',     '',
6692         'alarmstationnum', 'int',      '',    '',      '',     '',
6693         'acctnum',         'varchar',  '',    $char_d, '',     '',
6694         '_password',       'varchar',  '',    $char_d, '',     '',
6695         'location',        'varchar', 'NULL', $char_d, '',     '',
6696         'cs_receiver',     'int',     'NULL', '',      '',     '',
6697         'cs_phonenum',     'varchar', 'NULL', $char_d, '',     '',
6698         'serialnum',       'varchar', 'NULL', $char_d, '',     '',
6699         #installer (rep)
6700       ],
6701       'primary_key'  => 'svcnum',
6702       'unique'       => [],
6703       'index'        => [],
6704       'foreign_keys' => [
6705                           { columns    => [ 'svcnum' ],
6706                             table      => 'cust_svc',
6707                           },
6708                           { columns    => [ 'alarmsystemnum' ],
6709                             table      => 'alarm_system',
6710                           },
6711                           { columns    => [ 'alarmtypenum' ],
6712                             table      => 'alarm_type',
6713                           },
6714                           { columns    => [ 'alarmstationnum' ],
6715                             table      => 'alarm_station',
6716                           },
6717                         ],
6718     },
6719
6720     'alarm_system' => { #vendors
6721       'columns' => [
6722         'alarmsystemnum',  'serial',     '',      '', '', '',
6723         'agentnum',           'int', 'NULL',      '', '', '',
6724         'systemname',     'varchar',     '', $char_d, '', '',
6725         'disabled',          'char', 'NULL',       1, '', '', 
6726       ],
6727       'primary_key' => 'alarmsystemnum',
6728       'unique'      => [ ['agentnum', 'systemname'] ],
6729       'index'       => [ ['agentnum'], ['disabled'] ],
6730       'foreign_keys' => [
6731                           { columns    => [ 'agentnum' ],
6732                             table      => 'agent',
6733                           },
6734                         ],
6735     },
6736
6737     'alarm_type' => { #inputs and outputs
6738       'columns' => [
6739         'alarmtypenum', 'serial',     '',      '', '', '',
6740         'agentnum',        'int', 'NULL',      '', '', '',
6741         'inputs',          'int',     '', '', '', '',
6742         'outputs',         'int',     '', '', '', '',
6743         'disabled',       'char', 'NULL',       1, '', '', 
6744       ],
6745       'primary_key' => 'alarmtypenum',
6746       'unique'      => [ ['agentnum', 'inputs', 'outputs'] ],
6747       'index'       => [ ['agentnum'], ['disabled'] ],
6748       'foreign_keys' => [
6749                           { columns    => [ 'agentnum' ],
6750                             table      => 'agent',
6751                           },
6752                         ],
6753     },
6754
6755     'alarm_station' => { #central station (where the alarm reports to)
6756       'columns' => [
6757         'alarmstationnum', 'serial',     '',      '', '', '',
6758         'agentnum',           'int', 'NULL',      '', '', '',
6759         'stationname',    'varchar',     '', $char_d, '', '',
6760         'disabled',          'char', 'NULL',       1, '', '', 
6761       ],
6762       'primary_key' => 'alarmstationnum',
6763       'unique'      => [ ['agentnum', 'stationname'], ],
6764       'index'       => [ ['agentnum'], ['disabled'] ],
6765       'foreign_keys' => [
6766                           { columns    => [ 'agentnum' ],
6767                             table      => 'agent',
6768                           },
6769                         ],
6770     },
6771
6772     'svc_cable' => {
6773       'columns' => [
6774         'svcnum',        'int',     '',      '', '', '', 
6775         'providernum',   'int', 'NULL',      '', '', '',
6776         'ordernum',  'varchar', 'NULL', $char_d, '', '',
6777         'modelnum',      'int', 'NULL',      '', '', '',
6778         'serialnum', 'varchar', 'NULL', $char_d, '', '',
6779         'mac_addr',  'varchar', 'NULL',      12, '', '', 
6780       ],
6781       'primary_key'  => 'svcnum',
6782       'unique'       => [ ['serialnum'] , ['mac_addr'] ],
6783       'index'        => [],
6784       'foreign_keys' => [
6785                           { columns    => [ 'svcnum' ],
6786                             table      => 'cust_svc',
6787                           },
6788                           { columns    => [ 'providernum' ],
6789                             table      => 'cable_provider',
6790                           },
6791                           { columns    => [ 'modelnum' ],
6792                             table      => 'cable_model',
6793                           },
6794                         ],
6795     },
6796
6797     'cable_model' => {
6798       'columns' => [
6799         'modelnum',    'serial',     '',      '', '', '',
6800         'model_name', 'varchar',     '', $char_d, '', '',
6801         'disabled',      'char', 'NULL',       1, '', '', 
6802       ],
6803       'primary_key' => 'modelnum',
6804       'unique' => [ [ 'model_name' ], ],
6805       'index'  => [],
6806     },
6807
6808     'cable_provider' => {
6809       'columns' => [
6810         'providernum', 'serial',     '',      '', '', '',
6811         'provider',   'varchar',     '', $char_d, '', '',
6812         'disabled',      'char', 'NULL',       1, '', '', 
6813       ],
6814       'primary_key' => 'providernum',
6815       'unique' => [ [ 'provider' ], ],
6816       'index'  => [],
6817     },
6818
6819     'svc_conferencing' => {
6820       'columns' => [
6821         'svcnum',            'int',     '',      '', '', '',
6822         'conf_id',           'int', 'NULL',      '', '', '', #"system assigned"
6823         'conf_name',     'varchar',     '', $char_d, '', '',
6824         'conf_password', 'varchar',     '', $char_d, '', '',
6825         'access_code',   'varchar',     '',      16, '', '',
6826         'duration',          'int',     '',      '', '', '',
6827         'participants',      'int',     '',      '', '', '',
6828         'conftypenum',       'int',     '',      '', '', '',
6829         'confqualitynum',    'int',     '',      '', '', '',
6830         'opt_recording',    'char', 'NULL',       1, '', '',
6831         'opt_sip',          'char', 'NULL',       1, '', '',
6832         'opt_phone',        'char', 'NULL',       1, '', '',
6833       ],
6834       'primary_key' => 'svcnum',
6835       'unique' => [],
6836       'index'  => [],
6837       'foreign_keys' => [
6838                           { columns => [ 'svcnum' ],
6839                             table   => 'cust_svc',
6840                           },
6841                           { columns => [ 'conftypenum' ],
6842                             table   => 'conferencing_type',
6843                           },
6844                           { columns => [ 'confqualitynum' ],
6845                             table   => 'conferencing_quality',
6846                           },
6847                         ],
6848     },
6849
6850     'conferencing_type' => {
6851       'columns' => [
6852         'conftypenum',  'int',     '',      '', '', '',
6853         'typeid'      , 'int',     '',      '', '', '',
6854         'typename', 'varchar',     '', $char_d, '', '',
6855         'disabled',    'char', 'NULL',       1, '', '', 
6856       ],
6857       'primary_key' => 'conftypenum',
6858       'unique'      => [ [ 'typeid', 'disabled' ], [ 'typename', 'disabled' ] ],
6859       'index'       => [],
6860     },
6861
6862     'conferencing_quality' => {
6863       'columns' => [
6864         'confqualitynum',  'int',     '',      '', '', '',
6865         'qualityid'      , 'int',     '',      '', '', '',
6866         'qualityname', 'varchar',     '', $char_d, '', '',
6867         'disabled',       'char', 'NULL',       1, '', '', 
6868       ],
6869       'primary_key' => 'confqualitynum',
6870       'unique'      => [ [ 'qualityid', 'disabled' ], [ 'qualityname', 'disabled' ] ],
6871       'index'       => [],
6872     },
6873
6874     'svc_video' => {
6875       'columns' => [
6876         'svcnum',            'int', '', '', '', '',
6877         'smartcard_num', 'varchar', '', 16, '', '',
6878         'mac_addr',      'varchar', '', 12, '', '', 
6879         'duration',          'int', '', '', '', '',
6880       ],
6881       'primary_key' => 'svcnum',
6882       'unique' => [], # [ 'smartcard_num' ], [ 'mac_addr' ], ],
6883       'index'  => [],
6884       'foreign_keys' => [
6885                           { columns => [ 'svcnum' ],
6886                             table   => 'cust_svc',
6887                           },
6888                         ],
6889     },
6890
6891     'circuit_type' => {
6892       'columns' => [
6893         'typenum',     'serial',     '',      '', '', '',
6894         'typename',   'varchar',     '', $char_d, '', '',
6895         'disabled',      'char', 'NULL',       1, '', '',
6896         # speed? number of voice lines? anything else?
6897       ],
6898       'primary_key' => 'typenum',
6899       'unique' => [ [ 'typename' ] ],
6900       'index'  => [],
6901     },
6902
6903     'circuit_provider' => {
6904       'columns' => [
6905         'providernum', 'serial',     '',      '', '', '',
6906         'provider',   'varchar',     '', $char_d, '', '',
6907         'disabled',      'char', 'NULL',       1, '', '', 
6908       ],
6909       'primary_key' => 'providernum',
6910       'unique' => [ [ 'provider' ], ],
6911       'index'  => [],
6912     },
6913
6914     'circuit_termination' => {
6915       'columns' => [
6916         'termnum',     'serial',     '',      '', '', '',
6917         'termination','varchar',     '', $char_d, '', '',
6918         'disabled',      'char', 'NULL',       1, '', '',
6919       ],
6920       'primary_key' => 'termnum',
6921       'unique' => [ [ 'termination' ] ],
6922       'index' => [],
6923     },
6924
6925     'svc_circuit' => {
6926       'columns' => [
6927         'svcnum',                   'int',     '', '', '', '',
6928         'typenum',                  'int',     '', '', '', '',
6929         'providernum',              'int',     '', '', '', '',
6930         'termnum',                  'int',     '', '', '', '',
6931         'circuit_id',           'varchar',     '', 64, '', '',
6932         'desired_due_date',         'int', 'NULL', '', '', '',
6933         'due_date',                 'int', 'NULL', '', '', '',
6934         'vendor_order_id',      'varchar', 'NULL', $char_d,  '', '',
6935         'vendor_qual_id',       'varchar', 'NULL', $char_d,  '', '',
6936         'vendor_order_type',    'varchar', 'NULL', $char_d,  '', '',
6937         'vendor_order_status',  'varchar', 'NULL', $char_d,  '', '',
6938         'endpoint_ip_addr',     'varchar', 'NULL', 40, '', '',
6939         'endpoint_mac_addr',    'varchar', 'NULL', 12, '', '',
6940       ],
6941       'primary_key' => 'svcnum',
6942       'unique'      => [],
6943       'index'       => [ [ 'providernum' ], [ 'typenum' ] ],
6944       'foreign_keys' => [
6945                           { columns => [ 'svcnum' ],
6946                             table   => 'cust_svc',
6947                           },
6948                           { columns => [ 'typenum' ],
6949                             table   => 'circuit_type',
6950                           },
6951                           { columns => [ 'providernum' ],
6952                             table   => 'circuit_provider',
6953                           },
6954                           { columns => [ 'termnum' ],
6955                             table   => 'circuit_termination',
6956                           },
6957       ],
6958     },
6959
6960     'svc_fiber' => {
6961       'columns' => [
6962         'svcnum',         'int',     '',      '', '', '',
6963         'oltnum',         'int', 'NULL',      '', '', '',
6964         'shelf',          'int', 'NULL',      '', '', '',
6965         'card',           'int', 'NULL',      '', '', '',
6966         'olt_port',       'int', 'NULL',      '', '', '',
6967         'ont_id',         'int', 'NULL',      '', '', '',
6968         'ont_typenum',    'int', 'NULL',      '', '', '',
6969         'ont_serial', 'varchar', 'NULL', $char_d, '', '',
6970         'ont_port',   'varchar', 'NULL',      16, '', '',
6971         'circuit_id', 'varchar', 'NULL', $char_d, '', '',
6972         'vlan',           'int', 'NULL',      '', '', '',
6973         'signal',     'decimal', 'NULL',  '10,2', '', '',
6974         'speed_up',       'int', 'NULL',      '', '', '',
6975         'speed_down',     'int', 'NULL',      '', '', '',
6976         'ont_install','varchar', 'NULL', $char_d, '', '',
6977       ],
6978       'primary_key' => 'svcnum',
6979       'unique'      => [ ],
6980       'index'       => [ [ 'ont_serial' ] ],
6981       'foreign_keys' => [
6982                           { columns => [ 'svcnum' ],
6983                             table   => 'cust_svc',
6984                           },
6985                           { columns => [ 'oltnum' ],
6986                             table   => 'fiber_olt',
6987                           },
6988                           { columns => [ 'ont_typenum' ],
6989                             table   => 'hardware_type',
6990                             references => [ 'typenum' ],
6991                           },
6992                         ],
6993     },
6994
6995     'fiber_olt' => {
6996       'columns' => [
6997         'oltnum',   'serial', '',       '', '', '',
6998         'oltname', 'varchar', '',  $char_d, '', '',
6999         'sitenum',     'int', 'NULL',   '', '', '',
7000         'serial',  'varchar', '',  $char_d, '', '',
7001         'disabled',   'char', 'NULL',    1, '', '',
7002       ],
7003       'primary_key' => 'oltnum',
7004       'unique' => [ ],
7005       'index'  => [ ],
7006       'foreign_keys' => [
7007                           { columns => [ 'sitenum' ],
7008                             table   => 'olt_site',
7009                           },
7010                         ],
7011     },
7012
7013     'olt_site' => {
7014       'columns' => [
7015         'sitenum',  'serial', '',      '', '', '',
7016         'market',  'varchar', '', $char_d, '', '',
7017         'site',    'varchar', '', $char_d, '', '',
7018       ],
7019       'primary_key' => 'sitenum',
7020       'unique' => [ [ 'market', 'site' ] ],
7021       'index' => [ ],
7022     },
7023
7024
7025
7026
7027
7028     'vend_main' => {
7029       'columns' => [
7030         'vendnum',   'serial',     '',      '', '', '',
7031         'vendname', 'varchar',     '', $char_d, '', '',
7032         'classnum',     'int',     '',      '', '', '',
7033         'disabled',    'char', 'NULL',       1, '', '', 
7034       ],
7035       'primary_key'  => 'vendnum',
7036       'unique'       => [ ['vendname', 'disabled'] ],
7037       'index'        => [],
7038       'foreign_keys' => [
7039                           { columns    => [ 'classnum' ],
7040                             table      => 'vend_class',
7041                           },
7042                         ],
7043     },
7044
7045     'vend_class' => {
7046       'columns' => [
7047         'classnum',     'serial',     '',      '', '', '', 
7048         'classname',   'varchar',     '', $char_d, '', '', 
7049         'disabled',       'char', 'NULL',       1, '', '', 
7050       ],
7051       'primary_key' => 'classnum',
7052       'unique'      => [],
7053       'index'       => [ ['disabled'] ],
7054     },
7055
7056     'vend_bill' => {
7057       'columns' => [
7058         'vendbillnum',    'serial',     '',      '', '', '', 
7059         'vendnum',           'int',     '',      '', '', '', 
7060         #'_date',        @date_type,                  '', '', 
7061         '_date',     'int', '', '',                   '', '', 
7062         'charged',     @money_type,                  '', '', 
7063       ],
7064       'primary_key'  => 'vendbillnum',
7065       'unique'       => [],
7066       'index'        => [ ['vendnum'], ['_date'], ],
7067       'foreign_keys' => [
7068                           { columns    => [ 'vendnum' ],
7069                             table      => 'vend_main',
7070                           },
7071                         ],
7072     },
7073
7074     'vend_pay' => {
7075       'columns' => [
7076         'vendpaynum',   'serial',    '',       '', '', '',
7077         'vendnum',         'int',    '',       '', '', '', 
7078         #'_date',     @date_type,                   '', '', 
7079         '_date',     'int', '', '',                   '', '', 
7080         'paid',      @money_type,                  '', '', 
7081       ],
7082       'primary_key'  => 'vendpaynum',
7083       'unique'       => [],
7084       'index'        => [ [ 'vendnum' ], [ '_date' ], ],
7085       'foreign_keys' => [
7086                           { columns    => [ 'vendnum' ],
7087                             table      => 'vend_main',
7088                           },
7089                         ],
7090     },
7091
7092     'vend_bill_pay' => {
7093       'columns' => [
7094         'vendbillpaynum', 'serial',     '',   '', '', '', 
7095         'vendbillnum',       'int',     '',   '', '', '', 
7096         'vendpaynum',        'int',     '',   '', '', '', 
7097         'amount',  @money_type, '', '', 
7098         #? '_date',   @date_type, '', '', 
7099       ],
7100       'primary_key'  => 'vendbillpaynum',
7101       'unique'       => [],
7102       'index'        => [ [ 'vendbillnum' ], [ 'vendpaynum' ] ],
7103       'foreign_keys' => [
7104                           { columns    => [ 'vendbillnum' ],
7105                             table      => 'vend_bill',
7106                           },
7107                           { columns    => [ 'vendpaynum' ],
7108                             table      => 'vend_pay',
7109                           },
7110                         ],
7111     },
7112
7113     %{ tables_hashref_torrus() },
7114
7115     # tables of ours for doing torrus virtual port combining
7116     'torrus_srvderive' => {
7117       'columns' => [
7118         'derivenum',     'serial',     '', '', '', '',
7119         'serviceid',    'varchar',     '', 64, '', '', #srvexport / reportfields
7120         'last_srv_date',   'date', 'NULL', '', '', '',
7121       ],
7122       'primary_key' => 'derivenum',
7123       'unique' => [ ['serviceid'] ],
7124       'index'  => [],
7125     },
7126
7127     'torrus_srvderive_component' => {
7128       'columns' => [
7129         'componentnum', 'serial', '', '', '', '',
7130         'derivenum',       'int', '', '', '', '',
7131         'serviceid',   'varchar', '', 64, '', '', #srvexport / reportfields
7132       ],
7133       'primary_key'  => 'componentnum',
7134       'unique'       => [ [ 'derivenum', 'serviceid' ], ],
7135       'index'        => [ [ 'derivenum', ], ],
7136       'foreign_keys' => [
7137                           { columns    => [ 'derivenum' ],
7138                             table      => 'torrus_srvderive',
7139                           },
7140                         ],
7141     },
7142
7143     'invoice_mode' => {
7144       'columns' => [
7145         'modenum',      'serial', '', '', '', '',
7146         'agentnum',        'int', 'NULL', '', '', '',
7147         'modename',    'varchar', '', 32, '', '',
7148       ],
7149       'primary_key' => 'modenum',
7150       'unique'      => [ ],
7151       'index'       => [ ],
7152       'foreign_keys' => [
7153                           { columns    => [ 'agentnum' ],
7154                             table      => 'agent',
7155                           },
7156                         ],
7157     },
7158
7159     'invoice_conf' => {
7160       'columns' => [
7161         'confnum',              'serial',   '', '', '', '',
7162         'modenum',              'int',      '', '', '', '',
7163         'locale',               'varchar',  'NULL', 16, '', '',
7164         'notice_name',          'varchar',  'NULL', 64, '', '',
7165         'subject',              'varchar',  'NULL', 64, '', '',
7166         'htmlnotes',            'text',     'NULL', '', '', '',
7167         'htmlfooter',           'text',     'NULL', '', '', '',
7168         'htmlsummary',          'text',     'NULL', '', '', '',
7169         'htmlreturnaddress',    'text',     'NULL', '', '', '',
7170         'latexnotes',           'text',     'NULL', '', '', '',
7171         'latexfooter',          'text',     'NULL', '', '', '',
7172         'latexsummary',         'text',     'NULL', '', '', '',
7173         'latexsmallfooter',     'text',     'NULL', '', '', '',
7174         'latexreturnaddress',   'text',     'NULL', '', '', '',
7175         'with_latexcoupon',     'char',     'NULL', '1', '', '',
7176         'htmlwatermark',        'text',     'NULL', '', '', '',
7177         'latexwatermark',       'text',     'NULL', '', '', '',
7178         'lpr',                  'varchar',  'NULL', $char_d, '', '',
7179       ],
7180       'primary_key'  => 'confnum',
7181       'unique'       => [ [ 'modenum', 'locale' ] ],
7182       'index'        => [ ],
7183       'foreign_keys' => [
7184                           { columns    => [ 'modenum' ],
7185                             table      => 'invoice_mode',
7186                           },
7187                         ],
7188     },
7189
7190     'export_batch' => {
7191       'columns' => [
7192         'batchnum',    'serial',     '',      '', '', '',
7193         'exportnum',      'int',     '',      '', '', '',
7194         '_date',          'int',     '',      '', '', '',
7195         'status',     'varchar', 'NULL',      32, '', '',
7196         'statustext',    'text', 'NULL',      '', '', '',
7197       ],
7198       'primary_key'  => 'batchnum',
7199       'unique'       => [],
7200       'index'        => [ [ 'exportnum' ], [ 'status' ] ],
7201       'foreign_keys' => [
7202                           { columns    => [ 'exportnum' ],
7203                             table      => 'part_export',
7204                             references => [ 'exportnum' ]
7205                           },
7206                         ],
7207     },
7208
7209     'export_batch_item' => {
7210       'columns' => [
7211         'itemnum',     'serial',     '',      '', '', '',
7212         'batchnum',       'int',     '',      '', '', '',
7213         'svcnum',         'int',     '',      '', '', '',
7214         'action',     'varchar',     '',      32, '', '',
7215         'data',          'text', 'NULL',      '', '', '',
7216         'frozen',        'char', 'NULL',       1, '', '',
7217       ],
7218       'primary_key'  => 'itemnum',
7219       'unique'       => [],
7220       'index'        => [ [ 'batchnum' ], [ 'svcnum' ] ],
7221       'foreign_keys' => [
7222                           { columns    => [ 'batchnum' ],
7223                             table      => 'export_batch',
7224                             references => [ 'batchnum' ]
7225                           },
7226                         ],
7227     },
7228
7229     # lookup table for states, similar to msa and lata
7230     'state' => {
7231       'columns' => [
7232         'statenum', 'int',  '', '', '', '', 
7233         'country',  'char', '',  2, '', '',
7234         'state',    'char', '', $char_d, '', '', 
7235         'fips',     'char', '',  3, '', '',
7236       ],
7237       'primary_key' => 'statenum',
7238       'unique' => [ [ 'country', 'state' ], ],
7239       'index' => [],
7240     },
7241
7242     # eventually link to tower/sector?
7243     'deploy_zone' => {
7244       'columns' => [
7245         'zonenum',        'serial',  '',     '',      '', '',
7246         'description',    'char',    'NULL', $char_d, '', '',
7247         'agentnum',       'int',     '',     '',      '', '',
7248         'censusyear',     'char',    'NULL', 4,      '', '',
7249         'dbaname',        'char',    'NULL', $char_d, '', '',
7250         'zonetype',       'char',    '',     1,       '', '',
7251         'technology',     'int',     '',     '',      '', '',
7252         'spectrum',       'int',     'NULL', '',      '', '',
7253         'adv_speed_up',   'decimal', '',     '10,3', '0', '',
7254         'adv_speed_down', 'decimal', '',     '10,3', '0', '',
7255         'cir_speed_up',   'decimal', '',     '10,3', '0', '',
7256         'cir_speed_down', 'decimal', '',     '10,3', '0', '',
7257         'is_broadband',   'char',    'NULL', 1,       '', '',
7258         'is_voice',       'char',    'NULL', 1,       '', '',
7259         'is_consumer',    'char',    'NULL', 1,       '', '',
7260         'is_business',    'char',    'NULL', 1,       '', '',
7261         'active_date',    @date_type,                 '', '',
7262         'expire_date',    @date_type,                 '', '',
7263       ],
7264       'primary_key' => 'zonenum',
7265       'unique' => [],
7266       'index'  => [ [ 'agentnum' ] ],
7267       'foreign_keys' => [
7268                           { columns     => [ 'agentnum' ],
7269                             table       => 'agent',
7270                             references  => [ 'agentnum' ],
7271                           },
7272                         ],
7273     },
7274
7275     'deploy_zone_block' => {
7276       'columns' => [
7277         'blocknum',       'serial',  '',     '',      '', '',
7278         'zonenum',        'int',     '',     '',      '', '',
7279         'censusblock',    'char',    '',     15,      '', '',
7280         'censusyear',     'char','NULL',      4,      '', '',
7281       ],
7282       'primary_key' => 'blocknum',
7283       'unique' => [],
7284       'index'  => [ [ 'zonenum' ] ],
7285       'foreign_keys' => [
7286                           { columns     => [ 'zonenum' ],
7287                             table       => 'deploy_zone',
7288                             references  => [ 'zonenum' ],
7289                           },
7290                         ],
7291     },
7292
7293     'deploy_zone_vertex' => {
7294       'columns' => [
7295         'vertexnum',      'serial',  '',     '',      '', '',
7296         'zonenum',        'int',     '',     '',      '', '',
7297         'latitude',       'decimal', '',     '10,7',  '', '', 
7298         'longitude',      'decimal', '',     '10,7',  '', '', 
7299       ],
7300       'primary_key' => 'vertexnum',
7301       'unique' => [ ],
7302       'index'  => [ ],
7303       'foreign_keys' => [
7304                           { columns     => [ 'zonenum' ],
7305                             table       => 'deploy_zone',
7306                             references  => [ 'zonenum' ],
7307                           },
7308                         ],
7309     },
7310
7311     'cacti_page' => {
7312       'columns' => [
7313         'cacti_pagenum',  'serial',   '',     '', '', '',
7314         'exportnum',      'int',      'NULL', '', '', '',
7315         'svcnum',         'int',      'NULL', '', '', '', 
7316         'graphnum',       'int',      'NULL', '', '', '', 
7317         'imported',       @date_type,             '', '',
7318         'content',        'text',     'NULL', '', '', '',
7319       ],
7320       'primary_key' => 'cacti_pagenum',
7321       'unique'  => [ ],
7322       'index'   => [ ['svcnum'], ['imported'] ],
7323       'foreign_keys' => [
7324                           { columns    => [ 'svcnum' ],
7325                             table      => 'cust_svc',
7326                             references => [ 'svcnum' ],
7327                           },
7328                           { columns    => [ 'exportnum' ],
7329                             table      => 'part_export',
7330                             references => [ 'exportnum' ],
7331                           },
7332                         ],
7333     },
7334
7335     'report_batch' => {
7336       'columns' => [
7337         'reportbatchnum', 'serial',      '',  '', '', '',
7338         'reportname',     'varchar',     '', 255, '', '',
7339         'agentnum',           'int', 'NULL',  '', '', '',
7340         'send_date',     @date_type,              '', '',
7341         'sdate',         @date_type,              '', '',
7342         'edate',         @date_type,              '', '',
7343         'usernum',            'int', 'NULL',  '', '', '',
7344         'msgnum',             'int', 'NULL',  '', '', '',
7345         # add report params here as necessary
7346       ],
7347       'primary_key' => 'reportbatchnum',
7348       'unique' => [],
7349       'index'  => [],
7350       'foreign_keys' => [
7351                           { columns    => [ 'agentnum' ],
7352                             table      => 'agent',
7353                             references => [ 'agentnum' ],
7354                           },
7355                           { columns    => [ 'usernum' ],
7356                             table      => 'access_user',
7357                             references => [ 'usernum' ],
7358                           },
7359                           { columns    => [ 'msgnum' ],
7360                             table      => 'msg_template',
7361                             references => [ 'msgnum' ],
7362                           },
7363                         ],
7364     },
7365
7366     'password_history' => {
7367       'columns' => [
7368         'passwordnum',        'serial',  '',          '', '', '',
7369         '_password',          'varchar', 'NULL', $char_d, '', '',
7370         'encryption_method',  'varchar', 'NULL', $char_d, '', '',
7371         'created',   @date_type,   '', '',
7372         # each table that needs password history gets a column here, and
7373         # an entry in foreign_keys.
7374         'svc_acct__svcnum',     'int', 'NULL', '', '', '',
7375         'svc_dsl__svcnum',      'int', 'NULL', '', '', '',
7376         'svc_alarm__svcnum',    'int', 'NULL', '', '', '',
7377         'agent__agentnum',      'int', 'NULL', '', '', '',
7378         'contact__contactnum',  'int', 'NULL', '', '', '',
7379         'access_user__usernum', 'int', 'NULL', '', '', '',
7380       ],
7381       'primary_key' => 'passwordnum',
7382       'unique' => [],
7383       'index'  => [],
7384       'foreign_keys' => [
7385                           { columns     => [ 'svc_acct__svcnum' ],
7386                             table       => 'svc_acct',
7387                             references  => [ 'svcnum' ],
7388                           },
7389                           { columns     => [ 'svc_dsl__svcnum' ],
7390                             table       => 'svc_dsl',
7391                             references  => [ 'svcnum' ],
7392                           },
7393                           { columns     => [ 'svc_alarm__svcnum' ],
7394                             table       => 'svc_alarm',
7395                             references  => [ 'svcnum' ],
7396                           },
7397                           { columns    => [ 'agent__agentnum' ],
7398                             table      => 'agent',
7399                             references => [ 'agentnum' ],
7400                           },
7401                           { columns    => [ 'contact__contactnum' ],
7402                             table      => 'contact',
7403                             references => [ 'contactnum' ],
7404                           },
7405                           { columns    => [ 'access_user__usernum' ],
7406                             table      => 'access_user',
7407                             references => [ 'usernum' ],
7408                           },
7409                         ],
7410     },
7411
7412     'webservice_log' => {
7413       'columns' => [
7414         'webservicelognum',    'serial',      '',      '', '', '', #big? hubrus
7415         'svcnum',                 'int',  'NULL',      '', '', '', #just in case
7416         'custnum',                'int',      '',      '', '', '',
7417         'method',             'varchar',      '', $char_d, '', '',
7418         'quantity',               'int',      '',      '', '', '', #i.e. pages
7419         '_date',             @date_type,                   '', '',
7420         'status',             'varchar',  'NULL', $char_d, '', '', 
7421         'rated_price',        'decimal',  'NULL',  '10,2', '', '',
7422       ],
7423       'primary_key'  => 'webservicelognum',
7424       'unique'       => [],
7425       'index'        => [ ['custnum'], ['status'] ],
7426       'foreign_keys' => [
7427                           { columns => [ 'custnum' ],
7428                             table   => 'cust_main',
7429                           },
7430                           #no FK on svcnum... we don't want to purge these on
7431                           # service deletion
7432                         ],
7433     },
7434
7435     'rt_field_charge' => {
7436       'columns' => [
7437         'rtfieldchargenum',    'serial',      '',      '', '', '',
7438         'pkgnum',                 'int',      '',      '', '', '', 
7439         'ticketid',               'int',      '',      '', '', '', 
7440         'rate',             @money_type,                   '', '', 
7441         'units',              'decimal',      '',  '10,4', '', '',
7442         'charge',           @money_type,                   '', '', 
7443         '_date',             @date_type,                   '', '',
7444       ],
7445       'primary_key'  => 'rtfieldchargenum',
7446       'unique'       => [],
7447       'index'        => [ ['pkgnum', 'ticketid'] ],
7448       'foreign_keys' => [
7449                           { columns    => [ 'pkgnum' ],
7450                             table      => 'cust_pkg',
7451                           },
7452                         ],
7453     },
7454
7455     'commission_schedule' => {
7456       'columns' => [
7457         'schedulenum',    'serial',     '',      '', '', '',
7458         'schedulename',  'varchar',     '', $char_d, '', '',
7459         'reasonnum',         'int', 'NULL',      '', '', '',
7460         'basis',         'varchar', 'NULL',      32, '', '',
7461       ],
7462       'primary_key'  => 'schedulenum',
7463       'unique'       => [],
7464       'index'        => [],
7465     },
7466
7467     'commission_rate' => {
7468       'columns' => [
7469         'commissionratenum', 'serial',     '',      '', '', '',
7470         'schedulenum',       'int',     '',      '', '', '',
7471         'cycle',             'int',     '',      '', '', '',
7472         'amount',            @money_type,          '', '', 
7473         'percent',           'decimal','',   '7,4', '', '',
7474       ],
7475       'primary_key'  => 'commissionratenum',
7476       'unique'       => [ [ 'schedulenum', 'cycle', ] ],
7477       'index'        => [],
7478       'foreign_keys' => [
7479                           { columns => [ 'schedulenum' ],
7480                             table   => 'commission_schedule',
7481                           },
7482                         ],
7483     },
7484  
7485     # name type nullability length default local
7486
7487     #'new_table' => {
7488     #  'columns' => [
7489     #    'num', 'serial',       '', '', '', '',
7490     #  ],
7491     #  'primary_key' => 'num',
7492     #  'unique' => [],
7493     #  'index'  => [],
7494     #},
7495
7496   };
7497
7498 }
7499
7500 =back
7501
7502 =head1 BUGS
7503
7504 =head1 SEE ALSO
7505
7506 L<DBIx::DBSchema>
7507
7508 =cut
7509
7510 1;
7511