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

Mission General Information ULAM #529

Merged
merged 36 commits into from
Feb 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
4c27f5f
feat(user): api get user infos
xtiannyeto Feb 7, 2025
e51de9d
feat(user): front user infos
xtiannyeto Feb 7, 2025
04fd1d2
feat(userInfos): Page title
xtiannyeto Feb 7, 2025
ad9797c
Merge branch 'main' into feature/user-informations-display
xtiannyeto Feb 13, 2025
f5ce9bf
set MissionCrew#role as nullable and add rest controllers for crew
aleckvincent Feb 3, 2025
36140ec
improve add and delete crew for ulam
aleckvincent Feb 4, 2025
c813ed9
combine initial and extended form (missionGeneralInfo)
aleckvincent Feb 6, 2025
1f260cb
impprove creteUpdate mission
aleckvincent Feb 6, 2025
5d9e5cb
add patchObservationByUnit
aleckvincent Feb 6, 2025
449c1b2
improve GeneralInfo ui
aleckvincent Feb 6, 2025
38009bb
fix issue with agent can't be selected in FormikMultiSelect
aleckvincent Feb 6, 2025
fc3b7f8
add hook for handleSubmit
aleckvincent Feb 6, 2025
e1882b9
improve check role crew
aleckvincent Feb 6, 2025
520daf3
add missings fields in entity and model GeneralInfo
aleckvincent Feb 6, 2025
628714a
refactoring MissionGeneralInfoForm
aleckvincent Feb 6, 2025
b5c85dd
add missing fields
aleckvincent Feb 6, 2025
6b3c497
add missionId in test
aleckvincent Feb 6, 2025
601a498
fix(mission-general): update form handling
xtiannyeto Feb 9, 2025
6f05b02
fix(general-infos): enableReinitialize set true
xtiannyeto Feb 10, 2025
a21bebb
add administration fetching from env
aleckvincent Feb 11, 2025
b3d7baa
add InterMinisterialService model
aleckvincent Feb 11, 2025
24ebcc3
add MissionGeneralInfoRestController
aleckvincent Feb 11, 2025
b681523
feat(front): general information resources, service
xtiannyeto Feb 11, 2025
825c68e
add administrations service fetching
aleckvincent Feb 12, 2025
cbe478f
add mutation update generalinfo
aleckvincent Feb 12, 2025
6af4163
add patch env mission for ulam
aleckvincent Feb 12, 2025
836ffac
remove useless methods
aleckvincent Feb 12, 2025
08f231a
remove useless update mission
aleckvincent Feb 12, 2025
e5e39e6
remove console.log
aleckvincent Feb 12, 2025
67c5763
add Get annotation
aleckvincent Feb 12, 2025
2e86917
fix tests issues
aleckvincent Feb 13, 2025
a32fca9
add updateMission (for missionTypes)
aleckvincent Feb 13, 2025
3299bcf
add mock
aleckvincent Feb 13, 2025
15007d2
Release 2.5.4
aleckvincent Feb 13, 2025
6926fbe
add package lock
aleckvincent Feb 13, 2025
85f7a5d
fix issue on test
aleckvincent Feb 13, 2025
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
2 changes: 1 addition & 1 deletion .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ variables:
value: "postgres:15.10-alpine"
description: "Image de la base de données"
PROJECT_VERSION:
value: "2.5.3"
value: "2.5.4"
description: "Version du projet à déployer"
SERVER_ENV_INT:
value: "int-rapportnav-appli01"
Expand Down
2 changes: 1 addition & 1 deletion backend/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import java.lang.System.getenv

group = "fr.gouv.dgampa"
version = "2.5.3"
version = "2.5.4"
description = "RapportNav"

val kotlinVersion by extra("1.9.24")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ enum class MissionSourceEnum {
POSEIDON_CACEM,
POSEIDON_CNSP,
RAPPORTNAV,
RAPPORT_NAV
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,19 @@
package fr.gouv.dgampa.rapportnav.domain.entities.mission.env.controlResources

import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.v2.env.ControlUnitResourceEnv

data class ControlResourceEntity(
val id: Int,
val name: String,
)
) {
companion object {
fun fromControlUnitResourceEnv(
resourceEnv: ControlUnitResourceEnv
): ControlResourceEntity {
return ControlResourceEntity(
id = resourceEnv.id,
name = resourceEnv.name
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package fr.gouv.dgampa.rapportnav.domain.entities.mission.env.controlResources

class ControlUnitResourceEntity {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package fr.gouv.dgampa.rapportnav.domain.entities.mission.env.controlResources

enum class ControlUnitResourceType(val label: String) {
AIRPLANE("Avion"),
BARGE("Barge"),
CAR("Voiture"),
DRONE("Drône"),
EQUESTRIAN("Équestre"),
FAST_BOAT("Vedette"),
FRIGATE("Frégate"),
HELICOPTER("Hélicoptère"),
HYDROGRAPHIC_SHIP("Bâtiment hydrographique"),
KAYAK("Kayak"),
LIGHT_FAST_BOAT("Vedette légère"),
MINE_DIVER("Plongeur démineur"),
MOTORCYCLE("Moto"),
NET_LIFTER("Remonte-filets"),
NO_RESOURCE("Aucun moyen"),
OTHER("Autre"),
PATROL_BOAT("Patrouilleur"),
PEDESTRIAN("Piéton"),
PIROGUE("Pirogue"),
RIGID_HULL("Coque rigide"),
SEA_SCOOTER("Scooter de mer"),
SEMI_RIGID("Semi-rigide"),
SUPPORT_SHIP("Bâtiment de soutien"),
TRAINING_SHIP("Bâtiment-école"),
TUGBOAT("Remorqueur"),
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ data class MissionCrewEntity(
val id: Int? = null,
val agent: AgentEntity,
val comment: String? = null,
val role: AgentRoleEntity,
val role: AgentRoleEntity?,
val missionId: Int,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.generalInfo

data class InterMinisterialServiceEntity(
var id: Int? = null,
var administrationId: Int,
var controlUnitId: Int,
var missionGeneralInfo: MissionGeneralInfoEntity? = null
) {
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.generalInfo

import fr.gouv.dgampa.rapportnav.config.MandatoryForStats
import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.controlResources.ControlResourceEntity
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.generalInfo.MissionGeneralInfo

data class MissionGeneralInfoEntity(
var id: Int,
Expand All @@ -11,4 +15,24 @@ data class MissionGeneralInfoEntity(
var serviceId: Int? = null,
@MandatoryForStats
var nbrOfRecognizedVessel: Int? = null,
)
var isWithInterMinisterialService: Boolean? = false,
var isAllAgentsParticipating: Boolean? = false,
var isMissionArmed: Boolean? = false,
var resources: List<ControlResourceEntity>? = null,
var nbHourAtSea: Int? = null,
var missionReportType: MissionReportTypeEnum? = null,
var reinforcementType: MissionReinforcementTypeEnum? = null,
var interMinisterialServices: List<InterMinisterialServiceEntity>? = listOf()
) {
fun toMissionGeneralInfo(): MissionGeneralInfo {
return MissionGeneralInfo(
id = id,
missionId = missionId,
distanceInNauticalMiles = distanceInNauticalMiles,
consumedGOInLiters = consumedGOInLiters,
consumedFuelInLiters = consumedFuelInLiters,
serviceId = serviceId,
nbrOfRecognizedVessel = nbrOfRecognizedVessel
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.env

data class AdministrationEntity(
val id: Int? = null,
val isArchived: Boolean,
val name: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package fr.gouv.dgampa.rapportnav.domain.repositories.v2

import fr.gouv.dgampa.rapportnav.infrastructure.monitorenv.v2.outputs.FullAdministrationDataOutput

interface IEnvAdministrationRepository {

fun findById(administrationId: Int): FullAdministrationDataOutput?

fun findAll(): List<FullAdministrationDataOutput>?
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package fr.gouv.dgampa.rapportnav.domain.repositories.v2

import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.generalInfo.InterMinisterialServiceEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.generalInfo.MissionGeneralInfoEntity
import fr.gouv.dgampa.rapportnav.infrastructure.database.model.mission.generalInfo.InterMinisterialServiceModel

interface IInterMinisterialServiceRepository {

fun save(service: InterMinisterialServiceEntity, generalInfo: MissionGeneralInfoEntity): InterMinisterialServiceModel
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package fr.gouv.dgampa.rapportnav.domain.repositories.v2.controlUnitResource

import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.v2.env.ControlUnitResourceEnv

interface IEnvControlUnitResourceRepository {

fun findAll(): List<ControlUnitResourceEnv>?
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.v2.generalInfo.Mis
import org.slf4j.LoggerFactory

@UseCase
class CreateEnvMission(
class CreateOrUpdateEnvMission(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pourquoi CreateOrUPdate?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On crée chez Env et on Update (missionTypes cf: mon msg dans mattermost)

private val monitorEnvRepo: IEnvMissionRepository,
private val monitorEnvControlUnitRepo: IEnvControlUnitRepository
private val monitorEnvControlUnitRepo: IEnvControlUnitRepository,
) {
private val logger = LoggerFactory.getLogger(CreateEnvMission::class.java)
private val logger = LoggerFactory.getLogger(CreateOrUpdateEnvMission::class.java)

fun execute(missionGeneralInfo: MissionGeneralInfo2, controlUnitIds: List<Int>?): MissionEnvEntity? {
try {
Expand All @@ -30,12 +30,13 @@ class CreateEnvMission(
}

if (matchedControlUnits.isEmpty()) {
throw Exception("CreateEnvMission : controlUnits is empty for this user")
throw Exception("CreateOrUpdateEnvMission : controlUnits is empty for this user")
}

val missionEnv = MissionEnv(
id = missionGeneralInfo.missionId,
missionTypes = missionGeneralInfo.missionTypes,
missionSource = MissionSourceEnum.MONITORENV,
missionSource = MissionSourceEnum.RAPPORT_NAV,
startDateTimeUtc = missionGeneralInfo.startDateTimeUtc,
endDateTimeUtc = missionGeneralInfo.endDateTimeUtc,
controlUnits = matchedControlUnits,
Expand All @@ -47,7 +48,7 @@ class CreateEnvMission(
return monitorEnvRepo.createMission(missionEnv)

} catch (e: Exception) {
logger.error("CreateEnvMission failed creating missions", e)
logger.error("CreateOrUpdateEnvMission failed creating missions", e)
return null
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,19 @@ package fr.gouv.dgampa.rapportnav.domain.use_cases.mission.crew

import fr.gouv.dgampa.rapportnav.config.UseCase
import fr.gouv.dgampa.rapportnav.domain.repositories.mission.crew.IMissionCrewRepository
import org.slf4j.LoggerFactory

@UseCase
data class DeleteMissionCrew(private val crewRepository: IMissionCrewRepository) {

private val logger = LoggerFactory.getLogger(DeleteMissionCrew::class.java)

fun execute(id: Int): Boolean {

return try {
crewRepository.deleteById(id = id)
} catch (e: NoSuchElementException) {
// TODO add log
logger.error("DeleteMissionCrew : ${e.message}")
return false
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,6 @@ class GetAgentsCrewByMissionId(private val agentCrewRepository: IMissionCrewRepo

return agentCrewRepository.findByMissionId(missionId = missionId)
.map { it.toMissionCrewEntity(commentDefaultsToString) }
.sortedBy { rolePriority.indexOf(it.role.title) }
.sortedBy { rolePriority.indexOf(it.role?.title) }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ class ExportMissionRapportPatrouille(
listOf("Fonction", "Nom", "Observation (formation, repos, mission, stage...)")
) + agentsCrew.map {
listOf(
it.role.title,
it.role?.title,
"${it.agent.firstName} ${it.agent.lastName}",
it.comment.takeIf { comment -> !comment.isNullOrEmpty() } ?: "Présent"
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ class ExportMissionPatrolSingle(
listOf("Fonction", "Nom", "Observation (formation, repos, mission, stage...)")
) + agentsCrew.map {
listOf(
it.role.title,
it.role?.title,
"${it.agent.firstName} ${it.agent.lastName}",
it.comment.takeIf { comment -> !comment.isNullOrEmpty() } ?: "Présent"
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
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.nav.generalInfo.InterMinisterialServiceEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.generalInfo.MissionGeneralInfoEntity
import fr.gouv.dgampa.rapportnav.domain.repositories.v2.IInterMinisterialServiceRepository

@UseCase
class AddOrUpdateInterMinisterialService(
private val repository: IInterMinisterialServiceRepository
) {

fun execute(generalInfoEntity: MissionGeneralInfoEntity): List<InterMinisterialServiceEntity> {
val interMinisterialServices = mutableListOf<InterMinisterialServiceEntity>()
generalInfoEntity.interMinisterialServices?.forEach { serviceEntity: InterMinisterialServiceEntity ->
val result = repository.save(serviceEntity, generalInfoEntity)
interMinisterialServices.add(result.toInterMinisterialServiceEntity())
}

return interMinisterialServices
}
}
Original file line number Diff line number Diff line change
@@ -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.nav.generalInfo.InterMinisterialServiceEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.v2.MissionGeneralInfoEntity2
import fr.gouv.dgampa.rapportnav.domain.repositories.mission.generalInfo.IMissionGeneralInfoRepository
import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.CreateOrUpdateEnvMission
import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.PatchEnvMission
import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.crew.AddOrUpdateMissionCrew
import fr.gouv.dgampa.rapportnav.domain.use_cases.user.GetControlUnitsForUser
import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.adapters.MissionEnvInput
import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.v2.generalInfo.MissionGeneralInfo2

@UseCase
class CreateOrUpdateGeneralInfo(
private val repository: IMissionGeneralInfoRepository,
private val addOrUpdateInterMinisterialService: AddOrUpdateInterMinisterialService,
private val addOrUpdateMissionCrew: AddOrUpdateMissionCrew,
private val patchEnvMission: PatchEnvMission,
private val createOrUpdateEnvMission: CreateOrUpdateEnvMission,
private val getControlUnitsForUser: GetControlUnitsForUser
) {

fun execute(generalInfo2: MissionGeneralInfo2): MissionGeneralInfoEntity2 {

val entity = generalInfo2.toMissionGeneralInfoEntity()
val generalInfoModel = repository.save(entity)
var interMinisterialServices = listOf<InterMinisterialServiceEntity>()

if (entity.interMinisterialServices?.isNotEmpty() == true) {
interMinisterialServices = addOrUpdateInterMinisterialService.execute(entity)
}

generalInfo2.crew?.forEach { crew ->
addOrUpdateMissionCrew.addOrUpdateMissionCrew(crew.toMissionCrewEntity())
}

patchEnvMission.execute(MissionEnvInput(
startDateTimeUtc = generalInfo2.startDateTimeUtc,
endDateTimeUtc = generalInfo2.endDateTimeUtc,
missionId = generalInfo2.missionId,
observationsByUnit = generalInfo2.observations
))

val controlUnits = getControlUnitsForUser.execute()

createOrUpdateEnvMission.execute(generalInfo2, controlUnits) // TODO: to be replaced by patchEnvMission (for missionTypes)

val generalInfoEntity = generalInfoModel.toMissionGeneralInfoEntity(interMinisterialServices)

return MissionGeneralInfoEntity2(
data = generalInfoEntity
)

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.administrations

import fr.gouv.dgampa.rapportnav.config.UseCase
import fr.gouv.dgampa.rapportnav.domain.repositories.v2.IEnvAdministrationRepository
import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.v2.env.FullAdministration
import org.slf4j.LoggerFactory

@UseCase
class GetAdministrationById(private val administrationRepository: IEnvAdministrationRepository) {
aleckvincent marked this conversation as resolved.
Show resolved Hide resolved

private val logger = LoggerFactory.getLogger(GetAdministrationById::class.java)

fun execute(administrationId: Int): FullAdministration? {
val dataOutput = administrationRepository.findById(administrationId)

if (dataOutput !== null) {
return FullAdministration.fromFullAdministrationDataOutput(dataOutput)
}

logger.info("Administration by id : $administrationId return empty result")

return null
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package fr.gouv.dgampa.rapportnav.domain.use_cases.mission.v2.administrations

import fr.gouv.dgampa.rapportnav.config.UseCase
import fr.gouv.dgampa.rapportnav.domain.repositories.v2.IEnvAdministrationRepository
import fr.gouv.dgampa.rapportnav.infrastructure.api.bff.model.v2.env.FullAdministration
import org.slf4j.LoggerFactory

@UseCase
class GetAdministrations(private val administrationRepository: IEnvAdministrationRepository) {

private val logger = LoggerFactory.getLogger(GetAdministrations::class.java)

fun execute(): List<FullAdministration>? {
val dataOutputs = administrationRepository.findAll()
logger.info("Found ${dataOutputs?.size} administrations from env.")

return dataOutputs?.map { FullAdministration.fromFullAdministrationDataOutput(it) }
}
}
Loading
Loading