X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=FS%2FFS%2Fsvc_broadband.pm;h=74cedfc77792a70ac05cfa2ce12c4e6680f4e32e;hb=ad7f49821d40ffd099a45acc32ba91e0e211aede;hp=68e7496d194c37bff81dba4d82fdef8bf760a474;hpb=c648976f0b7975f2328ebd7ba8c711fad0ca4195;p=freeside.git diff --git a/FS/FS/svc_broadband.pm b/FS/FS/svc_broadband.pm index 68e7496d1..74cedfc77 100755 --- a/FS/FS/svc_broadband.pm +++ b/FS/FS/svc_broadband.pm @@ -6,6 +6,7 @@ use FS::Record qw( qsearchs qsearch dbh ); use FS::svc_Common; use FS::cust_svc; use FS::addr_block; +use FS::part_svc_router; use NetAddr::IP; @ISA = qw( FS::svc_Common ); @@ -97,13 +98,21 @@ sub table_info { 'speed_down' => 'Maximum download speed for this service in Kbps. 0 denotes unlimited.', 'speed_up' => 'Maximum upload speed for this service in Kbps. 0 denotes unlimited.', 'ip_addr' => 'IP address. Leave blank for automatic assignment.', - 'blocknum' => 'Address block.', + 'blocknum' => { 'label' => 'Address block', + 'type' => 'select', + 'select_table' => 'addr_block', + 'select_key' => 'blocknum', + 'select_label' => 'cidr', + 'disable_inventory' => 1, + }, }, }; } sub table { 'svc_broadband'; } +sub table_dupcheck_fields { ( 'mac_addr' ); } + =item search_sql STRING Class method which returns an SQL fragment to search for the given string. @@ -197,7 +206,7 @@ sub check { my $error = $self->ut_numbern('svcnum') - || $self->ut_foreign_key('blocknum', 'addr_block', 'blocknum') + || $self->ut_numbern('blocknum') || $self->ut_textn('description') || $self->ut_number('speed_up') || $self->ut_number('speed_down') @@ -214,13 +223,64 @@ sub check { if($self->speed_up < 0) { return 'speed_up must be positive'; } if($self->speed_down < 0) { return 'speed_down must be positive'; } + my $cust_svc = $self->svcnum + ? qsearchs('cust_svc', { 'svcnum' => $self->svcnum } ) + : ''; + my $cust_pkg; + if ($cust_svc) { + $cust_pkg = $cust_svc->cust_pkg; + }else{ + $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $self->pkgnum } ); + return "Invalid pkgnum" unless $cust_pkg; + } + + if ($self->blocknum) { + $error = $self->ut_foreign_key('blocknum', 'addr_block', 'blocknum'); + return $error if $error; + } + + if ($cust_pkg && $self->blocknum) { + my $addr_agentnum = $self->addr_block->agentnum; + if ($addr_agentnum && $addr_agentnum != $cust_pkg->cust_main->agentnum) { + return "Address block does not service this customer"; + } + } + + $error = $self->_check_ip_addr; + return $error if $error; + + $self->SUPER::check; +} + +sub _check_ip_addr { + my $self = shift; + if (not($self->ip_addr) or $self->ip_addr eq '0.0.0.0') { + + return '' if $conf->exists('svc_broadband-allow_null_ip_addr'); #&& !$self->blocknum + + return "Must supply either address or block" + unless $self->blocknum; my $next_addr = $self->addr_block->next_free_addr; if ($next_addr) { $self->ip_addr($next_addr->addr); } else { return "No free addresses in addr_block (blocknum: ".$self->blocknum.")"; } + + } + + if (not($self->blocknum)) { + return "Must supply either address or block" + unless ($self->ip_addr and $self->ip_addr ne '0.0.0.0'); + my @block = grep { $_->NetAddr->contains($self->NetAddr) } + map { $_->addr_block } + $self->allowed_routers; + if (scalar(@block)) { + $self->blocknum($block[0]->blocknum); + }else{ + return "Address not with available block."; + } } # This should catch errors in the ip_addr. If it doesn't, @@ -241,9 +301,21 @@ sub check { return 'Router '.$router->routernum.' cannot provide svcpart '.$self->svcpart; } - $self->SUPER::check; + ''; } +sub _check_duplicate { + my $self = shift; + + return "MAC already in use" + if ( $self->mac_addr && + scalar( qsearch( 'svc_broadband', { 'mac_addr', $self->mac_addr } ) ) + ); + + ''; +} + + =item NetAddr Returns a NetAddr::IP object containing the IP address of this service. The netmask @@ -253,7 +325,7 @@ is /32. sub NetAddr { my $self = shift; - return new NetAddr::IP ($self->ip_addr); + new NetAddr::IP ($self->ip_addr); } =item addr_block @@ -264,8 +336,7 @@ Returns the FS::addr_block record (i.e. the address block) for this broadband se sub addr_block { my $self = shift; - - return qsearchs('addr_block', { blocknum => $self->blocknum }); + qsearchs('addr_block', { blocknum => $self->blocknum }); } =back @@ -278,14 +349,16 @@ Returns a list of allowed FS::router objects. sub allowed_routers { my $self = shift; - - return map { $_->router } qsearch('part_svc_router', { svcpart => $self->svcpart }); + map { $_->router } qsearch('part_svc_router', { svcpart => $self->svcpart }); } =head1 BUGS The business with sb_field has been 'fixed', in a manner of speaking. +allowed_routers isn't agent virtualized because part_svc isn't agent +virtualized + =head1 SEE ALSO FS::svc_Common, FS::Record, FS::addr_block,