private void saveUpdatePersonAnswerHeaders( DevelopmentProposal developmentProposal, String pageId) { boolean allCertificationsWereComplete = true; boolean allCertificationAreNowComplete = true; for (ProposalPerson person : developmentProposal.getProposalPersons()) { if (person.getQuestionnaireHelper() != null && person.getQuestionnaireHelper().getAnswerHeaders() != null && !person.getQuestionnaireHelper().getAnswerHeaders().isEmpty()) { boolean requiresUpdate = false; for (AnswerHeader answerHeader : person.getQuestionnaireHelper().getAnswerHeaders()) { boolean wasComplete = answerHeader.isCompleted(); allCertificationsWereComplete &= wasComplete; AnswerHeader currentAnswerHeader = retrieveCurrentAnswerHeader(answerHeader.getId()); if (currentAnswerHeader != null && currentAnswerHeader.getVersionNumber() > answerHeader.getVersionNumber()) { // Show error message if a newer version than the one being saved exists getGlobalVariableService() .getMessageMap() .putError( pageId, ERROR_CERTIFICATION_PERSON_ALREADY_ANSWERED, answerHeader.getQuestionnaire().getName(), person.getFullName()); updatePersonCertificationInfo(person, developmentProposal.getProjectId()); requiresUpdate = true; } else { getLegacyDataAdapter().save(answerHeader); person.getQuestionnaireHelper().populateAnswers(); boolean isComplete = person.getQuestionnaireHelper().getAnswerHeaders().get(0).isCompleted(); allCertificationAreNowComplete &= isComplete; if (isComplete && !wasComplete) { person.setCertifiedBy(getGlobalVariableService().getUserSession().getPrincipalId()); person.setCertifiedTime(getDateTimeService().getCurrentTimestamp()); } else if (wasComplete && !isComplete) { person.setCertifiedBy(null); person.setCertifiedTime(null); } checkForCertifiedByProxy(developmentProposal, person, isComplete && !wasComplete); } } // Update questionnaire with most up-to-date information if required - ie, questionnaire was // modified // by someone else if (requiresUpdate) { person.getQuestionnaireHelper().populateAnswers(); } } } boolean allowsSendCertificationCompleteNotification = getParameterService() .getParameterValueAsBoolean( Constants.MODULE_NAMESPACE_PROPOSAL_DEVELOPMENT, Constants.PARAMETER_COMPONENT_DOCUMENT, ProposalDevelopmentConstants.Parameters.NOTIFY_ALL_CERTIFICATIONS_COMPLETE); if (!allCertificationsWereComplete && allCertificationAreNowComplete && allowsSendCertificationCompleteNotification) { ProposalDevelopmentNotificationContext context = new ProposalDevelopmentNotificationContext( developmentProposal, "105", "All Proposal Persons Certification Completed"); ((ProposalDevelopmentNotificationRenderer) context.getRenderer()) .setDevelopmentProposal(developmentProposal); getKcNotificationService().sendNotification(context); } }