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