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