class GerarListaTransferenciaAutoAlmoxarifadoON extends BaseBusiness {

	@SuppressWarnings("PMD.NPathComplexity")
	protected void validarNiveisClassificacaoInformados(SceTransferencia transferencia) throws BaseException {
		
		// Pesquisa o código de classificação da transferência
		final ScoClassifMatNiv5 classifMatNiv5 = this.getComprasFacade().obterClassifMatNiv5PorNumero(transferencia.getClassifMatNiv5().getNumero());
		
		if(classifMatNiv5 != null){
			
			Long valorCodigo = 0L;
			
			if(classifMatNiv5.getCodigo() == 0){
				valorCodigo = 99L;
			}

			if((classifMatNiv5.getScoClassifMatNiv4() != null) && classifMatNiv5.getScoClassifMatNiv4().getId().getCodigo() == 0){
				valorCodigo = valorCodigo + 9900L;
			}
			
			if((classifMatNiv5.getScoClassifMatNiv4() != null && classifMatNiv5.getScoClassifMatNiv4().getScoClassifMatNiv3() != null) && classifMatNiv5.getScoClassifMatNiv4().getScoClassifMatNiv3().getId().getCodigo() == 0){
				valorCodigo = valorCodigo + 9900L;
			}
			
			if((classifMatNiv5.getScoClassifMatNiv4() != null && classifMatNiv5.getScoClassifMatNiv4().getScoClassifMatNiv3() != null && classifMatNiv5.getScoClassifMatNiv4().getScoClassifMatNiv3().getScoClassifMatNiv2() != null) && classifMatNiv5.getScoClassifMatNiv4().getScoClassifMatNiv3().getScoClassifMatNiv2().getId().getCodigo() == 0){
				 valorCodigo = valorCodigo + 99000000L;
			}
			
			if((classifMatNiv5.getScoClassifMatNiv4() != null && classifMatNiv5.getScoClassifMatNiv4().getScoClassifMatNiv3() != null && classifMatNiv5.getScoClassifMatNiv4().getScoClassifMatNiv3().getScoClassifMatNiv2() != null && classifMatNiv5.getScoClassifMatNiv4().getScoClassifMatNiv3().getScoClassifMatNiv2().getScoClassifMatNiv1() != null) && classifMatNiv5.getScoClassifMatNiv4().getScoClassifMatNiv3().getScoClassifMatNiv2().getScoClassifMatNiv1().getId().getCodigo() == 0){
				 valorCodigo = valorCodigo + 9900000000L;
			}
			
			// Constantes locais para o cálculo da classificação
			final Long valorClassificacaoMaterialInicial = classifMatNiv5.getNumero();
			final Long valorClassificacaoMaterialFinal = valorClassificacaoMaterialInicial + valorCodigo;
			
			// Constantes locais para as consultas de classificação de materiais
			final AghParametros parametroHospital = this.getParametroFacade().buscarAghParametro(AghuParametrosEnum.P_NUMERO_FORNECEDOR_HU);
			final Integer numeroFornecedorHospital = parametroHospital.getVlrNumerico().intValue();
			final Short seqAlmoxarifadoOrigem = transferencia.getAlmoxarifado().getSeq();
			final Short seqAlmoxarifadoRecebe = transferencia.getAlmoxarifadoRecebimento().getSeq();
			
			List<SceEstoqueAlmoxarifado> listaMaterialClassificados = null;
			List<SceEstoqueAlmoxarifado> listaEstoqueAlmoxarifados = null;
			
			//  Verifica se a classificação inicial é DIFERENTE da classificação geral de material expediente!
			if(valorClassificacaoMaterialInicial != 40000000000L){

				listaMaterialClassificados = this.getSceEstoqueAlmoxarifadoDAO().pesquisarMaterialSaldoMenorIgualEstoqueMinimoAlmoxarifadoDestino(numeroFornecedorHospital, seqAlmoxarifadoOrigem, seqAlmoxarifadoRecebe, valorClassificacaoMaterialInicial,valorClassificacaoMaterialFinal);
				
				// Classifica e seleciona estoque almoxarifados através do cálculo das quantidades
				listaEstoqueAlmoxarifados = this.classificarListaEstoqueAlmoxarifadoPorQuantidades(listaMaterialClassificados);

			} else{ // Classificação geral de material expediente...
				
				// TODO utilizar após criacao do parametro GRUPOS_VALIDOS_MATERIAL_EXPEDIENTE
				// Obtem o intervalo de grupo de materiais válidos para a pesquisa de material expediente
				//AghParametros paramGruposMaterialValidos = getAghuFacade().buscarAghParametro(AghuParametrosEnum.P_GRUPOS_VALIDOS_MATERIAL_EXPEDIENTE);
				List<Integer> intervaloGruposMaterialValidos = new LinkedList<Integer>();
				/*for (String valor : paramGruposMaterialValidos.getVlrTexto().split(",")) {
					intervaloGruposMaterialValidos.add(Integer.valueOf(valor));
				}*/
	
				// Pequisa de material expediente
				listaMaterialClassificados = this.getSceEstoqueAlmoxarifadoDAO().pesquisarMaterialClassificacaoGeralMaterialExpediente(numeroFornecedorHospital, seqAlmoxarifadoOrigem, seqAlmoxarifadoRecebe, intervaloGruposMaterialValidos);
			
				// Classifica e seleciona estoque almoxarifados através do cálculo das quantidades
				listaEstoqueAlmoxarifados = this.classificarListaEstoqueAlmoxarifadoPorQuantidades(listaMaterialClassificados);

			}
			
			// Valida a lista de estoque almoxarifado classificado
			if(listaEstoqueAlmoxarifados == null || listaEstoqueAlmoxarifados.isEmpty()){
				throw new ApplicationBusinessException(GerarListaTransferenciaAutoAlmoxarifadoONExceptionCode.SCE_00671);
			}
			
			// Percorre lista de estoque almoxarifado classificado, gera itens de transferência e insere os mesmos
			this.inserirNiveisClassificacaoInformados(transferencia, seqAlmoxarifadoOrigem, listaEstoqueAlmoxarifados);
			
		} else{
			throw new ApplicationBusinessException(GerarListaTransferenciaAutoAlmoxarifadoONExceptionCode.SCE_00671);
		}
	}

}