This commit was generated by cvs2svn to compensate for changes in r4407,
[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.25;
7 use DBIx::DBSchema::Table;
8 use DBIx::DBSchema::Column;
9 use DBIx::DBSchema::ColGroup::Unique;
10 use DBIx::DBSchema::ColGroup::Index;
11 use FS::UID qw(datasrc);
12
13 @ISA = qw(Exporter);
14 @EXPORT_OK = qw( dbdef dbdef_dist reload_dbdef );
15
16 $DEBUG = 0;
17 $me = '[FS::Schema]';
18
19 #ask FS::UID to run this stuff for us later
20 FS::UID->install_callback( sub {
21   #$conf = new FS::Conf; 
22   &reload_dbdef("/usr/local/etc/freeside/dbdef.". datasrc)
23     unless $setup_hack; #$setup_hack needed now?
24 } );
25
26 =head1 NAME
27
28 FS::Schema - Freeside database schema
29
30 =head1 SYNOPSYS
31
32     use FS::Schema qw(dbdef dbdef_dist reload_dbdef);
33
34     $dbdef = reload_dbdef;
35     $dbdef = reload_dbdef "/non/standard/filename";
36     $dbdef = dbdef;
37     $dbdef_dist = dbdef_dist;
38
39 =head1 DESCRIPTION
40
41 This class represents the database schema.
42
43 =head1 METHODS
44
45 =over 4
46
47 =item reload_dbdef([FILENAME])
48
49 Load a database definition (see L<DBIx::DBSchema>), optionally from a
50 non-default filename.  This command is executed at startup unless
51 I<$FS::Schema::setup_hack> is true.  Returns a DBIx::DBSchema object.
52
53 =cut
54
55 sub reload_dbdef {
56   my $file = shift;
57
58   unless ( exists $dbdef_cache{$file} ) {
59     warn "[debug]$me loading dbdef for $file\n" if $DEBUG;
60     $dbdef_cache{$file} = DBIx::DBSchema->load( $file )
61                             or die "can't load database schema from $file";
62   } else {
63     warn "[debug]$me re-using cached dbdef for $file\n" if $DEBUG;
64   }
65   $dbdef = $dbdef_cache{$file};
66 }
67
68 =item dbdef
69
70 Returns the current database definition (represents the current database,
71 assuming it is up-to-date).  See L<DBIx::DBSchema>.
72
73 =cut
74
75 sub dbdef { $dbdef; }
76
77 =item dbdef_dist [ OPTION => VALUE ... ]
78
79 Returns the current canoical database definition as defined in this file.
80
81 =cut
82
83 sub dbdef_dist {
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     my @columns;
94     while (@{$tables_hashref->{$_}{'columns'}}) {
95       my($name, $type, $null, $length) =
96         splice @{$tables_hashref->{$_}{'columns'}}, 0, 4;
97       push @columns, new DBIx::DBSchema::Column ( $name,$type,$null,$length );
98     }
99     DBIx::DBSchema::Table->new(
100       $_,
101       $tables_hashref->{$_}{'primary_key'},
102       DBIx::DBSchema::ColGroup::Unique->new($tables_hashref->{$_}{'unique'}),
103       DBIx::DBSchema::ColGroup::Index->new($tables_hashref->{$_}{'index'}),
104       @columns,
105     );
106   } keys %$tables_hashref;
107
108   if ( $DEBUG ) {
109     warn "[debug]$me initial dbdef_dist created ($dbdef) with tables:\n";
110     warn "[debug]$me   $_\n" foreach $dbdef->tables;
111   }
112   
113   my $cust_main = $dbdef->table('cust_main');
114   #unless ($ship) { #remove ship_ from cust_main
115   #  $cust_main->delcolumn($_) foreach ( grep /^ship_/, $cust_main->columns );
116   #} else { #add indices
117     push @{$cust_main->index->lol_ref},
118       map { [ "ship_$_" ] } qw( last company daytime night fax );
119   #}
120   
121   #add radius attributes to svc_acct
122   #
123   #my($svc_acct)=$dbdef->table('svc_acct');
124   # 
125   #my($attribute);
126   #foreach $attribute (@attributes) {
127   #  $svc_acct->addcolumn ( new DBIx::DBSchema::Column (
128   #    'radius_'. $attribute,
129   #    'varchar',
130   #    'NULL',
131   #    $char_d,
132   #  ));
133   #}
134   # 
135   #foreach $attribute (@check_attributes) {
136   #  $svc_acct->addcolumn( new DBIx::DBSchema::Column (
137   #    'rc_'. $attribute,
138   #    'varchar',
139   #    'NULL',
140   #    $char_d,
141   #  ));
142   #}
143
144   #create history tables (false laziness w/create-history-tables)
145   foreach my $table (
146     grep { ! /^clientapi_session/ }
147     grep { ! /^h_/ }
148     $dbdef->tables
149   ) {
150     my $tableobj = $dbdef->table($table)
151       or die "unknown table $table";
152   
153     die "unique->lol_ref undefined for $table"
154       unless defined $tableobj->unique->lol_ref;
155     die "index->lol_ref undefined for $table"
156       unless defined $tableobj->index->lol_ref;
157   
158     my $h_tableobj = DBIx::DBSchema::Table->new( {
159       name        => "h_$table",
160       primary_key => 'historynum',
161       unique      => DBIx::DBSchema::ColGroup::Unique->new( [] ),
162       'index'     => DBIx::DBSchema::ColGroup::Index->new( [
163                        @{$tableobj->unique->lol_ref},
164                        @{$tableobj->index->lol_ref}
165                      ] ),
166       columns     => [
167                        DBIx::DBSchema::Column->new( {
168                          'name'    => 'historynum',
169                          'type'    => 'serial',
170                          'null'    => 'NOT NULL',
171                          'length'  => '',
172                          'default' => '',
173                          'local'   => '',
174                        } ),
175                        DBIx::DBSchema::Column->new( {
176                          'name'    => 'history_date',
177                          'type'    => 'int',
178                          'null'    => 'NULL',
179                          'length'  => '',
180                          'default' => '',
181                          'local'   => '',
182                        } ),
183                        DBIx::DBSchema::Column->new( {
184                          'name'    => 'history_user',
185                          'type'    => 'varchar',
186                          'null'    => 'NOT NULL',
187                          'length'  => '80',
188                          'default' => '',
189                          'local'   => '',
190                        } ),
191                        DBIx::DBSchema::Column->new( {
192                          'name'    => 'history_action',
193                          'type'    => 'varchar',
194                          'null'    => 'NOT NULL',
195                          'length'  => '80',
196                          'default' => '',
197                          'local'   => '',
198                        } ),
199                        map {
200                          my $column = $tableobj->column($_);
201   
202                          #clone so as to not disturb the original
203                          $column = DBIx::DBSchema::Column->new( {
204                            map { $_ => $column->$_() }
205                              qw( name type null length default local )
206                          } );
207   
208                          if ( $column->type eq 'serial' ) {
209                            $column->type('int');
210                            $column->null('NULL');
211                          }
212                          #$column->default('')
213                          #  if $column->default =~ /^nextval\(/i;
214                          #( my $local = $column->local ) =~ s/AUTO_INCREMENT//i;
215                          #$column->local($local);
216                          $column;
217                        } $tableobj->columns
218                      ],
219     } );
220     $dbdef->addtable($h_tableobj);
221   }
222
223   $dbdef;
224
225 }
226
227 sub tables_hashref {
228
229   my $char_d = 80; #default maxlength for text fields
230
231   #my(@date_type)  = ( 'timestamp', '', ''     );
232   my @date_type  = ( 'int', 'NULL', ''     );
233   my @perl_type = ( 'text', 'NULL', ''  ); 
234   my @money_type = ( 'decimal',   '', '10,2' );
235
236   my $username_len = 32; #usernamemax config file
237
238   return {
239
240     'agent' => {
241       'columns' => [
242         'agentnum', 'serial',            '',     '',
243         'agent',    'varchar',           '',     $char_d,
244         'typenum',  'int',            '',     '',
245         'freq',     'int',       'NULL', '',
246         'prog',     @perl_type,
247         'disabled',     'char', 'NULL', 1,
248         'username', 'varchar',       'NULL',     $char_d,
249         '_password','varchar',       'NULL',     $char_d,
250       ],
251       'primary_key' => 'agentnum',
252       'unique' => [],
253       'index' => [ ['typenum'], ['disabled'] ],
254     },
255
256     'agent_type' => {
257       'columns' => [
258         'typenum',   'serial',  '', '',
259         'atype',     'varchar', '', $char_d,
260       ],
261       'primary_key' => 'typenum',
262       'unique' => [],
263       'index' => [],
264     },
265
266     'type_pkgs' => {
267       'columns' => [
268         'typepkgnum', 'serial', '', '',
269         'typenum',   'int',  '', '',
270         'pkgpart',   'int',  '', '',
271       ],
272       'primary_key' => 'typepkgnum',
273       'unique' => [ ['typenum', 'pkgpart'] ],
274       'index' => [ ['typenum'] ],
275     },
276
277     'cust_bill' => {
278       'columns' => [
279         'invnum',    'serial',  '', '',
280         'custnum',   'int',  '', '',
281         '_date',     @date_type,
282         'charged',   @money_type,
283         'printed',   'int',  '', '',
284         'closed',    'char', 'NULL', 1,
285       ],
286       'primary_key' => 'invnum',
287       'unique' => [],
288       'index' => [ ['custnum'], ['_date'] ],
289     },
290
291     'cust_bill_event' => {
292       'columns' => [
293         'eventnum',    'serial',  '', '',
294         'invnum',   'int',  '', '',
295         'eventpart',   'int',  '', '',
296         '_date',     @date_type,
297         'status', 'varchar', '', $char_d,
298         'statustext', 'text', 'NULL', '',
299       ],
300       'primary_key' => 'eventnum',
301       #no... there are retries now #'unique' => [ [ 'eventpart', 'invnum' ] ],
302       'unique' => [],
303       'index' => [ ['invnum'], ['status'] ],
304     },
305
306     'part_bill_event' => {
307       'columns' => [
308         'eventpart',    'serial',  '', '',
309         'payby',       'char',  '', 4,
310         'event',       'varchar',           '',     $char_d,
311         'eventcode',    @perl_type,
312         'seconds',     'int', 'NULL', '',
313         'weight',      'int', '', '',
314         'plan',       'varchar', 'NULL', $char_d,
315         'plandata',   'text', 'NULL', '',
316         'disabled',     'char', 'NULL', 1,
317       ],
318       'primary_key' => 'eventpart',
319       'unique' => [],
320       'index' => [ ['payby'], ['disabled'], ],
321     },
322
323     'cust_bill_pkg' => {
324       'columns' => [
325         'billpkgnum', 'serial', '', '',
326         'pkgnum',  'int', '', '',
327         'invnum',  'int', '', '',
328         'setup',   @money_type,
329         'recur',   @money_type,
330         'sdate',   @date_type,
331         'edate',   @date_type,
332         'itemdesc', 'varchar', 'NULL', $char_d,
333       ],
334       'primary_key' => 'billpkgnum',
335       'unique' => [],
336       'index' => [ ['invnum'] ],
337     },
338
339     'cust_bill_pkg_detail' => {
340       'columns' => [
341         'detailnum', 'serial', '', '',
342         'pkgnum',  'int', '', '',
343         'invnum',  'int', '', '',
344         'detail',  'varchar', '', $char_d,
345       ],
346       'primary_key' => 'detailnum',
347       'unique' => [],
348       'index' => [ [ 'pkgnum', 'invnum' ] ],
349     },
350
351     'cust_credit' => {
352       'columns' => [
353         'crednum',  'serial', '', '',
354         'custnum',  'int', '', '',
355         '_date',    @date_type,
356         'amount',   @money_type,
357         'otaker',   'varchar', '', 32,
358         'reason',   'text', 'NULL', '',
359         'closed',    'char', 'NULL', 1,
360       ],
361       'primary_key' => 'crednum',
362       'unique' => [],
363       'index' => [ ['custnum'] ],
364     },
365
366     'cust_credit_bill' => {
367       'columns' => [
368         'creditbillnum', 'serial', '', '',
369         'crednum',  'int', '', '',
370         'invnum',  'int', '', '',
371         '_date',    @date_type,
372         'amount',   @money_type,
373       ],
374       'primary_key' => 'creditbillnum',
375       'unique' => [],
376       'index' => [ ['crednum'], ['invnum'] ],
377     },
378
379     'cust_main' => {
380       'columns' => [
381         'custnum',  'serial',  '',     '',
382         'agentnum', 'int',  '',     '',
383 #        'titlenum', 'int',  'NULL',   '',
384         'last',     'varchar', '',     $char_d,
385 #        'middle',   'varchar', 'NULL', $char_d,
386         'first',    'varchar', '',     $char_d,
387         'ss',       'varchar', 'NULL', 11,
388         'company',  'varchar', 'NULL', $char_d,
389         'address1', 'varchar', '',     $char_d,
390         'address2', 'varchar', 'NULL', $char_d,
391         'city',     'varchar', '',     $char_d,
392         'county',   'varchar', 'NULL', $char_d,
393         'state',    'varchar', 'NULL', $char_d,
394         'zip',      'varchar', 'NULL', 10,
395         'country',  'char', '',     2,
396         'daytime',  'varchar', 'NULL', 20,
397         'night',    'varchar', 'NULL', 20,
398         'fax',      'varchar', 'NULL', 12,
399         'ship_last',     'varchar', 'NULL', $char_d,
400 #        'ship_middle',   'varchar', 'NULL', $char_d,
401         'ship_first',    'varchar', 'NULL', $char_d,
402         'ship_company',  'varchar', 'NULL', $char_d,
403         'ship_address1', 'varchar', 'NULL', $char_d,
404         'ship_address2', 'varchar', 'NULL', $char_d,
405         'ship_city',     'varchar', 'NULL', $char_d,
406         'ship_county',   'varchar', 'NULL', $char_d,
407         'ship_state',    'varchar', 'NULL', $char_d,
408         'ship_zip',      'varchar', 'NULL', 10,
409         'ship_country',  'char', 'NULL', 2,
410         'ship_daytime',  'varchar', 'NULL', 20,
411         'ship_night',    'varchar', 'NULL', 20,
412         'ship_fax',      'varchar', 'NULL', 12,
413         'payby',    'char', '',     4,
414         'payinfo',  'varchar', 'NULL', 512,
415         'paycvv',   'varchar', 'NULL', 512,
416         'paymask', 'varchar', 'NULL', $char_d,
417         #'paydate',  @date_type,
418         'paydate',  'varchar', 'NULL', 10,
419         'paystart_month', 'int', 'NULL', '',
420         'paystart_year',  'int', 'NULL', '',
421         'payissue', 'varchar', 'NULL', 2,
422         'payname',  'varchar', 'NULL', $char_d,
423         'payip',    'varchar', 'NULL', 15,
424         'tax',      'char', 'NULL', 1,
425         'otaker',   'varchar', '',    32,
426         'refnum',   'int',  '',     '',
427         'referral_custnum', 'int',  'NULL', '',
428         'comments', 'text', 'NULL', '',
429       ],
430       'primary_key' => 'custnum',
431       'unique' => [],
432       #'index' => [ ['last'], ['company'] ],
433       'index' => [ ['last'], [ 'company' ], [ 'referral_custnum' ],
434                    [ 'daytime' ], [ 'night' ], [ 'fax' ], [ 'refnum' ],
435                  ],
436     },
437
438     'cust_main_invoice' => {
439       'columns' => [
440         'destnum',  'serial',  '',     '',
441         'custnum',  'int',  '',     '',
442         'dest',     'varchar', '',  $char_d,
443       ],
444       'primary_key' => 'destnum',
445       'unique' => [],
446       'index' => [ ['custnum'], ],
447     },
448
449     'cust_main_county' => { #county+state+country are checked off the
450                             #cust_main_county for validation and to provide
451                             # a tax rate.
452       'columns' => [
453         'taxnum',   'serial',   '',    '',
454         'state',    'varchar',  'NULL',    $char_d,
455         'county',   'varchar',  'NULL',    $char_d,
456         'country',  'char',  '', 2, 
457         'taxclass',   'varchar', 'NULL', $char_d,
458         'exempt_amount', @money_type,
459         'tax',      'real',  '',    '', #tax %
460         'taxname',  'varchar',  'NULL',    $char_d,
461         'setuptax',  'char', 'NULL', 1, # Y = setup tax exempt
462         'recurtax',  'char', 'NULL', 1, # Y = recur tax exempt
463       ],
464       'primary_key' => 'taxnum',
465       'unique' => [],
466   #    'unique' => [ ['taxnum'], ['state', 'county'] ],
467       'index' => [],
468     },
469
470     'cust_pay' => {
471       'columns' => [
472         'paynum',   'serial',    '',   '',
473         #now cust_bill_pay #'invnum',   'int',    '',   '',
474         'custnum',  'int',    '',   '',
475         'paid',     @money_type,
476         '_date',    @date_type,
477         'payby',    'char',   '',     4, # CARD/BILL/COMP, should be index into
478                                          # payment type table.
479         'payinfo',  'varchar',   'NULL', $char_d,  #see cust_main above
480         'paybatch', 'varchar',   'NULL', $char_d, #for auditing purposes.
481         'closed',    'char', 'NULL', 1,
482       ],
483       'primary_key' => 'paynum',
484       'unique' => [],
485       'index' => [ [ 'custnum' ], [ 'paybatch' ], [ 'payby' ], [ '_date' ] ],
486     },
487
488     'cust_pay_void' => {
489       'columns' => [
490         'paynum',    'int',    '',   '',
491         'custnum',   'int',    '',   '',
492         'paid',      @money_type,
493         '_date',     @date_type,
494         'payby',     'char',   '',     4, # CARD/BILL/COMP, should be index into
495                                           # payment type table.
496         'payinfo',   'varchar',   'NULL', $char_d,  #see cust_main above
497         'paybatch',  'varchar',   'NULL', $char_d, #for auditing purposes.
498         'closed',    'char', 'NULL', 1,
499         'void_date', @date_type,
500         'reason',    'varchar',   'NULL', $char_d,
501         'otaker',   'varchar', '', 32,
502       ],
503       'primary_key' => 'paynum',
504       'unique' => [],
505       'index' => [ [ 'custnum' ] ],
506     },
507
508     'cust_bill_pay' => {
509       'columns' => [
510         'billpaynum', 'serial',     '',   '',
511         'invnum',  'int',     '',   '',
512         'paynum',  'int',     '',   '',
513         'amount',  @money_type,
514         '_date',   @date_type
515       ],
516       'primary_key' => 'billpaynum',
517       'unique' => [],
518       'index' => [ [ 'paynum' ], [ 'invnum' ] ],
519     },
520
521     'cust_pay_batch' => { #what's this used for again?  list of customers
522                           #in current CARD batch? (necessarily CARD?)
523       'columns' => [
524         'paybatchnum',   'serial',    '',   '',
525         'invnum',   'int',    '',   '',
526         'custnum',   'int',    '',   '',
527         'last',     'varchar', '',     $char_d,
528         'first',    'varchar', '',     $char_d,
529         'address1', 'varchar', '',     $char_d,
530         'address2', 'varchar', 'NULL', $char_d,
531         'city',     'varchar', '',     $char_d,
532         'state',    'varchar', 'NULL', $char_d,
533         'zip',      'varchar', 'NULL', 10,
534         'country',  'char', '',     2,
535 #        'trancode', 'int', '', '',
536         'cardnum',  'varchar', '',     16,
537         #'exp',      @date_type,
538         'exp',      'varchar', '',     11,
539         'payname',  'varchar', 'NULL', $char_d,
540         'amount',   @money_type,
541       ],
542       'primary_key' => 'paybatchnum',
543       'unique' => [],
544       'index' => [ ['invnum'], ['custnum'] ],
545     },
546
547     'cust_pkg' => {
548       'columns' => [
549         'pkgnum',    'serial',    '',   '',
550         'custnum',   'int',    '',   '',
551         'pkgpart',   'int',    '',   '',
552         'otaker',    'varchar', '', 32,
553         'setup',     @date_type,
554         'bill',      @date_type,
555         'last_bill', @date_type,
556         'susp',      @date_type,
557         'cancel',    @date_type,
558         'expire',    @date_type,
559         'manual_flag', 'char', 'NULL', 1,
560       ],
561       'primary_key' => 'pkgnum',
562       'unique' => [],
563       'index' => [ ['custnum'] ],
564     },
565
566     'cust_refund' => {
567       'columns' => [
568         'refundnum',    'serial',    '',   '',
569         #now cust_credit_refund #'crednum',      'int',    '',   '',
570         'custnum',  'int',    '',   '',
571         '_date',        @date_type,
572         'refund',       @money_type,
573         'otaker',       'varchar',   '',   32,
574         'reason',       'varchar',   '',   $char_d,
575         'payby',        'char',   '',     4, # CARD/BILL/COMP, should be index
576                                              # into payment type table.
577         'payinfo',      'varchar',   'NULL', $char_d,  #see cust_main above
578         'paybatch',     'varchar',   'NULL', $char_d,
579         'closed',    'char', 'NULL', 1,
580       ],
581       'primary_key' => 'refundnum',
582       'unique' => [],
583       'index' => [],
584     },
585
586     'cust_credit_refund' => {
587       'columns' => [
588         'creditrefundnum', 'serial',     '',   '',
589         'crednum',  'int',     '',   '',
590         'refundnum',  'int',     '',   '',
591         'amount',  @money_type,
592         '_date',   @date_type
593       ],
594       'primary_key' => 'creditrefundnum',
595       'unique' => [],
596       'index' => [ [ 'crednum', 'refundnum' ] ],
597     },
598
599
600     'cust_svc' => {
601       'columns' => [
602         'svcnum',    'serial',    '',   '',
603         'pkgnum',    'int',    'NULL',   '',
604         'svcpart',   'int',    '',   '',
605       ],
606       'primary_key' => 'svcnum',
607       'unique' => [],
608       'index' => [ ['svcnum'], ['pkgnum'], ['svcpart'] ],
609     },
610
611     'part_pkg' => {
612       'columns' => [
613         'pkgpart',    'serial',    '',   '',
614         'pkg',        'varchar',   '',   $char_d,
615         'comment',    'varchar',   '',   $char_d,
616         'promo_code', 'varchar', 'NULL', $char_d,
617         'setup',      @perl_type,
618         'freq',       'varchar',   '',   $char_d,  #billing frequency
619         'recur',      @perl_type,
620         'setuptax',  'char', 'NULL', 1,
621         'recurtax',  'char', 'NULL', 1,
622         'plan',       'varchar', 'NULL', $char_d,
623         'plandata',   'text', 'NULL', '',
624         'disabled',   'char', 'NULL', 1,
625         'taxclass',   'varchar', 'NULL', $char_d,
626       ],
627       'primary_key' => 'pkgpart',
628       'unique' => [],
629       'index' => [ [ 'promo_code' ], [ 'disabled' ] ],
630     },
631
632 #    'part_title' => {
633 #      'columns' => [
634 #        'titlenum',   'int',    '',   '',
635 #        'title',      'varchar',   '',   $char_d,
636 #      ],
637 #      'primary_key' => 'titlenum',
638 #      'unique' => [ [] ],
639 #      'index' => [ [] ],
640 #    },
641
642     'pkg_svc' => {
643       'columns' => [
644         'pkgsvcnum',  'serial', '',  '',
645         'pkgpart',    'int',    '',   '',
646         'svcpart',    'int',    '',   '',
647         'quantity',   'int',    '',   '',
648         'primary_svc','char', 'NULL',  1,
649       ],
650       'primary_key' => 'pkgsvcnum',
651       'unique' => [ ['pkgpart', 'svcpart'] ],
652       'index' => [ ['pkgpart'] ],
653     },
654
655     'part_referral' => {
656       'columns' => [
657         'refnum',   'serial',    '',   '',
658         'referral', 'varchar',   '',   $char_d,
659         'disabled',     'char', 'NULL', 1,
660       ],
661       'primary_key' => 'refnum',
662       'unique' => [],
663       'index' => [ ['disabled'] ],
664     },
665
666     'part_svc' => {
667       'columns' => [
668         'svcpart',    'serial',    '',   '',
669         'svc',        'varchar',   '',   $char_d,
670         'svcdb',      'varchar',   '',   $char_d,
671         'disabled',   'char',  'NULL',   1,
672       ],
673       'primary_key' => 'svcpart',
674       'unique' => [],
675       'index' => [ [ 'disabled' ] ],
676     },
677
678     'part_svc_column' => {
679       'columns' => [
680         'columnnum',   'serial',         '', '',
681         'svcpart',     'int',         '', '',
682         'columnname',  'varchar',     '', 64,
683         'columnvalue', 'varchar', 'NULL', $char_d,
684         'columnflag',  'char',    'NULL', 1, 
685       ],
686       'primary_key' => 'columnnum',
687       'unique' => [ [ 'svcpart', 'columnname' ] ],
688       'index' => [ [ 'svcpart' ] ],
689     },
690
691     #(this should be renamed to part_pop)
692     'svc_acct_pop' => {
693       'columns' => [
694         'popnum',    'serial',    '',   '',
695         'city',      'varchar',   '',   $char_d,
696         'state',     'varchar',   '',   $char_d,
697         'ac',        'char',   '',   3,
698         'exch',      'char',   '',   3,
699         'loc',       'char',   'NULL',   4, #NULL for legacy purposes
700       ],
701       'primary_key' => 'popnum',
702       'unique' => [],
703       'index' => [ [ 'state' ] ],
704     },
705
706     'part_pop_local' => {
707       'columns' => [
708         'localnum',  'serial',     '',     '',
709         'popnum',    'int',     '',     '',
710         'city',      'varchar', 'NULL', $char_d,
711         'state',     'char',    'NULL', 2,
712         'npa',       'char',    '',     3,
713         'nxx',       'char',    '',     3,
714       ],
715       'primary_key' => 'localnum',
716       'unique' => [],
717       'index' => [ [ 'npa', 'nxx' ], [ 'popnum' ] ],
718     },
719
720     'svc_acct' => {
721       'columns' => [
722         'svcnum',    'int',    '',   '',
723         'username',  'varchar',   '',   $username_len, #unique (& remove dup code)
724         '_password', 'varchar',   '',   72, #13 for encryped pw's plus ' *SUSPENDED* (md5 passwords can be 34, blowfish 60)
725         'sec_phrase', 'varchar',  'NULL',   $char_d,
726         'popnum',    'int',    'NULL',   '',
727         'uid',       'int', 'NULL',   '',
728         'gid',       'int', 'NULL',   '',
729         'finger',    'varchar',   'NULL',   $char_d,
730         'dir',       'varchar',   'NULL',   $char_d,
731         'shell',     'varchar',   'NULL',   $char_d,
732         'quota',     'varchar',   'NULL',   $char_d,
733         'slipip',    'varchar',   'NULL',   15, #four TINYINTs, bah.
734         'seconds',   'int', 'NULL',   '', #uhhhh
735         'domsvc',    'int', '',   '',
736       ],
737       'primary_key' => 'svcnum',
738       #'unique' => [ [ 'username', 'domsvc' ] ],
739       'unique' => [],
740       'index' => [ ['username'], ['domsvc'] ],
741     },
742
743     #'svc_charge' => {
744     #  'columns' => [
745     #    'svcnum',    'int',    '',   '',
746     #    'amount',    @money_type,
747     #  ],
748     #  'primary_key' => 'svcnum',
749     #  'unique' => [ [] ],
750     #  'index' => [ [] ],
751     #},
752
753     'svc_domain' => {
754       'columns' => [
755         'svcnum',    'int',    '',   '',
756         'domain',    'varchar',    '',   $char_d,
757         'catchall',  'int', 'NULL',    '',
758       ],
759       'primary_key' => 'svcnum',
760       'unique' => [ ['domain'] ],
761       'index' => [],
762     },
763
764     'domain_record' => {
765       'columns' => [
766         'recnum',    'serial',     '',  '',
767         'svcnum',    'int',     '',  '',
768         #'reczone',   'varchar', '',  $char_d,
769         'reczone',   'varchar', '',  255,
770         'recaf',     'char',    '',  2,
771         'rectype',   'varchar',    '',  5,
772         #'recdata',   'varchar', '',  $char_d,
773         'recdata',   'varchar', '',  255,
774       ],
775       'primary_key' => 'recnum',
776       'unique'      => [],
777       'index'       => [ ['svcnum'] ],
778     },
779
780     'svc_forward' => {
781       'columns' => [
782         'svcnum',   'int',            '',   '',
783         'srcsvc',   'int',        'NULL',   '',
784         'src',      'varchar',    'NULL',  255,
785         'dstsvc',   'int',        'NULL',   '',
786         'dst',      'varchar',    'NULL',  255,
787       ],
788       'primary_key' => 'svcnum',
789       'unique'      => [],
790       'index'       => [ ['srcsvc'], ['dstsvc'] ],
791     },
792
793     'svc_www' => {
794       'columns' => [
795         'svcnum',   'int',    '',  '',
796         'recnum',   'int',    '',  '',
797         'usersvc',  'int',    '',  '',
798       ],
799       'primary_key' => 'svcnum',
800       'unique'      => [],
801       'index'       => [],
802     },
803
804     #'svc_wo' => {
805     #  'columns' => [
806     #    'svcnum',    'int',    '',   '',
807     #    'svcnum',    'int',    '',   '',
808     #    'svcnum',    'int',    '',   '',
809     #    'worker',    'varchar',   '',   $char_d,
810     #    '_date',     @date_type,
811     #  ],
812     #  'primary_key' => 'svcnum',
813     #  'unique' => [ [] ],
814     #  'index' => [ [] ],
815     #},
816
817     'prepay_credit' => {
818       'columns' => [
819         'prepaynum',   'serial',     '',   '',
820         'identifier',  'varchar', '', $char_d,
821         'amount',      @money_type,
822         'seconds',     'int',     'NULL', '',
823         'agentnum',    'int',     'NULL', '',
824       ],
825       'primary_key' => 'prepaynum',
826       'unique'      => [ ['identifier'] ],
827       'index'       => [],
828     },
829
830     'port' => {
831       'columns' => [
832         'portnum',  'serial',     '',   '',
833         'ip',       'varchar', 'NULL', 15,
834         'nasport',  'int',     'NULL', '',
835         'nasnum',   'int',     '',   '',
836       ],
837       'primary_key' => 'portnum',
838       'unique'      => [],
839       'index'       => [],
840     },
841
842     'nas' => {
843       'columns' => [
844         'nasnum',   'serial',     '',    '',
845         'nas',      'varchar', '',    $char_d,
846         'nasip',    'varchar', '',    15,
847         'nasfqdn',  'varchar', '',    $char_d,
848         'last',     'int',     '',    '',
849       ],
850       'primary_key' => 'nasnum',
851       'unique'      => [ [ 'nas' ], [ 'nasip' ] ],
852       'index'       => [ [ 'last' ] ],
853     },
854
855     'session' => {
856       'columns' => [
857         'sessionnum', 'serial',       '',   '',
858         'portnum',    'int',       '',   '',
859         'svcnum',     'int',       '',   '',
860         'login',      @date_type,
861         'logout',     @date_type,
862       ],
863       'primary_key' => 'sessionnum',
864       'unique'      => [],
865       'index'       => [ [ 'portnum' ] ],
866     },
867
868     'queue' => {
869       'columns' => [
870         'jobnum', 'serial', '', '',
871         'job', 'text', '', '',
872         '_date', 'int', '', '',
873         'status', 'varchar', '', $char_d,
874         'statustext', 'text', 'NULL', '',
875         'svcnum', 'int', 'NULL', '',
876       ],
877       'primary_key' => 'jobnum',
878       'unique'      => [],
879       'index'       => [ [ 'svcnum' ], [ 'status' ] ],
880     },
881
882     'queue_arg' => {
883       'columns' => [
884         'argnum', 'serial', '', '',
885         'jobnum', 'int', '', '',
886         'arg', 'text', 'NULL', '',
887       ],
888       'primary_key' => 'argnum',
889       'unique'      => [],
890       'index'       => [ [ 'jobnum' ] ],
891     },
892
893     'queue_depend' => {
894       'columns' => [
895         'dependnum', 'serial', '', '',
896         'jobnum', 'int', '', '',
897         'depend_jobnum', 'int', '', '',
898       ],
899       'primary_key' => 'dependnum',
900       'unique'      => [],
901       'index'       => [ [ 'jobnum' ], [ 'depend_jobnum' ] ],
902     },
903
904     'export_svc' => {
905       'columns' => [
906         'exportsvcnum' => 'serial', '', '',
907         'exportnum'    => 'int', '', '',
908         'svcpart'      => 'int', '', '',
909       ],
910       'primary_key' => 'exportsvcnum',
911       'unique'      => [ [ 'exportnum', 'svcpart' ] ],
912       'index'       => [ [ 'exportnum' ], [ 'svcpart' ] ],
913     },
914
915     'part_export' => {
916       'columns' => [
917         'exportnum', 'serial', '', '',
918         #'svcpart',   'int', '', '',
919         'machine', 'varchar', '', $char_d,
920         'exporttype', 'varchar', '', $char_d,
921         'nodomain',     'char', 'NULL', 1,
922       ],
923       'primary_key' => 'exportnum',
924       'unique'      => [],
925       'index'       => [ [ 'machine' ], [ 'exporttype' ] ],
926     },
927
928     'part_export_option' => {
929       'columns' => [
930         'optionnum', 'serial', '', '',
931         'exportnum', 'int', '', '',
932         'optionname', 'varchar', '', $char_d,
933         'optionvalue', 'text', 'NULL', '',
934       ],
935       'primary_key' => 'optionnum',
936       'unique'      => [],
937       'index'       => [ [ 'exportnum' ], [ 'optionname' ] ],
938     },
939
940     'radius_usergroup' => {
941       'columns' => [
942         'usergroupnum', 'serial', '', '',
943         'svcnum',       'int', '', '',
944         'groupname',    'varchar', '', $char_d,
945       ],
946       'primary_key' => 'usergroupnum',
947       'unique'      => [],
948       'index'       => [ [ 'svcnum' ], [ 'groupname' ] ],
949     },
950
951     'msgcat' => {
952       'columns' => [
953         'msgnum', 'serial', '', '',
954         'msgcode', 'varchar', '', $char_d,
955         'locale', 'varchar', '', 16,
956         'msg', 'text', '', '',
957       ],
958       'primary_key' => 'msgnum',
959       'unique'      => [ [ 'msgcode', 'locale' ] ],
960       'index'       => [],
961     },
962
963     'cust_tax_exempt' => {
964       'columns' => [
965         'exemptnum', 'serial', '', '',
966         'custnum',   'int', '', '',
967         'taxnum',    'int', '', '',
968         'year',      'int', '', '',
969         'month',     'int', '', '',
970         'amount',   @money_type,
971       ],
972       'primary_key' => 'exemptnum',
973       'unique'      => [ [ 'custnum', 'taxnum', 'year', 'month' ] ],
974       'index'       => [],
975     },
976
977     'router' => {
978       'columns' => [
979         'routernum', 'serial', '', '',
980         'routername', 'varchar', '', $char_d,
981         'svcnum', 'int', 'NULL', '',
982       ],
983       'primary_key' => 'routernum',
984       'unique'      => [],
985       'index'       => [],
986     },
987
988     'part_svc_router' => {
989       'columns' => [
990         'svcrouternum', 'serial', '', '',
991         'svcpart', 'int', '', '',
992         'routernum', 'int', '', '',
993       ],
994       'primary_key' => 'svcrouternum',
995       'unique'      => [],
996       'index'       => [],
997     },
998
999     'addr_block' => {
1000       'columns' => [
1001         'blocknum', 'serial', '', '',
1002         'routernum', 'int', '', '',
1003         'ip_gateway', 'varchar', '', 15,
1004         'ip_netmask', 'int', '', '',
1005       ],
1006       'primary_key' => 'blocknum',
1007       'unique'      => [ [ 'blocknum', 'routernum' ] ],
1008       'index'       => [],
1009     },
1010
1011     'svc_broadband' => {
1012       'columns' => [
1013         'svcnum', 'int', '', '',
1014         'blocknum', 'int', '', '',
1015         'speed_up', 'int', '', '',
1016         'speed_down', 'int', '', '',
1017         'ip_addr', 'varchar', '', 15,
1018       ],
1019       'primary_key' => 'svcnum',
1020       'unique'      => [],
1021       'index'       => [],
1022     },
1023
1024     'part_virtual_field' => {
1025       'columns' => [
1026         'vfieldpart', 'int', '', '',
1027         'dbtable', 'varchar', '', 32,
1028         'name', 'varchar', '', 32,
1029         'check_block', 'text', 'NULL', '',
1030         'length', 'int', 'NULL', '',
1031         'list_source', 'text', 'NULL', '',
1032         'label', 'varchar', 'NULL', 80,
1033       ],
1034       'primary_key' => 'vfieldpart',
1035       'unique' => [],
1036       'index' => [],
1037     },
1038
1039     'virtual_field' => {
1040       'columns' => [
1041         'vfieldnum', 'serial', '', '',
1042         'recnum', 'int', '', '',
1043         'vfieldpart', 'int', '', '',
1044         'value', 'varchar', '', 128,
1045       ],
1046       'primary_key' => 'vfieldnum',
1047       'unique' => [ [ 'vfieldpart', 'recnum' ] ],
1048       'index' => [],
1049     },
1050
1051     'acct_snarf' => {
1052       'columns' => [
1053         'snarfnum',  'int', '', '',
1054         'svcnum',    'int', '', '',
1055         'machine',   'varchar', '', 255,
1056         'protocol',  'varchar', '', $char_d,
1057         'username',  'varchar', '', $char_d,
1058         '_password', 'varchar', '', $char_d,
1059       ],
1060       'primary_key' => 'snarfnum',
1061       'unique' => [],
1062       'index'  => [ [ 'svcnum' ] ],
1063     },
1064
1065     'svc_external' => {
1066       'columns' => [
1067         'svcnum', 'int', '', '',
1068         'id',     'int', 'NULL', '',
1069         'title',  'varchar', 'NULL', $char_d,
1070       ],
1071       'primary_key' => 'svcnum',
1072       'unique'      => [],
1073       'index'       => [],
1074     },
1075
1076     'cust_pay_refund' => {
1077       'columns' => [
1078         'payrefundnum', 'serial', '', '',
1079         'paynum',  'int', '', '',
1080         'refundnum',  'int', '', '',
1081         '_date',    @date_type,
1082         'amount',   @money_type,
1083       ],
1084       'primary_key' => 'payrefundnum',
1085       'unique' => [],
1086       'index' => [ ['paynum'], ['refundnum'] ],
1087     },
1088
1089     'part_pkg_option' => {
1090       'columns' => [
1091         'optionnum', 'serial', '', '',
1092         'pkgpart', 'int', '', '',
1093         'optionname', 'varchar', '', $char_d,
1094         'optionvalue', 'text', 'NULL', '',
1095       ],
1096       'primary_key' => 'optionnum',
1097       'unique'      => [],
1098       'index'       => [ [ 'pkgpart' ], [ 'optionname' ] ],
1099     },
1100
1101     'rate' => {
1102       'columns' => [
1103         'ratenum',  'serial', '', '',
1104         'ratename', 'varchar', '', $char_d,
1105       ],
1106       'primary_key' => 'ratenum',
1107       'unique'      => [],
1108       'index'       => [],
1109     },
1110
1111     'rate_detail' => {
1112       'columns' => [
1113         'ratedetailnum',   'serial', '', '',
1114         'ratenum',         'int',     '', '',
1115         'orig_regionnum',  'int', 'NULL', '',
1116         'dest_regionnum',  'int',     '', '',
1117         'min_included',    'int',     '', '',
1118         'min_charge',      @money_type,
1119         'sec_granularity', 'int',     '', '',
1120         #time period (link to table of periods)?
1121       ],
1122       'primary_key' => 'ratedetailnum',
1123       'unique'      => [ [ 'ratenum', 'orig_regionnum', 'dest_regionnum' ] ],
1124       'index'       => [],
1125     },
1126
1127     'rate_region' => {
1128       'columns' => [
1129         'regionnum',   'serial',      '', '',
1130         'regionname',  'varchar',     '', $char_d,
1131       ],
1132       'primary_key' => 'regionnum',
1133       'unique'      => [],
1134       'index'       => [],
1135     },
1136
1137     'rate_prefix' => {
1138       'columns' => [
1139         'prefixnum',   'serial',    '', '',
1140         'regionnum',   'int',       '', '',,
1141         'countrycode', 'varchar',     '', 3,
1142         'npa',         'varchar', 'NULL', 6,
1143         'nxx',         'varchar', 'NULL', 3,
1144       ],
1145       'primary_key' => 'prefixnum',
1146       'unique'      => [],
1147       'index'       => [ [ 'countrycode' ], [ 'regionnum' ] ],
1148     },
1149
1150     'reg_code' => {
1151       'columns' => [
1152         'codenum',   'serial',    '', '',
1153         'code',      'varchar',   '', $char_d,
1154         'agentnum',  'int',       '', '',
1155       ],
1156       'primary_key' => 'codenum',
1157       'unique'      => [ [ 'agentnum', 'code' ] ],
1158       'index'       => [ [ 'agentnum' ] ],
1159     },
1160
1161     'reg_code_pkg' => {
1162       'columns' => [
1163         'codepkgnum', 'serial', '', '',
1164         'codenum',   'int',    '', '',
1165         'pkgpart',   'int',    '', '',
1166       ],
1167       'primary_key' => 'codepkgnum',
1168       'unique'      => [ [ 'codenum', 'pkgpart' ] ],
1169       'index'       => [ [ 'codenum' ] ],
1170     },
1171
1172     'clientapi_session' => {
1173       'columns' => [
1174         'sessionnum',  'serial',  '', '',
1175         'sessionid',  'varchar',  '', $char_d,
1176         'namespace',  'varchar',  '', $char_d,
1177       ],
1178       'primary_key' => 'sessionnum',
1179       'unique'      => [ [ 'sessionid', 'namespace' ] ],
1180       'index'       => [],
1181     },
1182
1183     'clientapi_session_field' => {
1184       'columns' => [
1185         'fieldnum',    'serial',     '', '',
1186         'sessionnum',     'int',     '', '',
1187         'fieldname',  'varchar',     '', $char_d,
1188         'fieldvalue',    'text', 'NULL', '',
1189       ],
1190       'primary_key' => 'fieldnum',
1191       'unique'      => [ [ 'sessionnum', 'fieldname' ] ],
1192       'index'       => [],
1193     },
1194
1195     'payment_gateway' => {
1196       'columns' => [
1197         'gatewaynum',       'serial',   '',     '',
1198         'gateway_module',   'varchar',  '',     $char_d,
1199         'gateway_username', 'varchar',  'NULL', $char_d,
1200         'gateway_password', 'varchar',  'NULL', $char_d,
1201         'gateway_action',   'varchar',  'NULL', $char_d,
1202         'disabled',   'char',  'NULL',   1,
1203       ],
1204       'primary_key' => 'gatewaynum',
1205       'unique' => [],
1206       'index'  => [ [ 'disabled' ] ],
1207     },
1208
1209     'payment_gateway_option' => {
1210       'columns' => [
1211         'optionnum',   'serial',  '',     '',
1212         'gatewaynum',  'int',     '',     '',
1213         'optionname',  'varchar', '',     $char_d,
1214         'optionvalue', 'text',    'NULL', '',
1215       ],
1216       'primary_key' => 'optionnum',
1217       'unique'      => [],
1218       'index'       => [ [ 'gatewaynum' ], [ 'optionname' ] ],
1219     },
1220
1221     'agent_payment_gateway' => {
1222       'columns' => [
1223         'agentgatewaynum', 'serial', '', '',
1224         'agentnum',        'int', '', '',
1225         'gatewaynum',      'int', '', '',
1226         'cardtype',        'varchar', 'NULL', $char_d,
1227         'taxclass',        'varchar', 'NULL', $char_d,
1228       ],
1229       'primary_key' => 'agentgatewaynum',
1230       'unique'      => [],
1231       'index'       => [ [ 'agentnum', 'cardtype' ], ],
1232     },
1233
1234     'banned_pay' => {
1235       'columns' => [
1236         'bannum',  'serial',   '',     '',
1237         'payby',   'char',     '',       4,
1238         'payinfo', 'varchar',  '',     128, #say, a 512-big digest _hex encoded
1239         #'paymask', 'varchar',  'NULL', $char_d,
1240         '_date',   @date_type,
1241         'otaker',  'varchar',  '',     32,
1242         'reason',  'varchar',  'NULL', $char_d,
1243       ],
1244       'primary_key' => 'bannum',
1245       'unique'      => [ [ 'payby', 'payinfo' ] ],
1246       'index'       => [],
1247     },
1248
1249     'cancel_reason' => {
1250       'columns' => [
1251         'reasonnum', 'serial',  '',     '',
1252         'reason',    'varchar', '',     $char_d,
1253         'disabled',  'char',    'NULL', 1,
1254       ],
1255       'primary_key' => 'reasonnum',
1256       'unique' => [],
1257       'index'  => [ [ 'disabled' ] ],
1258     },
1259
1260   };
1261
1262 }
1263
1264 =back
1265
1266 =head1 BUGS
1267
1268 =head1 SEE ALSO
1269
1270 L<DBIx::DBSchema>
1271
1272 =cut
1273
1274 1;
1275