/**
   * Calculates the postpartum end date as 6 months past the delivery date.
   *
   * <p>NOTE: In the absence of a delivery date, the EDC is used.
   *
   * @return The end date of the postpartum stage
   */
  public Date getPostpartumStageEndDate() {
    Date deliveryDate = null;
    if (Functions.observation(mcProgramObs.getObs(), MCDeliveryReportConcepts.DELIVERY_REPORT)
        != null) {
      final Obs deliveryDateObs =
          mcProgramObs.getDeliveryReport().getMember(MCDeliveryReportConcepts.DELIVERY_DATE);
      if (deliveryDateObs != null) {
        deliveryDate = deliveryDateObs.getValueDatetime();
      }
    }

    if (deliveryDate == null) {
      // use EDC
      deliveryDate = mcProgramObs.getEstimatedDateOfConfinement();
    }

    if (deliveryDate != null) {
      final Calendar sixMonthsAfterDeliveryDate = Calendar.getInstance();
      sixMonthsAfterDeliveryDate.setTime(DateUtil.stripTime(deliveryDate));
      sixMonthsAfterDeliveryDate.add(Calendar.MONTH, 6);

      // return the calculated postpartum stage end date
      return sixMonthsAfterDeliveryDate.getTime();
    }

    // postpartum stage end date is not available
    return null;
  }
  /**
   * 1.4.4 Returning to ACTIVE status: If coming from an ADMITTED status, the status of the Delivery
   * Record is checked. If it has not yet been updated (no delivery date is entered), the form is
   * displayed (refer to Section 2.1.1)
   *
   * @return
   */
  public boolean isDeliveryReportNeeded() {
    if (isProgramConcluded()) {
      // program already concluded, no need for delivery report
      return false;
    }

    final List<PatientConsultStatus> statuses = mcProgramObs.getAllPatientConsultStatus();
    if (statuses.size() > 1) {
      final PatientConsultStatus previous = statuses.get(statuses.size() - 2);
      final PatientConsultStatus current = statuses.get(statuses.size() - 1);

      // check if status was 'active' and coming from 'admitted'
      if (current.getStatus() == MaternalCareProgramStates.ACTIVE //
          && previous.getStatus() == MaternalCareProgramStates.ADMITTED) {
        // if no delivery report has been created yet, then we need to ask the user to create one
        if (Functions.observation(mcProgramObs.getObs(), MCDeliveryReportConcepts.DELIVERY_REPORT)
            == null) {
          // no delivery report created yet: we need to pop-up the delivery report dialog
          return true;
        }
      }
    }

    // delivery report doesn't need to be displayed
    return false;
  }
  public void setMcProgramObs(MaternalCareProgramObs mcProgramObs) {
    this.mcProgramObs = mcProgramObs;

    // also store into the parent observation map for cascade saving
    getObservationMap().put(mcProgramObs.getObs().getConcept().getId(), mcProgramObs.getObs());
  }