<& /elements/tr-td-label.html, label => ($opt{'label'} || 'Router'), required => $opt{'required'} &> <& /elements/select-tiered.html, prefix => 'router_', tiers => [ { field => 'routernum', records => \@routers, name_col => 'routername', value_col => 'routernum', onchange => 'update_ip_addr', curr_value=> $opt{'routernum'}, }, { field => 'blocknum', table => 'addr_block', hashref => (exists($fixed{'blocknum'}) ? { blocknum => $fixed{'blocknum'} } : {} ), name_col => 'cidr', link_col => 'routernum', empty_label => '(any)', onchange => 'update_ip_addr', curr_value => $opt{'blocknum'}, }, ] &> <& /elements/tr-td-label.html, label => ($opt{'ip_addr_label'} || 'IP address'), required => $opt{'ip_addr_required'} &> % #warn Dumper \%fixed; % if ( exists $fixed{$ip_field} ) { <% $opt{'ip_addr'} || '' %> % } % else { % } <%init> my %opt = @_; my @routers; my $conf = FS::Conf->new; my $svc_x = $opt{'object'}; if ( $svc_x ) { # $svc_x->ip_addr does work, even for non-svc_broadband. $opt{$_} = $svc_x->$_ foreach qw(routernum blocknum ip_addr svcpart); if ( $svc_x->svcnum ) { $opt{'svcpart'} = $svc_x->cust_svc->svcpart; } } my $svcpart = $opt{'svcpart'} || ''; my $ip_field = $opt{'ip_field'} || 'ip_addr'; my %fixed; # which fields are fixed $svcpart =~ /^\d*$/ or die "invalid svcpart '$svcpart'"; if ( $svcpart ) { my $part_svc = FS::part_svc->by_key($svcpart); # Traditionally, columnflag 'F' on IP address means that it MUST # be auto-assigned (or, if null IP addresses are allowed, that # it must be null). foreach (qw(routernum blocknum), $ip_field) { my $psc = $part_svc->part_svc_column($_); if ( $psc and $psc->columnflag eq 'F' ) { $fixed{$_} = $psc->columnvalue; } } if ( exists $fixed{'routernum'} ) { @routers = (FS::router->by_key($fixed{'routernum'})) } else { @routers = map { $_->router } qsearch('part_svc_router', { svcpart => $svcpart }); } } else { @routers = qsearch('router', {}); } my %manual_addr_routernum = map { $_->routernum, $_->manual_addr } @routers; if ( $conf->exists('auto_router') ) { # Then show an "(automatic)" router, with no blocks. manual_addr is on # so that the ip_addr field will be unlocked. unshift @routers, FS::router->new({ 'routernum' => '', 'routername' => '(automatic)', 'manual_addr' => 'Y', }); $manual_addr_routernum{''} = 'Y'; }