Tony CHEMIT pushed to branch feature/issue_avdth_dcp at ultreiaio / ird-observe Commits: 20e1ed4b by Tony Chemit at 2022-12-13T14:39:06+01:00 AVDTH - Review and clarify dcp migration - - - - - 3 changed files: - core/persistence/resources/src/main/java/fr/ird/observe/persistence/avdth/data/ImportReferentialContext.java - core/persistence/resources/src/main/java/fr/ird/observe/persistence/avdth/data/logbook/FloatingObjectReader.java - src/site/markdown/avdth/logbook.md Changes: ===================================== core/persistence/resources/src/main/java/fr/ird/observe/persistence/avdth/data/ImportReferentialContext.java ===================================== @@ -58,7 +58,6 @@ import fr.ird.observe.entities.referential.ps.logbook.SetSuccessStatus; import fr.ird.observe.entities.referential.ps.logbook.WellContentStatus; import fr.ird.observe.entities.referential.ps.logbook.WellSamplingConformity; import fr.ird.observe.entities.referential.ps.logbook.WellSamplingStatus; -import fr.ird.observe.persistence.avdth.data.logbook.FloatingObjectReader; import fr.ird.observe.persistence.avdth.data.logbook.WellPlanReader; import fr.ird.observe.persistence.avdth.referential.AvdthReferentialImportResult; import fr.ird.observe.persistence.avdth.referential.SpeciesCache; @@ -80,10 +79,8 @@ import java.util.function.Consumer; * @author Tony Chemit - dev@tchemit.fr * @since 9.0.0 */ -@SuppressWarnings("SpellCheckingInspection") public class ImportReferentialContext { - private Map<String, WeightCategory> landingCategories; private Map<String, Destination> destinations; private Map<String, WeightCategory> wellCategories; @@ -127,6 +124,7 @@ public class ImportReferentialContext { private ObjectMaterial objectMaterialDFAD; private ObjectMaterial objectMaterialALOG; private ObjectMaterial objectMaterialAFAD; + private ObjectMaterial objectMaterialBiodegradable; private ObjectMaterial objectMaterialAlone; private ObjectMaterial objectMaterialLOG; private ObjectMaterial objectMaterialFALOG; @@ -228,6 +226,7 @@ public class ImportReferentialContext { objectMaterialHALOG = objectMaterial.get("fr.ird.referential.ps.common.ObjectMaterial#0#0.67"); objectMaterialVNLOG = objectMaterial.get("fr.ird.referential.ps.common.ObjectMaterial#0#0.52"); objectMaterialAlone = objectMaterial.get("fr.ird.referential.ps.common.ObjectMaterial#1561561977652#0.5876332198776647"); + objectMaterialBiodegradable = objectMaterial.get("fr.ird.referential.ps.common.ObjectMaterial#0#0.69"); // catch catchCategories = new TreeMap<>(); @@ -333,6 +332,26 @@ public class ImportReferentialContext { return objectMaterialAFAD; } + public ObjectMaterial getObjectMaterialLOG() { + return objectMaterialLOG; + } + + public ObjectMaterial getObjectMaterialFALOG() { + return objectMaterialFALOG; + } + + public ObjectMaterial getObjectMaterialHALOG() { + return objectMaterialHALOG; + } + + public ObjectMaterial getObjectMaterialVNLOG() { + return objectMaterialVNLOG; + } + + public ObjectMaterial getObjectMaterialBiodegradable() { + return objectMaterialBiodegradable; + } + public ObjectMaterial getObjectMaterialAlone() { return objectMaterialAlone; } @@ -529,79 +548,29 @@ public class ImportReferentialContext { entity.addObservedSystem(getObservedSystem("102")); } - public ObjectOperation getObjectOperationByVesselActivityCode(String vesselActivityCode) { - String objectOperationCode = FloatingObjectReader.DCP_OBJECT_OPERATION_CODE_MAPPING.get(vesselActivityCode); - if (objectOperationCode == null) { - return null; - } + public ObjectOperation getObjectOperation(String objectOperationCode) { return objectOperation.get(objectOperationCode); } - public TransmittingBuoyOperation getTransmittingBuoyOperationByVesselActivityCode(String vesselActivityCode) { - String transmittingBuoyTypeCode = FloatingObjectReader.TRANSMITTING_BUOY_OPERATION_CODE_MAPPING.get(vesselActivityCode); + public TransmittingBuoyOperation getTransmittingBuoyOperation(String transmittingBuoyTypeCode) { if (transmittingBuoyTypeCode == null) { return null; } return transmittingBuoyOperation.get(transmittingBuoyTypeCode); } - public TransmittingBuoyType getTransmittingBuoyTypeByBuoyTypeCode(String buoyTypeCode) { - String transmittingBuoyTypeCode = FloatingObjectReader.TRANSMITTING_BUOY_TYPE_CODE_MAPPING.get(buoyTypeCode); - if (transmittingBuoyTypeCode == null) { - transmittingBuoyTypeCode = "999"; - } - TransmittingBuoyType transmittingBuoyType = this.transmittingBuoyType.get(transmittingBuoyTypeCode); - return Objects.requireNonNull(transmittingBuoyType, String.format("Can't find transmittingBuoyType with code: %s", buoyTypeCode)); + public TransmittingBuoyType getTransmittingBuoyType(String transmittingBuoyTypeCode) { + TransmittingBuoyType result = transmittingBuoyType.get(transmittingBuoyTypeCode); + return Objects.requireNonNull(result, String.format("Can't find result with code: %s", transmittingBuoyTypeCode)); } - public TransmittingBuoyOwnership getTransmittingBuoyOwnership(String buoyOwnershipCode) { - if (buoyOwnershipCode == null) { - return null; - } - String transmittingBuoyOwnershipCode = FloatingObjectReader.TRANSMITTING_BUOY_OWNERSHIP_CODE_MAPPING.get(buoyOwnershipCode); + public TransmittingBuoyOwnership getTransmittingBuoyOwnership(String transmittingBuoyOwnershipCode) { if (transmittingBuoyOwnershipCode == null) { return null; } return transmittingBuoyOwnership.get(transmittingBuoyOwnershipCode); } - public ObservedSystem getObservedSystem(String objectTypeCode, String buoyTypeCode) { - if (objectTypeCode.equals("999")) { - if (buoyTypeCode.equals("999")) { - return getObservedSystem0(); - } - return getObservedSystem20(); - } - String observedSystemCode = FloatingObjectReader.OBSERVED_SYSTEM_CODE_MAPPING.get(objectTypeCode); - return getObservedSystem(observedSystemCode, false); - } - - /** - * To get objectMaterial id associated by a DCP from avdth ACTIVITE.C_TYP_OBJET code. - * - * @param objectTypeCode ACTIVITE.C_TYP_OBJET - * @return material or null - */ - public ObjectMaterial getObjectMaterialByObjectTypeCode(String objectTypeCode) { - switch (objectTypeCode) { - case "1": - return objectMaterialAFAD; - case "2": - return objectMaterialDFAD; - case "3": - return objectMaterialLOG; - case "9": - return objectMaterialFOB; - case "10": - return objectMaterialFALOG; - case "11": - return objectMaterialHALOG; - case "13": - return objectMaterialVNLOG; - } - return null; - } - public WeightCategory getWellWeightCategory(String weightCategoryCode) { String categoryCode = "W-" + weightCategoryCode; WeightCategory weightCategory = wellCategories.get(categoryCode); @@ -611,4 +580,5 @@ public class ImportReferentialContext { public VesselActivity getVesselActivity6() { return vesselActivity6; } + } ===================================== core/persistence/resources/src/main/java/fr/ird/observe/persistence/avdth/data/logbook/FloatingObjectReader.java ===================================== @@ -23,6 +23,7 @@ package fr.ird.observe.persistence.avdth.data.logbook; */ import com.google.common.collect.ImmutableMap; +import fr.ird.observe.entities.data.ps.logbook.Activity; import fr.ird.observe.entities.data.ps.logbook.FloatingObject; import fr.ird.observe.entities.data.ps.logbook.FloatingObjectPart; import fr.ird.observe.entities.data.ps.logbook.TransmittingBuoy; @@ -232,54 +233,113 @@ public class FloatingObjectReader extends DataReader<FloatingObject> { @Override public FloatingObject read(ImportDataContext dataContext, ResultSet resultSet) throws SQLException { - String vesselActivityCode = resultSet.getString(13); - VesselActivity vesselActivity = dataContext.getVesselActivity(vesselActivityCode); + // Get the current activity where to add the optional floating object + Activity activity = dataContext.getActivity(); + + // Get his vessel activity + VesselActivity vesselActivity = activity.getVesselActivity(); + + // Avdth observed system codes associated to the current activity (need them to compute ex nihilo floating object) Set<String> observedSystemCodes = dataContext.getObservedSystemCodes(); - if (!Objects.equals(vesselActivity.getCode(), "13")) { - boolean noDcpInObservedSystems = observedSystemCodes.stream().noneMatch(OBSERVED_SYTEM_CODES_WITH_DCP::contains); - if (noDcpInObservedSystems) { - reset(dataContext); - return null; - } - } - FloatingObject entity = newEntity(FloatingObject.SPI); + // We need to get the original vessel activity code from AVDTH (to compute some mapping) + String vesselActivityCode = resultSet.getString(13); - ObjectOperation objectOperation = dataContext.getObjectOperationByVesselActivityCode(vesselActivityCode); - entity.setObjectOperation(Objects.requireNonNull(objectOperation, String.format("Can't find objectOperation with code: %s", vesselActivityCode))); - boolean addCoordinate = "11".equals(objectOperation.getCode()); - boolean whenArriving = WHEN_ARRIVING_CODE.contains(vesselActivityCode); - boolean whenLeaving = WHEN_LEAVING_CODE.contains(vesselActivityCode); + // Is the floating object can be created by the observed systems? + boolean floatingObjectCreatedByObservedSystem = observedSystemCodes.stream().anyMatch(OBSERVED_SYTEM_CODES_WITH_DCP::contains); + + // Is the current vessel activity accept to create Floating object? + boolean vesselActivityAllowFad = vesselActivity.isAllowFad(); + + // Get object type code String objectTypeCode = resultSet.getString(28); if (objectTypeCode == null) { - //FIXME should fail ? + // If null, then consider it as not found in avdth objectTypeCode = "999"; } - //FIXME 29 - F_DCP_ECO -// int dcpEcoCode = resultSet.getInt(29); - String buoyOwnershipCode = resultSet.getString(30); + + // Is floating object exists in avdth? + boolean floatingObjectExistsInAvdth = !objectTypeCode.equals("999"); + + //FIXME Improve this condition + if (!vesselActivityAllowFad && !floatingObjectCreatedByObservedSystem) { + // do not create the floating object + reset(dataContext); + return null; + } + + FloatingObject entity = newEntity(FloatingObject.SPI); + + // Get floating object operation + ObjectOperation objectOperation = getObjectOperationByVesselActivityCode(dataContext, vesselActivityCode); + entity.setObjectOperation(Objects.requireNonNull(objectOperation, String.format("Can't find objectOperation with ACTIVITE.C_OPERA: %s", vesselActivityCode))); + String buoyTypeCode = resultSet.getString(31); if (buoyTypeCode == null) { - //FIXME should fail? + // If null, then consider it as not found in avdth buoyTypeCode = "999"; } - String buoyId = resultSet.getString(32); - String dcpWeight = resultSet.getString(33); - if (dcpWeight != null) { - //FIXME Check if ok - entity.setComment(String.format("ACTIVITE.POIDS_ESTIM_DCP value from avdth: %s", dcpWeight)); - } - ObservedSystem observedSystem = dataContext.getObservedSystem(objectTypeCode, buoyTypeCode); + // IS buoy exists in avdth? + boolean buoyExistsInAvdth = !"999".equals(buoyTypeCode); + + ObservedSystem observedSystem = getObservedSystem(dataContext, objectTypeCode, floatingObjectExistsInAvdth, buoyExistsInAvdth); if (observedSystem != null) { - dataContext.getActivity().addObservedSystem(observedSystem); + activity.addObservedSystem(observedSystem); + } + + boolean addBuoyFromObservedSystem = addFloatingObjectMaterials(dataContext, + resultSet, + vesselActivityCode, + objectTypeCode, + observedSystemCodes, + entity, + floatingObjectExistsInAvdth, + buoyExistsInAvdth); + + TransmittingBuoy transmittingBuoy = null; + if (buoyExistsInAvdth) { + transmittingBuoy = getBuoyFromAvdthActivity(dataContext, resultSet, buoyTypeCode, vesselActivityCode, objectOperation, activity); + } else if (addBuoyFromObservedSystem) { + transmittingBuoy = getBuoyFromObservedSystem(dataContext); } - // avdth data has a buoy - boolean willCreateBuoy = !"999".equals(buoyTypeCode); + if (transmittingBuoy != null) { + // only add buoy if buoy type known + entity.addTransmittingBuoy(transmittingBuoy); + } + reset(dataContext); + return entity; + } + + private boolean addFloatingObjectMaterials(ImportDataContext dataContext, + ResultSet resultSet, + String vesselActivityCode, + String objectTypeCode, + Set<String> observedSystemCodes, + FloatingObject entity, + boolean floatingObjectExistsInAvdth, + boolean buoyExistsInAvdth) throws SQLException { + boolean whenArriving = WHEN_ARRIVING_CODE.contains(vesselActivityCode); + boolean whenLeaving = WHEN_LEAVING_CODE.contains(vesselActivityCode); + // to add default material if there is a declared buoy and no object material created by ObservedSystem boolean addDefaultObjectMaterialOnUnknownObjectType = true; // should create a buoy from ObservedSystem boolean addBuoyFromObservedSystem = false; Set<String> objectMaterialUsed = new TreeSet<>(); + + if (floatingObjectExistsInAvdth) { + String dcpWeight = resultSet.getString(33); + if (dcpWeight != null) { + //FIXME Check if ok + entity.setComment(String.format("ACTIVITE.POIDS_ESTIM_DCP value from avdth: %s", dcpWeight)); + } + Object dcpEcoCode = resultSet.getObject(29); + if (dcpEcoCode != null && Objects.equals(2, dcpEcoCode)) { + // add material 4-1 (Biodegradable materials) + addObjectMaterial(objectMaterialUsed, dataContext.getObjectMaterialBiodegradable(), whenArriving, whenLeaving, entity); + } + } + if (observedSystemCodes.contains("20")) { // add ObjectMaterial FOB addObjectMaterial(objectMaterialUsed, dataContext.getObjectMaterialFOB(), whenArriving, whenLeaving, entity); @@ -309,47 +369,52 @@ public class FloatingObjectReader extends DataReader<FloatingObject> { addObjectMaterial(objectMaterialUsed, dataContext.getObjectMaterialAFAD(), whenArriving, whenLeaving, entity); addDefaultObjectMaterialOnUnknownObjectType = false; } - if ("999".equals(objectTypeCode)) { - if (willCreateBuoy && addDefaultObjectMaterialOnUnknownObjectType) { - // add ObjectMaterial 2-2-4-4 - addObjectMaterial(objectMaterialUsed, dataContext.getObjectMaterialAlone(), whenArriving, whenLeaving, entity); + if (floatingObjectExistsInAvdth) { + // simple mapping + ObjectMaterial objectMaterial = getObjectMaterialByObjectTypeCode(dataContext, objectTypeCode); + if (objectMaterial != null) { + addObjectMaterial(objectMaterialUsed, objectMaterial, whenArriving, whenLeaving, entity); } } else { - // simple mapping - ObjectMaterial objectMaterial1 = dataContext.getObjectMaterialByObjectTypeCode(objectTypeCode); - if (objectMaterial1 != null) { - addObjectMaterial(objectMaterialUsed, objectMaterial1, whenArriving, whenLeaving, entity); + if (buoyExistsInAvdth && addDefaultObjectMaterialOnUnknownObjectType) { + // add ObjectMaterial 2-2-4-4 + addObjectMaterial(objectMaterialUsed, dataContext.getObjectMaterialAlone(), whenArriving, whenLeaving, entity); } } - if (willCreateBuoy) { - // only add buoy if buoy type known - TransmittingBuoyType transmittingBuoyType = dataContext.getTransmittingBuoyTypeByBuoyTypeCode(buoyTypeCode); - TransmittingBuoyOperation transmittingBuoyOperation = dataContext.getTransmittingBuoyOperationByVesselActivityCode(vesselActivityCode); - if (transmittingBuoyOperation != null) { - TransmittingBuoy transmittingBuoy = newEntity(TransmittingBuoy.SPI, transmittingBuoyCount); - transmittingBuoy.setTransmittingBuoyOperation(transmittingBuoyOperation); - transmittingBuoy.setTransmittingBuoyType(transmittingBuoyType); - transmittingBuoy.setCode(buoyId); - if (addCoordinate) { - transmittingBuoy.setLatitude(dataContext.getActivity().getLatitude()); - transmittingBuoy.setLongitude(dataContext.getActivity().getLongitude()); - } - TransmittingBuoyOwnership transmittingBuoyOwnership = dataContext.getTransmittingBuoyOwnership(buoyOwnershipCode); - transmittingBuoy.setTransmittingBuoyOwnership(transmittingBuoyOwnership); - entity.addTransmittingBuoy(transmittingBuoy); - } - } else if (addBuoyFromObservedSystem) { - // only add buoy if observed system ask for it (22 and 24) - TransmittingBuoyType transmittingBuoyType = dataContext.getTransmittingBuoyType98(); - TransmittingBuoyOperation transmittingBuoyOperation = dataContext.getTransmittingBuoyOperation1(); + return addBuoyFromObservedSystem; + } + + private TransmittingBuoy getBuoyFromAvdthActivity(ImportDataContext dataContext, ResultSet resultSet, String buoyTypeCode, String vesselActivityCode, ObjectOperation objectOperation, Activity activity) throws SQLException { + boolean addCoordinate = "11".equals(objectOperation.getCode()); + TransmittingBuoyType transmittingBuoyType = getTransmittingBuoyTypeByBuoyTypeCode(dataContext, buoyTypeCode); + TransmittingBuoyOperation transmittingBuoyOperation = getTransmittingBuoyOperationByVesselActivityCode(dataContext, vesselActivityCode); + if (transmittingBuoyOperation != null) { + String buoyOwnershipCode = resultSet.getString(30); + String buoyId = resultSet.getString(32); TransmittingBuoy transmittingBuoy = newEntity(TransmittingBuoy.SPI, transmittingBuoyCount); transmittingBuoy.setTransmittingBuoyOperation(transmittingBuoyOperation); transmittingBuoy.setTransmittingBuoyType(transmittingBuoyType); - transmittingBuoy.setCode(null); - entity.addTransmittingBuoy(transmittingBuoy); + transmittingBuoy.setCode(buoyId); + if (addCoordinate) { + transmittingBuoy.setLatitude(activity.getLatitude()); + transmittingBuoy.setLongitude(activity.getLongitude()); + } + TransmittingBuoyOwnership transmittingBuoyOwnership = getTransmittingBuoyOwnership(dataContext, buoyOwnershipCode); + transmittingBuoy.setTransmittingBuoyOwnership(transmittingBuoyOwnership); + return transmittingBuoy; } - reset(dataContext); - return entity; + return null; + } + + private TransmittingBuoy getBuoyFromObservedSystem(ImportDataContext dataContext) { + // only add buoy if observed system ask for it (22 and 24) + TransmittingBuoyType transmittingBuoyType = dataContext.getTransmittingBuoyType98(); + TransmittingBuoyOperation transmittingBuoyOperation = dataContext.getTransmittingBuoyOperation1(); + TransmittingBuoy transmittingBuoy = newEntity(TransmittingBuoy.SPI, transmittingBuoyCount); + transmittingBuoy.setTransmittingBuoyOperation(transmittingBuoyOperation); + transmittingBuoy.setTransmittingBuoyType(transmittingBuoyType); + transmittingBuoy.setCode(null); + return transmittingBuoy; } private void reset(ImportDataContext dataContext) { @@ -380,4 +445,74 @@ public class FloatingObjectReader extends DataReader<FloatingObject> { return floatingObjectPartCount.intValue(); } + private ObjectOperation getObjectOperationByVesselActivityCode(ImportDataContext dataContext, String vesselActivityCode) { + String objectOperationCode = DCP_OBJECT_OPERATION_CODE_MAPPING.get(vesselActivityCode); + return dataContext.getObjectOperation(Objects.requireNonNull(objectOperationCode, String.format("Can't find objectOperation with ACTIVITE.C_OPERA: %s", vesselActivityCode))); + } + + private ObservedSystem getObservedSystem(ImportDataContext dataContext, String objectTypeCode, boolean floatingObjectExistsInAvdth,boolean buoyExistsInAvdth) { + if (!floatingObjectExistsInAvdth) { + if (!buoyExistsInAvdth) { + return dataContext.getObservedSystem0(); + } + return dataContext.getObservedSystem20(); + } + String observedSystemCode = OBSERVED_SYSTEM_CODE_MAPPING.get(objectTypeCode); + return dataContext.getObservedSystem(observedSystemCode, false); + } + + private TransmittingBuoyOwnership getTransmittingBuoyOwnership(ImportDataContext dataContext, String buoyOwnershipCode) { + if (buoyOwnershipCode == null) { + return null; + } + String transmittingBuoyOwnershipCode = TRANSMITTING_BUOY_OWNERSHIP_CODE_MAPPING.get(buoyOwnershipCode); + if (transmittingBuoyOwnershipCode == null) { + return null; + } + return dataContext.getTransmittingBuoyOwnership(transmittingBuoyOwnershipCode); + } + + private TransmittingBuoyOperation getTransmittingBuoyOperationByVesselActivityCode(ImportDataContext dataContext, String vesselActivityCode) { + String transmittingBuoyTypeCode = TRANSMITTING_BUOY_OPERATION_CODE_MAPPING.get(vesselActivityCode); + if (transmittingBuoyTypeCode == null) { + return null; + } + return dataContext.getTransmittingBuoyOperation(transmittingBuoyTypeCode); + } + + + private TransmittingBuoyType getTransmittingBuoyTypeByBuoyTypeCode(ImportDataContext dataContext, String buoyTypeCode) { + String transmittingBuoyTypeCode = TRANSMITTING_BUOY_TYPE_CODE_MAPPING.get(buoyTypeCode); + if (transmittingBuoyTypeCode == null) { + transmittingBuoyTypeCode = "999"; + } + TransmittingBuoyType transmittingBuoyType = dataContext.getTransmittingBuoyType(transmittingBuoyTypeCode); + return Objects.requireNonNull(transmittingBuoyType, String.format("Can't find transmittingBuoyType with code: %s", buoyTypeCode)); + } + + /** + * To get objectMaterial id associated by a DCP from avdth ACTIVITE.C_TYP_OBJET code. + * + * @param objectTypeCode ACTIVITE.C_TYP_OBJET + * @return material or null + */ + private ObjectMaterial getObjectMaterialByObjectTypeCode(ImportDataContext dataContext, String objectTypeCode) { + switch (objectTypeCode) { + case "1": + return dataContext.getObjectMaterialAFAD(); + case "2": + return dataContext.getObjectMaterialDFAD(); + case "3": + return dataContext.getObjectMaterialLOG(); + case "9": + return dataContext.getObjectMaterialFOB(); + case "10": + return dataContext.getObjectMaterialFALOG(); + case "11": + return dataContext.getObjectMaterialHALOG(); + case "13": + return dataContext.getObjectMaterialVNLOG(); + } + return null; + } } ===================================== src/site/markdown/avdth/logbook.md ===================================== @@ -46,7 +46,7 @@ La table est déversée dans plusieurs tables : | ACTIVITE_26 | V_VENT_DIR | Activity.windDirection | | | ACTIVITE_27 | V_VENT_VIT | Activity.wind | [9](#n_0_9) | | ACTIVITE_28 | C_TYP_OBJET | | [10](#n_0_10) | -| ACTIVITE_29 | F_DCP_ECO | ??? | | +| ACTIVITE_29 | F_DCP_ECO | Dcp écologique | [10](#n_0_10) | | ACTIVITE_30 | F_PROP_BALISE | TransmittingBuoy.transmittingBuoyOwnerShip | [10](#n_0_10) | | ACTIVITE_31 | C_TYP_BALISE | | [10](#n_0_10) | | ACTIVITE_32 | V_ID_BALISE | TransmittingBuoy.code | | @@ -218,6 +218,7 @@ Pour le **simple mapping** on utilise la translation : | 3 | fr.ird.referential.ps.common.ObjectMaterial#0#0.50 | 2 LOG | | 9 | fr.ird.referential.ps.common.ObjectMaterial#0#1.3 | FOB | +Enfin si la valeur du champs **ACTIVITE.F_DCP_ECO** vaut **2**, alors on ajoute le matériel **4-1** (*Matériaux biodégradables*). * ```FloatingObject.transmittingBuoy``` View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/20e1ed4b8e2424842d91f97d34... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/20e1ed4b8e2424842d91f97d34... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT (@tchemit)