diff --git a/AGENTS_STORED_PROCEDURES.md b/AGENTS_STORED_PROCEDURES.md index 53cd3fe..4e821e5 100644 --- a/AGENTS_STORED_PROCEDURES.md +++ b/AGENTS_STORED_PROCEDURES.md @@ -18,6 +18,13 @@ Estas reglas complementan `AGENTS.md` y son obligatorias para toda consulta nuev - `` identifica el objeto y `` describe claramente la operación; por ejemplo `Add`, `Update`, `List`, `Activate`, `Deactivate` o `Delete`. - Ejemplos: `PA_Sis_UsuarioAdd`, `PA_Sis_UsuarioUpdate`, `PA_Sis_UsuarioList`, `PA_Sis_UsuarioActivate`, `PA_Sis_UsuarioDeactivate` y `PA_Sis_UsuarioDelete`. +## Formato de JOIN + +- Mantener cada `JOIN` y su condición `ON` en la misma línea cuando la condición sea simple o pueda continuarse de forma legible en las líneas siguientes. +- No separar `ON` en una línea independiente únicamente por estilo. +- Evitar subconsultas con `SELECT` directamente dentro de un `JOIN`. Cuando la consulta relacionada sea compleja, preferir un CTE con `WITH` y realizar el `JOIN` contra ese CTE. +- Una condición extensa del `ON` puede continuar en líneas adicionales, alineando cada `AND` para conservar la legibilidad. + ## Parámetros y resultado obligatorios Todos los procedimientos deben declarar: diff --git a/AGENTS_WEBFORMS_ESTRUCTURA.md b/AGENTS_WEBFORMS_ESTRUCTURA.md index 5b73ffc..b754300 100644 --- a/AGENTS_WEBFORMS_ESTRUCTURA.md +++ b/AGENTS_WEBFORMS_ESTRUCTURA.md @@ -177,6 +177,12 @@ Do not mix placeholder naming systems in the same project. - When a postback needs to recover related values from an already loaded catalog, store the typed serializable object list in a typed `ViewState` property and locate the selected object by its key. - Do not copy server-owned catalog or model values into HTML `data-*` attributes, CSS classes, hidden fields, or other client-controlled markup merely to recover them during a postback. Read them from the typed object list stored in `ViewState`. +### Server-control visibility rules + +- Never use the effective `Visible` property of an ASP.NET server control as business or page state, as an `if` condition, or as the input used to mutate another control or object. An invisible ancestor causes every descendant to report `Visible == false`, regardless of the value assigned directly to that descendant. +- Calculate visibility in independent, clearly named Boolean variables or a typed state model. Use those values both for decisions and for assigning each control's `Visible` property. +- When configuring children of a server container that starts hidden, make the parent container visible before assigning child visibility. After assigning the children, hide the parent again only when the independent visibility values indicate that none of its children should be rendered. + --- ## Login and session rules @@ -412,4 +418,3 @@ Rules: - The home page must use `Site.master`. --- - diff --git a/SIG.Web/App_Code/Configuration/AppServices.cs b/SIG.Web/App_Code/Configuration/AppServices.cs index 23a0e5a..de312b5 100644 --- a/SIG.Web/App_Code/Configuration/AppServices.cs +++ b/SIG.Web/App_Code/Configuration/AppServices.cs @@ -121,9 +121,11 @@ namespace SIG.Web.AppCode.Configuration ITramiteSolicitudRepository tramiteSolicitudRepository = new TramiteSolicitudRepository(DbExecutor); + IRepositorioFraccionamiento repositorioFraccionamiento = + new RepositorioFraccionamiento(DbExecutor); ServicioFraccionamiento = new ServicioFraccionamiento( - new RepositorioFraccionamiento(DbExecutor), + repositorioFraccionamiento, tramiteSolicitudRepository, BitacoraService); @@ -141,6 +143,7 @@ namespace SIG.Web.AppCode.Configuration BitacoraService); TramiteSolicitudService = new TramiteSolicitudService( tramiteSolicitudRepository, + repositorioFraccionamiento, BitacoraService); var clienteProfact = new ClienteTimbradoPacProfact( new ProveedorCredencialPacConfiguracion()); diff --git a/SIG.Web/App_Code/Contracts/Fraccionamientos/IRepositorioFraccionamiento.cs b/SIG.Web/App_Code/Contracts/Fraccionamientos/IRepositorioFraccionamiento.cs index efe4c55..eca8760 100644 --- a/SIG.Web/App_Code/Contracts/Fraccionamientos/IRepositorioFraccionamiento.cs +++ b/SIG.Web/App_Code/Contracts/Fraccionamientos/IRepositorioFraccionamiento.cs @@ -31,6 +31,12 @@ namespace SIG.Web.AppCode.Contracts.Fraccionamientos ModeloCondicionesEtapaFraccionamiento condiciones, int cveUsuarioEjecuta, string nombreDominio); + DbResult ActualizarCondicionEtapa( + int cveFraccionamientoEtapa, + int cveCondicionMostrar, + bool? valor, + int cveUsuarioEjecuta, + string nombreDominio); DbResult ObtenerGisEtapa( int cveFraccionamientoEtapa, int cveUsuarioEjecuta, diff --git a/SIG.Web/App_Code/Contracts/Tramites/ITramiteSolicitudRepository.cs b/SIG.Web/App_Code/Contracts/Tramites/ITramiteSolicitudRepository.cs index 0e1d52c..9b33ccd 100644 --- a/SIG.Web/App_Code/Contracts/Tramites/ITramiteSolicitudRepository.cs +++ b/SIG.Web/App_Code/Contracts/Tramites/ITramiteSolicitudRepository.cs @@ -42,15 +42,22 @@ namespace SIG.Web.AppCode.Contracts.Tramites int executingUser, string domainName); - DbResult ChangeStatus( - int requestId, - int statusId, - int executingUser, - string domainName); + DbResult> + ListarCondicionesPorTramite( + int cveTipoTramite, + int cveFraccionamientoEtapa, + int cveUsuarioEjecuta, + string nombreDominio); - DbResult ActualizarTramites( + DbResult CambiarEstatus( int cveSolicitud, + int cveEstatusSolicitud, int cveUsuarioEjecuta, string nombreDominio); + + DbResult GenerarSolicitudesPorFlujo( + int cveFraccionamientoEtapa, + int cveUsuario, + string nombreDominio); } } diff --git a/SIG.Web/App_Code/Contracts/Tramites/ITramiteSolicitudService.cs b/SIG.Web/App_Code/Contracts/Tramites/ITramiteSolicitudService.cs index b30bd55..39f4f04 100644 --- a/SIG.Web/App_Code/Contracts/Tramites/ITramiteSolicitudService.cs +++ b/SIG.Web/App_Code/Contracts/Tramites/ITramiteSolicitudService.cs @@ -36,10 +36,16 @@ namespace SIG.Web.AppCode.Contracts.Tramites int executingUser, string domainName); - DbResult ChangeStatus( - int requestId, - int statusId, - int executingUser, - string domainName); + DbResult> + ListarCondicionesPorTramite( + int cveTipoTramite, + int cveFraccionamientoEtapa, + int cveUsuarioEjecuta, + string nombreDominio); + + DbResult CambiarEstatus( + ModeloCambioEstatusTramite cambioEstatus, + int cveUsuarioEjecuta, + string nombreDominio); } } diff --git a/SIG.Web/App_Code/Models/Tramites/TramiteSolicitudModels.cs b/SIG.Web/App_Code/Models/Tramites/TramiteSolicitudModels.cs index 81e23df..376b8a0 100644 --- a/SIG.Web/App_Code/Models/Tramites/TramiteSolicitudModels.cs +++ b/SIG.Web/App_Code/Models/Tramites/TramiteSolicitudModels.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace SIG.Web.AppCode.Models.Tramites { @@ -49,6 +50,27 @@ namespace SIG.Web.AppCode.Models.Tramites public bool EsCliente { get; set; } public DateTime? FechaAutorizacion { get; set; } public bool HuboCambio { get; set; } + public bool HuboCambioCondiciones { get; set; } + } + + public sealed class ModeloCondicionMostrarTramite + { + public int CveCondicionMostrar { get; set; } + public string CondicionMostrar { get; set; } + } + + public sealed class ModeloCambioEstatusTramite + { + public int CveSolicitud { get; set; } + public int CveEstatusSolicitud { get; set; } + public List CvesCondicionesMostradas { get; set; } + public bool? AprobadoPrefactibilidad { get; set; } + public bool? RequiereObrasExternas { get; set; } + public bool? TipoDeObra { get; set; } + public bool? LiberacionMacromedidor { get; set; } + public bool? Relotificacion { get; set; } + public bool? LiberacionDeLotes { get; set; } + public bool? LiberacionDePagosDeDerechos { get; set; } } public sealed class TramiteSolicitudTipoOptionModel { diff --git a/SIG.Web/App_Code/Repositories/Fraccionamientos/RepositorioFraccionamiento.cs b/SIG.Web/App_Code/Repositories/Fraccionamientos/RepositorioFraccionamiento.cs index ce9a9fe..d3e586a 100644 --- a/SIG.Web/App_Code/Repositories/Fraccionamientos/RepositorioFraccionamiento.cs +++ b/SIG.Web/App_Code/Repositories/Fraccionamientos/RepositorioFraccionamiento.cs @@ -229,6 +229,38 @@ namespace SIG.Web.AppCode.Repositories.Fraccionamientos }); } + public DbResult + ActualizarCondicionEtapa( + int cveFraccionamientoEtapa, + int cveCondicionMostrar, + bool? valor, + int cveUsuarioEjecuta, + string nombreDominio) + { + return QueryOne( + "dbo.PA_Fraccionamientos_EtapaCondicionUpdate", + cveUsuarioEjecuta, + nombreDominio, + comando => + { + StoredProcedureCommand.AddInput( + comando, + "@CveFraccionamientoEtapa", + cveFraccionamientoEtapa, + DbType.Int32); + StoredProcedureCommand.AddInput( + comando, + "@CveCondicionMostrar", + cveCondicionMostrar, + DbType.Int32); + StoredProcedureCommand.AddInput( + comando, + "@Valor", + valor, + DbType.Boolean); + }); + } + public DbResult ObtenerGisEtapa( int cveFraccionamientoEtapa, int cveUsuarioEjecuta, diff --git a/SIG.Web/App_Code/Repositories/Tramites/TramiteSolicitudRepository.cs b/SIG.Web/App_Code/Repositories/Tramites/TramiteSolicitudRepository.cs index 54d191b..a398589 100644 --- a/SIG.Web/App_Code/Repositories/Tramites/TramiteSolicitudRepository.cs +++ b/SIG.Web/App_Code/Repositories/Tramites/TramiteSolicitudRepository.cs @@ -162,45 +162,91 @@ namespace SIG.Web.AppCode.Repositories.Tramites null); } - public DbResult ChangeStatus( - int requestId, - int statusId, - int executingUser, - string domainName) + public DbResult> + ListarCondicionesPorTramite( + int cveTipoTramite, + int cveFraccionamientoEtapa, + int cveUsuarioEjecuta, + string nombreDominio) { - return QueryOne( - "dbo.PA_Tramites_SolicitudEstatusUpdate", - executingUser, - domainName, - command => + return QueryList( + "dbo.PA_Tra_MostrarCondicionesporTramite", + cveUsuarioEjecuta, + nombreDominio, + comando => { StoredProcedureCommand.AddInput( - command, - "@CveSolicitud", - requestId, + comando, + "@CveTipoTramite", + cveTipoTramite, DbType.Int32); StoredProcedureCommand.AddInput( - command, - "@CveEstatusSolicitud", - statusId, + comando, + "@CveFraccionamientoEtapa", + cveFraccionamientoEtapa, DbType.Int32); }); } - public DbResult ActualizarTramites( + public DbResult CambiarEstatus( int cveSolicitud, + int cveEstatusSolicitud, int cveUsuarioEjecuta, string nombreDominio) { - return QueryScalarId( - "dbo.PA_Tramites_ActualizarTramites", + return QueryOne( + "dbo.PA_Tramites_SolicitudEstatusUpdate", cveUsuarioEjecuta, nombreDominio, - command => StoredProcedureCommand.AddInput( - command, - "@CveSolicitud", - cveSolicitud, - DbType.Int32)); + comando => + { + StoredProcedureCommand.AddInput( + comando, + "@CveSolicitud", + cveSolicitud, + DbType.Int32); + StoredProcedureCommand.AddInput( + comando, + "@CveEstatusSolicitud", + cveEstatusSolicitud, + DbType.Int32); + }); } + + public DbResult GenerarSolicitudesPorFlujo( + int cveFraccionamientoEtapa, + int cveUsuario, + string nombreDominio) + { + const string procedimiento = + "dbo.PA_Tra_GenerarSolicitudesPorFlujo"; + + return ExecuteCustom( + nombreDominio, + conexion => + { + using (IDbCommand comando = conexion.CreateCommand()) + { + StoredProcedureDiagnostics.Start(procedimiento); + comando.CommandText = procedimiento; + comando.CommandType = CommandType.StoredProcedure; + + StoredProcedureCommand.AddInput( + comando, + "@CveFraccionamientoEtapa", + cveFraccionamientoEtapa, + DbType.Int32); + StoredProcedureCommand.AddInput( + comando, + "@CveUsuario", + cveUsuario, + DbType.Int32); + + comando.ExecuteNonQuery(); + return true; + } + }); + } + } } diff --git a/SIG.Web/App_Code/Services/Tramites/TramiteSolicitudService.cs b/SIG.Web/App_Code/Services/Tramites/TramiteSolicitudService.cs index 746029b..713e28e 100644 --- a/SIG.Web/App_Code/Services/Tramites/TramiteSolicitudService.cs +++ b/SIG.Web/App_Code/Services/Tramites/TramiteSolicitudService.cs @@ -1,24 +1,35 @@ using System.Collections.Generic; +using System.Linq; using SIG.Web.AppCode.Contracts.Bitacora; +using SIG.Web.AppCode.Contracts.Fraccionamientos; using SIG.Web.AppCode.Contracts.Tramites; using SIG.Web.AppCode.Infrastructure.Transactions; using SIG.Web.AppCode.Models.Bitacora; using SIG.Web.AppCode.Models.Common; +using SIG.Web.AppCode.Models.Fraccionamientos; using SIG.Web.AppCode.Models.Tramites; +using SIG.Web.AppCode.Services.Fraccionamientos; namespace SIG.Web.AppCode.Services.Tramites { public sealed class TramiteSolicitudService : ITramiteSolicitudService { + private const int CveTipoTramitePrefactibilidad = 1; + private const int CveEstatusSolicitudAutorizado = 7; + private const int CveEstatusSolicitudCancelado = 8; + private readonly ITramiteSolicitudRepository _repository; + private readonly IRepositorioFraccionamiento _repositorioFraccionamiento; private readonly IBitacoraService _bitacoraService; public TramiteSolicitudService( ITramiteSolicitudRepository repository, + IRepositorioFraccionamiento repositorioFraccionamiento, IBitacoraService bitacoraService) { _repository = repository; + _repositorioFraccionamiento = repositorioFraccionamiento; _bitacoraService = bitacoraService; } @@ -163,19 +174,44 @@ namespace SIG.Web.AppCode.Services.Tramites domainName); } - public DbResult ChangeStatus( - int requestId, - int statusId, - int executingUser, - string domainName) + public DbResult> + ListarCondicionesPorTramite( + int cveTipoTramite, + int cveFraccionamientoEtapa, + int cveUsuarioEjecuta, + string nombreDominio) { - if (requestId <= 0) + if (cveTipoTramite <= 0) + { + return Fail>( + "Seleccione un tipo de trámite válido."); + } + + if (cveFraccionamientoEtapa <= 0) + { + return Fail>( + "Seleccione una etapa válida."); + } + + return _repository.ListarCondicionesPorTramite( + cveTipoTramite, + cveFraccionamientoEtapa, + cveUsuarioEjecuta, + nombreDominio); + } + + public DbResult CambiarEstatus( + ModeloCambioEstatusTramite cambioEstatus, + int cveUsuarioEjecuta, + string nombreDominio) + { + if (cambioEstatus == null || cambioEstatus.CveSolicitud <= 0) { return Fail( "Seleccione una solicitud válida."); } - if (statusId <= 0) + if (cambioEstatus.CveEstatusSolicitud <= 0) { return Fail( "Seleccione un estatus válido."); @@ -183,38 +219,138 @@ namespace SIG.Web.AppCode.Services.Tramites using (var transaction = new TransactionLogic()) { + DbResult resultadoSolicitud = + _repository.Get( + cambioEstatus.CveSolicitud, + cveUsuarioEjecuta, + nombreDominio); + + if (!resultadoSolicitud.Success || + resultadoSolicitud.Data == null) + { + return DbResult.Fail( + resultadoSolicitud.UserMessage, + resultadoSolicitud.TechnicalMessage, + resultadoSolicitud.Exception); + } + + TramiteSolicitudModel solicitudActual = resultadoSolicitud.Data; + DbResult> + resultadoCondiciones = + _repository.ListarCondicionesPorTramite( + solicitudActual.CveTipoTramite, + solicitudActual.CveFraccionamientoEtapa, + cveUsuarioEjecuta, + nombreDominio); + + if (!resultadoCondiciones.Success) + { + return DbResult.Fail( + resultadoCondiciones.UserMessage, + resultadoCondiciones.TechnicalMessage, + resultadoCondiciones.Exception); + } + + PrepararCondicionesPermitidas( + cambioEstatus, + solicitudActual.CveTipoTramite, + resultadoCondiciones.Data); + + ModeloCondicionesEtapaFraccionamiento condicionesAnteriores = + null; + ModeloCondicionesEtapaFraccionamiento condicionesActuales = + null; + List cvesCondiciones = + cambioEstatus.CvesCondicionesMostradas ?? new List(); + + if (cvesCondiciones.Count > 0) + { + DbResult + resultadoCondicionesAnteriores = + _repositorioFraccionamiento + .ObtenerCondicionesEtapa( + solicitudActual.CveFraccionamientoEtapa, + cveUsuarioEjecuta, + nombreDominio); + + if (!resultadoCondicionesAnteriores.Success || + resultadoCondicionesAnteriores.Data == null) + { + return DbResult.Fail( + resultadoCondicionesAnteriores.UserMessage, + resultadoCondicionesAnteriores.TechnicalMessage, + resultadoCondicionesAnteriores.Exception); + } + + condicionesAnteriores = + resultadoCondicionesAnteriores.Data; + condicionesActuales = condicionesAnteriores; + } + DbResult result = - _repository.ChangeStatus( - requestId, - statusId, - executingUser, - domainName); + _repository.CambiarEstatus( + cambioEstatus.CveSolicitud, + cambioEstatus.CveEstatusSolicitud, + cveUsuarioEjecuta, + nombreDominio); if (!result.Success || result.Data == null) { return result; } - if (result.Data.HuboCambio) + foreach (int cveCondicion in cvesCondiciones) { - DbResult resultadoActualizacionTramites = - _repository.ActualizarTramites( - requestId, - executingUser, - domainName); + DbResult + resultadoCondicion = + _repositorioFraccionamiento + .ActualizarCondicionEtapa( + solicitudActual.CveFraccionamientoEtapa, + cveCondicion, + ObtenerValorCondicion( + cambioEstatus, + cveCondicion), + cveUsuarioEjecuta, + nombreDominio); - if (!resultadoActualizacionTramites.Success) + if (!resultadoCondicion.Success || + resultadoCondicion.Data == null) { return DbResult.Fail( - resultadoActualizacionTramites.UserMessage, - resultadoActualizacionTramites.TechnicalMessage, - resultadoActualizacionTramites.Exception); + resultadoCondicion.UserMessage, + resultadoCondicion.TechnicalMessage, + resultadoCondicion.Exception); } - if (_bitacoraService == null) + condicionesActuales = resultadoCondicion.Data; + } + + bool huboCambioCondiciones = HayCambioCondiciones( + condicionesAnteriores, + condicionesActuales); + result.Data.HuboCambioCondiciones = huboCambioCondiciones; + + if ((result.Data.HuboCambio || huboCambioCondiciones) && + _bitacoraService == null) + { + return Fail( + "El servicio de bitácora no está configurado."); + } + + if (result.Data.HuboCambio) + { + DbResult resultadoGeneracionSolicitudes = + _repository.GenerarSolicitudesPorFlujo( + result.Data.CveFraccionamientoEtapa, + cveUsuarioEjecuta, + nombreDominio); + + if (!resultadoGeneracionSolicitudes.Success) { - return Fail( - "El servicio de bitácora no está configurado."); + return DbResult.Fail( + resultadoGeneracionSolicitudes.UserMessage, + resultadoGeneracionSolicitudes.TechnicalMessage, + resultadoGeneracionSolicitudes.Exception); } BitacoraEventoModel auditEvent = @@ -223,7 +359,7 @@ namespace SIG.Web.AppCode.Services.Tramites if (result.Data.FechaAutorizacion.HasValue) { - auditEvent.CveUsuarioAutoriza = executingUser; + auditEvent.CveUsuarioAutoriza = cveUsuarioEjecuta; auditEvent.FechaAutorizacion = result.Data.FechaAutorizacion; } @@ -240,11 +376,122 @@ namespace SIG.Web.AppCode.Services.Tramites } } + if (huboCambioCondiciones) + { + DbResult resultadoBitacoraCondiciones = + _bitacoraService.Registrar( + FabricaBitacoraFraccionamiento + .CrearCondicionesEtapa( + condicionesAnteriores, + condicionesActuales)); + + if (!resultadoBitacoraCondiciones.Success) + { + return DbResult.Fail( + resultadoBitacoraCondiciones.UserMessage, + resultadoBitacoraCondiciones.TechnicalMessage, + resultadoBitacoraCondiciones.Exception); + } + } + transaction.Commit(); return result; } } + private static void PrepararCondicionesPermitidas( + ModeloCambioEstatusTramite cambioEstatus, + int cveTipoTramite, + List condicionesPermitidas) + { + var clavesPermitidas = new HashSet( + (condicionesPermitidas ?? + new List()) + .Select(condicion => condicion.CveCondicionMostrar)); + var clavesSolicitadas = new HashSet( + cambioEstatus.CvesCondicionesMostradas ?? new List()); + + clavesSolicitadas.IntersectWith(clavesPermitidas); + + if (cveTipoTramite == CveTipoTramitePrefactibilidad) + { + if (cambioEstatus.CveEstatusSolicitud == + CveEstatusSolicitudAutorizado) + { + cambioEstatus.AprobadoPrefactibilidad = true; + + if (clavesPermitidas.Contains(1)) + { + clavesSolicitadas.Add(1); + } + } + else if (cambioEstatus.CveEstatusSolicitud == + CveEstatusSolicitudCancelado) + { + cambioEstatus.AprobadoPrefactibilidad = false; + clavesSolicitadas.Remove(2); + + if (clavesPermitidas.Contains(1)) + { + clavesSolicitadas.Add(1); + } + } + } + + cambioEstatus.CvesCondicionesMostradas = + clavesSolicitadas.OrderBy(clave => clave).ToList(); + } + + private static bool? ObtenerValorCondicion( + ModeloCambioEstatusTramite cambioEstatus, + int cveCondicion) + { + switch (cveCondicion) + { + case 1: + return cambioEstatus.AprobadoPrefactibilidad; + case 2: + return cambioEstatus.RequiereObrasExternas; + case 3: + return cambioEstatus.TipoDeObra; + case 4: + return cambioEstatus.LiberacionMacromedidor; + case 5: + return cambioEstatus.Relotificacion; + case 6: + return cambioEstatus.LiberacionDeLotes; + case 7: + return cambioEstatus.LiberacionDePagosDeDerechos; + default: + return null; + } + } + + private static bool HayCambioCondiciones( + ModeloCondicionesEtapaFraccionamiento condicionesAnteriores, + ModeloCondicionesEtapaFraccionamiento condicionesActuales) + { + if (condicionesAnteriores == null || condicionesActuales == null) + { + return false; + } + + return condicionesAnteriores.Aprobado_Prefactibilidad != + condicionesActuales.Aprobado_Prefactibilidad || + condicionesAnteriores.RequiereObrasExternas != + condicionesActuales.RequiereObrasExternas || + condicionesAnteriores.TipoDeObra != + condicionesActuales.TipoDeObra || + condicionesAnteriores.LiberacionMacromedidor != + condicionesActuales.LiberacionMacromedidor || + condicionesAnteriores.Relotificacion != + condicionesActuales.Relotificacion || + condicionesAnteriores.LiberacionDeLotes != + condicionesActuales.LiberacionDeLotes || + condicionesAnteriores.LiberacionDePagosDeDerechos != + condicionesActuales.LiberacionDePagosDeDerechos; + } + private static int? NormalizeId(int? value) { return value.HasValue && value.Value > 0 diff --git a/SIG.Web/Pages/Fraccionamientos/FraccionamientoDetalle.aspx b/SIG.Web/Pages/Fraccionamientos/FraccionamientoDetalle.aspx index be6dcfb..ea2a17f 100644 --- a/SIG.Web/Pages/Fraccionamientos/FraccionamientoDetalle.aspx +++ b/SIG.Web/Pages/Fraccionamientos/FraccionamientoDetalle.aspx @@ -1769,8 +1769,128 @@ + CssClass="form-control" + AutoPostBack="true" + OnSelectedIndexChanged="DdlNuevoEstatusTramite_SeleccionadoIndiceCambiado" /> + + +
+

+ Condiciones de la etapa + +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ diff --git a/SIG.Web/Pages/Fraccionamientos/FraccionamientoDetalle.aspx.cs b/SIG.Web/Pages/Fraccionamientos/FraccionamientoDetalle.aspx.cs index 8cf3073..14f3410 100644 --- a/SIG.Web/Pages/Fraccionamientos/FraccionamientoDetalle.aspx.cs +++ b/SIG.Web/Pages/Fraccionamientos/FraccionamientoDetalle.aspx.cs @@ -22,6 +22,9 @@ namespace SIG.Web.Pages.Fraccionamientos public partial class FraccionamientoDetalle : ClsPaginaBase { private const string ValorVisualizacionVacio = "—"; + private const int CveTipoTramitePrefactibilidad = 1; + private const int CveEstatusSolicitudAutorizado = 7; + private const int CveEstatusSolicitudCancelado = 8; #region "Propiedades" private int CveFraccionamientoActual @@ -164,6 +167,62 @@ namespace SIG.Web.Pages.Fraccionamientos } } + private int CveTipoTramiteEstatusActual + { + get + { + return ViewState["CveTipoTramiteEstatusActual"] == null + ? 0 + : (int)ViewState["CveTipoTramiteEstatusActual"]; + } + set + { + ViewState["CveTipoTramiteEstatusActual"] = value; + } + } + + private List CvesCondicionesEstatusActual + { + get + { + return ViewState["CvesCondicionesEstatusActual"] as List + ?? new List(); + } + set + { + ViewState["CvesCondicionesEstatusActual"] = value; + } + } + + private int CveEstatusSolicitudSeleccionadoAnterior + { + get + { + return ViewState["CveEstatusSolicitudSeleccionadoAnterior"] == null + ? 0 + : (int)ViewState["CveEstatusSolicitudSeleccionadoAnterior"]; + } + set + { + ViewState["CveEstatusSolicitudSeleccionadoAnterior"] = value; + } + } + + private bool? AprobadoPrefactibilidadEstatusCapturado + { + get + { + return ViewState["AprobadoPrefactibilidadEstatusCapturado"] == null + ? (bool?)null + : (bool)ViewState[ + "AprobadoPrefactibilidadEstatusCapturado"]; + } + set + { + ViewState["AprobadoPrefactibilidadEstatusCapturado"] = value; + } + } + private FiltroActivo FiltroTramiteEstatus { get @@ -576,17 +635,23 @@ namespace SIG.Web.Pages.Fraccionamientos AbrirModalEstatusTramite(cveSolicitud); } + protected void DdlNuevoEstatusTramite_SeleccionadoIndiceCambiado( + object sender, + EventArgs e) + { + CapturarAprobadoPrefactibilidadAntesDeCambiarEstatus(); + ConfigurarCondicionesSegunEstatus(); + CveEstatusSolicitudSeleccionadoAnterior = + ObtenerCveEstatusSolicitudSeleccionado(); + OcultarMensajeEstatusTramite(); + UpModalEstatusTramite.Update(); + MostrarModalEstatusTramite(); + } + protected void BtnGuardarEstatusTramite_Click( object sender, EventArgs e) { - if (CurrentUser.CveRol > 2) - { - MostrarValidacionEstatusTramite( - "Sólo un superusuario puede cambiar el estatus de una solicitud."); - return; - } - int cveSolicitud = CveSolicitudEstatusActual; int cveEstatus; @@ -601,10 +666,33 @@ namespace SIG.Web.Pages.Fraccionamientos return; } + ConfigurarCondicionesSegunEstatus(); + + var cambioEstatus = new ModeloCambioEstatusTramite + { + CveSolicitud = cveSolicitud, + CveEstatusSolicitud = cveEstatus, + CvesCondicionesMostradas = + ObtenerCvesCondicionesEstatusVisibles(), + AprobadoPrefactibilidad = ObtenerBitAnulable( + DdlAprobadoPrefactibilidadEstatusTramite), + RequiereObrasExternas = ObtenerBitAnulable( + DdlRequiereObrasExternasEstatusTramite), + TipoDeObra = ObtenerBitAnulable( + DdlTipoDeObraEstatusTramite), + LiberacionMacromedidor = ObtenerBitAnulable( + DdlLiberacionMacromedidorEstatusTramite), + Relotificacion = ObtenerBitAnulable( + DdlRelotificacionEstatusTramite), + LiberacionDeLotes = ObtenerBitAnulable( + DdlLiberacionDeLotesEstatusTramite), + LiberacionDePagosDeDerechos = ObtenerBitAnulable( + DdlLiberacionPagosDerechosEstatusTramite) + }; + DbResult resultado = - AppServices.TramiteSolicitudService.ChangeStatus( - cveSolicitud, - cveEstatus, + AppServices.TramiteSolicitudService.CambiarEstatus( + cambioEstatus, CurrentUser.CveUsuario, CurrentUser.NombreDominio); @@ -615,6 +703,10 @@ namespace SIG.Web.Pages.Fraccionamientos } CveSolicitudEstatusActual = 0; + CveTipoTramiteEstatusActual = 0; + CvesCondicionesEstatusActual = new List(); + CveEstatusSolicitudSeleccionadoAnterior = 0; + AprobadoPrefactibilidadEstatusCapturado = null; OcultarMensajeEstatusTramite(); CargarOpcionesEstatusTramite(); CargarTramites(); @@ -625,9 +717,11 @@ namespace SIG.Web.Pages.Fraccionamientos OcultarModalEstatusTramite(); Alert( - resultado.Data != null && resultado.Data.HuboCambio - ? "Estatus actualizado correctamente." - : "La solicitud ya tenía el estatus seleccionado.", + resultado.Data != null && + (resultado.Data.HuboCambio || + resultado.Data.HuboCambioCondiciones) + ? "Cambio de estatus guardado correctamente." + : "No se realizaron cambios en la solicitud.", TipoMensaje.ToastExito); } @@ -1904,6 +1998,60 @@ namespace SIG.Web.Pages.Fraccionamientos return; } + DbResult> + resultadoCondicionesMostrar = + AppServices.TramiteSolicitudService + .ListarCondicionesPorTramite( + resultado.Data.CveTipoTramite, + resultado.Data.CveFraccionamientoEtapa, + CurrentUser.CveUsuario, + CurrentUser.NombreDominio); + + if (!resultadoCondicionesMostrar.Success) + { + Alert( + resultadoCondicionesMostrar.UserMessage, + TipoMensaje.MsgError); + return; + } + + List cvesCondiciones = + (resultadoCondicionesMostrar.Data ?? + new List()) + .Select(condicion => condicion.CveCondicionMostrar) + .Distinct() + .ToList(); + + ModeloCondicionesEtapaFraccionamiento condicionesEtapa = null; + + if (cvesCondiciones.Count > 0) + { + DbResult + resultadoCondicionesEtapa = + AppServices.ServicioFraccionamiento + .ObtenerCondicionesEtapa( + resultado.Data.CveFraccionamientoEtapa, + CurrentUser.CveUsuario, + CurrentUser.NombreDominio); + + if (!resultadoCondicionesEtapa.Success || + resultadoCondicionesEtapa.Data == null || + resultadoCondicionesEtapa.Data.CveFraccionamiento != + CveFraccionamientoActual) + { + Alert( + resultadoCondicionesEtapa.Success + ? "No se encontraron las condiciones de la etapa." + : resultadoCondicionesEtapa.UserMessage, + resultadoCondicionesEtapa.Success + ? TipoMensaje.MsgAdvertencia + : TipoMensaje.MsgError); + return; + } + + condicionesEtapa = resultadoCondicionesEtapa.Data; + } + DbResult> resultadoEstatus = AppServices.TramiteSolicitudService.ListStatusOptions( CurrentUser.CveUsuario, @@ -1939,15 +2087,193 @@ namespace SIG.Web.Pages.Fraccionamientos CveSolicitudEstatusActual = resultado.Data.CveSolicitud; + CveTipoTramiteEstatusActual = + resultado.Data.CveTipoTramite; + CvesCondicionesEstatusActual = cvesCondiciones; LitFolioEstatusTramite.Text = CodificarValorVisualizacion(resultado.Data.Folio); + LitEtapaCondicionesEstatusTramite.Text = + CodificarValorVisualizacion(" — " + resultado.Data.Etapa); + CargarValoresCondicionesEstatus(condicionesEtapa); + AprobadoPrefactibilidadEstatusCapturado = + condicionesEtapa == null + ? (bool?)null + : condicionesEtapa.Aprobado_Prefactibilidad; + ConfigurarCondicionesSegunEstatus(); + CveEstatusSolicitudSeleccionadoAnterior = + ObtenerCveEstatusSolicitudSeleccionado(); OcultarMensajeEstatusTramite(); UpModalEstatusTramite.Update(); MostrarModalEstatusTramite(); } + private void CargarValoresCondicionesEstatus( + ModeloCondicionesEtapaFraccionamiento condiciones) + { + SeleccionarBitAnulable( + DdlAprobadoPrefactibilidadEstatusTramite, + condiciones == null + ? null + : condiciones.Aprobado_Prefactibilidad); + SeleccionarBitAnulable( + DdlRequiereObrasExternasEstatusTramite, + condiciones == null + ? null + : condiciones.RequiereObrasExternas); + SeleccionarBitAnulable( + DdlTipoDeObraEstatusTramite, + condiciones == null ? null : condiciones.TipoDeObra); + SeleccionarBitAnulable( + DdlLiberacionMacromedidorEstatusTramite, + condiciones == null + ? null + : condiciones.LiberacionMacromedidor); + SeleccionarBitAnulable( + DdlRelotificacionEstatusTramite, + condiciones == null ? null : condiciones.Relotificacion); + SeleccionarBitAnulable( + DdlLiberacionDeLotesEstatusTramite, + condiciones == null + ? null + : condiciones.LiberacionDeLotes); + SeleccionarBitAnulable( + DdlLiberacionPagosDerechosEstatusTramite, + condiciones == null + ? null + : condiciones.LiberacionDePagosDeDerechos); + } + + private void ConfigurarCondicionesSegunEstatus() + { + PnlCondicionesEstatusTramite.Visible = true; + + List cvesCondicionesVisibles = + ObtenerCvesCondicionesEstatusVisibles(); + bool mostrarAprobadoPrefactibilidad = + cvesCondicionesVisibles.Contains(1); + bool mostrarRequiereObrasExternas = + cvesCondicionesVisibles.Contains(2); + bool mostrarTipoDeObra = + cvesCondicionesVisibles.Contains(3); + bool mostrarLiberacionMacromedidor = + cvesCondicionesVisibles.Contains(4); + bool mostrarRelotificacion = + cvesCondicionesVisibles.Contains(5); + bool mostrarLiberacionDeLotes = + cvesCondicionesVisibles.Contains(6); + bool mostrarLiberacionPagosDerechos = + cvesCondicionesVisibles.Contains(7); + + PnlAprobadoPrefactibilidadEstatusTramite.Visible = + mostrarAprobadoPrefactibilidad; + PnlRequiereObrasExternasEstatusTramite.Visible = + mostrarRequiereObrasExternas; + PnlTipoDeObraEstatusTramite.Visible = mostrarTipoDeObra; + PnlLiberacionMacromedidorEstatusTramite.Visible = + mostrarLiberacionMacromedidor; + PnlRelotificacionEstatusTramite.Visible = mostrarRelotificacion; + PnlLiberacionDeLotesEstatusTramite.Visible = + mostrarLiberacionDeLotes; + PnlLiberacionPagosDerechosEstatusTramite.Visible = + mostrarLiberacionPagosDerechos; + DdlAprobadoPrefactibilidadEstatusTramite.Enabled = true; + + int cveEstatusSolicitud; + bool estatusValido = int.TryParse( + DdlNuevoEstatusTramite.SelectedValue, + out cveEstatusSolicitud); + + if (CveTipoTramiteEstatusActual == + CveTipoTramitePrefactibilidad && + estatusValido) + { + if (cveEstatusSolicitud == CveEstatusSolicitudAutorizado) + { + SeleccionarBitAnulable( + DdlAprobadoPrefactibilidadEstatusTramite, + true); + DdlAprobadoPrefactibilidadEstatusTramite.Enabled = false; + } + else if (cveEstatusSolicitud == + CveEstatusSolicitudCancelado) + { + SeleccionarBitAnulable( + DdlAprobadoPrefactibilidadEstatusTramite, + false); + DdlAprobadoPrefactibilidadEstatusTramite.Enabled = false; + } + else if (CveEstatusSolicitudSeleccionadoAnterior == + CveEstatusSolicitudAutorizado || + CveEstatusSolicitudSeleccionadoAnterior == + CveEstatusSolicitudCancelado) + { + SeleccionarBitAnulable( + DdlAprobadoPrefactibilidadEstatusTramite, + AprobadoPrefactibilidadEstatusCapturado); + } + } + + bool hayCondicionesVisibles = + mostrarAprobadoPrefactibilidad || + mostrarRequiereObrasExternas || + mostrarTipoDeObra || + mostrarLiberacionMacromedidor || + mostrarRelotificacion || + mostrarLiberacionDeLotes || + mostrarLiberacionPagosDerechos; + + if (!hayCondicionesVisibles) + { + PnlCondicionesEstatusTramite.Visible = false; + } + } + + private void CapturarAprobadoPrefactibilidadAntesDeCambiarEstatus() + { + if (CveTipoTramiteEstatusActual != + CveTipoTramitePrefactibilidad || + CveEstatusSolicitudSeleccionadoAnterior == + CveEstatusSolicitudAutorizado || + CveEstatusSolicitudSeleccionadoAnterior == + CveEstatusSolicitudCancelado) + { + return; + } + + AprobadoPrefactibilidadEstatusCapturado = ObtenerBitAnulable( + DdlAprobadoPrefactibilidadEstatusTramite); + } + + private int ObtenerCveEstatusSolicitudSeleccionado() + { + int cveEstatusSolicitud; + + return int.TryParse( + DdlNuevoEstatusTramite.SelectedValue, + out cveEstatusSolicitud) + ? cveEstatusSolicitud + : 0; + } + + private List ObtenerCvesCondicionesEstatusVisibles() + { + var cvesCondicionesVisibles = new List( + CvesCondicionesEstatusActual); + + if (CveTipoTramiteEstatusActual == + CveTipoTramitePrefactibilidad && + ObtenerCveEstatusSolicitudSeleccionado() == + CveEstatusSolicitudCancelado) + { + cvesCondicionesVisibles.Remove(2); + } + + return cvesCondicionesVisibles; + } + private void MostrarValidacionEstatusTramite(string mensaje) { + ConfigurarCondicionesSegunEstatus(); LblMensajeEstatusTramite.Text = Server.HtmlEncode(mensaje ?? string.Empty); LblMensajeEstatusTramite.Visible = true; diff --git a/Tramites_CambioEstatus_Condiciones_20260907.sql b/Tramites_CambioEstatus_Condiciones_20260907.sql new file mode 100644 index 0000000..d334864 --- /dev/null +++ b/Tramites_CambioEstatus_Condiciones_20260907.sql @@ -0,0 +1,272 @@ +CREATE OR ALTER PROCEDURE dbo.PA_Tra_MostrarCondicionesporTramite + @CveTipoTramite int, + @CveFraccionamientoEtapa int, + @CveUsuarioEjecuta int, + @ErrorMostrar varchar(max) OUTPUT, + @ErrorTipo int OUTPUT, + @Return bit OUTPUT +AS +BEGIN + SET NOCOUNT ON; + + SELECT + @ErrorMostrar = NULL, + @ErrorTipo = 0, + @Return = 0; + + BEGIN TRY + DECLARE @CvePrefactibilidad int = 1; + DECLARE @CvePuntosConexion int = 5; + DECLARE @CveSupervisionObraRedesInternas int = 13; + DECLARE @CveConvenioActualizacionPagos int = 22; + DECLARE @AprobadoPrefactibilidad bit; + DECLARE @RequiereObrasExternas bit; + + IF NOT EXISTS + ( + SELECT 1 + FROM dbo.FraccionamientosEtapas + WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa + ) + BEGIN + SET @ErrorMostrar = 'La etapa seleccionada no existe.'; + SET @ErrorTipo = 2; + RETURN; + END; + + SELECT + @AprobadoPrefactibilidad = E.Aprobado_Prefactibilidad, + @RequiereObrasExternas = E.RequiereObrasExternas + FROM dbo.FraccionamientosEtapas AS E + WHERE E.CveFraccionamientoEtapa = @CveFraccionamientoEtapa; + + DECLARE @Condiciones TABLE + ( + CveCondicionMostrar int NOT NULL, + CondicionMostrar varchar(100) NOT NULL + ); + + IF @CveTipoTramite = @CvePrefactibilidad + BEGIN + INSERT INTO @Condiciones + (CveCondicionMostrar, CondicionMostrar) + VALUES + (1, 'Aprobado en prefactibilidad'), + (2, 'Requiere obras externas'); + END; + + IF @CveTipoTramite = @CvePuntosConexion + AND @AprobadoPrefactibilidad = 1 + AND @RequiereObrasExternas = 1 + BEGIN + INSERT INTO @Condiciones + (CveCondicionMostrar, CondicionMostrar) + VALUES + (3, 'Tipo de obra'); + END; + + IF @CveTipoTramite = @CveSupervisionObraRedesInternas + BEGIN + INSERT INTO @Condiciones + (CveCondicionMostrar, CondicionMostrar) + VALUES + (4, 'Liberación de macromedidor'), + (5, 'Relotificación'), + (6, 'Liberación de lotes'); + END; + + IF @CveTipoTramite = @CveConvenioActualizacionPagos + BEGIN + INSERT INTO @Condiciones + (CveCondicionMostrar, CondicionMostrar) + VALUES + (7, 'Liberación de pagos de derechos'); + END; + + SELECT + CveCondicionMostrar, + CondicionMostrar + FROM @Condiciones + ORDER BY CveCondicionMostrar; + + SET @Return = 1; + END TRY + BEGIN CATCH + SET @ErrorMostrar = 'Ocurrió un error al consultar las condiciones del trámite; favor de contactar a Sistemas.'; + SET @ErrorTipo = 1; + SET @Return = 0; + + DECLARE @ErrorTecnico nvarchar(2048) = CONCAT( + 'Número: ', ERROR_NUMBER(), + '; Procedimiento: ', COALESCE( + ERROR_PROCEDURE(), + 'PA_Tra_MostrarCondicionesporTramite'), + '; Línea: ', ERROR_LINE(), + '; Detalle: ', ERROR_MESSAGE() + ); + + RAISERROR(N'%s', 10, 1, @ErrorTecnico); + END CATCH; +END; +GO + +CREATE OR ALTER PROCEDURE dbo.PA_Fraccionamientos_EtapaCondicionUpdate + @CveFraccionamientoEtapa int, + @CveCondicionMostrar int, + @Valor bit = NULL, + @CveUsuarioEjecuta int, + @ErrorMostrar varchar(max) OUTPUT, + @ErrorTipo int OUTPUT, + @Return bit OUTPUT +AS +BEGIN + SET NOCOUNT ON; + + SELECT + @ErrorMostrar = NULL, + @ErrorTipo = 0, + @Return = 0; + + BEGIN TRY + IF @CveCondicionMostrar NOT BETWEEN 1 AND 7 + BEGIN + SET @ErrorMostrar = 'La condición seleccionada no es válida.'; + SET @ErrorTipo = 2; + RETURN; + END; + + IF NOT EXISTS + ( + SELECT 1 + FROM dbo.FraccionamientosEtapas + WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa + ) + BEGIN + SET @ErrorMostrar = 'La etapa seleccionada no existe.'; + SET @ErrorTipo = 2; + RETURN; + END; + + IF @CveCondicionMostrar = 1 + BEGIN + UPDATE dbo.FraccionamientosEtapas + SET + Aprobado_Prefactibilidad = @Valor, + FechaModificacion = GETDATE(), + CveUsuario = @CveUsuarioEjecuta + WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa + AND ISNULL(CONVERT(tinyint, Aprobado_Prefactibilidad), 2) <> + ISNULL(CONVERT(tinyint, @Valor), 2); + END; + + IF @CveCondicionMostrar = 2 + BEGIN + UPDATE dbo.FraccionamientosEtapas + SET + RequiereObrasExternas = @Valor, + FechaModificacion = GETDATE(), + CveUsuario = @CveUsuarioEjecuta + WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa + AND ISNULL(CONVERT(tinyint, RequiereObrasExternas), 2) <> + ISNULL(CONVERT(tinyint, @Valor), 2); + END; + + IF @CveCondicionMostrar = 3 + BEGIN + UPDATE dbo.FraccionamientosEtapas + SET + TipoDeObra = @Valor, + FechaModificacion = GETDATE(), + CveUsuario = @CveUsuarioEjecuta + WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa + AND ISNULL(CONVERT(tinyint, TipoDeObra), 2) <> + ISNULL(CONVERT(tinyint, @Valor), 2); + END; + + IF @CveCondicionMostrar = 4 + BEGIN + UPDATE dbo.FraccionamientosEtapas + SET + LiberacionMacromedidor = @Valor, + FechaModificacion = GETDATE(), + CveUsuario = @CveUsuarioEjecuta + WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa + AND ISNULL(CONVERT(tinyint, LiberacionMacromedidor), 2) <> + ISNULL(CONVERT(tinyint, @Valor), 2); + END; + + IF @CveCondicionMostrar = 5 + BEGIN + UPDATE dbo.FraccionamientosEtapas + SET + Relotificacion = @Valor, + FechaModificacion = GETDATE(), + CveUsuario = @CveUsuarioEjecuta + WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa + AND ISNULL(CONVERT(tinyint, Relotificacion), 2) <> + ISNULL(CONVERT(tinyint, @Valor), 2); + END; + + IF @CveCondicionMostrar = 6 + BEGIN + UPDATE dbo.FraccionamientosEtapas + SET + LiberacionDeLotes = @Valor, + FechaModificacion = GETDATE(), + CveUsuario = @CveUsuarioEjecuta + WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa + AND ISNULL(CONVERT(tinyint, LiberacionDeLotes), 2) <> + ISNULL(CONVERT(tinyint, @Valor), 2); + END; + + IF @CveCondicionMostrar = 7 + BEGIN + UPDATE dbo.FraccionamientosEtapas + SET + LiberacionDePagosDeDerechos = @Valor, + FechaModificacion = GETDATE(), + CveUsuario = @CveUsuarioEjecuta + WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa + AND ISNULL( + CONVERT(tinyint, LiberacionDePagosDeDerechos), + 2) <> + ISNULL(CONVERT(tinyint, @Valor), 2); + END; + + SELECT + E.CveFraccionamientoEtapa, + E.CveFraccionamiento, + F.CveCliente, + E.Etapa, + E.Aprobado_Prefactibilidad, + E.RequiereObrasExternas, + E.TipoDeObra, + E.LiberacionMacromedidor, + E.Relotificacion, + E.LiberacionDeLotes, + E.LiberacionDePagosDeDerechos + FROM dbo.FraccionamientosEtapas AS E + INNER JOIN dbo.Fraccionamientos AS F + ON F.CveFraccionamiento = E.CveFraccionamiento + WHERE E.CveFraccionamientoEtapa = @CveFraccionamientoEtapa; + + SET @Return = 1; + END TRY + BEGIN CATCH + SET @ErrorMostrar = 'Ocurrió un error al actualizar la condición de la etapa; favor de contactar a Sistemas.'; + SET @ErrorTipo = 1; + SET @Return = 0; + + DECLARE @ErrorTecnico nvarchar(2048) = CONCAT( + 'Número: ', ERROR_NUMBER(), + '; Procedimiento: ', COALESCE( + ERROR_PROCEDURE(), + 'PA_Fraccionamientos_EtapaCondicionUpdate'), + '; Línea: ', ERROR_LINE(), + '; Detalle: ', ERROR_MESSAGE() + ); + + RAISERROR(N'%s', 10, 1, @ErrorTecnico); + END CATCH; +END; +GO diff --git a/Tramites_GenerarSolicitudesPorFlujo_20260907.sql b/Tramites_GenerarSolicitudesPorFlujo_20260907.sql new file mode 100644 index 0000000..e7c3066 --- /dev/null +++ b/Tramites_GenerarSolicitudesPorFlujo_20260907.sql @@ -0,0 +1,95 @@ +CREATE OR ALTER PROCEDURE dbo.PA_Tra_GenerarSolicitudesPorFlujo +( + @CveFraccionamientoEtapa int, + @CveUsuario int +) +AS +BEGIN + SET NOCOUNT ON; + + DECLARE @CveEstatusSolicitud int; + + SELECT TOP (1) + @CveEstatusSolicitud = ES.CveEstatusSolicitud + FROM dbo.Tra_EstatusSolicitud AS ES + WHERE ES.EsActivo = 1 + AND ES.Orden = 1 + ORDER BY ES.CveEstatusSolicitud; + + ;WITH DatosFlujo AS + ( + SELECT + FE.CveFraccionamientoEtapa, + T.CveTipoTramite, + TF.CveTipoTramitePadre, + IIF( + ES.EsFinal = 1 + AND ES.EsOK = 1, + 1, + 0 + ) AS EsOK + FROM dbo.Tra_TiposTramite AS T + INNER JOIN dbo.FraccionamientosEtapas AS FE + ON FE.CveFraccionamientoEtapa = @CveFraccionamientoEtapa + INNER JOIN dbo.Tra_TiposTramiteFlujo AS TF + ON TF.CveTipoTramite = T.CveTipoTramite + LEFT JOIN dbo.Tra_Solicitudes AS TS + ON TS.CveTipoTramite = TF.CveTipoTramitePadre + AND TS.CveFraccionamientoEtapa = + FE.CveFraccionamientoEtapa + LEFT JOIN dbo.Tra_EstatusSolicitud AS ES + ON ES.CveEstatusSolicitud = TS.CveEstatusSolicitud + ), + TramitesDisponibles AS + ( + SELECT + D.CveFraccionamientoEtapa, + D.CveTipoTramite + FROM DatosFlujo AS D + GROUP BY + D.CveFraccionamientoEtapa, + D.CveTipoTramite + HAVING COUNT(D.CveTipoTramitePadre) = SUM(D.EsOK) + ) + INSERT INTO dbo.Tra_Solicitudes + ( + Folio, + CveCliente, + CveFraccionamiento, + CveFraccionamientoEtapa, + CveTipoTramite, + CveEstatusSolicitud, + CveUsuarioSolicita, + FechaInicio, + FechaAlta + ) + SELECT + CONCAT( + 'ET', + FE.CveFraccionamientoEtapa, + '-TR', + TD.CveTipoTramite + ), + F.CveCliente, + FE.CveFraccionamiento, + FE.CveFraccionamientoEtapa, + TD.CveTipoTramite, + @CveEstatusSolicitud, + @CveUsuario, + GETDATE(), + GETDATE() + FROM TramitesDisponibles AS TD + INNER JOIN dbo.FraccionamientosEtapas AS FE + ON FE.CveFraccionamientoEtapa = TD.CveFraccionamientoEtapa + INNER JOIN dbo.Fraccionamientos AS F + ON F.CveFraccionamiento = FE.CveFraccionamiento + WHERE NOT EXISTS + ( + SELECT 1 + FROM dbo.Tra_Solicitudes AS S + WHERE S.CveFraccionamientoEtapa = + TD.CveFraccionamientoEtapa + AND S.CveTipoTramite = TD.CveTipoTramite + ); +END; +GO