class AfaDispensacaoMdtosRN extends BaseBusiness implements Serializable {

	@SuppressWarnings("PMD.ExcessiveMethodLength")
	public void atualizaAfaDispMdto(AfaDispensacaoMdtos admNew, AfaDispensacaoMdtos admOld, String nomeMicrocomputador) throws BaseException{
		admNew.setIndexItemSendoAtualizado(Boolean.TRUE);
		validarAlteracaoQtdeESituacaoDaDispensacao(admNew, admOld);
		
		if(!CoreUtil.igual(admOld.getMedicamento(), admNew.getMedicamento())
				|| !CoreUtil.igual(getServidorIdNotNull(admOld.getServidor(), true),  getServidorIdNotNull(admNew.getServidor(), true))
				|| !CoreUtil.igual(getServidorIdNotNull(admOld.getServidor(), false), getServidorIdNotNull(admNew.getServidor(), false))
				|| !CoreUtil.igual(getServidorIdNotNull(admOld.getServidorEntregue(), true),  getServidorIdNotNull(admNew.getServidorEntregue(), true))
				|| !CoreUtil.igual(getServidorIdNotNull(admOld.getServidorEntregue(), false), getServidorIdNotNull(admNew.getServidorEntregue(), false))
				|| !CoreUtil.igual(admOld.getCriadoEm(), admNew.getCriadoEm())
				|| !CoreUtil.igual(admOld.getQtdeDispensada(), admNew.getQtdeDispensada())
				|| !CoreUtil.igual(admOld.getIndSituacao(), admNew.getIndSituacao())
				){
			rnDsmpVerAltera(admOld.getIndSituacao());
		}
		
		if(!CoreUtil.igual(admOld.getQtdeDispensada(), admNew.getQtdeDispensada()) 
				&& /*##33115*/!DominioSituacaoItemPrescritoDispensacaoMdto.DT.equals(admNew.getIndSitItemPrescrito())){

			admNew.setIndSituacao(rnDsmpVerAltQtde(admNew.getSeq(), admOld.getQtdeDispensada(), admNew.getQtdeDispensada(), admNew.getIndSituacao()));
		}
		
		if((DominioSituacaoDispensacaoMdto.E.equals(admNew.getIndSituacao())  && !DominioSituacaoDispensacaoMdto.E.equals(admOld.getIndSituacao()))
				|| !CoreUtil.igual(getServidorIdNotNull(admOld.getServidorEntregue(), true),  getServidorIdNotNull(admNew.getServidorEntregue(), true))
				|| !CoreUtil.igual(getServidorIdNotNull(admOld.getServidorEntregue(), false), getServidorIdNotNull(admNew.getServidorEntregue(), false))
				){
			rnDsmpVerSerBusc(admNew.getServidorEntregue());
		}
		
		/* Para sit <> 'S' não permite alterar qtde_dispensada, tod_seq e unf_seq */
		if(!DominioSituacaoDispensacaoMdto.S.equals(admNew.getIndSituacao())
				&& !DominioSituacaoDispensacaoMdto.D.equals(admNew.getIndSituacao())
				&& !DominioSituacaoDispensacaoMdto.T.equals(admNew.getIndSituacao())
				&& (!CoreUtil.igual(admNew.getQtdeDispensada(), admOld.getQtdeDispensada())
				|| !CoreUtil.igual(admNew.getTipoOcorrenciaDispensacao(), admOld.getTipoOcorrenciaDispensacao())
				|| !CoreUtil.igual(admNew.getUnidadeFuncional(), admOld.getUnidadeFuncional()))
				){
			rnDsmpVerSitAlt();
		}
		
		if(!CoreUtil.igual(admNew.getIndSituacao(), admOld.getIndSituacao())){
			if(
				   (DominioSituacaoDispensacaoMdto.S.equals(admOld.getIndSituacao()) && DominioSituacaoDispensacaoMdto.D.equals(admNew.getIndSituacao()))
				|| (DominioSituacaoDispensacaoMdto.D.equals(admOld.getIndSituacao()) && DominioSituacaoDispensacaoMdto.C.equals(admNew.getIndSituacao()))
				|| (DominioSituacaoDispensacaoMdto.C.equals(admOld.getIndSituacao()) && DominioSituacaoDispensacaoMdto.E.equals(admNew.getIndSituacao()))
				|| (DominioSituacaoDispensacaoMdto.E.equals(admOld.getIndSituacao()) && DominioSituacaoDispensacaoMdto.C.equals(admNew.getIndSituacao()))
				|| (DominioSituacaoDispensacaoMdto.C.equals(admOld.getIndSituacao()) && DominioSituacaoDispensacaoMdto.D.equals(admNew.getIndSituacao()))
				|| (DominioSituacaoDispensacaoMdto.D.equals(admOld.getIndSituacao()) && DominioSituacaoDispensacaoMdto.S.equals(admNew.getIndSituacao()))
				|| (DominioSituacaoDispensacaoMdto.S.equals(admOld.getIndSituacao()) && DominioSituacaoDispensacaoMdto.T.equals(admNew.getIndSituacao()))
				|| (DominioSituacaoDispensacaoMdto.D.equals(admOld.getIndSituacao()) && DominioSituacaoDispensacaoMdto.T.equals(admNew.getIndSituacao()))
				|| (DominioSituacaoDispensacaoMdto.T.equals(admOld.getIndSituacao()) && DominioSituacaoDispensacaoMdto.S.equals(admNew.getIndSituacao()))
				|| (DominioSituacaoDispensacaoMdto.T.equals(admOld.getIndSituacao()) && DominioSituacaoDispensacaoMdto.D.equals(admNew.getIndSituacao()))
			){
				if(admNew.getIndSituacao().equals(DominioSituacaoDispensacaoMdto.T)){
					admNew.setServidor(null);
					admNew.setDthrDispensacao(null);
				}
			}else{
				rnDsmpVerAltSit();
			}
		}
		
		/* Verifica se tipo  ocorrência dispensação está ativa */
		if(admNew.getTipoOcorrenciaDispensacao() !=null && !CoreUtil.igual(admNew.getTipoOcorrenciaDispensacao(), admOld.getTipoOcorrenciaDispensacao())){
			rnDsmpVerTodAtiv(admNew.getTipoOcorrenciaDispensacao());
		}
		
		/* Verifica se unid. funcional é farmácia e se está ativa */
		if(!CoreUtil.igual(admNew.getUnidadeFuncional(), admOld.getUnidadeFuncional())){
			rnDsmpVerUnfDisp(admNew.getUnidadeFuncional());
		}
		
		/* dados do servidor que digita */
		if(admNew.getIndSituacao().equals(DominioSituacaoDispensacaoMdto.S)){
			admNew.setServidor(null);
			admNew.setDthrDispensacao(null);
		}

		RapServidores servidorLogado = getServidorLogadoFacade().obterServidorLogado();
		
		/* dados do servidor que recebeu */
		if(DominioSituacaoDispensacaoMdto.D.equals(admNew.getIndSituacao())){
			if(DominioSituacaoDispensacaoMdto.S.equals(admOld.getIndSituacao())
				|| !CoreUtil.igual(admNew.getQtdeDispensada(), admOld.getQtdeDispensada())
				|| !CoreUtil.igual(admNew.getTipoOcorrenciaDispensacao(), admOld.getTipoOcorrenciaDispensacao())){
//				if (admNew.getServidor() == null){
					admNew.setServidor(servidorLogado);
//				}
				admNew.setDthrDispensacao(new Date());
			}
			admNew.setServidorConferida(null);
			admNew.setDthrConferencia(null);
			
			if(((admNew.getServidor() == null) || (admNew.getServidor().getId() == null)
				||(admNew.getServidor().getId().getMatricula() == null))
				&& DominioSituacaoDispensacaoMdto.S.equals(admOld.getIndSituacao())) {
				throw new ApplicationBusinessException(AfaDispensacaoMdtosRNExceptionCode.AFA_00445);
			}
		}
		
		if(DominioSituacaoDispensacaoMdto.T.equals(admNew.getIndSituacao())){
			if(DominioSituacaoDispensacaoMdto.S.equals(admOld.getIndSituacao())
				|| !CoreUtil.igual(admOld.getQtdeDispensada(), admNew.getQtdeDispensada())
				|| !CoreUtil.igual(admOld.getTipoOcorrenciaDispensacao(), admNew.getTipoOcorrenciaDispensacao())){
				
				admNew.setServidorTriadoPor(servidorLogado);
				admNew.setDthrTriado(new Date());
			}
			if (admNew.getServidorTriadoPor() == null
					|| admNew.getServidorTriadoPor().getId() == null
					|| admNew.getServidorTriadoPor().getId().getMatricula() == null) {
				throw new ApplicationBusinessException(AfaDispensacaoMdtosRNExceptionCode.AFA_01493);
			}
		}
		
		if(DominioSituacaoDispensacaoMdto.D.equals(admNew.getIndSituacao())){
			if (DominioSituacaoDispensacaoMdto.T.equals(admOld.getIndSituacao())
					|| !CoreUtil.igual(admOld.getQtdeDispensada(),admNew.getQtdeDispensada())
					|| !CoreUtil.igual(admOld.getTipoOcorrenciaDispensacao(),admNew.getTipoOcorrenciaDispensacao())) {
				
				admNew.setServidor(servidorLogado);
				admNew.setDthrDispensacao(new Date());
			}
			if((admNew.getServidor() == null || admNew.getServidor().getId() == null ||admNew.getServidor().getId().getMatricula() == null)
					&& DominioSituacaoDispensacaoMdto.T.equals(admOld.getIndSituacao())){
				throw new ApplicationBusinessException(AfaDispensacaoMdtosRNExceptionCode.AFA_01494);
			}
		}
		
		/* dados do servidor que conferiu */
		if(DominioSituacaoDispensacaoMdto.C.equals(admNew.getIndSituacao())){
			if (DominioSituacaoDispensacaoMdto.D.equals(admOld.getIndSituacao())) {
				admNew.setServidorConferida(servidorLogado);
				admNew.setDthrConferencia(new Date());
			}
				admNew.setServidorEntregue(null);
				admNew.setDthrEntrega(null);
			
			if ((admNew.getServidorConferida() == null
					|| admNew.getServidorConferida().getId() == null 
					|| admNew.getServidorConferida().getId().getMatricula() == null)){
				throw new ApplicationBusinessException(AfaDispensacaoMdtosRNExceptionCode.AFA_00446);
			}
		}
		
		/* dados do servidor que envia */
		if(DominioSituacaoDispensacaoMdto.E.equals(admNew.getIndSituacao())){
			if (DominioSituacaoDispensacaoMdto.C.equals(admOld.getIndSituacao())) {
				admNew.setServidorEntregue(servidorLogado);
				admNew.setDthrEntrega(new Date());
			}
			if((admNew.getServidorEntregue() == null || admNew.getServidorEntregue().getId().getMatricula() == null)){
				throw new ApplicationBusinessException(AfaDispensacaoMdtosRNExceptionCode.AFA_00447);
			}
		}
		
		/* atualiza a máquina (micro) onde foi gerada a dispensação de medicamentos */
		if(!CoreUtil.igual(admOld.getTipoOcorrenciaDispensacao(), admNew.getTipoOcorrenciaDispensacao())){
			if(DominioSituacaoDispensacaoMdto.S.equals(admOld.getIndSituacao()) 
				&& DominioSituacaoDispensacaoMdto.D.equals(admNew.getIndSituacao())){
				admNew.setNomeEstacaoDisp(nomeMicrocomputador);
			}
			if(DominioSituacaoDispensacaoMdto.S.equals(admNew.getIndSituacao())){
				admNew.setNomeEstacaoDisp(null);
			}
		}
		
		if(!CoreUtil.igual(admOld.getTipoOcorrenciaDispensacao(), admNew.getTipoOcorrenciaDispensacao())){
			if(DominioSituacaoDispensacaoMdto.T.equals(admOld.getIndSituacao()) 
				&& DominioSituacaoDispensacaoMdto.D.equals(admNew.getIndSituacao())){
				admNew.setNomeEstacaoDisp(nomeMicrocomputador);
			}
			if(DominioSituacaoDispensacaoMdto.S.equals(admNew.getIndSituacao())){
				admNew.setNomeEstacaoDisp(null);
			}
		}
		
		/* Atualiza dados do estorno de medicamentos (dthr e servidor de estorno) */
		if(!CoreUtil.igual(admOld.getQtdeEstornada(), admNew.getQtdeEstornada())
			||!CoreUtil.igual(admOld.getTipoOcorrenciaDispensacaoEstornado(), admNew.getTipoOcorrenciaDispensacaoEstornado()) ){
			if(admNew.getQtdeEstornada() == null){
				admNew.setServidorEstornado(null);
				admNew.setDthrEstorno(null);
			}else{
				if (CoreUtil.notIn(admNew.getIndSituacao(),
						DominioSituacaoDispensacaoMdto.C,
						DominioSituacaoDispensacaoMdto.D,
						DominioSituacaoDispensacaoMdto.E,
						DominioSituacaoDispensacaoMdto.T)) {
					throw new ApplicationBusinessException(
							AfaDispensacaoMdtosRNExceptionCode.AFA_01234);
				}
				
				admNew.setServidorEstornado(servidorLogado);
				admNew.setDthrEstorno(new Date());
				
				if(admNew.getServidorEstornado() == null || admNew.getServidorEstornado().getId().getMatricula() == null){
					throw new ApplicationBusinessException(AfaDispensacaoMdtosRNExceptionCode.AFA_00447);
				}
			}
		}
		
		getAfaDispensacaoMdtosDAO().atualizar(admNew);
		admNew.setIndexItemSendoAtualizado(Boolean.FALSE);
	}

}