/// <summary> /// Elimina el departamento y sus objetivos / acciones asociadas /// </summary> public static void EliminaDepartamento(int iDepartamentoId) { using (Entities c = new Entities()) { using (var dbContextTransaction = c.Database.BeginTransaction()) { try { foreach (OBJETIVO obj in c.CONTENIDO.OfType <OBJETIVO>().Where(o => o.DEPARTAMENTO_ID == iDepartamentoId)) { var results = c.CONTENIDO.OfType <ACCION>().Where(st => st.OBJETIVO_CONTENIDO_ID == obj.CONTENIDO_ID).ToList(); //Borramos acciones c.CONTENIDO.RemoveRange(results); c.SaveChanges(); //Borramos el objetivo c.CONTENIDO.Remove(obj); c.SaveChanges(); } DEPARTAMENTO dep = c.DEPARTAMENTO.Find(iDepartamentoId); if (dep != null) { c.DEPARTAMENTO.Remove(dep); c.SaveChanges(); dbContextTransaction.Commit(); } else { throw new Exception("Departamento no encontrado: " + iDepartamentoId.ToString()); } } catch (Exception ex) { dbContextTransaction.Rollback(); throw ex; } } } }
/// Valida el contenido actual (todos los campos). Si está marcado como tipo de cambio: /// - Alta: se mostrará en la parte pública /// - Modificación: se modificará y se mostrará /// - Elminación: se eliminará (si es un objetivo, eliminará también las acciones dependientes) /// </summary> public void Validar(Entities c) { using (c) { this.ESTADO_VALIDACION_ID = ESTADOS_VALIDACION.VALIDADO; this.OBJETIVO_ESTRATEGICO = this.OBJETIVO_ESTRATEGICO_PDTE_VAL.ToString(); if (this.TIPO_CAMBIO_CONTENIDO_ID == TIPO_CAMBIO_CONTENIDO.ALTA) { this.VISIBLE = true; } else if (this.TIPO_CAMBIO_CONTENIDO_ID == TIPO_CAMBIO_CONTENIDO.MODIFICACION) { } else if (this.TIPO_CAMBIO_CONTENIDO_ID == TIPO_CAMBIO_CONTENIDO.ELIMINADO) { } if (this.TIPO_CAMBIO_CONTENIDO_ID != TIPO_CAMBIO_CONTENIDO.ELIMINADO) { //Si no es eliminar guardamos los cambios this.TIPO_CAMBIO_CONTENIDO_ID = TIPO_CAMBIO_CONTENIDO.SIN_CAMBIOS; this.FECHA_MODIFICACION = DateTime.Now; c.CONTENIDO.Attach(this); c.Entry(this).State = EntityState.Modified; //Siempre es modificación, ya que aunque sea Alta, ya existirá el registro en la BBDD c.SaveChanges(); } else { //Si el cambio es eliminar, eliminamos OBJETIVO.EliminaObjetivo(this.CONTENIDO_ID); } //Actualizamos porcentajes using (var dbContextTransaction = c.Database.BeginTransaction()) { try { Int16 nObjetivos = 0; decimal dPorcentajeAcumulado = 0; var Objetivos = c.CONTENIDO.OfType <OBJETIVO>().Where(o => o.DEPARTAMENTO_ID == this.DEPARTAMENTO_ID); foreach (OBJETIVO obj in Objetivos) { if (obj.VISIBLE && obj.TIPO_CAMBIO_CONTENIDO_ID != 1) { nObjetivos++; if (obj.PORCENTAJE_AVANCE_CALCULADO != null) { dPorcentajeAcumulado += Convert.ToDecimal(obj.PORCENTAJE_AVANCE_CALCULADO); } } } //Actualizamos el % en su departamento DEPARTAMENTO dep = c.DEPARTAMENTO.Find(this.DEPARTAMENTO_ID); dep.PORCENTAJE_AVANCE_CALCULADO = (Math.Round(Decimal.Divide(dPorcentajeAcumulado, nObjetivos), 2)); c.DEPARTAMENTO.Attach(dep); c.Entry(dep).State = EntityState.Modified; c.SaveChanges(); dbContextTransaction.Commit(); } catch (Exception ex) { dbContextTransaction.Rollback(); throw ex; } } } }
/// <summary> /// Valida el contenido actual (todos los campos). Si está marcado como tipo de cambio: /// - Alta: se mostrará en la parte pública /// - Modificación: se modificará y se mostrará /// - Elminación: se eliminará (si es un objetivo, eliminará también las acciones dependientes) /// </summary> public void Validar(Entities c) { bool bModificadoPorcentajeAvance = false; if (this.PORCENTAJE_AVANCE != this.PORCENTAJE_AVANCE_PDTE_VAL) { bModificadoPorcentajeAvance = true; } this.ESTADO_VALIDACION_ID = ESTADOS_VALIDACION.VALIDADO; this.SEGUIMIENTO = this.SEGUIMIENTO_PDTE_VAL.ToString(); //ToString: para que haga una copia de la cadena this.RECURSOS_HUMANOS = this.RECURSOS_HUMANOS_PDTE_VAL.ToString(); this.COSTE_ECONOMICO = this.COSTE_ECONOMICO_PDTE_VAL.ToString(); this.INSTRUMENTOS_ACT = this.INSTRUMENTOS_ACT_PDTE_VAL.ToString(); this.TEMPORALIDAD = this.TEMPORALIDAD_PDTE_VAL.ToString(); this.INDICADOR_SEGUIMIENTO = this.INDICADOR_SEGUIMIENTO_PDTE_VAL.ToString(); //this.ESTADO_SEGUIMIENTO_ID = this.ESTADO_SEGUIMIENTO_ID_PDTE_VAL; this.PORCENTAJE_AVANCE = this.PORCENTAJE_AVANCE_PDTE_VAL; this.ORGANO_RESPONSABLE = this.ORGANO_RESPONSABLE_PDTE_VAL.ToString(); this.MEDIOS_OTROS = this.MEDIOS_OTROS_PDTE_VAL.ToString(); if (this.TIPO_CAMBIO_CONTENIDO_ID == TIPO_CAMBIO_CONTENIDO.ALTA) { this.VISIBLE = true; } else if (this.TIPO_CAMBIO_CONTENIDO_ID == TIPO_CAMBIO_CONTENIDO.MODIFICACION) { } else if (this.TIPO_CAMBIO_CONTENIDO_ID == TIPO_CAMBIO_CONTENIDO.ELIMINADO) { } if (this.TIPO_CAMBIO_CONTENIDO_ID != TIPO_CAMBIO_CONTENIDO.ELIMINADO) { //Si no es eliminar guardamos los cambios this.TIPO_CAMBIO_CONTENIDO_ID = TIPO_CAMBIO_CONTENIDO.SIN_CAMBIOS; this.FECHA_MODIFICACION = DateTime.Now; if (!bModificadoPorcentajeAvance) { using (c) { c.CONTENIDO.Attach(this); c.Entry(this).State = EntityState.Modified; c.SaveChanges(); } } else { //hay que actualizar los % de avance calculados: using (var dbContextTransaction = c.Database.BeginTransaction()) { try { //Guardamos los cambios pendiente c.CONTENIDO.Attach(this); c.Entry(this).State = EntityState.Modified; c.SaveChanges(); //Actualizamos el % en su objetivo Decimal dPorcentajeAcumulado = 0; Int16 nAcciones = 0; var Acciones = c.CONTENIDO.OfType <ACCION>().Where(o => o.OBJETIVO_CONTENIDO_ID == this.OBJETIVO_CONTENIDO_ID); foreach (ACCION acc in Acciones) { if (acc.VISIBLE && !String.IsNullOrEmpty(acc.INSTRUMENTOS_ACT) && acc.TIPO_CAMBIO_CONTENIDO_ID != 1) { nAcciones++; if (acc.PORCENTAJE_AVANCE != null) { dPorcentajeAcumulado += Convert.ToDecimal(acc.PORCENTAJE_AVANCE); } } } this.OBJETIVO.PORCENTAJE_AVANCE_CALCULADO = (Math.Round(Decimal.Divide(dPorcentajeAcumulado, nAcciones), 2)); c.CONTENIDO.Attach(this); c.Entry(this.OBJETIVO).State = EntityState.Modified; c.SaveChanges(); Int16 nObjetivos = 0; dPorcentajeAcumulado = 0; var Objetivos = c.CONTENIDO.OfType <OBJETIVO>().Where(o => o.DEPARTAMENTO_ID == this.DEPARTAMENTO_ID); foreach (OBJETIVO obj in Objetivos) { if (obj.VISIBLE && obj.TIPO_CAMBIO_CONTENIDO_ID != 1) { nObjetivos++; if (obj.PORCENTAJE_AVANCE_CALCULADO != null) { dPorcentajeAcumulado += Convert.ToDecimal(obj.PORCENTAJE_AVANCE_CALCULADO); } } } //Actualizamos el % en su departamento DEPARTAMENTO dep = c.DEPARTAMENTO.Find(this.DEPARTAMENTO_ID); dep.PORCENTAJE_AVANCE_CALCULADO = (Math.Round(Decimal.Divide(dPorcentajeAcumulado, nObjetivos), 2)); //Cálculo de media, pero como se muestra en la parte pública el % de avance según iniciados/2+terminados lo aplicamos aquí: //dep.PORCENTAJE_AVANCE_CALCULADO = DEPARTAMENTO.GetEvolucion(1); c.DEPARTAMENTO.Attach(dep); c.Entry(dep).State = EntityState.Modified; c.SaveChanges(); dbContextTransaction.Commit(); } catch (Exception ex) { dbContextTransaction.Rollback(); throw ex; } } } } else { //Si el cambio es eliminar, eliminamos ACCION a = c.CONTENIDO.OfType <ACCION>().Where(st => st.CONTENIDO_ID == this.CONTENIDO_ID).FirstOrDefault(); c.CONTENIDO.Remove(a); c.SaveChanges(); } }