diff --git a/marlo-data/src/main/java/org/cgiar/ccafs/marlo/data/model/SoilIndicator.java b/marlo-data/src/main/java/org/cgiar/ccafs/marlo/data/model/SoilIndicator.java index 2f6b39452e..e750cb2e1e 100644 --- a/marlo-data/src/main/java/org/cgiar/ccafs/marlo/data/model/SoilIndicator.java +++ b/marlo-data/src/main/java/org/cgiar/ccafs/marlo/data/model/SoilIndicator.java @@ -26,11 +26,11 @@ public class SoilIndicator extends MarloBaseEntity implements java.io.Serializab @Expose private String indicatorName; @Expose - private long indicatorId; + private Long indicatorId; @Expose private Phase phase; - public long getIndicatorId() { + public Long getIndicatorId() { return indicatorId; } @@ -66,7 +66,7 @@ public boolean isActive() { return false; } - public void setIndicatorId(long indicatorId) { + public void setIndicatorId(Long indicatorId) { this.indicatorId = indicatorId; } @@ -82,5 +82,6 @@ public void setModifiedBy(User modifiedBy) { public void setPhase(Phase phase) { this.phase = phase; } + } diff --git a/marlo-web/src/main/java/org/cgiar/ccafs/marlo/validation/projects/DeliverableValidator.java b/marlo-web/src/main/java/org/cgiar/ccafs/marlo/validation/projects/DeliverableValidator.java index 6bd9907487..0683f9cc44 100644 --- a/marlo-web/src/main/java/org/cgiar/ccafs/marlo/validation/projects/DeliverableValidator.java +++ b/marlo-web/src/main/java/org/cgiar/ccafs/marlo/validation/projects/DeliverableValidator.java @@ -19,6 +19,7 @@ import org.cgiar.ccafs.marlo.action.BaseAction; import org.cgiar.ccafs.marlo.config.APConstants; import org.cgiar.ccafs.marlo.data.manager.CgiarCrossCuttingMarkerManager; +import org.cgiar.ccafs.marlo.data.manager.CrpProgramOutcomeManager; import org.cgiar.ccafs.marlo.data.manager.DeliverableUserManager; import org.cgiar.ccafs.marlo.data.manager.GlobalUnitManager; import org.cgiar.ccafs.marlo.data.manager.ProjectManager; @@ -26,6 +27,7 @@ import org.cgiar.ccafs.marlo.data.manager.RepIndTypeActivityManager; import org.cgiar.ccafs.marlo.data.manager.SoilIndicatorManager; import org.cgiar.ccafs.marlo.data.model.CgiarCrossCuttingMarker; +import org.cgiar.ccafs.marlo.data.model.CrpProgramOutcome; import org.cgiar.ccafs.marlo.data.model.Deliverable; import org.cgiar.ccafs.marlo.data.model.DeliverableCrossCuttingMarker; import org.cgiar.ccafs.marlo.data.model.DeliverableCrpOutcome; @@ -56,6 +58,7 @@ import javax.inject.Inject; import javax.inject.Named; +import org.jfree.util.Log; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -75,6 +78,7 @@ public class DeliverableValidator extends BaseValidator { private CgiarCrossCuttingMarkerManager cgiarCrossCuttingMarkerManager; private RepIndTypeActivityManager repIndTypeActivityManager; private SoilIndicatorManager soilIndicatorManager; + private CrpProgramOutcomeManager crpProgramOutcomeManager; Boolean doesNotHaveDOI; @@ -82,7 +86,8 @@ public class DeliverableValidator extends BaseValidator { public DeliverableValidator(GlobalUnitManager crpManager, ProjectManager projectManager, ProjectPartnerPersonManager projectPartnerPersonManager, CgiarCrossCuttingMarkerManager cgiarCrossCuttingMarkerManager, RepIndTypeActivityManager repIndTypeActivityManager, - DeliverableUserManager deliverableUserManager, SoilIndicatorManager soilIndicatorManager) { + DeliverableUserManager deliverableUserManager, SoilIndicatorManager soilIndicatorManager, + CrpProgramOutcomeManager crpProgramOutcomeManager) { this.crpManager = crpManager; this.projectManager = projectManager; this.projectPartnerPersonManager = projectPartnerPersonManager; @@ -90,6 +95,7 @@ public DeliverableValidator(GlobalUnitManager crpManager, ProjectManager project this.deliverableUserManager = deliverableUserManager; this.repIndTypeActivityManager = repIndTypeActivityManager; this.soilIndicatorManager = soilIndicatorManager; + this.crpProgramOutcomeManager = crpProgramOutcomeManager; } private Path getAutoSaveFilePath(Deliverable deliverable, long crpID, BaseAction action) { @@ -534,69 +540,99 @@ public void validate(BaseAction action, Deliverable deliverable, boolean saving) // SHFRM contribution validations - if (action.hasSpecificities(APConstants.SHFRM_CONTRIBUTION_ACTIVE) && dInfo != null - && dInfo.getContributingShfrm() != null && dInfo.getContributingShfrm() == true) { - - // Validate Soil indicators - if (deliverable.getCrpOutcomes() == null || !deliverable.getCrpOutcomes().isEmpty()) { - List soilIndicators = new ArrayList<>(); - soilIndicators = soilIndicatorManager.findAll(); - - for (DeliverableCrpOutcome indicator : deliverable.getCrpOutcomes()) { - if (soilIndicators != null && !soilIndicators.isEmpty()) { - for (SoilIndicator soilIndicator : soilIndicators) { - if (soilIndicator != null && soilIndicator.getIndicatorName() != null && indicator != null - && indicator.getCrpProgramOutcome() != null && indicator.getCrpProgramOutcome().getAcronym() != null - && !indicator.getCrpProgramOutcome().getAcronym().contains(soilIndicator.getIndicatorName())) { - action.addMessage(action.getText("deliverable.crpOutcomes")); - action.addMissingField("deliverable.crpOutcomes"); - action.getInvalidFields().put("list-deliverable.crpOutcomes", InvalidFieldsMessages.EMPTYFIELD); + if (action.hasSpecificities(APConstants.SHFRM_CONTRIBUTION_ACTIVE)) { + + // Validate if is contributing + if (dInfo != null && dInfo.getContributingShfrm() != null && dInfo.getContributingShfrm() == true) { + + // Validate Soil indicators + if (deliverable.getCrpOutcomes() != null || !deliverable.getCrpOutcomes().isEmpty()) { + List soilIndicators = new ArrayList<>(); + soilIndicators = soilIndicatorManager.findAll(); + boolean containsIndicator = false; + for (DeliverableCrpOutcome indicator : deliverable.getCrpOutcomes()) { + if (soilIndicators != null && !soilIndicators.isEmpty()) { + for (SoilIndicator soilIndicator : soilIndicators) { + if (indicator != null && indicator.getCrpProgramOutcome() != null + && indicator.getCrpProgramOutcome().getId() != null) { + try { + CrpProgramOutcome outcome = + crpProgramOutcomeManager.getCrpProgramOutcomeById(indicator.getCrpProgramOutcome().getId()); + if (outcome != null && outcome.getAcronym() != null) { + indicator.getCrpProgramOutcome().setAcronym(outcome.getAcronym()); + } + } catch (Exception e) { + Log.error("error getting crp program outcome " + e); + } + } + if (soilIndicator != null && soilIndicator.getIndicatorName() != null && indicator != null + && indicator.getCrpProgramOutcome() != null && indicator.getCrpProgramOutcome().getAcronym() != null + && indicator.getCrpProgramOutcome().getAcronym().contains(soilIndicator.getIndicatorName())) { + containsIndicator = true; + } } } } + + // not contains indicator + if (containsIndicator == false) { + action.addMessage(action.getText("deliverable.crpOutcomes")); + action.addMissingField("deliverable.crpOutcomes"); + action.getInvalidFields().put("list-deliverable.crpOutcomes", InvalidFieldsMessages.EMPTYFIELD); + } } - } - // Validate contribution narrative - if (!(this - .isValidString(deliverable.getDeliverableInfo(action.getActualPhase()).getShfrmContributionNarrative()) - && this.wordCount( - deliverable.getDeliverableInfo(action.getActualPhase()).getShfrmContributionNarrative()) <= 200)) { - action.addMessage(action.getText("deliverable.deliverableInfo.shfrmContributionNarrative")); - action.addMissingField("deliverable.deliverableInfo.shfrmContributionNarrative"); - action.getInvalidFields().put("input-deliverable.deliverableInfo.shfrmContributionNarrative", - InvalidFieldsMessages.EMPTYFIELD); - } + // Validate contribution narrative + if (!(this + .isValidString(deliverable.getDeliverableInfo(action.getActualPhase()).getShfrmContributionNarrative()) + && this.wordCount( + deliverable.getDeliverableInfo(action.getActualPhase()).getShfrmContributionNarrative()) <= 200)) { + action.addMessage(action.getText("deliverable.deliverableInfo.shfrmContributionNarrative")); + action.addMissingField("deliverable.deliverableInfo.shfrmContributionNarrative"); + action.getInvalidFields().put("input-deliverable.deliverableInfo.shfrmContributionNarrative", + InvalidFieldsMessages.EMPTYFIELD); + } - // Validate priority actions - if (deliverable.getShfrmPriorityActions() == null - || (deliverable.getShfrmPriorityActions() != null && deliverable.getShfrmPriorityActions().isEmpty())) { - action.addMessage(action.getText("deliverable.shfrmPriorityActions")); - action.addMissingField("deliverable.shfrmPriorityActions"); - action.getInvalidFields().put("list-deliverable.shfrmPriorityActions", InvalidFieldsMessages.EMPTYFIELD); - } else if (deliverable.getShfrmPriorityActions() != null && !deliverable.getShfrmPriorityActions().isEmpty()) { - int indexJ = 0; - - for (DeliverableShfrmPriorityAction priorityAction : deliverable.getShfrmPriorityActions()) { - if (priorityAction != null && priorityAction.getShfrmSubActions() == null - || (priorityAction.getShfrmSubActions() != null && priorityAction.getShfrmSubActions().isEmpty())) { - action.addMessage(action.getText("deliverable.shfrmSubActions")); - action.addMissingField("deliverable.shfrmPriorityActions"); - action.getInvalidFields().put("list-deliverable.shfrmPriorityActions", InvalidFieldsMessages.EMPTYFIELD); - /* - * action.addMessage(action.getText("deliverable.shfrmSubActions[" + indexJ + "]")); - * action.addMissingField("deliverable.shfrmSubActions[" + indexJ + "]"); - * action.getInvalidFields().put("list-deliverable.shfrmPriorityAction[" + indexJ + "].shfrmSubActions", - * InvalidFieldsMessages.EMPTYFIELD); - */ - indexJ++; + // Validate priority actions + if (deliverable.getShfrmPriorityActions() == null + || (deliverable.getShfrmPriorityActions() != null && deliverable.getShfrmPriorityActions().isEmpty())) { + action.addMessage(action.getText("deliverable.shfrmPriorityActions")); + action.addMissingField("deliverable.shfrmPriorityActions"); + action.getInvalidFields().put("list-deliverable.shfrmPriorityActions", InvalidFieldsMessages.EMPTYFIELD); + } else if (deliverable.getShfrmPriorityActions() != null + && !deliverable.getShfrmPriorityActions().isEmpty()) { + int indexJ = 0; + + for (DeliverableShfrmPriorityAction priorityAction : deliverable.getShfrmPriorityActions()) { + if (priorityAction != null && priorityAction.getShfrmSubActions() == null || (priorityAction != null + && priorityAction.getShfrmSubActions() != null && priorityAction.getShfrmSubActions().isEmpty())) { + action.addMessage(action.getText("deliverable.shfrmSubActions")); + action.addMissingField("deliverable.shfrmPriorityActions"); + action.getInvalidFields().put("list-deliverable.shfrmPriorityActions", + InvalidFieldsMessages.EMPTYFIELD); + /* + * action.addMessage(action.getText("deliverable.shfrmSubActions[" + indexJ + "]")); + * action.addMissingField("deliverable.shfrmSubActions[" + indexJ + "]"); + * action.getInvalidFields().put("list-deliverable.shfrmPriorityAction[" + indexJ + "].shfrmSubActions", + * InvalidFieldsMessages.EMPTYFIELD); + */ + indexJ++; + } } } - } + } else { + // Validate empty contributing question + if (dInfo != null && (dInfo.getContributingShfrm() == null)) { + action.addMessage(action.getText("deliverable.deliverableInfo.contributingShfrm")); + action.getInvalidFields().put("input-deliverable.deliverableInfo.contributingShfrm", + InvalidFieldsMessages.EMPTYFIELD); + } + } } } + this.saveMissingFields(deliverable, action.getActualPhase().getDescription(), action.getActualPhase().getYear(), action.getActualPhase().getUpkeep(), ProjectSectionStatusEnum.DELIVERABLES.getStatus(), action); } diff --git a/marlo-web/src/main/resources/database/migrations/V2_6_0_20240216_1000__UpdateShfrmPriorityActionTableDescriptionField.sql b/marlo-web/src/main/resources/database/migrations/V2_6_0_20240216_1000__UpdateShfrmPriorityActionTableDescriptionField.sql new file mode 100644 index 0000000000..c1ef8b6153 --- /dev/null +++ b/marlo-web/src/main/resources/database/migrations/V2_6_0_20240216_1000__UpdateShfrmPriorityActionTableDescriptionField.sql @@ -0,0 +1 @@ +ALTER TABLE shfrm_sub_actions MODIFY COLUMN description text CHARACTER SET utf8 COLLATE utf8_general_ci NULL; \ No newline at end of file diff --git a/marlo-web/src/main/resources/database/migrations/V2_6_0_20240216_1010__UpdateShfrmSubActionTableDescriptionField.sql b/marlo-web/src/main/resources/database/migrations/V2_6_0_20240216_1010__UpdateShfrmSubActionTableDescriptionField.sql new file mode 100644 index 0000000000..68692bb648 --- /dev/null +++ b/marlo-web/src/main/resources/database/migrations/V2_6_0_20240216_1010__UpdateShfrmSubActionTableDescriptionField.sql @@ -0,0 +1 @@ +ALTER TABLE shfrm_priority_actions MODIFY COLUMN description text CHARACTER SET utf8 COLLATE utf8_general_ci NULL; \ No newline at end of file diff --git a/marlo-web/src/main/resources/database/migrations/V2_6_0_20240216_1022__UpdateSoilIndicatorsTable.sql b/marlo-web/src/main/resources/database/migrations/V2_6_0_20240216_1022__UpdateSoilIndicatorsTable.sql new file mode 100644 index 0000000000..58d55e88ae --- /dev/null +++ b/marlo-web/src/main/resources/database/migrations/V2_6_0_20240216_1022__UpdateSoilIndicatorsTable.sql @@ -0,0 +1 @@ +ALTER TABLE soil_indicators MODIFY COLUMN id_phase bigint(20) NULL; diff --git a/marlo-web/src/main/webapp/WEB-INF/global/macros/deliverableMacros.ftl b/marlo-web/src/main/webapp/WEB-INF/global/macros/deliverableMacros.ftl index 9dadac764d..57120b40a0 100644 --- a/marlo-web/src/main/webapp/WEB-INF/global/macros/deliverableMacros.ftl +++ b/marlo-web/src/main/webapp/WEB-INF/global/macros/deliverableMacros.ftl @@ -1607,7 +1607,7 @@
[#-- Title --] - ${index+1}. ${(element.shfrmPriorityAction.composedName)!'Priority Action'} + [#-- ${index+1}. --]${(element.shfrmPriorityAction.composedName)!'Priority Action'}