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