add banned credit card / ACH table, re-do cancel popup to have a checkbox to ban...
[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   return {
237
238     'agent' => {
239       'columns' => [
240         'agentnum', 'serial',            '',     '',
241         'agent',    'varchar',           '',     $char_d,
242         'typenum',  'int',            '',     '',
243         'freq',     'int',       'NULL', '',
244         'prog',     @perl_type,
245         'disabled',     'char', 'NULL', 1,
246         'username', 'varchar',       'NULL',     $char_d,
247         '_password','varchar',       'NULL',     $char_d,
248       ],
249       'primary_key' => 'agentnum',
250       'unique' => [],
251       'index' => [ ['typenum'], ['disabled'] ],
252     },
253
254     'agent_type' => {
255       'columns' => [
256         'typenum',   'serial',  '', '',
257         'atype',     'varchar', '', $char_d,
258       ],
259       'primary_key' => 'typenum',
260       'unique' => [],
261       'index' => [],
262     },
263
264     'type_pkgs' => {
265       'columns' => [
266         'typepkgnum', 'serial', '', '',
267         'typenum',   'int',  '', '',
268         'pkgpart',   'int',  '', '',
269       ],
270       'primary_key' => 'typepkgnum',
271       'unique' => [ ['typenum', 'pkgpart'] ],
272       'index' => [ ['typenum'] ],
273     },
274
275     'cust_bill' => {
276       'columns' => [
277         'invnum',    'serial',  '', '',
278         'custnum',   'int',  '', '',
279         '_date',     @date_type,
280         'charged',   @money_type,
281         'printed',   'int',  '', '',
282         'closed',    'char', 'NULL', 1,
283       ],
284       'primary_key' => 'invnum',
285       'unique' => [],
286       'index' => [ ['custnum'], ['_date'] ],
287     },
288
289     'cust_bill_event' => {
290       'columns' => [
291         'eventnum',    'serial',  '', '',
292         'invnum',   'int',  '', '',
293         'eventpart',   'int',  '', '',
294         '_date',     @date_type,
295         'status', 'varchar', '', $char_d,
296         'statustext', 'text', 'NULL', '',
297       ],
298       'primary_key' => 'eventnum',
299       #no... there are retries now #'unique' => [ [ 'eventpart', 'invnum' ] ],
300       'unique' => [],
301       'index' => [ ['invnum'], ['status'] ],
302     },
303
304     'part_bill_event' => {
305       'columns' => [
306         'eventpart',    'serial',  '', '',
307         'payby',       'char',  '', 4,
308         'event',       'varchar',           '',     $char_d,
309         'eventcode',    @perl_type,
310         'seconds',     'int', 'NULL', '',
311         'weight',      'int', '', '',
312         'plan',       'varchar', 'NULL', $char_d,
313         'plandata',   'text', 'NULL', '',
314         'disabled',     'char', 'NULL', 1,
315       ],
316       'primary_key' => 'eventpart',
317       'unique' => [],
318       'index' => [ ['payby'], ['disabled'], ],
319     },
320
321     'cust_bill_pkg' => {
322       'columns' => [
323         'billpkgnum', 'serial', '', '',
324         'pkgnum',  'int', '', '',
325         'invnum',  'int', '', '',
326         'setup',   @money_type,
327         'recur',   @money_type,
328         'sdate',   @date_type,
329         'edate',   @date_type,
330         'itemdesc', 'varchar', 'NULL', $char_d,
331       ],
332       'primary_key' => 'billpkgnum',
333       'unique' => [],
334       'index' => [ ['invnum'] ],
335     },
336
337     'cust_bill_pkg_detail' => {
338       'columns' => [
339         'detailnum', 'serial', '', '',
340         'pkgnum',  'int', '', '',
341         'invnum',  'int', '', '',
342         'detail',  'varchar', '', $char_d,
343       ],
344       'primary_key' => 'detailnum',
345       'unique' => [],
346       'index' => [ [ 'pkgnum', 'invnum' ] ],
347     },
348
349     'cust_credit' => {
350       'columns' => [
351         'crednum',  'serial', '', '',
352         'custnum',  'int', '', '',
353         '_date',    @date_type,
354         'amount',   @money_type,
355         'otaker',   'varchar', '', 32,
356         'reason',   'text', 'NULL', '',
357         'closed',    'char', 'NULL', 1,
358       ],
359       'primary_key' => 'crednum',
360       'unique' => [],
361       'index' => [ ['custnum'] ],
362     },
363
364     'cust_credit_bill' => {
365       'columns' => [
366         'creditbillnum', 'serial', '', '',
367         'crednum',  'int', '', '',
368         'invnum',  'int', '', '',
369         '_date',    @date_type,
370         'amount',   @money_type,
371       ],
372       'primary_key' => 'creditbillnum',
373       'unique' => [],
374       'index' => [ ['crednum'], ['invnum'] ],
375     },
376
377     'cust_main' => {
378       'columns' => [
379         'custnum',  'serial',  '',     '',
380         'agentnum', 'int',  '',     '',
381 #        'titlenum', 'int',  'NULL',   '',
382         'last',     'varchar', '',     $char_d,
383 #        'middle',   'varchar', 'NULL', $char_d,
384         'first',    'varchar', '',     $char_d,
385         'ss',       'varchar', 'NULL', 11,
386         'company',  'varchar', 'NULL', $char_d,
387         'address1', 'varchar', '',     $char_d,
388         'address2', 'varchar', 'NULL', $char_d,
389         'city',     'varchar', '',     $char_d,
390         'county',   'varchar', 'NULL', $char_d,
391         'state',    'varchar', 'NULL', $char_d,
392         'zip',      'varchar', 'NULL', 10,
393         'country',  'char', '',     2,
394         'daytime',  'varchar', 'NULL', 20,
395         'night',    'varchar', 'NULL', 20,
396         'fax',      'varchar', 'NULL', 12,
397         'ship_last',     'varchar', 'NULL', $char_d,
398 #        'ship_middle',   'varchar', 'NULL', $char_d,
399         'ship_first',    'varchar', 'NULL', $char_d,
400         'ship_company',  'varchar', 'NULL', $char_d,
401         'ship_address1', 'varchar', 'NULL', $char_d,
402         'ship_address2', 'varchar', 'NULL', $char_d,
403         'ship_city',     'varchar', 'NULL', $char_d,
404         'ship_county',   'varchar', 'NULL', $char_d,
405         'ship_state',    'varchar', 'NULL', $char_d,
406         'ship_zip',      'varchar', 'NULL', 10,
407         'ship_country',  'char', 'NULL', 2,
408         'ship_daytime',  'varchar', 'NULL', 20,
409         'ship_night',    'varchar', 'NULL', 20,
410         'ship_fax',      'varchar', 'NULL', 12,
411         'payby',    'char', '',     4,
412         'payinfo',  'varchar', 'NULL', 512,
413         'paycvv',   'varchar', 'NULL', 512,
414         'paymask', 'varchar', 'NULL', $char_d,
415         #'paydate',  @date_type,
416         'paydate',  'varchar', 'NULL', 10,
417         'paystart_month', 'int', 'NULL', '',
418         'paystart_year',  'int', 'NULL', '',
419         'payissue', 'varchar', 'NULL', 2,
420         'payname',  'varchar', 'NULL', $char_d,
421         'payip',    'varchar', 'NULL', 15,
422         'tax',      'char', 'NULL', 1,
423         'otaker',   'varchar', '',    32,
424         'refnum',   'int',  '',     '',
425         'referral_custnum', 'int',  'NULL', '',
426         'comments', 'text', 'NULL', '',
427       ],
428       'primary_key' => 'custnum',
429       'unique' => [],
430       #'index' => [ ['last'], ['company'] ],
431       'index' => [ ['last'], [ 'company' ], [ 'referral_custnum' ],
432                    [ 'daytime' ], [ 'night' ], [ 'fax' ], [ 'refnum' ],
433                  ],
434     },
435
436     'cust_main_invoice' => {
437       'columns' => [
438         'destnum',  'serial',  '',     '',
439         'custnum',  'int',  '',     '',
440         'dest',     'varchar', '',  $char_d,
441       ],
442       'primary_key' => 'destnum',
443       'unique' => [],
444       'index' => [ ['custnum'], ],
445     },
446
447     'cust_main_county' => { #county+state+country are checked off the
448                             #cust_main_county for validation and to provide
449                             # a tax rate.
450       'columns' => [
451         'taxnum',   'serial',   '',    '',
452         'state',    'varchar',  'NULL',    $char_d,
453         'county',   'varchar',  'NULL',    $char_d,
454         'country',  'char',  '', 2, 
455         'taxclass',   'varchar', 'NULL', $char_d,
456         'exempt_amount', @money_type,
457         'tax',      'real',  '',    '', #tax %
458         'taxname',  'varchar',  'NULL',    $char_d,
459         'setuptax',  'char', 'NULL', 1, # Y = setup tax exempt
460         'recurtax',  'char', 'NULL', 1, # Y = recur tax exempt
461       ],
462       'primary_key' => 'taxnum',
463       'unique' => [],
464   #    'unique' => [ ['taxnum'], ['state', 'county'] ],
465       'index' => [],
466     },
467
468     'cust_pay' => {
469       'columns' => [
470         'paynum',   'serial',    '',   '',
471         #now cust_bill_pay #'invnum',   'int',    '',   '',
472         'custnum',  'int',    '',   '',
473         'paid',     @money_type,
474         '_date',    @date_type,
475         'payby',    'char',   '',     4, # CARD/BILL/COMP, should be index into
476                                          # payment type table.
477         'payinfo',  'varchar',   'NULL', $char_d,  #see cust_main above
478         'paybatch', 'varchar',   'NULL', $char_d, #for auditing purposes.
479         'closed',    'char', 'NULL', 1,
480       ],
481       'primary_key' => 'paynum',
482       'unique' => [],
483       'index' => [ [ 'custnum' ], [ 'paybatch' ], [ 'payby' ], [ '_date' ] ],
484     },
485
486     'cust_pay_void' => {
487       'columns' => [
488         'paynum',    'int',    '',   '',
489         'custnum',   'int',    '',   '',
490         'paid',      @money_type,
491         '_date',     @date_type,
492         'payby',     'char',   '',     4, # CARD/BILL/COMP, should be index into
493                                           # payment type table.
494         'payinfo',   'varchar',   'NULL', $char_d,  #see cust_main above
495         'paybatch',  'varchar',   'NULL', $char_d, #for auditing purposes.
496         'closed',    'char', 'NULL', 1,
497         'void_date', @date_type,
498         'reason',    'varchar',   'NULL', $char_d,
499         'otaker',   'varchar', '', 32,
500       ],
501       'primary_key' => 'paynum',
502       'unique' => [],
503       'index' => [ [ 'custnum' ] ],
504     },
505
506     'cust_bill_pay' => {
507       'columns' => [
508         'billpaynum', 'serial',     '',   '',
509         'invnum',  'int',     '',   '',
510         'paynum',  'int',     '',   '',
511         'amount',  @money_type,
512         '_date',   @date_type
513       ],
514       'primary_key' => 'billpaynum',
515       'unique' => [],
516       'index' => [ [ 'paynum' ], [ 'invnum' ] ],
517     },
518
519     'cust_pay_batch' => { #what's this used for again?  list of customers
520                           #in current CARD batch? (necessarily CARD?)
521       'columns' => [
522         'paybatchnum',   'serial',    '',   '',
523         'invnum',   'int',    '',   '',
524         'custnum',   'int',    '',   '',
525         'last',     'varchar', '',     $char_d,
526         'first',    'varchar', '',     $char_d,
527         'address1', 'varchar', '',     $char_d,
528         'address2', 'varchar', 'NULL', $char_d,
529         'city',     'varchar', '',     $char_d,
530         'state',    'varchar', 'NULL', $char_d,
531         'zip',      'varchar', 'NULL', 10,
532         'country',  'char', '',     2,
533 #        'trancode', 'int', '', '',
534         'cardnum',  'varchar', '',     16,
535         #'exp',      @date_type,
536         'exp',      'varchar', '',     11,
537         'payname',  'varchar', 'NULL', $char_d,
538         'amount',   @money_type,
539       ],
540       'primary_key' => 'paybatchnum',
541       'unique' => [],
542       'index' => [ ['invnum'], ['custnum'] ],
543     },
544
545     'cust_pkg' => {
546       'columns' => [
547         'pkgnum',    'serial',    '',   '',
548         'custnum',   'int',    '',   '',
549         'pkgpart',   'int',    '',   '',
550         'otaker',    'varchar', '', 32,
551         'setup',     @date_type,
552         'bill',      @date_type,
553         'last_bill', @date_type,
554         'susp',      @date_type,
555         'cancel',    @date_type,
556         'expire',    @date_type,
557         'manual_flag', 'char', 'NULL', 1,
558       ],
559       'primary_key' => 'pkgnum',
560       'unique' => [],
561       'index' => [ ['custnum'] ],
562     },
563
564     'cust_refund' => {
565       'columns' => [
566         'refundnum',    'serial',    '',   '',
567         #now cust_credit_refund #'crednum',      'int',    '',   '',
568         'custnum',  'int',    '',   '',
569         '_date',        @date_type,
570         'refund',       @money_type,
571         'otaker',       'varchar',   '',   32,
572         'reason',       'varchar',   '',   $char_d,
573         'payby',        'char',   '',     4, # CARD/BILL/COMP, should be index
574                                              # into payment type table.
575         'payinfo',      'varchar',   'NULL', $char_d,  #see cust_main above
576         'paybatch',     'varchar',   'NULL', $char_d,
577         'closed',    'char', 'NULL', 1,
578       ],
579       'primary_key' => 'refundnum',
580       'unique' => [],
581       'index' => [],
582     },
583
584     'cust_credit_refund' => {
585       'columns' => [
586         'creditrefundnum', 'serial',     '',   '',
587         'crednum',  'int',     '',   '',
588         'refundnum',  'int',     '',   '',
589         'amount',  @money_type,
590         '_date',   @date_type
591       ],
592       'primary_key' => 'creditrefundnum',
593       'unique' => [],
594       'index' => [ [ 'crednum', 'refundnum' ] ],
595     },
596
597
598     'cust_svc' => {
599       'columns' => [
600         'svcnum',    'serial',    '',   '',
601         'pkgnum',    'int',    'NULL',   '',
602         'svcpart',   'int',    '',   '',
603       ],
604       'primary_key' => 'svcnum',
605       'unique' => [],
606       'index' => [ ['svcnum'], ['pkgnum'], ['svcpart'] ],
607     },
608
609     'part_pkg' => {
610       'columns' => [
611         'pkgpart',    'serial',    '',   '',
612         'pkg',        'varchar',   '',   $char_d,
613         'comment',    'varchar',   '',   $char_d,
614         'promo_code', 'varchar', 'NULL', $char_d,
615         'setup',      @perl_type,
616         'freq',       'varchar',   '',   $char_d,  #billing frequency
617         'recur',      @perl_type,
618         'setuptax',  'char', 'NULL', 1,
619         'recurtax',  'char', 'NULL', 1,
620         'plan',       'varchar', 'NULL', $char_d,
621         'plandata',   'text', 'NULL', '',
622         'disabled',   'char', 'NULL', 1,
623         'taxclass',   'varchar', 'NULL', $char_d,
624       ],
625       'primary_key' => 'pkgpart',
626       'unique' => [],
627       'index' => [ [ 'promo_code' ], [ 'disabled' ] ],
628     },
629
630 #    'part_title' => {
631 #      'columns' => [
632 #        'titlenum',   'int',    '',   '',
633 #        'title',      'varchar',   '',   $char_d,
634 #      ],
635 #      'primary_key' => 'titlenum',
636 #      'unique' => [ [] ],
637 #      'index' => [ [] ],
638 #    },
639
640     'pkg_svc' => {
641       'columns' => [
642         'pkgsvcnum',  'serial', '',  '',
643         'pkgpart',    'int',    '',   '',
644         'svcpart',    'int',    '',   '',
645         'quantity',   'int',    '',   '',
646         'primary_svc','char', 'NULL',  1,
647       ],
648       'primary_key' => 'pkgsvcnum',
649       'unique' => [ ['pkgpart', 'svcpart'] ],
650       'index' => [ ['pkgpart'] ],
651     },
652
653     'part_referral' => {
654       'columns' => [
655         'refnum',   'serial',    '',   '',
656         'referral', 'varchar',   '',   $char_d,
657         'disabled',     'char', 'NULL', 1,
658       ],
659       'primary_key' => 'refnum',
660       'unique' => [],
661       'index' => [ ['disabled'] ],
662     },
663
664     'part_svc' => {
665       'columns' => [
666         'svcpart',    'serial',    '',   '',
667         'svc',        'varchar',   '',   $char_d,
668         'svcdb',      'varchar',   '',   $char_d,
669         'disabled',   'char',  'NULL',   1,
670       ],
671       'primary_key' => 'svcpart',
672       'unique' => [],
673       'index' => [ [ 'disabled' ] ],
674     },
675
676     'part_svc_column' => {
677       'columns' => [
678         'columnnum',   'serial',         '', '',
679         'svcpart',     'int',         '', '',
680         'columnname',  'varchar',     '', 64,
681         'columnvalue', 'varchar', 'NULL', $char_d,
682         'columnflag',  'char',    'NULL', 1, 
683       ],
684       'primary_key' => 'columnnum',
685       'unique' => [ [ 'svcpart', 'columnname' ] ],
686       'index' => [ [ 'svcpart' ] ],
687     },
688
689     #(this should be renamed to part_pop)
690     'svc_acct_pop' => {
691       'columns' => [
692         'popnum',    'serial',    '',   '',
693         'city',      'varchar',   '',   $char_d,
694         'state',     'varchar',   '',   $char_d,
695         'ac',        'char',   '',   3,
696         'exch',      'char',   '',   3,
697         'loc',       'char',   'NULL',   4, #NULL for legacy purposes
698       ],
699       'primary_key' => 'popnum',
700       'unique' => [],
701       'index' => [ [ 'state' ] ],
702     },
703
704     'part_pop_local' => {
705       'columns' => [
706         'localnum',  'serial',     '',     '',
707         'popnum',    'int',     '',     '',
708         'city',      'varchar', 'NULL', $char_d,
709         'state',     'char',    'NULL', 2,
710         'npa',       'char',    '',     3,
711         'nxx',       'char',    '',     3,
712       ],
713       'primary_key' => 'localnum',
714       'unique' => [],
715       'index' => [ [ 'npa', 'nxx' ], [ 'popnum' ] ],
716     },
717
718     'svc_acct' => {
719       'columns' => [
720         'svcnum',    'int',    '',   '',
721         'username',  'varchar',   '',   $username_len, #unique (& remove dup code)
722         '_password', 'varchar',   '',   72, #13 for encryped pw's plus ' *SUSPENDED* (md5 passwords can be 34, blowfish 60)
723         'sec_phrase', 'varchar',  'NULL',   $char_d,
724         'popnum',    'int',    'NULL',   '',
725         'uid',       'int', 'NULL',   '',
726         'gid',       'int', 'NULL',   '',
727         'finger',    'varchar',   'NULL',   $char_d,
728         'dir',       'varchar',   'NULL',   $char_d,
729         'shell',     'varchar',   'NULL',   $char_d,
730         'quota',     'varchar',   'NULL',   $char_d,
731         'slipip',    'varchar',   'NULL',   15, #four TINYINTs, bah.
732         'seconds',   'int', 'NULL',   '', #uhhhh
733         'domsvc',    'int', '',   '',
734       ],
735       'primary_key' => 'svcnum',
736       #'unique' => [ [ 'username', 'domsvc' ] ],
737       'unique' => [],
738       'index' => [ ['username'], ['domsvc'] ],
739     },
740
741     #'svc_charge' => {
742     #  'columns' => [
743     #    'svcnum',    'int',    '',   '',
744     #    'amount',    @money_type,
745     #  ],
746     #  'primary_key' => 'svcnum',
747     #  'unique' => [ [] ],
748     #  'index' => [ [] ],
749     #},
750
751     'svc_domain' => {
752       'columns' => [
753         'svcnum',    'int',    '',   '',
754         'domain',    'varchar',    '',   $char_d,
755         'catchall',  'int', 'NULL',    '',
756       ],
757       'primary_key' => 'svcnum',
758       'unique' => [ ['domain'] ],
759       'index' => [],
760     },
761
762     'domain_record' => {
763       'columns' => [
764         'recnum',    'serial',     '',  '',
765         'svcnum',    'int',     '',  '',
766         #'reczone',   'varchar', '',  $char_d,
767         'reczone',   'varchar', '',  255,
768         'recaf',     'char',    '',  2,
769         'rectype',   'varchar',    '',  5,
770         #'recdata',   'varchar', '',  $char_d,
771         'recdata',   'varchar', '',  255,
772       ],
773       'primary_key' => 'recnum',
774       'unique'      => [],
775       'index'       => [ ['svcnum'] ],
776     },
777
778     'svc_forward' => {
779       'columns' => [
780         'svcnum',   'int',            '',   '',
781         'srcsvc',   'int',        'NULL',   '',
782         'src',      'varchar',    'NULL',  255,
783         'dstsvc',   'int',        'NULL',   '',
784         'dst',      'varchar',    'NULL',  255,
785       ],
786       'primary_key' => 'svcnum',
787       'unique'      => [],
788       'index'       => [ ['srcsvc'], ['dstsvc'] ],
789     },
790
791     'svc_www' => {
792       'columns' => [
793         'svcnum',   'int',    '',  '',
794         'recnum',   'int',    '',  '',
795         'usersvc',  'int',    '',  '',
796       ],
797       'primary_key' => 'svcnum',
798       'unique'      => [],
799       'index'       => [],
800     },
801
802     #'svc_wo' => {
803     #  'columns' => [
804     #    'svcnum',    'int',    '',   '',
805     #    'svcnum',    'int',    '',   '',
806     #    'svcnum',    'int',    '',   '',
807     #    'worker',    'varchar',   '',   $char_d,
808     #    '_date',     @date_type,
809     #  ],
810     #  'primary_key' => 'svcnum',
811     #  'unique' => [ [] ],
812     #  'index' => [ [] ],
813     #},
814
815     'prepay_credit' => {
816       'columns' => [
817         'prepaynum',   'serial',     '',   '',
818         'identifier',  'varchar', '', $char_d,
819         'amount',      @money_type,
820         'seconds',     'int',     'NULL', '',
821         'agentnum',    'int',     'NULL', '',
822       ],
823       'primary_key' => 'prepaynum',
824       'unique'      => [ ['identifier'] ],
825       'index'       => [],
826     },
827
828     'port' => {
829       'columns' => [
830         'portnum',  'serial',     '',   '',
831         'ip',       'varchar', 'NULL', 15,
832         'nasport',  'int',     'NULL', '',
833         'nasnum',   'int',     '',   '',
834       ],
835       'primary_key' => 'portnum',
836       'unique'      => [],
837       'index'       => [],
838     },
839
840     'nas' => {
841       'columns' => [
842         'nasnum',   'serial',     '',    '',
843         'nas',      'varchar', '',    $char_d,
844         'nasip',    'varchar', '',    15,
845         'nasfqdn',  'varchar', '',    $char_d,
846         'last',     'int',     '',    '',
847       ],
848       'primary_key' => 'nasnum',
849       'unique'      => [ [ 'nas' ], [ 'nasip' ] ],
850       'index'       => [ [ 'last' ] ],
851     },
852
853     'session' => {
854       'columns' => [
855         'sessionnum', 'serial',       '',   '',
856         'portnum',    'int',       '',   '',
857         'svcnum',     'int',       '',   '',
858         'login',      @date_type,
859         'logout',     @date_type,
860       ],
861       'primary_key' => 'sessionnum',
862       'unique'      => [],
863       'index'       => [ [ 'portnum' ] ],
864     },
865
866     'queue' => {
867       'columns' => [
868         'jobnum', 'serial', '', '',
869         'job', 'text', '', '',
870         '_date', 'int', '', '',
871         'status', 'varchar', '', $char_d,
872         'statustext', 'text', 'NULL', '',
873         'svcnum', 'int', 'NULL', '',
874       ],
875       'primary_key' => 'jobnum',
876       'unique'      => [],
877       'index'       => [ [ 'svcnum' ], [ 'status' ] ],
878     },
879
880     'queue_arg' => {
881       'columns' => [
882         'argnum', 'serial', '', '',
883         'jobnum', 'int', '', '',
884         'arg', 'text', 'NULL', '',
885       ],
886       'primary_key' => 'argnum',
887       'unique'      => [],
888       'index'       => [ [ 'jobnum' ] ],
889     },
890
891     'queue_depend' => {
892       'columns' => [
893         'dependnum', 'serial', '', '',
894         'jobnum', 'int', '', '',
895         'depend_jobnum', 'int', '', '',
896       ],
897       'primary_key' => 'dependnum',
898       'unique'      => [],
899       'index'       => [ [ 'jobnum' ], [ 'depend_jobnum' ] ],
900     },
901
902     'export_svc' => {
903       'columns' => [
904         'exportsvcnum' => 'serial', '', '',
905         'exportnum'    => 'int', '', '',
906         'svcpart'      => 'int', '', '',
907       ],
908       'primary_key' => 'exportsvcnum',
909       'unique'      => [ [ 'exportnum', 'svcpart' ] ],
910       'index'       => [ [ 'exportnum' ], [ 'svcpart' ] ],
911     },
912
913     'part_export' => {
914       'columns' => [
915         'exportnum', 'serial', '', '',
916         #'svcpart',   'int', '', '',
917         'machine', 'varchar', '', $char_d,
918         'exporttype', 'varchar', '', $char_d,
919         'nodomain',     'char', 'NULL', 1,
920       ],
921       'primary_key' => 'exportnum',
922       'unique'      => [],
923       'index'       => [ [ 'machine' ], [ 'exporttype' ] ],
924     },
925
926     'part_export_option' => {
927       'columns' => [
928         'optionnum', 'serial', '', '',
929         'exportnum', 'int', '', '',
930         'optionname', 'varchar', '', $char_d,
931         'optionvalue', 'text', 'NULL', '',
932       ],
933       'primary_key' => 'optionnum',
934       'unique'      => [],
935       'index'       => [ [ 'exportnum' ], [ 'optionname' ] ],
936     },
937
938     'radius_usergroup' => {
939       'columns' => [
940         'usergroupnum', 'serial', '', '',
941         'svcnum',       'int', '', '',
942         'groupname',    'varchar', '', $char_d,
943       ],
944       'primary_key' => 'usergroupnum',
945       'unique'      => [],
946       'index'       => [ [ 'svcnum' ], [ 'groupname' ] ],
947     },
948
949     'msgcat' => {
950       'columns' => [
951         'msgnum', 'serial', '', '',
952         'msgcode', 'varchar', '', $char_d,
953         'locale', 'varchar', '', 16,
954         'msg', 'text', '', '',
955       ],
956       'primary_key' => 'msgnum',
957       'unique'      => [ [ 'msgcode', 'locale' ] ],
958       'index'       => [],
959     },
960
961     'cust_tax_exempt' => {
962       'columns' => [
963         'exemptnum', 'serial', '', '',
964         'custnum',   'int', '', '',
965         'taxnum',    'int', '', '',
966         'year',      'int', '', '',
967         'month',     'int', '', '',
968         'amount',   @money_type,
969       ],
970       'primary_key' => 'exemptnum',
971       'unique'      => [ [ 'custnum', 'taxnum', 'year', 'month' ] ],
972       'index'       => [],
973     },
974
975     'router' => {
976       'columns' => [
977         'routernum', 'serial', '', '',
978         'routername', 'varchar', '', $char_d,
979         'svcnum', 'int', 'NULL', '',
980       ],
981       'primary_key' => 'routernum',
982       'unique'      => [],
983       'index'       => [],
984     },
985
986     'part_svc_router' => {
987       'columns' => [
988         'svcrouternum', 'serial', '', '',
989         'svcpart', 'int', '', '',
990         'routernum', 'int', '', '',
991       ],
992       'primary_key' => 'svcrouternum',
993       'unique'      => [],
994       'index'       => [],
995     },
996
997     'addr_block' => {
998       'columns' => [
999         'blocknum', 'serial', '', '',
1000         'routernum', 'int', '', '',
1001         'ip_gateway', 'varchar', '', 15,
1002         'ip_netmask', 'int', '', '',
1003       ],
1004       'primary_key' => 'blocknum',
1005       'unique'      => [ [ 'blocknum', 'routernum' ] ],
1006       'index'       => [],
1007     },
1008
1009     'svc_broadband' => {
1010       'columns' => [
1011         'svcnum', 'int', '', '',
1012         'blocknum', 'int', '', '',
1013         'speed_up', 'int', '', '',
1014         'speed_down', 'int', '', '',
1015         'ip_addr', 'varchar', '', 15,
1016       ],
1017       'primary_key' => 'svcnum',
1018       'unique'      => [],
1019       'index'       => [],
1020     },
1021
1022     'part_virtual_field' => {
1023       'columns' => [
1024         'vfieldpart', 'int', '', '',
1025         'dbtable', 'varchar', '', 32,
1026         'name', 'varchar', '', 32,
1027         'check_block', 'text', 'NULL', '',
1028         'length', 'int', 'NULL', '',
1029         'list_source', 'text', 'NULL', '',
1030         'label', 'varchar', 'NULL', 80,
1031       ],
1032       'primary_key' => 'vfieldpart',
1033       'unique' => [],
1034       'index' => [],
1035     },
1036
1037     'virtual_field' => {
1038       'columns' => [
1039         'vfieldnum', 'serial', '', '',
1040         'recnum', 'int', '', '',
1041         'vfieldpart', 'int', '', '',
1042         'value', 'varchar', '', 128,
1043       ],
1044       'primary_key' => 'vfieldnum',
1045       'unique' => [ [ 'vfieldpart', 'recnum' ] ],
1046       'index' => [],
1047     },
1048
1049     'acct_snarf' => {
1050       'columns' => [
1051         'snarfnum',  'int', '', '',
1052         'svcnum',    'int', '', '',
1053         'machine',   'varchar', '', 255,
1054         'protocol',  'varchar', '', $char_d,
1055         'username',  'varchar', '', $char_d,
1056         '_password', 'varchar', '', $char_d,
1057       ],
1058       'primary_key' => 'snarfnum',
1059       'unique' => [],
1060       'index'  => [ [ 'svcnum' ] ],
1061     },
1062
1063     'svc_external' => {
1064       'columns' => [
1065         'svcnum', 'int', '', '',
1066         'id',     'int', 'NULL', '',
1067         'title',  'varchar', 'NULL', $char_d,
1068       ],
1069       'primary_key' => 'svcnum',
1070       'unique'      => [],
1071       'index'       => [],
1072     },
1073
1074     'cust_pay_refund' => {
1075       'columns' => [
1076         'payrefundnum', 'serial', '', '',
1077         'paynum',  'int', '', '',
1078         'refundnum',  'int', '', '',
1079         '_date',    @date_type,
1080         'amount',   @money_type,
1081       ],
1082       'primary_key' => 'payrefundnum',
1083       'unique' => [],
1084       'index' => [ ['paynum'], ['refundnum'] ],
1085     },
1086
1087     'part_pkg_option' => {
1088       'columns' => [
1089         'optionnum', 'serial', '', '',
1090         'pkgpart', 'int', '', '',
1091         'optionname', 'varchar', '', $char_d,
1092         'optionvalue', 'text', 'NULL', '',
1093       ],
1094       'primary_key' => 'optionnum',
1095       'unique'      => [],
1096       'index'       => [ [ 'pkgpart' ], [ 'optionname' ] ],
1097     },
1098
1099     'rate' => {
1100       'columns' => [
1101         'ratenum',  'serial', '', '',
1102         'ratename', 'varchar', '', $char_d,
1103       ],
1104       'primary_key' => 'ratenum',
1105       'unique'      => [],
1106       'index'       => [],
1107     },
1108
1109     'rate_detail' => {
1110       'columns' => [
1111         'ratedetailnum',   'serial', '', '',
1112         'ratenum',         'int',     '', '',
1113         'orig_regionnum',  'int', 'NULL', '',
1114         'dest_regionnum',  'int',     '', '',
1115         'min_included',    'int',     '', '',
1116         'min_charge',      @money_type,
1117         'sec_granularity', 'int',     '', '',
1118         #time period (link to table of periods)?
1119       ],
1120       'primary_key' => 'ratedetailnum',
1121       'unique'      => [ [ 'ratenum', 'orig_regionnum', 'dest_regionnum' ] ],
1122       'index'       => [],
1123     },
1124
1125     'rate_region' => {
1126       'columns' => [
1127         'regionnum',   'serial',      '', '',
1128         'regionname',  'varchar',     '', $char_d,
1129       ],
1130       'primary_key' => 'regionnum',
1131       'unique'      => [],
1132       'index'       => [],
1133     },
1134
1135     'rate_prefix' => {
1136       'columns' => [
1137         'prefixnum',   'serial',    '', '',
1138         'regionnum',   'int',       '', '',,
1139         'countrycode', 'varchar',     '', 3,
1140         'npa',         'varchar', 'NULL', 6,
1141         'nxx',         'varchar', 'NULL', 3,
1142       ],
1143       'primary_key' => 'prefixnum',
1144       'unique'      => [],
1145       'index'       => [ [ 'countrycode' ], [ 'regionnum' ] ],
1146     },
1147
1148     'reg_code' => {
1149       'columns' => [
1150         'codenum',   'serial',    '', '',
1151         'code',      'varchar',   '', $char_d,
1152         'agentnum',  'int',       '', '',
1153       ],
1154       'primary_key' => 'codenum',
1155       'unique'      => [ [ 'agentnum', 'code' ] ],
1156       'index'       => [ [ 'agentnum' ] ],
1157     },
1158
1159     'reg_code_pkg' => {
1160       'columns' => [
1161         'codepkgnum', 'serial', '', '',
1162         'codenum',   'int',    '', '',
1163         'pkgpart',   'int',    '', '',
1164       ],
1165       'primary_key' => 'codepkgnum',
1166       'unique'      => [ [ 'codenum', 'pkgpart' ] ],
1167       'index'       => [ [ 'codenum' ] ],
1168     },
1169
1170     'clientapi_session' => {
1171       'columns' => [
1172         'sessionnum',  'serial',  '', '',
1173         'sessionid',  'varchar',  '', $char_d,
1174         'namespace',  'varchar',  '', $char_d,
1175       ],
1176       'primary_key' => 'sessionnum',
1177       'unique'      => [ [ 'sessionid', 'namespace' ] ],
1178       'index'       => [],
1179     },
1180
1181     'clientapi_session_field' => {
1182       'columns' => [
1183         'fieldnum',    'serial',     '', '',
1184         'sessionnum',     'int',     '', '',
1185         'fieldname',  'varchar',     '', $char_d,
1186         'fieldvalue',    'text', 'NULL', '',
1187       ],
1188       'primary_key' => 'fieldnum',
1189       'unique'      => [ [ 'sessionnum', 'fieldname' ] ],
1190       'index'       => [],
1191     },
1192
1193     'payment_gateway' => {
1194       'columns' => [
1195         'gatewaynum',       'serial',   '',     '',
1196         'gateway_module',   'varchar',  '',     $char_d,
1197         'gateway_username', 'varchar',  'NULL', $char_d,
1198         'gateway_password', 'varchar',  'NULL', $char_d,
1199         'gateway_action',   'varchar',  'NULL', $char_d,
1200         'disabled',   'char',  'NULL',   1,
1201       ],
1202       'primary_key' => 'gatewaynum',
1203       'unique' => [],
1204       'index'  => [ [ 'disabled' ] ],
1205     },
1206
1207     'payment_gateway_option' => {
1208       'columns' => [
1209         'optionnum',   'serial',  '',     '',
1210         'gatewaynum',  'int',     '',     '',
1211         'optionname',  'varchar', '',     $char_d,
1212         'optionvalue', 'text',    'NULL', '',
1213       ],
1214       'primary_key' => 'optionnum',
1215       'unique'      => [],
1216       'index'       => [ [ 'gatewaynum' ], [ 'optionname' ] ],
1217     },
1218
1219     'agent_payment_gateway' => {
1220       'columns' => [
1221         'agentgatewaynum', 'serial', '', '',
1222         'agentnum',        'int', '', '',
1223         'gatewaynum',      'int', '', '',
1224         'cardtype',        'varchar', 'NULL', $char_d,
1225         'taxclass',        'varchar', 'NULL', $char_d,
1226       ],
1227       'primary_key' => 'agentgatewaynum',
1228       'unique'      => [],
1229       'index'       => [ [ 'agentnum', 'cardtype' ], ],
1230     },
1231
1232     'banned_pay' => {
1233       'columns' => [
1234         'bannum',  'serial',   '',     '',
1235         'payby',   'char',     '',       4,
1236         'payinfo', 'varchar',  '',     128, #say, a 512-big digest _hex encoded
1237         #'paymask', 'varchar',  'NULL', $char_d,
1238         '_date',   @date_type,
1239         'otaker',  'varchar',  '',     32,
1240         'reason',  'varchar',  'NULL', $char_d,
1241       ],
1242       'primary_key' => 'bannum',
1243       'unique'      => [ [ 'payby', 'payinfo' ] ],
1244       'index'       => [],
1245     },
1246
1247     'cancel_reason' => {
1248       'columns' => [
1249         'reasonnum', 'serial',  '',     '',
1250         'reason',    'varchar', '',     $char_d,
1251         'disabled',  'char',    'NULL', 1,
1252       ],
1253       'primary_key' => 'reasonnum',
1254       'unique' => [],
1255       'index'  => [ [ 'disabled' ] ],
1256     },
1257
1258   };
1259
1260 }
1261
1262 =back
1263
1264 =head1 BUGS
1265
1266 =head1 SEE ALSO
1267
1268 L<DBIx::DBSchema>
1269
1270 =cut
1271
1272 1;
1273