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