Files
Jorge Luis caudillo esparza da418ce20c color de tramite por depatamento
2026-10-24 16:13:28 -07:00

638 lines
26 KiB
C#

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<ModeloFilaTableroTramites> FilasTableroActuales
{
get
{
return ViewState["FilasTableroActuales"] as List<ModeloFilaTableroTramites>
?? new List<ModeloFilaTableroTramites>();
}
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<DepartamentoTramiteModel>())
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<FiltroActivo> 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<ListItem>()
.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<ModeloResultadoTableroTramites> resultado =
AppServices.TramiteSolicitudService.ConsultarTablero(
FiltrosTableroActuales,
CurrentUser.CveUsuario,
CurrentUser.NombreDominio);
if (!resultado.Success || resultado.Data == null)
{
FilasTableroActuales = new List<ModeloFilaTableroTramites>();
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<ModeloFilaTableroTramites>();
EnlazarTablero();
Alert(deptos.UserMessage, TipoMensaje.MsgAdvertencia);
return false;
}
var asignaciones = (deptos.Data ?? new List<TipoTramiteDepartamentoModel>())
.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<ModeloFilaTableroTramites> 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<int>(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<FiltroActivo>
{
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<ListItem>()
.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<ModeloContextoCambioEstatus> 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<List<ModeloAccionPendienteSolicitud>> resultado =
AppServices.TramiteSolicitudService.ListarAccionesPendientes(
CveSolicitudSeguimiento, CurrentUser.CveUsuario, CurrentUser.NombreDominio);
List<ModeloAccionPendienteSolicitud> acciones = resultado.Success && resultado.Data != null
? resultado.Data : new List<ModeloAccionPendienteSolicitud>();
SeccionAccionesPendientesSeguimiento.Visible = acciones.Count > 0;
AccionesPendientesSeguimiento.DataSource = acciones;
AccionesPendientesSeguimiento.DataBind();
if (!resultado.Success)
{
Alert(resultado.UserMessage, TipoMensaje.MsgAdvertencia);
}
}
private bool RefrescarRequisitosSeguimiento()
{
DbResult<ModeloContextoCambioEstatus> 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;
}
}
}