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