3 #to delay loading dbdef until we're ready
4 BEGIN { $FS::Record::setup_hack = 1; }
10 use Locale::SubCountry;
12 use DBIx::DBSchema 0.21;
13 use DBIx::DBSchema::Table;
14 use DBIx::DBSchema::Column;
15 use DBIx::DBSchema::ColGroup::Unique;
16 use DBIx::DBSchema::ColGroup::Index;
17 use FS::UID qw(adminsuidsetup datasrc checkeuid getsecrets);
19 use FS::cust_main_county;
21 use FS::part_bill_event;
23 die "Not running uid freeside!" unless checkeuid();
26 map { lc($FS::raddb::attrib{$_}) => $_ } keys %FS::raddb::attrib;
29 my $user = shift or die &usage;
32 #needs to match FS::Record
33 my($dbdef_file) = "/usr/local/etc/freeside/dbdef.". datasrc;
37 #print "\nEnter the maximum username length: ";
38 #my($username_len)=&getvalue;
39 my $username_len = 32; #usernamemax config file
41 #print "\n\n", <<END, ":";
42 #Freeside tracks the RADIUS User-Name, check attribute Password and
43 #reply attribute Framed-IP-Address for each user. You can specify additional
44 #check and reply attributes (or you can add them later with the
45 #fs-radius-add-check and fs-radius-add-reply programs).
47 #First enter any additional RADIUS check attributes you need to track for each
48 #user, separated by whitespace.
50 #my @check_attributes = map { $attrib2db{lc($_)} or die "unknown attribute $_"; }
51 # split(" ",&getvalue);
53 #print "\n\n", <<END, ":";
54 #Now enter any additional reply attributes you need to track for each user,
55 #separated by whitespace.
57 #my @attributes = map { $attrib2db{lc($_)} or die "unknown attribute $_"; }
58 # split(" ",&getvalue);
60 #print "\n\n", <<END, ":";
61 #Do you wish to enable the tracking of a second, separate shipping/service
67 # my($x)=scalar(<STDIN>);
74 # my $x = scalar(<STDIN>);
78 my @check_attributes = (); #add later
79 my @attributes = (); #add later
84 my($char_d) = 80; #default maxlength for text fields
86 #my(@date_type) = ( 'timestamp', '', '' );
87 my(@date_type) = ( 'int', 'NULL', '' );
88 my(@perl_type) = ( 'text', 'NULL', '' );
89 my @money_type = ( 'decimal', '', '10,2' );
92 # create a dbdef object from the old data structure
95 my(%tables)=&tables_hash_hack;
98 my($dbdef) = new DBIx::DBSchema ( map {
100 while (@{$tables{$_}{'columns'}}) {
101 my($name,$type,$null,$length)=splice @{$tables{$_}{'columns'}}, 0, 4;
102 push @columns, new DBIx::DBSchema::Column ( $name,$type,$null,$length );
104 DBIx::DBSchema::Table->new(
106 $tables{$_}{'primary_key'},
107 DBIx::DBSchema::ColGroup::Unique->new($tables{$_}{'unique'}),
108 DBIx::DBSchema::ColGroup::Index->new($tables{$_}{'index'}),
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 );
121 #add radius attributes to svc_acct
123 my($svc_acct)=$dbdef->table('svc_acct');
126 foreach $attribute (@attributes) {
127 $svc_acct->addcolumn ( new DBIx::DBSchema::Column (
128 'radius_'. $attribute,
135 foreach $attribute (@check_attributes) {
136 $svc_acct->addcolumn( new DBIx::DBSchema::Column (
144 #create history tables (false laziness w/create-history-tables)
145 foreach my $table ( grep { ! /^h_/ } $dbdef->tables ) {
146 my $tableobj = $dbdef->table($table)
147 or die "unknown table $table";
149 die "unique->lol_ref undefined for $table"
150 unless defined $tableobj->unique->lol_ref;
151 die "index->lol_ref undefined for $table"
152 unless defined $tableobj->index->lol_ref;
154 my $h_tableobj = DBIx::DBSchema::Table->new( {
156 primary_key => 'historynum',
157 unique => DBIx::DBSchema::ColGroup::Unique->new( [] ),
158 'index' => DBIx::DBSchema::ColGroup::Index->new( [
159 @{$tableobj->unique->lol_ref},
160 @{$tableobj->index->lol_ref}
163 DBIx::DBSchema::Column->new( {
164 'name' => 'historynum',
166 'null' => 'NOT NULL',
171 DBIx::DBSchema::Column->new( {
172 'name' => 'history_date',
179 DBIx::DBSchema::Column->new( {
180 'name' => 'history_user',
182 'null' => 'NOT NULL',
187 DBIx::DBSchema::Column->new( {
188 'name' => 'history_action',
190 'null' => 'NOT NULL',
196 my $column = $tableobj->column($_);
198 #clone so as to not disturb the original
199 $column = DBIx::DBSchema::Column->new( {
200 map { $_ => $column->$_() }
201 qw( name type null length default local )
205 if $column->type eq 'serial';
206 #$column->default('')
207 # if $column->default =~ /^nextval\(/i;
208 #( my $local = $column->local ) =~ s/AUTO_INCREMENT//i;
209 #$column->local($local);
214 $dbdef->addtable($h_tableobj);
218 $dbdef->save($dbdef_file);
219 &FS::Record::reload_dbdef($dbdef_file);
225 my($dbh)=adminsuidsetup $user;
230 foreach my $statement ( $dbdef->sql($dbh) ) {
231 $dbh->do( $statement )
232 or die "CREATE error: ". $dbh->errstr. "\ndoing statement: $statement";
236 foreach my $country ( sort map uc($_), all_country_codes ) {
238 my $subcountry = eval { new Locale::SubCountry($country) };
239 my @states = $subcountry ? $subcountry->all_codes : undef;
241 if ( !scalar(@states) || ( scalar(@states) == 1 && !defined($states[0]) ) ) {
243 my $cust_main_county = new FS::cust_main_county({
245 'country' => $country,
247 my $error = $cust_main_county->insert;
248 die $error if $error;
252 if ( $states[0] =~ /^(\d+|\w)$/ ) {
253 @states = map $subcountry->full_name($_), @states
256 foreach my $state ( @states ) {
258 my $cust_main_county = new FS::cust_main_county({
261 'country' => $country,
263 my $error = $cust_main_county->insert;
264 die $error if $error;
273 #[ 'COMP', 'Comp invoice', '$cust_bill->comp();', 30, 'comp' ],
274 [ 'CARD', 'Batch card', '$cust_bill->batch_card();', 40, 'batch-card' ],
275 [ 'BILL', 'Send invoice', '$cust_bill->send();', 50, 'send' ],
276 [ 'DCRD', 'Send invoice', '$cust_bill->send();', 50, 'send' ],
277 [ 'DCHK', 'Send invoice', '$cust_bill->send();', 50, 'send' ],
280 my $part_bill_event = new FS::part_bill_event({
281 'payby' => $aref->[0],
282 'event' => $aref->[1],
283 'eventcode' => $aref->[2],
285 'weight' => $aref->[3],
286 'plan' => $aref->[4],
289 $error=$part_bill_event->insert;
290 die $error if $error;
294 $dbh->commit or die $dbh->errstr;
295 $dbh->disconnect or die $dbh->errstr;
297 #print "Freeside database initialized sucessfully\n";
300 die "Usage:\n freeside-setup [ -s ] user\n";
304 # Now it becomes an object. much better.
306 sub tables_hash_hack {
308 #note that s/(date|change)/_$1/; to avoid keyword conflict.
309 #put a kludge in FS::Record to catch this or? (pry need some date-handling
312 my(%tables)=( #yech.}
316 'agentnum', 'serial', '', '',
317 'agent', 'varchar', '', $char_d,
318 'typenum', 'int', '', '',
319 'freq', 'int', 'NULL', '',
321 'disabled', 'char', 'NULL', 1,
322 'username', 'varchar', 'NULL', $char_d,
323 '_password','varchar', 'NULL', $char_d,
325 'primary_key' => 'agentnum',
327 'index' => [ ['typenum'], ['disabled'] ],
332 'typenum', 'serial', '', '',
333 'atype', 'varchar', '', $char_d,
335 'primary_key' => 'typenum',
342 'typenum', 'int', '', '',
343 'pkgpart', 'int', '', '',
346 'unique' => [ ['typenum', 'pkgpart'] ],
347 'index' => [ ['typenum'] ],
352 'invnum', 'serial', '', '',
353 'custnum', 'int', '', '',
355 'charged', @money_type,
356 'printed', 'int', '', '',
357 'closed', 'char', 'NULL', 1,
359 'primary_key' => 'invnum',
361 'index' => [ ['custnum'], ['_date'] ],
364 'cust_bill_event' => {
366 'eventnum', 'serial', '', '',
367 'invnum', 'int', '', '',
368 'eventpart', 'int', '', '',
370 'status', 'varchar', '', $char_d,
371 'statustext', 'text', 'NULL', '',
373 'primary_key' => 'eventnum',
374 #no... there are retries now #'unique' => [ [ 'eventpart', 'invnum' ] ],
376 'index' => [ ['invnum'], ['status'] ],
379 'part_bill_event' => {
381 'eventpart', 'serial', '', '',
382 'payby', 'char', '', 4,
383 'event', 'varchar', '', $char_d,
384 'eventcode', @perl_type,
385 'seconds', 'int', 'NULL', '',
386 'weight', 'int', '', '',
387 'plan', 'varchar', 'NULL', $char_d,
388 'plandata', 'text', 'NULL', '',
389 'disabled', 'char', 'NULL', 1,
391 'primary_key' => 'eventpart',
393 'index' => [ ['payby'], ['disabled'], ],
398 'pkgnum', 'int', '', '',
399 'invnum', 'int', '', '',
400 'setup', @money_type,
401 'recur', @money_type,
404 'itemdesc', 'varchar', 'NULL', $char_d,
408 'index' => [ ['invnum'] ],
411 'cust_bill_pkg_detail' => {
413 'detailnum', 'serial', '', '',
414 'pkgnum', 'int', '', '',
415 'invnum', 'int', '', '',
416 'detail', 'varchar', '', $char_d,
418 'primary_key' => 'detailnum',
420 'index' => [ [ 'pkgnum', 'invnum' ] ],
425 'crednum', 'serial', '', '',
426 'custnum', 'int', '', '',
428 'amount', @money_type,
429 'otaker', 'varchar', '', 32,
430 'reason', 'text', 'NULL', '',
431 'closed', 'char', 'NULL', 1,
433 'primary_key' => 'crednum',
435 'index' => [ ['custnum'] ],
438 'cust_credit_bill' => {
440 'creditbillnum', 'serial', '', '',
441 'crednum', 'int', '', '',
442 'invnum', 'int', '', '',
444 'amount', @money_type,
446 'primary_key' => 'creditbillnum',
448 'index' => [ ['crednum'], ['invnum'] ],
453 'custnum', 'serial', '', '',
454 'agentnum', 'int', '', '',
455 # 'titlenum', 'int', 'NULL', '',
456 'last', 'varchar', '', $char_d,
457 # 'middle', 'varchar', 'NULL', $char_d,
458 'first', 'varchar', '', $char_d,
459 'ss', 'varchar', 'NULL', 11,
460 'company', 'varchar', 'NULL', $char_d,
461 'address1', 'varchar', '', $char_d,
462 'address2', 'varchar', 'NULL', $char_d,
463 'city', 'varchar', '', $char_d,
464 'county', 'varchar', 'NULL', $char_d,
465 'state', 'varchar', 'NULL', $char_d,
466 'zip', 'varchar', '', 10,
467 'country', 'char', '', 2,
468 'daytime', 'varchar', 'NULL', 20,
469 'night', 'varchar', 'NULL', 20,
470 'fax', 'varchar', 'NULL', 12,
471 'ship_last', 'varchar', 'NULL', $char_d,
472 # 'ship_middle', 'varchar', 'NULL', $char_d,
473 'ship_first', 'varchar', 'NULL', $char_d,
474 'ship_company', 'varchar', 'NULL', $char_d,
475 'ship_address1', 'varchar', 'NULL', $char_d,
476 'ship_address2', 'varchar', 'NULL', $char_d,
477 'ship_city', 'varchar', 'NULL', $char_d,
478 'ship_county', 'varchar', 'NULL', $char_d,
479 'ship_state', 'varchar', 'NULL', $char_d,
480 'ship_zip', 'varchar', 'NULL', 10,
481 'ship_country', 'char', 'NULL', 2,
482 'ship_daytime', 'varchar', 'NULL', 20,
483 'ship_night', 'varchar', 'NULL', 20,
484 'ship_fax', 'varchar', 'NULL', 12,
485 'payby', 'char', '', 4,
486 'payinfo', 'varchar', 'NULL', $char_d,
487 'paycvv', 'varchar', 'NULL', 4,
488 #'paydate', @date_type,
489 'paydate', 'varchar', 'NULL', 10,
490 'payname', 'varchar', 'NULL', $char_d,
491 'tax', 'char', 'NULL', 1,
492 'otaker', 'varchar', '', 32,
493 'refnum', 'int', '', '',
494 'referral_custnum', 'int', 'NULL', '',
495 'comments', 'text', 'NULL', '',
497 'primary_key' => 'custnum',
499 #'index' => [ ['last'], ['company'] ],
500 'index' => [ ['last'], [ 'company' ], [ 'referral_custnum' ],
501 [ 'daytime' ], [ 'night' ], [ 'fax' ], [ 'refnum' ],
505 'cust_main_invoice' => {
507 'destnum', 'serial', '', '',
508 'custnum', 'int', '', '',
509 'dest', 'varchar', '', $char_d,
511 'primary_key' => 'destnum',
513 'index' => [ ['custnum'], ],
516 'cust_main_county' => { #county+state+country are checked off the
517 #cust_main_county for validation and to provide
520 'taxnum', 'serial', '', '',
521 'state', 'varchar', 'NULL', $char_d,
522 'county', 'varchar', 'NULL', $char_d,
523 'country', 'char', '', 2,
524 'taxclass', 'varchar', 'NULL', $char_d,
525 'exempt_amount', @money_type,
526 'tax', 'real', '', '', #tax %
527 'taxname', 'varchar', 'NULL', $char_d,
528 'setuptax', 'char', 'NULL', 1, # Y = setup tax exempt
529 'recurtax', 'char', 'NULL', 1, # Y = recur tax exempt
531 'primary_key' => 'taxnum',
533 # 'unique' => [ ['taxnum'], ['state', 'county'] ],
539 'paynum', 'serial', '', '',
540 #now cust_bill_pay #'invnum', 'int', '', '',
541 'custnum', 'int', '', '',
544 'payby', 'char', '', 4, # CARD/BILL/COMP, should be index into
545 # payment type table.
546 'payinfo', 'varchar', 'NULL', $char_d, #see cust_main above
547 'paybatch', 'varchar', 'NULL', $char_d, #for auditing purposes.
548 'closed', 'char', 'NULL', 1,
550 'primary_key' => 'paynum',
552 'index' => [ [ 'custnum' ], [ 'paybatch' ], [ 'payby' ], [ '_date' ] ],
557 'paynum', 'int', '', '',
558 'custnum', 'int', '', '',
561 'payby', 'char', '', 4, # CARD/BILL/COMP, should be index into
562 # payment type table.
563 'payinfo', 'varchar', 'NULL', $char_d, #see cust_main above
564 'paybatch', 'varchar', 'NULL', $char_d, #for auditing purposes.
565 'closed', 'char', 'NULL', 1,
566 'void_date', @date_type,
567 'reason', 'varchar', 'NULL', $char_d,
568 'otaker', 'varchar', '', 32,
570 'primary_key' => 'paynum',
572 'index' => [ [ 'custnum' ] ],
577 'billpaynum', 'serial', '', '',
578 'invnum', 'int', '', '',
579 'paynum', 'int', '', '',
580 'amount', @money_type,
583 'primary_key' => 'billpaynum',
585 'index' => [ [ 'paynum' ], [ 'invnum' ] ],
588 'cust_pay_batch' => { #what's this used for again? list of customers
589 #in current CARD batch? (necessarily CARD?)
591 'paybatchnum', 'serial', '', '',
592 'invnum', 'int', '', '',
593 'custnum', 'int', '', '',
594 'last', 'varchar', '', $char_d,
595 'first', 'varchar', '', $char_d,
596 'address1', 'varchar', '', $char_d,
597 'address2', 'varchar', 'NULL', $char_d,
598 'city', 'varchar', '', $char_d,
599 'state', 'varchar', 'NULL', $char_d,
600 'zip', 'varchar', '', 10,
601 'country', 'char', '', 2,
602 # 'trancode', 'int', '', '',
603 'cardnum', 'varchar', '', 16,
605 'exp', 'varchar', '', 11,
606 'payname', 'varchar', 'NULL', $char_d,
607 'amount', @money_type,
609 'primary_key' => 'paybatchnum',
611 'index' => [ ['invnum'], ['custnum'] ],
616 'pkgnum', 'serial', '', '',
617 'custnum', 'int', '', '',
618 'pkgpart', 'int', '', '',
619 'otaker', 'varchar', '', 32,
622 'last_bill', @date_type,
624 'cancel', @date_type,
625 'expire', @date_type,
626 'manual_flag', 'char', 'NULL', 1,
628 'primary_key' => 'pkgnum',
630 'index' => [ ['custnum'] ],
635 'refundnum', 'serial', '', '',
636 #now cust_credit_refund #'crednum', 'int', '', '',
637 'custnum', 'int', '', '',
639 'refund', @money_type,
640 'otaker', 'varchar', '', 32,
641 'reason', 'varchar', '', $char_d,
642 'payby', 'char', '', 4, # CARD/BILL/COMP, should be index
643 # into payment type table.
644 'payinfo', 'varchar', 'NULL', $char_d, #see cust_main above
645 'paybatch', 'varchar', 'NULL', $char_d,
646 'closed', 'char', 'NULL', 1,
648 'primary_key' => 'refundnum',
653 'cust_credit_refund' => {
655 'creditrefundnum', 'serial', '', '',
656 'crednum', 'int', '', '',
657 'refundnum', 'int', '', '',
658 'amount', @money_type,
661 'primary_key' => 'creditrefundnum',
663 'index' => [ [ 'crednum', 'refundnum' ] ],
669 'svcnum', 'serial', '', '',
670 'pkgnum', 'int', 'NULL', '',
671 'svcpart', 'int', '', '',
673 'primary_key' => 'svcnum',
675 'index' => [ ['svcnum'], ['pkgnum'], ['svcpart'] ],
680 'pkgpart', 'serial', '', '',
681 'pkg', 'varchar', '', $char_d,
682 'comment', 'varchar', '', $char_d,
683 'promo_code', 'varchar', 'NULL', $char_d,
685 'freq', 'varchar', '', $char_d, #billing frequency
687 'setuptax', 'char', 'NULL', 1,
688 'recurtax', 'char', 'NULL', 1,
689 'plan', 'varchar', 'NULL', $char_d,
690 'plandata', 'text', 'NULL', '',
691 'disabled', 'char', 'NULL', 1,
692 'taxclass', 'varchar', 'NULL', $char_d,
694 'primary_key' => 'pkgpart',
695 'unique' => [ [ 'promo_code' ] ],
696 'index' => [ [ 'disabled' ] ],
701 # 'titlenum', 'int', '', '',
702 # 'title', 'varchar', '', $char_d,
704 # 'primary_key' => 'titlenum',
705 # 'unique' => [ [] ],
711 'pkgpart', 'int', '', '',
712 'svcpart', 'int', '', '',
713 'quantity', 'int', '', '',
714 'primary_svc','char', 'NULL', 1,
717 'unique' => [ ['pkgpart', 'svcpart'] ],
718 'index' => [ ['pkgpart'] ],
723 'refnum', 'serial', '', '',
724 'referral', 'varchar', '', $char_d,
725 'disabled', 'char', 'NULL', 1,
727 'primary_key' => 'refnum',
729 'index' => [ ['disabled'] ],
734 'svcpart', 'serial', '', '',
735 'svc', 'varchar', '', $char_d,
736 'svcdb', 'varchar', '', $char_d,
737 'disabled', 'char', 'NULL', 1,
739 'primary_key' => 'svcpart',
741 'index' => [ [ 'disabled' ] ],
744 'part_svc_column' => {
746 'columnnum', 'serial', '', '',
747 'svcpart', 'int', '', '',
748 'columnname', 'varchar', '', 64,
749 'columnvalue', 'varchar', 'NULL', $char_d,
750 'columnflag', 'char', 'NULL', 1,
752 'primary_key' => 'columnnum',
753 'unique' => [ [ 'svcpart', 'columnname' ] ],
754 'index' => [ [ 'svcpart' ] ],
757 #(this should be renamed to part_pop)
760 'popnum', 'serial', '', '',
761 'city', 'varchar', '', $char_d,
762 'state', 'varchar', '', $char_d,
764 'exch', 'char', '', 3,
765 'loc', 'char', 'NULL', 4, #NULL for legacy purposes
767 'primary_key' => 'popnum',
769 'index' => [ [ 'state' ] ],
772 'part_pop_local' => {
774 'localnum', 'serial', '', '',
775 'popnum', 'int', '', '',
776 'city', 'varchar', 'NULL', $char_d,
777 'state', 'char', 'NULL', 2,
778 'npa', 'char', '', 3,
779 'nxx', 'char', '', 3,
781 'primary_key' => 'localnum',
783 'index' => [ [ 'npa', 'nxx' ], [ 'popnum' ] ],
788 'svcnum', 'int', '', '',
789 'username', 'varchar', '', $username_len, #unique (& remove dup code)
790 '_password', 'varchar', '', 72, #13 for encryped pw's plus ' *SUSPENDED* (md5 passwords can be 34, blowfish 60)
791 'sec_phrase', 'varchar', 'NULL', $char_d,
792 'popnum', 'int', 'NULL', '',
793 'uid', 'int', 'NULL', '',
794 'gid', 'int', 'NULL', '',
795 'finger', 'varchar', 'NULL', $char_d,
796 'dir', 'varchar', 'NULL', $char_d,
797 'shell', 'varchar', 'NULL', $char_d,
798 'quota', 'varchar', 'NULL', $char_d,
799 'slipip', 'varchar', 'NULL', 15, #four TINYINTs, bah.
800 'seconds', 'int', 'NULL', '', #uhhhh
801 'domsvc', 'int', '', '',
803 'primary_key' => 'svcnum',
804 #'unique' => [ [ 'username', 'domsvc' ] ],
806 'index' => [ ['username'], ['domsvc'] ],
811 # 'svcnum', 'int', '', '',
812 # 'amount', @money_type,
814 # 'primary_key' => 'svcnum',
815 # 'unique' => [ [] ],
821 'svcnum', 'int', '', '',
822 'domain', 'varchar', '', $char_d,
823 'catchall', 'int', 'NULL', '',
825 'primary_key' => 'svcnum',
826 'unique' => [ ['domain'] ],
832 'recnum', 'serial', '', '',
833 'svcnum', 'int', '', '',
834 #'reczone', 'varchar', '', $char_d,
835 'reczone', 'varchar', '', 255,
836 'recaf', 'char', '', 2,
837 'rectype', 'varchar', '', 5,
838 #'recdata', 'varchar', '', $char_d,
839 'recdata', 'varchar', '', 255,
841 'primary_key' => 'recnum',
843 'index' => [ ['svcnum'] ],
848 'svcnum', 'int', '', '',
849 'srcsvc', 'int', 'NULL', '',
850 'src', 'varchar', 'NULL', 255,
851 'dstsvc', 'int', 'NULL', '',
852 'dst', 'varchar', 'NULL', 255,
854 'primary_key' => 'svcnum',
856 'index' => [ ['srcsvc'], ['dstsvc'] ],
861 'svcnum', 'int', '', '',
862 'recnum', 'int', '', '',
863 'usersvc', 'int', '', '',
865 'primary_key' => 'svcnum',
872 # 'svcnum', 'int', '', '',
873 # 'svcnum', 'int', '', '',
874 # 'svcnum', 'int', '', '',
875 # 'worker', 'varchar', '', $char_d,
876 # '_date', @date_type,
878 # 'primary_key' => 'svcnum',
879 # 'unique' => [ [] ],
885 'prepaynum', 'serial', '', '',
886 'identifier', 'varchar', '', $char_d,
887 'amount', @money_type,
888 'seconds', 'int', 'NULL', '',
890 'primary_key' => 'prepaynum',
891 'unique' => [ ['identifier'] ],
897 'portnum', 'serial', '', '',
898 'ip', 'varchar', 'NULL', 15,
899 'nasport', 'int', 'NULL', '',
900 'nasnum', 'int', '', '',
902 'primary_key' => 'portnum',
909 'nasnum', 'serial', '', '',
910 'nas', 'varchar', '', $char_d,
911 'nasip', 'varchar', '', 15,
912 'nasfqdn', 'varchar', '', $char_d,
913 'last', 'int', '', '',
915 'primary_key' => 'nasnum',
916 'unique' => [ [ 'nas' ], [ 'nasip' ] ],
917 'index' => [ [ 'last' ] ],
922 'sessionnum', 'serial', '', '',
923 'portnum', 'int', '', '',
924 'svcnum', 'int', '', '',
926 'logout', @date_type,
928 'primary_key' => 'sessionnum',
930 'index' => [ [ 'portnum' ] ],
935 'jobnum', 'serial', '', '',
936 'job', 'text', '', '',
937 '_date', 'int', '', '',
938 'status', 'varchar', '', $char_d,
939 'statustext', 'text', 'NULL', '',
940 'svcnum', 'int', 'NULL', '',
942 'primary_key' => 'jobnum',
944 'index' => [ [ 'svcnum' ], [ 'status' ] ],
949 'argnum', 'serial', '', '',
950 'jobnum', 'int', '', '',
951 'arg', 'text', 'NULL', '',
953 'primary_key' => 'argnum',
955 'index' => [ [ 'jobnum' ] ],
960 'dependnum', 'serial', '', '',
961 'jobnum', 'int', '', '',
962 'depend_jobnum', 'int', '', '',
964 'primary_key' => 'dependnum',
966 'index' => [ [ 'jobnum' ], [ 'depend_jobnum' ] ],
971 'exportsvcnum' => 'serial', '', '',
972 'exportnum' => 'int', '', '',
973 'svcpart' => 'int', '', '',
975 'primary_key' => 'exportsvcnum',
976 'unique' => [ [ 'exportnum', 'svcpart' ] ],
977 'index' => [ [ 'exportnum' ], [ 'svcpart' ] ],
982 'exportnum', 'serial', '', '',
983 #'svcpart', 'int', '', '',
984 'machine', 'varchar', '', $char_d,
985 'exporttype', 'varchar', '', $char_d,
986 'nodomain', 'char', 'NULL', 1,
988 'primary_key' => 'exportnum',
990 'index' => [ [ 'machine' ], [ 'exporttype' ] ],
993 'part_export_option' => {
995 'optionnum', 'serial', '', '',
996 'exportnum', 'int', '', '',
997 'optionname', 'varchar', '', $char_d,
998 'optionvalue', 'text', 'NULL', '',
1000 'primary_key' => 'optionnum',
1002 'index' => [ [ 'exportnum' ], [ 'optionname' ] ],
1005 'radius_usergroup' => {
1007 'usergroupnum', 'serial', '', '',
1008 'svcnum', 'int', '', '',
1009 'groupname', 'varchar', '', $char_d,
1011 'primary_key' => 'usergroupnum',
1013 'index' => [ [ 'svcnum' ], [ 'groupname' ] ],
1018 'msgnum', 'serial', '', '',
1019 'msgcode', 'varchar', '', $char_d,
1020 'locale', 'varchar', '', 16,
1021 'msg', 'text', '', '',
1023 'primary_key' => 'msgnum',
1024 'unique' => [ [ 'msgcode', 'locale' ] ],
1028 'cust_tax_exempt' => {
1030 'exemptnum', 'serial', '', '',
1031 'custnum', 'int', '', '',
1032 'taxnum', 'int', '', '',
1033 'year', 'int', '', '',
1034 'month', 'int', '', '',
1035 'amount', @money_type,
1037 'primary_key' => 'exemptnum',
1038 'unique' => [ [ 'custnum', 'taxnum', 'year', 'month' ] ],
1044 'routernum', 'serial', '', '',
1045 'routername', 'varchar', '', $char_d,
1046 'svcnum', 'int', 'NULL', '',
1048 'primary_key' => 'routernum',
1053 'part_svc_router' => {
1055 'svcpart', 'int', '', '',
1056 'routernum', 'int', '', '',
1058 'primary_key' => '',
1065 'blocknum', 'serial', '', '',
1066 'routernum', 'int', '', '',
1067 'ip_gateway', 'varchar', '', 15,
1068 'ip_netmask', 'int', '', '',
1070 'primary_key' => 'blocknum',
1071 'unique' => [ [ 'blocknum', 'routernum' ] ],
1075 'svc_broadband' => {
1077 'svcnum', 'int', '', '',
1078 'blocknum', 'int', '', '',
1079 'speed_up', 'int', '', '',
1080 'speed_down', 'int', '', '',
1081 'ip_addr', 'varchar', '', 15,
1083 'primary_key' => 'svcnum',
1088 'part_virtual_field' => {
1090 'vfieldpart', 'int', '', '',
1091 'dbtable', 'varchar', '', 32,
1092 'name', 'varchar', '', 32,
1093 'check_block', 'text', 'NULL', '',
1094 'length', 'int', 'NULL', '',
1095 'list_source', 'text', 'NULL', '',
1096 'label', 'varchar', 'NULL', 80,
1098 'primary_key' => 'vfieldpart',
1103 'virtual_field' => {
1105 'recnum', 'int', '', '',
1106 'vfieldpart', 'int', '', '',
1107 'value', 'varchar', '', 128,
1109 'primary_key' => '',
1110 'unique' => [ [ 'vfieldpart', 'recnum' ] ],
1116 'snarfnum', 'int', '', '',
1117 'svcnum', 'int', '', '',
1118 'machine', 'varchar', '', 255,
1119 'protocol', 'varchar', '', $char_d,
1120 'username', 'varchar', '', $char_d,
1121 '_password', 'varchar', '', $char_d,
1123 'primary_key' => 'snarfnum',
1125 'index' => [ [ 'svcnum' ] ],
1130 'svcnum', 'int', '', '',
1131 'id', 'int', 'NULL', '',
1132 'title', 'varchar', 'NULL', $char_d,
1134 'primary_key' => 'svcnum',
1139 'cust_pay_refund' => {
1141 'payrefundnum', 'serial', '', '',
1142 'paynum', 'int', '', '',
1143 'refundnum', 'int', '', '',
1144 '_date', @date_type,
1145 'amount', @money_type,
1147 'primary_key' => 'payrefundnum',
1149 'index' => [ ['paynum'], ['refundnum'] ],
1152 'part_pkg_option' => {
1154 'optionnum', 'serial', '', '',
1155 'pkgpart', 'int', '', '',
1156 'optionname', 'varchar', '', $char_d,
1157 'optionvalue', 'text', 'NULL', '',
1159 'primary_key' => 'optionnum',
1161 'index' => [ [ 'pkgpart' ], [ 'optionname' ] ],
1166 'ratenum', 'serial', '', '',
1167 'ratename', 'varchar', '', $char_d,
1169 'primary_key' => 'ratenum',
1176 'ratenum', 'int', '', '',
1177 'orig_regionnum', 'int', 'NULL', '',
1178 'dest_regionnum', 'int', '', '',
1179 'min_included', 'int', '', '',
1180 'min_charge', @money_type,
1181 'sec_granularity', 'int', '', '',
1182 #time period (link to table of periods)?
1184 'primary_key' => '',
1185 'unique' => [ [ 'ratenum', 'orig_regionnum', 'dest_regionnum' ] ],
1191 'regionnum', 'serial', '', '',
1192 'regionname', 'varchar', '', $char_d,
1193 'primary_key' => 'regionnum',
1200 'prefixnum', 'serial', '', '',
1201 'regionnum', 'int', '', '',,
1202 'countrycode', 'varchar', '', 3,
1203 'npa', 'varchar', 'NULL', 4, #not 3?
1204 'nxx', 'varchar', 'NULL', 3,
1206 'primary_key' => 'prefixnum',
1208 'index' => [ [ 'countrycode' ], [ 'regionnum' ] ],