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