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