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