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