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