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