Ajustes pequeños

This commit is contained in:
Jorge Luis caudillo esparza
2026-09-08 16:08:12 -07:00
parent a3b9ffef1c
commit 275c6dfd10
14 changed files with 1274 additions and 77 deletions

View File

@@ -18,6 +18,13 @@ Estas reglas complementan `AGENTS.md` y son obligatorias para toda consulta nuev
- `<Entidad>` identifica el objeto y `<Accion>` 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:

View File

@@ -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`.
---

View File

@@ -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());

View File

@@ -31,6 +31,12 @@ namespace SIG.Web.AppCode.Contracts.Fraccionamientos
ModeloCondicionesEtapaFraccionamiento condiciones,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloCondicionesEtapaFraccionamiento> ActualizarCondicionEtapa(
int cveFraccionamientoEtapa,
int cveCondicionMostrar,
bool? valor,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloGisEtapaFraccionamiento> ObtenerGisEtapa(
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,

View File

@@ -42,15 +42,22 @@ namespace SIG.Web.AppCode.Contracts.Tramites
int executingUser,
string domainName);
DbResult<TramiteSolicitudStatusChangeModel> ChangeStatus(
int requestId,
int statusId,
int executingUser,
string domainName);
DbResult<List<ModeloCondicionMostrarTramite>>
ListarCondicionesPorTramite(
int cveTipoTramite,
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<int> ActualizarTramites(
DbResult<TramiteSolicitudStatusChangeModel> CambiarEstatus(
int cveSolicitud,
int cveEstatusSolicitud,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<bool> GenerarSolicitudesPorFlujo(
int cveFraccionamientoEtapa,
int cveUsuario,
string nombreDominio);
}
}

View File

@@ -36,10 +36,16 @@ namespace SIG.Web.AppCode.Contracts.Tramites
int executingUser,
string domainName);
DbResult<TramiteSolicitudStatusChangeModel> ChangeStatus(
int requestId,
int statusId,
int executingUser,
string domainName);
DbResult<List<ModeloCondicionMostrarTramite>>
ListarCondicionesPorTramite(
int cveTipoTramite,
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<TramiteSolicitudStatusChangeModel> CambiarEstatus(
ModeloCambioEstatusTramite cambioEstatus,
int cveUsuarioEjecuta,
string nombreDominio);
}
}

View File

@@ -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<int> 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
{

View File

@@ -229,6 +229,38 @@ namespace SIG.Web.AppCode.Repositories.Fraccionamientos
});
}
public DbResult<ModeloCondicionesEtapaFraccionamiento>
ActualizarCondicionEtapa(
int cveFraccionamientoEtapa,
int cveCondicionMostrar,
bool? valor,
int cveUsuarioEjecuta,
string nombreDominio)
{
return QueryOne<ModeloCondicionesEtapaFraccionamiento>(
"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<ModeloGisEtapaFraccionamiento> ObtenerGisEtapa(
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,

View File

@@ -162,45 +162,91 @@ namespace SIG.Web.AppCode.Repositories.Tramites
null);
}
public DbResult<TramiteSolicitudStatusChangeModel> ChangeStatus(
int requestId,
int statusId,
int executingUser,
string domainName)
public DbResult<List<ModeloCondicionMostrarTramite>>
ListarCondicionesPorTramite(
int cveTipoTramite,
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio)
{
return QueryOne<TramiteSolicitudStatusChangeModel>(
"dbo.PA_Tramites_SolicitudEstatusUpdate",
executingUser,
domainName,
command =>
return QueryList<ModeloCondicionMostrarTramite>(
"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<int> ActualizarTramites(
public DbResult<TramiteSolicitudStatusChangeModel> CambiarEstatus(
int cveSolicitud,
int cveEstatusSolicitud,
int cveUsuarioEjecuta,
string nombreDominio)
{
return QueryScalarId(
"dbo.PA_Tramites_ActualizarTramites",
return QueryOne<TramiteSolicitudStatusChangeModel>(
"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<bool> 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;
}
});
}
}
}

View File

@@ -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<TramiteSolicitudStatusChangeModel> ChangeStatus(
int requestId,
int statusId,
int executingUser,
string domainName)
public DbResult<List<ModeloCondicionMostrarTramite>>
ListarCondicionesPorTramite(
int cveTipoTramite,
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio)
{
if (requestId <= 0)
if (cveTipoTramite <= 0)
{
return Fail<List<ModeloCondicionMostrarTramite>>(
"Seleccione un tipo de trámite válido.");
}
if (cveFraccionamientoEtapa <= 0)
{
return Fail<List<ModeloCondicionMostrarTramite>>(
"Seleccione una etapa válida.");
}
return _repository.ListarCondicionesPorTramite(
cveTipoTramite,
cveFraccionamientoEtapa,
cveUsuarioEjecuta,
nombreDominio);
}
public DbResult<TramiteSolicitudStatusChangeModel> CambiarEstatus(
ModeloCambioEstatusTramite cambioEstatus,
int cveUsuarioEjecuta,
string nombreDominio)
{
if (cambioEstatus == null || cambioEstatus.CveSolicitud <= 0)
{
return Fail<TramiteSolicitudStatusChangeModel>(
"Seleccione una solicitud válida.");
}
if (statusId <= 0)
if (cambioEstatus.CveEstatusSolicitud <= 0)
{
return Fail<TramiteSolicitudStatusChangeModel>(
"Seleccione un estatus válido.");
@@ -183,38 +219,138 @@ namespace SIG.Web.AppCode.Services.Tramites
using (var transaction = new TransactionLogic())
{
DbResult<TramiteSolicitudModel> resultadoSolicitud =
_repository.Get(
cambioEstatus.CveSolicitud,
cveUsuarioEjecuta,
nombreDominio);
if (!resultadoSolicitud.Success ||
resultadoSolicitud.Data == null)
{
return DbResult<TramiteSolicitudStatusChangeModel>.Fail(
resultadoSolicitud.UserMessage,
resultadoSolicitud.TechnicalMessage,
resultadoSolicitud.Exception);
}
TramiteSolicitudModel solicitudActual = resultadoSolicitud.Data;
DbResult<List<ModeloCondicionMostrarTramite>>
resultadoCondiciones =
_repository.ListarCondicionesPorTramite(
solicitudActual.CveTipoTramite,
solicitudActual.CveFraccionamientoEtapa,
cveUsuarioEjecuta,
nombreDominio);
if (!resultadoCondiciones.Success)
{
return DbResult<TramiteSolicitudStatusChangeModel>.Fail(
resultadoCondiciones.UserMessage,
resultadoCondiciones.TechnicalMessage,
resultadoCondiciones.Exception);
}
PrepararCondicionesPermitidas(
cambioEstatus,
solicitudActual.CveTipoTramite,
resultadoCondiciones.Data);
ModeloCondicionesEtapaFraccionamiento condicionesAnteriores =
null;
ModeloCondicionesEtapaFraccionamiento condicionesActuales =
null;
List<int> cvesCondiciones =
cambioEstatus.CvesCondicionesMostradas ?? new List<int>();
if (cvesCondiciones.Count > 0)
{
DbResult<ModeloCondicionesEtapaFraccionamiento>
resultadoCondicionesAnteriores =
_repositorioFraccionamiento
.ObtenerCondicionesEtapa(
solicitudActual.CveFraccionamientoEtapa,
cveUsuarioEjecuta,
nombreDominio);
if (!resultadoCondicionesAnteriores.Success ||
resultadoCondicionesAnteriores.Data == null)
{
return DbResult<TramiteSolicitudStatusChangeModel>.Fail(
resultadoCondicionesAnteriores.UserMessage,
resultadoCondicionesAnteriores.TechnicalMessage,
resultadoCondicionesAnteriores.Exception);
}
condicionesAnteriores =
resultadoCondicionesAnteriores.Data;
condicionesActuales = condicionesAnteriores;
}
DbResult<TramiteSolicitudStatusChangeModel> 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<int> resultadoActualizacionTramites =
_repository.ActualizarTramites(
requestId,
executingUser,
domainName);
DbResult<ModeloCondicionesEtapaFraccionamiento>
resultadoCondicion =
_repositorioFraccionamiento
.ActualizarCondicionEtapa(
solicitudActual.CveFraccionamientoEtapa,
cveCondicion,
ObtenerValorCondicion(
cambioEstatus,
cveCondicion),
cveUsuarioEjecuta,
nombreDominio);
if (!resultadoActualizacionTramites.Success)
if (!resultadoCondicion.Success ||
resultadoCondicion.Data == null)
{
return DbResult<TramiteSolicitudStatusChangeModel>.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<TramiteSolicitudStatusChangeModel>(
"El servicio de bitácora no está configurado.");
}
if (result.Data.HuboCambio)
{
DbResult<bool> resultadoGeneracionSolicitudes =
_repository.GenerarSolicitudesPorFlujo(
result.Data.CveFraccionamientoEtapa,
cveUsuarioEjecuta,
nombreDominio);
if (!resultadoGeneracionSolicitudes.Success)
{
return Fail<TramiteSolicitudStatusChangeModel>(
"El servicio de bitácora no está configurado.");
return DbResult<TramiteSolicitudStatusChangeModel>.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<long> resultadoBitacoraCondiciones =
_bitacoraService.Registrar(
FabricaBitacoraFraccionamiento
.CrearCondicionesEtapa(
condicionesAnteriores,
condicionesActuales));
if (!resultadoBitacoraCondiciones.Success)
{
return DbResult<TramiteSolicitudStatusChangeModel>.Fail(
resultadoBitacoraCondiciones.UserMessage,
resultadoBitacoraCondiciones.TechnicalMessage,
resultadoBitacoraCondiciones.Exception);
}
}
transaction.Commit();
return result;
}
}
private static void PrepararCondicionesPermitidas(
ModeloCambioEstatusTramite cambioEstatus,
int cveTipoTramite,
List<ModeloCondicionMostrarTramite> condicionesPermitidas)
{
var clavesPermitidas = new HashSet<int>(
(condicionesPermitidas ??
new List<ModeloCondicionMostrarTramite>())
.Select(condicion => condicion.CveCondicionMostrar));
var clavesSolicitadas = new HashSet<int>(
cambioEstatus.CvesCondicionesMostradas ?? new List<int>());
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

View File

@@ -1769,8 +1769,128 @@
<label>Estatus *</label>
<asp:DropDownList ID="DdlNuevoEstatusTramite"
runat="server"
CssClass="form-control" />
CssClass="form-control"
AutoPostBack="true"
OnSelectedIndexChanged="DdlNuevoEstatusTramite_SeleccionadoIndiceCambiado" />
</div>
<asp:Panel ID="PnlCondicionesEstatusTramite"
runat="server"
Visible="false">
<hr />
<h4>
Condiciones de la etapa
<asp:Literal ID="LitEtapaCondicionesEstatusTramite"
runat="server" />
</h4>
<div class="row">
<asp:Panel ID="PnlAprobadoPrefactibilidadEstatusTramite"
runat="server"
CssClass="col-sm-6 form-group"
Visible="false">
<label>Aprobado en prefactibilidad</label>
<asp:DropDownList ID="DdlAprobadoPrefactibilidadEstatusTramite"
runat="server"
CssClass="form-control select2me"
Width="100%">
<asp:ListItem Text="Sin configurar" Value="-1" />
<asp:ListItem Text="No" Value="0" />
<asp:ListItem Text="Sí" Value="1" />
</asp:DropDownList>
</asp:Panel>
<asp:Panel ID="PnlRequiereObrasExternasEstatusTramite"
runat="server"
CssClass="col-sm-6 form-group"
Visible="false">
<label>Requiere obras externas</label>
<asp:DropDownList ID="DdlRequiereObrasExternasEstatusTramite"
runat="server"
CssClass="form-control select2me"
Width="100%">
<asp:ListItem Text="Sin configurar" Value="-1" />
<asp:ListItem Text="No" Value="0" />
<asp:ListItem Text="Sí" Value="1" />
</asp:DropDownList>
</asp:Panel>
<asp:Panel ID="PnlTipoDeObraEstatusTramite"
runat="server"
CssClass="col-sm-6 form-group"
Visible="false">
<label>Tipo de obra</label>
<asp:DropDownList ID="DdlTipoDeObraEstatusTramite"
runat="server"
CssClass="form-control select2me"
Width="100%">
<asp:ListItem Text="Sin configurar" Value="-1" />
<asp:ListItem Text="De cabecera" Value="0" />
<asp:ListItem Text="Necesaria" Value="1" />
</asp:DropDownList>
</asp:Panel>
<asp:Panel ID="PnlLiberacionMacromedidorEstatusTramite"
runat="server"
CssClass="col-sm-6 form-group"
Visible="false">
<label>Liberación de macromedidor</label>
<asp:DropDownList ID="DdlLiberacionMacromedidorEstatusTramite"
runat="server"
CssClass="form-control select2me"
Width="100%">
<asp:ListItem Text="Sin configurar" Value="-1" />
<asp:ListItem Text="No" Value="0" />
<asp:ListItem Text="Sí" Value="1" />
</asp:DropDownList>
</asp:Panel>
<asp:Panel ID="PnlRelotificacionEstatusTramite"
runat="server"
CssClass="col-sm-6 form-group"
Visible="false">
<label>Relotificación</label>
<asp:DropDownList ID="DdlRelotificacionEstatusTramite"
runat="server"
CssClass="form-control select2me"
Width="100%">
<asp:ListItem Text="Sin configurar" Value="-1" />
<asp:ListItem Text="No" Value="0" />
<asp:ListItem Text="Sí" Value="1" />
</asp:DropDownList>
</asp:Panel>
<asp:Panel ID="PnlLiberacionDeLotesEstatusTramite"
runat="server"
CssClass="col-sm-6 form-group"
Visible="false">
<label>Liberación de lotes</label>
<asp:DropDownList ID="DdlLiberacionDeLotesEstatusTramite"
runat="server"
CssClass="form-control select2me"
Width="100%">
<asp:ListItem Text="Sin configurar" Value="-1" />
<asp:ListItem Text="No" Value="0" />
<asp:ListItem Text="Sí" Value="1" />
</asp:DropDownList>
</asp:Panel>
<asp:Panel ID="PnlLiberacionPagosDerechosEstatusTramite"
runat="server"
CssClass="col-sm-12 form-group"
Visible="false">
<label>Liberación de pagos de derechos</label>
<asp:DropDownList ID="DdlLiberacionPagosDerechosEstatusTramite"
runat="server"
CssClass="form-control select2me"
Width="100%">
<asp:ListItem Text="Sin configurar" Value="-1" />
<asp:ListItem Text="No" Value="0" />
<asp:ListItem Text="Sí" Value="1" />
</asp:DropDownList>
</asp:Panel>
</div>
</asp:Panel>
</div>
<div class="modal-footer">
@@ -1790,6 +1910,9 @@
</div>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger
ControlID="DdlNuevoEstatusTramite"
EventName="SelectedIndexChanged" />
<asp:AsyncPostBackTrigger
ControlID="BtnGuardarEstatusTramite"
EventName="Click" />

View File

@@ -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<int> CvesCondicionesEstatusActual
{
get
{
return ViewState["CvesCondicionesEstatusActual"] as List<int>
?? new List<int>();
}
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<TramiteSolicitudStatusChangeModel> 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<int>();
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<List<ModeloCondicionMostrarTramite>>
resultadoCondicionesMostrar =
AppServices.TramiteSolicitudService
.ListarCondicionesPorTramite(
resultado.Data.CveTipoTramite,
resultado.Data.CveFraccionamientoEtapa,
CurrentUser.CveUsuario,
CurrentUser.NombreDominio);
if (!resultadoCondicionesMostrar.Success)
{
Alert(
resultadoCondicionesMostrar.UserMessage,
TipoMensaje.MsgError);
return;
}
List<int> cvesCondiciones =
(resultadoCondicionesMostrar.Data ??
new List<ModeloCondicionMostrarTramite>())
.Select(condicion => condicion.CveCondicionMostrar)
.Distinct()
.ToList();
ModeloCondicionesEtapaFraccionamiento condicionesEtapa = null;
if (cvesCondiciones.Count > 0)
{
DbResult<ModeloCondicionesEtapaFraccionamiento>
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<List<TramiteSolicitudEstatusOptionModel>> 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<int> 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<int> ObtenerCvesCondicionesEstatusVisibles()
{
var cvesCondicionesVisibles = new List<int>(
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;

View File

@@ -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

View File

@@ -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