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