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