class AfaDispensacaoMdtosRN extends BaseBusiness implements Serializable {

	@SuppressWarnings({"PMD.ExcessiveMethodLength", "PMD.NPathComplexity"})
	public void mpmpGeraDispMVto(Integer pmeAtdSeq, Integer pmeSeq, Date pmeData, Date pmeDthrInicio, Date pmeDthrFim, String nomeMicrocomputador) throws BaseException{
		
		BigDecimal dose;
		BigDecimal percSeNec;
		DominioSituacaoItemPrescritoDispensacaoMdto sitItem;
		Long pmdSeqAnt = 0l;
		TipoOperacaoEnum operacaoAnt = null;
		boolean indSolucaoAnt = false;
		
		AghParametros percEnvioDisp = getParametroFacade().buscarAghParametro(AghuParametrosEnum.P_PERC_ENVIO_DISP_MDTO_SN);
		
		if(percEnvioDisp==null || percEnvioDisp.getVlrNumerico()==null){
			throw new ApplicationBusinessException(AfaDispensacaoMdtosRNExceptionCode.MPM_03088);
		}
		percSeNec = percEnvioDisp.getVlrNumerico();
		
		List<MpmPrescricaoMdto> prescricaoMedicamentos = getPrescricaoMedicaFacade().pesquisarPrescricaoMdtoNovo(pmeAtdSeq, pmeData, pmeDthrInicio, pmeDthrFim);
		
		aplicaTipoOperacaoBancoEOrdena(prescricaoMedicamentos);
		
		for(MpmPrescricaoMdto prescricaoMdto:prescricaoMedicamentos){
			if(TipoOperacaoEnum.INSERT.equals(prescricaoMdto.getTipoOperacaoBanco())){
				farmaciaFacade.processaDispensacaoDiluente(
						prescricaoMdto, percSeNec, pmeDthrInicio, pmeDthrFim,
						nomeMicrocomputador, Boolean.TRUE);
			}
			for(MpmItemPrescricaoMdto itemPrescricaoMdto:prescricaoMdto.getItensPrescricaoMdtos()){
				
				Short qtdeCalcSist24h = itemPrescricaoMdto.getQtdeCalcSist24h();
				BigDecimal itemDose = itemPrescricaoMdto.getDose();
				AfaFormaDosagem formaDosagem = itemPrescricaoMdto.getFormaDosagem(); 
				
				dose = mpmcCalcDoseDisp(qtdeCalcSist24h, pmeData, pmeDthrFim, itemDose, formaDosagem.getSeq());

				if(TipoOperacaoEnum.INSERT.equals(prescricaoMdto.getTipoOperacaoBanco())){
					
					try{
						AfaDispensacaoMdtos dispMdto = processaNovaAfaDispMdto(pmeAtdSeq, pmeSeq,
								itemPrescricaoMdto.getPrescricaoMedicamento().getId().getAtdSeq(), 
								itemPrescricaoMdto.getPrescricaoMedicamento().getId().getSeq(), 
								itemPrescricaoMdto.getMedicamento().getMatCodigo(),
								itemPrescricaoMdto.getId().getSeqp(),
								prescricaoMdto.getIndSeNecessario(),
								dose,
								percSeNec,
								itemPrescricaoMdto.getFormaDosagem().getSeq(),
								DominioSituacaoItemPrescritoDispensacaoMdto.IS, null);
						
						criaDispMdtoTriagemPrescricao(dispMdto, nomeMicrocomputador);
					}catch (BaseRuntimeException e) {
						throw new ApplicationBusinessException(AfaDispensacaoMdtosRNExceptionCode.MPM_01574);
					}
					
				}
				
				if(TipoOperacaoEnum.UPDATE.equals(prescricaoMdto.getTipoOperacaoBanco())){
					this.achouDisp = Boolean.TRUE;
					sitItem = null;
					this.dsmSeq = null;
					
					atualizaPosGeracaoEPosInclusao(
							pmeAtdSeq,
							pmeSeq, itemPrescricaoMdto, prescricaoMdto,
							sitItem, dose, percSeNec, nomeMicrocomputador);
					
						if(this.achouDisp){
							atualizaAlteradoPosGeracaoEAlteradoPosInclusao(pmeAtdSeq, pmeSeq, itemPrescricaoMdto, nomeMicrocomputador);
						}
					}
				
				if(TipoOperacaoEnum.DELETE.equals(prescricaoMdto.getTipoOperacaoBanco())){
					this.achouDisp = Boolean.TRUE;
					sitItem = null;
					this.dsmSeq = null;
					
					List<AfaDispensacaoMdtos> dispensacoes = getAfaDispensacaoMdtosDAO()
						.pesquisarAfaDispensacaoMdto(pmeAtdSeq, pmeSeq,
								itemPrescricaoMdto.getId().getPmdAtdSeq(),
								itemPrescricaoMdto.getId().getPmdSeq(),
								itemPrescricaoMdto.getId().getMedMatCodigo(),
								itemPrescricaoMdto.getId().getSeqp());
					
					if(dispensacoes == null || dispensacoes.isEmpty()){
						this.achouDisp = Boolean.FALSE;
					}else{
						this.dsmSeq = dispensacoes.get(0).getSeq();
						sitItem = dispensacoes.get(0).getIndSitItemPrescrito();
					}
					
					if(this.achouDisp){
						atualizaExcluidoPosGeracaoEPosInclusao(pmeAtdSeq, pmeSeq, itemPrescricaoMdto, sitItem, nomeMicrocomputador);
					}
				}
				
				pmdSeqAnt = prescricaoMdto.getPrescricaoMdtoOrigem() != null ? prescricaoMdto.getPrescricaoMdtoOrigem().getId().getSeq() : 0L;
				operacaoAnt = prescricaoMdto.getTipoOperacaoBanco();
				indSolucaoAnt = prescricaoMdto.getIndSolucao();
			}
		}
		if(TipoOperacaoEnum.UPDATE.equals(operacaoAnt) && indSolucaoAnt && pmdSeqAnt !=null && pmdSeqAnt != 0L){
			excluirItensAposAlteracaoDeSolucao(pmeAtdSeq, pmeSeq, pmdSeqAnt, nomeMicrocomputador);
		}
	}

}