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