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