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