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