using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Web.UI; using System.Web.UI.WebControls; using SIG.Web.AppCode.Configuration; using SIG.Web.AppCode.Infrastructure.WebForms; using SIG.Web.AppCode.Models.Common; using SIG.Web.AppCode.Models.Tramites; using SIG.Web.AppCode.Utilities; using SIG.Web.AppCode.Security; using SIG.Web.AppCode.SigControls; namespace SIG.Web.Pages.Desarrolladores { public partial class Tramites : ClsPaginaBase { #region Propiedades private ModeloFiltroTableroTramites FiltrosTableroActuales { get { return ViewState["FiltrosTableroActuales"] as ModeloFiltroTableroTramites ?? new ModeloFiltroTableroTramites(); } set { ViewState["FiltrosTableroActuales"] = value; } } // Permite reconstruir las filas agrupadoras sin repetir la consulta en cada postback. private List FilasTableroActuales { get { return ViewState["FilasTableroActuales"] as List ?? new List(); } set { ViewState["FilasTableroActuales"] = value; } } #endregion protected override void OnInit(EventArgs argumentos) { base.OnInit(argumentos); UcEstatusSolicitud.ObtenerCondiciones = UcCondicionesSolicitud.Capturar; bool esCliente = CurrentUser.EsDesarrollador; PanelFiltroDepartamento.Visible = !esCliente; PestanaSeguimientoCondiciones.Visible = !esCliente; GvTramites.Columns[1].Visible = !esCliente; CampoSoloBloqueados.Visible = !esCliente; DdlAgrupacion.Items.Add(new ListItem( "Por trámite", ((byte)AgrupacionTableroTramites.PorTramite).ToString(CultureInfo.InvariantCulture))); if (!esCliente) { DdlAgrupacion.Items.Add(new ListItem( "Por cliente", ((byte)AgrupacionTableroTramites.PorCliente).ToString(CultureInfo.InvariantCulture))); } } protected void Page_Load(object origen, EventArgs argumentos) { ScriptManager.GetCurrent(Page).RegisterAsyncPostBackControl(UcFiltros); if (!IsPostBack) { CargarOpcionesDepartamento(); CargarTablero(); return; } EnlazarTablero(); } protected void DdlDepartamentoTramites_Cambio(object origen, EventArgs argumentos) { EnlazarTablero(); UpTablero.Update(); } private void CargarOpcionesDepartamento() { if (CurrentUser.EsDesarrollador) return; var resultado = AppServices.TramiteCatalogService.ListDepartamentos( CurrentUser.CveUsuario, CurrentUser.NombreDominio); if (!resultado.Success) { Alert(resultado.UserMessage, TipoMensaje.MsgAdvertencia); return; } DdlDepartamentoTramites.Items.Clear(); DdlDepartamentoTramites.Items.Add(new ListItem("Todos los departamentos", "-1")); foreach (var depto in resultado.Data ?? new List()) DdlDepartamentoTramites.Items.Add(new ListItem(depto.Departamento, depto.CveDepartamento.ToString(CultureInfo.InvariantCulture))); } protected void UcFiltros_MostrarFiltros(object origen, EventArgs argumentos) { SincronizarModalFiltros(); UpFiltros.Update(); RegistraScript( "SIGTableroTramites.mostrarModal('ModalFiltrosTramites');", "MostrarFiltrosTramites"); } protected void UcFiltros_Consultar(object origen, EventArgs argumentos) { CargarTablero(); UpTablero.Update(); } protected void UcFiltros_FiltrosCambiados(object origen, EventArgs argumentos) { IList filtrosVisibles = UcFiltros.GetFiltros(); ModeloFiltroTableroTramites filtros = FiltrosTableroActuales; if (!filtrosVisibles.Any(filtro => filtro.Nombre == "Agrupacion")) { filtros.Agrupacion = AgrupacionTableroTramites.PorTramite; } if (!filtrosVisibles.Any(filtro => filtro.Nombre == "Fraccionamiento")) { filtros.CveFraccionamiento = null; } filtros.SoloActivos = filtrosVisibles.Any(filtro => filtro.Nombre == "SoloActivos"); filtros.SoloBloqueados = !CurrentUser.EsDesarrollador && filtrosVisibles.Any(filtro => filtro.Nombre == "SoloBloqueados"); if (!filtrosVisibles.Any(filtro => filtro.Nombre == "Estatus")) { filtros.EstatusSeleccionados.Clear(); filtros.MostrarAutorizados = false; filtros.MostrarCancelados = false; } FiltrosTableroActuales = filtros; CargarTablero(); UpTablero.Update(); } protected void BtnAplicarFiltros_Click(object origen, EventArgs argumentos) { byte cveAgrupacion; int cveFraccionamiento; if (!byte.TryParse(DdlAgrupacion.SelectedValue, out cveAgrupacion) || !Enum.IsDefined(typeof(AgrupacionTableroTramites), cveAgrupacion)) { Alert("Seleccione una agrupación válida.", TipoMensaje.MsgAdvertencia); return; } FiltrosTableroActuales = new ModeloFiltroTableroTramites { Agrupacion = (AgrupacionTableroTramites)cveAgrupacion, CveFraccionamiento = int.TryParse(DdlFraccionamiento.SelectedValue, out cveFraccionamiento) && cveFraccionamiento > 0 ? (int?)cveFraccionamiento : null, EstatusSeleccionados = LstEstatus.Items.Cast() .Where(estatus => estatus.Selected) .Select(estatus => int.Parse(estatus.Value, CultureInfo.InvariantCulture)).ToList(), MostrarAutorizados = ChkMostrarAutorizados.Checked, MostrarCancelados = ChkMostrarCancelados.Checked, SoloActivos = ChkSoloActivos.Checked, SoloBloqueados = !CurrentUser.EsDesarrollador && ChkSoloBloqueados.Checked }; bool consultaCorrecta = CargarTablero(); UpTablero.Update(); if (consultaCorrecta) { RegistraScript( "SIGTableroTramites.ocultarModal('ModalFiltrosTramites');", "OcultarFiltrosTramites"); } } protected void GvTramites_FilaEnlazada(object origen, GridViewRowEventArgs argumentos) { if (argumentos.Row.RowType != DataControlRowType.DataRow) { return; } var solicitud = (ModeloFilaTableroTramites)argumentos.Row.DataItem; for (int indiceCelda = 0; indiceCelda < argumentos.Row.Cells.Count; indiceCelda++) { string claseCelda = indiceCelda == 0 ? "sig-tramites-columna-grupo" : "sig-tramites-columna-normal"; argumentos.Row.Cells[indiceCelda].CssClass = (argumentos.Row.Cells[indiceCelda].CssClass + " " + claseCelda).Trim(); } argumentos.Row.Attributes["data-cve-agrupacion"] = solicitud.CveAgrupacion.ToString(CultureInfo.InvariantCulture); argumentos.Row.Attributes["data-nivel"] = solicitud.Nivel.ToString(CultureInfo.InvariantCulture); if (solicitud.Nivel == 2) { argumentos.Row.CssClass = "sig-tramites-agrupacion"; return; } argumentos.Row.CssClass = "sig-proceso-" + solicitud.EstatusProceso.ToString(CultureInfo.InvariantCulture); argumentos.Row.ToolTip = solicitud.NombreEstatusProceso; if (!CurrentUser.EsDesarrollador) ColorDepartamentoTramite.Aplicar( argumentos.Row.FindControl("EtiquetaTipoTramite") as Label, solicitud.ColorDepartamento); var enlaceFraccionamiento = (HyperLink)argumentos.Row.FindControl("EnlaceFraccionamiento"); var nombreFraccionamientoEtapa = (Literal)enlaceFraccionamiento.FindControl("NombreFraccionamientoEtapa"); nombreFraccionamientoEtapa.Text = string.Join(" · ", new[] { solicitud.Fraccionamiento, solicitud.Etapa } .Where(nombre => !string.IsNullOrWhiteSpace(nombre))); if (solicitud.CveFraccionamiento.GetValueOrDefault() > 0) { enlaceFraccionamiento.NavigateUrl = ResolveUrl( "~/Pages/Fraccionamientos/FraccionamientoDetalle.aspx?id=" + solicitud.CveFraccionamiento.Value.ToString(CultureInfo.InvariantCulture)); } foreach (string nombreBoton in new[] { "BtnEditarEstatus", "BtnDocumentos", "BtnComentarios" }) { var boton = argumentos.Row.FindControl(nombreBoton) as LinkButton; if (boton != null) { boton.Attributes["data-sig-panel-abrir"] = "#" + PanelSeguimiento.ClientID; // Ejecuta el postback de WebForms; el evento del panel cancela el href para no duplicarlo. boton.OnClientClick = Page.ClientScript.GetPostBackEventReference(boton, string.Empty) + ";"; ScriptManager.GetCurrent(Page).RegisterAsyncPostBackControl(boton); } } } protected void GvTramites_Comando(object origen, GridViewCommandEventArgs argumentos) { if (argumentos.CommandName != "EditarEstatus" && argumentos.CommandName != "Documentos" && argumentos.CommandName != "Comentarios") { return; } var control = argumentos.CommandSource as Control; var fila = control == null ? null : control.NamingContainer as GridViewRow; if (fila == null || fila.RowIndex < 0 || fila.RowIndex >= GvTramites.DataKeys.Count) { Alert("Seleccione una solicitud válida.", TipoMensaje.MsgAdvertencia); return; } DataKey claveFila = GvTramites.DataKeys[fila.RowIndex]; int cveSolicitud; if (Convert.ToInt32(claveFila.Values["Nivel"]) != 1 || !int.TryParse(Convert.ToString(claveFila.Values["CveSolicitud"]), out cveSolicitud)) { Alert("Seleccione una solicitud válida.", TipoMensaje.MsgAdvertencia); return; } string pestana = argumentos.CommandName == "Comentarios" ? "comentarios" : argumentos.CommandName == "Documentos" ? "documentos" : "estatus"; AbrirSeguimiento(cveSolicitud, null, pestana); } protected void SeguimientoTramite_Cambiado(object origen, EventArgs argumentos) { CargarTablero(); UpTablero.Update(); } private bool CargarTablero() { DbResult resultado = AppServices.TramiteSolicitudService.ConsultarTablero( FiltrosTableroActuales, CurrentUser.CveUsuario, CurrentUser.NombreDominio); if (!resultado.Success || resultado.Data == null) { FilasTableroActuales = new List(); EnlazarTablero(); Alert( resultado.Success ? "No se pudo obtener el tablero." : resultado.UserMessage, TipoMensaje.MsgError); return false; } LstEstatus.Items.Clear(); foreach (TramiteSolicitudEstatusOptionModel estatus in resultado.Data.Estatus) { var opcionEstatus = new ListItem( estatus.EstatusSolicitud, estatus.CveEstatusSolicitud.ToString(CultureInfo.InvariantCulture)); opcionEstatus.Attributes["data-codigo-estatus"] = estatus.Codigo; LstEstatus.Items.Add(opcionEstatus); } FilasTableroActuales = resultado.Data.Filas; if (!CurrentUser.EsDesarrollador) { var deptos = AppServices.TramiteCatalogService.ListarDepartamentosPorTipo( CurrentUser.CveUsuario, CurrentUser.NombreDominio); if (!deptos.Success) { FilasTableroActuales = new List(); EnlazarTablero(); Alert(deptos.UserMessage, TipoMensaje.MsgAdvertencia); return false; } var asignaciones = (deptos.Data ?? new List()) .ToDictionary(item => item.CveTipoTramite); foreach (var fila in FilasTableroActuales.Where(f => f.Nivel == 1 && f.CveTipoTramite.HasValue)) { TipoTramiteDepartamentoModel depto; if (asignaciones.TryGetValue(fila.CveTipoTramite.Value, out depto)) { fila.CveDepartamento = depto.CveDepartamento; fila.ColorDepartamento = depto.Color; } } } DdlFraccionamiento.DataSource = resultado.Data.Fraccionamientos; DdlFraccionamiento.DataTextField = "Fraccionamiento"; DdlFraccionamiento.DataValueField = "CveFraccionamiento"; DdlFraccionamiento.DataBind(); DdlFraccionamiento.Items.Insert(0, new ListItem("Todos", "")); SincronizarModalFiltros(); SincronizarFiltrosActivos(); EnlazarTablero(); return true; } private void EnlazarTablero() { IEnumerable filas = FilasTableroActuales; int departamento; if (!CurrentUser.EsDesarrollador && int.TryParse(DdlDepartamentoTramites.SelectedValue, out departamento) && departamento > 0) { var resultados = filas.Where(f => f.Nivel == 1 && f.CveDepartamento == departamento).ToList(); var grupos = new HashSet(resultados.Select(f => f.CveAgrupacion)); filas = filas.Where(f => f.Nivel == 1 ? f.CveDepartamento == departamento : grupos.Contains(f.CveAgrupacion)); } GvTramites.DataSource = filas.ToList(); GvTramites.DataBind(); } private void SincronizarModalFiltros() { ModeloFiltroTableroTramites filtros = FiltrosTableroActuales; DdlAgrupacion.SelectedValue = ((byte)filtros.Agrupacion).ToString(CultureInfo.InvariantCulture); string cveFraccionamiento = filtros.CveFraccionamiento.HasValue ? filtros.CveFraccionamiento.Value.ToString(CultureInfo.InvariantCulture) : ""; DdlFraccionamiento.ClearSelection(); ListItem opcion = DdlFraccionamiento.Items.FindByValue(cveFraccionamiento); if (opcion != null) { opcion.Selected = true; } foreach (ListItem estatus in LstEstatus.Items) { estatus.Selected = filtros.EstatusSeleccionados.Contains( int.Parse(estatus.Value, CultureInfo.InvariantCulture)); } ChkMostrarAutorizados.Checked = filtros.MostrarAutorizados; ChkMostrarCancelados.Checked = filtros.MostrarCancelados; LstEstatus.Attributes["data-sig-estatus-anteriores"] = string.Join(",", filtros.EstatusSeleccionados); ChkSoloActivos.Checked = filtros.SoloActivos; ChkSoloBloqueados.Checked = !CurrentUser.EsDesarrollador && filtros.SoloBloqueados; } private void SincronizarFiltrosActivos() { ModeloFiltroTableroTramites filtros = FiltrosTableroActuales; var filtrosActivos = new List { new FiltroActivo { Nombre = "Agrupacion", Titulo = "Agrupación", Descripcion = DdlAgrupacion.SelectedItem.Text, Orden = 1, Visible = true } }; if (filtros.CveFraccionamiento.HasValue) { filtrosActivos.Add(new FiltroActivo { Nombre = "Fraccionamiento", Titulo = "Fraccionamiento", Descripcion = DdlFraccionamiento.SelectedItem.Text, Orden = 2, Visible = true }); } if (filtros.SoloActivos) { filtrosActivos.Add(new FiltroActivo { Nombre = "SoloActivos", Titulo = "Solo activos", Descripcion = "Tipos de trámite activos", Orden = 3, Visible = true }); } if (filtros.SoloBloqueados && !CurrentUser.EsDesarrollador) { filtrosActivos.Add(new FiltroActivo { Nombre = "SoloBloqueados", Titulo = "Solo bloqueados", Descripcion = "Pendiente de habilitar", Orden = 4, Visible = true }); } if (filtros.EstatusSeleccionados.Count > 0 || filtros.MostrarAutorizados || filtros.MostrarCancelados) { filtrosActivos.Add(new FiltroActivo { Nombre = "Estatus", Titulo = "Estatus", Descripcion = string.Join(", ", LstEstatus.Items.Cast() .Where(estatus => estatus.Selected) .Select(estatus => estatus.Text)), Orden = 5, Visible = true }); } UcFiltros.SetFiltros(filtrosActivos); } private int CveSolicitudSeguimiento { get { return (int?)ViewState["CveSolicitudSeguimiento"] ?? 0; } set { ViewState["CveSolicitudSeguimiento"] = value; } } private int CveFraccionamientoSeguimiento { get { return (int?)ViewState["CveFraccionamientoSeguimiento"] ?? 0; } set { ViewState["CveFraccionamientoSeguimiento"] = value; } } private void AbrirSeguimiento(int cveSolicitud, int? cveFraccionamiento = null, string seccion = null) { DbResult resultado = AppServices.TramiteSolicitudService.ObtenerContextoCambioEstatus( cveSolicitud, CurrentUser.CveUsuario, CurrentUser.NombreDominio); if (!resultado.Success || resultado.Data == null) { Alert(resultado.UserMessage, TipoMensaje.MsgAdvertencia); return; } ModeloContextoCambioEstatus contexto = resultado.Data; if (cveFraccionamiento.HasValue && contexto.Solicitud.CveFraccionamiento != cveFraccionamiento.Value) { Alert("La solicitud no pertenece al fraccionamiento.", TipoMensaje.MsgAdvertencia); return; } CveSolicitudSeguimiento = cveSolicitud; CveFraccionamientoSeguimiento = contexto.Solicitud.CveFraccionamiento; TituloSeguimiento.Text = contexto.Solicitud.Folio + " · " + contexto.Solicitud.TipoTramite; NombreFraccionamientoEtapaSeguimiento.Text = string.Join(" · ", new[] { contexto.Solicitud.Fraccionamiento, contexto.Solicitud.Etapa } .Where(nombre => !string.IsNullOrWhiteSpace(nombre))); EnlaceFraccionamientoSeguimiento.NavigateUrl = ResolveUrl( "~/Pages/Fraccionamientos/FraccionamientoDetalle.aspx?id=" + CveFraccionamientoSeguimiento.ToString(CultureInfo.InvariantCulture)); PestanaSeguimientoCondiciones.Visible = !CurrentUser.EsDesarrollador; if (!CurrentUser.EsDesarrollador) { UcCondicionesSolicitud.Cargar(contexto); } UcEstatusSolicitud.Cargar(contexto); UcDocumentosSolicitud.Cargar(cveSolicitud, CveFraccionamientoSeguimiento, contexto.Documentos); UcComentariosSolicitud.Cargar(cveSolicitud); UcSupervisionesSolicitud.CveFraccionamiento = CveFraccionamientoSeguimiento; UcSupervisionesSolicitud.CveFraccionamientoEtapa = contexto.Solicitud.CveFraccionamientoEtapa; UcSupervisionesSolicitud.CveSolicitud = cveSolicitud; UcSupervisionesSolicitud.Cargar(); CargarAccionesPendientesSeguimiento(); UpEncabezadoSeguimiento.Update(); MostrarSeguimiento(seccion); } private void MostrarSeguimiento(string seccion = null) { if (CurrentUser.EsDesarrollador && seccion == "condiciones") { seccion = null; } int indice = seccion == "condiciones" ? 1 : seccion == "documentos" ? 2 : seccion == "comentarios" ? 3 : seccion == "supervisiones" ? 4 : 0; PestanasSeguimiento.ActiveTabIndex = indice; // El clic abre el panel. Restaurarlo sólo si una carga de archivo recargó la página. if (!ScriptManager.GetCurrent(Page).IsInAsyncPostBack) { RegistraScript("SIGPanelLateral.abrir('" + PanelSeguimiento.ClientID + "');"); return; } RegistraScript( "$find('" + PestanasSeguimiento.ClientID + "').set_activeTabIndex(" + indice.ToString(CultureInfo.InvariantCulture) + ");"); } private void ActualizarSeguimiento() { CargarAccionesPendientesSeguimiento(); UpEncabezadoSeguimiento.Update(); SeguimientoTramite_Cambiado(this, EventArgs.Empty); } protected void EstatusSeguimiento_SeleccionCambiada(object origen, EventArgs argumentos) { UcCondicionesSolicitud.AjustarEstatus(UcEstatusSolicitud.EstatusSeleccionado); } protected void EstatusSeguimiento_RequisitosPendientes(object origen, EventArgs argumentos) { RefrescarRequisitosSeguimiento(); MostrarSeguimiento(UcEstatusSolicitud.SeccionPendiente); } protected void EstatusSeguimiento_Cambiado(object origen, EventArgs argumentos) { bool ofrecerProgramacion = UcEstatusSolicitud.OfrecerProgramacion; AbrirSeguimiento(CveSolicitudSeguimiento, CveFraccionamientoSeguimiento); SeguimientoTramite_Cambiado(this, EventArgs.Empty); if (ofrecerProgramacion) { UcSupervisionesSolicitud.Programar(); } } protected void CondicionesSeguimiento_Cambiado(object origen, EventArgs argumentos) { ActualizarSeguimiento(); MostrarSeguimiento("condiciones"); } protected void DocumentosSeguimiento_Cambiados(object origen, EventArgs argumentos) { RefrescarRequisitosSeguimiento(); ActualizarSeguimiento(); MostrarSeguimiento("documentos"); } protected void DocumentosSeguimiento_MostrarSolicitado(object origen, EventArgs argumentos) { MostrarSeguimiento("documentos"); } protected void ComentariosSeguimiento_Cambiado(object origen, EventArgs argumentos) { ActualizarSeguimiento(); MostrarSeguimiento("comentarios"); } protected void ComentariosSeguimiento_MostrarSolicitado(object origen, EventArgs argumentos) { MostrarSeguimiento("comentarios"); } private void CargarAccionesPendientesSeguimiento() { DbResult> resultado = AppServices.TramiteSolicitudService.ListarAccionesPendientes( CveSolicitudSeguimiento, CurrentUser.CveUsuario, CurrentUser.NombreDominio); List acciones = resultado.Success && resultado.Data != null ? resultado.Data : new List(); SeccionAccionesPendientesSeguimiento.Visible = acciones.Count > 0; AccionesPendientesSeguimiento.DataSource = acciones; AccionesPendientesSeguimiento.DataBind(); if (!resultado.Success) { Alert(resultado.UserMessage, TipoMensaje.MsgAdvertencia); } } private bool RefrescarRequisitosSeguimiento() { DbResult resultado = AppServices.TramiteSolicitudService.ObtenerContextoCambioEstatus( CveSolicitudSeguimiento, CurrentUser.CveUsuario, CurrentUser.NombreDominio); if (!resultado.Success || resultado.Data == null) { Alert(resultado.UserMessage, TipoMensaje.MsgAdvertencia); return false; } UcDocumentosSolicitud.Cargar(CveSolicitudSeguimiento, CveFraccionamientoSeguimiento, resultado.Data.Documentos); UpEncabezadoSeguimiento.Update(); return true; } } }