diff --git a/mock/data/personoversiktEnhetMock.ts b/mock/data/personoversiktEnhetMock.ts index 3fcc80db..206c1569 100644 --- a/mock/data/personoversiktEnhetMock.ts +++ b/mock/data/personoversiktEnhetMock.ts @@ -85,6 +85,26 @@ export const personoversiktEnhetMock: PersonOversiktStatusDTO[] = [ trengerOppfolgingFrist: new Date('2024-01-01'), behandlerBerOmBistandUbehandlet: false, }, + { + fnr: '99999911125', + navn: 'Frist Fristersen', + enhet: '0316', + veilederIdent: null, + motebehovUbehandlet: true, + aktivitetskrav: AktivitetskravStatus.AVVENT, + aktivitetskravActive: true, + aktivitetskravSistVurdert: new Date('2022-12-01T10:12:05.913826'), + aktivitetskravVurderingFrist: new Date('2022-12-08'), + oppfolgingsplanLPSBistandUbehandlet: null, + dialogmotekandidat: undefined, + motestatus: undefined, + dialogmotesvarUbehandlet: false, + behandlerdialogUbehandlet: false, + aktivitetskravVurderStansUbehandlet: false, + trengerOppfolging: true, + trengerOppfolgingFrist: new Date('2024-01-01'), + behandlerBerOmBistandUbehandlet: false, + }, { fnr: '18049911120', navn: 'Bent Behandlerbistandsen', diff --git a/src/components/FristColumn.tsx b/src/components/FristColumn.tsx index c2a47d33..d35ff523 100644 --- a/src/components/FristColumn.tsx +++ b/src/components/FristColumn.tsx @@ -1,34 +1,70 @@ import { PersonData } from '@/api/types/personregisterTypes'; import { toReadableDate } from '@/utils/dateUtils'; -import { HourglassTopFilledIcon } from '@navikt/aksel-icons'; -import React from 'react'; +import { FileTextIcon, HourglassTopFilledIcon } from '@navikt/aksel-icons'; +import React, { ReactElement } from 'react'; import { AktivitetskravStatus } from '@/api/types/personoversiktTypes'; import { Tooltip } from '@navikt/ds-react'; import styled from 'styled-components'; -const FristColumnWrapper = styled.div` +const FristWrapper = styled.div` display: flex; flex-wrap: wrap; `; +const texts = { + tooltipAvventer: 'Avventer', + tooltipTrengerOppfolging: 'Trenger oppfølging', +}; + interface FristColumnProps { personData: PersonData; } +type Frist = { + icon: () => ReactElement; + date: Date; + tooltip: string; +}; + +const byFristAsc = (fristA: Frist, fristB: Frist) => { + return fristA.date > fristB.date ? 1 : -1; +}; + export const FristColumn = ({ personData }: FristColumnProps) => { - const showAvventerFrist = - personData.aktivitetskrav === AktivitetskravStatus.AVVENT; + const { + aktivitetskrav, + aktivitetskravVurderingFrist, + trengerOppfolgingFrist, + } = personData; + const frister: Frist[] = []; + if ( + aktivitetskrav === AktivitetskravStatus.AVVENT && + aktivitetskravVurderingFrist + ) { + frister.push({ + icon: () => , + date: aktivitetskravVurderingFrist, + tooltip: texts.tooltipAvventer, + }); + } + if (trengerOppfolgingFrist) { + frister.push({ + icon: () => , + date: trengerOppfolgingFrist, + tooltip: texts.tooltipTrengerOppfolging, + }); + } return ( - - {showAvventerFrist && ( - <> - - + <> + {frister.sort(byFristAsc).map(({ date, icon, tooltip }, index) => ( + + + {icon()} - {toReadableDate(personData.aktivitetskravVurderingFrist)} - - )} - + {toReadableDate(date)} + + ))} + ); }; diff --git a/src/utils/hendelseFilteringUtils.tsx b/src/utils/hendelseFilteringUtils.tsx index 0c24c3e4..e4401d73 100644 --- a/src/utils/hendelseFilteringUtils.tsx +++ b/src/utils/hendelseFilteringUtils.tsx @@ -2,7 +2,11 @@ import { PersonData, PersonregisterState, } from '@/api/types/personregisterTypes'; -import { firstCompanyNameFromPersonData } from './personDataUtil'; +import { + firstCompanyNameFromPersonData, + getEarliestFrist, + getLatestFrist, +} from './personDataUtil'; import { Veileder } from '@/api/types/veiledereTypes'; import { HendelseTypeFilters } from '@/context/filters/filterContextState'; @@ -312,8 +316,14 @@ const sortEventsOnFrist = ( ): PersonregisterState => { const sorted = Object.entries(personregister).sort( ([, persondataA], [, persondataB]) => { - const fristDateA = persondataA.aktivitetskravVurderingFrist; - const fristDateB = persondataB.aktivitetskravVurderingFrist; + const fristDateA = + order === 'DATO_ASC' + ? getEarliestFrist(persondataA) + : getLatestFrist(persondataA); + const fristDateB = + order === 'DATO_ASC' + ? getEarliestFrist(persondataB) + : getLatestFrist(persondataB); if (!fristDateA) return order === 'DATO_ASC' ? 1 : -1; if (!fristDateB) return order === 'DATO_ASC' ? -1 : 1; if (fristDateA > fristDateB) return order === 'DATO_ASC' ? 1 : -1; diff --git a/src/utils/personDataUtil.ts b/src/utils/personDataUtil.ts index 2abbdc7a..9c67e8ad 100644 --- a/src/utils/personDataUtil.ts +++ b/src/utils/personDataUtil.ts @@ -45,3 +45,29 @@ export const firstCompanyNameFromPersonData = ( ): string | undefined => { return companyNamesFromPersonData(p).shift(); }; + +export const getEarliestFrist = (p: PersonData): Date | null => { + const { aktivitetskravVurderingFrist, trengerOppfolgingFrist } = p; + if (aktivitetskravVurderingFrist && trengerOppfolgingFrist) { + return aktivitetskravVurderingFrist < trengerOppfolgingFrist + ? aktivitetskravVurderingFrist + : trengerOppfolgingFrist; + } + + return aktivitetskravVurderingFrist + ? aktivitetskravVurderingFrist + : trengerOppfolgingFrist; +}; + +export const getLatestFrist = (p: PersonData): Date | null => { + const { aktivitetskravVurderingFrist, trengerOppfolgingFrist } = p; + if (aktivitetskravVurderingFrist && trengerOppfolgingFrist) { + return aktivitetskravVurderingFrist < trengerOppfolgingFrist + ? trengerOppfolgingFrist + : aktivitetskravVurderingFrist; + } + + return aktivitetskravVurderingFrist + ? aktivitetskravVurderingFrist + : trengerOppfolgingFrist; +}; diff --git a/test/components/FristColumnTest.tsx b/test/components/FristColumnTest.tsx new file mode 100644 index 00000000..d183993b --- /dev/null +++ b/test/components/FristColumnTest.tsx @@ -0,0 +1,75 @@ +/* +Test at de to ulike fristdatoene vises gitt betingelsene +Test at begge vises og den tidligste først dersom personen har begge fristene. + */ + +import { render, screen } from '@testing-library/react'; +import { FristColumn } from '@/components/FristColumn'; +import React from 'react'; +import { PersonData, Skjermingskode } from '@/api/types/personregisterTypes'; +import { testdata } from '../data/fellesTestdata'; +import { expect } from 'chai'; +import { AktivitetskravStatus } from '@/api/types/personoversiktTypes'; + +const defaultPersonData: PersonData = { + navn: testdata.navn1, + harMotebehovUbehandlet: false, + harDialogmotesvar: false, + skjermingskode: testdata.skjermingskode.diskresjonsmerket as Skjermingskode, + markert: false, + harOppfolgingsplanLPSBistandUbehandlet: false, + tildeltEnhetId: '123', + tildeltVeilederIdent: '234', + aktivitetskrav: null, + aktivitetskravSistVurdert: null, + aktivitetskravActive: false, + aktivitetskravVurderingFrist: null, + harBehandlerdialogUbehandlet: false, + harAktivitetskravVurderStansUbehandlet: false, + trengerOppfolging: false, + trengerOppfolgingFrist: null, + behandlerBerOmBistandUbehandlet: false, +}; + +describe('FristColumn', () => { + it('viser ingen frister når person har hverken aktivitetskrav AVVENT med frist eller trenger oppfolging med frist', () => { + const personAvventerMedFrist: PersonData = { ...defaultPersonData }; + render(); + + expect(screen.queryAllByText(/2023/)).to.be.empty; + }); + it('viser frist for person når aktivitetskrav AVVENT med frist', () => { + const personAvventerMedFrist: PersonData = { + ...defaultPersonData, + aktivitetskrav: AktivitetskravStatus.AVVENT, + aktivitetskravVurderingFrist: new Date('2023-12-18'), + }; + render(); + + expect(screen.getByText('18.12.2023')).to.exist; + }); + it('viser frist for person når trenger oppfolging frist-dato er satt', () => { + const personTrengerOppfolgingMedFrist: PersonData = { + ...defaultPersonData, + trengerOppfolgingFrist: new Date('2023-12-31'), + }; + render(); + + expect(screen.getByText('31.12.2023')).to.exist; + }); + it('viser tidligste frist først når person har flere frister', () => { + const personMedFlereFrister: PersonData = { + ...defaultPersonData, + aktivitetskrav: AktivitetskravStatus.AVVENT, + aktivitetskravVurderingFrist: new Date('2023-12-10'), + trengerOppfolgingFrist: new Date('2023-12-05'), + }; + + render(); + + const allFrister = screen.getAllByText(/2023/); + expect(allFrister).to.have.length(2); + expect(allFrister[0]?.textContent).to.eq('05.12.2023'); + expect(allFrister[1]?.textContent).to.eq('10.12.2023'); + }); +}); diff --git a/test/utils/hendelseFilteringUtilsTest.ts b/test/utils/hendelseFilteringUtilsTest.ts index 40cc8d3e..815794d7 100644 --- a/test/utils/hendelseFilteringUtilsTest.ts +++ b/test/utils/hendelseFilteringUtilsTest.ts @@ -84,52 +84,238 @@ describe('hendelseFilteringUtils', () => { }); describe('sort by frist', () => { it('Sorts by aktivitetskrav avventer-frist ascending', () => { - const personWithFirstAvventerFrist: PersonData = { + const personWithEarliestFrist: PersonData = { ...createPersonDataWithName('Agnes Agnes'), aktivitetskravVurderingFrist: new Date('2023-12-05'), }; - const personWithAvventerFrist: PersonData = { + const personWithLatestFrist: PersonData = { ...createPersonDataWithName('Bjarne Bjarne'), aktivitetskravVurderingFrist: new Date('2023-12-10'), }; const personWithNoFrist = createPersonDataWithName('Navn Navnesen'); const personregisterState: PersonregisterState = { - '09128034883': personWithFirstAvventerFrist, + '09128034883': personWithEarliestFrist, '16624407794': personWithNoFrist, - '16614407794': personWithAvventerFrist, + '16614407794': personWithLatestFrist, }; const result = getSortedEventsFromSortingType( personregisterState, [], 'DATO_ASC' ); - expect(Object.keys(result)[0]).to.deep.equal('09128034883'); - expect(Object.keys(result)[1]).to.deep.equal('16614407794'); - expect(Object.keys(result)[2]).to.deep.equal('16624407794'); + expect(Object.values(result)[0]?.navn).to.deep.equal( + personWithEarliestFrist.navn + ); + expect(Object.values(result)[1]?.navn).to.deep.equal( + personWithLatestFrist.navn + ); + expect(Object.values(result)[2]?.navn).to.deep.equal( + personWithNoFrist.navn + ); }); it('Sorts by aktivitetskrav avventer-frist descending', () => { - const personWithFirstAvventerFrist: PersonData = { + const personWithEarliestFrist: PersonData = { ...createPersonDataWithName('Agnes Agnes'), aktivitetskravVurderingFrist: new Date('2023-12-05'), }; - const personWithAvventerFrist: PersonData = { + const personWithLatestFrist: PersonData = { ...createPersonDataWithName('Bjarne Bjarne'), aktivitetskravVurderingFrist: new Date('2023-12-10'), }; const personWithNoFrist = createPersonDataWithName('Navn Navnesen'); const personregisterState: PersonregisterState = { - '09128034883': personWithFirstAvventerFrist, + '09128034883': personWithEarliestFrist, + '16624407794': personWithNoFrist, + '16614407794': personWithLatestFrist, + }; + const result = getSortedEventsFromSortingType( + personregisterState, + [], + 'DATO_DESC' + ); + expect(Object.values(result)[0]?.navn).to.deep.equal( + personWithNoFrist.navn + ); + expect(Object.values(result)[1]?.navn).to.deep.equal( + personWithLatestFrist.navn + ); + expect(Object.values(result)[2]?.navn).to.deep.equal( + personWithEarliestFrist.navn + ); + }); + it('Sorts by trenger oppfolging-frist ascending', () => { + const personWithEarliestFrist: PersonData = { + ...createPersonDataWithName('Agnes Agnes'), + trengerOppfolgingFrist: new Date('2023-12-05'), + }; + const personWithLatestFrist: PersonData = { + ...createPersonDataWithName('Bjarne Bjarne'), + trengerOppfolgingFrist: new Date('2023-12-10'), + }; + const personWithNoFrist = createPersonDataWithName('Navn Navnesen'); + const personregisterState: PersonregisterState = { + '09128034883': personWithEarliestFrist, + '16624407794': personWithNoFrist, + '16614407794': personWithLatestFrist, + }; + const result = getSortedEventsFromSortingType( + personregisterState, + [], + 'DATO_ASC' + ); + expect(Object.values(result)[0]?.navn).to.deep.equal( + personWithEarliestFrist.navn + ); + expect(Object.values(result)[1]?.navn).to.deep.equal( + personWithLatestFrist.navn + ); + expect(Object.values(result)[2]?.navn).to.deep.equal( + personWithNoFrist.navn + ); + }); + it('Sorts by trenger oppfolging-frist descending', () => { + const personWithEarliestFrist: PersonData = { + ...createPersonDataWithName('Agnes Agnes'), + trengerOppfolgingFrist: new Date('2023-12-05'), + }; + const personWithLatestFrist: PersonData = { + ...createPersonDataWithName('Bjarne Bjarne'), + trengerOppfolgingFrist: new Date('2023-12-10'), + }; + const personWithNoFrist = createPersonDataWithName('Navn Navnesen'); + const personregisterState: PersonregisterState = { + '09128034883': personWithEarliestFrist, + '16624407794': personWithNoFrist, + '16614407794': personWithLatestFrist, + }; + const result = getSortedEventsFromSortingType( + personregisterState, + [], + 'DATO_DESC' + ); + expect(Object.values(result)[0]?.navn).to.deep.equal( + personWithNoFrist.navn + ); + expect(Object.values(result)[1]?.navn).to.deep.equal( + personWithLatestFrist.navn + ); + expect(Object.values(result)[2]?.navn).to.deep.equal( + personWithEarliestFrist.navn + ); + }); + it('Sorts by avventer and trenger oppfolging-frist ascending', () => { + const personWithEarliestFrist: PersonData = { + ...createPersonDataWithName('Agnes Agnes'), + aktivitetskravVurderingFrist: new Date('2023-12-05'), + }; + const personWithLatestFrist: PersonData = { + ...createPersonDataWithName('Bjarne Bjarne'), + trengerOppfolgingFrist: new Date('2023-12-10'), + }; + const personWithNoFrist = createPersonDataWithName('Navn Navnesen'); + const personregisterState: PersonregisterState = { + '09128034883': personWithEarliestFrist, '16624407794': personWithNoFrist, - '16614407794': personWithAvventerFrist, + '16614407794': personWithLatestFrist, + }; + const result = getSortedEventsFromSortingType( + personregisterState, + [], + 'DATO_ASC' + ); + expect(Object.values(result)[0]?.navn).to.deep.equal( + personWithEarliestFrist.navn + ); + expect(Object.values(result)[1]?.navn).to.deep.equal( + personWithLatestFrist.navn + ); + expect(Object.values(result)[2]?.navn).to.deep.equal( + personWithNoFrist.navn + ); + }); + it('Sorts by avventer and trenger oppfolging-frist descending', () => { + const personWithEarliestFrist: PersonData = { + ...createPersonDataWithName('Agnes Agnes'), + aktivitetskravVurderingFrist: new Date('2023-12-05'), + }; + const personWithLatestFrist: PersonData = { + ...createPersonDataWithName('Bjarne Bjarne'), + trengerOppfolgingFrist: new Date('2023-12-10'), + }; + const personWithNoFrist = createPersonDataWithName('Navn Navnesen'); + const personregisterState: PersonregisterState = { + '09128034883': personWithEarliestFrist, + '16624407794': personWithNoFrist, + '16614407794': personWithLatestFrist, }; const result = getSortedEventsFromSortingType( personregisterState, [], 'DATO_DESC' ); - expect(Object.keys(result)[0]).to.deep.equal('16624407794'); - expect(Object.keys(result)[1]).to.deep.equal('16614407794'); - expect(Object.keys(result)[2]).to.deep.equal('09128034883'); + expect(Object.values(result)[0]?.navn).to.deep.equal( + personWithNoFrist.navn + ); + expect(Object.values(result)[1]?.navn).to.deep.equal( + personWithLatestFrist.navn + ); + expect(Object.values(result)[2]?.navn).to.deep.equal( + personWithEarliestFrist.navn + ); + }); + it('Sorts ascending by earliest frist per person when person have both frist', () => { + const personWithEarliestFrist: PersonData = { + ...createPersonDataWithName('Agnes Agnes'), + aktivitetskravVurderingFrist: new Date('2023-12-05'), + trengerOppfolgingFrist: new Date('2023-12-10'), + }; + const personWithLatestFrist: PersonData = { + ...createPersonDataWithName('Bjarne Bjarne'), + aktivitetskravVurderingFrist: new Date('2023-12-08'), + trengerOppfolgingFrist: new Date('2023-12-15'), + }; + const personregisterState: PersonregisterState = { + '09128034883': personWithEarliestFrist, + '16614407794': personWithLatestFrist, + }; + const result = getSortedEventsFromSortingType( + personregisterState, + [], + 'DATO_ASC' + ); + expect(Object.values(result)[0]?.navn).to.deep.equal( + personWithEarliestFrist.navn + ); + expect(Object.values(result)[1]?.navn).to.deep.equal( + personWithLatestFrist.navn + ); + }); + it('Sorts descending by earliest frist per person when person have both frist', () => { + const personWithEarliestFrist: PersonData = { + ...createPersonDataWithName('Agnes Agnes'), + aktivitetskravVurderingFrist: new Date('2023-12-05'), + trengerOppfolgingFrist: new Date('2023-12-10'), + }; + const personWithLatestFrist: PersonData = { + ...createPersonDataWithName('Bjarne Bjarne'), + aktivitetskravVurderingFrist: new Date('2023-12-08'), + trengerOppfolgingFrist: new Date('2023-12-15'), + }; + const personregisterState: PersonregisterState = { + '09128034883': personWithEarliestFrist, + '16614407794': personWithLatestFrist, + }; + const result = getSortedEventsFromSortingType( + personregisterState, + [], + 'DATO_DESC' + ); + expect(Object.values(result)[0]?.navn).to.deep.equal( + personWithLatestFrist.navn + ); + expect(Object.values(result)[1]?.navn).to.deep.equal( + personWithEarliestFrist.navn + ); }); });