/// <summary> /// O método deleta uma orientação curricular e todas as outras ligadas a esse. /// </summary> /// <param name="ORC_OrientacaoCurricular">Entidade da orientação curricular inicial.</param> /// <returns></returns> public static bool DeletarHierarquia(ORC_OrientacaoCurricular entity) { TalkDBTransaction banco = new ORC_OrientacaoCurricularDAO()._Banco.CopyThisInstance(); banco.Open(IsolationLevel.ReadCommitted); try { List <ORC_OrientacaoCurricularNivelAprendizado> ltOrientacaoNivel = ORC_OrientacaoCurricularNivelAprendizadoBO.SelectTodosNivelAprendizadoByOcrId(entity.ocr_id); List <ORC_OrientacaoCurricularNivelAprendizado> ltOrientacaoNivelAtivos = ltOrientacaoNivel.Where(p => p.ocn_situacao != 3).ToList(); // Apaga os níveis de aprendizado da orientação curricular foreach (ORC_OrientacaoCurricularNivelAprendizado orientacaoNivel in ltOrientacaoNivelAtivos) { orientacaoNivel.ocn_situacao = 3; ORC_OrientacaoCurricularNivelAprendizadoBO.Save(orientacaoNivel, banco); } if (VerificaIntegridade(SelecionaUltimoNivel(entity.ocr_id), banco)) { throw new ValidationException("Não é possível excluir a orientação curricular pois possui outros registros ligados a ele."); } return(new ORC_OrientacaoCurricularDAO().DeletarHierarquia(entity.ocr_id)); } catch (Exception ex) { banco.Close(ex); throw ex; } finally { if (banco.ConnectionIsOpen) { banco.Close(); } } }
/// <summary> /// Função recursiva para replicar a orientação curricular e as filhas /// </summary> /// <param name="rows"></param> /// <param name="dtOrientacoes"></param> /// <param name="dtNiveisReplica"></param> /// <param name="tds_id"></param> /// <param name="ocr_idPai"></param> /// <param name="banco"></param> /// <returns></returns> public static bool SalvaFilhos ( DataRow[] rows, DataTable dtOrientacoes, List <sNivelOrientacaoCurricular> dtNiveisReplica, DataTable dtOrientacoesNova, int tds_id, long ocr_idPai, long mat_id, TalkDBTransaction banco ) { ORC_OrientacaoCurricular orientacao; ORC_OrientacaoCurricularNivelAprendizado orientacaoNivelApr; try { string ocr_ids = string.Join(";", rows.GroupBy(p => p["ocr_id"].ToString()).Select(p => p.Key).ToArray()); List <sOrientacaoNivelAprendizado> dtNiveisAprendizado = ORC_OrientacaoCurricularNivelAprendizadoBO.SelecionaPorOrientacaoNivelAprendizado(ocr_ids, 0, banco, GestaoEscolarUtilBO.MinutosCacheLongo); var orientacaoNivelAprendizado = from row in dtNiveisAprendizado group row by row.ocr_id into grupo select new { ocr_id = grupo.Key , ltNiveisAprendizado = grupo.GroupBy(p => p.nap_id).Select(p => p.Key).ToList() }; foreach (DataRow rowFilho in rows) { List <int> ltNiveisAprendizado = orientacaoNivelAprendizado.Any(p => p.ocr_id == Convert.ToInt64(rowFilho["ocr_id"])) ? orientacaoNivelAprendizado.ToList().Find(p => p.ocr_id == Convert.ToInt64(rowFilho["ocr_id"])).ltNiveisAprendizado : new List <int>(); string nvl_id = dtNiveisReplica.Where(p => p.nvl_ordem == Convert.ToInt32(rowFilho["nvl_ordem"])) .Select(p => p.nvl_id.ToString()).FirstOrDefault(); if (!string.IsNullOrEmpty(nvl_id)) { bool existe = dtOrientacoesNova.Rows.Cast <DataRow>().Any(p => p["ocr_codigo"].ToString().Equals(rowFilho["ocr_codigo"].ToString()) && p["ocr_descricao"].ToString().Equals(rowFilho["ocr_descricao"].ToString()) && p["nvl_id"].ToString().Equals(nvl_id)); /* Salva as orientações filhas */ orientacao = new ORC_OrientacaoCurricular { ocr_id = -1, nvl_id = Convert.ToInt32(nvl_id), tds_id = tds_id, mat_id = mat_id, ocr_idSuperior = ocr_idPai, ocr_codigo = rowFilho["ocr_codigo"].ToString(), ocr_descricao = rowFilho["ocr_descricao"].ToString(), ocr_situacao = 1, ocr_dataAlteracao = DateTime.Now, IsNew = true }; if (existe) { string ocr_id_existente = dtOrientacoesNova.Rows.Cast <DataRow>() .Where(p => p["ocr_codigo"].ToString().Equals(rowFilho["ocr_codigo"].ToString()) && p["ocr_descricao"].ToString().Equals(rowFilho["ocr_descricao"].ToString()) && p["nvl_id"].ToString().Equals(nvl_id)) .Select(p => p["ocr_id"].ToString()).FirstOrDefault(); orientacao.IsNew = false; if (!string.IsNullOrEmpty(ocr_id_existente)) { orientacao.ocr_id = Convert.ToInt64(ocr_id_existente); } } Save(orientacao, banco); // Verifica se os filhos possuem mais filhos, se sim, chama a função recursivamente DataRow[] rowsNetos = dtOrientacoes.Select("ocr_idSuperior = " + rowFilho["ocr_id"].ToString()); if (rowsNetos.Length > 0) { SalvaFilhos(rowsNetos, dtOrientacoes, dtNiveisReplica, dtOrientacoesNova, tds_id, orientacao.ocr_id, mat_id, banco); } else { //Remove os níveis de aprendizado já existentes if (existe) { DataTable dtOcn = ORC_OrientacaoCurricularNivelAprendizadoBO.SelectNivelAprendizadoByOcrId(orientacao.ocr_id, 0, banco); foreach (DataRow row in dtOcn.Rows) { ORC_OrientacaoCurricularNivelAprendizado ocn = new ORC_OrientacaoCurricularNivelAprendizado { ocr_id = orientacao.ocr_id, nap_id = Convert.ToInt32(row["nap_id"]), ocn_id = Convert.ToInt32(row["ocn_id"]) }; ORC_OrientacaoCurricularNivelAprendizadoBO.GetEntity(ocn, banco); if (!ocn.IsNew) { ocn.ocn_situacao = 3; //Excluido ocn.ocn_dataAlteracao = DateTime.Now; ORC_OrientacaoCurricularNivelAprendizadoBO.Save(ocn, banco); } } } // Replicar os níveis de aprendizado foreach (int nap_id in ltNiveisAprendizado) { orientacaoNivelApr = new ORC_OrientacaoCurricularNivelAprendizado { ocr_id = orientacao.ocr_id, nap_id = ORC_NivelAprendizadoBO.SelectCursoPeriodoBy_nap_id(nap_id, Convert.ToInt32(nvl_id), banco), ocn_id = -1, ocn_situacao = 1, ocn_dataCriacao = DateTime.Now, ocn_dataAlteracao = DateTime.Now, IsNew = true }; ORC_OrientacaoCurricularNivelAprendizadoBO.Save(orientacaoNivelApr, banco); } } } } return(true); } catch (Exception ex) { //banco.Close(ex); throw ex; } //finally //{ // if (banco.ConnectionIsOpen) // banco.Close(); //} }