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