From f0f10e5c4c1ced658af610fb454a796d8b162dad Mon Sep 17 00:00:00 2001 From: Pierre-Raphael Wozny Date: Fri, 3 Jul 2026 14:45:10 +0200 Subject: [PATCH 1/9] fix: sample processing preventing export --- pom.xml | 2 +- .../batch/service/PilotageLauncherService.java | 17 +++++++++++++++++ src/main/resources/application.yml | 5 ++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d8cb7d6a..dddb2001 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ fr.insee.pearljam pearljam-batch - 3.9.0 + 3.9.1 jar pearljam-batch PearlJam Batch diff --git a/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java b/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java index 743f9874..734e5cc2 100644 --- a/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java +++ b/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java @@ -36,6 +36,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.sql.SQLException; +import java.time.Instant; import java.util.*; import java.util.stream.Collectors; @@ -64,6 +65,9 @@ public class PilotageLauncherService { private static final Logger logger = LogManager.getLogger(PilotageLauncherService.class); private static final String CAMPAIGN_PATH_IN = "/campaign/campaign.xml"; + @Value("${app.environment}") + private String environment; + /** * Global function that structure the batch execution depends on batchOption * @@ -346,6 +350,19 @@ public BatchErrorCode loadSampleProcessing(String in, String processing) throws for(Questionnaire questionnaire : questionnaires) { String interrogationId = questionnaire.getIdInterrogation(); if (steps.contains(Constants.PILOTAGE)) { + + Campaign campaign = campaignDao.findById(campaignId); + Instant now = Instant.now(); + boolean afterIdentificationStarted = campaign.getOrganizationalUnits().getOrganizationalUnit().stream().anyMatch( + ou -> now.isAfter(new Date(Long.parseLong(ou.getIdentificationPhaseStartDate())).toInstant())); + + if(afterIdentificationStarted && environment.equals("prod")) + { + logger.log(Level.ERROR, "Can not integrate sample processing, idendification start date {} already in the past", interrogationId); + returnCode = BatchErrorCode.KO_FONCTIONAL_ERROR; + continue; + } + boolean pilotageValidate = campaignService.validateInput(mapPilotageSu.get(interrogationId), campaignId); if(!pilotageValidate) { logger.log(Level.WARN, "Interrogation {} is invalid", interrogationId); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a01c6ba9..2430235f 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -78,4 +78,7 @@ api: logging: level: - fr.insee.lunatic.utils.XslTransformation: WARN \ No newline at end of file + fr.insee.lunatic.utils.XslTransformation: WARN + +app: + environment: development \ No newline at end of file From a9ad14e7ce9f3a58fb7de5f8a1f9b9cd6a0925a0 Mon Sep 17 00:00:00 2001 From: Pierre-Raphael Wozny Date: Fri, 3 Jul 2026 16:17:21 +0200 Subject: [PATCH 2/9] fix: tests --- .../batch/service/PilotageLauncherService.java | 16 ++++++++++------ src/test/resources/application-test.yml | 5 ++++- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java b/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java index 734e5cc2..d242cb30 100644 --- a/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java +++ b/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java @@ -1,9 +1,7 @@ package fr.insee.pearljam.batch.service; import fr.insee.pearljam.batch.Constants; -import fr.insee.pearljam.batch.campaign.Campaign; -import fr.insee.pearljam.batch.campaign.CommunicationTemplateType; -import fr.insee.pearljam.batch.campaign.SurveyUnitType; +import fr.insee.pearljam.batch.campaign.*; import fr.insee.pearljam.batch.config.ApplicationConfig; import fr.insee.pearljam.batch.dao.CampaignDao; import fr.insee.pearljam.batch.dao.CommunicationTemplateDaoImpl; @@ -353,12 +351,18 @@ public BatchErrorCode loadSampleProcessing(String in, String processing) throws Campaign campaign = campaignDao.findById(campaignId); Instant now = Instant.now(); - boolean afterIdentificationStarted = campaign.getOrganizationalUnits().getOrganizationalUnit().stream().anyMatch( - ou -> now.isAfter(new Date(Long.parseLong(ou.getIdentificationPhaseStartDate())).toInstant())); + OrganizationalUnitsType organizationalUnitType = campaign.getOrganizationalUnits(); + + boolean afterIdentificationStarted = false; + if(organizationalUnitType != null) + { + afterIdentificationStarted = organizationalUnitType.getOrganizationalUnit().stream().anyMatch( + ou -> now.isAfter(new Date(Long.parseLong(ou.getIdentificationPhaseStartDate())).toInstant())); + } if(afterIdentificationStarted && environment.equals("prod")) { - logger.log(Level.ERROR, "Can not integrate sample processing, idendification start date {} already in the past", interrogationId); + logger.log(Level.WARN, "Can not integrate sample processing, idendification start date for {} already in the past", interrogationId); returnCode = BatchErrorCode.KO_FONCTIONAL_ERROR; continue; } diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml index 7b4041bd..e756de60 100644 --- a/src/test/resources/application-test.yml +++ b/src/test/resources/application-test.yml @@ -76,4 +76,7 @@ api: datacollection: url: http://localhost:9999 bulk: - size: 500 \ No newline at end of file + size: 500 + +app: + environment: development \ No newline at end of file From 1821efc99be1dcb35c87dd6275d182c8693292dd Mon Sep 17 00:00:00 2001 From: Pierre-Raphael Wozny Date: Mon, 6 Jul 2026 09:18:22 +0200 Subject: [PATCH 3/9] fix: sonar date --- .../batch/service/PilotageLauncherService.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java b/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java index d242cb30..97889f99 100644 --- a/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java +++ b/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java @@ -35,6 +35,8 @@ import java.nio.file.Paths; import java.sql.SQLException; import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneOffset; import java.util.*; import java.util.stream.Collectors; @@ -350,14 +352,22 @@ public BatchErrorCode loadSampleProcessing(String in, String processing) throws if (steps.contains(Constants.PILOTAGE)) { Campaign campaign = campaignDao.findById(campaignId); - Instant now = Instant.now(); OrganizationalUnitsType organizationalUnitType = campaign.getOrganizationalUnits(); boolean afterIdentificationStarted = false; if(organizationalUnitType != null) { + LocalDate localDate = LocalDate.now(); afterIdentificationStarted = organizationalUnitType.getOrganizationalUnit().stream().anyMatch( - ou -> now.isAfter(new Date(Long.parseLong(ou.getIdentificationPhaseStartDate())).toInstant())); + ou -> + { + long epochSeconds = Long.parseLong(ou.getIdentificationPhaseStartDate()); + LocalDate date = Instant.ofEpochMilli(epochSeconds) + .atZone(ZoneOffset.UTC) + .toLocalDate(); + + return localDate.isAfter(date); + }); } if(afterIdentificationStarted && environment.equals("prod")) From 7031cbd18953999cca2ef8116cb58d711a0eb032 Mon Sep 17 00:00:00 2001 From: Pierre-Raphael Wozny Date: Mon, 6 Jul 2026 11:43:36 +0200 Subject: [PATCH 4/9] fix: extracted method + feature property --- .../service/PilotageLauncherService.java | 56 +++++++++++-------- src/main/resources/application.yml | 6 +- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java b/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java index 97889f99..7ee30c44 100644 --- a/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java +++ b/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java @@ -65,8 +65,8 @@ public class PilotageLauncherService { private static final Logger logger = LogManager.getLogger(PilotageLauncherService.class); private static final String CAMPAIGN_PATH_IN = "/campaign/campaign.xml"; - @Value("${app.environment}") - private String environment; + @Value("${application.feature.sampleprocessing.allowwhenindentificationstarted}") + private boolean allowWhenIdentificationStarted; /** * Global function that structure the batch execution depends on batchOption @@ -351,29 +351,9 @@ public BatchErrorCode loadSampleProcessing(String in, String processing) throws String interrogationId = questionnaire.getIdInterrogation(); if (steps.contains(Constants.PILOTAGE)) { - Campaign campaign = campaignDao.findById(campaignId); - OrganizationalUnitsType organizationalUnitType = campaign.getOrganizationalUnits(); - - boolean afterIdentificationStarted = false; - if(organizationalUnitType != null) + returnCode = isIntegrationFeasible(campaignId, interrogationId, returnCode); + if(returnCode.equals(BatchErrorCode.KO_FONCTIONAL_ERROR)) { - LocalDate localDate = LocalDate.now(); - afterIdentificationStarted = organizationalUnitType.getOrganizationalUnit().stream().anyMatch( - ou -> - { - long epochSeconds = Long.parseLong(ou.getIdentificationPhaseStartDate()); - LocalDate date = Instant.ofEpochMilli(epochSeconds) - .atZone(ZoneOffset.UTC) - .toLocalDate(); - - return localDate.isAfter(date); - }); - } - - if(afterIdentificationStarted && environment.equals("prod")) - { - logger.log(Level.WARN, "Can not integrate sample processing, idendification start date for {} already in the past", interrogationId); - returnCode = BatchErrorCode.KO_FONCTIONAL_ERROR; continue; } @@ -430,6 +410,34 @@ public BatchErrorCode loadSampleProcessing(String in, String processing) throws return returnCode; } + private BatchErrorCode isIntegrationFeasible(String campaignId, String interrogationId, BatchErrorCode returnCode) { + Campaign campaign = campaignDao.findById(campaignId); + OrganizationalUnitsType organizationalUnitType = campaign.getOrganizationalUnits(); + + boolean afterIdentificationStarted = false; + if(organizationalUnitType != null) + { + LocalDate localDate = LocalDate.now(); + afterIdentificationStarted = organizationalUnitType.getOrganizationalUnit().stream().anyMatch( + ou -> + { + long epochSeconds = Long.parseLong(ou.getIdentificationPhaseStartDate()); + LocalDate date = Instant.ofEpochMilli(epochSeconds) + .atZone(ZoneOffset.UTC) + .toLocalDate(); + + return localDate.isAfter(date); + }); + } + + if(afterIdentificationStarted && !allowWhenIdentificationStarted) + { + logger.log(Level.WARN, "Can not integrate sample processing, idendification start date for {} already in the past", interrogationId); + returnCode = BatchErrorCode.KO_FONCTIONAL_ERROR; + } + return returnCode; + } + private void moveFilesInOutFolders(BatchErrorCode returnCode) throws IOException, ValidateException { if(new File(appConfig.folderIn() + CAMPAIGN_PATH_IN).exists()) { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 2430235f..733c0b36 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -80,5 +80,7 @@ logging: level: fr.insee.lunatic.utils.XslTransformation: WARN -app: - environment: development \ No newline at end of file +application: + feature: + sampleprocessing: + allowwhenindentificationstarted : true \ No newline at end of file From 0cf483d3f82edf9f4c4aacb39d57247cbef08b90 Mon Sep 17 00:00:00 2001 From: Pierre-Raphael Wozny Date: Mon, 6 Jul 2026 14:51:11 +0200 Subject: [PATCH 5/9] fix: feature property --- src/main/resources/application.yml | 2 +- src/test/resources/application-test.yml | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 733c0b36..a4b1a87c 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -83,4 +83,4 @@ logging: application: feature: sampleprocessing: - allowwhenindentificationstarted : true \ No newline at end of file + allowwhenindentificationstarted: true \ No newline at end of file diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml index e756de60..8879bff4 100644 --- a/src/test/resources/application-test.yml +++ b/src/test/resources/application-test.yml @@ -78,5 +78,7 @@ api: bulk: size: 500 -app: - environment: development \ No newline at end of file +application: + feature: + sampleprocessing: + allowwhenindentificationstarted: true \ No newline at end of file From 92a22b56ee7e015467f0fb7b9be1bd692ba3b55e Mon Sep 17 00:00:00 2001 From: Pierre-Raphael Wozny Date: Mon, 6 Jul 2026 15:15:49 +0200 Subject: [PATCH 6/9] fix: improved check --- .../service/PilotageLauncherService.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java b/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java index 7ee30c44..52cb78bc 100644 --- a/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java +++ b/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java @@ -351,11 +351,7 @@ public BatchErrorCode loadSampleProcessing(String in, String processing) throws String interrogationId = questionnaire.getIdInterrogation(); if (steps.contains(Constants.PILOTAGE)) { - returnCode = isIntegrationFeasible(campaignId, interrogationId, returnCode); - if(returnCode.equals(BatchErrorCode.KO_FONCTIONAL_ERROR)) - { - continue; - } + isIntegrationFeasible(campaignId, interrogationId); boolean pilotageValidate = campaignService.validateInput(mapPilotageSu.get(interrogationId), campaignId); if(!pilotageValidate) { @@ -410,10 +406,15 @@ public BatchErrorCode loadSampleProcessing(String in, String processing) throws return returnCode; } - private BatchErrorCode isIntegrationFeasible(String campaignId, String interrogationId, BatchErrorCode returnCode) { + private void isIntegrationFeasible(String campaignId, String interrogationId) throws BatchException { Campaign campaign = campaignDao.findById(campaignId); OrganizationalUnitsType organizationalUnitType = campaign.getOrganizationalUnits(); + if(allowWhenIdentificationStarted) + { + return; + } + boolean afterIdentificationStarted = false; if(organizationalUnitType != null) { @@ -430,12 +431,10 @@ private BatchErrorCode isIntegrationFeasible(String campaignId, String interroga }); } - if(afterIdentificationStarted && !allowWhenIdentificationStarted) + if(afterIdentificationStarted) { - logger.log(Level.WARN, "Can not integrate sample processing, idendification start date for {} already in the past", interrogationId); - returnCode = BatchErrorCode.KO_FONCTIONAL_ERROR; + throw new BatchException(String.format("Can not integrate sample processing, idendification start date for %s already in the past", interrogationId)); } - return returnCode; } From c9cd33806990d4d76911b4ae9d42de7097f6ce8d Mon Sep 17 00:00:00 2001 From: Pierre-Raphael Wozny Date: Mon, 6 Jul 2026 15:21:22 +0200 Subject: [PATCH 7/9] fix: improved check --- .../service/PilotageLauncherService.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java b/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java index 52cb78bc..3acfa85e 100644 --- a/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java +++ b/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java @@ -351,7 +351,16 @@ public BatchErrorCode loadSampleProcessing(String in, String processing) throws String interrogationId = questionnaire.getIdInterrogation(); if (steps.contains(Constants.PILOTAGE)) { - isIntegrationFeasible(campaignId, interrogationId); + try + { + isIntegrationFeasible(campaignId, interrogationId); + } + catch (BatchException e) + { + logger.log(Level.WARN, e.getMessage()); + returnCode = BatchErrorCode.KO_FONCTIONAL_ERROR; + continue; + } boolean pilotageValidate = campaignService.validateInput(mapPilotageSu.get(interrogationId), campaignId); if(!pilotageValidate) { @@ -407,14 +416,15 @@ public BatchErrorCode loadSampleProcessing(String in, String processing) throws } private void isIntegrationFeasible(String campaignId, String interrogationId) throws BatchException { - Campaign campaign = campaignDao.findById(campaignId); - OrganizationalUnitsType organizationalUnitType = campaign.getOrganizationalUnits(); - if(allowWhenIdentificationStarted) { return; } + Campaign campaign = campaignDao.findById(campaignId); + OrganizationalUnitsType organizationalUnitType = campaign.getOrganizationalUnits(); + + boolean afterIdentificationStarted = false; if(organizationalUnitType != null) { @@ -422,8 +432,8 @@ private void isIntegrationFeasible(String campaignId, String interrogationId) th afterIdentificationStarted = organizationalUnitType.getOrganizationalUnit().stream().anyMatch( ou -> { - long epochSeconds = Long.parseLong(ou.getIdentificationPhaseStartDate()); - LocalDate date = Instant.ofEpochMilli(epochSeconds) + long epochMilliSeconds = Long.parseLong(ou.getIdentificationPhaseStartDate()); + LocalDate date = Instant.ofEpochMilli(epochMilliSeconds) .atZone(ZoneOffset.UTC) .toLocalDate(); From 798004e27f0010f13fb872acab62e09d36b8959c Mon Sep 17 00:00:00 2001 From: Pierre-Raphael Wozny Date: Mon, 6 Jul 2026 16:13:34 +0200 Subject: [PATCH 8/9] fix: typo --- src/main/resources/application.yml | 2 +- src/test/resources/application-test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a4b1a87c..f6809f44 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -83,4 +83,4 @@ logging: application: feature: sampleprocessing: - allowwhenindentificationstarted: true \ No newline at end of file + allowwhenidentificationstarted: true \ No newline at end of file diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml index 8879bff4..ab38bf65 100644 --- a/src/test/resources/application-test.yml +++ b/src/test/resources/application-test.yml @@ -81,4 +81,4 @@ api: application: feature: sampleprocessing: - allowwhenindentificationstarted: true \ No newline at end of file + allowwhenidentificationstarted: true \ No newline at end of file From 8a663ab7b7a239051dc5d836303227c5669fea94 Mon Sep 17 00:00:00 2001 From: Pierre-Raphael Wozny Date: Mon, 6 Jul 2026 16:35:37 +0200 Subject: [PATCH 9/9] fix: typo --- .../insee/pearljam/batch/service/PilotageLauncherService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java b/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java index 3acfa85e..e93d643a 100644 --- a/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java +++ b/src/main/java/fr/insee/pearljam/batch/service/PilotageLauncherService.java @@ -65,7 +65,7 @@ public class PilotageLauncherService { private static final Logger logger = LogManager.getLogger(PilotageLauncherService.class); private static final String CAMPAIGN_PATH_IN = "/campaign/campaign.xml"; - @Value("${application.feature.sampleprocessing.allowwhenindentificationstarted}") + @Value("${application.feature.sampleprocessing.allowwhenidentificationstarted}") private boolean allowWhenIdentificationStarted; /**