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