trade space for time
[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.33;
7 use DBIx::DBSchema::Table;
8 use DBIx::DBSchema::Column 0.06;
9 use DBIx::DBSchema::Index;
10
11 @ISA = qw(Exporter);
12 @EXPORT_OK = qw( dbdef dbdef_dist reload_dbdef );
13
14 $DEBUG = 0;
15 $me = '[FS::Schema]';
16
17 =head1 NAME
18
19 FS::Schema - Freeside database schema
20
21 =head1 SYNOPSYS
22
23     use FS::Schema qw(dbdef dbdef_dist reload_dbdef);
24
25     $dbdef = reload_dbdef;
26     $dbdef = reload_dbdef "/non/standard/filename";
27     $dbdef = dbdef;
28     $dbdef_dist = dbdef_dist;
29
30 =head1 DESCRIPTION
31
32 This class represents the database schema.
33
34 =head1 METHODS
35
36 =over 4
37
38 =item reload_dbdef([FILENAME])
39
40 Load a database definition (see L<DBIx::DBSchema>), optionally from a
41 non-default filename.  This command is executed at startup unless
42 I<$FS::Schema::setup_hack> is true.  Returns a DBIx::DBSchema object.
43
44 =cut
45
46 sub reload_dbdef {
47   my $file = shift;
48
49   unless ( exists $dbdef_cache{$file} ) {
50     warn "[debug]$me loading dbdef for $file\n" if $DEBUG;
51     $dbdef_cache{$file} = DBIx::DBSchema->load( $file )
52       or die "can't load database schema from $file: $DBIx::DBSchema::errstr\n";
53   } else {
54     warn "[debug]$me re-using cached dbdef for $file\n" if $DEBUG;
55   }
56   $dbdef = $dbdef_cache{$file};
57 }
58
59 =item dbdef
60
61 Returns the current database definition (represents the current database,
62 assuming it is up-to-date).  See L<DBIx::DBSchema>.
63
64 =cut
65
66 sub dbdef { $dbdef; }
67
68 =item dbdef_dist [ DATASRC ]
69
70 Returns the current canoical database definition as defined in this file.
71
72 Optionally, pass a DBI data source to enable syntax specific to that database.
73 Currently, this enables "TYPE=InnoDB" for MySQL databases.
74
75 =cut
76
77 sub dbdef_dist {
78   my $datasrc = @_ ? shift : '';
79   
80   my $local_options = '';
81   if ( $datasrc =~ /^dbi:mysql/i ) {
82     $local_options = 'TYPE=InnoDB';
83   }
84
85   ###
86   # create a dbdef object from the old data structure
87   ###
88
89   my $tables_hashref = tables_hashref();
90
91   #turn it into objects
92   my $dbdef = new DBIx::DBSchema map {  
93
94     my $tablename = $_;
95     my $indexnum = 1;
96
97     my @columns;
98     while (@{$tables_hashref->{$tablename}{'columns'}}) {
99       #my($name, $type, $null, $length, $default, $local) =
100       my @coldef = 
101         splice @{$tables_hashref->{$tablename}{'columns'}}, 0, 6;
102       my %hash = map { $_ => shift @coldef }
103                      qw( name type null length default local );
104
105       unless ( defined $hash{'default'} ) {
106         warn "$tablename:\n".
107              join('', map "$_ => $hash{$_}\n", keys %hash) ;# $stop = <STDIN>;
108       }
109
110       push @columns, new DBIx::DBSchema::Column ( \%hash );
111     }
112
113     #false laziness w/sub indices in DBIx::DBSchema::DBD (well, sorta)
114     #and sub sql_create_table in DBIx::DBSchema::Table (slighty more?)
115     my $unique = $tables_hashref->{$tablename}{'unique'};
116     my $index  = $tables_hashref->{$tablename}{'index'};
117     my @indices = ();
118     push @indices, map {
119                          DBIx::DBSchema::Index->new({
120                            'name'    => $tablename. $indexnum++,
121                            'unique'  => 1,
122                            'columns' => $_,
123                          });
124                        }
125                        @$unique;
126     push @indices, map {
127                          DBIx::DBSchema::Index->new({
128                            'name'    => $tablename. $indexnum++,
129                            'unique'  => 0,
130                            'columns' => $_,
131                          });
132                        }
133                        @$index;
134
135     DBIx::DBSchema::Table->new({
136       'name'          => $tablename,
137       'primary_key'   => $tables_hashref->{$tablename}{'primary_key'},
138       'columns'       => \@columns,
139       'indices'       => \@indices,
140       'local_options' => $local_options,
141     });
142
143   } keys %$tables_hashref;
144
145   if ( $DEBUG ) {
146     warn "[debug]$me initial dbdef_dist created ($dbdef) with tables:\n";
147     warn "[debug]$me   $_\n" foreach $dbdef->tables;
148   }
149   
150   #add radius attributes to svc_acct
151   #
152   #my($svc_acct)=$dbdef->table('svc_acct');
153   # 
154   #my($attribute);
155   #foreach $attribute (@attributes) {
156   #  $svc_acct->addcolumn ( new DBIx::DBSchema::Column (
157   #    'radius_'. $attribute,
158   #    'varchar',
159   #    'NULL',
160   #    $char_d,
161   #  ));
162   #}
163   # 
164   #foreach $attribute (@check_attributes) {
165   #  $svc_acct->addcolumn( new DBIx::DBSchema::Column (
166   #    'rc_'. $attribute,
167   #    'varchar',
168   #    'NULL',
169   #    $char_d,
170   #  ));
171   #}
172
173   #create history tables (false laziness w/create-history-tables)
174   foreach my $table (
175     grep { ! /^clientapi_session/ }
176     grep { ! /^h_/ }
177     $dbdef->tables
178   ) {
179     my $tableobj = $dbdef->table($table)
180       or die "unknown table $table";
181
182     my %indices = $tableobj->indices;
183     
184     my %h_indices = map { 
185                           ( "h_$_" =>
186                               DBIx::DBSchema::Index->new({
187                                 'name'    => 'h_'. $indices{$_}->name,
188                                 'unique'  => 0,
189                                 'columns' => [ @{$indices{$_}->columns} ],
190                               })
191                           );
192                         }
193                         keys %indices;
194
195     $h_indices{"h_${table}_srckey"} = DBIx::DBSchema::Index->new({
196                                         'name'    => "h_${table}_srckey",
197                                         'unique'  => 0,
198                                         'columns' => [ 'history_action', #right?
199                                                        $tableobj->primary_key,
200                                                      ],
201                                       });
202
203     $h_indices{"h_${table}_srckey2"} = DBIx::DBSchema::Index->new({
204                                          'name'    => "h_${table}_srckey2",
205                                          'unique'  => 0,
206                                          'columns' => [ 'history_date',
207                                                         $tableobj->primary_key,
208                                                       ],
209                                        });
210
211     my $h_tableobj = DBIx::DBSchema::Table->new( {
212       'name'          => "h_$table",
213       'primary_key'   => 'historynum',
214       'indices'       => \%h_indices,
215       'local_options' => $local_options,
216       'columns'       => [
217           DBIx::DBSchema::Column->new( {
218             'name'    => 'historynum',
219             'type'    => 'serial',
220             'null'    => 'NOT NULL',
221             'length'  => '',
222             'default' => '',
223             'local'   => '',
224           } ),
225           DBIx::DBSchema::Column->new( {
226             'name'    => 'history_date',
227             'type'    => 'int',
228             'null'    => 'NULL',
229             'length'  => '',
230             'default' => '',
231             'local'   => '',
232           } ),
233           DBIx::DBSchema::Column->new( {
234             'name'    => 'history_user',
235             'type'    => 'varchar',
236             'null'    => 'NOT NULL',
237             'length'  => '80',
238             'default' => '',
239             'local'   => '',
240           } ),
241           DBIx::DBSchema::Column->new( {
242             'name'    => 'history_action',
243             'type'    => 'varchar',
244             'null'    => 'NOT NULL',
245             'length'  => '80',
246             'default' => '',
247             'local'   => '',
248           } ),
249           map {
250             my $column = $tableobj->column($_);
251     
252             #clone so as to not disturb the original
253             $column = DBIx::DBSchema::Column->new( {
254               map { $_ => $column->$_() }
255                 qw( name type null length default local )
256             } );
257     
258             if ( $column->type =~ /^(\w*)SERIAL$/i ) {
259               $column->type('int');
260               $column->null('NULL');
261             }
262             #$column->default('')
263             #  if $column->default =~ /^nextval\(/i;
264             #( my $local = $column->local ) =~ s/AUTO_INCREMENT//i;
265             #$column->local($local);
266             $column;
267           } $tableobj->columns
268       ],
269     } );
270     $dbdef->addtable($h_tableobj);
271   }
272
273   if ( $datasrc =~ /^dbi:mysql/i ) {
274
275     my $dup_lock_table = DBIx::DBSchema::Table->new( {
276       'name'          => 'duplicate_lock',
277       'primary_key'   => 'duplocknum',
278       'local_options' => $local_options,
279       'columns'       => [
280         DBIx::DBSchema::Column->new( {
281           'name'    => 'duplocknum',
282           'type'    => 'serial',
283           'null'    => 'NOT NULL',
284           'length'  => '',
285           'default' => '',
286           'local'   => '',
287         } ),
288         DBIx::DBSchema::Column->new( {
289           'name'    => 'lockname',
290           'type'    => 'varchar',
291           'null'    => 'NOT NULL',
292           'length'  => '80',
293           'default' => '',
294           'local'   => '',
295         } ),
296       ],
297       'indices' => { 'duplicate_lock1' =>
298                        DBIx::DBSchema::Index->new({
299                          'name'    => 'duplicate_lock1',
300                          'unique'  => 1,
301                          'columns' => [ 'lockname' ],
302                        })
303                    },
304     } );
305
306     $dbdef->addtable($dup_lock_table);
307
308   }
309
310   $dbdef;
311
312 }
313
314 sub tables_hashref {
315
316   my $char_d = 80; #default maxlength for text fields
317
318   #my(@date_type)  = ( 'timestamp', '', ''     );
319   my @date_type  = ( 'int', 'NULL', ''     );
320   my @perl_type = ( 'text', 'NULL', ''  ); 
321   my @money_type = ( 'decimal',   '', '10,2' );
322   my @money_typen = ( 'decimal',   'NULL', '10,2' );
323
324   my $username_len = 32; #usernamemax config file
325
326     # name type nullability length default local
327
328   return {
329
330     'agent' => {
331       'columns' => [
332         'agentnum',          'serial',    '',       '', '', '', 
333         'agent',            'varchar',    '',  $char_d, '', '', 
334         'typenum',              'int',    '',       '', '', '', 
335         'disabled',            'char', 'NULL',       1, '', '', 
336         'ticketing_queueid',    'int', 'NULL',      '', '', '', 
337         'invoice_template', 'varchar', 'NULL', $char_d, '', '',
338         'username',         'varchar', 'NULL', $char_d, '', '', #deprecated
339         '_password',        'varchar', 'NULL', $char_d, '', '', #deprecated
340         'freq',              'int', 'NULL', '', '', '', #deprecated (never used)
341         'prog',                     @perl_type, '', '', #deprecated (never used)
342
343       ],
344       'primary_key' => 'agentnum',
345       'unique' => [],
346       'index' => [ ['typenum'], ['disabled'] ],
347     },
348
349     'agent_type' => {
350       'columns' => [
351         'typenum',   'serial',  '', '', '', '', 
352         'atype',     'varchar', '', $char_d, '', '', 
353       ],
354       'primary_key' => 'typenum',
355       'unique' => [],
356       'index' => [],
357     },
358
359     'type_pkgs' => {
360       'columns' => [
361         'typepkgnum', 'serial', '', '', '', '', 
362         'typenum',   'int',  '', '', '', '', 
363         'pkgpart',   'int',  '', '', '', '', 
364       ],
365       'primary_key' => 'typepkgnum',
366       'unique' => [ ['typenum', 'pkgpart'] ],
367       'index' => [ ['typenum'] ],
368     },
369
370     'cust_bill' => {
371       'columns' => [
372         'invnum',    'serial',  '', '', '', '', 
373         'custnum',   'int',  '', '', '', '', 
374         '_date',     @date_type, '', '', 
375         'charged',   @money_type, '', '', 
376         'printed',   'int',  '', '', '', '', 
377         'closed',    'char', 'NULL', 1, '', '', 
378       ],
379       'primary_key' => 'invnum',
380       'unique' => [],
381       'index' => [ ['custnum'], ['_date'] ],
382     },
383
384     'cust_bill_event' => {
385       'columns' => [
386         'eventnum',    'serial',  '', '', '', '', 
387         'invnum',   'int',  '', '', '', '', 
388         'eventpart',   'int',  '', '', '', '', 
389         '_date',     @date_type, '', '', 
390         'status', 'varchar', '', $char_d, '', '', 
391         'statustext', 'text', 'NULL', '', '', '', 
392       ],
393       'primary_key' => 'eventnum',
394       #no... there are retries now #'unique' => [ [ 'eventpart', 'invnum' ] ],
395       'unique' => [],
396       'index' => [ ['invnum'], ['status'] ],
397     },
398
399     'part_bill_event' => {
400       'columns' => [
401         'eventpart',    'serial',  '', '', '', '', 
402         'freq',        'varchar',       'NULL',     $char_d, '', '', 
403         'payby',       'char',  '', 4, '', '', 
404         'event',       'varchar',           '',     $char_d, '', '', 
405         'eventcode',    @perl_type, '', '', 
406         'seconds',     'int', 'NULL', '', '', '', 
407         'weight',      'int', '', '', '', '', 
408         'plan',       'varchar', 'NULL', $char_d, '', '', 
409         'plandata',   'text', 'NULL', '', '', '', 
410         'reason',     'int', 'NULL', '', '', '', 
411         'disabled',     'char', 'NULL', 1, '', '', 
412       ],
413       'primary_key' => 'eventpart',
414       'unique' => [],
415       'index' => [ ['payby'], ['disabled'], ],
416     },
417
418     'part_event' => {
419       'columns' => [
420         'eventpart',   'serial',      '',      '', '', '', 
421         'agentnum',    'int',     'NULL',      '', '', '', 
422         'event',       'varchar',     '', $char_d, '', '', 
423         'eventtable',  'varchar',     '', $char_d, '', '',
424         'check_freq',  'varchar', 'NULL', $char_d, '', '', 
425         'weight',      'int',         '',      '', '', '', 
426         'action',      'varchar',     '', $char_d, '', '',
427         'disabled',     'char',   'NULL',       1, '', '', 
428       ],
429       'primary_key' => 'eventpart',
430       'unique' => [],
431       'index' => [ ['agentnum'], ['eventtable'], ['check_freq'], ['disabled'], ],
432     },
433
434     'part_event_option' => {
435       'columns' => [
436         'optionnum', 'serial', '', '', '', '', 
437         'eventpart', 'int', '', '', '', '', 
438         'optionname', 'varchar', '', $char_d, '', '', 
439         'optionvalue', 'text', 'NULL', '', '', '', 
440       ],
441       'primary_key' => 'optionnum',
442       'unique'      => [],
443       'index'       => [ [ 'eventpart' ], [ 'optionname' ] ],
444     },
445
446     'part_event_condition' => {
447       'columns' => [
448         'eventconditionnum', 'serial', '', '', '', '', 
449         'eventpart', 'int', '', '', '', '', 
450         'conditionname', 'varchar', '', $char_d, '', '', 
451       ],
452       'primary_key' => 'eventconditionnum',
453       'unique'      => [],
454       'index'       => [ [ 'eventpart' ], [ 'conditionname' ] ],
455     },
456
457     'part_event_condition_option' => {
458       'columns' => [
459         'optionnum', 'serial', '', '', '', '', 
460         'eventconditionnum', 'int', '', '', '', '', 
461         'optionname', 'varchar', '', $char_d, '', '', 
462         'optionvalue', 'text', 'NULL', '', '', '', 
463       ],
464       'primary_key' => 'optionnum',
465       'unique'      => [],
466       'index'       => [ [ 'eventconditionnum' ], [ 'optionname' ] ],
467     },
468
469     'part_event_condition_option_option' => {
470       'columns' => [
471         'optionoptionnum', 'serial', '', '', '', '', 
472         'optionnum', 'int', '', '', '', '', 
473         'optionname', 'varchar', '', $char_d, '', '', 
474         'optionvalue', 'text', 'NULL', '', '', '', 
475       ],
476       'primary_key' => 'optionoptionnum',
477       'unique'      => [],
478       'index'       => [ [ 'optionnum' ], [ 'optionname' ] ],
479     },
480
481     'cust_event' => {
482       'columns' => [
483         'eventnum',    'serial',  '', '', '', '', 
484         'eventpart',   'int',  '', '', '', '', 
485         'tablenum',   'int',  '', '', '', '', 
486         '_date',     @date_type, '', '', 
487         'status', 'varchar', '', $char_d, '', '', 
488         'statustext', 'text', 'NULL', '', '', '', 
489       ],
490       'primary_key' => 'eventnum',
491       #no... there are retries now #'unique' => [ [ 'eventpart', 'invnum' ] ],
492       'unique' => [],
493       'index' => [ ['eventpart'], ['tablenum'], ['status'] ],
494     },
495
496     'cust_bill_pkg' => {
497       'columns' => [
498         'billpkgnum', 'serial', '', '', '', '', 
499         'pkgnum',  'int', '', '', '', '', 
500         'pkgpart_override',  'int', 'NULL', '', '', '', 
501         'invnum',  'int', '', '', '', '', 
502         'setup',   @money_type, '', '', 
503         'recur',   @money_type, '', '', 
504         'sdate',   @date_type, '', '', 
505         'edate',   @date_type, '', '', 
506         'itemdesc', 'varchar', 'NULL', $char_d, '', '', 
507         'section',  'varchar', 'NULL', $char_d, '', '', 
508         'quantity',  'int', 'NULL', '', '', '',
509         'unitsetup', @money_typen, '', '', 
510         'unitrecur', @money_typen, '', '', 
511       ],
512       'primary_key' => 'billpkgnum',
513       'unique' => [],
514       'index' => [ ['invnum'], [ 'pkgnum' ] ],
515     },
516
517     'cust_bill_pkg_detail' => {
518       'columns' => [
519         'detailnum', 'serial', '', '', '', '', 
520         'billpkgnum', 'int', 'NULL', '', '', '',        # should not be nullable
521         'pkgnum',  'int', 'NULL', '', '', '',           # deprecated
522         'invnum',  'int', 'NULL', '', '', '',           # deprecated
523         'amount',  @money_typen, '', '', 
524         'format',  'char', 'NULL', 1, '', '',
525         'classnum', 'char', 'NULL', 1, '', '',
526         'detail',  'varchar', '', $char_d, '', '', 
527       ],
528       'primary_key' => 'detailnum',
529       'unique' => [],
530       'index' => [ [ 'billpkgnum' ], [ 'classnum' ], [ 'pkgnum', 'invnum' ] ],
531     },
532
533     'cust_bill_pkg_display' => {
534       'columns' => [
535         'billpkgdisplaynum', 'serial', '', '', '', '', 
536         'billpkgnum', 'int', '', '', '', '', 
537         'section',  'varchar', 'NULL', $char_d, '', '', 
538         #'unitsetup', @money_typen, '', '',     #override the linked real one?
539         #'unitrecur', @money_typen, '', '',     #this too?
540         'post_total', 'char', 'NULL', 1, '', '',
541         'type',       'char', 'NULL', 1, '', '',
542         'summary',    'char', 'NULL', 1, '', '',
543       ],
544       'primary_key' => 'billpkgdisplaynum',
545       'unique' => [],
546       'index' => [ ['billpkgnum'], ],
547     },
548
549     'cust_credit' => {
550       'columns' => [
551         'crednum',  'serial', '', '', '', '', 
552         'custnum',  'int', '', '', '', '', 
553         '_date',    @date_type, '', '', 
554         'amount',   @money_type, '', '', 
555         'otaker',   'varchar', '', 32, '', '', 
556         'reason',   'text', 'NULL', '', '', '', 
557         'reasonnum', 'int', 'NULL', '', '', '', 
558         'closed',    'char', 'NULL', 1, '', '', 
559       ],
560       'primary_key' => 'crednum',
561       'unique' => [],
562       'index' => [ ['custnum'], ['_date'] ],
563     },
564
565     'cust_credit_bill' => {
566       'columns' => [
567         'creditbillnum', 'serial', '', '', '', '', 
568         'crednum',  'int', '', '', '', '', 
569         'invnum',  'int', '', '', '', '', 
570         '_date',    @date_type, '', '', 
571         'amount',   @money_type, '', '', 
572       ],
573       'primary_key' => 'creditbillnum',
574       'unique' => [],
575       'index' => [ ['crednum'], ['invnum'] ],
576     },
577
578     'cust_credit_bill_pkg' => {
579       'columns' => [
580         'creditbillpkgnum', 'serial', '',      '', '', '',
581         'creditbillnum',       'int', '',      '', '', '',
582         'billpkgnum',          'int', '',      '', '', '',
583         'amount',            @money_type,          '', '',
584         'setuprecur',      'varchar', '', $char_d, '', '',
585         'sdate',   @date_type, '', '', 
586         'edate',   @date_type, '', '', 
587       ],
588       'primary_key' => 'creditbillpkgnum',
589       'unique'      => [],
590       'index'       => [ [ 'creditbillnum' ], [ 'billpkgnum' ], ],
591     },
592
593     'cust_main' => {
594       'columns' => [
595         'custnum',  'serial',  '',     '', '', '', 
596         'agentnum', 'int',  '',     '', '', '', 
597         'agent_custid', 'varchar', 'NULL', $char_d, '', '',
598         'custbatch', 'varchar', 'NULL', $char_d, '', '',
599 #        'titlenum', 'int',  'NULL',   '', '', '', 
600         'last',     'varchar', '',     $char_d, '', '', 
601 #        'middle',   'varchar', 'NULL', $char_d, '', '', 
602         'first',    'varchar', '',     $char_d, '', '', 
603         'ss',       'varchar', 'NULL', 11, '', '', 
604         'stateid', 'varchar', 'NULL', $char_d, '', '', 
605         'stateid_state', 'varchar', 'NULL', $char_d, '', '', 
606         'birthdate' ,@date_type, '', '', 
607         'signupdate',@date_type, '', '', 
608         'company',  'varchar', 'NULL', $char_d, '', '', 
609         'address1', 'varchar', '',     $char_d, '', '', 
610         'address2', 'varchar', 'NULL', $char_d, '', '', 
611         'city',     'varchar', '',     $char_d, '', '', 
612         'county',   'varchar', 'NULL', $char_d, '', '', 
613         'state',    'varchar', 'NULL', $char_d, '', '', 
614         'zip',      'varchar', 'NULL', 10, '', '', 
615         'country',  'char', '',     2, '', '', 
616         'daytime',  'varchar', 'NULL', 20, '', '', 
617         'night',    'varchar', 'NULL', 20, '', '', 
618         'fax',      'varchar', 'NULL', 12, '', '', 
619         'ship_last',     'varchar', 'NULL', $char_d, '', '', 
620 #        'ship_middle',   'varchar', 'NULL', $char_d, '', '', 
621         'ship_first',    'varchar', 'NULL', $char_d, '', '', 
622         'ship_company',  'varchar', 'NULL', $char_d, '', '', 
623         'ship_address1', 'varchar', 'NULL', $char_d, '', '', 
624         'ship_address2', 'varchar', 'NULL', $char_d, '', '', 
625         'ship_city',     'varchar', 'NULL', $char_d, '', '', 
626         'ship_county',   'varchar', 'NULL', $char_d, '', '', 
627         'ship_state',    'varchar', 'NULL', $char_d, '', '', 
628         'ship_zip',      'varchar', 'NULL', 10, '', '', 
629         'ship_country',  'char', 'NULL', 2, '', '', 
630         'ship_daytime',  'varchar', 'NULL', 20, '', '', 
631         'ship_night',    'varchar', 'NULL', 20, '', '', 
632         'ship_fax',      'varchar', 'NULL', 12, '', '', 
633         'payby',    'char', '',     4, '', '', 
634         'payinfo',  'varchar', 'NULL', 512, '', '', 
635         'paycvv',   'varchar', 'NULL', 512, '', '', 
636         'paymask', 'varchar', 'NULL', $char_d, '', '', 
637         #'paydate',  @date_type, '', '', 
638         'paydate',  'varchar', 'NULL', 10, '', '', 
639         'paystart_month', 'int', 'NULL', '', '', '', 
640         'paystart_year',  'int', 'NULL', '', '', '', 
641         'payissue', 'varchar', 'NULL', 2, '', '', 
642         'payname',  'varchar', 'NULL', $char_d, '', '', 
643         'paystate', 'varchar', 'NULL', $char_d, '', '', 
644         'paytype',  'varchar', 'NULL', $char_d, '', '', 
645         'payip',    'varchar', 'NULL', 15, '', '', 
646         'tax',      'char', 'NULL', 1, '', '', 
647         'otaker',   'varchar', '',    32, '', '', 
648         'refnum',   'int',  '',     '', '', '', 
649         'referral_custnum', 'int',  'NULL', '', '', '', 
650         'comments', 'text', 'NULL', '', '', '', 
651         'spool_cdr','char', 'NULL', 1, '', '', 
652         'squelch_cdr','char', 'NULL', 1, '', '', 
653         'invoice_terms', 'varchar', 'NULL', $char_d, '', '',
654       ],
655       'primary_key' => 'custnum',
656       'unique' => [ [ 'agentnum', 'agent_custid' ] ],
657       #'index' => [ ['last'], ['company'] ],
658       'index' => [ ['last'], [ 'company' ], [ 'referral_custnum' ],
659                    [ 'daytime' ], [ 'night' ], [ 'fax' ], [ 'refnum' ],
660                    [ 'county' ], [ 'state' ], [ 'country' ], [ 'zip' ],
661                    [ 'ship_last' ], [ 'ship_company' ],
662                    [ 'ship_daytime' ], [ 'ship_night' ], [ 'ship_fax' ],
663                    [ 'payby' ], [ 'paydate' ],
664                    [ 'agentnum' ], [ 'custbatch' ],
665                  ],
666     },
667
668     'cust_main_invoice' => {
669       'columns' => [
670         'destnum',  'serial',  '',     '', '', '', 
671         'custnum',  'int',  '',     '', '', '', 
672         'dest',     'varchar', '',  $char_d, '', '', 
673       ],
674       'primary_key' => 'destnum',
675       'unique' => [],
676       'index' => [ ['custnum'], ],
677     },
678
679     'cust_main_note' => {
680       'columns' => [
681         'notenum',  'serial',  '',     '', '', '', 
682         'custnum',  'int',  '',     '', '', '', 
683         '_date',    @date_type, '', '', 
684         'otaker',   'varchar', '',    32, '', '', 
685         'comments', 'text', 'NULL', '', '', '', 
686       ],
687       'primary_key' => 'notenum',
688       'unique' => [],
689       'index' => [ [ 'custnum' ], [ '_date' ], ],
690     },
691
692     'cust_main_county' => { #county+state+country are checked off the
693                             #cust_main_county for validation and to provide
694                             # a tax rate.
695       'columns' => [
696         'taxnum',   'serial',   '',    '', '', '', 
697         'state',    'varchar',  'NULL',    $char_d, '', '', 
698         'county',   'varchar',  'NULL',    $char_d, '', '', 
699         'country',  'char',  '', 2, '', '', 
700         'taxclass',   'varchar', 'NULL', $char_d, '', '', 
701         'exempt_amount', @money_type, '', '', 
702         'tax',      'real',  '',    '', '', '', #tax %
703         'taxname',  'varchar',  'NULL',    $char_d, '', '', 
704         'setuptax',  'char', 'NULL', 1, '', '', # Y = setup tax exempt
705         'recurtax',  'char', 'NULL', 1, '', '', # Y = recur tax exempt
706       ],
707       'primary_key' => 'taxnum',
708       'unique' => [],
709   #    'unique' => [ ['taxnum'], ['state', 'county'] ],
710       'index' => [ [ 'county' ], [ 'state' ], [ 'country' ] ],
711     },
712
713     'tax_rate'    => {
714       'columns' => [
715         'taxnum',       'serial',     '',      '', '', '', 
716         'geocode',     'varchar', 'NULL', $char_d, '', '',#cch provides 10 char
717         'data_vendor', 'varchar', 'NULL', $char_d, '', '',#auto update source
718         'location',    'varchar', 'NULL', $char_d, '', '',#provided by tax authority
719         'taxclassnum', 'int',      '',      '', '', '', 
720         'effective_date', @date_type, '', '', 
721         'tax',        'real',  '',    '', '', '',        # tax %
722         'excessrate', 'real',  'NULL','', '', '',        # second tax %
723         'taxbase',    @money_typen, '', '',              # amount at first tax rate
724         'taxmax',     @money_typen, '', '',              # maximum about at both rates
725         'usetax',        'real',  'NULL',    '', '', '', # tax % when non-local
726         'useexcessrate', 'real',  'NULL',    '', '', '', # second tax % when non-local
727         'unittype',    'int',  'NULL', '', '', '',      # for fee
728         'fee',         'real', 'NULL', '', '', '',      # amount tax per unit
729         'excessfee',   'real', 'NULL', '', '', '',      # second amount tax per unit
730         'feebase',     'real', 'NULL', '', '', '',      # units taxed at first rate
731         'feemax',      'real', 'NULL', '', '', '',      # maximum number of unit taxed
732         'maxtype',     'int',  'NULL', '', '', '',      # indicator of how thresholds accumulate
733         'taxname', 'varchar',  'NULL', $char_d, '', '', # may appear on invoice
734         'taxauth',     'int',  'NULL', '', '', '',      # tax authority
735         'basetype',    'int',  'NULL', '', '', '', # indicator of basis for tax
736         'passtype',    'int',  'NULL', '', '', '', # indicator declaring how item should be shown
737         'passflag',    'char', 'NULL', 1, '', '',  # Y = required to list as line item, N = Prohibited
738         'setuptax',    'char', 'NULL', 1, '', '',  # Y = setup tax exempt
739         'recurtax',    'char', 'NULL', 1, '', '',  # Y = recur tax exempt
740         'manual',      'char', 'NULL', 1, '', '',  # Y = manually edited
741         'disabled',    'char', 'NULL', 1, '', '',  # Y = tax disabled
742       ],
743       'primary_key' => 'taxnum',
744       'unique' => [],
745       'index' => [ ['taxclassnum'], ['data_vendor', 'geocode'] ],
746     },
747
748     'cust_tax_location' => { 
749       'columns' => [
750         'custlocationnum', 'serial',  '',     '', '', '', 
751         'data_vendor',     'varchar', 'NULL', $char_d, '', '', # update source
752         'zip',             'char',    '',     5,  '', '', 
753         'state',           'char',    '',     2,  '', '', 
754         'plus4hi',         'char',    '',     4,  '', '', 
755         'plus4lo',         'char',    '',     4,  '', '', 
756         'default_location','char',    'NULL', 1,  '', '', # Y = default for zip
757         'geocode',         'varchar', '',    20,  '', '', 
758       ],
759       'primary_key' => 'custlocationnum',
760       'unique' => [],
761       'index' => [ [ 'zip', 'plus4lo', 'plus4hi' ] ],
762     },
763
764     'tax_class' => { 
765       'columns' => [
766         'taxclassnum',  'serial',  '',            '', '', '',
767         'data_vendor',  'varchar', 'NULL',   $char_d, '', '',
768         'taxclass',     'varchar', '',       $char_d, '', '',          
769         'description',  'varchar', '',     2*$char_d, '', '',          
770       ],
771       'primary_key' => 'taxclassnum',
772       'unique' => [ [ 'data_vendor', 'taxclass' ] ],
773       'index' => [],
774     },
775
776     'cust_pay_pending' => {
777       'columns' => [
778         'paypendingnum','serial',      '',  '', '', '',
779         'custnum',      'int',         '',  '', '', '', 
780         'paid',         @money_type,            '', '', 
781         '_date',        @date_type,             '', '', 
782         'payby',        'char',        '',   4, '', '', #CARD/BILL/COMP, should
783                                                         # be index into payby
784                                                         # table eventually
785         'payinfo',      'varchar', 'NULL', 512, '', '', #see cust_main above
786         'paymask',      'varchar', 'NULL', $char_d, '', '', 
787         'paydate',      'varchar', 'NULL', 10, '', '', 
788         #'paybatch',     'varchar', 'NULL', $char_d, '', '', #for auditing purposes.
789         'payunique',    'varchar', 'NULL', $char_d, '', '', #separate paybatch "unique" functions from current usage
790
791         'status',       'varchar',     '', $char_d, '', '', 
792         'statustext',   'text',    'NULL',  '', '', '', 
793         'gatewaynum',   'int',     'NULL',  '', '', '',
794         #'cust_balance', @money_type,            '', '',
795         'paynum',       'int',     'NULL',  '', '', '',
796       ],
797       'primary_key' => 'paypendingnum',
798       'unique'      => [ [ 'payunique' ] ],
799       'index'       => [ [ 'custnum' ], [ 'status' ], ],
800     },
801
802     'cust_pay' => {
803       'columns' => [
804         'paynum',   'serial',    '',   '', '', '',
805         'custnum',  'int',    '',   '', '', '', 
806         '_date',    @date_type, '', '', 
807         'paid',     @money_type, '', '', 
808         'otaker',   'varchar', 'NULL', 32, '', '',  #NULL for the upgrade so we can create & populate the field
809         'payby',    'char',   '',     4, '', '', # CARD/BILL/COMP, should be
810                                                  # index into payby table
811                                                  # eventually
812         'payinfo',  'varchar',   'NULL', 512, '', '', #see cust_main above
813         'paymask', 'varchar', 'NULL', $char_d, '', '', 
814         'paydate',  'varchar', 'NULL', 10, '', '', 
815         'paybatch', 'varchar',   'NULL', $char_d, '', '', #for auditing purposes.
816         'payunique', 'varchar', 'NULL', $char_d, '', '', #separate paybatch "unique" functions from current usage
817         'closed',    'char', 'NULL', 1, '', '', 
818       ],
819       'primary_key' => 'paynum',
820       #i guess not now, with cust_pay_pending, if we actually make it here, we _do_ want to record it# 'unique' => [ [ 'payunique' ] ],
821       'index' => [ [ 'custnum' ], [ 'paybatch' ], [ 'payby' ], [ '_date' ] ],
822     },
823
824     'cust_pay_void' => {
825       'columns' => [
826         'paynum',    'int',    '',   '', '', '', 
827         'custnum',   'int',    '',   '', '', '', 
828         'paid',      @money_type, '', '', 
829         '_date',     @date_type, '', '', 
830         'payby',     'char',   '',     4, '', '', # CARD/BILL/COMP, should be
831                                                   # index into payby table
832                                                   # eventually
833         'payinfo',   'varchar',   'NULL', 512, '', '', #see cust_main above
834         'paymask', 'varchar', 'NULL', $char_d, '', '', 
835         'paybatch',  'varchar',   'NULL', $char_d, '', '', #for auditing purposes.
836         'closed',    'char', 'NULL', 1, '', '', 
837         'void_date', @date_type, '', '', 
838         'reason',    'varchar',   'NULL', $char_d, '', '', 
839         'otaker',   'varchar', '', 32, '', '', 
840       ],
841       'primary_key' => 'paynum',
842       'unique' => [],
843       'index' => [ [ 'custnum' ] ],
844     },
845
846     'cust_bill_pay' => {
847       'columns' => [
848         'billpaynum', 'serial',     '',   '', '', '', 
849         'invnum',  'int',     '',   '', '', '', 
850         'paynum',  'int',     '',   '', '', '', 
851         'amount',  @money_type, '', '', 
852         '_date',   @date_type, '', '', 
853       ],
854       'primary_key' => 'billpaynum',
855       'unique' => [],
856       'index' => [ [ 'paynum' ], [ 'invnum' ] ],
857     },
858
859     'cust_bill_pay_batch' => {
860       'columns' => [
861         'billpaynum', 'serial',     '',   '', '', '', 
862         'invnum',  'int',     '',   '', '', '', 
863         'paybatchnum',  'int',     '',   '', '', '', 
864         'amount',  @money_type, '', '', 
865         '_date',   @date_type, '', '', 
866       ],
867       'primary_key' => 'billpaynum',
868       'unique' => [],
869       'index' => [ [ 'paybatchnum' ], [ 'invnum' ] ],
870     },
871
872     'cust_bill_pay_pkg' => {
873       'columns' => [
874         'billpaypkgnum', 'serial', '', '', '', '',
875         'billpaynum',       'int', '', '', '', '',
876         'billpkgnum',       'int', '', '', '', '',
877         'amount',         @money_type,     '', '',
878         'setuprecur',      'varchar', '', $char_d, '', '',
879         'sdate',   @date_type, '', '', 
880         'edate',   @date_type, '', '', 
881       ],
882       'primary_key' => 'billpaypkgnum',
883       'unique'      => [],
884       'index'       => [ [ 'billpaynum' ], [ 'billpkgnum' ], ],
885     },
886
887     'pay_batch' => { #batches of payments to an external processor
888       'columns' => [
889         'batchnum',   'serial',    '',   '', '', '', 
890         'payby',      'char',      '',    4, '', '', # CARD/CHEK
891         'status',     'char', 'NULL',     1, '', '', 
892         'download',   @date_type, '', '', 
893         'upload',     @date_type, '', '', 
894       ],
895       'primary_key' => 'batchnum',
896       'unique' => [],
897       'index' => [],
898     },
899
900     'cust_pay_batch' => { #what's this used for again?  list of customers
901                           #in current CARD batch? (necessarily CARD?)
902       'columns' => [
903         'paybatchnum',   'serial',    '',   '', '', '', 
904         'batchnum',   'int',    '',   '', '', '', 
905         'invnum',   'int',    '',   '', '', '', 
906         'custnum',   'int',    '',   '', '', '', 
907         'last',     'varchar', '',     $char_d, '', '', 
908         'first',    'varchar', '',     $char_d, '', '', 
909         'address1', 'varchar', '',     $char_d, '', '', 
910         'address2', 'varchar', 'NULL', $char_d, '', '', 
911         'city',     'varchar', '',     $char_d, '', '', 
912         'state',    'varchar', 'NULL', $char_d, '', '', 
913         'zip',      'varchar', 'NULL', 10, '', '', 
914         'country',  'char', '',     2, '', '', 
915         #        'trancode', 'int', '', '', '', ''
916         'payby',    'char',   '',     4, '', '', # CARD/BILL/COMP, should be
917         'payinfo',  'varchar', '',     512, '', '', 
918         #'exp',      @date_type, '', ''
919         'exp',      'varchar', 'NULL',     11, '', '', 
920         'payname',  'varchar', 'NULL', $char_d, '', '', 
921         'amount',   @money_type, '', '', 
922         'status',   'varchar', 'NULL',     $char_d, '', '', 
923       ],
924       'primary_key' => 'paybatchnum',
925       'unique' => [],
926       'index' => [ ['batchnum'], ['invnum'], ['custnum'] ],
927     },
928
929     'cust_pkg' => {
930       'columns' => [
931         'pkgnum',         'serial',    '',   '', '', '', 
932         'custnum',        'int',    '',   '', '', '', 
933         'pkgpart',        'int',    '',   '', '', '', 
934         'otaker',         'varchar', '', 32, '', '', 
935         'setup',          @date_type, '', '', 
936         'bill',           @date_type, '', '', 
937         'last_bill',      @date_type, '', '', 
938         'susp',           @date_type, '', '', 
939         'adjourn',        @date_type, '', '', 
940         'cancel',         @date_type, '', '', 
941         'expire',         @date_type, '', '', 
942         'change_date',    @date_type, '', '',
943         'change_pkgnum',  'int', 'NULL', '', '', '',
944         'change_pkgpart', 'int', 'NULL', '', '', '',
945         'manual_flag',    'char', 'NULL', 1, '', '', 
946         'quantity',       'int', 'NULL', '', '', '',
947       ],
948       'primary_key' => 'pkgnum',
949       'unique' => [],
950       'index' => [ ['custnum'], ['pkgpart'],
951                    ['setup'], ['last_bill'], ['bill'], ['susp'], ['adjourn'],
952                    ['expire'], ['cancel'],
953                    ['change_date'],
954                  ],
955     },
956
957     'cust_pkg_option' => {
958       'columns' => [
959         'optionnum', 'serial', '', '', '', '', 
960         'pkgnum', 'int', '', '', '', '', 
961         'optionname', 'varchar', '', $char_d, '', '', 
962         'optionvalue', 'text', 'NULL', '', '', '', 
963       ],
964       'primary_key' => 'optionnum',
965       'unique'      => [],
966       'index'       => [ [ 'pkgnum' ], [ 'optionname' ] ],
967     },
968
969     'cust_pkg_detail' => {
970       'columns' => [
971         'pkgdetailnum', 'serial', '',      '', '', '',
972         'pkgnum',          'int', '',      '', '', '',
973         'detail',      'varchar', '', $char_d, '', '', 
974         'detailtype',     'char', '',       1, '', '', # "I"nvoice or "C"omment
975         'weight',          'int', '',      '', '', '',
976       ],
977       'primary_key' => 'pkgdetailnum',
978       'unique' => [],
979       'index'  => [ [ 'pkgnum', 'detailtype' ] ],
980     },
981
982     'cust_pkg_reason' => {
983       'columns' => [
984         'num',      'serial',    '',   '', '', '', 
985         'pkgnum',   'int',    '',   '', '', '', 
986         'reasonnum','int',    '',   '', '', '', 
987         'action',   'char', 'NULL', 1, '', '',     #should not be nullable
988         'otaker',   'varchar', '', 32, '', '', 
989         'date',     @date_type, '', '', 
990       ],
991       'primary_key' => 'num',
992       'unique' => [],
993       'index' => [ [ 'pkgnum' ], [ 'reasonnum' ], ['action'], ],
994     },
995
996     'cust_refund' => {
997       'columns' => [
998         'refundnum',    'serial',    '',   '', '', '', 
999         'custnum',  'int',    '',   '', '', '', 
1000         '_date',        @date_type, '', '', 
1001         'refund',       @money_type, '', '', 
1002         'otaker',       'varchar',   '',   32, '', '', 
1003         'reason',       'varchar',   '',   $char_d, '', '', 
1004         'payby',        'char',   '',     4, '', '', # CARD/BILL/COMP, should
1005                                                      # be index into payby
1006                                                      # table eventually
1007         'payinfo',      'varchar',   'NULL', 512, '', '', #see cust_main above
1008         'paymask', 'varchar', 'NULL', $char_d, '', '', 
1009         'paybatch',     'varchar',   'NULL', $char_d, '', '', 
1010         'closed',    'char', 'NULL', 1, '', '', 
1011       ],
1012       'primary_key' => 'refundnum',
1013       'unique' => [],
1014       'index' => [ ['custnum'], ['_date'] ],
1015     },
1016
1017     'cust_credit_refund' => {
1018       'columns' => [
1019         'creditrefundnum', 'serial',     '',   '', '', '', 
1020         'crednum',  'int',     '',   '', '', '', 
1021         'refundnum',  'int',     '',   '', '', '', 
1022         'amount',  @money_type, '', '', 
1023         '_date',   @date_type, '', '', 
1024       ],
1025       'primary_key' => 'creditrefundnum',
1026       'unique' => [],
1027       'index' => [ ['crednum'], ['refundnum'] ],
1028     },
1029
1030
1031     'cust_svc' => {
1032       'columns' => [
1033         'svcnum',    'serial',    '',   '', '', '', 
1034         'pkgnum',    'int',    'NULL',   '', '', '', 
1035         'svcpart',   'int',    '',   '', '', '', 
1036         'overlimit', @date_type, '', '', 
1037       ],
1038       'primary_key' => 'svcnum',
1039       'unique' => [],
1040       'index' => [ ['svcnum'], ['pkgnum'], ['svcpart'] ],
1041     },
1042
1043     'cust_svc_option' => {
1044       'columns' => [
1045         'optionnum',   'serial', '', '', '', '', 
1046         'svcnum',      'int', '', '', '', '', 
1047         'optionname',  'varchar', '', $char_d, '', '', 
1048         'optionvalue', 'text', 'NULL', '', '', '', 
1049       ],
1050       'primary_key' => 'optionnum',
1051       'unique'      => [],
1052       'index'       => [ [ 'svcnum' ], [ 'optionname' ] ],
1053     },
1054
1055     'part_pkg' => {
1056       'columns' => [
1057         'pkgpart',       'serial',    '',   '', '', '', 
1058         'pkg',           'varchar',   '',   $char_d, '', '', 
1059         'comment',       'varchar',   '',   $char_d, '', '', 
1060         'promo_code',    'varchar', 'NULL', $char_d, '', '', 
1061         'setup',         @perl_type, '', '', 
1062         'freq',          'varchar',   '',   $char_d, '', '', #billing frequency
1063         'recur',         @perl_type, '', '', 
1064         'setuptax',      'char', 'NULL', 1, '', '', 
1065         'recurtax',      'char', 'NULL', 1, '', '', 
1066         'plan',          'varchar', 'NULL', $char_d, '', '', 
1067         'plandata',      'text', 'NULL', '', '', '', 
1068         'disabled',      'char', 'NULL', 1, '', '', 
1069         'taxclass',      'varchar', 'NULL', $char_d, '', '', 
1070         'classnum',      'int',     'NULL', '', '', '', 
1071         'taxproductnum', 'int',     'NULL', '', '', '', 
1072         'pay_weight',    'real',    'NULL', '', '', '',
1073         'credit_weight', 'real',    'NULL', '', '', '',
1074         'agentnum',      'int',     'NULL', '', '', '', 
1075
1076       ],
1077       'primary_key' => 'pkgpart',
1078       'unique' => [],
1079       'index' => [ [ 'promo_code' ], [ 'disabled' ], [ 'agentnum' ], ],
1080     },
1081
1082     'part_pkg_link' => {
1083       'columns' => [
1084         'pkglinknum',  'serial',  '',      '', '', '',
1085         'src_pkgpart', 'int',     '',      '', '', '',
1086         'dst_pkgpart', 'int',     '',      '', '', '', 
1087         'link_type',   'varchar', '', $char_d, '', '',
1088       ],
1089       'primary_key' => 'pkglinknum',
1090       'unique' => [ [ 'src_pkgpart', 'dst_pkgpart', 'link_type' ] ],
1091       'index'  => [ [ 'src_pkgpart' ] ],
1092     },
1093
1094     'part_pkg_taxclass' => {
1095       'columns' => [
1096         'taxclassnum',  'serial', '',       '', '', '',
1097         'taxclass',     'varchar', '', $char_d, '', '', 
1098       ],
1099       'primary_key' => 'taxclassnum',
1100       'unique'      => [ [ 'taxclass' ] ],
1101       'index'       => [],
1102     },
1103
1104     'part_pkg_taxproduct' => {
1105       'columns' => [
1106         'taxproductnum', 'serial',      '',        '', '', '',
1107         'data_vendor',   'varchar', 'NULL',   $char_d, '', '', 
1108         'taxproduct',    'varchar',     '',   $char_d, '', '', 
1109         'description',   'varchar',     '', 2*$char_d, '', '', 
1110       ],
1111       'primary_key' => 'taxproductnum',
1112       'unique'      => [ [ 'data_vendor', 'taxproduct' ] ],
1113       'index'       => [],
1114     },
1115
1116     'part_pkg_taxrate' => { 
1117       'columns' => [
1118         'pkgtaxratenum', 'serial',  '',     '',      '', '',
1119         'data_vendor',   'varchar', 'NULL', $char_d, '', '', # update source
1120         'geocode',       'varchar', 'NULL', $char_d, '', '', # cch provides 10
1121         'taxproductnum', 'int',  '',     '',       '', '',          
1122         'city',             'varchar', 'NULL', $char_d, '', '', # tax_location?
1123         'county',           'varchar', 'NULL', $char_d, '', '', 
1124         'state',            'varchar', 'NULL', $char_d, '', '', 
1125         'local',            'varchar', 'NULL', $char_d, '', '', 
1126         'country',          'char',    'NULL', 2,       '', '',
1127         'taxclassnumtaxed', 'int',     'NULL', '',      '', '', 
1128         'taxcattaxed',      'varchar', 'NULL', $char_d, '', '', 
1129         'taxclassnum',      'int',     'NULL', '',      '', '', 
1130         'effdate',          @date_type, '', '', 
1131         'taxable',          'char',    'NULL', 1,       '', '', 
1132       ],
1133       'primary_key' => 'pkgtaxratenum',
1134       'unique' => [],
1135       'index' => [ [ 'data_vendor', 'geocode', 'taxproductnum' ] ],
1136     },
1137
1138     'part_pkg_taxoverride' => { 
1139       'columns' => [
1140         'taxoverridenum', 'serial', '', '', '', '',
1141         'pkgpart',        'serial', '', '', '', '',
1142         'taxclassnum',    'serial', '', '', '', '',
1143         'usage_class',    'varchar', 'NULL', $char_d, '', '', 
1144       ],
1145       'primary_key' => 'taxoverridenum',
1146       'unique' => [],
1147       'index' => [ [ 'pkgpart' ], [ 'taxclassnum' ] ],
1148     },
1149
1150 #    'part_title' => {
1151 #      'columns' => [
1152 #        'titlenum',   'int',    '',   '',
1153 #        'title',      'varchar',   '',   $char_d,
1154 #      ],
1155 #      'primary_key' => 'titlenum',
1156 #      'unique' => [ [] ],
1157 #      'index' => [ [] ],
1158 #    },
1159
1160     'pkg_svc' => {
1161       'columns' => [
1162         'pkgsvcnum',  'serial', '',  '', '', '', 
1163         'pkgpart',    'int',    '',   '', '', '', 
1164         'svcpart',    'int',    '',   '', '', '', 
1165         'quantity',   'int',    '',   '', '', '', 
1166         'primary_svc','char', 'NULL',  1, '', '', 
1167       ],
1168       'primary_key' => 'pkgsvcnum',
1169       'unique' => [ ['pkgpart', 'svcpart'] ],
1170       'index' => [ ['pkgpart'] ],
1171     },
1172
1173     'part_referral' => {
1174       'columns' => [
1175         'refnum',   'serial',     '',        '', '', '', 
1176         'referral', 'varchar',    '',   $char_d, '', '', 
1177         'disabled', 'char',   'NULL',         1, '', '', 
1178         'agentnum', 'int',    'NULL',        '', '', '', 
1179       ],
1180       'primary_key' => 'refnum',
1181       'unique' => [],
1182       'index' => [ ['disabled'], ['agentnum'], ],
1183     },
1184
1185     'part_svc' => {
1186       'columns' => [
1187         'svcpart',    'serial',    '',   '', '', '', 
1188         'svc',        'varchar',   '',   $char_d, '', '', 
1189         'svcdb',      'varchar',   '',   $char_d, '', '', 
1190         'disabled',   'char',  'NULL',   1, '', '', 
1191       ],
1192       'primary_key' => 'svcpart',
1193       'unique' => [],
1194       'index' => [ [ 'disabled' ] ],
1195     },
1196
1197     'part_svc_column' => {
1198       'columns' => [
1199         'columnnum',   'serial',         '', '', '', '', 
1200         'svcpart',     'int',         '', '', '', '', 
1201         'columnname',  'varchar',     '', 64, '', '', 
1202         'columnvalue', 'varchar', 'NULL', $char_d, '', '', 
1203         'columnflag',  'char',    'NULL', 1, '', '', 
1204       ],
1205       'primary_key' => 'columnnum',
1206       'unique' => [ [ 'svcpart', 'columnname' ] ],
1207       'index' => [ [ 'svcpart' ] ],
1208     },
1209
1210     #(this should be renamed to part_pop)
1211     'svc_acct_pop' => {
1212       'columns' => [
1213         'popnum',    'serial',    '',   '', '', '', 
1214         'city',      'varchar',   '',   $char_d, '', '', 
1215         'state',     'varchar',   '',   $char_d, '', '', 
1216         'ac',        'char',   '',   3, '', '', 
1217         'exch',      'char',   '',   3, '', '', 
1218         'loc',       'char',   'NULL',   4, '', '', #NULL for legacy purposes
1219       ],
1220       'primary_key' => 'popnum',
1221       'unique' => [],
1222       'index' => [ [ 'state' ] ],
1223     },
1224
1225     'part_pop_local' => {
1226       'columns' => [
1227         'localnum',  'serial',     '',     '', '', '', 
1228         'popnum',    'int',     '',     '', '', '', 
1229         'city',      'varchar', 'NULL', $char_d, '', '', 
1230         'state',     'char',    'NULL', 2, '', '', 
1231         'npa',       'char',    '',     3, '', '', 
1232         'nxx',       'char',    '',     3, '', '', 
1233       ],
1234       'primary_key' => 'localnum',
1235       'unique' => [],
1236       'index' => [ [ 'npa', 'nxx' ], [ 'popnum' ] ],
1237     },
1238
1239     'svc_acct' => {
1240       'columns' => [
1241         'svcnum',    'int',    '',   '', '', '', 
1242         'username',  'varchar',   '',   $username_len, '', '',
1243         '_password', 'varchar',   '',  512, '', '',
1244         '_password_encoding', 'varchar', 'NULL', $char_d, '', '',
1245         'sec_phrase', 'varchar',  'NULL',   $char_d, '', '', 
1246         'popnum',    'int',    'NULL',   '', '', '', 
1247         'uid',       'int', 'NULL',   '', '', '', 
1248         'gid',       'int', 'NULL',   '', '', '', 
1249         'finger',    'varchar',   'NULL',   $char_d, '', '', 
1250         'dir',       'varchar',   'NULL',   $char_d, '', '', 
1251         'shell',     'varchar',   'NULL',   $char_d, '', '', 
1252         'quota',     'varchar',   'NULL',   $char_d, '', '', 
1253         'slipip',    'varchar',   'NULL',   15, '', '', #four TINYINTs, bah.
1254         'seconds',   'int', 'NULL',   '', '', '', #uhhhh
1255         'seconds_threshold',   'int', 'NULL',   '', '', '',
1256         'upbytes',   'bigint', 'NULL',   '', '', '', 
1257         'upbytes_threshold',   'bigint', 'NULL',   '', '', '',
1258         'downbytes', 'bigint', 'NULL',   '', '', '',
1259         'downbytes_threshold',   'bigint', 'NULL',   '', '', '',
1260         'totalbytes','bigint', 'NULL',   '', '', '',
1261         'totalbytes_threshold',   'bigint', 'NULL',   '', '', '',
1262         'domsvc',    'int', '',   '', '', '', 
1263         'last_login',  @date_type, '', '', 
1264         'last_logout', @date_type, '', '', 
1265       ],
1266       'primary_key' => 'svcnum',
1267       #'unique' => [ [ 'username', 'domsvc' ] ],
1268       'unique' => [],
1269       'index' => [ ['username'], ['domsvc'] ],
1270     },
1271
1272     'acct_rt_transaction' => {
1273       'columns' => [
1274         'svcrtid',   'int',    '',   '', '', '', 
1275         'svcnum',    'int',    '',   '', '', '', 
1276         'transaction_id',       'int', '',   '', '', '', 
1277         '_date',   @date_type, '', '',
1278         'seconds',   'int', '',   '', '', '', #uhhhh
1279         'support',   'int', '',   '', '', '',
1280       ],
1281       'primary_key' => 'svcrtid',
1282       'unique' => [],
1283       'index' => [ ['svcnum', 'transaction_id'] ],
1284     },
1285
1286     #'svc_charge' => {
1287     #  'columns' => [
1288     #    'svcnum',    'int',    '',   '',
1289     #    'amount',    @money_type,
1290     #  ],
1291     #  'primary_key' => 'svcnum',
1292     #  'unique' => [ [] ],
1293     #  'index' => [ [] ],
1294     #},
1295
1296     'svc_domain' => {
1297       'columns' => [
1298         'svcnum',           'int',    '',        '', '', '',
1299         'domain',       'varchar',    '',   $char_d, '', '',
1300         'suffix',       'varchar', 'NULL',  $char_d, '', '',
1301         'catchall',         'int', 'NULL',       '', '', '',
1302         'parent_svcnum',    'int', 'NULL',       '', '', '',
1303         'registrarnum',     'int', 'NULL',       '', '', '',
1304         'registrarkey', 'varchar', 'NULL',      512, '', '',
1305         'setup_date',  @date_type, '', '',
1306         'renewal_interval', 'int', 'NULL',       '', '', '',
1307         'expiration_date', @date_type, '', '',
1308       ],
1309       'primary_key' => 'svcnum',
1310       'unique' => [ ],
1311       'index' => [ ['domain'] ],
1312     },
1313
1314     'domain_record' => {
1315       'columns' => [
1316         'recnum',    'serial',     '',  '', '', '', 
1317         'svcnum',    'int',     '',  '', '', '', 
1318         'reczone',   'varchar', '',  255, '', '', 
1319         'recaf',     'char',    '',  2, '', '', 
1320         'rectype',   'varchar',    '',  5, '', '', 
1321         'recdata',   'varchar', '',  255, '', '', 
1322       ],
1323       'primary_key' => 'recnum',
1324       'unique'      => [],
1325       'index'       => [ ['svcnum'] ],
1326     },
1327
1328     'registrar' => {
1329       'columns' => [
1330         'registrarnum',   'serial', '',      '', '', '',
1331         'registrarname', 'varchar', '', $char_d, '', '',
1332       ],
1333       'primary_key' => 'registrarnum',
1334       'unique'      => [],
1335       'index'       => [],
1336     },
1337
1338     'svc_forward' => {
1339       'columns' => [
1340         'svcnum',   'int',            '',   '', '', '', 
1341         'srcsvc',   'int',        'NULL',   '', '', '', 
1342         'src',      'varchar',    'NULL',  255, '', '', 
1343         'dstsvc',   'int',        'NULL',   '', '', '', 
1344         'dst',      'varchar',    'NULL',  255, '', '', 
1345       ],
1346       'primary_key' => 'svcnum',
1347       'unique'      => [],
1348       'index'       => [ ['srcsvc'], ['dstsvc'] ],
1349     },
1350
1351     'svc_www' => {
1352       'columns' => [
1353         'svcnum',   'int',      '',  '', '', '', 
1354         'recnum',   'int',      '',  '', '', '', 
1355         'usersvc',  'int',  'NULL',  '', '', '', 
1356         'config',   'text', 'NULL',  '', '', '', 
1357       ],
1358       'primary_key' => 'svcnum',
1359       'unique'      => [],
1360       'index'       => [],
1361     },
1362
1363     #'svc_wo' => {
1364     #  'columns' => [
1365     #    'svcnum',    'int',    '',   '',
1366     #    'svcnum',    'int',    '',   '',
1367     #    'svcnum',    'int',    '',   '',
1368     #    'worker',    'varchar',   '',   $char_d,
1369     #    '_date',     @date_type,
1370     #  ],
1371     #  'primary_key' => 'svcnum',
1372     #  'unique' => [ [] ],
1373     #  'index' => [ [] ],
1374     #},
1375
1376     'prepay_credit' => {
1377       'columns' => [
1378         'prepaynum',   'serial',     '',   '', '', '', 
1379         'identifier',  'varchar', '', $char_d, '', '', 
1380         'amount',      @money_type, '', '', 
1381         'seconds',     'int',     'NULL', '', '', '', 
1382         'upbytes',     'bigint',     'NULL', '', '', '', 
1383         'downbytes',   'bigint',     'NULL', '', '', '', 
1384         'totalbytes',  'bigint',     'NULL', '', '', '', 
1385         'agentnum',    'int',     'NULL', '', '', '', 
1386       ],
1387       'primary_key' => 'prepaynum',
1388       'unique'      => [ ['identifier'] ],
1389       'index'       => [],
1390     },
1391
1392     'port' => {
1393       'columns' => [
1394         'portnum',  'serial',     '',   '', '', '', 
1395         'ip',       'varchar', 'NULL', 15, '', '', 
1396         'nasport',  'int',     'NULL', '', '', '', 
1397         'nasnum',   'int',     '',   '', '', '', 
1398       ],
1399       'primary_key' => 'portnum',
1400       'unique'      => [],
1401       'index'       => [],
1402     },
1403
1404     'nas' => {
1405       'columns' => [
1406         'nasnum',   'serial',     '',    '', '', '', 
1407         'nas',      'varchar', '',    $char_d, '', '', 
1408         'nasip',    'varchar', '',    15, '', '', 
1409         'nasfqdn',  'varchar', '',    $char_d, '', '', 
1410         'last',     'int',     '',    '', '', '', 
1411       ],
1412       'primary_key' => 'nasnum',
1413       'unique'      => [ [ 'nas' ], [ 'nasip' ] ],
1414       'index'       => [ [ 'last' ] ],
1415     },
1416
1417 #    'session' => {
1418 #      'columns' => [
1419 #        'sessionnum', 'serial',       '',   '', '', '', 
1420 #        'portnum',    'int',       '',   '', '', '', 
1421 #        'svcnum',     'int',       '',   '', '', '', 
1422 #        'login',      @date_type, '', '', 
1423 #        'logout',     @date_type, '', '', 
1424 #      ],
1425 #      'primary_key' => 'sessionnum',
1426 #      'unique'      => [],
1427 #      'index'       => [ [ 'portnum' ] ],
1428 #    },
1429
1430     'queue' => {
1431       'columns' => [
1432         'jobnum', 'serial', '', '', '', '', 
1433         'job', 'text', '', '', '', '', 
1434         '_date', 'int', '', '', '', '', 
1435         'status', 'varchar', '', $char_d, '', '', 
1436         'statustext', 'text', 'NULL', '', '', '', 
1437         'svcnum', 'int', 'NULL', '', '', '', 
1438         'secure',  'char', 'NULL', 1, '', '', # Y = needs to be run on machine
1439                                               #     w/private key
1440       ],
1441       'primary_key' => 'jobnum',
1442       'unique'      => [],
1443       'index'       => [ [ 'svcnum' ], [ 'status' ] ],
1444     },
1445
1446     'queue_arg' => {
1447       'columns' => [
1448         'argnum', 'serial', '', '', '', '', 
1449         'jobnum', 'int', '', '', '', '', 
1450         'arg', 'text', 'NULL', '', '', '', 
1451       ],
1452       'primary_key' => 'argnum',
1453       'unique'      => [],
1454       'index'       => [ [ 'jobnum' ] ],
1455     },
1456
1457     'queue_depend' => {
1458       'columns' => [
1459         'dependnum', 'serial', '', '', '', '', 
1460         'jobnum', 'int', '', '', '', '', 
1461         'depend_jobnum', 'int', '', '', '', '', 
1462       ],
1463       'primary_key' => 'dependnum',
1464       'unique'      => [],
1465       'index'       => [ [ 'jobnum' ], [ 'depend_jobnum' ] ],
1466     },
1467
1468     'export_svc' => {
1469       'columns' => [
1470         'exportsvcnum' => 'serial', '', '', '', '', 
1471         'exportnum'    => 'int', '', '', '', '', 
1472         'svcpart'      => 'int', '', '', '', '', 
1473       ],
1474       'primary_key' => 'exportsvcnum',
1475       'unique'      => [ [ 'exportnum', 'svcpart' ] ],
1476       'index'       => [ [ 'exportnum' ], [ 'svcpart' ] ],
1477     },
1478
1479     'part_export' => {
1480       'columns' => [
1481         'exportnum', 'serial', '', '', '', '', 
1482         'machine', 'varchar', '', $char_d, '', '', 
1483         'exporttype', 'varchar', '', $char_d, '', '', 
1484         'nodomain',     'char', 'NULL', 1, '', '', 
1485       ],
1486       'primary_key' => 'exportnum',
1487       'unique'      => [],
1488       'index'       => [ [ 'machine' ], [ 'exporttype' ] ],
1489     },
1490
1491     'part_export_option' => {
1492       'columns' => [
1493         'optionnum', 'serial', '', '', '', '', 
1494         'exportnum', 'int', '', '', '', '', 
1495         'optionname', 'varchar', '', $char_d, '', '', 
1496         'optionvalue', 'text', 'NULL', '', '', '', 
1497       ],
1498       'primary_key' => 'optionnum',
1499       'unique'      => [],
1500       'index'       => [ [ 'exportnum' ], [ 'optionname' ] ],
1501     },
1502
1503     'radius_usergroup' => {
1504       'columns' => [
1505         'usergroupnum', 'serial', '', '', '', '', 
1506         'svcnum',       'int', '', '', '', '', 
1507         'groupname',    'varchar', '', $char_d, '', '', 
1508       ],
1509       'primary_key' => 'usergroupnum',
1510       'unique'      => [],
1511       'index'       => [ [ 'svcnum' ], [ 'groupname' ] ],
1512     },
1513
1514     'msgcat' => {
1515       'columns' => [
1516         'msgnum', 'serial', '', '', '', '', 
1517         'msgcode', 'varchar', '', $char_d, '', '', 
1518         'locale', 'varchar', '', 16, '', '', 
1519         'msg', 'text', '', '', '', '', 
1520       ],
1521       'primary_key' => 'msgnum',
1522       'unique'      => [ [ 'msgcode', 'locale' ] ],
1523       'index'       => [],
1524     },
1525
1526     'cust_tax_exempt' => {
1527       'columns' => [
1528         'exemptnum', 'serial', '', '', '', '', 
1529         'custnum',   'int', '', '', '', '', 
1530         'taxnum',    'int', '', '', '', '', 
1531         'year',      'int', '', '', '', '', 
1532         'month',     'int', '', '', '', '', 
1533         'amount',   @money_type, '', '', 
1534       ],
1535       'primary_key' => 'exemptnum',
1536       'unique'      => [ [ 'custnum', 'taxnum', 'year', 'month' ] ],
1537       'index'       => [],
1538     },
1539
1540     'cust_tax_exempt_pkg' => {
1541       'columns' => [
1542         'exemptpkgnum',  'serial', '', '', '', '', 
1543         #'custnum',      'int', '', '', '', ''
1544         'billpkgnum',   'int', '', '', '', '', 
1545         'taxnum',       'int', '', '', '', '', 
1546         'year',         'int', '', '', '', '', 
1547         'month',        'int', '', '', '', '', 
1548         'amount',       @money_type, '', '', 
1549       ],
1550       'primary_key' => 'exemptpkgnum',
1551       'unique' => [],
1552       'index'  => [ [ 'taxnum', 'year', 'month' ],
1553                     [ 'billpkgnum' ],
1554                     [ 'taxnum' ]
1555                   ],
1556     },
1557
1558     'router' => {
1559       'columns' => [
1560         'routernum', 'serial', '', '', '', '', 
1561         'routername', 'varchar', '', $char_d, '', '', 
1562         'svcnum', 'int', 'NULL', '', '', '', 
1563         'agentnum',   'int', 'NULL', '', '', '', 
1564       ],
1565       'primary_key' => 'routernum',
1566       'unique'      => [],
1567       'index'       => [],
1568     },
1569
1570     'part_svc_router' => {
1571       'columns' => [
1572         'svcrouternum', 'serial', '', '', '', '', 
1573         'svcpart', 'int', '', '', '', '', 
1574         'routernum', 'int', '', '', '', '', 
1575       ],
1576       'primary_key' => 'svcrouternum',
1577       'unique'      => [],
1578       'index'       => [],
1579     },
1580
1581     'addr_block' => {
1582       'columns' => [
1583         'blocknum', 'serial', '', '', '', '', 
1584         'routernum', 'int', '', '', '', '', 
1585         'ip_gateway', 'varchar', '', 15, '', '', 
1586         'ip_netmask', 'int', '', '', '', '', 
1587         'agentnum',   'int', 'NULL', '', '', '', 
1588       ],
1589       'primary_key' => 'blocknum',
1590       'unique'      => [ [ 'blocknum', 'routernum' ] ],
1591       'index'       => [],
1592     },
1593
1594     'svc_broadband' => {
1595       'columns' => [
1596         'svcnum', 'int', '', '', '', '', 
1597         'description', 'varchar', 'NULL', $char_d, '', '', 
1598         'blocknum', 'int', '', '', '', '', 
1599         'speed_up', 'int', '', '', '', '', 
1600         'speed_down', 'int', '', '', '', '', 
1601         'ip_addr', 'varchar', '', 15, '', '', 
1602         'mac_addr', 'varchar', 'NULL', 12, '', '', 
1603         'authkey',  'varchar', 'NULL', 32, '', '', 
1604         'latitude', 'decimal', 'NULL', '', '', '', 
1605         'longitude', 'decimal', 'NULL', '', '', '', 
1606         'altitude', 'decimal', 'NULL', '', '', '', 
1607         'vlan_profile', 'varchar', 'NULL', $char_d, '', '', 
1608       ],
1609       'primary_key' => 'svcnum',
1610       'unique'      => [],
1611       'index'       => [],
1612     },
1613
1614     'part_virtual_field' => {
1615       'columns' => [
1616         'vfieldpart', 'serial', '', '', '', '', 
1617         'dbtable', 'varchar', '', 32, '', '', 
1618         'name', 'varchar', '', 32, '', '', 
1619         'check_block', 'text', 'NULL', '', '', '', 
1620         'length', 'int', 'NULL', '', '', '', 
1621         'list_source', 'text', 'NULL', '', '', '', 
1622         'label', 'varchar', 'NULL', 80, '', '', 
1623       ],
1624       'primary_key' => 'vfieldpart',
1625       'unique' => [],
1626       'index' => [],
1627     },
1628
1629     'virtual_field' => {
1630       'columns' => [
1631         'vfieldnum', 'serial', '', '', '', '', 
1632         'recnum', 'int', '', '', '', '', 
1633         'vfieldpart', 'int', '', '', '', '', 
1634         'value', 'varchar', '', 128, '', '', 
1635       ],
1636       'primary_key' => 'vfieldnum',
1637       'unique' => [ [ 'vfieldpart', 'recnum' ] ],
1638       'index' => [],
1639     },
1640
1641     'acct_snarf' => {
1642       'columns' => [
1643         'snarfnum',  'int', '', '', '', '', 
1644         'svcnum',    'int', '', '', '', '', 
1645         'machine',   'varchar', '', 255, '', '', 
1646         'protocol',  'varchar', '', $char_d, '', '', 
1647         'username',  'varchar', '', $char_d, '', '', 
1648         '_password', 'varchar', '', $char_d, '', '', 
1649       ],
1650       'primary_key' => 'snarfnum',
1651       'unique' => [],
1652       'index'  => [ [ 'svcnum' ] ],
1653     },
1654
1655     'svc_external' => {
1656       'columns' => [
1657         'svcnum', 'int', '', '', '', '', 
1658         'id',     'int', 'NULL', '', '', '', 
1659         'title',  'varchar', 'NULL', $char_d, '', '', 
1660       ],
1661       'primary_key' => 'svcnum',
1662       'unique'      => [],
1663       'index'       => [],
1664     },
1665
1666     'cust_pay_refund' => {
1667       'columns' => [
1668         'payrefundnum', 'serial', '', '', '', '', 
1669         'paynum',  'int', '', '', '', '', 
1670         'refundnum',  'int', '', '', '', '', 
1671         '_date',    @date_type, '', '', 
1672         'amount',   @money_type, '', '', 
1673       ],
1674       'primary_key' => 'payrefundnum',
1675       'unique' => [],
1676       'index' => [ ['paynum'], ['refundnum'] ],
1677     },
1678
1679     'part_pkg_option' => {
1680       'columns' => [
1681         'optionnum', 'serial', '', '', '', '', 
1682         'pkgpart', 'int', '', '', '', '', 
1683         'optionname', 'varchar', '', $char_d, '', '', 
1684         'optionvalue', 'text', 'NULL', '', '', '', 
1685       ],
1686       'primary_key' => 'optionnum',
1687       'unique'      => [],
1688       'index'       => [ [ 'pkgpart' ], [ 'optionname' ] ],
1689     },
1690
1691     'rate' => {
1692       'columns' => [
1693         'ratenum',  'serial', '', '', '', '', 
1694         'ratename', 'varchar', '', $char_d, '', '', 
1695       ],
1696       'primary_key' => 'ratenum',
1697       'unique'      => [],
1698       'index'       => [],
1699     },
1700
1701     'rate_detail' => {
1702       'columns' => [
1703         'ratedetailnum',   'serial', '', '', '', '', 
1704         'ratenum',         'int',     '', '', '', '', 
1705         'orig_regionnum',  'int', 'NULL', '', '', '', 
1706         'dest_regionnum',  'int',     '', '', '', '', 
1707         'min_included',    'int',     '', '', '', '', 
1708         #'min_charge',      @money_type, '', '', 
1709         'min_charge',      'decimal', '', '10,5', '', '', 
1710         'sec_granularity', 'int',     '', '', '', '', 
1711         #time period (link to table of periods)?
1712         'classnum',        'int',     'NULL', '', '', '', 
1713       ],
1714       'primary_key' => 'ratedetailnum',
1715       'unique'      => [ [ 'ratenum', 'orig_regionnum', 'dest_regionnum' ] ],
1716       'index'       => [ [ 'ratenum', 'dest_regionnum' ] ],
1717     },
1718
1719     'rate_region' => {
1720       'columns' => [
1721         'regionnum',   'serial',      '', '', '', '', 
1722         'regionname',  'varchar',     '', $char_d, '', '', 
1723       ],
1724       'primary_key' => 'regionnum',
1725       'unique'      => [],
1726       'index'       => [],
1727     },
1728
1729     'rate_prefix' => {
1730       'columns' => [
1731         'prefixnum',   'serial',    '', '', '', '', 
1732         'regionnum',   'int',       '', '',, '', '', 
1733         'countrycode', 'varchar',     '', 3, '', '', 
1734         'npa',         'varchar', 'NULL', 6, '', '', 
1735         'nxx',         'varchar', 'NULL', 3, '', '', 
1736       ],
1737       'primary_key' => 'prefixnum',
1738       'unique'      => [],
1739       'index'       => [ [ 'countrycode' ], [ 'regionnum' ] ],
1740     },
1741
1742     'usage_class' => {
1743       'columns' => [
1744         'classnum',    'serial',   '',      '', '', '', 
1745         'classname',   'varchar',  '', $char_d, '', '', 
1746         'disabled',    'char', 'NULL',       1, '', '', 
1747       ],
1748       'primary_key' => 'classnum',
1749       'unique' => [],
1750       'index' => [ ['disabled'] ],
1751     },
1752
1753     'reg_code' => {
1754       'columns' => [
1755         'codenum',   'serial',    '', '', '', '', 
1756         'code',      'varchar',   '', $char_d, '', '', 
1757         'agentnum',  'int',       '', '', '', '', 
1758       ],
1759       'primary_key' => 'codenum',
1760       'unique'      => [ [ 'agentnum', 'code' ] ],
1761       'index'       => [ [ 'agentnum' ] ],
1762     },
1763
1764     'reg_code_pkg' => {
1765       'columns' => [
1766         'codepkgnum', 'serial', '', '', '', '', 
1767         'codenum',   'int',    '', '', '', '', 
1768         'pkgpart',   'int',    '', '', '', '', 
1769       ],
1770       'primary_key' => 'codepkgnum',
1771       'unique'      => [ [ 'codenum', 'pkgpart' ] ],
1772       'index'       => [ [ 'codenum' ] ],
1773     },
1774
1775     'clientapi_session' => {
1776       'columns' => [
1777         'sessionnum',  'serial',  '', '', '', '', 
1778         'sessionid',  'varchar',  '', $char_d, '', '', 
1779         'namespace',  'varchar',  '', $char_d, '', '', 
1780       ],
1781       'primary_key' => 'sessionnum',
1782       'unique'      => [ [ 'sessionid', 'namespace' ] ],
1783       'index'       => [],
1784     },
1785
1786     'clientapi_session_field' => {
1787       'columns' => [
1788         'fieldnum',    'serial',     '', '', '', '', 
1789         'sessionnum',     'int',     '', '', '', '', 
1790         'fieldname',  'varchar',     '', $char_d, '', '', 
1791         'fieldvalue',    'text', 'NULL', '', '', '', 
1792       ],
1793       'primary_key' => 'fieldnum',
1794       'unique'      => [ [ 'sessionnum', 'fieldname' ] ],
1795       'index'       => [],
1796     },
1797
1798     'payment_gateway' => {
1799       'columns' => [
1800         'gatewaynum',       'serial',   '',     '', '', '', 
1801         'gateway_module',   'varchar',  '',     $char_d, '', '', 
1802         'gateway_username', 'varchar',  'NULL', $char_d, '', '', 
1803         'gateway_password', 'varchar',  'NULL', $char_d, '', '', 
1804         'gateway_action',   'varchar',  'NULL', $char_d, '', '', 
1805         'disabled',   'char',  'NULL',   1, '', '', 
1806       ],
1807       'primary_key' => 'gatewaynum',
1808       'unique' => [],
1809       'index'  => [ [ 'disabled' ] ],
1810     },
1811
1812     'payment_gateway_option' => {
1813       'columns' => [
1814         'optionnum',   'serial',  '',     '', '', '', 
1815         'gatewaynum',  'int',     '',     '', '', '', 
1816         'optionname',  'varchar', '',     $char_d, '', '', 
1817         'optionvalue', 'text',    'NULL', '', '', '', 
1818       ],
1819       'primary_key' => 'optionnum',
1820       'unique'      => [],
1821       'index'       => [ [ 'gatewaynum' ], [ 'optionname' ] ],
1822     },
1823
1824     'agent_payment_gateway' => {
1825       'columns' => [
1826         'agentgatewaynum', 'serial', '', '', '', '', 
1827         'agentnum',        'int', '', '', '', '', 
1828         'gatewaynum',      'int', '', '', '', '', 
1829         'cardtype',        'varchar', 'NULL', $char_d, '', '', 
1830         'taxclass',        'varchar', 'NULL', $char_d, '', '', 
1831       ],
1832       'primary_key' => 'agentgatewaynum',
1833       'unique'      => [],
1834       'index'       => [ [ 'agentnum', 'cardtype' ], ],
1835     },
1836
1837     'banned_pay' => {
1838       'columns' => [
1839         'bannum',  'serial',   '',     '', '', '', 
1840         'payby',   'char',     '',       4, '', '', 
1841         'payinfo', 'varchar',  '',     128, '', '', #say, a 512-big digest _hex encoded
1842         #'paymask', 'varchar',  'NULL', $char_d, '', ''
1843         '_date',   @date_type, '', '', 
1844         'otaker',  'varchar',  '',     32, '', '', 
1845         'reason',  'varchar',  'NULL', $char_d, '', '', 
1846       ],
1847       'primary_key' => 'bannum',
1848       'unique'      => [ [ 'payby', 'payinfo' ] ],
1849       'index'       => [],
1850     },
1851
1852     'pkg_category' => {
1853       'columns' => [
1854         'categorynum',   'serial',  '', '', '', '', 
1855         'categoryname',  'varchar', '', $char_d, '', '', 
1856         'disabled',      'char', 'NULL',   1, '', '', 
1857       ],
1858       'primary_key' => 'categorynum',
1859       'unique' => [],
1860       'index' => [ ['disabled'] ],
1861     },
1862
1863     'pkg_class' => {
1864       'columns' => [
1865         'classnum',    'serial',   '',      '', '', '', 
1866         'classname',   'varchar',  '', $char_d, '', '', 
1867         'categorynum', 'int',  'NULL',      '', '', '', 
1868         'disabled',    'char', 'NULL',       1, '', '', 
1869       ],
1870       'primary_key' => 'classnum',
1871       'unique' => [],
1872       'index' => [ ['disabled'] ],
1873     },
1874
1875     'cdr' => {
1876       'columns' => [
1877         # qw( name type null length default local );
1878
1879         ###
1880         #asterisk fields
1881         ###
1882
1883         'acctid',   'bigserial',  '', '', '', '', 
1884         #'calldate', 'TIMESTAMP with time zone', '', '', \'now()', '',
1885         'calldate', 'timestamp',   '',      '', \'now()', '',
1886         'clid',        'varchar',  '', $char_d, \"''", '', 
1887         'src',         'varchar',  '', $char_d, \"''", '', 
1888         'dst',         'varchar',  '', $char_d, \"''", '', 
1889         'dcontext',    'varchar',  '', $char_d, \"''", '', 
1890         'channel',     'varchar',  '', $char_d, \"''", '', 
1891         'dstchannel',  'varchar',  '', $char_d, \"''", '', 
1892         'lastapp',     'varchar',  '', $char_d, \"''", '', 
1893         'lastdata',    'varchar',  '', $char_d, \"''", '', 
1894
1895         #these don't seem to be logged by most of the SQL cdr_* modules
1896         #except tds under sql-illegal names, so;
1897         # ... don't rely on them for rating?
1898         # and, what they hey, i went ahead and changed the names and data types
1899         # to freeside-style dates...
1900           #'start',  'timestamp', 'NULL',  '',    '', '',
1901           #'answer', 'timestamp', 'NULL',  '',    '', '',
1902           #'end',    'timestamp', 'NULL',  '',    '', '',
1903         'startdate',  @date_type, '', '', 
1904         'answerdate', @date_type, '', '', 
1905         'enddate',    @date_type, '', '', 
1906         #
1907
1908         'duration',    'int',      '',      '',     0, '',
1909         'billsec',     'int',      '',      '',     0, '', 
1910         'disposition', 'varchar',  '',      45, \"''", '',
1911         'amaflags',    'int',      '',      '',     0, '',
1912         'accountcode', 'varchar',  '',      20, \"''", '',
1913         'uniqueid',    'varchar',  '',      32, \"''", '',
1914         'userfield',   'varchar',  '',     255, \"''", '',
1915
1916         ###
1917         # fields for unitel/RSLCOM/convergent that don't map well to asterisk
1918         # defaults
1919         ###
1920
1921         #cdr_type: Usage = 1, S&E = 7, OC&C = 8
1922         'cdrtypenum',              'int', 'NULL',      '', '', '',
1923
1924         'charged_party',       'varchar', 'NULL', $char_d, '', '',
1925
1926         'upstream_currency',      'char', 'NULL',       3, '', '',
1927         'upstream_price',      'decimal', 'NULL',  '10,2', '', '', 
1928         'upstream_rateplanid',     'int', 'NULL',      '', '', '', #?
1929
1930         # how it was rated internally...
1931         'ratedetailnum',           'int', 'NULL',      '', '', '',
1932         'rated_price',         'decimal', 'NULL',  '10,2', '', '',
1933
1934         'distance',            'decimal', 'NULL',      '', '', '',
1935         'islocal',                 'int', 'NULL',      '', '', '', # '',  '', 0, '' instead?
1936
1937         #cdr_calltype: the big list in appendix 2
1938         'calltypenum',             'int', 'NULL',      '', '', '',
1939
1940         'description',         'varchar', 'NULL', $char_d, '', '',
1941         'quantity',                'int', 'NULL',      '', '', '', 
1942
1943         #cdr_carrier: Telstra =1, Optus = 2, RSL COM = 3
1944         'carrierid',               'int', 'NULL',      '', '', '',
1945
1946         'upstream_rateid',         'int', 'NULL',      '', '', '',
1947         
1948         ###
1949         #and now for our own fields
1950         ###
1951
1952         # a svcnum... right..?
1953         'svcnum',             'int',   'NULL',     '',   '', '', 
1954
1955         #NULL, done (or something)
1956         'freesidestatus', 'varchar',   'NULL',     32,   '', '', 
1957
1958         'cdrbatch', 'varchar', 'NULL', $char_d, '', '',
1959
1960       ],
1961       'primary_key' => 'acctid',
1962       'unique' => [],
1963       'index' => [ [ 'calldate' ], [ 'dst' ], [ 'accountcode' ], [ 'freesidestatus' ], [ 'cdrbatch' ], ],
1964     },
1965
1966     'cdr_calltype' => {
1967       'columns' => [
1968         'calltypenum',   'serial',  '', '', '', '', 
1969         'calltypename',  'varchar', '', $char_d, '', '', 
1970       ],
1971       'primary_key' => 'calltypenum',
1972       'unique'      => [],
1973       'index'       => [],
1974     },
1975
1976     'cdr_type' => {
1977       'columns' => [
1978         'cdrtypenum'  => 'serial',  '', '', '', '',
1979         'cdrtypename' => 'varchar', '', $char_d, '', '',
1980       ],
1981       'primary_key' => 'cdrtypenum',
1982       'unique'      => [],
1983       'index'       => [],
1984     },
1985
1986     'cdr_carrier' => {
1987       'columns' => [
1988         'carrierid'   => 'serial',  '', '', '', '',
1989         'carriername' => 'varchar', '', $char_d, '', '',
1990       ],
1991       'primary_key' => 'carrierid',
1992       'unique'      => [],
1993       'index'       => [],
1994     },
1995
1996     #map upstream rateid to ours...
1997     'cdr_upstream_rate' => {
1998       'columns' => [
1999         'upstreamratenum', 'serial',  '', '', '', '',
2000         'upstream_rateid', 'varchar', '', $char_d, '', '', 
2001         'ratedetailnum',   'int', 'NULL', '', '', '',
2002       ],
2003       'primary_key' => 'upstreamratenum', #XXX need a primary key
2004       'unique' => [ [ 'upstream_rateid' ] ], #unless we add another field, yeah
2005       'index'  => [],
2006     },
2007
2008     'inventory_item' => {
2009       'columns' => [
2010         'itemnum',  'serial',      '',      '', '', '',
2011         'classnum', 'int',         '',      '', '', '',
2012         'item',     'varchar',     '', $char_d, '', '',
2013         'svcnum',   'int',     'NULL',      '', '', '',
2014       ],
2015       'primary_key' => 'itemnum',
2016       'unique' => [ [ 'classnum', 'item' ] ],
2017       'index'  => [ [ 'classnum' ], [ 'svcnum' ] ],
2018     },
2019
2020     'inventory_class' => {
2021       'columns' => [
2022         'classnum',  'serial',       '',      '', '', '',
2023         'classname', 'varchar',      '', $char_d, '', '',
2024       ],
2025       'primary_key' => 'classnum',
2026       'unique' => [],
2027       'index'  => [],
2028     },
2029
2030     'access_user' => {
2031       'columns' => [
2032         'usernum',   'serial',  '',      '', '', '',
2033         'username',  'varchar', '', $char_d, '', '',
2034         '_password', 'varchar', '', $char_d, '', '',
2035         'last',      'varchar', '', $char_d, '', '', 
2036         'first',     'varchar', '', $char_d, '', '', 
2037         'disabled',     'char', 'NULL',   1, '', '', 
2038       ],
2039       'primary_key' => 'usernum',
2040       'unique' => [ [ 'username' ] ],
2041       'index'  => [],
2042     },
2043
2044     'access_user_pref' => {
2045       'columns' => [
2046         'prefnum',    'serial',       '', '', '', '',
2047         'usernum',     'int',       '', '', '', '',
2048         'prefname', 'varchar', '', $char_d, '', '', 
2049         'prefvalue', 'text', 'NULL', '', '', '', 
2050         'expiration', @date_type, '', '',
2051       ],
2052       'primary_key' => 'prefnum',
2053       'unique' => [],
2054       'index'  => [ [ 'usernum' ] ],
2055     },
2056
2057     'access_group' => {
2058       'columns' => [
2059         'groupnum',   'serial', '',      '', '', '',
2060         'groupname', 'varchar', '', $char_d, '', '',
2061       ],
2062       'primary_key' => 'groupnum',
2063       'unique' => [ [ 'groupname' ] ],
2064       'index'  => [],
2065     },
2066
2067     'access_usergroup' => {
2068       'columns' => [
2069         'usergroupnum', 'serial', '', '', '', '',
2070         'usernum',         'int', '', '', '', '',
2071         'groupnum',        'int', '', '', '', '',
2072       ],
2073       'primary_key' => 'usergroupnum',
2074       'unique' => [ [ 'usernum', 'groupnum' ] ],
2075       'index'  => [ [ 'usernum' ] ],
2076     },
2077
2078     'access_groupagent' => {
2079       'columns' => [
2080         'groupagentnum', 'serial', '', '', '', '',
2081         'groupnum',         'int', '', '', '', '',
2082         'agentnum',         'int', '', '', '', '',
2083       ],
2084       'primary_key' => 'groupagentnum',
2085       'unique' => [ [ 'groupnum', 'agentnum' ] ],
2086       'index'  => [ [ 'groupnum' ] ],
2087     },
2088
2089     'access_right' => {
2090       'columns' => [
2091         'rightnum',   'serial', '',      '', '', '',
2092         'righttype', 'varchar', '', $char_d, '', '',
2093         'rightobjnum',   'int', '',      '', '', '',
2094         'rightname', 'varchar', '', $char_d, '', '',
2095       ],
2096       'primary_key' => 'rightnum',
2097       'unique' => [ [ 'righttype', 'rightobjnum', 'rightname' ] ],
2098       'index'  => [],
2099     },
2100
2101     'svc_phone' => {
2102       'columns' => [
2103         'svcnum',       'int',         '',      '', '', '', 
2104         'countrycode',  'varchar',     '',       3, '', '', 
2105         'phonenum',     'varchar',     '',      15, '', '',  #12 ?
2106         'pin',          'varchar', 'NULL', $char_d, '', '',
2107         'sip_password', 'varchar', 'NULL', $char_d, '', '',
2108         'phone_name',   'varchar', 'NULL', $char_d, '', '',
2109       ],
2110       'primary_key' => 'svcnum',
2111       'unique' => [],
2112       'index'  => [ [ 'countrycode', 'phonenum' ] ],
2113     },
2114
2115     'phone_avail' => {
2116       'columns' => [
2117         'availnum',    'int',      '', '', '', '', 
2118         'exportnum',   'int',      '', '', '', '', 
2119         'countrycode', 'varchar',  '',  3, '', '', 
2120         'state',       'char', 'NULL',  2, '', '', 
2121         'npa',         'char',     '',  3, '', '', 
2122         'nxx',         'char', 'NULL',  3, '', '', 
2123         'station',     'char', 'NULL',  4, '', '',
2124         'svcnum',      'int',     'NULL',      '', '', '',
2125         'availbatch', 'varchar', 'NULL', $char_d, '', '',
2126       ],
2127       'primary_key' => 'availnum',
2128       'unique' => [],
2129       'index'  => [ [ 'exportnum', 'countrycode', 'state' ],     #npa search
2130                     [ 'exportnum', 'countrycode', 'npa' ],       #nxx search
2131                     [ 'exportnum', 'countrycode', 'npa', 'nxx' ],#station search
2132                     [ 'exportnum', 'countrycode', 'npa', 'nxx', 'station' ], # #
2133                     [ 'svcnum' ],
2134                     [ 'availbatch' ],
2135                   ],
2136     },
2137
2138     'reason_type' => {
2139       'columns' => [
2140         'typenum',   'serial',  '', '', '', '', 
2141         'class',     'char', '', 1, '', '', 
2142         'type',     'varchar', '', $char_d, '', '', 
2143       ],
2144       'primary_key' => 'typenum',
2145       'unique' => [],
2146       'index' => [],
2147     },
2148
2149     'reason' => {
2150       'columns' => [
2151         'reasonnum',     'serial',  '', '', '', '', 
2152         'reason_type',   'int',  '', '', '', '', 
2153         'reason',        'text', '', '', '', '', 
2154         'disabled',      'char',    'NULL', 1, '', '', 
2155       ],
2156       'primary_key' => 'reasonnum',
2157       'unique' => [],
2158       'index' => [],
2159     },
2160
2161     'conf' => {
2162       'columns' => [
2163         'confnum',  'serial',  '', '', '', '', 
2164         'agentnum', 'int',  'NULL', '', '', '', 
2165         'name',     'varchar', '', $char_d, '', '', 
2166         'value',    'text', 'NULL', '', '', '',
2167       ],
2168       'primary_key' => 'confnum',
2169       'unique' => [ [ 'agentnum', 'name' ]],
2170       'index' => [],
2171     },
2172
2173     'pkg_referral' => {
2174       'columns' => [
2175         'pkgrefnum',     'serial', '', '', '', '',
2176         'pkgnum',        'int',    '', '', '', '',
2177         'refnum',        'int',    '', '', '', '',
2178       ],
2179       'primary_key' => 'pkgrefnum',
2180       'unique'      => [ [ 'pkgnum', 'refnum' ] ],
2181       'index'       => [ [ 'pkgnum' ], [ 'refnum' ] ],
2182     },
2183     # name type nullability length default local
2184
2185     #'new_table' => {
2186     #  'columns' => [
2187     #    'num', 'serial',       '', '', '', '',
2188     #  ],
2189     #  'primary_key' => 'num',
2190     #  'unique' => [],
2191     #  'index'  => [],
2192     #},
2193
2194   };
2195
2196 }
2197
2198 =back
2199
2200 =head1 BUGS
2201
2202 =head1 SEE ALSO
2203
2204 L<DBIx::DBSchema>
2205
2206 =cut
2207
2208 1;
2209