@@ -872,9 +872,34 @@ public EvaluationTransferBean saveEvaluation(EvaluationTransferBean evaluationBe
872872
873873 Evaluation evaluation ;
874874 List <Long > newOutcomesCriterionIds = new ArrayList <>();
875+
875876 if (evaluationBean .getId () != null ) {
877+ // UI knows the evaluation ID, fetch it directly
876878 evaluation = evaluationRepository .getById (evaluationBean .getId ());
879+ } else {
880+ // UI thinks this is new, but check if an evaluation exists for this association and item
881+ evaluation = evaluationRepository .findByAssociationIdAndEvaluatedItemIdAndOwner (
882+ evaluationBean .getAssociationId (),
883+ evaluationBean .getEvaluatedItemId (),
884+ evaluationBean .getEvaluatedItemOwnerId ())
885+ .orElseGet (() -> {
886+ // Create a new evaluation with outcomes from the bean
887+ Evaluation e = new Evaluation ();
888+ e .getCriterionOutcomes ().addAll (evaluationBean .getCriterionOutcomes ().stream ().map (o -> {
889+ CriterionOutcome outcome = new CriterionOutcome ();
890+ outcome .setCriterionId (o .getCriterionId ());
891+ outcome .setPoints (o .getPoints ());
892+ outcome .setComments (o .getComments ());
893+ outcome .setPointsAdjusted (o .getPointsAdjusted ());
894+ outcome .setSelectedRatingId (o .getSelectedRatingId ());
895+ return outcome ;
896+ }).toList ());
897+ return e ;
898+ });
899+ }
877900
901+ // If evaluation already exists (has an ID), merge the criterion outcomes
902+ if (evaluation .getId () != null ) {
878903 List <CriterionOutcome > outcomes = evaluation .getCriterionOutcomes ();
879904 List <Long > outcomeIds = outcomes .stream ().map (CriterionOutcome ::getCriterionId ).collect (Collectors .toList ());
880905
@@ -914,17 +939,6 @@ public EvaluationTransferBean saveEvaluation(EvaluationTransferBean evaluationBe
914939 }
915940 // outcomeIds should be empty, if not the db contained outcomes not reported in the ui so remove them
916941 outcomes .removeIf (o -> outcomeIds .contains (o .getCriterionId ()));
917- } else {
918- evaluation = new Evaluation ();
919- evaluation .getCriterionOutcomes ().addAll (evaluationBean .getCriterionOutcomes ().stream ().map (o -> {
920- CriterionOutcome outcome = new CriterionOutcome ();
921- outcome .setCriterionId (o .getCriterionId ());
922- outcome .setPoints (o .getPoints ());
923- outcome .setComments (o .getComments ());
924- outcome .setPointsAdjusted (o .getPointsAdjusted ());
925- outcome .setSelectedRatingId (o .getSelectedRatingId ());
926- return outcome ;
927- }).collect (Collectors .toList ()));
928942 }
929943
930944 // only set these once
@@ -950,11 +964,11 @@ public EvaluationTransferBean saveEvaluation(EvaluationTransferBean evaluationBe
950964 ReturnedEvaluation returnedEvaluation = returnedEvaluationRepository .findByOriginalEvaluationId (evaluation .getId ())
951965 .map (re -> {
952966 re .setOverallComment (savedEvaluation .getOverallComment ());
953- Map <Long , CriterionOutcome > outcomes = savedEvaluation .getCriterionOutcomes ().stream ()
967+ Map <Long , CriterionOutcome > outcomesById = savedEvaluation .getCriterionOutcomes ().stream ()
954968 .collect (Collectors .toMap (CriterionOutcome ::getCriterionId , co -> co ));
955- re .getCriterionOutcomes ().removeIf (o -> outcomes .get (o .getCriterionId ()) == null );
969+ re .getCriterionOutcomes ().removeIf (o -> outcomesById .get (o .getCriterionId ()) == null );
956970 re .getCriterionOutcomes ().forEach (rco -> {
957- CriterionOutcome o = outcomes .get (rco .getCriterionId ());
971+ CriterionOutcome o = outcomesById .get (rco .getCriterionId ());
958972 rco .setSelectedRatingId (o .getSelectedRatingId ());
959973 rco .setPointsAdjusted (o .getPointsAdjusted ());
960974 rco .setPoints (o .getPoints ());
0 commit comments