diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionEntity2.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionEntity2.kt new file mode 100644 index 000000000..9088fb3a6 --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionEntity2.kt @@ -0,0 +1,69 @@ +package fr.gouv.dgampa.rapportnav.domain.entities.mission.v2 + +import fr.gouv.dgampa.rapportnav.domain.entities.mission.CompletenessForStatsEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.CompletenessForStatsStatusEnum +import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionStatusEnum +import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.MissionEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.MissionSourceEnum +import org.slf4j.LoggerFactory +import java.time.Instant +import java.time.format.DateTimeParseException + +data class MissionEntity2( + val id: Int, + val envData: MissionEntity, + val actions: List, + val generalInfos: MissionGeneralInfoEntity2? = null +) { + + private val logger = LoggerFactory.getLogger(MissionEntity2::class.java) + + fun isCompleteForStats(): CompletenessForStatsEntity { + val completenessForStats = this.actionsIsCompleteForStats() + val generalInfoComplete = this.generalInfos?.isCompleteForStats() + return CompletenessForStatsEntity( + status = if (generalInfoComplete == true) completenessForStats.status else CompletenessForStatsStatusEnum.INCOMPLETE, + sources = if (generalInfoComplete == true) completenessForStats.sources else completenessForStats.sources?.plus(MissionSourceEnum.RAPPORTNAV) + ?.distinct(), + ) + } + + fun calculateMissionStatus( + startDateTimeUtc: Instant, + endDateTimeUtc: Instant? = null, + ): MissionStatusEnum { + val compareDate = Instant.now() + if (endDateTimeUtc == null || startDateTimeUtc == null) return MissionStatusEnum.UNAVAILABLE + val endDateTime = Instant.parse(endDateTimeUtc.toString()) + val startDateTime = Instant.parse(startDateTimeUtc.toString()) + try { + if (endDateTime.isAfter(compareDate)) return MissionStatusEnum.IN_PROGRESS + if (endDateTime.isBefore(compareDate) || endDateTime.equals(compareDate)) return MissionStatusEnum.ENDED + if (startDateTime.isAfter(compareDate) || startDateTime.equals(compareDate)) + return MissionStatusEnum.UPCOMING + } catch (e: DateTimeParseException) { + logger.error("calculateMissionStatus - error with startDate: ${startDateTime}, endDate: ${endDateTime}", e) + } + return MissionStatusEnum.UNAVAILABLE + } + + private fun actionsIsCompleteForStats(): CompletenessForStatsEntity { + val sources = listOf() + this.actions.forEach { + if (it.isCompleteForStats != true) { + sources.plus(it.source) + } + } + val status = if (sources.distinct() + .isEmpty() + ) CompletenessForStatsStatusEnum.COMPLETE else CompletenessForStatsStatusEnum.INCOMPLETE + + return CompletenessForStatsEntity( + status = status, + sources = sources.distinct() + ) + } + + +} + diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionGeneralInfoEntity2.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionGeneralInfoEntity2.kt new file mode 100644 index 000000000..7a83d6ab3 --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/entities/mission/v2/MissionGeneralInfoEntity2.kt @@ -0,0 +1,26 @@ +package fr.gouv.dgampa.rapportnav.domain.entities.mission.v2 + +import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.ServiceEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.crew.MissionCrewEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.generalInfo.MissionGeneralInfoEntity + +data class MissionGeneralInfoEntity2( + val data: MissionGeneralInfoEntity? = null, + val crew: List? = null, + val services: List? = null +) { + fun isCompleteForStats(): Boolean { + return this.isCrewComplete() && this.isDataComplete() + } + + private fun isCrewComplete(): Boolean { + return this.crew.isNullOrEmpty() + } + + private fun isDataComplete(): Boolean { + return this.data != null + && this.data.consumedFuelInLiters != null + && this.data.consumedGOInLiters != null + && this.data.distanceInNauticalMiles != null + } +} diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/FakeMissionData2.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/FakeMissionData2.kt new file mode 100644 index 000000000..0cb4b115d --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/FakeMissionData2.kt @@ -0,0 +1,172 @@ +package fr.gouv.dgampa.rapportnav.domain.use_cases.mission + +import fr.gouv.dgampa.rapportnav.config.UseCase +import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.ActionCompletionEnum +import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.MissionEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.MissionSourceEnum +import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.MissionTypeEnum +import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.envActions.* +import fr.gouv.dgampa.rapportnav.domain.entities.mission.fish.fishActions.MissionActionType +import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.crew.AgentEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.crew.AgentRoleEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.crew.MissionCrewEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.* +import fr.gouv.dgampa.rapportnav.domain.entities.user.User +import org.locationtech.jts.geom.Coordinate +import java.time.Instant +import java.util.* + +@UseCase +class FakeMissionData2( + private val getFakeActionData: FakeActionData +) { + fun getEnvControls(missionId: Int): List { + val envActionControl1 = MissionEnvActionEntity( + envActionType = ActionTypeEnum.CONTROL, + missionId = missionId, + id = UUID.fromString("226d84bc-e6c5-4d29-8a5f-7db642f99$missionId"), + startDateTimeUtc = Instant.parse("2024-01-09T10:00:00Z"), + endDateTimeUtc = null, // Set to null if not provided in your API response + controlPlans = listOf( + EnvActionControlPlanEntity( + themeId = 1, + subThemeIds = listOf(1), + tagIds = listOf(1), + ) + ), + geom = createMockMultiPoint(listOf(Coordinate(-8.52318191, 48.30305604))), + actionNumberOfControls = 2, + actionTargetType = ActionTargetTypeEnum.VEHICLE, + vehicleType = VehicleTypeEnum.VESSEL, + observations = "Observation", + isComplianceWithWaterRegulationsControl = true, + isSafetyEquipmentAndStandardsComplianceControl = true, + isSeafarersControl = false, + isAdministrativeControl = false, + envInfractions = listOf( + InfractionEntity( + id = "91200795-2823-46b3-8814-a5b3bca29$missionId", + natinf = listOf("4210", "28732"), + registrationNumber = "123ABC57", + companyName = null, + relevantCourt = null, + infractionType = InfractionTypeEnum.WITHOUT_REPORT, + formalNotice = FormalNoticeEnum.NO, + toProcess = false, + controlledPersonIdentity = "M. Bernard", + vesselType = VesselTypeEnum.COMMERCIAL, + vesselSize = VesselSizeEnum.FROM_24_TO_46m + ) + ) + ) + + val envActionSurveillance1 = MissionEnvActionEntity( + envActionType = ActionTypeEnum.SURVEILLANCE, + missionId = missionId, + id = UUID.fromString("226d84bc-e6c5-4d29-8a5f-799642f99$missionId"), + startDateTimeUtc = Instant.parse("2024-01-09T12:00:00Z"), + endDateTimeUtc = Instant.parse("2024-01-09T13:00:00Z"), + controlPlans = listOf( + EnvActionControlPlanEntity( + themeId = 2, + subThemeIds = listOf(2), + tagIds = listOf(2), + ) + ), + geom = createMockMultiPoint(listOf(Coordinate(-8.52318191, 48.30305604))), + completion = ActionCompletionEnum.COMPLETED, + ) + return listOf(envActionSurveillance1, envActionControl1) + } + + fun fullMission(missionId: Int): MissionEntity2 { + + val envActions = getEnvControls(missionId) + val fishActions = getFishActions(missionId) + + val commandant = AgentRoleEntity(1, "Commandant") + val agentPont = AgentRoleEntity(2, "Agent pont") + + val gustave = AgentEntity(1, "Gustave", "Flaubert") + val bob = AgentEntity(2, "Bob", "Mascouche") + val crew1 = MissionCrewEntity( + id = 1, + agent = gustave, + role = commandant, + missionId = missionId + ) + + val crew2 = MissionCrewEntity( + id = 2, + agent = bob, + role = agentPont, + missionId = missionId + ) + + return MissionEntity2( + id = missionId, + envData = MissionEntity( + missionTypes = listOf(MissionTypeEnum.SEA), + missionSource = MissionSourceEnum.RAPPORTNAV, + startDateTimeUtc = Instant.parse("2024-01-09T09:00:00Z"), + endDateTimeUtc = Instant.parse("2024-01-09T15:00:00Z"), + isDeleted = false, + isGeometryComputedFromControls = false, + hasMissionOrder = false, + isUnderJdp = false, + openBy = "fake", + observationsByUnit = "Lors de la patrouille matinale, une concentration inhabituelle de déchets plastiques a été observée le long de la laisse de mer sur environ 300 mètres de rivage. Des fragments de filets de pêche, des bouteilles plastiques, et divers emballages ont été identifiés, laissant penser à un rejet en mer récent." + ), + actions = fishActions + envActions, + generalInfos = MissionGeneralInfoEntity2( + crew = listOf(crew1, crew2) + ) + ) + } + + fun getFishActions(missionId: Int) = getFakeActionData.getFakeFishActions(missionId).filter { + listOf( + MissionActionType.SEA_CONTROL, + MissionActionType.LAND_CONTROL + ).contains(it.actionType) + }.map { MissionFishActionEntity.fromFishAction(it) } + + fun emptyMission(missionId: Int): MissionEntity2 { + return MissionEntity2( + id = missionId, + envData = MissionEntity( + missionTypes = listOf(MissionTypeEnum.SEA), + missionSource = MissionSourceEnum.RAPPORTNAV, + startDateTimeUtc = Instant.parse("2024-01-09T09:00:00Z"), + endDateTimeUtc = Instant.parse("2024-01-09T15:00:00Z"), + isDeleted = false, + isGeometryComputedFromControls = false, + hasMissionOrder = false, + isUnderJdp = false, + openBy = "fake" + ), + actions = listOf(), + ) + } + + fun getFakeMissionsforUser(user: User?): List { + return when (user?.serviceId) { + // bouteillon + 7 -> { + listOf(fullMission(621), emptyMission(622)) + } + // Ariane + 3 -> { + listOf(fullMission(311), emptyMission(312)) + } + // d'Alba + 6 -> { + listOf(fullMission(761), emptyMission(762)) + } + // else + else -> { + listOf() + } + } + } +} diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/AbstractGetMissionAction.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/AbstractGetMissionAction.kt new file mode 100644 index 000000000..d46c1efd2 --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/AbstractGetMissionAction.kt @@ -0,0 +1,25 @@ +package fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.v2 + +import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.control.v2.ActionControlEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.status.ActionStatusType +import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.MissionActionEntity +import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.GetStatusForAction +import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.control.v2.GetControlByActionId2 + +abstract class AbstractGetMissionAction( + private val getStatusForAction: GetStatusForAction, + private val getControlByActionId: GetControlByActionId2 +) { + fun getControls(action: MissionActionEntity): ActionControlEntity? { + if (!action.isControl()) return null + return getControlByActionId.getAllControl(action.getActionId()) + } + + fun getStatus(action: MissionActionEntity): ActionStatusType? { + if (action.status != null) return action.status + return getStatusForAction.execute( + missionId = action.missionId, + actionStartDateTimeUtc = action.startDateTimeUtc + ) + } +} diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetEnvActionById.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetEnvActionById.kt index 4ab369ecf..f843e78d6 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetEnvActionById.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetEnvActionById.kt @@ -21,7 +21,7 @@ class GetEnvActionById( getControlByActionId: GetControlByActionId2, private val mapControlPlans: MapEnvActionControlPlans, private val getInfractionsByActionId: GetInfractionsByActionId, -): GetMissionAction(getStatusForAction, getControlByActionId) { +): AbstractGetMissionAction(getStatusForAction, getControlByActionId) { private val logger = LoggerFactory.getLogger(GetFishActionListByMissionId::class.java) fun execute(missionId: Int?, actionId: String): MissionEnvActionEntity? { diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetEnvActionListByMissionId.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetEnvActionListByMissionId.kt index db2b7d22e..a1c70c050 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetEnvActionListByMissionId.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetEnvActionListByMissionId.kt @@ -23,7 +23,7 @@ class GetEnvActionListByMissionId( getStatusForAction: GetStatusForAction, getControlByActionId: GetControlByActionId2, private val getFakeActionData: FakeActionData -) : GetMissionAction(getStatusForAction, getControlByActionId) { +) : AbstractGetMissionAction(getStatusForAction, getControlByActionId) { private val logger = LoggerFactory.getLogger(GetFishActionListByMissionId::class.java) @Cacheable(value = ["envActionList"], key = "#missionId") diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetEnvMissionById2.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetEnvMissionById2.kt index 05a2586c4..26136f0d2 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetEnvMissionById2.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetEnvMissionById2.kt @@ -12,9 +12,9 @@ class GetEnvMissionById2( ) { private val logger = LoggerFactory.getLogger(GetEnvMissionById2::class.java) - @Cacheable(value = ["envMission"], key = "#missionId") + @Cacheable(value = ["envMission2"], key = "#missionId") fun execute(missionId: Int?): MissionEntity? { - if (missionId == null) { + require(missionId != null) { logger.error("GetEnvMissionById received a null missionId") throw IllegalArgumentException("GetEnvMissionById should not receive null missionId") } diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetFishActionById.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetFishActionById.kt index 7463f7705..31dc92d0e 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetFishActionById.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetFishActionById.kt @@ -8,14 +8,13 @@ import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.GetStatusForAct import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.control.v2.GetControlByActionId2 import fr.gouv.dgampa.rapportnav.domain.utils.isValidUUID import org.slf4j.LoggerFactory -import org.springframework.cache.annotation.Cacheable @UseCase class GetFishActionById( private val fishActionRepo: IFishActionRepository, getStatusForAction: GetStatusForAction, getControlByActionId: GetControlByActionId2, -): GetMissionAction(getStatusForAction, getControlByActionId) { +): AbstractGetMissionAction(getStatusForAction, getControlByActionId) { private val logger = LoggerFactory.getLogger(GetFishActionListByMissionId::class.java) fun execute(missionId: Int?, actionId: String?): MissionFishActionEntity? { diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetFishActionListByMissionId.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetFishActionListByMissionId.kt index 54640aab2..f0faa34c6 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetFishActionListByMissionId.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetFishActionListByMissionId.kt @@ -17,7 +17,7 @@ class GetFishActionListByMissionId( getStatusForAction: GetStatusForAction, getControlByActionId: GetControlByActionId2, private val getFakeActionData: FakeActionData -): GetMissionAction(getStatusForAction, getControlByActionId) { +): AbstractGetMissionAction(getStatusForAction, getControlByActionId) { private val logger = LoggerFactory.getLogger(GetFishActionListByMissionId::class.java) @Cacheable(value = ["fishActionList"], key = "#missionId") diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetMissionAction.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetMissionAction.kt index 83f317799..7f7276c47 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetMissionAction.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetMissionAction.kt @@ -1,25 +1,18 @@ package fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.v2 -import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.control.v2.ActionControlEntity -import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.status.ActionStatusType +import fr.gouv.dgampa.rapportnav.config.UseCase import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.MissionActionEntity -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.GetStatusForAction -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.control.v2.GetControlByActionId2 -open class GetMissionAction( - private val getStatusForAction: GetStatusForAction, - private val getControlByActionId: GetControlByActionId2 +@UseCase +class GetMissionAction( + private val getEnvActionByMissionId: GetEnvActionListByMissionId, + private val getNavActionByMissionId: GetNavActionListByMissionId, + private val getFIshListActionByMissionId: GetFishActionListByMissionId ) { - fun getControls(action: MissionActionEntity): ActionControlEntity? { - if (!action.isControl()) return null - return getControlByActionId.getAllControl(action.getActionId()) - } - - fun getStatus(action: MissionActionEntity): ActionStatusType? { - if (action.status != null) return action.status - return getStatusForAction.execute( - missionId = action.missionId, - actionStartDateTimeUtc = action.startDateTimeUtc - ) + fun execute(missionId: Int?): List { + val envActions = getEnvActionByMissionId.execute(missionId = missionId) + val navActions = getNavActionByMissionId.execute(missionId = missionId) + val fishActions = getFIshListActionByMissionId.execute(missionId = missionId) + return (envActions + navActions + fishActions).sortedByDescending { action -> action.startDateTimeUtc } } } diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetNavActionById.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetNavActionById.kt index 35f8d5cc5..07fea6f55 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetNavActionById.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetNavActionById.kt @@ -14,7 +14,7 @@ class GetNavActionById( private val missionActionRepository: INavMissionActionRepository, getStatusForAction: GetStatusForAction, getControlByActionId: GetControlByActionId2, -): GetMissionAction(getStatusForAction, getControlByActionId) { +): AbstractGetMissionAction(getStatusForAction, getControlByActionId) { private val logger = LoggerFactory.getLogger(GetNavActionById::class.java) fun execute(actionId: String?): MissionNavActionEntity? { diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetNavActionListByMissionId.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetNavActionListByMissionId.kt index 6a73aadb8..b34d17700 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetNavActionListByMissionId.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/action/v2/GetNavActionListByMissionId.kt @@ -13,7 +13,7 @@ class GetNavActionListByMissionId( private val navMissionActionRepository: INavMissionActionRepository, getStatusForAction: GetStatusForAction, getControlByActionId: GetControlByActionId2 -): GetMissionAction(getStatusForAction, getControlByActionId) { +): AbstractGetMissionAction(getStatusForAction, getControlByActionId) { private val logger = LoggerFactory.getLogger(GetNavActionListByMissionId::class.java) fun execute(missionId: Int?): List { diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/v2/GetGeneralInfo2.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/v2/GetGeneralInfo2.kt new file mode 100644 index 000000000..3fda6e933 --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/v2/GetGeneralInfo2.kt @@ -0,0 +1,56 @@ +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.env.controlResources.LegacyControlUnitEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.ServiceEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.crew.MissionCrewEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.generalInfo.MissionGeneralInfoEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.MissionGeneralInfoEntity2 +import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.crew.GetAgentsCrewByMissionId +import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.crew.GetServiceByControlUnit +import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.generalInfo.GetMissionGeneralInfoByMissionId +import org.slf4j.LoggerFactory + +@UseCase +class GetGeneralInfo2( + private val getServiceByControlUnit: GetServiceByControlUnit, + private val getAgentsCrewByMissionId: GetAgentsCrewByMissionId, + private val getMissionGeneralInfoByMissionId: GetMissionGeneralInfoByMissionId, +) { + private val logger = LoggerFactory.getLogger(GetGeneralInfo2::class.java) + + fun execute(missionId: Int, controlUnits: List?): MissionGeneralInfoEntity2 { + return MissionGeneralInfoEntity2( + crew = fetchCrew(missionId), + services = fetchServices(controlUnits), + data = fetchGeneralInfo(missionId) + ) + } + + private fun fetchGeneralInfo(missionId: Int): MissionGeneralInfoEntity? { + return try { + getMissionGeneralInfoByMissionId.execute(missionId) + } catch (e: Exception) { + logger.error("Error fetching Nav general info for missionId: {}", missionId, e) + throw e + } + } + + private fun fetchCrew(missionId: Int): List { + return try { + getAgentsCrewByMissionId.execute(missionId) + } catch (e: Exception) { + logger.error("Error fetching Nav crew for missionId: {}", missionId, e) + emptyList() + } + } + + private fun fetchServices(controlUnits: List?): List { + return try { + getServiceByControlUnit.execute(controlUnits) + } catch (e: Exception) { + logger.error("Error fetching Nav services for controlUnits: {}", controlUnits, e) + emptyList() + } + } +} diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/v2/GetMission2.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/v2/GetMission2.kt new file mode 100644 index 000000000..490a9a280 --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/domain/use_cases/mission/v2/GetMission2.kt @@ -0,0 +1,25 @@ +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.env.MissionEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.MissionEntity2 +import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.v2.GetMissionAction + +@UseCase +class GetMission2( + private val getGeneralInfos2: GetGeneralInfo2, + private val getMissionAction: GetMissionAction, +) { + fun execute(mission: MissionEntity): MissionEntity2? { + if(mission.id == null) return null + val actions = getMissionAction.execute(missionId = mission.id) + val generalInfos = getGeneralInfos2.execute(missionId = mission.id, controlUnits = mission.controlUnits) + + return MissionEntity2( + id = mission.id, + envData = mission, + actions = actions, + generalInfos = generalInfos + ) + } +} diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/model/v2/Mission2.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/model/v2/Mission2.kt new file mode 100644 index 000000000..9526ec2f2 --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/model/v2/Mission2.kt @@ -0,0 +1,39 @@ +package fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.v2 + +import fr.gouv.dgampa.rapportnav.domain.entities.mission.CompletenessForStatsEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionStatusEnum +import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.MissionEntity2 +import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.v2.generalInfo.MissionGeneralInfo2 + +data class Mission2( + val id: Int, + val status: MissionStatusEnum, + val envData: MissionEnvData? = null, + var actions: List = listOf(), + val generalInfos: MissionGeneralInfo2? = null, + val isCompleteForStats: Boolean? = null, + val completenessForStats: CompletenessForStatsEntity? = null, +) { + + companion object { + fun fromMissionEntity(mission: MissionEntity2): Mission2 { + val completenessForStats = mission.isCompleteForStats() + val status = mission.calculateMissionStatus( + endDateTimeUtc = mission.envData.endDateTimeUtc, + startDateTimeUtc = mission.envData.startDateTimeUtc + ) + return Mission2( + id = mission.id, + status = status, + completenessForStats = completenessForStats, + envData = MissionEnvData.fromMissionEntity(mission.envData), + isCompleteForStats = completenessForStats.sources?.isEmpty(), + generalInfos = MissionGeneralInfo2.fromMissionGeneralInfoEntity( + envData = mission.envData, + generalInfo2 = mission.generalInfos + ), + actions = mission.actions.map { action -> MissionAction.fromMissionActionEntity(action) } + ) + } + } +} diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/model/v2/MissionEnvData.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/model/v2/MissionEnvData.kt new file mode 100644 index 000000000..76b5d1e25 --- /dev/null +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/model/v2/MissionEnvData.kt @@ -0,0 +1,51 @@ +package fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.v2 + +import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.MissionEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.MissionSourceEnum +import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.MissionTypeEnum +import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.controlResources.LegacyControlUnitEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.env.MissionEnvEntity +import org.locationtech.jts.geom.MultiPolygon +import java.time.Instant + +data class MissionEnvData( + val missionTypes: List, + var controlUnits: List = listOf(), + val openBy: String? = null, + val completedBy: String? = null, + val observationsCacem: String? = null, + val observationsCnsp: String? = null, + val facade: String? = null, + val geom: MultiPolygon? = null, + val startDateTimeUtc: Instant? = null, + val endDateTimeUtc: Instant? = null, + val missionSource: MissionSourceEnum, + val hasMissionOrder: Boolean, + val isUnderJdp: Boolean = false, + val isDeleted: Boolean = false, + val isGeometryComputedFromControls: Boolean = false, + val observationsByUnit: String? = null + ) { + + companion object { + fun fromMissionEntity(mission: MissionEntity): MissionEnvData { + return MissionEnvData( + missionTypes = mission.missionTypes, + controlUnits = mission.controlUnits, + openBy = mission.openBy, + completedBy = mission.completedBy, + observationsCacem = mission.observationsCacem, + observationsCnsp = mission.observationsCnsp, + facade = mission.facade, + geom = mission.geom, + startDateTimeUtc = mission.startDateTimeUtc, + endDateTimeUtc = mission.endDateTimeUtc, + missionSource = mission.missionSource, + hasMissionOrder = mission.hasMissionOrder, + isUnderJdp = mission.isUnderJdp, + observationsByUnit = mission.observationsByUnit, + isGeometryComputedFromControls = mission.isGeometryComputedFromControls, + ) + } + } +} diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/model/v2/generalInfo/MissionGeneralInfo2.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/model/v2/generalInfo/MissionGeneralInfo2.kt index 756c4a782..f09574ac7 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/model/v2/generalInfo/MissionGeneralInfo2.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/model/v2/generalInfo/MissionGeneralInfo2.kt @@ -1,15 +1,50 @@ package fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.v2.generalInfo +import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.MissionEntity import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.MissionTypeEnum +import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.ServiceEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.MissionGeneralInfoEntity2 import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.MissionReinforcementTypeEnum import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.MissionReportTypeEnum +import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.crew.MissionCrew import java.time.Instant data class MissionGeneralInfo2( + val id: Int? = null, val startDateTimeUtc: Instant, val endDateTimeUtc: Instant? = null, val missionReportType: MissionReportTypeEnum, val missionTypes: List, val reinforcementType: MissionReinforcementTypeEnum? = null, - val nbHourAtSea: Int? = null -) + val nbHourAtSea: Int? = null, + var distanceInNauticalMiles: Float? = null, + var consumedGOInLiters: Float? = null, + var consumedFuelInLiters: Float? = null, + var serviceId: Int? = null, + var nbrOfRecognizedVessel: Int? = null, + val crew: List? = null, + val services: List? = null +) { + companion object { + fun fromMissionGeneralInfoEntity( + envData: MissionEntity, + generalInfo2: MissionGeneralInfoEntity2? + ): MissionGeneralInfo2 { + return MissionGeneralInfo2( + id = generalInfo2?.data?.id, + startDateTimeUtc = envData.startDateTimeUtc, + endDateTimeUtc = envData.endDateTimeUtc, + missionTypes = envData.missionTypes, + missionReportType = MissionReportTypeEnum.FIELD_REPORT, + nbHourAtSea = 0, + distanceInNauticalMiles = generalInfo2?.data?.distanceInNauticalMiles, + consumedGOInLiters = generalInfo2?.data?.consumedGOInLiters, + consumedFuelInLiters = generalInfo2?.data?.consumedFuelInLiters, + serviceId = generalInfo2?.data?.serviceId, + nbrOfRecognizedVessel = generalInfo2?.data?.nbrOfRecognizedVessel, + services = generalInfo2?.services, + crew = generalInfo2?.crew?.map { MissionCrew.fromMissionCrewEntity(it) }, + ) + } + } +} diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/v2/MissionActionRestController.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/v2/MissionActionRestController.kt index d44340ecb..ef08874aa 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/v2/MissionActionRestController.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/v2/MissionActionRestController.kt @@ -14,6 +14,7 @@ import java.util.* @RestController @RequestMapping("/api/v2/missions/{missionId}/actions") class MissionActionRestController( + private val getMissionAction: GetMissionAction, private val deleteNavAction: DeleteNavAction, private val createNavAction: CreateNavAction, private val updateEnvAction: UpdateEnvAction, @@ -31,11 +32,7 @@ class MissionActionRestController( @GetMapping("") @Operation(summary = "Get the list of actions on a mission Id") fun getActions(@PathVariable(name = "missionId") missionId: Int): List { - val envActions = getEnvActionByMissionId.execute(missionId = missionId).orEmpty() - val navActions = getNavActionByMissionId.execute(missionId = missionId).orEmpty() - val fishActions = getFIshListActionByMissionId.execute(missionId = missionId).orEmpty() - return (envActions + navActions + fishActions) - .sortedByDescending { action -> action.startDateTimeUtc } + return getMissionAction.execute(missionId) .map { action -> MissionAction.fromMissionActionEntity(action) } } diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/v2/MissionRestController.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/v2/MissionRestController.kt index f4b15e217..1ff34f926 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/v2/MissionRestController.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/api/bff/v2/MissionRestController.kt @@ -1,13 +1,11 @@ package fr.gouv.dgampa.rapportnav.infrastructure.api.bff.v2 -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.CreateEnvMission -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.FakeMissionData -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.GetEnvMissions -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.GetMission +import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.* import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.v2.GetEnvMissionById2 +import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.GetMission2 import fr.gouv.dgampa.rapportnav.domain.use_cases.user.GetControlUnitsForUser import fr.gouv.dgampa.rapportnav.domain.use_cases.user.GetUserFromToken -import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.Mission +import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.v2.Mission2 import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.v2.MissionEnv import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.v2.generalInfo.MissionGeneralInfo2 import io.swagger.v3.oas.annotations.Operation @@ -19,13 +17,14 @@ import kotlin.collections.plus @RestController @RequestMapping("/api/v2/missions") class MissionRestController( + private val getMission2: GetMission2, private val createEnvMission: CreateEnvMission, private val getEnvMissionById2: GetEnvMissionById2, private val getControlUnitsForUser: GetControlUnitsForUser, private val getUserFromToken: GetUserFromToken, private val getEnvMissions: GetEnvMissions, private val getMission: GetMission, - private val fakeMissionData: FakeMissionData, + private val fakeMissionData2: FakeMissionData2 ) { private val logger = LoggerFactory.getLogger(MissionRestController::class.java) @@ -47,7 +46,7 @@ class MissionRestController( fun getMissions( @RequestParam startDateTimeUtc: Instant, @RequestParam(required = false) endDateTimeUtc: Instant? = null - ): List { + ): List? { try { // query MonitorEnv with the following filters val envMissions = getEnvMissions.execute( @@ -57,19 +56,14 @@ class MissionRestController( pageSize = null, controlUnits = getControlUnitsForUser.execute() ) + val missions = envMissions?.map { getMission2.execute(it) } - // reconstruct the Missions with full data in order to have the right status/completeness - val fullMissions = envMissions?.map { getMission.execute(it.id, it) } + //TODO: TO REMOVE FAKE DATA ASAP - // transform the data for the API - val missions = fullMissions?.mapNotNull { it?.let { Mission.fromMissionEntity(it) } } ?: emptyList() - - - // temporarily add fictive missions val user = getUserFromToken.execute() - val fakeMissions = fakeMissionData.getFakeMissionsforUser(user).map { Mission.fromMissionEntity(it) } + val fakeMissions = fakeMissionData2.getFakeMissionsforUser(user) - return missions + fakeMissions + return (missions?.filterNotNull()?.plus(fakeMissions))?.map { Mission2.fromMissionEntity((it)) } } catch (e: Exception) { logger.error("MissionRestController - failed to load missions from MonitorEnv", e) throw Exception(e) @@ -89,10 +83,11 @@ class MissionRestController( @GetMapping("{missionId}") fun getMissionById( @PathVariable(name = "missionId") missionId: Int - ): MissionEnv? { + ): Mission2? { try { - val mission = getEnvMissionById2.execute(missionId) ?: return null - return MissionEnv.fromMissionEntity(mission) + val envMission = getEnvMissionById2.execute(missionId) ?: return null + val mission = getMission2.execute(envMission)?: return null + return Mission2.fromMissionEntity(mission) } catch (e: Exception) { logger.error("Error while creating MonitorEnv mission : ", e) return null diff --git a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/cache/CaffeineConfiguration.kt b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/cache/CaffeineConfiguration.kt index 162825375..0b79bbaec 100644 --- a/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/cache/CaffeineConfiguration.kt +++ b/backend/src/main/kotlin/fr/gouv/dgampa/rapportnav/infrastructure/cache/CaffeineConfiguration.kt @@ -22,6 +22,7 @@ class CaffeineConfiguration { val envMissions = "envMissions" val envMission = "envMission" val fishActions = "fishActions" + val envMission2 = "envMission2" val envActionList = "envActionList" val fishActionList = "fishActionList" @@ -39,6 +40,7 @@ class CaffeineConfiguration { // short term caches for Missions and Actions + val envMissionCache2 = builCache(envMission2, ticker, TimeUnit.MINUTES, 5) val envActionListCache = builCache(envActionList, ticker, TimeUnit.MINUTES, 5) val fishActionListCache = builCache(fishActionList, ticker, TimeUnit.MINUTES, 5) @@ -54,6 +56,7 @@ class CaffeineConfiguration { envMissionsCache, envMissionCache, fishActionsCache, + envMissionCache2, envActionListCache, fishActionListCache ), diff --git a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/infrastructure/bff/controllers/MissionRestControllerTest.kt b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/infrastructure/bff/controllers/MissionRestControllerTest.kt index e228b07d4..5e9ace96f 100644 --- a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/infrastructure/bff/controllers/MissionRestControllerTest.kt +++ b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/infrastructure/bff/controllers/MissionRestControllerTest.kt @@ -1,19 +1,12 @@ package fr.gouv.gmampa.rapportnav.infrastructure.bff.controllers import fr.gouv.dgampa.rapportnav.RapportNavApplication -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.CreateEnvMission -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.FakeMissionData -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.GetEnvMissions -import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.GetMission +import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.* import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.v2.GetEnvMissionById2 +import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.GetMission2 import fr.gouv.dgampa.rapportnav.domain.use_cases.user.GetControlUnitsForUser import fr.gouv.dgampa.rapportnav.domain.use_cases.user.GetUserFromToken import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.v2.MissionRestController -import fr.gouv.gmampa.rapportnav.mocks.mission.EnvMissionMock -import fr.gouv.gmampa.rapportnav.mocks.mission.EnvMissionMockv2 -import fr.gouv.gmampa.rapportnav.mocks.mission.LegacyControlUnitEntityMock -import fr.gouv.gmampa.rapportnav.mocks.mission.MissionEntityMock -import fr.gouv.gmampa.rapportnav.mocks.mission.MissionGeneralInfo2Mock import fr.gouv.gmampa.rapportnav.mocks.user.UserMock import org.junit.jupiter.api.Test import org.mockito.ArgumentMatchers.any @@ -31,6 +24,7 @@ import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post import fr.gouv.dgampa.rapportnav.infrastructure.utils.GsonSerializer +import fr.gouv.gmampa.rapportnav.mocks.mission.* import org.springframework.test.web.servlet.result.MockMvcResultMatchers.content import java.time.Instant @@ -55,7 +49,7 @@ class MissionRestControllerTest { private lateinit var getUserFromToken: GetUserFromToken @MockitoBean - private lateinit var fakeMissionData: FakeMissionData + private lateinit var fakeMissionData2: FakeMissionData2 @MockitoBean private lateinit var createEnvMission: CreateEnvMission @@ -63,6 +57,9 @@ class MissionRestControllerTest { @MockitoBean private lateinit var getEnvMissionById2: GetEnvMissionById2 + @MockitoBean + private lateinit var getMission2: GetMission2 + @Test fun `should return a list of missions`() { // Arrange @@ -70,16 +67,16 @@ class MissionRestControllerTest { EnvMissionMock.create(id = 1), EnvMissionMock.create(id = 2), ) - val mockMissionEntity = MissionEntityMock.create(id = 1) + val mockMissionEntity = MissionEntityMock2.create(id = 1) val mockUser = UserMock.create() `when`(getControlUnitsForUser.execute()).thenReturn(listOf(1)) `when`(getEnvMissions.execute(any(), any(), anyOrNull(), anyOrNull(), any())).thenReturn(mockEnvMissions) - `when`(getMission.execute(any(), any())).thenReturn(mockMissionEntity) + `when`(getMission2.execute(anyOrNull())).thenReturn(mockMissionEntity) `when`(getUserFromToken.execute()).thenReturn(mockUser) - `when`(fakeMissionData.getFakeMissionsforUser(mockUser)).thenReturn(emptyList()) + `when`(fakeMissionData2.getFakeMissionsforUser(mockUser)).thenReturn(emptyList()) // Act & Assert mockMvc.perform( @@ -95,7 +92,9 @@ class MissionRestControllerTest { // Arrange val missionId = 1 val mockMission = EnvMissionMock.create(id = missionId) + val mockMissionEntity = MissionEntityMock2.create(id = 1) `when`(getEnvMissionById2.execute(missionId)).thenReturn(mockMission) + `when`(getMission2.execute(anyOrNull())).thenReturn(mockMissionEntity) // Act & Assert mockMvc.perform(get("/api/v2/missions/{missionId}", missionId)) diff --git a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/infrastructure/cache/CaffeineConfigurationTest.kt b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/infrastructure/cache/CaffeineConfigurationTest.kt index 3b4d9e7e4..c42daf72b 100644 --- a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/infrastructure/cache/CaffeineConfigurationTest.kt +++ b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/infrastructure/cache/CaffeineConfigurationTest.kt @@ -27,7 +27,8 @@ class CaffeineConfigurationTest { caffeineConfiguration.envMission, caffeineConfiguration.fishActions, caffeineConfiguration.envActionList, - caffeineConfiguration.fishActionList + caffeineConfiguration.fishActionList, + caffeineConfiguration.envMission2 ) cacheNames.forEach { cacheName -> @@ -38,7 +39,7 @@ class CaffeineConfigurationTest { } assertThat(cacheManager.cacheNames.toSet()) - .hasSize(7) + .hasSize(8) .isEqualTo(cacheNames.toSet()) } diff --git a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/mocks/mission/MissionEntityMock2.kt b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/mocks/mission/MissionEntityMock2.kt new file mode 100644 index 000000000..849ee5f22 --- /dev/null +++ b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/mocks/mission/MissionEntityMock2.kt @@ -0,0 +1,58 @@ +package fr.gouv.gmampa.rapportnav.mocks.mission + +import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.MissionEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.MissionSourceEnum +import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.MissionTypeEnum +import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.controlResources.LegacyControlUnitEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.MissionActionEntity +import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.MissionEntity2 +import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.MissionGeneralInfoEntity2 +import org.locationtech.jts.geom.MultiPolygon +import java.time.Instant + +object MissionEntityMock2 { + fun create( + id: Int = 1, + missionTypes: List = listOf(), + controlUnits: List = listOf(), + openBy: String? = null, + completedBy: String? = null, + observationsCacem: String? = null, + observationsCnsp: String? = null, + facade: String? = null, + geom: MultiPolygon? = null, + startDateTimeUtc: Instant = Instant.parse("2022-01-02T12:00:00Z"), + endDateTimeUtc: Instant? = null, + isDeleted: Boolean = false, + isGeometryComputedFromControls: Boolean = false, + missionSource: MissionSourceEnum = MissionSourceEnum.MONITORENV, + hasMissionOrder: Boolean = false, + isUnderJdp: Boolean = false, + actions: List = listOf(), + generalInfos: MissionGeneralInfoEntity2? = null, + ): MissionEntity2 { + return MissionEntity2( + id = id, + envData = MissionEntity( + missionTypes = missionTypes, + controlUnits = controlUnits, + openBy = openBy, + completedBy = completedBy, + observationsCacem = observationsCacem, + observationsCnsp = observationsCnsp, + facade = facade, + geom = geom, + startDateTimeUtc = startDateTimeUtc, + endDateTimeUtc = endDateTimeUtc, + isDeleted = isDeleted, + isGeometryComputedFromControls = isGeometryComputedFromControls, + missionSource = missionSource, + hasMissionOrder = hasMissionOrder, + isUnderJdp = isUnderJdp + ), + actions = actions, + generalInfos = generalInfos + ) + } + +} diff --git a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/mocks/mission/MissionGeneralInfo2Mock.kt b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/mocks/mission/MissionGeneralInfo2Mock.kt index 4761f559e..cef39bdc5 100644 --- a/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/mocks/mission/MissionGeneralInfo2Mock.kt +++ b/backend/src/test/kotlin/fr/gouv/gmampa/rapportnav/mocks/mission/MissionGeneralInfo2Mock.kt @@ -16,12 +16,12 @@ object MissionGeneralInfo2Mock { nbHourAtSea: Int? = null ): MissionGeneralInfo2 { return MissionGeneralInfo2( - startDateTimeUtc, - endDateTimeUtc, - missionReportType, - missionTypes, - reinforcementType, - nbHourAtSea + startDateTimeUtc = startDateTimeUtc, + endDateTimeUtc = endDateTimeUtc, + missionReportType = missionReportType, + missionTypes = missionTypes, + reinforcementType = reinforcementType, + nbHourAtSea = nbHourAtSea ) } } diff --git a/frontend/src/v2/features/ulam/components/element/mission-create-dialog.tsx b/frontend/src/v2/features/ulam/components/element/mission-create-dialog.tsx index f2999871b..cf1fc5efc 100644 --- a/frontend/src/v2/features/ulam/components/element/mission-create-dialog.tsx +++ b/frontend/src/v2/features/ulam/components/element/mission-create-dialog.tsx @@ -1,6 +1,6 @@ import React, { FC, useEffect, useState } from 'react' -import { Dialog, THEME } from '@mtes-mct/monitor-ui' -import { Stack } from 'rsuite' +import { Accent, Dialog, Icon, IconButton, Size, THEME } from '@mtes-mct/monitor-ui' +import { FlexboxGrid, Stack } from 'rsuite' import { MissionTypeEnum } from '@common/types/env-mission-types.ts' import MissionGeneralInformationUlamFormNew from './mission-general-information-ulam-form-new.tsx' @@ -27,13 +27,26 @@ const MissionCreateDialog: FC = ({isOpen, onClose}) => return ( isDialogOpen && ( - Création d'un rapport de mission - - - - + + + Création d'un rapport de mission + + + + + + + ) diff --git a/frontend/src/v2/features/ulam/components/element/mission-general-information-initial-form.tsx b/frontend/src/v2/features/ulam/components/element/mission-general-information-initial-form.tsx index 3d3e6d7a5..2377ad2f2 100644 --- a/frontend/src/v2/features/ulam/components/element/mission-general-information-initial-form.tsx +++ b/frontend/src/v2/features/ulam/components/element/mission-general-information-initial-form.tsx @@ -4,10 +4,10 @@ import { FormikDateRangePicker, FormikMultiCheckbox, FormikNumberInput, - FormikSelect + FormikSelect, Icon, IconButton, Size, THEME } from '@mtes-mct/monitor-ui' import { FieldProps, Formik } from 'formik' -import { FC } from 'react' +import React, { FC } from 'react' import { FlexboxGrid, Stack } from 'rsuite' import { useMissionGeneralInformationsForm } from '../../../common/hooks/use-mission-general-informations-form.tsx' import { useMissionType } from '../../../common/hooks/use-mission-type.tsx' @@ -63,7 +63,11 @@ const MissionGeneralInformationInitialForm: FC - + {!isCreation && (