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