'description' => 'Descriptive label for this particular device',
'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' =>
- #{ 'label' => 'Address block',
- # 'type' => 'select',
- # 'select_table' => 'addr_block',
- # 'select_key' => 'blocknum',
- # 'select_label' => 'cidr',
- # 'disable_inventory' => 1,
- # },
+ 'ip_addr' => 'IP address. Leave blank for automatic assignment.',
+ 'blocknum' =>
+ { 'label' => 'Address block',
+ 'type' => 'select',
+ 'select_table' => 'addr_block',
+ 'select_key' => 'blocknum',
+ 'select_label' => 'cidr',
+ 'disable_inventory' => 1,
+ },
'plan_id' => 'Service Plan Id',
'performance_profile' => 'Peformance Profile',
'authkey' => 'Authentication key',
? qsearchs('cust_svc', { 'svcnum' => $self->svcnum } )
: '';
my $cust_pkg;
+ my $svcpart;
if ($cust_svc) {
$cust_pkg = $cust_svc->cust_pkg;
+ $svcpart = $cust_svc->svcpart;
}else{
$cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $self->pkgnum } );
return "Invalid pkgnum" unless $cust_pkg;
+ $svcpart = $self->svcpart;
}
my $agentnum = $cust_pkg->cust_main->agentnum if $cust_pkg;
if ($self->routernum) {
return "Router ".$self->routernum." does not provide this service"
unless qsearchs('part_svc_router', {
- svcpart => $self->cust_svc->svcpart,
+ svcpart => $svcpart,
routernum => $self->routernum
});
if $router->agentnum and $router->agentnum != $agentnum;
if ( $router->auto_addr ) {
- my $error = $self->assign_ip_addr;
- return $error if $error;
+ my $addr_block = $self->addr_block;
+ unless ( $addr_block and $addr_block->manual_flag ) {
+ my $error = $self->assign_ip_addr;
+ return $error if $error;
+ }
}
else {
$self->blocknum('');
qsearchs('router', { routernum => $self->routernum });
}
-=back
-
=item allowed_routers
Returns a list of allowed FS::router objects.
sub allowed_routers {
my $self = shift;
+ my $svcpart = $self->svcnum ? $self->cust_svc->svcpart : $self->svcpart;
map { $_->router } qsearch('part_svc_router',
{ svcpart => $self->cust_svc->svcpart });
}
+=back
+
+
+=item mac_addr_formatted CASE DELIMITER
+
+Format the MAC address (for use by exports). If CASE starts with "l"
+(for "lowercase"), it's returned in lowercase. DELIMITER is inserted
+between octets.
+
+=cut
+
+sub mac_addr_formatted {
+ my $self = shift;
+ my ($case, $delim) = @_;
+ my $addr = $self->mac_addr;
+ $addr = lc($addr) if $case =~ /^l/i;
+ join( $delim || '', $addr =~ /../g );
+}
#class method
sub _upgrade_data {
my $class = shift;
+ local($FS::svc_Common::noexport_hack) = 1;
+
# set routernum to addr_block.routernum
foreach my $self (qsearch('svc_broadband', {
blocknum => {op => '!=', value => ''},
routernum => ''
})) {
my $addr_block = $self->addr_block;
- if ( my $routernum = $addr_block->routernum ) {
+ my $ip_addr = $self->ip_addr;
+ my $routernum = $addr_block->routernum;
+ if ( $routernum ) {
$self->set(routernum => $routernum);
- my $error = $self->replace;
+ my $error = $self->check;
+ # sanity check: don't allow this to change IP address or block
+ # (other than setting blocknum to null for a non-auto-assigned router)
+ if ( $self->ip_addr ne $ip_addr
+ or ($self->blocknum and $self->blocknum != $addr_block->blocknum)) {
+ warn "WARNING: Upgrading service ".$self->svcnum." would change its block/address; skipped.\n";
+ next;
+ }
+
+ $error ||= $self->replace;
die "error assigning routernum $routernum to service ".$self->svcnum.
":\n$error\n"
if $error;
'';
}
+=back
+
=head1 BUGS
The business with sb_field has been 'fixed', in a manner of speaking.