/// <summary>
        /// Método que se llama al iniciar la vista
        /// </summary>
        /// <param name="sender">Objeto del evento</param>
        /// <param name="e">Argumentos del evento</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack) return;

            // Etapa de análisis
            var listaAnalisis = new IncidenciasBo().ObtenerIncidenciasEnAnalisis();
            gvEtapaAnalisis.DataSource = listaAnalisis;
            gvEtapaAnalisis.DataBind();
            lblEtapaAnalisis.Text = listaAnalisis.Count + "";
            if (listaAnalisis.Count > 0)
            {
                gvEtapaAnalisis.HeaderRow.TableSection = TableRowSection.TableHeader;
            }

            // Etapa de revisión
            var listaRevision = new IncidenciasBo().ObtenerIncidenciasEnRevision();
            gvEtapaEvaluacion.DataSource = listaRevision;
            gvEtapaEvaluacion.DataBind();
            lblAccionesCorrectivas.Text = listaRevision.Count + "";
            if (listaRevision.Count > 0)
            {
                gvEtapaEvaluacion.HeaderRow.TableSection = TableRowSection.TableHeader;
            }

            // Total Incidencias
            var listaIncidencias = new IncidenciasBo().ObtenerIncidencias();
            gvTotalIncidencias.DataSource = listaIncidencias;
            gvTotalIncidencias.DataBind();
            lblTotalIncidencias.Text = listaIncidencias.Count + "";
            if (listaIncidencias.Count > 0)
            {
                gvTotalIncidencias.HeaderRow.TableSection = TableRowSection.TableHeader;
            }
        }
        /// <summary>
        /// Método que almacena las acciones establecidas en la vista
        /// </summary>
        /// <param name="sender">Objeto del evento</param>
        /// <param name="e">Argumentos del evento</param>
        protected void IngresarAnalisis(object sender, EventArgs e)
        {
            var incidencia = new IncidenciasBo().ObtenerIncidencia(int.Parse(btnIngresarAcciones.CommandArgument));
            var analisis = new AnalisisCausa
            {
                IdIncidencia = incidencia.IdIncidencia,
                CausasPotenciales = txtCausas.Text,
                EfectosDeseados = txtEfectosDeseados.Text,
                IdTratamiento = int.Parse(ddlTratamiento.SelectedValue)
            };
            if (!string.IsNullOrEmpty(btnIngresarAcciones.CommandName))
                analisis.IdAnalisisCausa = int.Parse(btnIngresarAcciones.CommandName);
            var ingresoAnalisis = string.IsNullOrEmpty(btnIngresarAcciones.CommandName)
                ? new AnalisisCausasBo().CrearAnalisisCausa(analisis)
                : new AnalisisCausasBo().ActualizarAnalisisCausa(analisis);
            if (ingresoAnalisis > 0)
            {
                var items = "";
                foreach (var item in hdnItems.Value.Split('|'))
                {
                    var accion = new Acciones { IdAnalisisCausa = ingresoAnalisis, DescAccion = item };
                    new AccionesBo().CrearAccion(accion);
                    items += item + "<br/>";
                }

                incidencia.IdEstadoIncidencia = 3;
                new IncidenciasBo().ActualizarIncidencia(incidencia);

                lblTituloModal.Text = "Análisis ingresado";
                var detalle = "<p><b>Se ha ingresado el análisis correctamente:</b></p>";
                detalle += "<p><b>Causas de No Conformidad:</b> " + txtCausas.Text + "</p>";
                detalle += "<p><b>Efectos deseados al finalizar el proceso:</b> " + txtEfectosDeseados.Text + "</p>";
                detalle += "<p><b>Tratamiento:</b> " + ddlTratamiento.SelectedItem.Text + "</p>";
                var dias = new GeneralBo().ObtenerTratamiento(int.Parse(ddlTratamiento.SelectedValue)).DiasPlazo;
                detalle += "<p><b>Fecha Límite:</b> " + incidencia.FechaIngreso.AddDays(dias).ToString("dd-MM-yyyy") + "</p>";
                detalle += "<p><b>Acciones Correctivas:</b> " + items + "</p>";
                detalle += "<p><b>Expediente electrónico:</b> ";
                var documentos = new DocumentosBo().ObtenerDocumentos()
                    .Where(o => incidencia.IdIncidencia.Equals(o.IdIncidencia)).ToList();
                foreach (var doc in documentos)
                {
                    detalle += doc.RutaDocumento + "<br/>";
                }

                detalle += documentos.Count == 0 ? "No existen documentos asociados</p>" : "</p>";
                litDetalle.Text = detalle;
                btnModalAceptar.Attributes.Remove("data-dismiss");
                btnModalAceptar.PostBackUrl = "~/GestionIncidencias.aspx";
            }
            else
            {
                lblTituloModal.Text = "Error al ingresar el análisis";
                litDetalle.Text = "<p><b>Ha ocurrido un error en el ingreso</b></p>";
            }

            ScriptManager.RegisterStartupScript(Page, Page.GetType(), "modalAlerta", "$('#modalAlerta').modal();", true);
            upModal.Update();
        }
        /// <summary>
        /// Método que almacena o actualiza una no conformidad
        /// </summary>
        /// <param name="sender">Objeto del evento</param>
        /// <param name="e">Argumentos del evento</param>
        protected void IngresarIncidencia(object sender, EventArgs e)
        {
            var rutExterno = txtRutExterno.Text.Trim().Replace(".", "").Replace("-", "");
            if (new GeneralBo().ValidarRut(rutExterno))
            {
                var incidencia = new Incidencias
                {
                    RutCreador = int.Parse("15988820"),
                    EsExterno = true,
                    RutExterno = int.Parse(rutExterno.Substring(0, rutExterno.Length - 1)),
                    FechaIngreso = DateTime.Today,
                    IdTipoIncidencia = int.Parse(ddlTipoConformidad.SelectedValue),
                    IdModoDeteccion = int.Parse(ddlModoDeteccion.SelectedValue),
                    FechaIdentificacion = DateTime.Parse(txtFechaIdent.Text),
                    AreaAfectada = txtAreaAfectada.Text,
                    ProcesoAfectado = txtProcesoAfectado.Text,
                    Descripcion = txtDescripcion.Text,
                    IdEstadoIncidencia = 1
                };

                var idIncidencia = new IncidenciasBo().CrearIncidencia(incidencia);
                if (idIncidencia > 0)
                {
                    lblTituloModal.Text = "Guardado correctamente";
                    var detalle = "<p><b>Código de la Incidencia:</b> " + string.Format("{0:00000}", idIncidencia) + "</p>";
                    detalle += "<p><b>Tipo de incidencia:</b> " + ddlTipoConformidad.SelectedItem.Text + "</p>";
                    detalle += "<p><b>Modo de detección:</b> " + ddlModoDeteccion.SelectedItem.Text + "</p>";
                    detalle += "<p><b>Fecha de identificación:</b> " + DateTime.Parse(txtFechaIdent.Text).ToString("dd-MM-yyyy") + "</p>";
                    detalle += "<p><b>Área afectada:</b> " + txtAreaAfectada.Text + "</p>";
                    detalle += "<p><b>Proceso afectado:</b> " + txtProcesoAfectado.Text + "</p>";
                    detalle += "<p><b>Descripción de la No Conformidad:</b> " + txtDescripcion.Text + "</p>";
                    litDetalle.Text = detalle;
                    btnModalAceptar.Attributes.Remove("data-dismiss");
                    btnModalAceptar.PostBackUrl = "Index.aspx";
                }
                else
                {
                    lblTituloModal.Text = "Error al guardar";
                    litDetalle.Text = "<p><b>Ha ocurrido un error al guardar</b></p>";
                }
            }
            else
            {
                lblTituloModal.Text = "RUT no válido";
                litDetalle.Text = "<p><b>Por favor verifique el RUT ingresado</b></p>";
            }

            ScriptManager.RegisterStartupScript(Page, Page.GetType(), "modalIngresar", "$('#modalIngresar').modal();", true);
            upModal.Update();
        }
        /// <summary>
        /// Método que finaliza la revisión de cumplimiento
        /// </summary>
        /// <param name="sender">Objeto del evento</param>
        /// <param name="e">Argumentos del evento</param>
        protected void FinalizarOnClick(object sender, EventArgs e)
        {
            var incidencia = new IncidenciasBo().ObtenerIncidencia(int.Parse(btnFinalizar.CommandArgument));
            incidencia.IdEstadoIncidencia = 6;
            if (new IncidenciasBo().ActualizarIncidencia(incidencia) > 0)
            {
                foreach (ListItem item in chklAcciones.Items)
                {
                    var accion = new AccionesBo().ObtenerAccion(int.Parse(item.Value));
                    accion.IdEstado = item.Selected ? 1 : 2;
                    new AccionesBo().ActualizarAccion(accion);
                }

                var evaluacion = new EvaluacionCumplimiento
                {
                    IdAnalisisCausa = int.Parse(btnFinalizar.CommandName),
                    Observacion = txtObservaciones.Text,
                    FechaEv = DateTime.Today
                };
                if (new EvaluacionesCumplimientoBo().CrearEvaluacionCumplimiento(evaluacion) > 0)
                {
                    lblTituloModal.Text = "Incidencia Finalizada";
                    litDetalle.Text = string.Format("<p><b>La incidencia {0:00000} se ha establecido como finalizada</b></p>", incidencia.IdIncidencia);
                    btnModalAceptar.Attributes.Add("formnovalidate", "");
                    btnModalAceptar.Attributes.Remove("data-dismiss");
                    btnModalAceptar.PostBackUrl = "~/GestionIncidencias.aspx";
                }
                else
                {
                    lblTituloModal.Text = "Error al cambiar la incidencia";
                    litDetalle.Text = "<p><b>Ha ocurrido un error al cambiar el estado de la incidencia</b></p>";
                }
            }
            else
            {
                lblTituloModal.Text = "Error al cambiar la incidencia";
                litDetalle.Text = "<p><b>Ha ocurrido un error al cambiar el estado de la incidencia</b></p>";
            }

            ScriptManager.RegisterStartupScript(Page, Page.GetType(), "modalAlerta", "$('#modalAlerta').modal();", true);
            upModal.Update();
        }
        /// <summary>
        /// Método que almacena o actualiza una no conformidad
        /// </summary>
        /// <param name="sender">Objeto del evento</param>
        /// <param name="e">Argumentos del evento</param>
        protected void IngresarIncidencia(object sender, EventArgs e)
        {
            var incidencia = new Incidencias
            {
                RutCreador = int.Parse(Session["RutUsuario"] + ""),
                EsExterno = false,
                FechaIngreso = DateTime.Today,
                IdTipoIncidencia = int.Parse(ddlTipoConformidad.SelectedValue),
                IdModoDeteccion = int.Parse(ddlModoDeteccion.SelectedValue),
                FechaIdentificacion = DateTime.Parse(txtFechaIdent.Text),
                AreaAfectada = txtAreaAfectada.Text,
                ProcesoAfectado = txtProcesoAfectado.Text,
                Descripcion = txtDescripcion.Text,
                IdEstadoIncidencia = 1
            };

            var idIncidencia = new IncidenciasBo().CrearIncidencia(incidencia);
            if (idIncidencia > 0)
            {
                lblTituloModal.Text = "Guardado correctamente";
                var detalle = "<p><b>Código de la Incidencia:</b> " + string.Format("{0:00000}", idIncidencia) + "</p>";
                detalle += "<p><b>Tipo de incidencia:</b> " + ddlTipoConformidad.SelectedItem.Text + "</p>";
                detalle += "<p><b>Modo de detección:</b> " + ddlModoDeteccion.SelectedItem.Text + "</p>";
                detalle += "<p><b>Fecha de identificación:</b> " + DateTime.Parse(txtFechaIdent.Text).ToString("dd-MM-yyyy") + "</p>";
                detalle += "<p><b>Área afectada:</b> " + txtAreaAfectada.Text + "</p>";
                detalle += "<p><b>Proceso afectado:</b> " + txtProcesoAfectado.Text + "</p>";
                detalle += "<p><b>Descripción de la No Conformidad:</b> " + txtDescripcion.Text + "</p>";
                litDetalle.Text = detalle;
            }
            else
            {
                lblTituloModal.Text = "Error al guardar";
                litDetalle.Text = "<p><b>Ha ocurrido un error al guardar</b></p>";
            }

            ScriptManager.RegisterStartupScript(Page, Page.GetType(), "modalIngresar", "$('#modalIngresar').modal();", true);
            upModal.Update();
        }
        /// <summary>
        /// Método que inicia la vista
        /// </summary>
        /// <param name="sender">Objeto del evento</param>
        /// <param name="e">Argumentos del evento</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack) return;

            #region Carga DDL Tratamientos

            var generalBo = new GeneralBo();
            ddlTratamiento.DataSource = generalBo.ObtenerTratamientos();
            ddlTratamiento.DataTextField = generalBo.Text;
            ddlTratamiento.DataValueField = generalBo.Value;
            ddlTratamiento.DataBind();

            ddlTratamiento.Items.Insert(0, new ListItem("Seleccione una opción...", ""));
            ddlTratamiento.Attributes.Add("required", "required");

            #endregion

            if (string.IsNullOrEmpty(Request.QueryString["IdIncidencia"])) return;
            var incidencia = new IncidenciasBo().ObtenerIncidencia(int.Parse(Request.QueryString["IdIncidencia"]));
            if (incidencia == null) return;

            btnIngresarAcciones.CommandArgument = incidencia.IdIncidencia + "";
            lblCodSNC.Text = string.Format("{0:00000}", incidencia.IdIncidencia);
            var rut = incidencia.EsExterno ? incidencia.RutExterno ?? 1 : incidencia.RutCreador;
            lblRutIngreso.Text = string.Format("{0:N0}-", rut) + new GeneralBo().ObtenerDigitoVerificador(rut);
            lblFechaIngreso.Text = incidencia.FechaIngreso.ToString("dd-MM-yyyy");
            btnInvalidar.CommandArgument = incidencia.FechaIngreso.ToString("yyyy-MM-dd");
            lblFechaIdentificacion.Text = incidencia.FechaIdentificacion.ToString("dd-MM-yyyy");
            lblEstado.Text = new GeneralBo().ObtenerEstadoIncidencia(incidencia.IdEstadoIncidencia).Descripcion;
            lblTipo.Text = new GeneralBo().ObtenerTipoIncidencia(incidencia.IdEstadoIncidencia).Descripcion;
            lblModoDetect.Text = new GeneralBo().ObtenerModoDeteccion(incidencia.IdModoDeteccion).Descripcion;
            lblAreaAfectada.Text = incidencia.AreaAfectada;
            txtDetalle.Text = incidencia.Descripcion;
            txtDetalle.Attributes.Add("readonly", "readonly");

            var reanalisis = new AnalisisCausasBo().ObtenerAnalisisExistente(incidencia.IdIncidencia);
            if (reanalisis != null && incidencia.IdEstadoIncidencia == 5)
            {
                txtCausas.Text = reanalisis.CausasPotenciales;
                txtEfectosDeseados.Text = reanalisis.EfectosDeseados;
                ddlTratamiento.SelectedValue = reanalisis.IdTratamiento.ToString();
                var dias = generalBo.ObtenerTratamiento(reanalisis.IdTratamiento).DiasPlazo;
                lblFechaLimite.Text = incidencia.FechaIngreso.AddDays(dias).ToString("dd-MM-yyyy");
                lbxAcciones.DataSource = new AccionesBo().ObtenerAccionesPorAnalisis(reanalisis.IdAnalisisCausa);
                lbxAcciones.DataTextField = "DescAccion";
                lbxAcciones.DataValueField = "DescAccion";
                lbxAcciones.DataBind();

                btnIngresarAcciones.CommandName = reanalisis.IdAnalisisCausa + "";
            }

            gvDocumentos.DataSource = new DocumentosBo().ObtenerDocumentosPorIncidencia(incidencia.IdIncidencia);
            gvDocumentos.DataBind();
        }
        /// <summary>
        /// Método que invalida el análisis
        /// </summary>
        /// <param name="sender">Objeto del evento</param>
        /// <param name="e">Argumentos del evento</param>
        protected void InvalidarOnClick(object sender, EventArgs e)
        {
            var incidencia = new IncidenciasBo().ObtenerIncidencia(int.Parse(btnIngresarAcciones.CommandArgument));
            incidencia.IdEstadoIncidencia = 2;
            incidencia.Descripcion += "\nInvalida: " + txtCausas.Text;
            if (new IncidenciasBo().ActualizarIncidencia(incidencia) > 0)
            {
                lblTituloModal.Text = "Incidencia invalidada";
                var detalle = string.Format("<p><b>Se ha invalidado la incidencia {0:00000} </b></p>", incidencia.IdIncidencia);
                litDetalle.Text = detalle + "<p><b>La causa es:</b> " + txtCausas.Text + "</p>";
                btnModalAceptar.Attributes.Add("formnovalidate", "");
                btnModalAceptar.Attributes.Remove("data-dismiss");
                btnModalAceptar.PostBackUrl = "~/GestionIncidencias.aspx";
            }
            else
            {
                lblTituloModal.Text = "Error al actualizar la incidencia";
                litDetalle.Text = "<p><b>Ha ocurrido un error al actualizar</b></p>";
            }

            ScriptManager.RegisterStartupScript(Page, Page.GetType(), "modalAlerta", "$('#modalAlerta').modal();", true);
            upModal.Update();
        }
        /// <summary>
        /// Método que cambia el estado de la incidencia a reanálisis
        /// </summary>
        /// <param name="sender">Objeto del evento</param>
        /// <param name="e">Argumentos del evento</param>
        protected void ReAnalizarOnClick(object sender, EventArgs e)
        {
            var incidencia = new IncidenciasBo().ObtenerIncidencia(int.Parse(btnFinalizar.CommandArgument));
            incidencia.IdEstadoIncidencia = 5;
            if (new IncidenciasBo().ActualizarIncidencia(incidencia) > 0)
            {
                lblTituloModal.Text = "Incidencia en Reanálisis";
                litDetalle.Text = string.Format("<p><b>La incidencia {0:00000} ha cambiado de estado a Reanálisis</b></p>", incidencia.IdIncidencia);
                btnModalAceptar.Attributes.Add("formnovalidate", "");
                btnModalAceptar.Attributes.Remove("data-dismiss");
                btnModalAceptar.PostBackUrl = "~/GestionIncidencias.aspx";
            }
            else
            {
                lblTituloModal.Text = "Error al cambiar la incidencia";
                litDetalle.Text = "<p><b>Ha ocurrido un error al cambiar el estado de la incidencia</b></p>";
            }

            ScriptManager.RegisterStartupScript(Page, Page.GetType(), "modalAlerta", "$('#modalAlerta').modal();", true);
            upModal.Update();
        }
        /// <summary>
        /// Método que se llama al iniciar la vista
        /// </summary>
        /// <param name="sender">Objeto del evento</param>
        /// <param name="e">Argumentos del evento</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack) return;

            if (string.IsNullOrEmpty(Request.QueryString["IdIncidencia"])) return;
            var incidencia = new IncidenciasBo().ObtenerIncidencia(int.Parse(Request.QueryString["IdIncidencia"]));
            if (incidencia == null) return;

            btnFinalizar.CommandArgument = incidencia.IdIncidencia + "";
            lblCodSNC.Text = string.Format("{0:00000}", incidencia.IdIncidencia);
            var rut = incidencia.EsExterno ? incidencia.RutExterno ?? 1 : incidencia.RutCreador;
            lblRutIngreso.Text = string.Format("{0:N0}-", rut) + new GeneralBo().ObtenerDigitoVerificador(rut);
            lblFechaIngreso.Text = incidencia.FechaIngreso.ToString("dd-MM-yyyy");
            lblFechaIdentificacion.Text = incidencia.FechaIdentificacion.ToString("dd-MM-yyyy");
            lblEstado.Text = new GeneralBo().ObtenerEstadoIncidencia(incidencia.IdEstadoIncidencia).Descripcion;
            lblTipo.Text = new GeneralBo().ObtenerTipoIncidencia(incidencia.IdEstadoIncidencia).Descripcion;
            lblModoDetect.Text = new GeneralBo().ObtenerModoDeteccion(incidencia.IdModoDeteccion).Descripcion;
            lblAreaAfectada.Text = incidencia.AreaAfectada;
            lblDetalle.Text = incidencia.Descripcion;

            var idAnalisis = new AnalisisCausasBo().ObtenerAnalisisExistente(incidencia.IdIncidencia).IdAnalisisCausa;
            var analisis = new AnalisisCausasBo().ObtenerAnalisisCausa(idAnalisis);
            if (analisis == null) return;
            lblCausasPotenciales.Text = analisis.CausasPotenciales;
            lblEfectosDeseados.Text = analisis.EfectosDeseados;
            var dias = new GeneralBo().ObtenerTratamiento(analisis.IdTratamiento).DiasPlazo;
            lblFechaLimite.Text = incidencia.FechaIngreso.AddDays(dias).ToString("dd-MM-yyyy");
            lblTratamiento.Text = new GeneralBo().ObtenerTratamiento(analisis.IdTratamiento).Descripcion;
            gvDocumentos.DataSource = new DocumentosBo().ObtenerDocumentosPorIncidencia(incidencia.IdIncidencia);
            gvDocumentos.DataBind();
            btnFinalizar.CommandName = analisis.IdAnalisisCausa + "";

            chklAcciones.DataSource = new AccionesBo().ObtenerAccionesPorAnalisis(analisis.IdAnalisisCausa);
            chklAcciones.DataTextField = "DescAccion";
            chklAcciones.DataValueField = "IdAccion";
            chklAcciones.DataBind();

            // Cálculo de días restantes
            var diasRestantes = (incidencia.FechaIngreso.AddDays(dias) - DateTime.Today).Days;
            var classDias = "progress-bar progress-bar-striped";
            if (diasRestantes > 0)
            {
                divProgress.Style.Add("width", "100%");
                if (diasRestantes <= 3)
                {
                    divProgress.Style.Add("width", diasRestantes * 10 + "%");
                    classDias += " progress-bar-danger";
                }
                else if (diasRestantes <= 6)
                {
                    divProgress.Style.Add("width", diasRestantes * 10 + "%");
                    classDias += " progress-bar-warning";
                }
                else if (diasRestantes <= 10)
                {
                    divProgress.Style.Add("width", diasRestantes * 10 + "%");
                    classDias += " progress-bar-success";
                }

                lblDiasRestantes.Text = diasRestantes + "";
                divProgress.Attributes.Add("class", classDias);
            }
            else
            {
                lblDiasRestantes.Text = "0";
                divProgress.Attributes.Add("class", classDias + " progress-bar-danger");
                divProgress.Style.Add("width", "100%");
            }
        }