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

Rapport de patrouille #92

Merged
merged 19 commits into from
Mar 12, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Export mission - formatted text for timeline
  • Loading branch information
lwih committed Mar 12, 2024
commit d2b5cf19a9a2de9080b23eec84b4926ded6589d6
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,13 @@ fun mapStringToActionStatusType(value: String): ActionStatusType {
else -> ActionStatusType.UNKNOWN
}
}

fun mapActionStatusTypeToHumanString(value: ActionStatusType): String {
return when (value) {
ActionStatusType.NAVIGATING -> "Navigation"
ActionStatusType.ANCHORED -> "Mouillage"
ActionStatusType.DOCKED -> "Présence à quai"
ActionStatusType.UNAVAILABLE -> "Indisponibilité"
else -> "Inconnu"
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package fr.gouv.dgampa.rapportnav.domain.use_cases.mission
package fr.gouv.dgampa.rapportnav.domain.use_cases.mission.export

import fr.gouv.dgampa.rapportnav.config.UseCase
import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionActionEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.envActions.EnvActionControlEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.fish.fishActions.MissionAction
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.action.ActionFreeNoteEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.action.ActionStatusEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.action.ActionType
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.action.NavActionEntity
Expand All @@ -17,6 +16,7 @@ import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.status.ActionStatus
import fr.gouv.dgampa.rapportnav.domain.repositories.mission.ExportParams
import fr.gouv.dgampa.rapportnav.domain.repositories.mission.IRpnExportRepository
import fr.gouv.dgampa.rapportnav.domain.repositories.mission.action.INavActionStatusRepository
import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.GetMissionById
import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.action.GroupActionByDate
import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.crew.GetAgentsCrewByMissionId
import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.generalInfo.GetMissionGeneralInfoByMissionId
Expand All @@ -32,6 +32,7 @@ class ExportMission(
private val navActionStatus: INavActionStatusRepository,
private val getStatusDurations: GetStatusDurations,
private val groupActionByDate: GroupActionByDate,
private val formatActionToString: FormatActionToString,
) {

private inline fun List<GetStatusDurations.ActionStatusWithDuration>.findDuration(predicate: (GetStatusDurations.ActionStatusWithDuration) -> Boolean): Int {
Expand Down Expand Up @@ -78,35 +79,6 @@ class ExportMission(
}


fun formatEnvControlForTimeline(action: EnvActionControlEntity): String {
// Code to format EnvActionControlEntity
return "EnvControlForTimeline"
}

fun formatFishControlForTimeline(action: MissionAction): String {
// Code to format MissionActionEntity (Fish)
return "FishControlForTimeline"
}

fun formatNavNoteForTimeline(action: ActionFreeNoteEntity?): String? {
return action?.let {
val startTime = action.startDateTimeUtc.toLocalTime().toString().padStart(5, '0')
val observation = action.observations ?: ""
return "$startTime - $observation"
}
}


fun formatNavStatusForTimeline(action: NavActionEntity): String {
// Code to format NavActionEntity with ActionType.STATUS
return "NavStatusForTimeline"
}

fun formatNavControlForTimeline(action: NavActionEntity): String {
// Code to format NavActionEntity with ActionType.CONTROL
return "NavControlForTimeline"
}

fun formatActionsForTimeline(actions: List<MissionActionEntity>?): Map<LocalDate, List<String>>? {

if (actions.isNullOrEmpty()) {
Expand All @@ -121,29 +93,28 @@ class ExportMission(
when (action) {
is MissionActionEntity.EnvAction -> {
if (action.envAction?.controlAction?.action is EnvActionControlEntity) {
formatEnvControlForTimeline(action.envAction.controlAction.action)
formatActionToString.formatEnvControl(action.envAction.controlAction.action)
} else null
}

is MissionActionEntity.FishAction -> {
if (action.fishAction.controlAction?.action is MissionAction) {
formatFishControlForTimeline(action.fishAction.controlAction.action)
formatActionToString.formatFishControl(action.fishAction.controlAction.action)
} else null
}

is MissionActionEntity.NavAction -> {
val navAction: NavActionEntity = action.navAction
when (navAction.actionType) {
ActionType.NOTE -> formatNavNoteForTimeline(navAction.freeNoteAction)
ActionType.STATUS -> formatNavStatusForTimeline(navAction)
ActionType.CONTROL -> formatNavControlForTimeline(navAction)
ActionType.NOTE -> formatActionToString.formatNavNote(navAction.freeNoteAction)
ActionType.STATUS -> formatActionToString.formatNavStatus(navAction.statusAction)
ActionType.CONTROL -> formatActionToString.formatNavControl(navAction.controlAction)
else -> null
}
}
}
}
}

return formattedActions
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package fr.gouv.dgampa.rapportnav.domain.use_cases.mission.export

import fr.gouv.dgampa.rapportnav.config.UseCase
import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.envActions.EnvActionControlEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.fish.fishActions.MissionAction
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.action.ActionControlEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.action.ActionFreeNoteEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.action.ActionStatusEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.status.mapActionStatusTypeToHumanString
import java.time.ZonedDateTime

@UseCase
class FormatActionToString() {

fun formatTime(dateTime: ZonedDateTime?): String? {
return dateTime?.let { it.toLocalTime().toString().padStart(5, '0') } ?: "N/A"
}


fun formatEnvControl(action: EnvActionControlEntity?): String? {
return action?.let {
val startTime = formatTime(action.actionStartDateTimeUtc)
val endTime = formatTime(action.actionEndDateTimeUtc)
val facade = action.facade?.let { " - $it" } ?: ""
val themes = action.themes?.let { " - ${it.map { theme -> theme.theme }.joinToString(" + ")}" } ?: ""
val amountOfControls = action.actionNumberOfControls?.let { " - $it contrôles" } ?: ""
return "$startTime / $endTime - Contrôle Environnement$facade$themes$amountOfControls"
}
}

fun formatFishControl(action: MissionAction): String {
// Code to format MissionActionEntity (Fish)
return "FishControl"
}

fun formatNavNote(action: ActionFreeNoteEntity?): String? {
return action?.let {
val startTime = formatTime(action.startDateTimeUtc)
val observation = action.observations ?: ""
return "$startTime - $observation"
}
}


fun formatNavStatus(action: ActionStatusEntity?): String? {
return action?.let {
val startTime = formatTime(action.startDateTimeUtc)
val status = mapActionStatusTypeToHumanString(action.status)
val observation = action.observations?.let { "- $it" } ?: ""
return "$startTime - $status - début $observation"
}
}

fun formatNavControl(action: ActionControlEntity?): String? {
return action?.let {
val startTime = formatTime(action.startDateTimeUtc)
val endTime = formatTime(action.endDateTimeUtc)
val vesselIdentifier = action.vesselIdentifier?.let { "- $it" } ?: ""
return "$startTime / $endTime - Contrôle administratif $vesselIdentifier"
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package fr.gouv.dgampa.rapportnav.infrastructure.bff
import fr.gouv.dgampa.rapportnav.domain.entities.mission.MissionActionEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.export.MissionExportEntity
import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.*
import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.export.ExportMission
import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.generalInfo.AddOrUpdateMissionGeneralInfo
import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.generalInfo.GetMissionGeneralInfoByMissionId
import fr.gouv.dgampa.rapportnav.domain.use_cases.user.GetControlUnitsForUser
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package fr.gouv.gmampa.rapportnav.domain.use_cases.mission

import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.export.ExportMission
import org.springframework.boot.test.context.SpringBootTest

@SpringBootTest(classes = [ExportMission::class])
class ExportMissionTest {

// @Autowired
// private lateinit var exportMission: ExportMission

// @MockBean
// private lateinit var rpnExportRepository: IRpnExportRepository

// @Test
// fun `formatNavNoteForTimeline should return formatted string`() {
//// given(this.rpnExportRepository.exportOdt(missionId = 1)).willReturn(emptyList<Any>())
// val action: ActionFreeNoteEntity = NavActionFreeNoteMock.create()
// assertThat(formatNavNoteForTimeline(action)).isEqualTo("12:06 - Largué, appareillé")
// }
//
// @Test
// fun `formatNavNoteForTimeline should return null if freeNoteAction is null`() {
// val action = null
// assertThat(formatNavNoteForTimeline(action)).isEqualTo("null")
// }


}
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class GroupActionByDateTest {
)

val action3 = MissionActionEntity.NavAction(
NavActionStatusMock.create()
NavActionStatusMock.createActionStatusEntity().toNavAction()
)

val actions = listOf(action1, action2, action3)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
package fr.gouv.gmampa.rapportnav.domain.use_cases.mission.export

import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.envActions.EnvActionControlEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.envActions.ThemeEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.action.ActionControlEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.action.ActionFreeNoteEntity
import fr.gouv.dgampa.rapportnav.domain.entities.mission.nav.action.ActionStatusEntity
import fr.gouv.dgampa.rapportnav.domain.use_cases.mission.export.FormatActionToString
import fr.gouv.gmampa.rapportnav.mocks.mission.action.EnvActionControlMock
import fr.gouv.gmampa.rapportnav.mocks.mission.action.NavActionControlMock
import fr.gouv.gmampa.rapportnav.mocks.mission.action.NavActionFreeNoteMock
import fr.gouv.gmampa.rapportnav.mocks.mission.action.NavActionStatusMock
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import java.time.LocalDateTime
import java.time.ZoneOffset
import java.time.ZonedDateTime

@SpringBootTest(classes = [FormatActionToString::class])
class FormatActionToStringTests {

@Autowired
private lateinit var formatActionToString: FormatActionToString

@Test
fun `formatTime should return formatted time`() {
assertThat(
formatActionToString.formatTime(
ZonedDateTime.of(
LocalDateTime.of(2022, 1, 2, 12, 0),
ZoneOffset.UTC
)
)
).isEqualTo("12:00")
}

@Test
fun `formatTime should return NA when null`() {
assertThat(formatActionToString.formatTime(null)).isEqualTo("N/A")
}

@Test
fun `formatEnvControl should return basic formatted string`() {
val action: EnvActionControlEntity = EnvActionControlMock.create()
assertThat(formatActionToString.formatEnvControl(action)).isEqualTo("12:00 / 14:00 - Contrôle Environnement")
}

@Test
fun `formatEnvControl should return formatted string with facade`() {
val action: EnvActionControlEntity = EnvActionControlMock.create(facade = "Golfe de Gascogne")
assertThat(formatActionToString.formatEnvControl(action)).isEqualTo("12:00 / 14:00 - Contrôle Environnement - Golfe de Gascogne")
}

@Test
fun `formatEnvControl should return formatted string with themes`() {
val themes = listOf(
ThemeEntity(
theme = "Rejets illicites",
),
ThemeEntity(
theme = "Natura 2000",
)
)
val action: EnvActionControlEntity = EnvActionControlMock.create(themes = themes)
assertThat(formatActionToString.formatEnvControl(action)).isEqualTo("12:00 / 14:00 - Contrôle Environnement - Rejets illicites + Natura 2000")
}

@Test
fun `formatEnvControl should return formatted string with amount of controls`() {
val action: EnvActionControlEntity = EnvActionControlMock.create(actionNumberOfControls = 2)
assertThat(formatActionToString.formatEnvControl(action)).isEqualTo("12:00 / 14:00 - Contrôle Environnement - 2 contrôles")
}

@Test
fun `formatEnvControl should return null if action is null`() {
val action = null
assertThat(formatActionToString.formatEnvControl(action)).isNull()
}

@Test
fun `formatNavNote should return formatted string`() {
val action: ActionFreeNoteEntity = NavActionFreeNoteMock.create()
assertThat(formatActionToString.formatNavNote(action)).isEqualTo("12:06 - Largué, appareillé")
}

@Test
fun `formatNavNote should return null if action is null`() {
val action = null
assertThat(formatActionToString.formatNavNote(action)).isNull()
}

@Test
fun `formatNavStatus should return formatted string`() {
val action: ActionStatusEntity = NavActionStatusMock.createActionStatusEntity()
assertThat(formatActionToString.formatNavStatus(action)).isEqualTo("12:00 - Navigation - début - observations")
}

@Test
fun `formatNavStatus should return formatted string without observations`() {
val action: ActionStatusEntity = NavActionStatusMock.createActionStatusEntity(observations = null)
assertThat(formatActionToString.formatNavStatus(action)).isEqualTo("12:00 - Navigation - début ")
}

@Test
fun `formatNavStatus should return null if action is null`() {
val action = null
assertThat(formatActionToString.formatNavStatus(action)).isNull()
}

@Test
fun `formatNavControl should return formatted string`() {
val action: ActionControlEntity = NavActionControlMock.createActionControlEntity()
assertThat(formatActionToString.formatNavControl(action)).isEqualTo("12:00 / 14:00 - Contrôle administratif ")
}

@Test
fun `formatNavControl should return null if action is null`() {
val action = null
assertThat(formatActionToString.formatNavControl(action)).isNull()
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,24 @@ package fr.gouv.gmampa.rapportnav.mocks.mission.action

import fr.gouv.dgampa.rapportnav.domain.entities.mission.env.envActions.*
import org.locationtech.jts.geom.Geometry
import java.time.LocalDateTime
import java.time.ZoneOffset
import java.time.ZonedDateTime
import java.util.*

object EnvActionControlMock {
fun create(
id: UUID = UUID.randomUUID(),
actionStartDateTimeUtc: ZonedDateTime? = null,
actionEndDateTimeUtc: ZonedDateTime? = null,
actionStartDateTimeUtc: ZonedDateTime? = ZonedDateTime.of(LocalDateTime.of(2022, 1, 2, 12, 0), ZoneOffset.UTC),
actionEndDateTimeUtc: ZonedDateTime? = ZonedDateTime.of(LocalDateTime.of(2022, 1, 2, 14, 0), ZoneOffset.UTC),
geom: Geometry? = null,
facade: String? = null,
department: String? = null,
isAdministrativeControl: Boolean? = null,
isComplianceWithWaterRegulationsControl: Boolean? = null,
isSafetyEquipmentAndStandardsComplianceControl: Boolean? = null,
isSeafarersControl: Boolean? = null,
themes: List<ThemeEntity>? = emptyList(),
themes: List<ThemeEntity>? = null,
observations: String? = null,
actionNumberOfControls: Int? = null,
actionTargetType: ActionTargetTypeEnum? = null,
Expand Down
Loading