diff --git a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/mission/envAction/envActionControl/infraction/AdministrativeResponseEnum.kt b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/mission/envAction/envActionControl/infraction/AdministrativeResponseEnum.kt index 89d2247322..41b0c3407e 100644 --- a/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/mission/envAction/envActionControl/infraction/AdministrativeResponseEnum.kt +++ b/backend/src/main/kotlin/fr/gouv/cacem/monitorenv/domain/entities/mission/envAction/envActionControl/infraction/AdministrativeResponseEnum.kt @@ -4,4 +4,5 @@ enum class AdministrativeResponseEnum { SANCTION, REGULARIZATION, PENDING, + NONE, } diff --git a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/missions/MissionEnvActionDataInputUTests.kt b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/missions/EnvActionDataInputUTests.kt similarity index 99% rename from backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/missions/MissionEnvActionDataInputUTests.kt rename to backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/missions/EnvActionDataInputUTests.kt index b7213807ef..ce43a814a4 100644 --- a/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/missions/MissionEnvActionDataInputUTests.kt +++ b/backend/src/test/kotlin/fr/gouv/cacem/monitorenv/infrastructure/api/adapters/missions/EnvActionDataInputUTests.kt @@ -1,4 +1,4 @@ -package fr.gouv.cacem.monitorenv.infrastructure.api.inputs.actions +package fr.gouv.cacem.monitorenv.infrastructure.api.adapters.missions import fr.gouv.cacem.monitorenv.domain.entities.VehicleTypeEnum import fr.gouv.cacem.monitorenv.domain.entities.mission.ActionCompletionEnum diff --git a/frontend/src/domain/entities/missions.ts b/frontend/src/domain/entities/missions.ts index 944adacad3..a805b45694 100644 --- a/frontend/src/domain/entities/missions.ts +++ b/frontend/src/domain/entities/missions.ts @@ -124,12 +124,13 @@ export const formalNoticeLabels = { libelle: 'En attente' } } -export type AdministrativeResponseType = 'SANCTION' | 'REGULARIZATION' | 'PENDING' +export type AdministrativeResponseType = 'SANCTION' | 'REGULARIZATION' | 'PENDING' | 'NONE' export const administrativeResponseOptions: { label: string; value: AdministrativeResponseType }[] = [ { label: 'Sanction', value: 'SANCTION' }, { label: 'RĂ©gularisation', value: 'REGULARIZATION' }, - { label: 'En attente', value: 'PENDING' } + { label: 'En attente', value: 'PENDING' }, + { label: 'Aucune', value: 'NONE' } ] export const hasMissionOrderLabels = { diff --git a/frontend/src/features/missions/MissionForm/ActionForm/ControlForm/InfractionForm/InfractionForm.tsx b/frontend/src/features/missions/MissionForm/ActionForm/ControlForm/InfractionForm/InfractionForm.tsx index 5e00cbd0b4..031478916d 100644 --- a/frontend/src/features/missions/MissionForm/ActionForm/ControlForm/InfractionForm/InfractionForm.tsx +++ b/frontend/src/features/missions/MissionForm/ActionForm/ControlForm/InfractionForm/InfractionForm.tsx @@ -1,3 +1,4 @@ +import { NewInfractionSchema } from '@features/missions/MissionForm/Schemas/Infraction' import { Accent, Button, @@ -12,11 +13,10 @@ import { administrativeResponseOptions, formalNoticeLabels, infractionTypeLabels, - type EnvActionControl, - type Mission + type Infraction } from 'domain/entities/missions' import { TargetTypeEnum } from 'domain/entities/targetType' -import { useField, useFormikContext, type FormikErrors } from 'formik' +import { useField } from 'formik' import { useState, type MouseEventHandler } from 'react' import styled from 'styled-components' @@ -46,21 +46,21 @@ export function InfractionForm({ const showTooltip = () => setIsVisibleTooltip(true) const hideTooltip = () => setIsVisibleTooltip(false) - const { errors } = useFormikContext>() const infractionPath = `envActions[${envActionIndex}].infractions[${currentInfractionIndex}]` - + const [infraction] = useField(infractionPath) const [actionTargetField] = useField(`envActions.${envActionIndex}.actionTargetType`) const [nbTarget] = useField(`${infractionPath}.nbTarget`) - function isInfractionFormInvalid(errorsForm: FormikErrors>) { - const envActionErrors = (!!errorsForm.envActions && - errorsForm.envActions[envActionIndex]) as FormikErrors + const isValid = () => { + try { + NewInfractionSchema.validateSync(infraction.value) - return envActionErrors && !!envActionErrors.infractions + return true + } catch (error) { + return false + } } - const isInvalid = isInfractionFormInvalid(errors) - const disableIdentificationFields = nbTarget.value > 1 return ( @@ -148,7 +148,7 @@ export function InfractionForm({ - diff --git a/frontend/src/features/missions/MissionForm/ActionForm/ControlForm/InfractionForm/InfractionFormHeaderVehicle.tsx b/frontend/src/features/missions/MissionForm/ActionForm/ControlForm/InfractionForm/InfractionFormHeaderVehicle.tsx index a2e8a1aa1f..00cbaddeed 100644 --- a/frontend/src/features/missions/MissionForm/ActionForm/ControlForm/InfractionForm/InfractionFormHeaderVehicle.tsx +++ b/frontend/src/features/missions/MissionForm/ActionForm/ControlForm/InfractionForm/InfractionFormHeaderVehicle.tsx @@ -40,7 +40,12 @@ export function InfractionFormHeaderVehicle({ envActionIndex, infractionPath, is {vehicleTypeField?.value === VehicleTypeEnum.VESSEL && ( <> - + - + = Yup.object().shape( }) export const CompletionInfractionSchema: Yup.SchemaOf = NewInfractionSchema.shape({ + administrativeResponse: Yup.mixed() + .oneOf(['SANCTION', 'REGULARIZATION', 'NONE']) + .required(), formalNotice: Yup.mixed().oneOf([FormalNoticeEnum.YES, FormalNoticeEnum.NO]).required(), infractionType: Yup.mixed().oneOf([InfractionTypeEnum.WITH_REPORT, InfractionTypeEnum.WITHOUT_REPORT]).required() }) diff --git a/frontend/src/features/missions/Missions.helpers.ts b/frontend/src/features/missions/Missions.helpers.ts index 615eac9c99..bee00c6951 100644 --- a/frontend/src/features/missions/Missions.helpers.ts +++ b/frontend/src/features/missions/Missions.helpers.ts @@ -33,6 +33,7 @@ import type { LegacyControlUnit } from '../../domain/entities/legacyControlUnit' import type { AtLeast } from '../../types' export const infractionFactory = (infraction?: Partial): NewInfraction => ({ + administrativeResponse: 'NONE', id: uuidv4(), natinf: [], nbTarget: 1, @@ -168,17 +169,31 @@ export const controlUnitFactory = ({ ...resourceUnit } = {}): Omit { - const totalInfractions = infractions?.length || 0 + const totalInfractions = infractions?.reduce((acc, infraction) => acc + infraction.nbTarget, 0) const ras = (actionNumberOfControls || 0) - totalInfractions - const infractionsWithReport = - infractions?.filter(inf => inf.infractionType === InfractionTypeEnum.WITH_REPORT)?.length || 0 - const infractionsWithoutReport = - infractions?.filter(inf => inf.infractionType === InfractionTypeEnum.WITHOUT_REPORT)?.length || 0 - const infractionsWithWaitingReport = - infractions?.filter(inf => inf.infractionType === InfractionTypeEnum.WAITING)?.length || 0 - const med = infractions?.filter(inf => inf.formalNotice === FormalNoticeEnum.YES)?.length || 0 - const sanctionAdmin = infractions?.filter(inf => inf.administrativeResponse === 'SANCTION')?.length || 0 - const regulAdmin = infractions?.filter(inf => inf.administrativeResponse === 'REGULARIZATION')?.length || 0 + + const infractionsWithReport = infractions + ?.filter(inf => inf.infractionType === InfractionTypeEnum.WITH_REPORT) + .reduce((acc, infraction) => acc + infraction.nbTarget, 0) + + const infractionsWithoutReport = infractions + ?.filter(inf => inf.infractionType === InfractionTypeEnum.WITHOUT_REPORT) + .reduce((acc, infraction) => acc + infraction.nbTarget, 0) + + const infractionsWithWaitingReport = infractions + ?.filter(inf => inf.infractionType === InfractionTypeEnum.WAITING) + .reduce((acc, infraction) => acc + infraction.nbTarget, 0) + + const med = infractions + ?.filter(inf => inf.formalNotice === FormalNoticeEnum.YES) + .reduce((acc, infraction) => acc + infraction.nbTarget, 0) + + const sanctionAdmin = infractions + ?.filter(inf => inf.administrativeResponse === 'SANCTION') + .reduce((acc, infraction) => acc + infraction.nbTarget, 0) + const regulAdmin = infractions + ?.filter(inf => inf.administrativeResponse === 'REGULARIZATION') + .reduce((acc, infraction) => acc + infraction.nbTarget, 0) return { infractionsWithoutReport,