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