Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Saksbehandlere: legger på ansettelsessted, går over til fornavn+etternavn #2098

Merged
merged 1 commit into from
Aug 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package no.nav.foreldrepenger.los.organisasjon.ansatt;

import java.time.Duration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
Expand All @@ -26,6 +28,9 @@ public class AnsattTjeneste {
private OrganisasjonRepository organisasjonRepository;
private List<String> aktuelleEnhetIder;

private final Map<String, String> kodeAvdelingsnavnMap = new HashMap<>();


AnsattTjeneste() {
// for CDI proxy
}
Expand All @@ -35,20 +40,22 @@ public AnsattTjeneste(EnhetstilgangTjeneste enhetstilgangTjeneste,
OrganisasjonRepository organisasjonRepository) {
this.enhetstilgangTjeneste = enhetstilgangTjeneste;
this.organisasjonRepository = organisasjonRepository;
organisasjonRepository.hentAktiveAvdelinger().forEach(a -> kodeAvdelingsnavnMap.put(a.getAvdelingEnhet(), a.getNavn()));
}

public BrukerProfil hentBrukerProfil(String ident) {
if (ANSATT_PROFIL.get(ident) == null) {
//TODO: Her bør vi egentlig tenke om NOM er ikke riktigere å bruke - bør være raskere å slå opp navn og epost.
// Jeg har sjekket med NOM (01.07.2024) og de støtter en så lenge ikke Z-identer i dev. Men prod brukere er tilgjengelig.
var før = System.nanoTime();
var brukerProfil = new LdapBrukeroppslag().hentBrukerProfil(ident);
var ldapRespons = new LdapBrukeroppslag().hentBrukerProfil(ident);
LOG.info("LDAP bruker profil oppslag: {}ms. ", Duration.ofNanos(System.nanoTime() - før).toMillis());
if (brukerProfil == null) {
LOG.warn("Kunne ikke hente Bruker profil fra LDAP for {}", ident);
} else {
sammenlignMedAzureGraphFailSoft(ident, brukerProfil);
var ansattEnhet = kodeAvdelingsnavnMap.get(ldapRespons.ansattEnhet());
if (ansattEnhet == null) {
LOG.info("PROFIL LDAP: brukers enhet {} ikke blant saksbehandlingsenhetene", ldapRespons.ansattEnhet());
}
var brukerProfil = new BrukerProfil(ldapRespons.ident(), ldapRespons.navn(), ldapRespons.epostAdresse(), ansattEnhet);
sammenlignMedAzureGraphFailSoft(ident, brukerProfil);
ANSATT_PROFIL.put(ident, brukerProfil);
}
return ANSATT_PROFIL.get(ident);
Expand All @@ -71,7 +78,7 @@ private static void sammenlignMedAzureGraphFailSoft(String ident, BrukerProfil l
}

private static BrukerProfil mapTilDomene(AzureBrukerKlient.BrukerProfilResponse klientResponse) {
return new BrukerProfil(klientResponse.ident(), klientResponse.navn(), klientResponse.epost());
return new BrukerProfil(klientResponse.ident(), klientResponse.fornavnEtternavn(), klientResponse.epost(), klientResponse.ansattVedEnhetId());
}

public List<String> hentAvdelingerNavnForAnsatt(String ident) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,5 @@ public BrukerProfilResponse brukerProfil(String ident) {

record BrukerProfilRequest(@NotNull String ident) {}

public record BrukerProfilResponse(String ident, String navn, String epost) {}
public record BrukerProfilResponse(String ident, String fornavnEtternavn, String epost, String ansattVedEnhetId) {}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package no.nav.foreldrepenger.los.organisasjon.ansatt;

public record BrukerProfil(String ident, String navn, String epostAdresse) {
public record BrukerProfil(String ident, String navn, String epostAdresse, String ansattAvdeling) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,13 @@ public class LdapBrukeroppslag {

private static final Logger LOG = LoggerFactory.getLogger(LdapBrukeroppslag.class);
private static final Pattern IDENT_PATTERN = Pattern.compile("^\\p{LD}+$");
private static final String DISPLAY_NAME_ATTR = "displayName";
private static final String USER_PRINCIPAL_NAME_ATTR = "userPrincipalName";

private final LdapContext context;
private final LdapName searchBase;
private static final String GIVEN_NAME = "givenName";
private static final String SURNAME = "sn";
private static final String USER_PRINCIPAL_NAME = "userPrincipalName";
private static final String STREET_ADDRESS = "streetAddress";

public LdapBrukeroppslag() {
this(LdapInnlogging.lagLdapContext(), lagLdapSearchBase());
Expand All @@ -37,17 +39,22 @@ public LdapBrukeroppslag() {
this.searchBase = searcBase;
}

public BrukerProfil hentBrukerProfil(String ident) {
public BrukerProfilRespons hentBrukerProfil(String ident) {
var result = ldapSearch(ident.trim());
var displayName = find(result, DISPLAY_NAME_ATTR);
var upn = find(result, USER_PRINCIPAL_NAME_ATTR);
var givenName = find(result, GIVEN_NAME);
var surname = find(result, SURNAME);
var upn = find(result, USER_PRINCIPAL_NAME);
var addressCode = find(result, STREET_ADDRESS);
try {
var navn = displayName.get().toString();
var fornavn = givenName.get().toString();
var etternavn = surname.get().toString();
var navn = fornavn + " " + etternavn;
var epostAdresse = upn.get().toString();
var ansattKontornummer = addressCode.get().toString();
if (!epostAdresse.contains("@nav.no")) {
LOG.info("LDAP: fant ikke gyldig epostadresse for bruker {}", ident);
}
return new BrukerProfil(ident, navn, epostAdresse);
return new BrukerProfilRespons(ident, navn, epostAdresse, ansattKontornummer);
} catch (NamingException e) {
throw new TekniskException("F-314006", String.format("Kunne ikke hente ut attributtverdi for ident %s", ident), e);
}
Expand All @@ -65,7 +72,7 @@ private SearchResult ldapSearch(String ident) {
var controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
controls.setCountLimit(1);
controls.setReturningAttributes(new String[]{DISPLAY_NAME_ATTR, USER_PRINCIPAL_NAME_ATTR});
controls.setReturningAttributes(new String[]{GIVEN_NAME, SURNAME, USER_PRINCIPAL_NAME, STREET_ADDRESS});
var søkestreng = String.format("(cn=%s)", ident);
try {
var result = context.search(searchBase, søkestreng, controls); // NOSONAR
Expand Down Expand Up @@ -98,4 +105,6 @@ private static LdapName lagLdapSearchBase() {
}
}

public record BrukerProfilRespons(String ident, String navn, String epostAdresse, String ansattEnhet) { }

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package no.nav.foreldrepenger.los.tjenester.felles.dto;

public record SaksbehandlerDto(SaksbehandlerBrukerIdentDto brukerIdent, String navn, String epostAdresse) {
public record SaksbehandlerDto(SaksbehandlerBrukerIdentDto brukerIdent, String navn, String epostAdresse, String ansattAvdeling) {

@Override
public String toString() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public SaksbehandlerMedAvdelingerDto lagKjentOgUkjentSaksbehandlerMedAvdelingerD
var avdelinger = ansattTjeneste.hentAvdelingerNavnForAnsatt(ident);
return new SaksbehandlerMedAvdelingerDto(saksbehandlerDto.get(), avdelinger);
}
var ukjent = new SaksbehandlerDto(new SaksbehandlerBrukerIdentDto(ident), "Ukjent saksbehandler " + ident, null);
var ukjent = new SaksbehandlerDto(new SaksbehandlerBrukerIdentDto(ident), "Ukjent saksbehandler " + ident, null, null);
return new SaksbehandlerMedAvdelingerDto(ukjent, Collections.emptyList());
}

Expand All @@ -85,7 +85,7 @@ public Optional<SaksbehandlerDto> tilSaksbehandlerDto(Saksbehandler saksbehandle

private Optional<SaksbehandlerDto> tilSaksbehandlerDto(String ident) {
var identDto = new SaksbehandlerBrukerIdentDto(ident);
return hentBrukerProfil(ident).map(bp -> new SaksbehandlerDto(identDto, bp.navn(), bp.epostAdresse()));
return hentBrukerProfil(ident).map(bp -> new SaksbehandlerDto(identDto, bp.navn(), bp.epostAdresse(), bp.ansattAvdeling()));
}

public Optional<BrukerProfil> hentBrukerProfil(String ident) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class AvdelingslederSaksbehandlerRestTjenesteTest {

private static final AvdelingEnhetDto avdelingDto = new AvdelingEnhetDto("4817");
private static final SaksbehandlerBrukerIdentDto brukerIdentDto = new SaksbehandlerBrukerIdentDto("Z999999");
private static final SaksbehandlerDto saksbehandlerDto = new SaksbehandlerDto(brukerIdentDto, "Navn Navnesen", "navn@navnesen.no");
private static final SaksbehandlerDto saksbehandlerDto = new SaksbehandlerDto(brukerIdentDto, "Navn Navnesen", "navn@navnesen.no", "NAV Drammen");
private AvdelingslederSaksbehandlerTjeneste avdelingslederSaksbehandlerTjeneste;
@Mock
private SaksbehandlerDtoTjeneste saksbehandlerDtoTjeneste;
Expand Down