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