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);
    }
  }