class ManterPrescricaoDietaRN extends BaseBusiness {

	@SuppressWarnings("PMD.NPathComplexity")
	public boolean verificarSobreposicaoDatas(Date dtInicio, Date dtFim,
			Date dtInicioOld, Date dtFimOld) {

		if (dtInicio == null || dtInicioOld == null) {
			throw new IllegalArgumentException(PARAMETROS_OBRIGATORIOS);
		}

		/*
		 * Existe uma dthr_inicio MENOR que a nova data de inicio ou a nova de
		 * fim e que a dthr_fim existente é nula, ou seja, ainda está em vigor
		 */
		if ((dtInicioOld.before(dtInicio) || dtInicioOld.before(dtFim))
				&& dtFimOld == null) {
			return true;
		}

		if (dtInicioOld != null && dtFimOld != null && dtInicio != null
				&& dtFim != null) {

			/*
			 * Existem as datas de início e fim e as novas datas também(início e
			 * fim) e na tabela existe uma dthr_inicio entre as datas novas de
			 * início e fim ou na tabela existe uma dthr_fim entre as datas
			 * novas de início e fim
			 */
			if (!dtInicioOld.equals(dtFimOld)
					&& ((dtInicioOld.after(dtInicio) || dtInicioOld
							.equals(dtInicio)) && dtInicioOld.before(dtFim))
					|| (dtFimOld.after(dtInicio) && (dtFimOld.before(dtFim) || dtFimOld
							.equals(dtFim)))) {
				return true;
			}

			/*
			 * Existem as datas de início e fim e as novas datas também(início e
			 * fim) e na tabela existe uma dthr_fim MENOR IGUAL que a nova data
			 * de início e MAIOR que a nova data de fim
			 */
			if ((dtFimOld.before(dtInicio) || dtFimOld.equals(dtInicio))
					&& dtFimOld.after(dtFim)) {
				return true;
			}
		}

		/*
		 * A nova data de fim é nula e existe na tabela uma dthr_inicio MENOR
		 * IGUAL a nova data de início e uma dthr_fim MAIOR IGUAL a nova data de
		 * início
		 */
		if (dtFim == null
				&& dtFimOld != null
				&& ((dtInicioOld.before(dtInicio) || dtInicioOld
						.equals(dtInicio)) && dtFimOld.after(dtInicio))) {
			return true;
		}

		/* A nova data de fim é nula e existe na tabela uma dthr_fim também nula */
		if (dtFim == null && dtFimOld == null) {
			return true;
		}

		return false;
	}

}