From 3e0a6ddfaff69f7d15dae6b30f3a04d1364ea859 Mon Sep 17 00:00:00 2001 From: lwih Date: Mon, 1 Jun 2026 16:10:21 +0200 Subject: [PATCH] feat(validation): introduce field validation timestamp --- .../domain/entities/mission/MissionDates.kt | 13 +++ .../mission/v2/MissionActionEntity.kt | 12 ++- .../mission/v2/MissionEnvActionEntity.kt | 8 +- .../mission/v2/MissionFishActionEntity.kt | 8 +- .../mission/v2/MissionNavActionEntity.kt | 7 +- .../mission/action/v2/ProcessEnvAction.kt | 4 +- .../mission/action/v2/ProcessFishAction.kt | 4 +- .../mission/action/v2/ProcessNavAction.kt | 3 +- .../mission/action/v2/UpdateEnvAction.kt | 2 +- .../mission/action/v2/UpdateFishAction.kt | 2 +- .../mission/action/v2/UpdateNavAction.kt | 3 +- .../use_cases/mission/v2/GetMissionDates.kt | 20 +--- .../validation/EntityValidityValidator.kt | 19 ++-- .../validation/RequiredFieldsValidator.kt | 52 +++++++-- .../validation/ValidationRulesDocGenerator.kt | 30 ++++-- .../validation/RequiredFieldsValidatorTest.kt | 100 ++++++++++++++++++ .../WithinMissionDateRangeValidatorTest.kt | 4 +- .../mission/MissionEnvActionEntityTest.kt | 8 +- .../mission/MissionFishActionEntityTest.kt | 18 ++-- .../mission/MissionNavActionEntityTest.kt | 2 +- .../nav/crew/MissionPassengerEntityTest.kt | 4 +- .../entities/v2/MissionNavActionEntityTest.kt | 98 ++++++++--------- .../mission/action/UpdateEnvActionTest.kt | 4 +- .../mission/action/UpdateFishActionTest.kt | 4 +- .../mission/action/UpdateNavActionTest.kt | 4 +- .../mission/action/v2/ProcessEnvActionTest.kt | 4 +- .../action/v2/ProcessFishActionTest.kt | 4 +- .../mission/action/v2/ProcessNavActionTest.kt | 4 +- .../bff/model/v2/MissionNavActionTest.kt | 84 +++++++-------- frontend/package-lock.json | 4 +- .../components/ui/mission-target-title.tsx | 2 +- 31 files changed, 346 insertions(+), 189 deletions(-) create mode 100644 backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/MissionDates.kt diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/MissionDates.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/MissionDates.kt new file mode 100644 index 000000000..88a775202 --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/MissionDates.kt @@ -0,0 +1,13 @@ +package fr.gouv.dgampa.rapportnav.domain.entities.mission + +import java.time.Instant + +data class MissionDates( + val startDateTimeUtc: Instant?, + val endDateTimeUtc: Instant? +) { + /** + * Returns true if the mission is finished (end date is in the past). + */ + fun isMissionFinished(): Boolean = endDateTimeUtc?.isBefore(Instant.now()) ?: false +} diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionActionEntity.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionActionEntity.kt index c3a1c8137..a94766142 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionActionEntity.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionActionEntity.kt @@ -7,12 +7,14 @@ import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.envActions.Infracti import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.action.ActionType import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.control.ControlType import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.status.ActionStatusType +import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionDates import fr.gouv.dgampa.rapportnav.domain.validation.EntityValidityValidator import fr.gouv.dgampa.rapportnav.domain.validation.ValidateThrowsBeforeSave import fr.gouv.dgampa.rapportnav.domain.validation.ValidateWhenMissionFinished import java.time.Instant + abstract class MissionActionEntity( override val missionId: Int, override val actionType: ActionType, @@ -39,13 +41,13 @@ abstract class MissionActionEntity( * Unified validation method - validates both validity (dates) and completeness (required fields). * Uses Jakarta Bean Validation with validation groups. * - * @param isMissionFinished When true, also checks required fields (ValidateWhenMissionFinished group) * @param validator The EntityValidityValidator instance to use + * @param missionDates Mission dates used for grandfathering rules by effective date */ - open fun computeValidityForStats(isMissionFinished: Boolean = false, validator: EntityValidityValidator) { + open fun computeValidityForStats(validator: EntityValidityValidator, missionDates: MissionDates? = null) { val groups = mutableListOf>(ValidateThrowsBeforeSave::class.java, ValidateWhenMissionFinished::class.java) - this.completenessForStats = validator.validate(this, *groups.toTypedArray()) + this.completenessForStats = validator.validate(this, *groups.toTypedArray(), missionStartDate = missionDates?.startDateTimeUtc) // Update sources of missing data based on completeness if (this.completenessForStats?.status != CompletenessForStatsStatusEnum.VALID) { @@ -139,10 +141,10 @@ abstract class MissionActionEntity( /** * Computes validity for statistics using the new unified validation system. - * @param isMissionFinished When true, also checks required fields (ValidateWhenMissionFinished group) * @param validator The EntityValidityValidator instance to use + * @param missionDates Mission dates used for grandfathering rules by effective date */ - abstract fun computeValidity(isMissionFinished: Boolean = false, validator: EntityValidityValidator) + abstract fun computeValidity(validator: EntityValidityValidator, missionDates: MissionDates? = null) abstract fun isControlInValid(control: ControlEntity?): Boolean } diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionEnvActionEntity.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionEnvActionEntity.kt index 40f4907f7..1de21a58f 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionEnvActionEntity.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionEnvActionEntity.kt @@ -8,6 +8,7 @@ import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.tags.TagEntity import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.themes.ThemeEntity import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.action.ActionType import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.control.ControlType +import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionDates import fr.gouv.dgampa.rapportnav.domain.validation.* import org.locationtech.jts.geom.Geometry import java.time.Instant @@ -89,10 +90,10 @@ data class MissionEnvActionEntity( * Computes validity for statistics using the new unified validation system. * For Env actions, validates both RAPPORT_NAV and MONITORENV sources. * - * @param isMissionFinished When true, also checks required fields (ValidateWhenMissionFinished group) * @param validator The EntityValidityValidator instance to use + * @param missionDates Mission dates used for grandfathering rules by effective date */ - override fun computeValidity(isMissionFinished: Boolean, validator: EntityValidityValidator) { + override fun computeValidity(validator: EntityValidityValidator, missionDates: MissionDates?) { this.computeControlsToComplete() this.computeAvailableControlTypesForInfraction() @@ -104,7 +105,8 @@ data class MissionEnvActionEntity( this, MissionSourceEnum.RAPPORT_NAV, ValidateThrowsBeforeSave::class.java, - ValidateWhenMissionFinished::class.java + ValidateWhenMissionFinished::class.java, + missionStartDate = missionDates?.startDateTimeUtc ) val rapportNavComplete = rapportNavCompleteness.isComplete && this.controlsToComplete.isNullOrEmpty() diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionFishActionEntity.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionFishActionEntity.kt index 95820a5ff..ebc664899 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionFishActionEntity.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionFishActionEntity.kt @@ -6,6 +6,7 @@ import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.MissionSourceEnum import fr.gouv.dgampa.rapportnav.domain.entities.mission.fish.ControlUnit import fr.gouv.dgampa.rapportnav.domain.entities.mission.fish.fishActions.* import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.action.ActionType +import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionDates import fr.gouv.dgampa.rapportnav.domain.validation.* import fr.gouv.dgampa.rapportnav.domain.entities.mission.sati.SatiEntity import java.time.Instant @@ -106,10 +107,10 @@ class MissionFishActionEntity( * Computes validity for statistics using the new unified validation system. * For Fish actions, validates both RAPPORT_NAV and MONITORFISH sources. * - * @param isMissionFinished When true, also checks required fields (ValidateWhenMissionFinished group) * @param validator The EntityValidityValidator instance to use + * @param missionDates Mission dates used for grandfathering rules by effective date */ - override fun computeValidity(isMissionFinished: Boolean, validator: EntityValidityValidator) { + override fun computeValidity(validator: EntityValidityValidator, missionDates: MissionDates?) { this.computeControlsToComplete() val sourcesOfMissingData = mutableListOf() @@ -120,7 +121,8 @@ class MissionFishActionEntity( this, MissionSourceEnum.RAPPORT_NAV, ValidateThrowsBeforeSave::class.java, - ValidateWhenMissionFinished::class.java + ValidateWhenMissionFinished::class.java, + missionStartDate = missionDates?.startDateTimeUtc ) val rapportNavComplete = rapportNavCompleteness.isComplete diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionNavActionEntity.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionNavActionEntity.kt index c17d4b2d5..007231bf4 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionNavActionEntity.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionNavActionEntity.kt @@ -9,6 +9,7 @@ import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.control.ControlMeth import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.control.LocationType import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.status.ActionStatusReason import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.status.ActionStatusType +import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionDates import fr.gouv.dgampa.rapportnav.domain.validation.* import fr.gouv.dgampa.rapportnav.infrastructure.database.model.mission.action.v2.MissionActionModel import jakarta.validation.constraints.Min @@ -129,11 +130,11 @@ class MissionNavActionEntity( * Computes validity for statistics using the new unified validation system. * Uses Jakarta Bean Validation with validation groups. * - * @param isMissionFinished When true, also checks required fields (ValidateWhenMissionFinished group) * @param validator The EntityValidityValidator instance to use + * @param missionDates Mission dates used for grandfathering rules by effective date */ - override fun computeValidity(isMissionFinished: Boolean, validator: EntityValidityValidator) { - this.computeValidityForStats(isMissionFinished, validator) + override fun computeValidity(validator: EntityValidityValidator, missionDates: MissionDates?) { + this.computeValidityForStats(validator, missionDates) // For Nav actions, the only source is RAPPORT_NAV if (this.completenessForStats?.isComplete != true) { diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/ProcessEnvAction.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/ProcessEnvAction.kt index e2befdfad..55ea6059a 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/ProcessEnvAction.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/ProcessEnvAction.kt @@ -28,9 +28,7 @@ class ProcessEnvAction( action.status = this.getStatus(action) val missionDates = getMissionDates.execute(missionId = missionId, ownerId = null) - val isMissionFinished = missionDates?.isMissionFinished() ?: false - - action.computeValidity(isMissionFinished, entityValidityValidator) + action.computeValidity(validator = entityValidityValidator, missionDates = missionDates) return action } } diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/ProcessFishAction.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/ProcessFishAction.kt index 2aa14f540..7b96573e1 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/ProcessFishAction.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/ProcessFishAction.kt @@ -27,9 +27,7 @@ class ProcessFishAction( entity.status = this.getStatus(entity) val missionDates = getMissionDates.execute(missionId = missionId, ownerId = null) - val isMissionFinished = missionDates?.isMissionFinished() ?: false - - entity.computeValidity(isMissionFinished, entityValidityValidator) + entity.computeValidity(validator = entityValidityValidator, missionDates = missionDates) return entity } } diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/ProcessNavAction.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/ProcessNavAction.kt index 83804a12b..4f5fc6fc9 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/ProcessNavAction.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/ProcessNavAction.kt @@ -24,8 +24,7 @@ class ProcessNavAction( ownerId = action.ownerId, inquiryId = if (action.actionType == ActionType.INQUIRY) action.ownerId else null ) - val isMissionFinished = missionDates?.isMissionFinished() ?: false - action.computeValidity(isMissionFinished = isMissionFinished, validator = entityValidityValidator) + action.computeValidity(validator = entityValidityValidator, missionDates = missionDates) return action } diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/UpdateEnvAction.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/UpdateEnvAction.kt index 3e7b3269d..0928574c8 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/UpdateEnvAction.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/UpdateEnvAction.kt @@ -40,7 +40,7 @@ class UpdateEnvAction( ) // compute validity val missionDates = getMissionDates.execute(missionId = action.missionId, ownerId = null) - action.computeValidity(isMissionFinished = missionDates?.isMissionFinished() ?: false, validator = entityValidityValidator) + action.computeValidity(validator = entityValidityValidator, missionDates = missionDates) return action } } diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/UpdateFishAction.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/UpdateFishAction.kt index c23620150..edc7353fe 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/UpdateFishAction.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/UpdateFishAction.kt @@ -41,7 +41,7 @@ class UpdateFishAction( ) // compute validity val missionDates = getMissionDates.execute(missionId = action.missionId, ownerId = null) - action.computeValidity(isMissionFinished = missionDates?.isMissionFinished() ?: false, validator = entityValidityValidator) + action.computeValidity(validator = entityValidityValidator, missionDates = missionDates) return action } } diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/UpdateNavAction.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/UpdateNavAction.kt index 468019ab8..ba3082e3f 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/UpdateNavAction.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/UpdateNavAction.kt @@ -43,8 +43,7 @@ class UpdateNavAction( ownerId = action.ownerId, inquiryId = if (action.actionType == ActionType.INQUIRY) action.ownerId else null ) - val isMissionFinished = missionDates?.isMissionFinished() ?: false - action.computeValidity(isMissionFinished = isMissionFinished, validator = entityValidityValidator) + action.computeValidity(validator = entityValidityValidator, missionDates = missionDates) return action } diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/v2/GetMissionDates.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/v2/GetMissionDates.kt index 61970417f..69844d709 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/v2/GetMissionDates.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/v2/GetMissionDates.kt @@ -1,22 +1,12 @@ package fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2 import fr.gouv.dgampa.rapportnav.config.UseCase +import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionDates import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.InquiryEntity import fr.gouv.dgampa.rapportnav.domain.use_cases.inquiry.GetInquiryById import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.v2.GetEnvMissionById2 -import java.time.Instant import java.util.* -data class MissionDatesOutput( - val startDateTimeUtc: Instant?, - val endDateTimeUtc: Instant? -) { - /** - * Returns true if the mission is finished (end date is in the past). - */ - fun isMissionFinished(): Boolean = endDateTimeUtc?.isBefore(Instant.now()) ?: false -} - @UseCase class GetMissionDates( private val getNavMissionById2: GetNavMissionById2, @@ -24,13 +14,13 @@ class GetMissionDates( private val getInquiryById: GetInquiryById ) { - fun execute(missionId: Int?, ownerId: UUID?, inquiryId: UUID? = null): MissionDatesOutput? { + fun execute(missionId: Int?, ownerId: UUID?, inquiryId: UUID? = null): MissionDates? { // Try to get from Inquiry table if inquiryId is provided if (inquiryId != null) { val inquiry: InquiryEntity? = inquiryId.let { getInquiryById.execute(id = it) } if (inquiry != null) { - return MissionDatesOutput( + return MissionDates( startDateTimeUtc = inquiry.startDateTimeUtc, endDateTimeUtc = inquiry.endDateTimeUtc ) @@ -41,7 +31,7 @@ class GetMissionDates( if (ownerId != null) { val navMission = getNavMissionById2.execute(ownerId) if (navMission != null) { - return MissionDatesOutput( + return MissionDates( startDateTimeUtc = navMission.startDateTimeUtc, endDateTimeUtc = navMission.endDateTimeUtc ) @@ -52,7 +42,7 @@ class GetMissionDates( if (missionId != null) { val envMission = getEnvMissionById2.execute(missionId) if (envMission != null) { - return MissionDatesOutput( + return MissionDates( startDateTimeUtc = envMission.startDateTimeUtc, endDateTimeUtc = envMission.endDateTimeUtc ) diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/EntityValidityValidator.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/EntityValidityValidator.kt index 6a1cf219d..5208127ae 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/EntityValidityValidator.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/EntityValidityValidator.kt @@ -9,6 +9,7 @@ import fr.gouv.dgampa.rapportnav.domain.exceptions.BackendUsageException import jakarta.validation.Validation import jakarta.validation.Validator import org.springframework.stereotype.Service +import java.time.Instant /** * Spring service wrapper around Jakarta Bean Validation for validating entities. @@ -25,8 +26,13 @@ class EntityValidityValidator( * @param groups Validation groups to run (e.g., ValidateThrowsBeforeSave, ValidateWhenMissionFinished) * @return CompletenessForStatsEntity with status and any errors */ - fun validate(entity: Any, vararg groups: Class<*>): CompletenessForStatsEntity { - val violations = validator.validate(entity, *groups).toSet() + fun validate(entity: Any, vararg groups: Class<*>, missionStartDate: Instant? = null): CompletenessForStatsEntity { + RequiredFieldsValidator.missionStartDateHolder.set(missionStartDate) + val violations = try { + validator.validate(entity, *groups).toSet() + } finally { + RequiredFieldsValidator.missionStartDateHolder.remove() + } if (violations.isEmpty()) { return CompletenessForStatsEntity( @@ -68,8 +74,8 @@ class EntityValidityValidator( * @param groups Validation groups to run * @throws BackendUsageException if validation fails */ - fun validateAndThrow(entity: Any, vararg groups: Class<*>) { - val result = validate(entity, *groups) + fun validateAndThrow(entity: Any, vararg groups: Class<*>, missionStartDate: Instant? = null) { + val result = validate(entity, *groups, missionStartDate = missionStartDate) if (!result.isComplete) { throw BackendUsageException( code = BackendUsageErrorCode.INVALID_PARAMETERS_EXCEPTION, @@ -96,9 +102,10 @@ class EntityValidityValidator( fun validateWithSource( entity: Any, source: MissionSourceEnum, - vararg groups: Class<*> + vararg groups: Class<*>, + missionStartDate: Instant? = null ): CompletenessForStatsEntity { - val result = validate(entity, *groups) + val result = validate(entity, *groups, missionStartDate = missionStartDate) return if (result.status != CompletenessForStatsStatusEnum.VALID) { result.copy(sources = listOf(source)) } else { diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/RequiredFieldsValidator.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/RequiredFieldsValidator.kt index f8b97306a..6d2751a6d 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/RequiredFieldsValidator.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/RequiredFieldsValidator.kt @@ -14,12 +14,20 @@ import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.MissionNavActionEnti import fr.gouv.dgampa.rapportnav.domain.validation.RequiredFieldsValidator.Rule.Companion.conditional import jakarta.validation.ConstraintValidator import jakarta.validation.ConstraintValidatorContext +import java.time.Instant /** * Generic validator for required fields. * * Rules are defined per entity class in the companion object. * To add rules for a new entity, add an entry to the `rulesRegistry` map. + * + * Rules can have an optional `effectiveDate`. When set, the rule is only enforced + * for missions whose start date is on or after the effective date (grandfathering). + * + * The mission start date is passed via [missionStartDateHolder] ThreadLocal — a pragmatic + * workaround for Jakarta's ConstraintValidator.isValid() not supporting extra context parameters. + * Set by [EntityValidityValidator] before validation and cleared after. */ class RequiredFieldsValidator : ConstraintValidator { @@ -27,9 +35,11 @@ class RequiredFieldsValidator : ConstraintValidator { if (entity == null) return true val rules = rulesRegistry[entity::class.java] ?: return true + val missionStartDate = missionStartDateHolder.get() val violations = mutableListOf() for (rule in rules) { + if (rule.isGrandfathered(missionStartDate)) continue if (rule.appliesTo(entity) && rule.isViolated(entity)) { violations.add(FieldViolation(rule.field, rule.message)) } @@ -50,6 +60,12 @@ class RequiredFieldsValidator : ConstraintValidator { data class FieldViolation(val field: String, val message: String) companion object { + /** + * ThreadLocal holding the mission's start date for effective date filtering. + * Set by [EntityValidityValidator] before validation, cleared after. + */ + val missionStartDateHolder = ThreadLocal() + private const val MSG_START_DATE_REQUIRED = "La date de début est requise" private const val MSG_END_DATE_REQUIRED = "La date de fin est requise" @@ -252,20 +268,35 @@ class RequiredFieldsValidator : ConstraintValidator { /** * Represents a validation rule for a field. + * + * @param effectiveDate If set, the rule only applies to missions starting on or after this date. + * Missions started before this date are "grandfathered" and exempt from the rule. */ sealed class Rule( val field: String, val message: String, - val conditionDescription: String + val conditionDescription: String, + val effectiveDate: Instant? = null ) { abstract fun appliesTo(entity: Any): Boolean abstract fun isViolated(entity: Any): Boolean + /** + * Returns true if this rule should be skipped because the mission predates the rule's effective date. + * If either effectiveDate or missionStartDate is null, the rule is NOT grandfathered (always applies). + */ + fun isGrandfathered(missionStartDate: Instant?): Boolean { + val effective = effectiveDate ?: return false + val missionStart = missionStartDate ?: return false + return missionStart.isBefore(effective) + } + class Always( field: String, message: String, + effectiveDate: Instant? = null, private val getter: (T) -> Any? - ) : Rule(field, message, "Toujours") { + ) : Rule(field, message, "Toujours", effectiveDate) { override fun appliesTo(entity: Any) = true @Suppress("UNCHECKED_CAST") override fun isViolated(entity: Any) = getter(entity as T) == null @@ -275,8 +306,9 @@ class RequiredFieldsValidator : ConstraintValidator { field: String, val actionTypes: List, message: String, + effectiveDate: Instant? = null, private val getter: (MissionNavActionEntity) -> Any? - ) : Rule(field, message, "actionType ∈ {${actionTypes.joinToString(", ")}}") { + ) : Rule(field, message, "actionType ∈ {${actionTypes.joinToString(", ")}}", effectiveDate) { override fun appliesTo(entity: Any) = (entity as? MissionNavActionEntity)?.actionType in actionTypes @Suppress("UNCHECKED_CAST") override fun isViolated(entity: Any) = getter(entity as MissionNavActionEntity) == null @@ -289,8 +321,9 @@ class RequiredFieldsValidator : ConstraintValidator { private val condition: (T) -> Boolean, val relatedActionTypes: List? = null, val extraCondition: String? = null, + effectiveDate: Instant? = null, private val getter: (T) -> Any? - ) : Rule(field, message, conditionDescription) { + ) : Rule(field, message, conditionDescription, effectiveDate) { @Suppress("UNCHECKED_CAST") override fun appliesTo(entity: Any) = condition(entity as T) @Suppress("UNCHECKED_CAST") @@ -298,19 +331,20 @@ class RequiredFieldsValidator : ConstraintValidator { } companion object { - fun always(field: String, message: String, getter: (T) -> Any?) = - Always(field, message, getter) + fun always(field: String, message: String, effectiveDate: Instant? = null, getter: (T) -> Any?) = + Always(field, message, effectiveDate, getter) - fun forActionTypes(field: String, actionTypes: List, message: String, getter: (MissionNavActionEntity) -> Any?) = - ForActionTypes(field, actionTypes, message, getter) + fun forActionTypes(field: String, actionTypes: List, message: String, effectiveDate: Instant? = null, getter: (MissionNavActionEntity) -> Any?) = + ForActionTypes(field, actionTypes, message, effectiveDate, getter) fun conditional( field: String, message: String, conditionDescription: String, condition: (T) -> Boolean, relatedActionTypes: List? = null, extraCondition: String? = null, + effectiveDate: Instant? = null, getter: (T) -> Any? - ) = Conditional(field, message, conditionDescription, condition, relatedActionTypes, extraCondition, getter) + ) = Conditional(field, message, conditionDescription, condition, relatedActionTypes, extraCondition, effectiveDate, getter) } } } diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/ValidationRulesDocGenerator.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/ValidationRulesDocGenerator.kt index 5574ebde8..ab6de865c 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/ValidationRulesDocGenerator.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/ValidationRulesDocGenerator.kt @@ -4,6 +4,8 @@ import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.action.ActionType import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.MissionNavActionEntity import java.io.File import java.time.LocalDate +import java.time.ZoneId +import java.time.format.DateTimeFormatter /** * Generates a markdown documentation file from the validation rules defined in RequiredFieldsValidator. @@ -18,7 +20,7 @@ fun main() { println("Generated ${outputFile.absolutePath}") } -private data class FieldEntry(val field: String, val extraCondition: String?) +private data class FieldEntry(val field: String, val extraCondition: String?, val effectiveDate: String? = null) fun generateValidationRulesMarkdown(): String { val sb = StringBuilder() @@ -42,17 +44,26 @@ private fun appendHeader(sb: StringBuilder) { sb.appendLine() } +private val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.of("UTC")) + +private fun formatEffectiveDate(rule: RequiredFieldsValidator.Rule<*>): String { + val date = rule.effectiveDate ?: return "-" + return dateFormatter.format(date) +} + private fun appendRulesPerEntity(sb: StringBuilder) { for ((entityClass, rules) in RequiredFieldsValidator.rulesRegistry) { sb.appendLine("## ${entityClass.simpleName}") sb.appendLine() - sb.appendLine("| Champ | Condition | Message d'erreur |") - sb.appendLine("|-------|-----------|------------------|") + sb.appendLine("| Champ | Condition | Message d'erreur | Effectif depuis |") + sb.appendLine("|-------|-----------|------------------|-----------------|") val groupedByField = rules.groupBy { it.field } for ((field, fieldRules) in groupedByField) { val condition = fieldRules.joinToString(" **OU** ") { it.conditionDescription } - sb.appendLine("| `$field` | $condition | ${fieldRules.first().message} |") + val effectiveDate = fieldRules.mapNotNull { it.effectiveDate }.maxOrNull() + ?.let { dateFormatter.format(it) } ?: "-" + sb.appendLine("| `$field` | $condition | ${fieldRules.first().message} | $effectiveDate |") } sb.appendLine() @@ -93,14 +104,15 @@ private fun collectFieldsForActionType( for (rule in rules) { if (!ruleMatchesActionType(rule, actionType)) continue val extra = (rule as? RequiredFieldsValidator.Rule.Conditional<*>)?.extraCondition - fields.add(FieldEntry(rule.field, extra)) + fields.add(FieldEntry(rule.field, extra, rule.effectiveDate?.let { dateFormatter.format(it) })) } return fields .groupBy { it.field } .map { (field, entries) -> val extras = entries.mapNotNull { it.extraCondition }.distinct() - FieldEntry(field, extras.joinToString(" / ").ifEmpty { null }) + val effectiveDates = entries.mapNotNull { it.effectiveDate }.distinct() + FieldEntry(field, extras.joinToString(" / ").ifEmpty { null }, effectiveDates.joinToString(" / ").ifEmpty { null }) } } @@ -115,10 +127,10 @@ private fun ruleMatchesActionType(rule: RequiredFieldsValidator.Rule<*>, actionT private fun appendActionTypeTable(sb: StringBuilder, actionType: ActionType, fields: List) { sb.appendLine("### $actionType") sb.appendLine() - sb.appendLine("| Champ | Condition supplementaire |") - sb.appendLine("|-------|-------------------------|") + sb.appendLine("| Champ | Condition supplementaire | Effectif depuis |") + sb.appendLine("|-------|-------------------------|-----------------|") for (entry in fields) { - sb.appendLine("| `${entry.field}` | ${entry.extraCondition ?: "-"} |") + sb.appendLine("| `${entry.field}` | ${entry.extraCondition ?: "-"} | ${entry.effectiveDate ?: "-"} |") } sb.appendLine() } diff --git a/backend/src/test/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/RequiredFieldsValidatorTest.kt b/backend/src/test/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/RequiredFieldsValidatorTest.kt index 230a0e338..ad5113028 100644 --- a/backend/src/test/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/RequiredFieldsValidatorTest.kt +++ b/backend/src/test/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/RequiredFieldsValidatorTest.kt @@ -461,4 +461,104 @@ class RequiredFieldsValidatorTest { assertFalse(result.errors.any { it.field == "fishAuction" }) } } + + // ========================================================================= + // Effective date (grandfathering) tests + // ========================================================================= + @Nested + @DisplayName("Effective date grandfathering") + inner class EffectiveDateTests { + + private val pamService = ServiceEntity(name = "PAM Test", serviceType = ServiceTypeEnum.PAM) + + @Test + fun `rule with effectiveDate should be skipped when mission predates it`() { + // Mission started 2024-01-01, rule effective from 2025-06-01 → rule should be skipped + val entity = MissionGeneralInfoEntity( + id = 1, + missionId = 100, + service = pamService, + distanceInNauticalMiles = null // normally required for PAM + ) + + // Set mission start date BEFORE the rule effective date + val missionStartDate = Instant.parse("2024-01-01T00:00:00Z") + val result = validator.validate(entity, ValidateWhenMissionFinished::class.java, missionStartDate = missionStartDate) + + // distanceInNauticalMiles has no effectiveDate, so it SHOULD still be flagged + assertTrue(result.errors.any { it.field == "distanceInNauticalMiles" }) + } + + @Test + fun `rule with effectiveDate should be enforced when mission is after it`() { + // Directly test the Rule.isGrandfathered method + val rule = RequiredFieldsValidator.Rule.always( + "testField", "Test message", + effectiveDate = Instant.parse("2025-01-01T00:00:00Z") + ) { null } + + // Mission started AFTER effective date → not grandfathered + assertFalse(rule.isGrandfathered(Instant.parse("2025-06-01T00:00:00Z"))) + } + + @Test + fun `rule with effectiveDate should be skipped when mission is before it`() { + val rule = RequiredFieldsValidator.Rule.always( + "testField", "Test message", + effectiveDate = Instant.parse("2025-06-01T00:00:00Z") + ) { null } + + // Mission started BEFORE effective date → grandfathered + assertTrue(rule.isGrandfathered(Instant.parse("2025-01-01T00:00:00Z"))) + } + + @Test + fun `rule without effectiveDate should never be grandfathered`() { + val rule = RequiredFieldsValidator.Rule.always( + "testField", "Test message" + ) { null } + + // No effective date → always applies + assertFalse(rule.isGrandfathered(Instant.parse("2020-01-01T00:00:00Z"))) + assertFalse(rule.isGrandfathered(null)) + } + + @Test + fun `rule with effectiveDate should apply when missionStartDate is null`() { + val rule = RequiredFieldsValidator.Rule.always( + "testField", "Test message", + effectiveDate = Instant.parse("2025-06-01T00:00:00Z") + ) { null } + + // Null mission start date → not grandfathered (safe default: all rules apply) + assertFalse(rule.isGrandfathered(null)) + } + + @Test + fun `integration - NavAction rule with effectiveDate is grandfathered for old mission`() { + // Create a nav action missing endDateTimeUtc (normally required for CONTROL) + val entity = MissionNavActionEntity( + id = UUID.randomUUID(), + missionId = 1, + actionType = ActionType.CONTROL, + startDateTimeUtc = Instant.now(), + endDateTimeUtc = null, // required for CONTROL + controlMethod = ControlMethod.SEA, + vesselIdentifier = "ABC", + vesselType = VesselTypeEnum.FISHING, + vesselSize = VesselSizeEnum.LESS_THAN_12m, + identityControlledPerson = "Test" + ) + + // Validate WITHOUT missionStartDate → endDateTimeUtc should be flagged + val resultWithout = validator.validate(entity, ValidateWhenMissionFinished::class.java) + assertTrue(resultWithout.errors.any { it.field == "endDateTimeUtc" }) + + // Validate WITH missionStartDate → endDateTimeUtc should still be flagged + // (because endDateTimeUtc rule has no effectiveDate) + val resultWith = validator.validate(entity, ValidateWhenMissionFinished::class.java, + missionStartDate = Instant.parse("2020-01-01T00:00:00Z")) + assertTrue(resultWith.errors.any { it.field == "endDateTimeUtc" }) + } + } } diff --git a/backend/src/test/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/WithinMissionDateRangeValidatorTest.kt b/backend/src/test/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/WithinMissionDateRangeValidatorTest.kt index d797077e6..ba6be11c6 100644 --- a/backend/src/test/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/WithinMissionDateRangeValidatorTest.kt +++ b/backend/src/test/kotlin/fr/gouv/dgampa/rapportnav/domain/validation/WithinMissionDateRangeValidatorTest.kt @@ -2,7 +2,7 @@ package fr.gouv.dgampa.rapportnav.domain.validation import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.action.ActionType import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.GetMissionDates -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.MissionDatesOutput +import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionDates import jakarta.validation.ConstraintValidatorContext import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.BeforeEach @@ -48,7 +48,7 @@ class WithinMissionDateRangeValidatorTest { private fun setupMissionDates(missionStart: Instant?, missionEnd: Instant?) { `when`(getMissionDates.execute(anyOrNull(), anyOrNull(), anyOrNull())).thenReturn( - MissionDatesOutput( + MissionDates( startDateTimeUtc = missionStart, endDateTimeUtc = missionEnd ) diff --git a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/mission/MissionEnvActionEntityTest.kt b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/mission/MissionEnvActionEntityTest.kt index 0fb14ccdc..a9e17864d 100644 --- a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/mission/MissionEnvActionEntityTest.kt +++ b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/mission/MissionEnvActionEntityTest.kt @@ -59,7 +59,7 @@ class MissionEnvActionEntityTest { fun `execute should be complete for stats env `() { val envAction = getEnvAction() val entity = MissionEnvActionEntity.fromEnvAction(missionId = 761, action = envAction) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.sourcesOfMissingDataForStats).isEqualTo(listOf(MissionSourceEnum.MONITORENV)) assertThat(entity.completenessForStats?.sources).isEqualTo(listOf(MissionSourceEnum.MONITORENV)) @@ -74,7 +74,7 @@ class MissionEnvActionEntityTest { val targetMock = TargetEntityMock.create(controls = controls) val entity = MissionEnvActionEntity.fromEnvAction(missionId = 761, action = envAction) entity.targets = listOf(targetMock) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.controlsToComplete).isEqualTo(listOf( ControlType.SECURITY)) assertThat(entity.availableControlTypesForInfraction).isEqualTo( listOf( @@ -92,11 +92,11 @@ class MissionEnvActionEntityTest { completion = ActionCompletionEnum.COMPLETED ) val entity = MissionEnvActionEntity.fromEnvAction(missionId = 761, action = envAction) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(true) entity.endDateTimeUtc = null - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) } diff --git a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/mission/MissionFishActionEntityTest.kt b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/mission/MissionFishActionEntityTest.kt index 38642878e..170d8d18d 100644 --- a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/mission/MissionFishActionEntityTest.kt +++ b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/mission/MissionFishActionEntityTest.kt @@ -92,7 +92,7 @@ class MissionFishActionEntityTest { completion = Completion.COMPLETED, ) val entity = MissionFishActionEntity.fromFishAction(action = fishAction) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(true) assertThat(entity.sourcesOfMissingDataForStats).isEqualTo(emptyList()) assertThat(entity.completenessForStats?.sources).isNull() @@ -106,7 +106,7 @@ class MissionFishActionEntityTest { completion = Completion.COMPLETED, ) val entity = MissionFishActionEntity.fromFishAction(action = fishAction) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.sourcesOfMissingDataForStats).isEqualTo(listOf(MissionSourceEnum.RAPPORT_NAV)) assertThat(entity.completenessForStats?.sources).isEqualTo(listOf(MissionSourceEnum.RAPPORT_NAV)) @@ -120,7 +120,7 @@ class MissionFishActionEntityTest { completion = Completion.TO_COMPLETE, ) val entity = MissionFishActionEntity.fromFishAction(action = fishAction) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.sourcesOfMissingDataForStats).isEqualTo(listOf(MissionSourceEnum.RAPPORT_NAV, MissionSourceEnum.MONITORFISH)) assertThat(entity.completenessForStats?.sources).isEqualTo(listOf(MissionSourceEnum.RAPPORT_NAV, MissionSourceEnum.MONITORFISH)) @@ -155,7 +155,7 @@ class MissionFishActionEntityTest { ) entity.targets = listOf(TargetEntityMock.create(controls = listOf(controlWithIncompleteAdmin))) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.controlsToComplete).contains(ControlType.ADMINISTRATIVE) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) @@ -166,7 +166,7 @@ class MissionFishActionEntityTest { ) entity.targets = listOf(TargetEntityMock.create(controls = listOf(controlWithCompleteAdmin))) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.controlsToComplete).doesNotContain(ControlType.ADMINISTRATIVE) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -177,11 +177,11 @@ class MissionFishActionEntityTest { completion = Completion.COMPLETED ) val entity = MissionFishActionEntity.fromFishAction(action = fishAction) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(true) entity.endDateTimeUtc = null - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) } @@ -193,11 +193,11 @@ class MissionFishActionEntityTest { actionEndDatetimeUtc = Instant.parse("2021-01-02T13:00:01Z"), ) val entity = MissionFishActionEntity.fromFishAction(action = fishAction) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) entity.endDateTimeUtc = Instant.parse("2023-01-02T13:00:01Z") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(true) } diff --git a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/mission/MissionNavActionEntityTest.kt b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/mission/MissionNavActionEntityTest.kt index b787d26d5..f417468e9 100644 --- a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/mission/MissionNavActionEntityTest.kt +++ b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/mission/MissionNavActionEntityTest.kt @@ -221,7 +221,7 @@ class MissionNavActionEntityTest { fun `execute should be complete for stats `() { val model = getActionModel() val entity = MissionNavActionEntity.fromMissionActionModel(model) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(true) assertThat(entity.sourcesOfMissingDataForStats).isEqualTo(emptyList()) assertThat(entity.completenessForStats?.sources).isNull() diff --git a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/mission/nav/crew/MissionPassengerEntityTest.kt b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/mission/nav/crew/MissionPassengerEntityTest.kt index 5d3156285..8611b4306 100644 --- a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/mission/nav/crew/MissionPassengerEntityTest.kt +++ b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/mission/nav/crew/MissionPassengerEntityTest.kt @@ -3,7 +3,7 @@ package fr.gouv.gmampa.rapportnav.domain.entities.mission.nav.crew import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.crew.MissionPassengerEntity import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.crew.MissionPassengerOrganization import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.GetMissionDates -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.MissionDatesOutput +import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionDates import fr.gouv.dgampa.rapportnav.domain.validation.ValidateThrowsBeforeSave import fr.gouv.dgampa.rapportnav.domain.validation.WithinMissionDateRangeValidator import jakarta.validation.ConstraintValidatorContext @@ -55,7 +55,7 @@ class MissionPassengerEntityTest { private fun setupMissionDates(missionStart: Instant?, missionEnd: Instant?) { `when`(getMissionDates.execute(anyOrNull(), anyOrNull(), anyOrNull())).thenReturn( - MissionDatesOutput( + MissionDates( startDateTimeUtc = missionStart, endDateTimeUtc = missionEnd ) diff --git a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/v2/MissionNavActionEntityTest.kt b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/v2/MissionNavActionEntityTest.kt index 452aa8f0c..f8c4527c8 100644 --- a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/v2/MissionNavActionEntityTest.kt +++ b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/entities/v2/MissionNavActionEntityTest.kt @@ -30,7 +30,7 @@ class MissionNavActionEntityTest { @Test fun `execute should not complete for stats until all is filled action type NOTE`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.NOTE) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(true) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -38,18 +38,18 @@ class MissionNavActionEntityTest { @Test fun `execute should not complete for stats until all is filled action type ANTI_POLLUTION`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.ANTI_POLLUTION) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.latitude = 2.0 entity.longitude = 2.0 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(true) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -58,12 +58,12 @@ class MissionNavActionEntityTest { @Test fun `execute should not complete for stats until all is filled action type BAAEM_PERMANENCE`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.BAAEM_PERMANENCE) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(true) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -72,12 +72,12 @@ class MissionNavActionEntityTest { @Test fun `execute should not complete for stats until all is filled action type VIGIMER`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.VIGIMER) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(true) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -85,12 +85,12 @@ class MissionNavActionEntityTest { @Test fun `execute should not complete for stats until all is filled action type REPRESENTATION`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.REPRESENTATION) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(true) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -98,12 +98,12 @@ class MissionNavActionEntityTest { @Test fun `execute should not complete for stats until all is filled action type PUBLIC_ORDER`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.PUBLIC_ORDER) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(true) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -111,12 +111,12 @@ class MissionNavActionEntityTest { @Test fun `execute should not complete for stats until all is filled action type NAUTICAL_EVENT`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.NAUTICAL_EVENT) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(true) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -124,34 +124,34 @@ class MissionNavActionEntityTest { @Test fun `execute should not complete for stats until all is filled action type ILLEGAL_IMMIGRATION`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.ILLEGAL_IMMIGRATION) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.nbOfInterceptedVessels = 5 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.nbOfInterceptedMigrants = 10 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.nbOfSuspectedSmugglers = 3 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.latitude = 2.0 entity.longitude = 2.0 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(true) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) @@ -163,49 +163,49 @@ class MissionNavActionEntityTest { actionType = ActionType.RESCUE, isPersonRescue = true, isMigrationRescue = false ) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.latitude = 345.0 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.longitude = 897.0 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.numberPersonsRescued = 3 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.numberOfDeaths = 4 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.isMigrationRescue = true entity.isPersonRescue = false - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.nbOfVesselsTrackedWithoutIntervention = 9 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.nbAssistedVesselsReturningToShore = 2 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.now() - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(true) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -213,17 +213,17 @@ class MissionNavActionEntityTest { @Test fun `execute should not complete for stats until all is filled action type STATUS`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.STATUS) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.status = ActionStatusType.DOCKED - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.reason = ActionStatusReason.ADMINISTRATION - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(true) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -231,48 +231,48 @@ class MissionNavActionEntityTest { @Test fun `execute should not complete for stats until all is filled action type CONTROL`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.CONTROL) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.latitude = 345.0 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.longitude = 897.0 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.controlMethod = ControlMethod.SEA - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.vesselIdentifier = "My vessel identifier" - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.vesselType = VesselTypeEnum.SAILING - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.vesselSize = VesselSizeEnum.LESS_THAN_12m - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.identityControlledPerson = "My identify person" - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(true) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -307,14 +307,14 @@ class MissionNavActionEntityTest { sectorEstablishmentType = SectorEstablishmentType.LANDING_SITE, establishment = null ) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) // Add portLocode and endDateTimeUtc entity.portLocode = "FRBST" entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(true) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -327,14 +327,14 @@ class MissionNavActionEntityTest { sectorEstablishmentType = SectorEstablishmentType.FISH_AUCTION, establishment = null ) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) // Add zipCode and endDateTimeUtc entity.fishAuction = FishAuctionEntity(name = "abc", facade = FacadeTypeEnum.MED) entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(true) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -348,14 +348,14 @@ class MissionNavActionEntityTest { establishment = null, locationDescription = null ) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) // Add establishment and endDateTimeUtc entity.establishment = EstablishmentEntity(siren = "123456789") entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(true) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -369,14 +369,14 @@ class MissionNavActionEntityTest { establishment = null, locationDescription = null ) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(false) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) // Add establishment and endDateTimeUtc entity.establishment = EstablishmentEntity(siren = "987654321", name = "Test Establishment") entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) Assertions.assertThat(entity.isCompleteForStats).isEqualTo(true) Assertions.assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } diff --git a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/UpdateEnvActionTest.kt b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/UpdateEnvActionTest.kt index b775e4b0b..6436bfe57 100644 --- a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/UpdateEnvActionTest.kt +++ b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/UpdateEnvActionTest.kt @@ -7,7 +7,7 @@ import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.action.ActionType import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.PatchEnvAction import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.v2.UpdateEnvAction import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.GetMissionDates -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.MissionDatesOutput +import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionDates import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.ProcessMissionActionTarget import fr.gouv.dgampa.rapportnav.domain.validation.EntityValidityValidator import fr.gouv.dgampa.rapportnav.domain.validation.ValidateThrowsBeforeSave @@ -65,7 +65,7 @@ class UpdateEnvActionTest { ) ).thenReturn(listOf(TargetEntityMock.create())) `when`(getMissionDates.execute(anyOrNull(), anyOrNull(), anyOrNull())).thenReturn( - MissionDatesOutput( + MissionDates( startDateTimeUtc = Instant.parse("2019-09-01T00:00:00Z"), endDateTimeUtc = Instant.parse("2019-09-10T00:00:00Z") ) diff --git a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/UpdateFishActionTest.kt b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/UpdateFishActionTest.kt index 5762e0128..dfe00f3a9 100644 --- a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/UpdateFishActionTest.kt +++ b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/UpdateFishActionTest.kt @@ -8,7 +8,7 @@ import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.action.ActionType import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.PatchFishAction import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.v2.UpdateFishAction import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.GetMissionDates -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.MissionDatesOutput +import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionDates import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.ProcessMissionActionTarget import fr.gouv.dgampa.rapportnav.domain.validation.EntityValidityValidator import fr.gouv.dgampa.rapportnav.domain.validation.ValidateThrowsBeforeSave @@ -69,7 +69,7 @@ class UpdateFishActionTest { ) ).thenReturn(listOf(TargetEntityMock.create())) `when`(getMissionDates.execute(anyOrNull(), anyOrNull(), anyOrNull())).thenReturn( - MissionDatesOutput( + MissionDates( startDateTimeUtc = Instant.parse("2019-09-01T00:00:00Z"), endDateTimeUtc = Instant.parse("2019-09-10T00:00:00Z") ) diff --git a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/UpdateNavActionTest.kt b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/UpdateNavActionTest.kt index 032a65d7b..8382140aa 100644 --- a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/UpdateNavActionTest.kt +++ b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/UpdateNavActionTest.kt @@ -13,7 +13,7 @@ import fr.gouv.dgampa.rapportnav.domain.exceptions.BackendUsageException import fr.gouv.dgampa.rapportnav.domain.repositories.mission.action.INavMissionActionRepository import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.v2.UpdateNavAction import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.GetMissionDates -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.MissionDatesOutput +import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionDates import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.ProcessMissionActionTarget import fr.gouv.dgampa.rapportnav.domain.validation.EntityValidityValidator import fr.gouv.dgampa.rapportnav.domain.validation.ValidateThrowsBeforeSave @@ -75,7 +75,7 @@ class UpdateNavActionTest { ) ).thenReturn(listOf(TargetEntityMock.create())) `when`(getMissionDates.execute(anyOrNull(), anyOrNull(), anyOrNull())).thenReturn( - MissionDatesOutput( + MissionDates( startDateTimeUtc = Instant.parse("2019-09-01T00:00:00Z"), endDateTimeUtc = Instant.parse("2019-09-10T00:00:00Z") ) diff --git a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/v2/ProcessEnvActionTest.kt b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/v2/ProcessEnvActionTest.kt index 5a0b214d3..bacf97905 100644 --- a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/v2/ProcessEnvActionTest.kt +++ b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/v2/ProcessEnvActionTest.kt @@ -5,7 +5,7 @@ import fr.gouv.dgampa.rapportnav.domain.validation.EntityValidityValidator import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.v2.GetComputeEnvTarget import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.v2.ProcessEnvAction import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.GetMissionDates -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.MissionDatesOutput +import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionDates import fr.gouv.gmampa.rapportnav.mocks.mission.TargetEntityMock import java.time.Instant import fr.gouv.gmampa.rapportnav.mocks.mission.action.EnvActionControlMock @@ -55,7 +55,7 @@ class ProcessEnvActionTest { val mockTarget = TargetEntityMock.create() `when`(getComputeEnvTarget.execute(anyOrNull(), anyOrNull(), anyOrNull())).thenReturn(listOf(mockTarget)) `when`(getMissionDates.execute(anyOrNull(), anyOrNull(), anyOrNull())).thenReturn( - MissionDatesOutput( + MissionDates( startDateTimeUtc = Instant.parse("2019-09-01T00:00:00Z"), endDateTimeUtc = Instant.parse("2019-09-10T00:00:00Z") ) diff --git a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/v2/ProcessFishActionTest.kt b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/v2/ProcessFishActionTest.kt index 0a436b242..ee9cb8e64 100644 --- a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/v2/ProcessFishActionTest.kt +++ b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/v2/ProcessFishActionTest.kt @@ -6,7 +6,7 @@ import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.v2.GetComputeSa import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.v2.GetComputeTarget import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.v2.ProcessFishAction import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.GetMissionDates -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.MissionDatesOutput +import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionDates import fr.gouv.gmampa.rapportnav.mocks.mission.TargetEntityMock import fr.gouv.dgampa.rapportnav.domain.entities.mission.CompletenessForStatsEntity import fr.gouv.dgampa.rapportnav.domain.entities.mission.CompletenessForStatsStatusEnum @@ -60,7 +60,7 @@ class ProcessFishActionTest { val mockTarget = TargetEntityMock.create() `when`(getComputeTarget.execute(actionId.hashCode().toString(), true)).thenReturn(listOf(mockTarget)) `when`(getMissionDates.execute(anyOrNull(), anyOrNull(), anyOrNull())).thenReturn( - MissionDatesOutput( + MissionDates( startDateTimeUtc = Instant.parse("2019-09-01T00:00:00Z"), endDateTimeUtc = Instant.parse("2019-09-10T00:00:00Z") ) diff --git a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/v2/ProcessNavActionTest.kt b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/v2/ProcessNavActionTest.kt index 4b9c4333b..a98a17c50 100644 --- a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/v2/ProcessNavActionTest.kt +++ b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/domain/use_cases/mission/action/v2/ProcessNavActionTest.kt @@ -6,7 +6,7 @@ import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.GetStatusForAct import fr.gouv.dgampa.rapportnav.domain.validation.EntityValidityValidator import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.v2.* import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.GetMissionDates -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.MissionDatesOutput +import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionDates import fr.gouv.gmampa.rapportnav.mocks.mission.TargetEntityMock import org.mockito.kotlin.anyOrNull import org.assertj.core.api.Assertions.assertThat @@ -58,7 +58,7 @@ class ProcessNavActionTest { val mockTarget = TargetEntityMock.create() `when`(getComputeTarget.execute(actionId.toString(), true)).thenReturn(listOf(mockTarget)) `when`(getMissionDates.execute(anyOrNull(), anyOrNull(), anyOrNull())).thenReturn( - MissionDatesOutput( + MissionDates( startDateTimeUtc = Instant.parse("2019-09-01T00:00:00Z"), endDateTimeUtc = Instant.parse("2019-09-10T00:00:00Z") ) diff --git a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/infrastructure/bff/model/v2/MissionNavActionTest.kt b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/infrastructure/bff/model/v2/MissionNavActionTest.kt index 36ef04f5d..a473a47c1 100644 --- a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/infrastructure/bff/model/v2/MissionNavActionTest.kt +++ b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/infrastructure/bff/model/v2/MissionNavActionTest.kt @@ -28,7 +28,7 @@ class MissionNavActionTest { @Test fun `execute should not complete for stats until all is filled action type NOTE`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.NOTE) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(true) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -36,18 +36,18 @@ class MissionNavActionTest { @Test fun `execute should not complete for stats until all is filled action type ANTI_POLLUTION`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.ANTI_POLLUTION) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.latitude = 2.0 entity.longitude = 2.0 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(true) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -56,12 +56,12 @@ class MissionNavActionTest { @Test fun `execute should not complete for stats until all is filled action type BAAEM_PERMANENCE`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.BAAEM_PERMANENCE) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(true) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -70,12 +70,12 @@ class MissionNavActionTest { @Test fun `execute should not complete for stats until all is filled action type VIGIMER`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.VIGIMER) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(true) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -83,12 +83,12 @@ class MissionNavActionTest { @Test fun `execute should not complete for stats until all is filled action type REPRESENTATION`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.REPRESENTATION) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(true) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -96,12 +96,12 @@ class MissionNavActionTest { @Test fun `execute should not complete for stats until all is filled action type PUBLIC_ORDER`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.PUBLIC_ORDER) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(true) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -109,12 +109,12 @@ class MissionNavActionTest { @Test fun `execute should not complete for stats until all is filled action type NAUTICAL_EVENT`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.NAUTICAL_EVENT) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(true) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -122,34 +122,34 @@ class MissionNavActionTest { @Test fun `execute should not complete for stats until all is filled action type ILLEGAL_IMMIGRATION`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.ILLEGAL_IMMIGRATION) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.nbOfInterceptedVessels = 5 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.nbOfInterceptedMigrants = 10 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.nbOfSuspectedSmugglers = 3 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.latitude = 2.0 entity.longitude = 2.0 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(true) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) @@ -161,49 +161,49 @@ class MissionNavActionTest { actionType = ActionType.RESCUE, isPersonRescue = true, isMigrationRescue = false ) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.latitude = 345.0 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.longitude = 897.0 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.numberPersonsRescued = 3 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.numberOfDeaths = 4 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.isMigrationRescue = true entity.isPersonRescue = false - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.nbOfVesselsTrackedWithoutIntervention = 9 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.nbAssistedVesselsReturningToShore = 2 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.now() - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(true) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -211,17 +211,17 @@ class MissionNavActionTest { @Test fun `execute should not complete for stats until all is filled action type STATUS`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.STATUS) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.status = ActionStatusType.DOCKED - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.reason = ActionStatusReason.ADMINISTRATION - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(true) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } @@ -229,53 +229,53 @@ class MissionNavActionTest { @Test fun `execute should not complete for stats until all is filled action type CONTROL`() { val entity = MissionNavActionEntityMock.create(actionType = ActionType.CONTROL) - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.endDateTimeUtc = Instant.parse("2019-09-08T24:00:00.000+01:00") - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.latitude = 345.0 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.longitude = 897.0 - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.controlMethod = ControlMethod.SEA - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.locationType = LocationType.GPS - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.vesselIdentifier = "My vessel identifier" - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.vesselType = VesselTypeEnum.SAILING - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.vesselSize = VesselSizeEnum.LESS_THAN_12m - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(false) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.INCOMPLETE) entity.identityControlledPerson = "My identify person" - entity.computeValidity(true, validator) + entity.computeValidity(validator = validator) assertThat(entity.isCompleteForStats).isEqualTo(true) assertThat(entity.completenessForStats?.status).isEqualTo(CompletenessForStatsStatusEnum.VALID) } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 550b73f34..5c2c45dc1 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "frontend", - "version": "2.84.1", + "version": "2.84.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "frontend", - "version": "2.84.1", + "version": "2.84.2", "dependencies": { "@date-fns/utc": "^2.1.1", "@mtes-mct/monitor-ui": "^24.52.1", diff --git a/frontend/src/v2/features/mission-target/components/ui/mission-target-title.tsx b/frontend/src/v2/features/mission-target/components/ui/mission-target-title.tsx index b98b0de40..c48b15ac1 100644 --- a/frontend/src/v2/features/mission-target/components/ui/mission-target-title.tsx +++ b/frontend/src/v2/features/mission-target/components/ui/mission-target-title.tsx @@ -27,7 +27,7 @@ const MissionTargetTitle: React.FC = ({ target, targetT const getTitleSingle = (target?: Target, vehicle?: string) => { const id = target?.externalData?.registrationNumber ?? target?.identityControlledPerson const vesselType = getVesselTypeName(target?.externalData?.vesselType ?? target?.vesselType) - return `${vehicle ?? ''}${vesselType && vehicle ? ` - ` : ''}${vesselType ?? ''}${vesselType && id ? ` - ` : ''}${id ?? ''}` + return `${vehicle ?? ''}${vesselType && vehicle ? ' - ' : ''}${vesselType ?? ''}${vesselType && id ? ' - ' : ''}${id ?? ''}` } const getTitle = (target?: Target, vehicleType?: VehicleTypeEnum): string => {