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