Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

503 fix mission v2 back / front #507

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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<MissionActionEntity>,
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<MissionSourceEnum>()
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()
)
}


}

Original file line number Diff line number Diff line change
@@ -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<MissionCrewEntity>? = null,
val services: List<ServiceEntity>? = 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
}
}
Original file line number Diff line number Diff line change
@@ -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<MissionEnvActionEntity> {
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<MissionEntity2> {
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()
}
}
}
}
Original file line number Diff line number Diff line change
@@ -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
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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? {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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? {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
Original file line number Diff line number Diff line change
@@ -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<MissionActionEntity> {
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 }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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? {
Expand Down
Loading
Loading