class VerbaGestaoON extends BaseBusiness {

	public void gravaFontesRecursoXVerbaGestao(FsoVerbaGestao verbaGestao,
			List<FsoFontesXVerbaGestao> inserirFontesXVerba,
			List<FsoFontesXVerbaGestao> removerFontesXVerba)
			throws ApplicationBusinessException {

		if (verbaGestao != null && verbaGestao.getIndConvEspecial() !=null && verbaGestao.getIndConvEspecial() && verbaGestao.getNroInterno() == null) {
			throw new ApplicationBusinessException (CadastroVerbaGestaoONExceptionCode.MENSAGEM_CAMPO_OBRIGATORIO_NUMERO_INTERNO);
		}
		
		if (verbaGestao != null && verbaGestao.getNroConvSiafi() != null && verbaGestao.getNroConvSiafi().toString().length() != 6) {
			throw new ApplicationBusinessException (CadastroVerbaGestaoONExceptionCode.MENSAGEM_NUMERO_SIAFI_SEIS_DIGITOS);
		}
		
		validarAlteracaoSituacaoPermitida(verbaGestao);
		validarAlteracaoDescricaoPermitida(verbaGestao);
		validaPeriodoVerbaGestao(verbaGestao);
		validaPeriodoFonteRecurso(inserirFontesXVerba);
		validaPeriodoVigenciaFonteRecurso(verbaGestao, inserirFontesXVerba);
		
		// Valida descricao Etnica
		validaDescricaoUnica(verbaGestao);

		// Valida Intersecao do periodo de vigencia das Fontes de Recurso
		validaInterseccaoVigenciaFonteRecurso(verbaGestao, inserirFontesXVerba);

		// Valida prioridade das Fontes de Recurso
		validaPrioridadeFonteRecurso(inserirFontesXVerba);

		// Validacao da Situacao da Verba de Gestao com a situacao da lista de
		// Fontes de Recurso
		validaSituacaoVerbaXSituacaoFontesRecurso(verbaGestao,inserirFontesXVerba);

		// Persiste a Verba de Gestao
		if(verbaGestao.getSeq() == null){
			getFsoVerbaGestaoDAO().persistir(verbaGestao);	
		} else {
			getFsoVerbaGestaoDAO().merge(verbaGestao);
		}
		getFsoVerbaGestaoDAO().flush();

		for (FsoFontesXVerbaGestao fonteXVerba : removerFontesXVerba) {
			if (fonteXVerba.getSeq() != null) {
				getFsoFontesXVerbaGestaoDAO().removerPorId(fonteXVerba.getSeq());
			}
		}

		getFsoFontesXVerbaGestaoDAO().flush();
		
		FsoVerbaGestao verba = getFsoVerbaGestaoDAO().obterPorChavePrimaria(verbaGestao.getSeq());
		if (verba != null) {
			for (FsoFontesXVerbaGestao fonteXVerba : inserirFontesXVerba) {
				if (fonteXVerba.getSeq() != null) {
					fonteXVerba.setVerbaGestao(verba);
					getFsoFontesXVerbaGestaoDAO().atualizar(fonteXVerba);
				} else {
					fonteXVerba.setVerbaGestao(verba);
					getFsoFontesXVerbaGestaoDAO().persistir(fonteXVerba);
				}
			}
		}
		
		getFsoFontesXVerbaGestaoDAO().flush();
	}

}