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