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' ],
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,
684 'freq', 'varchar', '', $char_d, #billing frequency
686 'setuptax', 'char', 'NULL', 1,
687 'recurtax', 'char', 'NULL', 1,
688 'plan', 'varchar', 'NULL', $char_d,
689 'plandata', 'text', 'NULL', '',
690 'disabled', 'char', 'NULL', 1,
691 'taxclass', 'varchar', 'NULL', $char_d,
693 'primary_key' => 'pkgpart',
695 'index' => [ [ 'disabled' ], ],
700 # 'titlenum', 'int', '', '',
701 # 'title', 'varchar', '', $char_d,
703 # 'primary_key' => 'titlenum',
704 # 'unique' => [ [] ],
710 'pkgpart', 'int', '', '',
711 'svcpart', 'int', '', '',
712 'quantity', 'int', '', '',
713 'primary_svc','char', 'NULL', 1,
716 'unique' => [ ['pkgpart', 'svcpart'] ],
717 'index' => [ ['pkgpart'] ],
722 'refnum', 'serial', '', '',
723 'referral', 'varchar', '', $char_d,
724 'disabled', 'char', 'NULL', 1,
726 'primary_key' => 'refnum',
728 'index' => [ ['disabled'] ],
733 'svcpart', 'serial', '', '',
734 'svc', 'varchar', '', $char_d,
735 'svcdb', 'varchar', '', $char_d,
736 'disabled', 'char', 'NULL', 1,
738 'primary_key' => 'svcpart',
740 'index' => [ [ 'disabled' ] ],
743 'part_svc_column' => {
745 'columnnum', 'serial', '', '',
746 'svcpart', 'int', '', '',
747 'columnname', 'varchar', '', 64,
748 'columnvalue', 'varchar', 'NULL', $char_d,
749 'columnflag', 'char', 'NULL', 1,
751 'primary_key' => 'columnnum',
752 'unique' => [ [ 'svcpart', 'columnname' ] ],
753 'index' => [ [ 'svcpart' ] ],
756 #(this should be renamed to part_pop)
759 'popnum', 'serial', '', '',
760 'city', 'varchar', '', $char_d,
761 'state', 'varchar', '', $char_d,
763 'exch', 'char', '', 3,
764 'loc', 'char', 'NULL', 4, #NULL for legacy purposes
766 'primary_key' => 'popnum',
768 'index' => [ [ 'state' ] ],
771 'part_pop_local' => {
773 'localnum', 'serial', '', '',
774 'popnum', 'int', '', '',
775 'city', 'varchar', 'NULL', $char_d,
776 'state', 'char', 'NULL', 2,
777 'npa', 'char', '', 3,
778 'nxx', 'char', '', 3,
780 'primary_key' => 'localnum',
782 'index' => [ [ 'npa', 'nxx' ], [ 'popnum' ] ],
787 'svcnum', 'int', '', '',
788 'username', 'varchar', '', $username_len, #unique (& remove dup code)
789 '_password', 'varchar', '', 72, #13 for encryped pw's plus ' *SUSPENDED* (md5 passwords can be 34, blowfish 60)
790 'sec_phrase', 'varchar', 'NULL', $char_d,
791 'popnum', 'int', 'NULL', '',
792 'uid', 'int', 'NULL', '',
793 'gid', 'int', 'NULL', '',
794 'finger', 'varchar', 'NULL', $char_d,
795 'dir', 'varchar', 'NULL', $char_d,
796 'shell', 'varchar', 'NULL', $char_d,
797 'quota', 'varchar', 'NULL', $char_d,
798 'slipip', 'varchar', 'NULL', 15, #four TINYINTs, bah.
799 'seconds', 'int', 'NULL', '', #uhhhh
800 'domsvc', 'int', '', '',
802 'primary_key' => 'svcnum',
803 #'unique' => [ [ 'username', 'domsvc' ] ],
805 'index' => [ ['username'], ['domsvc'] ],
810 # 'svcnum', 'int', '', '',
811 # 'amount', @money_type,
813 # 'primary_key' => 'svcnum',
814 # 'unique' => [ [] ],
820 'svcnum', 'int', '', '',
821 'domain', 'varchar', '', $char_d,
822 'catchall', 'int', 'NULL', '',
824 'primary_key' => 'svcnum',
825 'unique' => [ ['domain'] ],
831 'recnum', 'serial', '', '',
832 'svcnum', 'int', '', '',
833 #'reczone', 'varchar', '', $char_d,
834 'reczone', 'varchar', '', 255,
835 'recaf', 'char', '', 2,
836 'rectype', 'varchar', '', 5,
837 #'recdata', 'varchar', '', $char_d,
838 'recdata', 'varchar', '', 255,
840 'primary_key' => 'recnum',
842 'index' => [ ['svcnum'] ],
847 'svcnum', 'int', '', '',
848 'srcsvc', 'int', 'NULL', '',
849 'src', 'varchar', 'NULL', 255,
850 'dstsvc', 'int', 'NULL', '',
851 'dst', 'varchar', 'NULL', 255,
853 'primary_key' => 'svcnum',
855 'index' => [ ['srcsvc'], ['dstsvc'] ],
860 'svcnum', 'int', '', '',
861 'recnum', 'int', '', '',
862 'usersvc', 'int', '', '',
864 'primary_key' => 'svcnum',
871 # 'svcnum', 'int', '', '',
872 # 'svcnum', 'int', '', '',
873 # 'svcnum', 'int', '', '',
874 # 'worker', 'varchar', '', $char_d,
875 # '_date', @date_type,
877 # 'primary_key' => 'svcnum',
878 # 'unique' => [ [] ],
884 'prepaynum', 'serial', '', '',
885 'identifier', 'varchar', '', $char_d,
886 'amount', @money_type,
887 'seconds', 'int', 'NULL', '',
889 'primary_key' => 'prepaynum',
890 'unique' => [ ['identifier'] ],
896 'portnum', 'serial', '', '',
897 'ip', 'varchar', 'NULL', 15,
898 'nasport', 'int', 'NULL', '',
899 'nasnum', 'int', '', '',
901 'primary_key' => 'portnum',
908 'nasnum', 'serial', '', '',
909 'nas', 'varchar', '', $char_d,
910 'nasip', 'varchar', '', 15,
911 'nasfqdn', 'varchar', '', $char_d,
912 'last', 'int', '', '',
914 'primary_key' => 'nasnum',
915 'unique' => [ [ 'nas' ], [ 'nasip' ] ],
916 'index' => [ [ 'last' ] ],
921 'sessionnum', 'serial', '', '',
922 'portnum', 'int', '', '',
923 'svcnum', 'int', '', '',
925 'logout', @date_type,
927 'primary_key' => 'sessionnum',
929 'index' => [ [ 'portnum' ] ],
934 'jobnum', 'serial', '', '',
935 'job', 'text', '', '',
936 '_date', 'int', '', '',
937 'status', 'varchar', '', $char_d,
938 'statustext', 'text', 'NULL', '',
939 'svcnum', 'int', 'NULL', '',
941 'primary_key' => 'jobnum',
943 'index' => [ [ 'svcnum' ], [ 'status' ] ],
948 'argnum', 'serial', '', '',
949 'jobnum', 'int', '', '',
950 'arg', 'text', 'NULL', '',
952 'primary_key' => 'argnum',
954 'index' => [ [ 'jobnum' ] ],
959 'dependnum', 'serial', '', '',
960 'jobnum', 'int', '', '',
961 'depend_jobnum', 'int', '', '',
963 'primary_key' => 'dependnum',
965 'index' => [ [ 'jobnum' ], [ 'depend_jobnum' ] ],
970 'exportsvcnum' => 'serial', '', '',
971 'exportnum' => 'int', '', '',
972 'svcpart' => 'int', '', '',
974 'primary_key' => 'exportsvcnum',
975 'unique' => [ [ 'exportnum', 'svcpart' ] ],
976 'index' => [ [ 'exportnum' ], [ 'svcpart' ] ],
981 'exportnum', 'serial', '', '',
982 #'svcpart', 'int', '', '',
983 'machine', 'varchar', '', $char_d,
984 'exporttype', 'varchar', '', $char_d,
985 'nodomain', 'char', 'NULL', 1,
987 'primary_key' => 'exportnum',
989 'index' => [ [ 'machine' ], [ 'exporttype' ] ],
992 'part_export_option' => {
994 'optionnum', 'serial', '', '',
995 'exportnum', 'int', '', '',
996 'optionname', 'varchar', '', $char_d,
997 'optionvalue', 'text', 'NULL', '',
999 'primary_key' => 'optionnum',
1001 'index' => [ [ 'exportnum' ], [ 'optionname' ] ],
1004 'radius_usergroup' => {
1006 'usergroupnum', 'serial', '', '',
1007 'svcnum', 'int', '', '',
1008 'groupname', 'varchar', '', $char_d,
1010 'primary_key' => 'usergroupnum',
1012 'index' => [ [ 'svcnum' ], [ 'groupname' ] ],
1017 'msgnum', 'serial', '', '',
1018 'msgcode', 'varchar', '', $char_d,
1019 'locale', 'varchar', '', 16,
1020 'msg', 'text', '', '',
1022 'primary_key' => 'msgnum',
1023 'unique' => [ [ 'msgcode', 'locale' ] ],
1027 'cust_tax_exempt' => {
1029 'exemptnum', 'serial', '', '',
1030 'custnum', 'int', '', '',
1031 'taxnum', 'int', '', '',
1032 'year', 'int', '', '',
1033 'month', 'int', '', '',
1034 'amount', @money_type,
1036 'primary_key' => 'exemptnum',
1037 'unique' => [ [ 'custnum', 'taxnum', 'year', 'month' ] ],
1043 'routernum', 'serial', '', '',
1044 'routername', 'varchar', '', $char_d,
1045 'svcnum', 'int', 'NULL', '',
1047 'primary_key' => 'routernum',
1052 'part_svc_router' => {
1054 'svcpart', 'int', '', '',
1055 'routernum', 'int', '', '',
1057 'primary_key' => '',
1064 'blocknum', 'serial', '', '',
1065 'routernum', 'int', '', '',
1066 'ip_gateway', 'varchar', '', 15,
1067 'ip_netmask', 'int', '', '',
1069 'primary_key' => 'blocknum',
1070 'unique' => [ [ 'blocknum', 'routernum' ] ],
1074 'svc_broadband' => {
1076 'svcnum', 'int', '', '',
1077 'blocknum', 'int', '', '',
1078 'speed_up', 'int', '', '',
1079 'speed_down', 'int', '', '',
1080 'ip_addr', 'varchar', '', 15,
1082 'primary_key' => 'svcnum',
1087 'part_virtual_field' => {
1089 'vfieldpart', 'int', '', '',
1090 'dbtable', 'varchar', '', 32,
1091 'name', 'varchar', '', 32,
1092 'check_block', 'text', 'NULL', '',
1093 'length', 'int', 'NULL', '',
1094 'list_source', 'text', 'NULL', '',
1095 'label', 'varchar', 'NULL', 80,
1097 'primary_key' => 'vfieldpart',
1102 'virtual_field' => {
1104 'recnum', 'int', '', '',
1105 'vfieldpart', 'int', '', '',
1106 'value', 'varchar', '', 128,
1108 'primary_key' => '',
1109 'unique' => [ [ 'vfieldpart', 'recnum' ] ],
1115 'snarfnum', 'int', '', '',
1116 'svcnum', 'int', '', '',
1117 'machine', 'varchar', '', 255,
1118 'protocol', 'varchar', '', $char_d,
1119 'username', 'varchar', '', $char_d,
1120 '_password', 'varchar', '', $char_d,
1122 'primary_key' => 'snarfnum',
1124 'index' => [ [ 'svcnum' ] ],
1129 'svcnum', 'int', '', '',
1130 'id', 'int', '', '',
1131 'title', 'varchar', 'NULL', $char_d,
1133 'primary_key' => 'svcnum',
1138 'cust_pay_refund' => {
1140 'payrefundnum', 'serial', '', '',
1141 'paynum', 'int', '', '',
1142 'refundnum', 'int', '', '',
1143 '_date', @date_type,
1144 'amount', @money_type,
1146 'primary_key' => 'payrefundnum',
1148 'index' => [ ['paynum'], ['refundnum'] ],