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