--documentos
This commit is contained in:
10
AGENTS.md
10
AGENTS.md
@@ -55,6 +55,11 @@ Database
|
||||
|
||||
---
|
||||
|
||||
## Terminología de usuarios y asociado CANADEVI
|
||||
|
||||
- Los usuarios que no son clientes se denominan **usuarios de Agua de Hermosillo** o **mojados**.
|
||||
- Sólo los usuarios de Agua de Hermosillo (mojados) pueden activar o desactivar **Asociado CANADEVI** en el registro de un desarrollador. Los usuarios clientes pueden consultar ese dato, pero no modificarlo. La restricción debe aplicarse también en servidor al guardar, no sólo en la interfaz.
|
||||
|
||||
## Source code readability rules
|
||||
|
||||
All generated or modified source code must be formatted for human maintenance.
|
||||
@@ -88,6 +93,11 @@ All generated or modified source code must be formatted for human maintenance.
|
||||
|
||||
## Mandatory complementary instruction files
|
||||
|
||||
- Antes de trabajar en cada solicitud del proyecto, leer `AGENTS.md` y los agentes complementarios aplicables. Nunca omitirlos al corregir errores o reutilizar código existente; verificar también el código que se conserva.
|
||||
- El CSS y JavaScript específicos de una página `.aspx` deben permanecer dentro de ese mismo `.aspx`: CSS en un bloque `<style>` de la sección `H` y JavaScript en un bloque `<script>` de la sección `J`. No crear archivos `.css` o `.js` separados para esa página ni trasladar su código a bundles globales, salvo petición explícita del usuario. Esta regla no cambia la carga global de recursos compartidos y de UserControls.
|
||||
- Los archivos CSS/JS de controles y UserControls deben cargarse globalmente desde `Styles/` y `Scripts/`, mediante los bundles de la master, aunque el control no esté presente. No usar `Page.Header.Controls.Add` ni inyectar archivos o definiciones CSS/JS desde el control. Para acciones puntuales desde el servidor, usar el `RegistraScript` existente (`PageScriptRegistrar.RegistraScript` en UserControls); no inventar colas ni serializar acciones como alternativa.
|
||||
- Cada instancia de un componente debe marcar su inicialización JavaScript con un atributo `data-*` propio. Inicializar sólo elementos sin marca, sin quitar y volver a agregar eventos. Aplican las reglas de `AGENTS_WEBFORMS_ESTRUCTURA.md` y `AGENTS_JAVASCRIPT_INITIALIZATION.md`.
|
||||
|
||||
The following files are part of these instructions. Read each file whose scope applies before taking action:
|
||||
|
||||
- `AGENTS_ARQUITECTURA.md`: project structure, contracts, services, repositories, models, database access, and transactions.
|
||||
|
||||
@@ -16,8 +16,10 @@ Los inicializadores deben poder ejecutarse después de la carga inicial y despu
|
||||
|
||||
- Cada control inicializado debe conservar una bandera en el propio elemento HTML.
|
||||
- Los inicializadores deben seleccionar únicamente elementos que todavía no tengan su bandera.
|
||||
- Para código nuevo, usar atributos con namespace `data-sig-<componente>-initialized="1"`.
|
||||
- Para código nuevo, usar atributos con namespace `data-sig-<componente>-inicializado="1"` (o `inicializada`, según corresponda).
|
||||
- La bandera debe identificar el componente, no usar nombres genéricos que puedan colisionar.
|
||||
- La marca pertenece a cada elemento, no al tipo de UserControl: dos instancias iguales deben inicializarse independientemente. Una bandera global sólo protege el registro global y no sustituye las marcas por elemento.
|
||||
- Usar nombres en español para las marcas nuevas, por ejemplo `data-sig-confirmacion-inicializada="1"`; conservar las marcas heredadas `*-initialized` mientras sigan en uso.
|
||||
|
||||
Ejemplos:
|
||||
|
||||
@@ -101,7 +103,7 @@ if (window.SIG_PARTIAL_INITIALIZERS_REGISTERED !== true) {
|
||||
|
||||
- Los eventos delegados sobre `body`, `document` o un contenedor permanente deben registrarse una sola vez mediante una bandera global.
|
||||
- `custom.js` ya usa `window.SIG_CUSTOM_READY_INITIALIZED`; conservar este patrón para el bloque global existente.
|
||||
- No ejecutar repetidamente `.off().on()` sobre todos los controles después de cada postback parcial.
|
||||
- Está prohibido quitar y volver a agregar eventos para inicializar: no usar `.off().on()`, `.unbind().bind()`, `removeEventListener` ni equivalentes para ese propósito. Conservar los eventos existentes y omitir los elementos ya marcados; la destrucción explícita de un componente no es una estrategia de inicialización.
|
||||
- Para eventos directos inevitables, inicializar únicamente elementos sin bandera y usar eventos con namespace.
|
||||
|
||||
Ejemplo de evento directo:
|
||||
@@ -160,5 +162,6 @@ function destroySelect2(control) {
|
||||
- Cada inicializador debe ser una función pequeña e idempotente que acepte un elemento raíz.
|
||||
- La función central sólo coordina inicializadores; no debe contener toda la lógica de cada plugin.
|
||||
- No duplicar inicializadores dentro de páginas `.aspx` si pertenecen globalmente a `Scripts/custom.js`.
|
||||
- El JavaScript específico de una página puede vivir en el placeholder `J`, pero debe seguir las mismas reglas de banderas y postbacks parciales.
|
||||
- No definir implementaciones JavaScript ni cargar sus archivos desde `.ascx` o su C#. Mantener el comportamiento en archivos de `Scripts/` incluidos globalmente. Para llamadas puntuales desde el servidor, usar el `RegistraScript` existente (`PageScriptRegistrar.RegistraScript` en UserControls), sin colas ni acciones serializadas alternativas.
|
||||
- El JavaScript específico de una página debe permanecer dentro de ese mismo `.aspx`, en un bloque `<script>` del placeholder `J`; no crear un archivo `.js` separado ni trasladarlo a un bundle global, salvo petición explícita del usuario. Debe seguir las mismas reglas de banderas y postbacks parciales.
|
||||
- No modificar archivos minificados ni dependencias de terceros para implementar estas banderas.
|
||||
|
||||
@@ -18,6 +18,14 @@ 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`.
|
||||
|
||||
## Procedimientos de tareas programadas
|
||||
|
||||
- Los procedimientos de tareas programadas deben usar el prefijo `PA_Job_` y nombres descriptivos en español, por ejemplo `PA_Job_VerificaVigencias`.
|
||||
- Ejecutarlos mediante el programador externo; no invocarlos desde cargas de página, consultas del tablero ni peticiones web.
|
||||
- Documentar su periodicidad, hora y zona horaria. La verificación de vigencias se programa diariamente a las 03:00, hora de Hermosillo.
|
||||
- El recálculo puntual después de guardar cambios permanece en su servicio y no debe disparar la revisión global de vigencias.
|
||||
- Preparar el SQL no autoriza su ejecución ni la activación del trabajo; requieren confirmación explícita conforme a `AGENTS.md`.
|
||||
|
||||
## 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.
|
||||
|
||||
@@ -52,7 +52,7 @@ Rules:
|
||||
- If a bundle exists only for old pages not migrated yet, leave it out until the page needs it.
|
||||
- Prefer preserving original asset paths from `Styles`, `Scripts`, and `Metronic`.
|
||||
- Use `CssRewriteUrlTransform` for CSS bundles that reference fonts, images, or relative URLs.
|
||||
- Do not register CSS/JS from server controls when the style/script is global; use `BundleConfig` and the master page.
|
||||
- Load CSS/JS files for server controls and UserControls globally from `Styles/` and `Scripts/` through `BundleConfig` and the master page, even when no instance is present; never inject these files from controls. Remove duplicate page references when moving a resource to a global bundle. This does not prohibit individual server-triggered calls through the existing `RegistraScript`.
|
||||
|
||||
---
|
||||
|
||||
@@ -364,9 +364,9 @@ MasterLayoutModel
|
||||
## JavaScript and CSS rules
|
||||
|
||||
- Global scripts/styles must be registered in `BundleConfig` and rendered by master.
|
||||
- Page-specific scripts go in placeholder `J`.
|
||||
- Page-specific CSS/head content goes in placeholder `H`.
|
||||
- Do not inline large JavaScript blocks in `.aspx` unless page-specific and small.
|
||||
- El JavaScript específico de una página debe quedar dentro del mismo `.aspx`, en un bloque `<script>` del placeholder `J`.
|
||||
- El CSS específico de una página debe quedar dentro del mismo `.aspx`, en un bloque `<style>` del placeholder `H`.
|
||||
- No crear archivos `.js` o `.css` separados para una página ni mover su código a bundles globales, independientemente de su tamaño, salvo petición explícita del usuario. Los recursos compartidos y de UserControls conservan su carga global.
|
||||
- Do not remove existing custom legacy files unless the user asks.
|
||||
- Fix null `addEventListener` errors by checking that the element exists before attaching events.
|
||||
- Avoid blocking Ctrl+V unless a specific feature requires it.
|
||||
@@ -379,7 +379,9 @@ If server controls are migrated:
|
||||
|
||||
- Prefer C# classes under `App_Code/SigControls` when creating reusable server controls.
|
||||
- Do not mix WebForms `.ascx` user controls with App_Code server-control classes unless there is a clear reason.
|
||||
- Do not register global CSS/JS from the control when master bundles already include them.
|
||||
- Never use `Page.Header.Controls.Add` or dynamic `HtmlLink`/`style`/`script` insertion to load resources or define CSS/JS from a control. Keep implementations in global files; use the existing `RegistraScript` (`PageScriptRegistrar.RegistraScript` in UserControls) for individual server-triggered calls. Do not replace it with action queues or serialized commands. Keep the existing centralized alert service and open lateral panels on the client click through `data-sig-panel-abrir`.
|
||||
- Business UserControls belong in `UserControl/` as `.ascx` and `.ascx.cs`; a request for a UserControl must not be implemented as an `App_Code` `CompositeControl`.
|
||||
- Verify the complete page lifecycle, including `PreRender` with the master header containing `<% ... %>` blocks, multiple instances and partial postbacks. Compilation alone does not verify this behavior.
|
||||
- Controls should expose properties/events and avoid direct SQL access.
|
||||
- Controls should call contracts/services when they need data.
|
||||
|
||||
|
||||
@@ -31,27 +31,27 @@ Estas reglas complementan `AGENTS.md` y `AGENTS_PAGE_STRUCTURE.md`.
|
||||
- Preferir esta configuración:
|
||||
|
||||
```aspx
|
||||
<asp:UpdatePanel ID="UpUsuarios" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false">
|
||||
<asp:UpdatePanel ID="UpUsuarios" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
|
||||
<ContentTemplate>
|
||||
<!-- Sección que se actualiza parcialmente -->
|
||||
</ContentTemplate>
|
||||
<Triggers>
|
||||
<asp:AsyncPostBackTrigger ControlID="BtnBuscar" EventName="Click" />
|
||||
</Triggers>
|
||||
</asp:UpdatePanel>
|
||||
```
|
||||
|
||||
- Usar `UpdateMode="Conditional"` de manera predeterminada.
|
||||
- Preferir `ChildrenAsTriggers="false"` y declarar triggers explícitos para que el comportamiento sea fácil de revisar.
|
||||
- Preferir `ChildrenAsTriggers="true"` y aprovechar los eventos de los controles hijos; no declarar `AsyncPostBackTrigger` para controles que ya están dentro del mismo panel.
|
||||
- Llamar `Update()` únicamente en paneles condicionales y sólo cuando el servidor haya modificado su contenido.
|
||||
- Evitar `UpdatePanel` anidados. Si son necesarios, documentar qué evento actualiza cada panel.
|
||||
- No actualizar varios paneles si sólo cambió una sección.
|
||||
- Los controles externos que disparen actualización parcial deben declararse como `AsyncPostBackTrigger` o registrarse mediante `ScriptManager.RegisterAsyncPostBackControl`.
|
||||
- Los controles externos que disparen actualización parcial deben colocarse dentro del panel correspondiente cuando sea apropiado; en caso contrario, registrarlos mediante `ScriptManager.RegisterAsyncPostBackControl` y actualizar explícitamente los paneles afectados.
|
||||
- Conservar `<Triggers>` únicamente cuando exista una necesidad técnica. Evitar referencias declarativas a controles de otros contenedores de nombres o secciones que puedan no estar disponibles; usar la referencia del control al registrarlo mediante `ScriptManager`.
|
||||
- En cada modal, colocar un solo `UpdatePanel` inmediatamente dentro del segundo `div` (`modal-dialog`), con todo el `modal-content` dentro de su `ContentTemplate`. No dividir el contenido del mismo modal en varios paneles.
|
||||
- Las operaciones normales de guardar, seleccionar valores, ejecutar `RowCommand` y abrir o modificar modales deben usar postbacks parciales y conservar sus eventos existentes.
|
||||
|
||||
## Operaciones que requieren postback completo
|
||||
|
||||
- Usar `PostBackTrigger` para cargas de archivos, descargas que escriben directamente en `Response`, exportaciones y otras operaciones incompatibles con postback asíncrono.
|
||||
- No intentar procesar `FileUpload` dentro de un postback parcial sin `PostBackTrigger`.
|
||||
- Conservar postbacks completos únicamente para una necesidad técnica real: cargas mediante `FileUpload`, descargas que escriben directamente en `Response`, exportaciones y otras respuestas incompatibles con AJAX. Usar `PostBackTrigger` o `ScriptManager.RegisterPostBackControl` según el contenedor del control; no usarlos para botones que únicamente guardan información o actualizan la interfaz.
|
||||
- No intentar recibir archivos mediante `FileUpload` en un postback parcial; su botón de envío debe estar registrado para postback completo.
|
||||
- No iniciar una descarga binaria desde una respuesta parcial de `UpdatePanel`.
|
||||
|
||||
## Ciclo de vida y rendimiento
|
||||
@@ -90,7 +90,7 @@ Estas reglas complementan `AGENTS.md` y `AGENTS_PAGE_STRUCTURE.md`.
|
||||
|
||||
<asp:Content ID="ContentMain" ContentPlaceHolderID="C" runat="server">
|
||||
<asp:UpdatePanel ID="UpContenido" runat="server"
|
||||
UpdateMode="Conditional" ChildrenAsTriggers="false">
|
||||
UpdateMode="Conditional" ChildrenAsTriggers="true">
|
||||
<ContentTemplate>
|
||||
<!-- No agregar otro form ni otro ScriptManager. -->
|
||||
</ContentTemplate>
|
||||
|
||||
1266
Ajuste_Bitacora_Plantillas_20260920.sql
Normal file
1266
Ajuste_Bitacora_Plantillas_20260920.sql
Normal file
File diff suppressed because it is too large
Load Diff
657
Clientes_Desarrolladores.sql
Normal file
657
Clientes_Desarrolladores.sql
Normal file
@@ -0,0 +1,657 @@
|
||||
-- Catálogo y detalle de desarrolladores.
|
||||
-- Preparar este archivo no autoriza su ejecución. Requiere instalación explícita.
|
||||
-- Reutiliza Clientes, Sis_Usuarios, Sis_UsuariosClientes y la bitácora vigente.
|
||||
-- La transacción de altas y cambios pertenece a ServicioDesarrolladores.
|
||||
SET NOCOUNT ON;
|
||||
GO
|
||||
|
||||
IF COL_LENGTH('dbo.Clientes', 'Duplicador') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE dbo.Clientes ADD Duplicador varchar(50) COLLATE Modern_Spanish_CS_AS NULL;
|
||||
END;
|
||||
GO
|
||||
|
||||
IF COL_LENGTH('dbo.Clientes', 'Referencia') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE dbo.Clientes ADD Referencia varchar(200) COLLATE Modern_Spanish_CS_AS NULL;
|
||||
END;
|
||||
GO
|
||||
|
||||
IF COL_LENGTH('dbo.Clientes', 'AsociadoCanadevi') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE dbo.Clientes ADD AsociadoCanadevi bit NOT NULL CONSTRAINT DF_Clientes_AsociadoCanadevi DEFAULT (0);
|
||||
END;
|
||||
GO
|
||||
|
||||
IF COL_LENGTH('dbo.Clientes', 'Adherente') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE dbo.Clientes ADD Adherente varchar(200) COLLATE Modern_Spanish_CS_AS NULL;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Clientes_DesarrolladorList
|
||||
@Texto varchar(200) = NULL,
|
||||
@IncluirInactivos bit = 0,
|
||||
@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
|
||||
SELECT
|
||||
C.CveCliente,
|
||||
C.RFC,
|
||||
C.Nombre,
|
||||
C.Direccion,
|
||||
C.NoExt,
|
||||
C.Duplicador,
|
||||
C.Referencia,
|
||||
C.Telefono,
|
||||
C.Mail,
|
||||
C.Adherente,
|
||||
C.Colonia,
|
||||
C.CP,
|
||||
C.Ciudad,
|
||||
C.Estado,
|
||||
C.Pais,
|
||||
C.CvePais,
|
||||
C.CveSATEstado,
|
||||
C.CveMunicipio,
|
||||
C.CveLocalidad,
|
||||
C.CveColonia,
|
||||
C.AsociadoCanadevi,
|
||||
C.Estatus
|
||||
FROM dbo.Clientes AS C
|
||||
WHERE (@IncluirInactivos = 1 OR C.Estatus = 1)
|
||||
AND
|
||||
(
|
||||
NULLIF(@Texto, '') IS NULL
|
||||
OR C.Nombre LIKE '%' + @Texto + '%'
|
||||
OR C.RFC LIKE '%' + @Texto + '%'
|
||||
OR C.Mail LIKE '%' + @Texto + '%'
|
||||
)
|
||||
ORDER BY C.Nombre, C.CveCliente;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'Ocurrió un error al procesar el desarrollador; 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_Clientes_DesarrolladorList'),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE()
|
||||
);
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Clientes_DesarrolladorGet
|
||||
@CveCliente 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
|
||||
SELECT
|
||||
C.CveCliente,
|
||||
C.RFC,
|
||||
C.Nombre,
|
||||
C.Direccion,
|
||||
C.NoExt,
|
||||
C.Duplicador,
|
||||
C.Referencia,
|
||||
C.Telefono,
|
||||
C.Mail,
|
||||
C.Adherente,
|
||||
C.Colonia,
|
||||
C.CP,
|
||||
C.Ciudad,
|
||||
C.Estado,
|
||||
C.Pais,
|
||||
C.CvePais,
|
||||
C.CveSATEstado,
|
||||
C.CveMunicipio,
|
||||
C.CveLocalidad,
|
||||
C.CveColonia,
|
||||
C.AsociadoCanadevi,
|
||||
C.Estatus
|
||||
FROM dbo.Clientes AS C
|
||||
WHERE C.CveCliente = @CveCliente;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'Ocurrió un error al procesar el desarrollador; 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_Clientes_DesarrolladorGet'),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE()
|
||||
);
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Clientes_DesarrolladorAdd
|
||||
@RFC varchar(15),
|
||||
@Nombre varchar(200),
|
||||
@Direccion varchar(90),
|
||||
@NoExt varchar(20),
|
||||
@Duplicador varchar(50),
|
||||
@Referencia varchar(200),
|
||||
@Telefono varchar(25),
|
||||
@Mail varchar(255),
|
||||
@Adherente varchar(200),
|
||||
@Colonia varchar(50),
|
||||
@CP varchar(10),
|
||||
@Ciudad varchar(50),
|
||||
@Estado varchar(35),
|
||||
@Pais varchar(50),
|
||||
@CvePais int,
|
||||
@CveSATEstado int,
|
||||
@CveMunicipio int,
|
||||
@CveLocalidad int,
|
||||
@CveColonia int,
|
||||
@AsociadoCanadevi bit,
|
||||
@GenerarUsuario bit = 0,
|
||||
@NombreUsuario varchar(100) = NULL,
|
||||
@CorreoUsuario varchar(255) = NULL,
|
||||
@HashContrasena varchar(500) = 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 NULLIF(LTRIM(RTRIM(@Nombre)), '') IS NULL
|
||||
OR NULLIF(LTRIM(RTRIM(@RFC)), '') IS NULL
|
||||
OR NULLIF(LTRIM(RTRIM(@Direccion)), '') IS NULL
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Capture RFC, nombre y calle.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
DECLARE @AsociadoAnterior bit = 0;
|
||||
-- Regla solicitada: únicamente los usuarios no clientes pueden cambiar CANADEVI.
|
||||
IF @AsociadoCanadevi <> ISNULL(@AsociadoAnterior, 0)
|
||||
AND NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Sis_Usuarios
|
||||
WHERE CveUsuario = @CveUsuarioEjecuta
|
||||
AND CveRol <> 3
|
||||
AND Activo = 1
|
||||
)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Sólo los usuarios de Agua de Hermosillo pueden cambiar Asociado CANADEVI.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF EXISTS (SELECT 1 FROM dbo.Clientes WHERE RFC = @RFC)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Ya existe un desarrollador con ese RFC.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
DECLARE @CveUsuarioNuevo int = 0;
|
||||
DECLARE @CveCliente int;
|
||||
IF @GenerarUsuario = 1
|
||||
BEGIN
|
||||
IF NULLIF(LTRIM(RTRIM(@NombreUsuario)), '') IS NULL
|
||||
OR NULLIF(LTRIM(RTRIM(@CorreoUsuario)), '') IS NULL
|
||||
OR NULLIF(@HashContrasena, '') IS NULL
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Capture usuario y correo para generar el acceso.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Sis_Usuarios
|
||||
WHERE NombreUsuario = @NombreUsuario
|
||||
OR CorreoElectronico = @CorreoUsuario
|
||||
)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'El usuario o correo de acceso ya está registrado.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
INSERT INTO dbo.Sis_Usuarios
|
||||
(
|
||||
NombreUsuario, CorreoElectronico, HashContrasena, CveRol,
|
||||
Activo, DebeCambiarContrasena, CorreoVerificado, FechaCreacion
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
@NombreUsuario, @CorreoUsuario, @HashContrasena, 3,
|
||||
1, 1, 1, SYSDATETIME()
|
||||
);
|
||||
SET @CveUsuarioNuevo = CONVERT(int, SCOPE_IDENTITY());
|
||||
END;
|
||||
|
||||
INSERT INTO dbo.Clientes
|
||||
(
|
||||
RFC,
|
||||
Nombre,
|
||||
Direccion,
|
||||
NoExt,
|
||||
Duplicador,
|
||||
Referencia,
|
||||
Telefono,
|
||||
Mail,
|
||||
Adherente,
|
||||
Colonia,
|
||||
CP,
|
||||
Ciudad,
|
||||
Estado,
|
||||
Pais,
|
||||
CvePais,
|
||||
CveSATEstado,
|
||||
CveMunicipio,
|
||||
CveLocalidad,
|
||||
CveColonia,
|
||||
AsociadoCanadevi,
|
||||
CveEstado,
|
||||
Estatus,
|
||||
Fecha,
|
||||
CveUsuario,
|
||||
FechaIng
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
@RFC,
|
||||
@Nombre,
|
||||
@Direccion,
|
||||
@NoExt,
|
||||
@Duplicador,
|
||||
@Referencia,
|
||||
@Telefono,
|
||||
@Mail,
|
||||
@Adherente,
|
||||
@Colonia,
|
||||
@CP,
|
||||
@Ciudad,
|
||||
@Estado,
|
||||
@Pais,
|
||||
@CvePais,
|
||||
@CveSATEstado,
|
||||
@CveMunicipio,
|
||||
@CveLocalidad,
|
||||
@CveColonia,
|
||||
@AsociadoCanadevi,
|
||||
@CveSATEstado,
|
||||
1,
|
||||
CONVERT(date, GETDATE()),
|
||||
@CveUsuarioEjecuta,
|
||||
GETDATE()
|
||||
);
|
||||
SET @CveCliente = CONVERT(int, SCOPE_IDENTITY());
|
||||
|
||||
IF @GenerarUsuario = 1
|
||||
BEGIN
|
||||
INSERT INTO dbo.Sis_UsuariosClientes
|
||||
(
|
||||
CveUsuario, CveCliente, Orden, EsPrincipal, Activo, CveUsuarioRegistro
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
@CveUsuarioNuevo, @CveCliente, 1, 1, 1, @CveUsuarioEjecuta
|
||||
);
|
||||
END;
|
||||
|
||||
SELECT @CveCliente AS CveCliente, @CveUsuarioNuevo AS CveUsuario;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'Ocurrió un error al procesar el desarrollador; 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_Clientes_DesarrolladorAdd'),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE()
|
||||
);
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Clientes_DesarrolladorUpdate
|
||||
@CveCliente int,
|
||||
@RFC varchar(15),
|
||||
@Nombre varchar(200),
|
||||
@Direccion varchar(90),
|
||||
@NoExt varchar(20),
|
||||
@Duplicador varchar(50),
|
||||
@Referencia varchar(200),
|
||||
@Telefono varchar(25),
|
||||
@Mail varchar(255),
|
||||
@Adherente varchar(200),
|
||||
@Colonia varchar(50),
|
||||
@CP varchar(10),
|
||||
@Ciudad varchar(50),
|
||||
@Estado varchar(35),
|
||||
@Pais varchar(50),
|
||||
@CvePais int,
|
||||
@CveSATEstado int,
|
||||
@CveMunicipio int,
|
||||
@CveLocalidad int,
|
||||
@CveColonia int,
|
||||
@AsociadoCanadevi bit,
|
||||
@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 NULLIF(LTRIM(RTRIM(@Nombre)), '') IS NULL
|
||||
OR NULLIF(LTRIM(RTRIM(@RFC)), '') IS NULL
|
||||
OR NULLIF(LTRIM(RTRIM(@Direccion)), '') IS NULL
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Capture RFC, nombre y calle.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM dbo.Clientes WHERE CveCliente = @CveCliente)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'El desarrollador ya no existe.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
DECLARE @AsociadoAnterior bit;
|
||||
SELECT @AsociadoAnterior = AsociadoCanadevi
|
||||
FROM dbo.Clientes WITH (UPDLOCK)
|
||||
WHERE CveCliente = @CveCliente;
|
||||
-- Regla solicitada: únicamente los usuarios no clientes pueden cambiar CANADEVI.
|
||||
IF @AsociadoCanadevi <> ISNULL(@AsociadoAnterior, 0)
|
||||
AND NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Sis_Usuarios
|
||||
WHERE CveUsuario = @CveUsuarioEjecuta
|
||||
AND CveRol <> 3
|
||||
AND Activo = 1
|
||||
)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Sólo los usuarios de Agua de Hermosillo pueden cambiar Asociado CANADEVI.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Clientes
|
||||
WHERE RFC = @RFC AND CveCliente <> @CveCliente
|
||||
)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Ya existe otro desarrollador con ese RFC.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
UPDATE dbo.Clientes
|
||||
SET
|
||||
RFC = @RFC,
|
||||
Nombre = @Nombre,
|
||||
Direccion = @Direccion,
|
||||
NoExt = @NoExt,
|
||||
Duplicador = @Duplicador,
|
||||
Referencia = @Referencia,
|
||||
Telefono = @Telefono,
|
||||
Mail = @Mail,
|
||||
Adherente = @Adherente,
|
||||
Colonia = @Colonia,
|
||||
CP = @CP,
|
||||
Ciudad = @Ciudad,
|
||||
Estado = @Estado,
|
||||
Pais = @Pais,
|
||||
CvePais = @CvePais,
|
||||
CveSATEstado = @CveSATEstado,
|
||||
CveMunicipio = @CveMunicipio,
|
||||
CveLocalidad = @CveLocalidad,
|
||||
CveColonia = @CveColonia,
|
||||
AsociadoCanadevi = @AsociadoCanadevi,
|
||||
CveEstado = @CveSATEstado,
|
||||
CveUsuarioModifico = @CveUsuarioEjecuta
|
||||
WHERE CveCliente = @CveCliente;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'Ocurrió un error al procesar el desarrollador; 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_Clientes_DesarrolladorUpdate'),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE()
|
||||
);
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
-- Configuración de campos auditables; no incluye contraseñas ni hashes.
|
||||
DECLARE @Acciones TABLE
|
||||
(
|
||||
CodigoAccion varchar(150) COLLATE Modern_Spanish_CI_AS,
|
||||
NombreAccion varchar(150)
|
||||
);
|
||||
INSERT INTO @Acciones (CodigoAccion, NombreAccion)
|
||||
VALUES
|
||||
('AgregarDesarrollador', 'Agregar desarrollador'),
|
||||
('ActualizarDesarrollador', 'Actualizar desarrollador');
|
||||
|
||||
INSERT INTO dbo.Bit_DefinicionesAccion
|
||||
(CodigoAccion, NombreAccion, DescripcionAccion, CveTabla, CveTipoMovimiento, Activo)
|
||||
SELECT A.CodigoAccion, A.NombreAccion, A.NombreAccion, NULL, NULL, 1
|
||||
FROM @Acciones AS A
|
||||
WHERE NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM dbo.Bit_DefinicionesAccion AS D
|
||||
WHERE D.CodigoAccion = A.CodigoAccion
|
||||
);
|
||||
|
||||
UPDATE D
|
||||
SET Activo = 1
|
||||
FROM dbo.Bit_DefinicionesAccion AS D
|
||||
INNER JOIN @Acciones AS A ON A.CodigoAccion = D.CodigoAccion;
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM dbo.Bit_Tablas WHERE NombreTablaSQL = 'Clientes')
|
||||
BEGIN
|
||||
INSERT INTO dbo.Bit_Tablas
|
||||
(NombreTablaSQL, NombreMostrar, NombreCampoLlaveSQL, Activo, FechaAlta)
|
||||
VALUES
|
||||
('Clientes', 'Desarrolladores', 'CveCliente', 1, GETDATE());
|
||||
END;
|
||||
|
||||
UPDATE dbo.Bit_Tablas
|
||||
SET Activo = 1, NombreCampoLlaveSQL = 'CveCliente'
|
||||
WHERE NombreTablaSQL = 'Clientes';
|
||||
|
||||
DECLARE @Campos TABLE
|
||||
(
|
||||
Campo varchar(128),
|
||||
Nombre varchar(150),
|
||||
Tipo varchar(128)
|
||||
);
|
||||
INSERT INTO @Campos (Campo, Nombre, Tipo)
|
||||
VALUES
|
||||
('CveCliente', 'CveCliente', 'int'),
|
||||
('RFC', 'RFC', 'varchar'),
|
||||
('Nombre', 'Nombre', 'varchar'),
|
||||
('Direccion', 'Direccion', 'varchar'),
|
||||
('NoExt', 'NoExt', 'varchar'),
|
||||
('Duplicador', 'Duplicador', 'varchar'),
|
||||
('Referencia', 'Referencia', 'varchar'),
|
||||
('Telefono', 'Telefono', 'varchar'),
|
||||
('Mail', 'Mail', 'varchar'),
|
||||
('Adherente', 'Adherente', 'varchar'),
|
||||
('Colonia', 'Colonia', 'varchar'),
|
||||
('CP', 'CP', 'varchar'),
|
||||
('Ciudad', 'Ciudad', 'varchar'),
|
||||
('Estado', 'Estado', 'varchar'),
|
||||
('Pais', 'Pais', 'varchar'),
|
||||
('CvePais', 'CvePais', 'int'),
|
||||
('CveSATEstado', 'CveSATEstado', 'int'),
|
||||
('CveMunicipio', 'CveMunicipio', 'int'),
|
||||
('CveLocalidad', 'CveLocalidad', 'int'),
|
||||
('CveColonia', 'CveColonia', 'int'),
|
||||
('AsociadoCanadevi', 'AsociadoCanadevi', 'bit'),
|
||||
('Estatus', 'Estatus', 'bit');
|
||||
|
||||
INSERT INTO dbo.Bit_Campos
|
||||
(CveTabla, NombreCampoSQL, NombreMostrar, TipoDatoSQL, MostrarEnBitacora, Activo, FechaAlta)
|
||||
SELECT T.CveTabla, C.Campo, C.Nombre, C.Tipo, 1, 1, GETDATE()
|
||||
FROM @Campos AS C
|
||||
INNER JOIN dbo.Bit_Tablas AS T ON T.NombreTablaSQL = 'Clientes'
|
||||
WHERE NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Bit_Campos AS B
|
||||
WHERE B.CveTabla = T.CveTabla AND B.NombreCampoSQL = C.Campo
|
||||
);
|
||||
|
||||
UPDATE B
|
||||
SET Activo = 1, MostrarEnBitacora = 1
|
||||
FROM dbo.Bit_Campos AS B
|
||||
INNER JOIN dbo.Bit_Tablas AS T ON T.CveTabla = B.CveTabla AND T.NombreTablaSQL = 'Clientes'
|
||||
INNER JOIN @Campos AS C ON C.Campo = B.NombreCampoSQL;
|
||||
GO
|
||||
|
||||
-- Rutas del catálogo y detalle; el detalle hereda los permisos del catálogo.
|
||||
DECLARE @CvePlataforma int;
|
||||
DECLARE @CvePadre int;
|
||||
SELECT TOP (1)
|
||||
@CvePadre = CveModulo,
|
||||
@CvePlataforma = CvePlataforma
|
||||
FROM dbo.Sis_Modulos
|
||||
WHERE NombreModulo = 'Desarrolladores' AND CveModuloPadre IS NULL
|
||||
ORDER BY CveModulo;
|
||||
|
||||
IF @CvePlataforma IS NULL
|
||||
BEGIN
|
||||
THROW 51001, 'No se encontró el módulo padre Desarrolladores.', 1;
|
||||
END;
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM dbo.Sis_Modulos
|
||||
WHERE Url = '~/Pages/Desarrolladores/Desarrolladores.aspx'
|
||||
)
|
||||
BEGIN
|
||||
INSERT INTO dbo.Sis_Modulos
|
||||
(
|
||||
CveModuloPadre, CvePlataforma, NombreModulo, Url,
|
||||
ClaseCssIcono, OrdenVisualizacion, Visible, Activo, FechaCreacion
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
@CvePadre, @CvePlataforma, 'Registro de desarrolladores',
|
||||
'~/Pages/Desarrolladores/Desarrolladores.aspx',
|
||||
'fa fa-users', 5, 1, 1, GETDATE()
|
||||
);
|
||||
END;
|
||||
|
||||
DECLARE @CveCatalogo int;
|
||||
SELECT @CveCatalogo = CveModulo
|
||||
FROM dbo.Sis_Modulos
|
||||
WHERE Url = '~/Pages/Desarrolladores/Desarrolladores.aspx';
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM dbo.Sis_Modulos
|
||||
WHERE Url = '~/Pages/Desarrolladores/DesarrolladorDetalle.aspx'
|
||||
)
|
||||
BEGIN
|
||||
INSERT INTO dbo.Sis_Modulos
|
||||
(
|
||||
CveModuloPadre, CvePlataforma, NombreModulo, Url,
|
||||
ClaseCssIcono, OrdenVisualizacion, Visible, Activo, FechaCreacion
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
@CveCatalogo, @CvePlataforma, 'Detalle de desarrollador',
|
||||
'~/Pages/Desarrolladores/DesarrolladorDetalle.aspx',
|
||||
'fa fa-building', 1, 0, 1, GETDATE()
|
||||
);
|
||||
END;
|
||||
|
||||
-- Se conservan permisos ya existentes. Para el catálogo nuevo se reutilizan los del padre.
|
||||
INSERT INTO dbo.Sis_RolesModulos
|
||||
(
|
||||
CveRol, CveModulo, PuedeVer, PuedeCrear, PuedeModificar,
|
||||
PuedeEliminar, PuedeImprimir, PuedeExportar, FechaCreacion
|
||||
)
|
||||
SELECT
|
||||
R.CveRol, @CveCatalogo, R.PuedeVer, R.PuedeCrear, R.PuedeModificar,
|
||||
0, 0, 0, GETDATE()
|
||||
FROM dbo.Sis_RolesModulos AS R
|
||||
WHERE R.CveModulo = @CvePadre
|
||||
AND NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM dbo.Sis_RolesModulos AS E
|
||||
WHERE E.CveRol = R.CveRol AND E.CveModulo = @CveCatalogo
|
||||
);
|
||||
|
||||
INSERT INTO dbo.Sis_RolesModulos
|
||||
(
|
||||
CveRol, CveModulo, PuedeVer, PuedeCrear, PuedeModificar,
|
||||
PuedeEliminar, PuedeImprimir, PuedeExportar, FechaCreacion
|
||||
)
|
||||
SELECT
|
||||
R.CveRol, D.CveModulo, R.PuedeVer, R.PuedeCrear, R.PuedeModificar,
|
||||
0, 0, 0, GETDATE()
|
||||
FROM dbo.Sis_RolesModulos AS R
|
||||
INNER JOIN dbo.Sis_Modulos AS D ON D.Url = '~/Pages/Desarrolladores/DesarrolladorDetalle.aspx'
|
||||
WHERE R.CveModulo = @CveCatalogo
|
||||
AND NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM dbo.Sis_RolesModulos AS E
|
||||
WHERE E.CveRol = R.CveRol AND E.CveModulo = D.CveModulo
|
||||
);
|
||||
GO
|
||||
77
Configuracion_DocumentosSolicitud_20260918.sql
Normal file
77
Configuracion_DocumentosSolicitud_20260918.sql
Normal file
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
Configuración particular de documentos por solicitud.
|
||||
Instalación verificada: 18/09/2026. Respaldo COPY_ONLY con CHECKSUM:
|
||||
E:\SqlServer2022\MSSQL16.MSSQLSERVER\MSSQL\Backup\SIG_PlataformaDesarolladores_configuracion_documentos_20260918_083743.bak
|
||||
Aplicar junto con Procedimientos_DocumentosSolicitudConfiguracion_20260918.sql
|
||||
en una transacción de instalación. No copia ni modifica configuraciones generales.
|
||||
Una fila particular sustituye la configuración general completa.
|
||||
EsActivo = 0 suspende el requisito particular; eliminar la fila vuelve a heredar.
|
||||
Los archivos físicos y su validación permanecen en Tra_DocumentosSolicitud.
|
||||
*/
|
||||
SET NOCOUNT ON;
|
||||
|
||||
IF OBJECT_ID('dbo.Tra_SolicitudDocumentoConfiguracion', 'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE dbo.Tra_SolicitudDocumentoConfiguracion
|
||||
(
|
||||
CveSolicitud int NOT NULL,
|
||||
CveTipoDocumento int NOT NULL,
|
||||
EsRequerido bit NOT NULL
|
||||
CONSTRAINT DF_Tra_SolicitudDocumentoConfiguracion_EsRequerido DEFAULT (0),
|
||||
EsCliente bit NOT NULL
|
||||
CONSTRAINT DF_Tra_SolicitudDocumentoConfiguracion_EsCliente DEFAULT (1),
|
||||
TieneVigencia bit NOT NULL
|
||||
CONSTRAINT DF_Tra_SolicitudDocumentoConfiguracion_TieneVigencia DEFAULT (0),
|
||||
Orden int NOT NULL
|
||||
CONSTRAINT DF_Tra_SolicitudDocumentoConfiguracion_Orden DEFAULT (0),
|
||||
EsActivo bit NOT NULL
|
||||
CONSTRAINT DF_Tra_SolicitudDocumentoConfiguracion_EsActivo DEFAULT (1),
|
||||
CONSTRAINT PK_Tra_SolicitudDocumentoConfiguracion
|
||||
PRIMARY KEY CLUSTERED (CveSolicitud, CveTipoDocumento),
|
||||
CONSTRAINT FK_Tra_SolicitudDocumentoConfiguracion_Solicitud
|
||||
FOREIGN KEY (CveSolicitud) REFERENCES dbo.Tra_Solicitudes (CveSolicitud),
|
||||
CONSTRAINT FK_Tra_SolicitudDocumentoConfiguracion_TipoDocumento
|
||||
FOREIGN KEY (CveTipoDocumento) REFERENCES dbo.Tra_TiposDocumento (CveTipoDocumento)
|
||||
);
|
||||
END;
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Bit_Tablas
|
||||
WHERE NombreTablaSQL = 'Tra_SolicitudDocumentoConfiguracion'
|
||||
)
|
||||
BEGIN
|
||||
INSERT INTO dbo.Bit_Tablas
|
||||
(NombreTablaSQL, NombreMostrar, Descripcion, NombreCampoLlaveSQL, Activo)
|
||||
VALUES
|
||||
('Tra_SolicitudDocumentoConfiguracion', 'Documentos particulares de la solicitud',
|
||||
'Configuración de documentos exclusiva de una solicitud.', NULL, 1);
|
||||
END;
|
||||
|
||||
DECLARE @CveTabla int;
|
||||
SELECT @CveTabla = CveTabla
|
||||
FROM dbo.Bit_Tablas
|
||||
WHERE NombreTablaSQL = 'Tra_SolicitudDocumentoConfiguracion';
|
||||
|
||||
INSERT INTO dbo.Bit_Campos
|
||||
(CveTabla, NombreCampoSQL, NombreMostrar, MostrarEnBitacora, TipoDatoSQL, Activo)
|
||||
SELECT @CveTabla, C.Nombre, C.Titulo, 1, C.Tipo, 1
|
||||
FROM
|
||||
(
|
||||
VALUES
|
||||
('CveSolicitud', 'Solicitud', 'int'),
|
||||
('CveTipoDocumento', 'Tipo de documento', 'int'),
|
||||
('EsRequerido', 'Requerido', 'bit'),
|
||||
('EsCliente', 'Lo proporciona el desarrollador', 'bit'),
|
||||
('TieneVigencia', 'Tiene vigencia', 'bit'),
|
||||
('Orden', 'Orden', 'int'),
|
||||
('EsActivo', 'Activo', 'bit')
|
||||
) AS C(Nombre, Titulo, Tipo)
|
||||
WHERE NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Bit_Campos AS B
|
||||
WHERE B.CveTabla = @CveTabla
|
||||
AND B.NombreCampoSQL = C.Nombre
|
||||
);
|
||||
109
Documentos_Etapa_Estructura_20260927.sql
Normal file
109
Documentos_Etapa_Estructura_20260927.sql
Normal file
@@ -0,0 +1,109 @@
|
||||
/* Preparación únicamente. Ejecutar junto con los PA dentro de una transacción
|
||||
de instalación administrada por el ejecutor, después de respaldo y autorización.
|
||||
No mueve archivos ni elimina documentos históricos. */
|
||||
SET NOCOUNT ON;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT CveFraccionamientoEtapa, CveTipoDocumento
|
||||
FROM dbo.Tra_DocumentosSolicitud
|
||||
WHERE EsActivo = 1
|
||||
GROUP BY CveFraccionamientoEtapa, CveTipoDocumento
|
||||
HAVING COUNT(*) > 1
|
||||
)
|
||||
THROW 51000, 'Existen versiones activas duplicadas por etapa/tipo. Resolver su versión vigente antes de instalar; no se eliminarán archivos.', 1;
|
||||
|
||||
IF COL_LENGTH('dbo.Tra_DocumentosSolicitud', 'Vencido') IS NULL
|
||||
ALTER TABLE dbo.Tra_DocumentosSolicitud
|
||||
ADD Vencido bit NOT NULL
|
||||
CONSTRAINT DF_Tra_DocumentosSolicitud_Vencido DEFAULT (0);
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1 FROM sys.indexes
|
||||
WHERE object_id = OBJECT_ID('dbo.Tra_DocumentosSolicitud')
|
||||
AND name = 'UX_Tra_DocumentosSolicitud_Solicitud_TipoDocumento'
|
||||
)
|
||||
DROP INDEX UX_Tra_DocumentosSolicitud_Solicitud_TipoDocumento
|
||||
ON dbo.Tra_DocumentosSolicitud;
|
||||
|
||||
ALTER TABLE dbo.Tra_DocumentosSolicitud ALTER COLUMN CveSolicitud int NULL;
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM sys.indexes
|
||||
WHERE object_id = OBJECT_ID('dbo.Tra_DocumentosSolicitud')
|
||||
AND name = 'UX_Tra_DocumentosSolicitud_Etapa_TipoDocumento'
|
||||
)
|
||||
CREATE UNIQUE INDEX UX_Tra_DocumentosSolicitud_Etapa_TipoDocumento
|
||||
ON dbo.Tra_DocumentosSolicitud (CveFraccionamientoEtapa, CveTipoDocumento)
|
||||
WHERE EsActivo = 1;
|
||||
|
||||
IF COL_LENGTH('dbo.Tra_SolicitudDocumentoConfiguracion', 'CveFraccionamientoEtapa') IS NULL
|
||||
ALTER TABLE dbo.Tra_SolicitudDocumentoConfiguracion
|
||||
ADD CveFraccionamientoEtapa int NULL;
|
||||
GO
|
||||
|
||||
UPDATE C
|
||||
SET CveFraccionamientoEtapa = S.CveFraccionamientoEtapa
|
||||
FROM dbo.Tra_SolicitudDocumentoConfiguracion AS C
|
||||
INNER JOIN dbo.Tra_Solicitudes AS S ON S.CveSolicitud = C.CveSolicitud
|
||||
WHERE C.CveFraccionamientoEtapa IS NULL;
|
||||
|
||||
ALTER TABLE dbo.Tra_SolicitudDocumentoConfiguracion
|
||||
ALTER COLUMN CveFraccionamientoEtapa int NOT NULL;
|
||||
|
||||
IF COL_LENGTH('dbo.Tra_SolicitudDocumentoConfiguracion', 'CveConfiguracionDocumento') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE dbo.Tra_SolicitudDocumentoConfiguracion
|
||||
DROP CONSTRAINT PK_Tra_SolicitudDocumentoConfiguracion;
|
||||
ALTER TABLE dbo.Tra_SolicitudDocumentoConfiguracion
|
||||
ALTER COLUMN CveSolicitud int NULL;
|
||||
ALTER TABLE dbo.Tra_SolicitudDocumentoConfiguracion
|
||||
ADD CveConfiguracionDocumento int IDENTITY(1, 1) NOT NULL
|
||||
CONSTRAINT PK_Tra_SolicitudDocumentoConfiguracion PRIMARY KEY;
|
||||
END;
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM sys.foreign_keys
|
||||
WHERE name = 'FK_Tra_SolicitudDocumentoConfiguracion_Etapa'
|
||||
)
|
||||
ALTER TABLE dbo.Tra_SolicitudDocumentoConfiguracion WITH CHECK
|
||||
ADD CONSTRAINT FK_Tra_SolicitudDocumentoConfiguracion_Etapa
|
||||
FOREIGN KEY (CveFraccionamientoEtapa)
|
||||
REFERENCES dbo.FraccionamientosEtapas (CveFraccionamientoEtapa);
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM sys.indexes
|
||||
WHERE object_id = OBJECT_ID('dbo.Tra_SolicitudDocumentoConfiguracion')
|
||||
AND name = 'UX_Tra_ConfiguracionDocumento_Solicitud'
|
||||
)
|
||||
BEGIN
|
||||
CREATE UNIQUE INDEX UX_Tra_ConfiguracionDocumento_Solicitud
|
||||
ON dbo.Tra_SolicitudDocumentoConfiguracion (CveSolicitud, CveTipoDocumento)
|
||||
WHERE CveSolicitud IS NOT NULL;
|
||||
CREATE UNIQUE INDEX UX_Tra_ConfiguracionDocumento_Etapa
|
||||
ON dbo.Tra_SolicitudDocumentoConfiguracion (CveFraccionamientoEtapa, CveTipoDocumento)
|
||||
WHERE CveSolicitud IS NULL;
|
||||
END;
|
||||
|
||||
INSERT INTO dbo.Bit_Campos
|
||||
(CveTabla, NombreCampoSQL, NombreMostrar, MostrarEnBitacora, TipoDatoSQL, Activo)
|
||||
SELECT T.CveTabla, C.Campo, C.Titulo, 1, C.Tipo, 1
|
||||
FROM dbo.Bit_Tablas AS T
|
||||
INNER JOIN
|
||||
(
|
||||
VALUES
|
||||
('Tra_DocumentosSolicitud', 'Vencido', 'Requiere renovación', 'bit'),
|
||||
('Tra_DocumentosSolicitud', 'EsActivo', 'Versión vigente', 'bit'),
|
||||
('Tra_SolicitudDocumentoConfiguracion', 'CveFraccionamientoEtapa', 'Etapa', 'int'),
|
||||
('Tra_SolicitudDocumentoConfiguracion', 'CveConfiguracionDocumento', 'Requerimiento', 'int')
|
||||
) AS C(Tabla, Campo, Titulo, Tipo) ON C.Tabla = T.NombreTablaSQL
|
||||
WHERE NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM dbo.Bit_Campos AS B
|
||||
WHERE B.CveTabla = T.CveTabla AND B.NombreCampoSQL = C.Campo
|
||||
);
|
||||
GO
|
||||
127
Documentos_Etapa_Implementacion_20260927.md
Normal file
127
Documentos_Etapa_Implementacion_20260927.md
Normal file
@@ -0,0 +1,127 @@
|
||||
# Documentos compartidos por etapa
|
||||
|
||||
## Estado de la entrega
|
||||
|
||||
Código preparado y cambios de BD instalados el 27 de septiembre de 2026 en
|
||||
`SIG_PlataformaDesarolladores`, con autorización del usuario. Los dos scripts se
|
||||
ejecutaron en una sola transacción: dos lotes de estructura y trece de procedimientos.
|
||||
El recálculo inicial se ejecutó mediante el comando del paso existente del job,
|
||||
comprobando sus parámetros de salida. Las consultas de verificación no detectaron
|
||||
inconsistencias. La base contenía cero documentos y cero configuraciones particulares;
|
||||
las pruebas integradas de las pantallas indicadas al final siguen pendientes.
|
||||
|
||||
Respaldo previo `COPY_ONLY`, con `CHECKSUM` y `RESTORE VERIFYONLY WITH CHECKSUM` correctos:
|
||||
`E:\SqlServer2022\MSSQL16.MSSQLSERVER\MSSQL\Backup\SIG_PlataformaDesarolladores_documentos_etapa_20260927_092116.bak`.
|
||||
|
||||
El código y los PA deben desplegarse coordinadamente: las firmas nuevas no son compatibles
|
||||
con los PA anteriores.
|
||||
|
||||
## Estructura reutilizada
|
||||
|
||||
- `Tra_DocumentosSolicitud` conserva su nombre y su identidad. La pertenencia es
|
||||
`CveFraccionamientoEtapa + CveTipoDocumento`. `CveSolicitud` queda como origen opcional.
|
||||
- El índice filtrado permite una sola versión activa por etapa/tipo. Las renovaciones
|
||||
ordinarias conservan el registro y archivo anterior, con `EsActivo = 0`, y crean una
|
||||
nueva versión pendiente de revisión. El archivo nuevo tiene un nombre único en
|
||||
`Documentos/Clientes/{cliente}/Etapas/{etapa}/`.
|
||||
- GIS mantiene su mecanismo específico de reemplazo y su nombre físico establecido.
|
||||
No se crean supuestas versiones históricas que apunten al mismo archivo GIS sobrescrito.
|
||||
- Los históricos no se eliminan ni se reactivan al eliminar la versión actual. El nuevo
|
||||
tablero muestra la versión vigente; no agrega una pantalla de historial.
|
||||
- `Tra_TiposTramiteDocumento` permanece como relación general de requisitos.
|
||||
- `Tra_SolicitudDocumentoConfiguracion` agrega etapa y clave propia para permitir
|
||||
`CveSolicitud = NULL`. La configuración particular sigue sustituyendo a la general
|
||||
en su solicitud. La configuración sin trámite pertenece únicamente a la etapa.
|
||||
|
||||
## Requerimientos y vigencia
|
||||
|
||||
El requisito actual resulta de la unión de configuraciones efectivas de solicitudes
|
||||
no finales y requisitos manuales activos sin solicitud. Se conserva `EsFinal` como
|
||||
regla existente: también el estatus `Revisando` está marcado como final en esta BD.
|
||||
No se modifican estatus ni sus definiciones.
|
||||
|
||||
`Vencido = 1` sólo si la versión está activa, su fecha ya pasó y actualmente es requerida.
|
||||
La fecha es inclusiva: un documento que vence hoy todavía no se considera expirado.
|
||||
Se usa `US Mountain Standard Time`, equivalente a la hora de Hermosillo.
|
||||
|
||||
Las lecturas no ejecutan el job ni actualizan documentos. Calculan la presentación
|
||||
con la fecha y los requisitos actuales, de manera que no dependa de esperar al siguiente
|
||||
job. La marca persistida se actualiza tras cambios de archivo, revisión, requisitos,
|
||||
alta manual de trámite y cambio de estatus; la revisión global diaria también la corrige.
|
||||
Cambios de configuración hechos fuera de esos servicios se reflejan en el listado y
|
||||
quedan persistidos en la siguiente ejecución nocturna.
|
||||
|
||||
El PA de listado tiene dos usos: el tablero devuelve una entrada por etapa/tipo;
|
||||
el seguimiento devuelve los requisitos por solicitud apuntando al mismo identificador
|
||||
de archivo. Esas referencias no crean registros ni copias físicas por trámite.
|
||||
|
||||
## Interfaz
|
||||
|
||||
`DocumentosEtapa.ascx` se usa en `DetalleEtapa.ascx` y `FraccionamientoDetalle.aspx`.
|
||||
`EtapaDetalle.aspx` conserva la redirección existente al panel de detalle real.
|
||||
|
||||
Las cortinas siempre aparecen en este orden: Pendientes, Por aprobar, Aprobados, Vencidos.
|
||||
Los rechazados se muestran en Por aprobar con su estado y motivo. Un aprobado expirado
|
||||
sin requisito sigue en Aprobados, con su fecha en rojo. Se conservan los filtros del
|
||||
fraccionamiento y la administración GIS existente.
|
||||
|
||||
La solicitud adicional permite elegir etapa, tipo y trámite opcional. Sólo los usuarios
|
||||
de Agua de Hermosillo pueden guardarla; se comprueba en servicio y PA. Un archivo ya
|
||||
vigente satisface todos los requisitos correspondientes sin volver a pedir una copia.
|
||||
|
||||
Las cargas usan postback completo; las demás acciones son parciales. Cada instancia
|
||||
inicializa sus cortinas una sola vez. El panel padre actualiza cambios de etapa o filtros;
|
||||
los paneles del control actualizan sus operaciones y su formulario. Los recursos se
|
||||
cargan globalmente mediante los bundles existentes.
|
||||
|
||||
## Secuencia de instalación
|
||||
|
||||
1. Respaldar la base y conservar una copia coordinada del código antes del despliegue.
|
||||
2. Ejecutar `Documentos_Etapa_Estructura_20260927.sql` y después
|
||||
`Documentos_Etapa_Procedimientos_20260927.sql`, separando los lotes `GO`, dentro de
|
||||
una transacción administrada por el ejecutor de instalación. Ante un error, no continuar.
|
||||
3. La estructura impide instalar si existen dos versiones activas de un tipo en la misma
|
||||
etapa; no elige ni elimina documentos automáticamente. En la inspección previa había
|
||||
cero documentos y cero configuraciones particulares; comprobar nuevamente al instalar.
|
||||
4. Mantener el job existente `Job_VerificaVigencias` y su horario
|
||||
`Horario_VerificaVigencias_0300`: diariamente a las 03:00. Ambos estaban habilitados
|
||||
y el servidor estaba en `US Mountain Standard Time`. No crear un segundo job.
|
||||
5. Con autorización de ejecución, realizar el recálculo inicial y ejecutar las consultas
|
||||
de `Documentos_Etapa_Verificacion_20260927.sql`. El ejecutor debe comprobar `@Return`
|
||||
y `@ErrorTipo`; el paso existente del job ya administra su transacción y esos resultados.
|
||||
6. Desplegar/verificar el código junto con los PA actualizados y probar los casos siguientes.
|
||||
|
||||
No hay lógica nueva para detener supervisiones. Los procedimientos no administran
|
||||
transacciones; permanecen en servicios C# y en el ejecutor externo del job.
|
||||
|
||||
## Validaciones realizadas
|
||||
|
||||
- Precompilación completa con `aspnet_compiler.exe` de .NET Framework 4.8: correcta.
|
||||
- Análisis sintáctico con `TSql160Parser` de SQL Server 2022: sin errores.
|
||||
- Siete casos ejecutados contra el modelo C#: pendiente, por revisar, rechazado,
|
||||
aprobado vigente, expirado requerido, expirado no requerido y sin revisión expirado
|
||||
no requerido: correctos.
|
||||
- JavaScript: sintaxis correcta; pruebas de inicialización por instancia, inclusión
|
||||
repetida, postback parcial, persistencia de cortinas y etapa fija: correctas.
|
||||
- Instalación SQL y recálculo inicial: correctos. Las seis consultas de inconsistencias
|
||||
devolvieron cero filas, incluidos los siete casos de agrupación.
|
||||
- Job y horario habilitados: ejecución diaria a las 03:00, servidor en
|
||||
`US Mountain Standard Time`. Se conservó la configuración existente.
|
||||
|
||||
## Pruebas integradas pendientes
|
||||
|
||||
- Abrir etapa y fraccionamiento con usuario cliente y con usuario de Agua; recorrer el
|
||||
ciclo completo hasta PreRender con la master y con varias instancias del control.
|
||||
- Crear dos trámites que pidan el mismo tipo; cargar una vez y comprobar que ambos
|
||||
usan la misma clave y ruta, mientras el tablero muestra una sola fila.
|
||||
- Solicitar un tipo sin trámite; cargarlo y aprobarlo desde ambas vistas.
|
||||
- Rechazar y renovar; comprobar que se conserva la versión anterior, se reinicia la
|
||||
revisión de la nueva y se actualizan los trámites afectados.
|
||||
- Expirar un documento requerido, finalizar los trámites y volver a abrir otro:
|
||||
verificar `Vencido` 1 → 0 → 1 y la fecha roja aun cuando no esté en Vencidos.
|
||||
- Verificar autorización de clientes, solicitudes manuales manipuladas, cargas
|
||||
simultáneas, restauración transaccional ante fallo y continuidad de GIS.
|
||||
- Comprobar el efecto del job con documentos vencidos; el recálculo inicial terminó
|
||||
correctamente con el inventario vacío.
|
||||
|
||||
La compilación y el analizador SQL no sustituyen estas pruebas contra la BD instalada.
|
||||
1605
Documentos_Etapa_Procedimientos_20260927.sql
Normal file
1605
Documentos_Etapa_Procedimientos_20260927.sql
Normal file
File diff suppressed because it is too large
Load Diff
122
Documentos_Etapa_Verificacion_20260927.sql
Normal file
122
Documentos_Etapa_Verificacion_20260927.sql
Normal file
@@ -0,0 +1,122 @@
|
||||
/* Sólo consultas. Ejecutar después de instalar y únicamente con autorización.
|
||||
Las consultas de inconsistencias deben devolver cero filas. */
|
||||
SET NOCOUNT ON;
|
||||
|
||||
-- Una versión vigente por etapa y tipo.
|
||||
SELECT CveFraccionamientoEtapa, CveTipoDocumento, COUNT(*) AS VersionesActivas
|
||||
FROM dbo.Tra_DocumentosSolicitud
|
||||
WHERE EsActivo = 1
|
||||
GROUP BY CveFraccionamientoEtapa, CveTipoDocumento
|
||||
HAVING COUNT(*) > 1;
|
||||
|
||||
-- Las referencias opcionales siguen perteneciendo a la misma etapa.
|
||||
SELECT D.CveDocumentoSolicitud
|
||||
FROM dbo.Tra_DocumentosSolicitud AS D
|
||||
INNER JOIN dbo.Tra_Solicitudes AS S ON S.CveSolicitud = D.CveSolicitud
|
||||
WHERE D.CveFraccionamientoEtapa <> S.CveFraccionamientoEtapa;
|
||||
|
||||
SELECT C.CveConfiguracionDocumento
|
||||
FROM dbo.Tra_SolicitudDocumentoConfiguracion AS C
|
||||
INNER JOIN dbo.Tra_Solicitudes AS S ON S.CveSolicitud = C.CveSolicitud
|
||||
WHERE C.CveFraccionamientoEtapa <> S.CveFraccionamientoEtapa;
|
||||
|
||||
-- Ninguna versión histórica conserva la marca de renovación.
|
||||
SELECT CveDocumentoSolicitud
|
||||
FROM dbo.Tra_DocumentosSolicitud
|
||||
WHERE EsActivo = 0 AND Vencido = 1;
|
||||
|
||||
-- Configuración real del trabajo: diario (4), cada día (1), 03:00 (30000).
|
||||
SELECT J.name AS Trabajo, J.enabled AS Habilitado,
|
||||
S.name AS Horario, S.freq_type, S.freq_interval, S.active_start_time,
|
||||
P.database_name AS BaseDatos, P.command AS Comando
|
||||
FROM msdb.dbo.sysjobs AS J
|
||||
INNER JOIN msdb.dbo.sysjobschedules AS JS ON JS.job_id = J.job_id
|
||||
INNER JOIN msdb.dbo.sysschedules AS S ON S.schedule_id = JS.schedule_id
|
||||
INNER JOIN msdb.dbo.sysjobsteps AS P ON P.job_id = J.job_id
|
||||
WHERE J.name = 'Job_VerificaVigencias';
|
||||
|
||||
-- Inventario de versiones, sin exponer rutas físicas.
|
||||
SELECT CveFraccionamientoEtapa, CveTipoDocumento,
|
||||
COUNT(*) AS Versiones,
|
||||
SUM(CONVERT(int, EsActivo)) AS Vigentes,
|
||||
SUM(CONVERT(int, Vencido)) AS RequierenRenovacion
|
||||
FROM dbo.Tra_DocumentosSolicitud
|
||||
GROUP BY CveFraccionamientoEtapa, CveTipoDocumento;
|
||||
|
||||
-- Casos independientes de los datos reales. Fecha de vencimiento inclusiva.
|
||||
;WITH Casos AS
|
||||
(
|
||||
SELECT * FROM
|
||||
(
|
||||
VALUES
|
||||
('Sin archivo requerido', 0, 1, CAST(NULL AS date), CAST(NULL AS bit), 'Pendientes'),
|
||||
('Archivo sin revisión', 1, 1, CAST('20261001' AS date), CAST(NULL AS bit), 'Por aprobar'),
|
||||
('Archivo rechazado', 1, 1, CAST('20261001' AS date), CAST(0 AS bit), 'Por aprobar'),
|
||||
('Aprobado vigente', 1, 1, CAST('20261001' AS date), CAST(1 AS bit), 'Aprobados'),
|
||||
('Expirado requerido', 1, 1, CAST('20260901' AS date), CAST(1 AS bit), 'Vencidos'),
|
||||
('Expirado sin requisito', 1, 0, CAST('20260901' AS date), CAST(1 AS bit), 'Aprobados'),
|
||||
('Vence hoy', 1, 1, CAST('20260927' AS date), CAST(1 AS bit), 'Aprobados')
|
||||
) AS C(Nombre, TieneArchivo, EsRequerido, FechaVencimiento, EsAprobado, Esperado)
|
||||
), Resultado AS
|
||||
(
|
||||
SELECT *, CASE
|
||||
WHEN TieneArchivo = 0 THEN 'Pendientes'
|
||||
WHEN FechaVencimiento < CAST('20260927' AS date) AND EsRequerido = 1 THEN 'Vencidos'
|
||||
WHEN EsAprobado = 1 THEN 'Aprobados'
|
||||
ELSE 'Por aprobar'
|
||||
END AS Obtenido
|
||||
FROM Casos
|
||||
)
|
||||
SELECT Nombre, Esperado, Obtenido
|
||||
FROM Resultado
|
||||
WHERE Esperado <> Obtenido;
|
||||
|
||||
-- La marca persistida coincide con los requerimientos efectivos actuales.
|
||||
DECLARE @Hoy date = CONVERT(date, SYSDATETIMEOFFSET() AT TIME ZONE 'US Mountain Standard Time');
|
||||
;WITH Configuracion AS
|
||||
(
|
||||
SELECT S.CveSolicitud, S.CveFraccionamientoEtapa, G.CveTipoDocumento,
|
||||
COALESCE(P.EsRequerido, G.EsRequerido) AS EsRequerido,
|
||||
COALESCE(P.EsCliente, G.EsCliente) AS EsCliente,
|
||||
COALESCE(P.TieneVigencia, G.TieneVigencia) AS TieneVigencia,
|
||||
COALESCE(P.EsActivo, G.EsActivo) AS EsActivo,
|
||||
E.EsFinal, S.CveTipoTramite, S.Folio
|
||||
FROM dbo.Tra_Solicitudes AS S
|
||||
INNER JOIN dbo.Tra_EstatusSolicitud AS E ON E.CveEstatusSolicitud = S.CveEstatusSolicitud
|
||||
INNER JOIN dbo.Tra_TiposTramiteDocumento AS G ON G.CveTipoTramite = S.CveTipoTramite
|
||||
LEFT JOIN dbo.Tra_SolicitudDocumentoConfiguracion AS P ON P.CveSolicitud = S.CveSolicitud
|
||||
AND P.CveTipoDocumento = G.CveTipoDocumento
|
||||
UNION ALL
|
||||
SELECT P.CveSolicitud, P.CveFraccionamientoEtapa, P.CveTipoDocumento,
|
||||
P.EsRequerido, P.EsCliente, P.TieneVigencia, P.EsActivo,
|
||||
ISNULL(E.EsFinal, 0), S.CveTipoTramite, S.Folio
|
||||
FROM dbo.Tra_SolicitudDocumentoConfiguracion AS P
|
||||
LEFT JOIN dbo.Tra_Solicitudes AS S ON S.CveSolicitud = P.CveSolicitud
|
||||
LEFT JOIN dbo.Tra_EstatusSolicitud AS E ON E.CveEstatusSolicitud = S.CveEstatusSolicitud
|
||||
WHERE P.CveSolicitud IS NULL OR NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM dbo.Tra_TiposTramiteDocumento AS G
|
||||
WHERE G.CveTipoTramite = S.CveTipoTramite
|
||||
AND G.CveTipoDocumento = P.CveTipoDocumento
|
||||
)
|
||||
),
|
||||
Requisitos AS
|
||||
(
|
||||
SELECT C.CveFraccionamientoEtapa, C.CveTipoDocumento,
|
||||
CONVERT(bit, MAX(CASE WHEN C.EsActivo = 1 AND C.EsRequerido = 1
|
||||
AND C.EsFinal = 0 AND T.EsActivo = 1 THEN 1 ELSE 0 END)) AS EsRequerido,
|
||||
CONVERT(bit, MAX(CONVERT(int, C.EsCliente))) AS EsCliente,
|
||||
CONVERT(bit, MAX(CONVERT(int, C.TieneVigencia))) AS TieneVigencia,
|
||||
CONVERT(bit, MAX(CASE WHEN C.EsActivo = 1 AND C.EsFinal = 0 THEN 1 ELSE 0 END)) AS TieneContextoAbierto
|
||||
FROM Configuracion AS C
|
||||
INNER JOIN dbo.Tra_TiposDocumento AS T ON T.CveTipoDocumento = C.CveTipoDocumento
|
||||
GROUP BY C.CveFraccionamientoEtapa, C.CveTipoDocumento
|
||||
)
|
||||
SELECT D.CveDocumentoSolicitud, D.Vencido AS MarcaPersistida,
|
||||
CONVERT(bit, CASE WHEN D.EsActivo = 1 AND D.FechaVencimiento < @Hoy
|
||||
AND R.EsRequerido = 1 THEN 1 ELSE 0 END) AS MarcaEsperada
|
||||
FROM dbo.Tra_DocumentosSolicitud AS D
|
||||
LEFT JOIN Requisitos AS R ON R.CveFraccionamientoEtapa = D.CveFraccionamientoEtapa
|
||||
AND R.CveTipoDocumento = D.CveTipoDocumento
|
||||
WHERE D.Vencido <> CONVERT(bit, CASE WHEN D.EsActivo = 1 AND D.FechaVencimiento < @Hoy
|
||||
AND R.EsRequerido = 1 THEN 1 ELSE 0 END);
|
||||
364
Enlaces_FraccionamientoEtapa_20260921.sql
Normal file
364
Enlaces_FraccionamientoEtapa_20260921.sql
Normal file
@@ -0,0 +1,364 @@
|
||||
/*
|
||||
Nombres para el enlace Fraccionamiento · Etapa.
|
||||
Preparado desde las definiciones instaladas consultadas el 21/09/2026.
|
||||
Requiere autorización separada antes de ejecutarse.
|
||||
Sólo modifica las consultas:
|
||||
dbo.PA_Tra_ReporteTramitesList: agrega Etapa al resultado de filas.
|
||||
dbo.PA_Tramites_SolicitudGet: agrega Fraccionamiento.
|
||||
Conserva filtros, permisos, agrupaciones y parámetros existentes.
|
||||
No modifica tablas, datos, estatus ni la programación de vigencias.
|
||||
*/
|
||||
USE [SIG_PlataformaDesarolladores];
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ReporteTramitesList
|
||||
@CveUsuarioEjecuta int,
|
||||
@CveAgrupacion tinyint = 1,
|
||||
@CveFraccionamiento int = NULL,
|
||||
@SoloActivos bit = 1,
|
||||
@SoloBloqueados bit = 0,
|
||||
@EstatusSeleccionados varchar(max) = NULL,
|
||||
@MostrarAutorizados bit = 0,
|
||||
@MostrarCancelados bit = 0,
|
||||
@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 @CveRol int;
|
||||
DECLARE @TieneAccesoGlobal bit = 0;
|
||||
|
||||
-- Misma regla de acceso que PA_Tramites_SolicitudGet/List.
|
||||
SELECT
|
||||
@CveRol = U.CveRol,
|
||||
@TieneAccesoGlobal = CASE WHEN U.CveRol <= 2 THEN 1 ELSE 0 END
|
||||
FROM dbo.Sis_Usuarios AS U
|
||||
WHERE U.CveUsuario = @CveUsuarioEjecuta
|
||||
AND U.Activo = 1;
|
||||
|
||||
IF @CveRol IS NULL
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'El usuario no existe o está inactivo.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF @CveAgrupacion IS NULL OR @CveAgrupacion NOT IN (1, 2)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Seleccione una agrupación válida.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
-- Empresa es el rol cliente actual (UserSessionModel.EsDesarrollador).
|
||||
IF @CveRol = 3
|
||||
BEGIN
|
||||
IF @CveAgrupacion <> 1
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'La agrupación seleccionada no está disponible para el usuario.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
SET @SoloBloqueados = 0;
|
||||
END;
|
||||
|
||||
SELECT
|
||||
F.CveFraccionamiento,
|
||||
F.Fraccionamiento
|
||||
INTO #FraccionamientosAutorizados
|
||||
FROM dbo.Fraccionamientos AS F
|
||||
WHERE @TieneAccesoGlobal = 1
|
||||
OR EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Sis_UsuariosClientes AS UC
|
||||
WHERE UC.CveUsuario = @CveUsuarioEjecuta
|
||||
AND UC.CveCliente = F.CveCliente
|
||||
AND UC.Activo = 1
|
||||
);
|
||||
|
||||
IF @CveFraccionamiento IS NOT NULL
|
||||
AND NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM #FraccionamientosAutorizados AS F
|
||||
WHERE F.CveFraccionamiento = @CveFraccionamiento
|
||||
)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'El fraccionamiento no existe o no está asignado al usuario.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
SELECT
|
||||
S.CveSolicitud,
|
||||
S.CveTipoTramite,
|
||||
S.CveFraccionamiento,
|
||||
S.CveFraccionamientoEtapa,
|
||||
S.CveCliente,
|
||||
CASE @CveAgrupacion
|
||||
WHEN 1 THEN S.CveTipoTramite
|
||||
WHEN 2 THEN S.CveCliente
|
||||
END AS CveAgrupacion,
|
||||
CASE @CveAgrupacion
|
||||
WHEN 1 THEN TT.TipoTramite
|
||||
WHEN 2 THEN C.Nombre
|
||||
END AS Agrupacion,
|
||||
C.Nombre AS Cliente,
|
||||
TT.TipoTramite AS Tramite,
|
||||
F.Fraccionamiento,
|
||||
E.Etapa,
|
||||
CASE
|
||||
WHEN @TieneAccesoGlobal = 1 OR ES.EsCliente = 1
|
||||
THEN ES.EstatusSolicitud
|
||||
ELSE NULL
|
||||
END AS Estatus,
|
||||
S.FechaInicio,
|
||||
E.Avance,
|
||||
S.EstatusProceso
|
||||
INTO #SolicitudesTablero
|
||||
FROM dbo.Tra_Solicitudes AS S
|
||||
INNER JOIN #FraccionamientosAutorizados AS F ON F.CveFraccionamiento = S.CveFraccionamiento
|
||||
INNER JOIN dbo.FraccionamientosEtapas AS E ON E.CveFraccionamientoEtapa = S.CveFraccionamientoEtapa
|
||||
INNER JOIN dbo.Clientes AS C ON C.CveCliente = S.CveCliente
|
||||
INNER JOIN dbo.Tra_TiposTramite AS TT ON TT.CveTipoTramite = S.CveTipoTramite
|
||||
INNER JOIN dbo.Tra_EstatusSolicitud AS ES ON ES.CveEstatusSolicitud = S.CveEstatusSolicitud
|
||||
WHERE (@CveFraccionamiento IS NULL OR S.CveFraccionamiento = @CveFraccionamiento)
|
||||
AND
|
||||
(
|
||||
(NULLIF(@EstatusSeleccionados, '') IS NULL
|
||||
AND (ES.Codigo <> 'Autorizado' OR @MostrarAutorizados = 1)
|
||||
AND (ES.Codigo <> 'Cancelado' OR @MostrarCancelados = 1))
|
||||
OR EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM STRING_SPLIT(@EstatusSeleccionados, ',') AS Seleccion
|
||||
WHERE TRY_CONVERT(int, Seleccion.value) = S.CveEstatusSolicitud
|
||||
)
|
||||
OR (@MostrarAutorizados = 1 AND ES.Codigo = 'Autorizado')
|
||||
OR (@MostrarCancelados = 1 AND ES.Codigo = 'Cancelado')
|
||||
)
|
||||
AND (@SoloActivos = 0 OR TT.EsActivo = 1)
|
||||
AND
|
||||
(
|
||||
@TieneAccesoGlobal = 1
|
||||
OR EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Sis_UsuariosClientes AS UC
|
||||
WHERE UC.CveUsuario = @CveUsuarioEjecuta
|
||||
AND UC.CveCliente = S.CveCliente
|
||||
AND UC.Activo = 1
|
||||
)
|
||||
)
|
||||
-- PENDIENTE: agregar el campo de bloqueo en Clientes y su historial.
|
||||
-- Condición conceptual pendiente (no existe aún el campo):
|
||||
-- AND (@SoloBloqueados = 0 OR <campo de bloqueo de C> = 1)
|
||||
;
|
||||
|
||||
-- El grid consume este contrato estable sin conocer la agrupación elegida.
|
||||
SELECT
|
||||
CAST(NULL AS int) AS CveSolicitud,
|
||||
CAST(NULL AS int) AS CveTipoTramite,
|
||||
CAST(NULL AS int) AS CveFraccionamiento,
|
||||
CAST(NULL AS int) AS CveFraccionamientoEtapa,
|
||||
CAST(NULL AS int) AS CveCliente,
|
||||
CveAgrupacion,
|
||||
Agrupacion,
|
||||
2 AS Nivel,
|
||||
CAST(NULL AS varchar(200)) AS Cliente,
|
||||
CAST(NULL AS varchar(200)) AS Tramite,
|
||||
CAST(NULL AS varchar(200)) AS Fraccionamiento,
|
||||
CAST(NULL AS varchar(200)) AS Etapa,
|
||||
CAST(NULL AS varchar(200)) AS Estatus,
|
||||
CAST(NULL AS datetime) AS FechaInicio,
|
||||
CAST(NULL AS decimal(18, 2)) AS Avance,
|
||||
CAST(0 AS tinyint) AS EstatusProceso
|
||||
FROM #SolicitudesTablero
|
||||
GROUP BY CveAgrupacion, Agrupacion
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
CveSolicitud,
|
||||
CveTipoTramite,
|
||||
CveFraccionamiento,
|
||||
CveFraccionamientoEtapa,
|
||||
CveCliente,
|
||||
CveAgrupacion,
|
||||
Agrupacion,
|
||||
1 AS Nivel,
|
||||
Cliente,
|
||||
Tramite,
|
||||
Fraccionamiento,
|
||||
Etapa,
|
||||
Estatus,
|
||||
FechaInicio,
|
||||
Avance,
|
||||
EstatusProceso
|
||||
FROM #SolicitudesTablero
|
||||
ORDER BY CveAgrupacion, Nivel DESC, FechaInicio DESC, CveSolicitud DESC;
|
||||
|
||||
-- Segundo resultado: combo con el mismo alcance de acceso del tablero.
|
||||
-- No depende del filtro seleccionado ni del estado activo del tipo.
|
||||
SELECT CveFraccionamiento, Fraccionamiento
|
||||
FROM #FraccionamientosAutorizados
|
||||
ORDER BY Fraccionamiento, CveFraccionamiento;
|
||||
|
||||
-- Opciones del filtro; no altera los permisos para cambiar estatus.
|
||||
SELECT CveEstatusSolicitud, Codigo, EstatusSolicitud, Orden, EsFinal, EsCliente
|
||||
FROM dbo.Tra_EstatusSolicitud
|
||||
WHERE EsActivo = 1
|
||||
ORDER BY Orden, CveEstatusSolicitud;
|
||||
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'Ocurrió un error al consultar el tablero de trámites; 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_ReporteTramitesList'),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE()
|
||||
);
|
||||
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Tramites_SolicitudGet
|
||||
@CveSolicitud 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 @CveRol int;
|
||||
DECLARE @EsSuperUsuario bit = 0;
|
||||
|
||||
SELECT
|
||||
@CveRol = U.CveRol,
|
||||
@EsSuperUsuario =
|
||||
CASE WHEN U.CveRol <= 2 THEN 1 ELSE 0 END
|
||||
FROM dbo.Sis_Usuarios AS U
|
||||
WHERE U.CveUsuario = @CveUsuarioEjecuta
|
||||
AND U.Activo = 1;
|
||||
|
||||
IF @CveRol IS NULL
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'El usuario no existe o está inactivo.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Tra_Solicitudes AS S
|
||||
WHERE S.CveSolicitud = @CveSolicitud
|
||||
AND
|
||||
(
|
||||
@EsSuperUsuario = 1
|
||||
OR EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Sis_UsuariosClientes AS UC
|
||||
WHERE UC.CveUsuario = @CveUsuarioEjecuta
|
||||
AND UC.CveCliente = S.CveCliente
|
||||
AND UC.Activo = 1
|
||||
)
|
||||
)
|
||||
)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'La solicitud no existe o no está asignada al usuario.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
SELECT
|
||||
S.CveSolicitud,
|
||||
S.Folio,
|
||||
S.CveCliente,
|
||||
S.CveFraccionamiento,
|
||||
F.Fraccionamiento,
|
||||
S.CveFraccionamientoEtapa,
|
||||
ET.Etapa,
|
||||
S.CveTipoTramite,
|
||||
TT.TipoTramite,
|
||||
S.CveEstatusSolicitud,
|
||||
CASE
|
||||
WHEN @EsSuperUsuario = 1 OR ES.EsCliente = 1
|
||||
THEN ES.EstatusSolicitud
|
||||
ELSE NULL
|
||||
END AS EstatusSolicitud,
|
||||
ES.EsCliente AS EsEstatusCliente,
|
||||
S.FechaInicio,
|
||||
S.FechaAutorizacion,
|
||||
CONVERT(bit,
|
||||
CASE
|
||||
WHEN @EsSuperUsuario = 1
|
||||
AND S.FechaAutorizacion IS NULL
|
||||
AND UPPER(LTRIM(RTRIM(ISNULL(ES.Codigo, '')))) <> 'AUTORIZADO'
|
||||
AND UPPER(LTRIM(RTRIM(ISNULL(ES.EstatusSolicitud, '')))) <> 'AUTORIZADO'
|
||||
THEN 1
|
||||
ELSE 0
|
||||
END) AS PuedeCambiarEstatus,
|
||||
CONVERT(bit,
|
||||
CASE
|
||||
WHEN S.FechaAutorizacion IS NOT NULL
|
||||
OR UPPER(LTRIM(RTRIM(ISNULL(ES.Codigo, '')))) = 'AUTORIZADO'
|
||||
OR UPPER(LTRIM(RTRIM(ISNULL(ES.EstatusSolicitud, '')))) = 'AUTORIZADO'
|
||||
THEN 1
|
||||
ELSE 0
|
||||
END) AS EsAutorizada
|
||||
FROM dbo.Tra_Solicitudes AS S
|
||||
INNER JOIN dbo.Fraccionamientos AS F ON F.CveFraccionamiento = S.CveFraccionamiento
|
||||
INNER JOIN dbo.FraccionamientosEtapas AS ET
|
||||
ON ET.CveFraccionamientoEtapa = S.CveFraccionamientoEtapa
|
||||
INNER JOIN dbo.Tra_TiposTramite AS TT
|
||||
ON TT.CveTipoTramite = S.CveTipoTramite
|
||||
INNER JOIN dbo.Tra_EstatusSolicitud AS ES
|
||||
ON ES.CveEstatusSolicitud = S.CveEstatusSolicitud
|
||||
WHERE S.CveSolicitud = @CveSolicitud;
|
||||
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'Ocurrió un error al consultar la solicitud; 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_Tramites_SolicitudGet'),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE()
|
||||
);
|
||||
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
BIN
Entrega_CambioEstatus_20260908.zip
Normal file
BIN
Entrega_CambioEstatus_20260908.zip
Normal file
Binary file not shown.
@@ -0,0 +1,482 @@
|
||||
# Propuesta de catálogo y relaciones documento–trámite
|
||||
|
||||
Estado: propuesta para aprobación. No se modificaron archivos del proyecto, documentos, relaciones, PAs, configuración por solicitud ni componentes GIS.
|
||||
Se consultaron las tablas reales y se ejecutó únicamente el modo diagnóstico del SQL (@Aplicar = 0). La sintaxis fue validada con el analizador de SQL Server 2022.
|
||||
|
||||
## Resultado
|
||||
|
||||
- Catálogo actual: 34 registros.
|
||||
- Relaciones generales actuales: 1 (GIS → Prefactibilidad).
|
||||
- Archivos de solicitudes encontrados: 0. Configuraciones particulares encontradas: 0.
|
||||
- Tipos documentales de la propuesta: 66; 14 reutilizan registros existentes.
|
||||
- Nuevos tipos listos para insertar: 45.
|
||||
- Tipos cuya equivalencia debe resolverse antes de crearlos: 7.
|
||||
- Relaciones propuestas: 117; 99 listas y 18 pendientes de definición.
|
||||
- Ninguna de las 117 relaciones propuestas existe actualmente. Se conserva la relación GIS anterior.
|
||||
- Trámites identificados: 18. Ningún proceso de la lista quedó sin clave identificada.
|
||||
- No se detectaron nombres documentales duplicados al comparar mayúsculas y espacios. Sí existe duplicidad conceptual previa entre GIS y Archivo GIS de la Etapa, que no se fusiona automáticamente.
|
||||
|
||||
El script no selecciona un usuario: @CveUsuario queda NULL y debe configurarse con una clave real y activa al aprobar la ejecución.
|
||||
Con @Aplicar = 0 solo consulta. Con @Aplicar = 1 inserta únicamente registros faltantes dentro de una transacción.
|
||||
@PermitirPendientes = 0 impide una carga parcial inadvertida. Resolver las decisiones o autorizar explícitamente la parte lista antes de cambiarlo a 1.
|
||||
|
||||
## Trámites reales y diferencias de nombre
|
||||
|
||||
Las claves 1, 3–13 se contrastaron con la especificación; los nombres siguientes son exactamente los guardados.
|
||||
Las claves 19–24 se localizaron por el proceso descrito. No se inventaron claves ni trámites.
|
||||
|
||||
| Clave | Nombre actual |
|
||||
| --- | --- |
|
||||
| 1 | Prefactibilidad de servicios |
|
||||
| 3 | Convenio de pagos para obras necesarias |
|
||||
| 4 | Convenio de recuperación de caudal |
|
||||
| 5 | Autorización de puntos de conexión del fraccionamiento |
|
||||
| 6 | Convenio de adhesión |
|
||||
| 7 | Autorización de proyectos y presupuesto de obras de cabeza |
|
||||
| 8 | Autorización de proyectos de obra necesaria |
|
||||
| 9 | Convenio de obras necesarias en especie |
|
||||
| 10 | Supervisión de obra externa |
|
||||
| 11 | Factibilidad de servicios |
|
||||
| 12 | Autorización de proyectos de redes internas |
|
||||
| 13 | Supervisión de obra de redes internas |
|
||||
| 19 | Entrega de Infraestructura Externa |
|
||||
| 20 | Contratación de Macromedidor |
|
||||
| 21 | Entrega de Infraestructura Interna |
|
||||
| 22 | Convenio de Actualización de Pagos de Derechos y Aportaciones |
|
||||
| 23 | Contratación de Vivienda |
|
||||
| 24 | Entrega - Recepción |
|
||||
|
||||
Diferencias relevantes frente a los títulos de la especificación:
|
||||
|
||||
- 1: el nombre completo es Prefactibilidad de servicios.
|
||||
- 3: se guarda Convenio de pagos para obras necesarias, sin «Coordinación».
|
||||
- 4: se guarda Convenio de recuperación de caudal.
|
||||
- 5: se guarda Autorización de puntos de conexión del fraccionamiento.
|
||||
- 8: se guarda Autorización de proyectos de obra necesaria.
|
||||
- 9: se guarda Convenio de obras necesarias en especie.
|
||||
- 10: se guarda Supervisión de obra externa.
|
||||
- 11: el nombre completo es Factibilidad de servicios.
|
||||
- 13: se guarda Supervisión de obra de redes internas.
|
||||
- 20: se guarda Contratación de Macromedidor, sin «para».
|
||||
|
||||
También existen estos registros casi iguales:
|
||||
| Clave | Nombre actual | Tratamiento |
|
||||
| --- | --- | --- |
|
||||
| 16 | Convenio de Pagos para Obras Necesarias | No se vincula automáticamente; la especificación indicó 3, 6 y 11. |
|
||||
| 17 | Convenio de Adhesión | No se vincula automáticamente; la especificación indicó 3, 6 y 11. |
|
||||
| 18 | Factibilidad de Servicios | No se vincula automáticamente; la especificación indicó 3, 6 y 11. |
|
||||
|
||||
El script comprueba simultáneamente la clave verificada, el nombre exacto con Modern_Spanish_CS_AS y EsActivo = 1. No elige una coincidencia por similitud ni mezcla estos registros.
|
||||
|
||||
## Catálogo existente completo
|
||||
|
||||
La columna «Uso» identifica los 14 registros reutilizados. Los 20 restantes se conservan sin cambios.
|
||||
No se propone actualizar descripción, extensiones, tamaño máximo ni estado de los registros existentes.
|
||||
|
||||
| Clave actual | TipoDocumento | Extensiones | Máximo MB | Uso |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 | PDF | .pdf | 100 | Conservar |
|
||||
| 2 | GIS | .gis | 100 | Conservar |
|
||||
| 1002 | Proyecto de Redes Internas | — | — | Conservar |
|
||||
| 1003 | Memoria de cálculo | — | — | Reutilizar |
|
||||
| 1004 | Planos de Redes Internas | pdf,dwg | — | Conservar |
|
||||
| 1005 | Proyecto Ejecutivo de Infraestructura Hidráulica | — | — | Reutilizar |
|
||||
| 1006 | Planos del Proyecto de Infraestructura Hidráulica | pdf,dwg | — | Conservar |
|
||||
| 1007 | Presupuesto de Obra | — | — | Conservar |
|
||||
| 1008 | Programa de Obra | — | — | Reutilizar |
|
||||
| 1009 | Permisos vigentes del Ayuntamiento | pdf | — | Conservar |
|
||||
| 1010 | Planos del Tipo de Vivienda | — | — | Conservar |
|
||||
| 1011 | Descripción del Tipo de Vivienda | — | — | Conservar |
|
||||
| 1012 | Documento de Área de Construcción | — | — | Conservar |
|
||||
| 1013 | Cesión de Derechos de Extracción de Agua | pdf | — | Conservar |
|
||||
| 1014 | Garantía de Buena Calidad de las Obras | pdf | — | Conservar |
|
||||
| 1015 | Fianza de Garantía de Buena Calidad | pdf | — | Conservar |
|
||||
| 1016 | Archivo GIS de la Etapa | gis | — | Reutilizar |
|
||||
| 1017 | Dictamen de Prefactibilidad de Servicios | pdf | — | Reutilizar |
|
||||
| 1018 | Dictamen de Factibilidad de Servicios | pdf | — | Reutilizar |
|
||||
| 1019 | Oficio de Negativa | pdf | — | Conservar |
|
||||
| 1020 | Autorización de Puntos de Conexión del Fraccionamiento | pdf | — | Reutilizar |
|
||||
| 1021 | Convenio de Recuperación de Caudal | pdf | — | Reutilizar |
|
||||
| 1022 | Convenio de Aportación para Recuperación de Caudal | pdf | — | Reutilizar |
|
||||
| 1023 | Contrato / Convenio de Adhesión al Fideicomiso | pdf | — | Reutilizar |
|
||||
| 1024 | Convenio de Pagos para Obras Necesarias | pdf | — | Reutilizar |
|
||||
| 1025 | Convenio de Ejecución de Obras Necesarias en Especie | pdf | — | Reutilizar |
|
||||
| 1026 | Autorización de Proyectos y Presupuesto de Obras de Cabeza | pdf | — | Conservar |
|
||||
| 1027 | Autorización de Proyecto de Obra Necesaria | pdf | — | Reutilizar |
|
||||
| 1028 | Autorización de Proyectos de Redes Internas | pdf | — | Reutilizar |
|
||||
| 1029 | Convenio de Actualización de Pagos de Derechos y Aportaciones | pdf | — | Conservar |
|
||||
| 1030 | Constancia de No Adeudo | pdf | — | Conservar |
|
||||
| 1031 | Acta de Entrega-Recepción de Infraestructura | pdf | — | Conservar |
|
||||
| 1032 | Convenio de Cumplimiento de Ejecución de Infraestructura Hidráulica | pdf | — | Conservar |
|
||||
| 1033 | Contrato Temporal con Servicio Medido | pdf | — | Conservar |
|
||||
|
||||
## Documentos nuevos listos para insertar
|
||||
|
||||
Cada nombre aparece una sola vez en el catálogo propuesto. TamanoMaximoMb se deja NULL; no se inventa un límite.
|
||||
En los nuevos registros la descripción es el nombre documental, salvo la descripción explícita de los campos de Relación de Viviendas.
|
||||
No se crean documentos separados por persona física/moral ni por cada dato capturable.
|
||||
|
||||
| Documento | Extensiones propuestas |
|
||||
| --- | --- |
|
||||
| Acta Constitutiva | — |
|
||||
| Autorización de Presupuesto de Obra Necesaria | — |
|
||||
| Carta de Asignación | — |
|
||||
| Comprobante de Domicilio | — |
|
||||
| Comprobante de Pagos de Derechos y Aportaciones | — |
|
||||
| Comprobante del Primer Pago de los Convenios de Adhesión | — |
|
||||
| Constancia de No Adeudo de Tesorería Municipal | — |
|
||||
| Constancia de Situación Fiscal | — |
|
||||
| Contrato de Vivienda | — |
|
||||
| Convenio de Fraccionamiento | — |
|
||||
| Corrida Hidráulica EPANET | — |
|
||||
| Croquis de Ubicación del Predio | — |
|
||||
| Dictamen de Uso de Suelo | — |
|
||||
| Escrito de Solicitud de Convenio de Obra Necesaria en Especie | — |
|
||||
| Escrito de Solicitud de Convenio de Pagos para Obras Necesarias | — |
|
||||
| Escrito de Solicitud de Convenio para Recuperación de Caudal | — |
|
||||
| Escrito de Solicitud de Factibilidad de Servicios | — |
|
||||
| Escrito de Solicitud de Prefactibilidad | — |
|
||||
| Escrito de Solicitud de Revisión y Autorización de Proyectos | — |
|
||||
| Escrituras del Terreno | — |
|
||||
| Formato Beneficiario Controlador | — |
|
||||
| Formato KYC Persona Física | — |
|
||||
| Formato de Alta de Lotes | xls,xlsx |
|
||||
| Identificación Oficial | — |
|
||||
| Liberación de Supervisión | — |
|
||||
| Memorias Descriptivas y Cálculos Hidráulicos | pdf,xls,xlsx |
|
||||
| Oficio de Licencia de Uso de Suelo | — |
|
||||
| Oficio de Rasantes Autorizado | — |
|
||||
| Plano de Nomenclatura | — |
|
||||
| Plano de Rasantes Autorizado | pdf,dwg |
|
||||
| Plano de Sembrado de Vivienda | — |
|
||||
| Plano del Convenio de Fraccionamiento Sellado y Firmado | — |
|
||||
| Planos Autorizados de Proyectos Ejecutivos de Obras Necesarias | — |
|
||||
| Planos de Redes Internas de Agua Potable | pdf,dwg |
|
||||
| Planos de Redes Internas de Alcantarillado Sanitario | pdf,dwg |
|
||||
| Poder del Representante Legal | — |
|
||||
| Pruebas Liberadas | — |
|
||||
| Relación de Viviendas | — |
|
||||
| Solicitud de Entrega-Recepción | — |
|
||||
| Solicitud de Puntos de Conexión | — |
|
||||
| Solicitud de Revisión y Autorización de Proyectos y Presupuesto | — |
|
||||
| Solicitud para Asignación de Supervisor | — |
|
||||
| Solicitud para Contratación del Macromedidor | — |
|
||||
| Solicitud para Entrega de Infraestructura Externa | — |
|
||||
| Solicitud para Entrega de Infraestructura Interna | — |
|
||||
|
||||
## Tipos pendientes: no crear automáticamente
|
||||
|
||||
Estas siete filas tienen RevisionPendiente en el SQL y se omiten incluso al autorizar una carga parcial. Para habilitarlas debe resolverse el nombre canónico, revisar las relaciones asociadas y retirar la marca de revisión correspondiente.
|
||||
Si se decide reutilizar un documento común, consolidar las relaciones por trámite + documento; no introducir dos filas para la misma combinación.
|
||||
|
||||
| Documento solicitado | Decisión necesaria |
|
||||
| --- | --- |
|
||||
| Presupuesto a Costo Directo | Existe Presupuesto de Obra (1007): confirmar si es el mismo documento o un presupuesto distinto a costo directo. |
|
||||
| Autorización de Proyecto de Obras de Cabeza | Existe Autorización de Proyectos y Presupuesto de Obras de Cabeza (1026), un documento conjunto. Confirmar si se separan las dos autorizaciones. |
|
||||
| Autorización de Presupuesto de Obras de Cabeza | Existe Autorización de Proyectos y Presupuesto de Obras de Cabeza (1026), un documento conjunto. Confirmar si se separan las dos autorizaciones. |
|
||||
| Convenio de Adhesión al Fideicomiso de Obras Necesarias | Confirmar si es documento diferente del Contrato / Convenio de Adhesión al Fideicomiso (1023). |
|
||||
| Convenio de Adhesión al Fideicomiso de Recuperación de Caudal | Confirmar si es documento diferente del Contrato / Convenio de Adhesión al Fideicomiso (1023). |
|
||||
| Poder / Carta Poder | Confirmar si basta Poder del Representante Legal o si Carta Poder es un tipo distinto. |
|
||||
| Constancia RFC del Propietario | Confirmar si se acepta la misma Constancia de Situación Fiscal o si es una constancia de RFC diferente. |
|
||||
|
||||
## Equivalencias documentales propuestas para revisión
|
||||
|
||||
Estas equivalencias son decisiones de normalización expresas en la propuesta, no coincidencias semánticas que el SQL busque por su cuenta.
|
||||
El SQL resuelve exclusivamente el nombre canónico de la segunda columna. Las claves actuales del reporte son informativas; no se fijan en los INSERT.
|
||||
|
||||
| Nombre/variante de la especificación | Nombre canónico propuesto | Clave actual |
|
||||
| --- | --- | --- |
|
||||
| Prefactibilidad de Servicios | Dictamen de Prefactibilidad de Servicios | 1017 |
|
||||
| Factibilidad de Servicios | Dictamen de Factibilidad de Servicios | 1018 |
|
||||
| Proyecto Ejecutivo Hidráulico | Proyecto Ejecutivo de Infraestructura Hidráulica | 1005 |
|
||||
| Memoria de Cálculo | Memoria de cálculo | 1003 |
|
||||
| Autorización de Puntos de Conexión del Desarrollo | Autorización de Puntos de Conexión del Fraccionamiento | 1020 |
|
||||
| Convenio de Coordinación de Pagos para Obras Necesarias | Convenio de Pagos para Obras Necesarias | 1024 |
|
||||
| Convenio de Coordinación de Pagos para Recuperación de Caudal | Convenio de Recuperación de Caudal | 1021 |
|
||||
| Convenio de Ejecución de Obra Necesaria en Especie | Convenio de Ejecución de Obras Necesarias en Especie | 1025 |
|
||||
| Identificación Oficial del Representante Legal | Identificación Oficial | — |
|
||||
| Identificación del Representante Legal | Identificación Oficial | — |
|
||||
| Identificación Oficial / INE | Identificación Oficial | — |
|
||||
| Constancia de Situación Fiscal del Representante Legal | Constancia de Situación Fiscal | — |
|
||||
| Constancia de No Adeudo de Tesorería | Constancia de No Adeudo de Tesorería Municipal | — |
|
||||
| Autorización de Redes Internas | Autorización de Proyectos de Redes Internas | 1028 |
|
||||
| Factibilidad Habitacional Vigente | Dictamen de Factibilidad de Servicios | 1018 |
|
||||
|
||||
Revisar especialmente estas normalizaciones:
|
||||
|
||||
- Prefactibilidad / Factibilidad se resuelven con los dictámenes que ya existen; no se crea otro tipo solo por omitir «Dictamen».
|
||||
- La especificación admite Factibilidad Habitacional / Factibilidad de Servicios como alternativas. Se propone reutilizar Dictamen de Factibilidad de Servicios; para el trámite 22 confirmar que cubra la modalidad habitacional.
|
||||
- Identificación oficial, INE e identificación del representante usan el mismo tipo documental. La constancia fiscal del representante reutiliza Constancia de Situación Fiscal.
|
||||
- Proyecto Ejecutivo Hidráulico reutiliza Proyecto Ejecutivo de Infraestructura Hidráulica.
|
||||
- Se conservan Planos de Redes Internas (1004) y Memoria de cálculo (1003). Los documentos específicos de agua potable, alcantarillado y memorias descriptivas se proponen como tipos separados porque la especificación los enumera por separado; revisar si se desean archivos conjuntos en vez de separados.
|
||||
- Constancia de No Adeudo (1030) describe derechos y aportaciones. No permite concluir que sea la constancia de Tesorería Municipal o una constancia independiente de Agua de Hermosillo. Se propone la municipal con su nombre específico; NO se agrega una nueva constancia de Agua, cuya inclusión estaba condicionada a que existiera inequívocamente.
|
||||
|
||||
## Todas las relaciones propuestas
|
||||
|
||||
1 = sí; 0 = no; «Pendiente» en responsable significa que no se insertará esa relación.
|
||||
«Orden lista» conserva la secuencia de la especificación. En la ejecución, las relaciones listas nuevas reciben órdenes consecutivos desde MAX(Orden) + 1 por trámite. Las relaciones previas nunca se reordenan.
|
||||
En una carga parcial se compacta la secuencia solo de las filas listas; al resolver pendientes posteriormente se agregarían al final para no sobrescribir órdenes existentes. Es preferible resolverlos antes de aplicar la carga completa.
|
||||
|
||||
| Trámite | Documento | Requerido | Cliente | Vigencia | Orden lista | Orden listo | Estado |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| 1 | Escrito de Solicitud de Prefactibilidad | 1 | 1 | 0 | 1 | 2 | Nueva lista |
|
||||
| 1 | Escrituras del Terreno | 1 | 1 | 0 | 2 | 3 | Nueva lista |
|
||||
| 1 | Croquis de Ubicación del Predio | 1 | 1 | 0 | 3 | 4 | Nueva lista |
|
||||
| 1 | Dictamen de Uso de Suelo | 1 | 1 | 0 | 4 | 5 | Nueva lista |
|
||||
| 1 | Poder del Representante Legal | 0 | 1 | 0 | 5 | 6 | Nueva lista |
|
||||
| 1 | Identificación Oficial | 1 | 1 | 0 | 6 | 7 | Nueva lista |
|
||||
| 1 | Constancia de No Adeudo de Tesorería Municipal | 1 | 1 | 0 | 7 | 8 | Nueva lista |
|
||||
| 3 | Escrito de Solicitud de Convenio de Pagos para Obras Necesarias | 1 | 1 | 0 | 1 | 1 | Nueva lista |
|
||||
| 3 | Identificación Oficial | 1 | 1 | 0 | 2 | 2 | Nueva lista |
|
||||
| 3 | Constancia de Situación Fiscal | 1 | 1 | 0 | 3 | 3 | Nueva lista |
|
||||
| 3 | Comprobante de Domicilio | 1 | 1 | 0 | 4 | 4 | Nueva lista |
|
||||
| 3 | Constancia de No Adeudo de Tesorería Municipal | 1 | 1 | 0 | 5 | 5 | Nueva lista |
|
||||
| 3 | Dictamen de Prefactibilidad de Servicios | 0 | 0 | 0 | 6 | 6 | Nueva lista |
|
||||
| 3 | Acta Constitutiva | 0 | 1 | 0 | 7 | 7 | Nueva lista |
|
||||
| 3 | Poder del Representante Legal | 0 | 1 | 0 | 8 | 8 | Nueva lista |
|
||||
| 4 | Escrito de Solicitud de Convenio para Recuperación de Caudal | 1 | 1 | 0 | 1 | 1 | Nueva lista |
|
||||
| 4 | Identificación Oficial | 1 | 1 | 0 | 2 | 2 | Nueva lista |
|
||||
| 4 | Constancia de Situación Fiscal | 1 | 1 | 0 | 3 | 3 | Nueva lista |
|
||||
| 4 | Comprobante de Domicilio | 1 | 1 | 0 | 4 | 4 | Nueva lista |
|
||||
| 4 | Constancia de No Adeudo de Tesorería Municipal | 1 | 1 | 0 | 5 | 5 | Nueva lista |
|
||||
| 4 | Dictamen de Prefactibilidad de Servicios | 0 | 0 | 0 | 6 | 6 | Nueva lista |
|
||||
| 4 | Acta Constitutiva | 0 | 1 | 0 | 7 | 7 | Nueva lista |
|
||||
| 4 | Poder del Representante Legal | 0 | 1 | 0 | 8 | 8 | Nueva lista |
|
||||
| 4 | Convenio de Recuperación de Caudal | 0 | 0 | 0 | 9 | 9 | Nueva lista |
|
||||
| 4 | Convenio de Aportación para Recuperación de Caudal | 0 | 0 | 0 | 10 | 10 | Nueva lista |
|
||||
| 5 | Solicitud de Puntos de Conexión | 1 | 1 | 0 | 1 | 1 | Nueva lista |
|
||||
| 5 | Croquis de Ubicación del Predio | 1 | 1 | 0 | 2 | 2 | Nueva lista |
|
||||
| 5 | Dictamen de Factibilidad de Servicios | 0 | 0 | 0 | 3 | 3 | Nueva lista |
|
||||
| 5 | Autorización de Puntos de Conexión del Fraccionamiento | 0 | 0 | 0 | 4 | 4 | Nueva lista |
|
||||
| 6 | Formato KYC Persona Física | 0 | 1 | 0 | 1 | 1 | Nueva lista |
|
||||
| 6 | Formato Beneficiario Controlador | 0 | 1 | 0 | 2 | 2 | Nueva lista |
|
||||
| 6 | Poder del Representante Legal | 0 | 1 | 0 | 3 | 3 | Nueva lista |
|
||||
| 6 | Identificación Oficial | 0 | 1 | 0 | 4 | 4 | Nueva lista |
|
||||
| 6 | Constancia de Situación Fiscal | 0 | 1 | 0 | 5 | 5 | Nueva lista |
|
||||
| 6 | Comprobante de Domicilio | 1 | 1 | 0 | 6 | 6 | Nueva lista |
|
||||
| 6 | Contrato / Convenio de Adhesión al Fideicomiso | 0 | Pendiente | 0 | 7 | — | Pendiente |
|
||||
| 7 | Solicitud de Revisión y Autorización de Proyectos y Presupuesto | 1 | 1 | 0 | 1 | 1 | Nueva lista |
|
||||
| 7 | Proyecto Ejecutivo de Infraestructura Hidráulica | 1 | 1 | 0 | 2 | 2 | Nueva lista |
|
||||
| 7 | Presupuesto a Costo Directo | 1 | 1 | 0 | 3 | — | Pendiente |
|
||||
| 8 | Solicitud de Revisión y Autorización de Proyectos y Presupuesto | 1 | 1 | 0 | 1 | 1 | Nueva lista |
|
||||
| 8 | Proyecto Ejecutivo de Infraestructura Hidráulica | 1 | 1 | 0 | 2 | 2 | Nueva lista |
|
||||
| 8 | Presupuesto a Costo Directo | 1 | 1 | 0 | 3 | — | Pendiente |
|
||||
| 7 | Autorización de Proyecto de Obras de Cabeza | 0 | 0 | 0 | 4 | — | Pendiente |
|
||||
| 7 | Autorización de Presupuesto de Obras de Cabeza | 0 | 0 | 0 | 5 | — | Pendiente |
|
||||
| 8 | Memoria de cálculo | 0 | 1 | 0 | 4 | 3 | Nueva lista |
|
||||
| 8 | Autorización de Proyecto de Obra Necesaria | 0 | 0 | 0 | 5 | 4 | Nueva lista |
|
||||
| 8 | Autorización de Presupuesto de Obra Necesaria | 0 | 0 | 0 | 6 | 5 | Nueva lista |
|
||||
| 9 | Escrito de Solicitud de Convenio de Obra Necesaria en Especie | 1 | 1 | 0 | 1 | 1 | Nueva lista |
|
||||
| 9 | Autorización de Proyecto de Obras de Cabeza | 0 | 0 | 0 | 2 | — | Pendiente |
|
||||
| 9 | Autorización de Proyecto de Obra Necesaria | 0 | 0 | 0 | 3 | 2 | Nueva lista |
|
||||
| 9 | Autorización de Presupuesto de Obras de Cabeza | 0 | 0 | 0 | 4 | — | Pendiente |
|
||||
| 9 | Autorización de Presupuesto de Obra Necesaria | 0 | 0 | 0 | 5 | 3 | Nueva lista |
|
||||
| 9 | Identificación Oficial | 1 | 1 | 0 | 6 | 4 | Nueva lista |
|
||||
| 9 | Constancia de Situación Fiscal | 1 | 1 | 0 | 7 | 5 | Nueva lista |
|
||||
| 9 | Comprobante de Domicilio | 1 | 1 | 0 | 8 | 6 | Nueva lista |
|
||||
| 9 | Constancia de No Adeudo de Tesorería Municipal | 1 | 1 | 0 | 9 | 7 | Nueva lista |
|
||||
| 9 | Dictamen de Prefactibilidad de Servicios | 0 | 0 | 0 | 10 | 8 | Nueva lista |
|
||||
| 9 | Acta Constitutiva | 0 | 1 | 0 | 11 | 9 | Nueva lista |
|
||||
| 9 | Poder del Representante Legal | 0 | 1 | 0 | 12 | 10 | Nueva lista |
|
||||
| 9 | Convenio de Ejecución de Obras Necesarias en Especie | 0 | 0 | 0 | 13 | 11 | Nueva lista |
|
||||
| 10 | Solicitud para Asignación de Supervisor | 1 | 1 | 0 | 1 | 1 | Nueva lista |
|
||||
| 10 | Programa de Obra | 1 | 1 | 0 | 2 | 2 | Nueva lista |
|
||||
| 11 | Escrito de Solicitud de Factibilidad de Servicios | 1 | 1 | 0 | 1 | 1 | Nueva lista |
|
||||
| 11 | Dictamen de Prefactibilidad de Servicios | 0 | 0 | 0 | 2 | 2 | Nueva lista |
|
||||
| 11 | Convenio de Pagos para Obras Necesarias | 0 | 0 | 0 | 3 | 3 | Nueva lista |
|
||||
| 11 | Convenio de Recuperación de Caudal | 0 | 0 | 0 | 4 | 4 | Nueva lista |
|
||||
| 11 | Convenio de Adhesión al Fideicomiso de Obras Necesarias | 0 | Pendiente | 0 | 5 | — | Pendiente |
|
||||
| 11 | Convenio de Adhesión al Fideicomiso de Recuperación de Caudal | 0 | Pendiente | 0 | 6 | — | Pendiente |
|
||||
| 11 | Comprobante del Primer Pago de los Convenios de Adhesión | 0 | 1 | 0 | 7 | 5 | Nueva lista |
|
||||
| 11 | Poder / Carta Poder | 0 | 1 | 0 | 8 | — | Pendiente |
|
||||
| 11 | Identificación Oficial | 1 | 1 | 0 | 9 | 6 | Nueva lista |
|
||||
| 11 | Constancia de No Adeudo de Tesorería Municipal | 1 | 1 | 0 | 10 | 7 | Nueva lista |
|
||||
| 11 | Dictamen de Factibilidad de Servicios | 0 | 0 | 0 | 11 | 8 | Nueva lista |
|
||||
| 12 | Escrito de Solicitud de Revisión y Autorización de Proyectos | 1 | 1 | 0 | 1 | 1 | Nueva lista |
|
||||
| 12 | Constancia de No Adeudo de Tesorería Municipal | 1 | 1 | 0 | 2 | 2 | Nueva lista |
|
||||
| 12 | Oficio de Licencia de Uso de Suelo | 1 | 1 | 0 | 3 | 3 | Nueva lista |
|
||||
| 12 | Convenio de Fraccionamiento | 1 | 1 | 0 | 4 | 4 | Nueva lista |
|
||||
| 12 | Plano del Convenio de Fraccionamiento Sellado y Firmado | 1 | 1 | 0 | 5 | 5 | Nueva lista |
|
||||
| 12 | Oficio de Rasantes Autorizado | 1 | 1 | 0 | 6 | 6 | Nueva lista |
|
||||
| 12 | Plano de Rasantes Autorizado | 1 | 1 | 0 | 7 | 7 | Nueva lista |
|
||||
| 12 | Autorización de Puntos de Conexión del Fraccionamiento | 0 | 0 | 0 | 8 | 8 | Nueva lista |
|
||||
| 12 | Dictamen de Factibilidad de Servicios | 0 | 0 | 0 | 9 | 9 | Nueva lista |
|
||||
| 12 | Planos Autorizados de Proyectos Ejecutivos de Obras Necesarias | 0 | Pendiente | 0 | 10 | — | Pendiente |
|
||||
| 12 | Memorias Descriptivas y Cálculos Hidráulicos | 1 | 1 | 0 | 11 | 10 | Nueva lista |
|
||||
| 12 | Planos de Redes Internas de Agua Potable | 1 | 1 | 0 | 12 | 11 | Nueva lista |
|
||||
| 12 | Planos de Redes Internas de Alcantarillado Sanitario | 1 | 1 | 0 | 13 | 12 | Nueva lista |
|
||||
| 12 | Plano de Sembrado de Vivienda | 1 | 1 | 0 | 14 | 13 | Nueva lista |
|
||||
| 12 | Plano de Nomenclatura | 1 | 1 | 0 | 15 | 14 | Nueva lista |
|
||||
| 12 | Formato de Alta de Lotes | 1 | 1 | 0 | 16 | 15 | Nueva lista |
|
||||
| 12 | Corrida Hidráulica EPANET | 1 | 1 | 0 | 17 | 16 | Nueva lista |
|
||||
| 12 | Archivo GIS de la Etapa | 1 | 1 | 0 | 18 | 17 | Nueva lista |
|
||||
| 12 | Autorización de Proyectos de Redes Internas | 0 | 0 | 0 | 19 | 18 | Nueva lista |
|
||||
| 13 | Solicitud para Asignación de Supervisor | 1 | 1 | 0 | 1 | 1 | Nueva lista |
|
||||
| 13 | Programa de Obra | 1 | 1 | 0 | 2 | 2 | Nueva lista |
|
||||
| 13 | Autorización de Proyectos de Redes Internas | 0 | 0 | 0 | 3 | 3 | Nueva lista |
|
||||
| 19 | Solicitud para Entrega de Infraestructura Externa | 1 | 1 | 0 | 1 | 1 | Nueva lista |
|
||||
| 19 | Pruebas Liberadas | 0 | Pendiente | 0 | 2 | — | Pendiente |
|
||||
| 20 | Solicitud para Contratación del Macromedidor | 1 | 1 | 0 | 1 | 1 | Nueva lista |
|
||||
| 20 | Liberación de Supervisión | 0 | Pendiente | 0 | 2 | — | Pendiente |
|
||||
| 21 | Solicitud para Entrega de Infraestructura Interna | 1 | 1 | 0 | 1 | 1 | Nueva lista |
|
||||
| 21 | Pruebas Liberadas | 0 | Pendiente | 0 | 2 | — | Pendiente |
|
||||
| 22 | Acta Constitutiva | 0 | 1 | 0 | 1 | 1 | Nueva lista |
|
||||
| 22 | Poder del Representante Legal | 0 | 1 | 0 | 2 | 2 | Nueva lista |
|
||||
| 22 | Identificación Oficial | 1 | 1 | 0 | 3 | 3 | Nueva lista |
|
||||
| 22 | Constancia de Situación Fiscal | 1 | 1 | 0 | 4 | 4 | Nueva lista |
|
||||
| 22 | Constancia de No Adeudo de Tesorería Municipal | 1 | 1 | 0 | 5 | 5 | Nueva lista |
|
||||
| 22 | Dictamen de Factibilidad de Servicios | 0 | 0 | 1 | 6 | 6 | Nueva lista |
|
||||
| 22 | Autorización de Proyectos de Redes Internas | 0 | 0 | 0 | 7 | 7 | Nueva lista |
|
||||
| 22 | Plano de Sembrado de Vivienda | 1 | 1 | 0 | 8 | 8 | Nueva lista |
|
||||
| 22 | Relación de Viviendas | 1 | 1 | 0 | 9 | 9 | Nueva lista |
|
||||
| 23 | Carta de Asignación | 0 | Pendiente | 0 | 1 | — | Pendiente |
|
||||
| 23 | Identificación Oficial | 1 | 1 | 0 | 2 | 1 | Nueva lista |
|
||||
| 23 | Constancia RFC del Propietario | 1 | 1 | 0 | 3 | — | Pendiente |
|
||||
| 24 | Solicitud de Entrega-Recepción | 1 | 1 | 0 | 1 | 1 | Nueva lista |
|
||||
| 24 | Pruebas Liberadas | 0 | Pendiente | 0 | 2 | — | Pendiente |
|
||||
| 24 | Comprobante de Pagos de Derechos y Aportaciones | 0 | 1 | 0 | 3 | 2 | Nueva lista |
|
||||
| 24 | Contrato de Vivienda | 0 | Pendiente | 0 | 4 | — | Pendiente |
|
||||
|
||||
## Relaciones existentes
|
||||
|
||||
| Trámite | TipoTramite | Documento | TipoDocumento | Requerido | Cliente | Vigencia | Orden | Activo |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| 1 | Prefactibilidad de servicios | 2 | GIS | 1 | 1 | 0 | 1 | 1 |
|
||||
|
||||
No hay relaciones existentes que coincidan con las 117 combinaciones propuestas. Por eso actualmente no hay diferencias de flags que sobrescribir dentro de ese conjunto.
|
||||
La relación anterior ocupa el orden 1 de Prefactibilidad: los siete documentos nuevos de ese trámite se agregarían en los órdenes 2–8.
|
||||
|
||||
## EsRequerido: casos opcionales o sujetos a revisión
|
||||
|
||||
Los documentos expresamente solicitados, sin condición indicada, se proponen requeridos.
|
||||
Los resultados, antecedentes y requisitos condicionales se dejan en 0. No se implementan condiciones por persona física/moral, propiedad o tipo de obra.
|
||||
Los archivos de otras solicitudes no se reutilizan automáticamente: el código actual comprueba el archivo de la solicitud correspondiente, por eso un antecedente no se vuelve requerido por el mero hecho de existir en otro trámite.
|
||||
|
||||
| Trámite | Documento propuesto opcional | Motivo / revisión |
|
||||
| --- | --- | --- |
|
||||
| 1 | Poder del Representante Legal | Condicionado a representación; se unifica Poder Notarial / Poder del Representante Legal. |
|
||||
| 3 | Dictamen de Prefactibilidad de Servicios | Equivalencia propuesta: Prefactibilidad de Servicios → Dictamen de Prefactibilidad de Servicios. Antecedente emitido por Agua; no existe reutilización automática de archivos entre solicitudes. |
|
||||
| 3 | Acta Constitutiva | Depende de persona moral o representación; no se crea una condición nueva. |
|
||||
| 3 | Poder del Representante Legal | Depende de persona moral o representación; no se crea una condición nueva. |
|
||||
| 4 | Dictamen de Prefactibilidad de Servicios | Equivalencia propuesta: Prefactibilidad de Servicios → Dictamen de Prefactibilidad de Servicios. Antecedente emitido por Agua; no existe reutilización automática de archivos entre solicitudes. |
|
||||
| 4 | Acta Constitutiva | Depende de persona moral o representación; no se crea una condición nueva. |
|
||||
| 4 | Poder del Representante Legal | Depende de persona moral o representación; no se crea una condición nueva. |
|
||||
| 4 | Convenio de Recuperación de Caudal | Resultado generado por Agua. |
|
||||
| 4 | Convenio de Aportación para Recuperación de Caudal | Ya existe en el catálogo; documento condicionado al caso. |
|
||||
| 5 | Dictamen de Factibilidad de Servicios | Equivalencia propuesta: Factibilidad de Servicios → Dictamen de Factibilidad de Servicios. La especificación admite Factibilidad Habitacional / Factibilidad de Servicios; se reutiliza el dictamen existente. |
|
||||
| 5 | Autorización de Puntos de Conexión del Fraccionamiento | Equivalencia propuesta: Autorización de Puntos de Conexión del Desarrollo → Autorización de Puntos de Conexión del Fraccionamiento. Resultado generado por Agua. |
|
||||
| 6 | Formato KYC Persona Física | Revisar aplicación por persona física/moral, representación o beneficiario. |
|
||||
| 6 | Formato Beneficiario Controlador | Revisar aplicación por persona física/moral, representación o beneficiario. |
|
||||
| 6 | Poder del Representante Legal | Revisar aplicación por persona física/moral, representación o beneficiario. |
|
||||
| 6 | Identificación Oficial | Equivalencia propuesta: Identificación Oficial del Representante Legal → Identificación Oficial. Revisar aplicación por persona física/moral, representación o beneficiario. |
|
||||
| 6 | Constancia de Situación Fiscal | Equivalencia propuesta: Constancia de Situación Fiscal del Representante Legal → Constancia de Situación Fiscal. Revisar aplicación por persona física/moral, representación o beneficiario. |
|
||||
| 6 | Contrato / Convenio de Adhesión al Fideicomiso | Existe en catálogo sin relaciones; no se pudo verificar quién carga el convenio formalizado. Relación pendiente. |
|
||||
| 7 | Autorización de Proyecto de Obras de Cabeza | Resultado; revisar documento conjunto existente antes de crear tipos separados. |
|
||||
| 7 | Autorización de Presupuesto de Obras de Cabeza | Resultado; revisar documento conjunto existente antes de crear tipos separados. |
|
||||
| 8 | Memoria de cálculo | Equivalencia propuesta: Memoria de Cálculo → Memoria de cálculo. Existe en el catálogo pero no tiene relación actual; se propone opcional por la condición si corresponde. |
|
||||
| 8 | Autorización de Proyecto de Obra Necesaria | Resultado generado por Agua. |
|
||||
| 8 | Autorización de Presupuesto de Obra Necesaria | Resultado generado por Agua. |
|
||||
| 9 | Autorización de Proyecto de Obras de Cabeza | Antecedentes alternativos: obras de cabeza / obra necesaria; no se exigen ambas variantes. |
|
||||
| 9 | Autorización de Proyecto de Obra Necesaria | Antecedentes alternativos: obras de cabeza / obra necesaria; no se exigen ambas variantes. |
|
||||
| 9 | Autorización de Presupuesto de Obras de Cabeza | Antecedentes alternativos: obras de cabeza / obra necesaria; no se exigen ambas variantes. |
|
||||
| 9 | Autorización de Presupuesto de Obra Necesaria | Antecedentes alternativos: obras de cabeza / obra necesaria; no se exigen ambas variantes. |
|
||||
| 9 | Dictamen de Prefactibilidad de Servicios | Equivalencia propuesta: Prefactibilidad de Servicios → Dictamen de Prefactibilidad de Servicios. Antecedente emitido por Agua. |
|
||||
| 9 | Acta Constitutiva | Condicionado a persona moral o representación. |
|
||||
| 9 | Poder del Representante Legal | Condicionado a persona moral o representación. |
|
||||
| 9 | Convenio de Ejecución de Obras Necesarias en Especie | Equivalencia propuesta: Convenio de Ejecución de Obra Necesaria en Especie → Convenio de Ejecución de Obras Necesarias en Especie. Documento resultante formalizado por Agua. |
|
||||
| 11 | Dictamen de Prefactibilidad de Servicios | Equivalencia propuesta: Prefactibilidad de Servicios → Dictamen de Prefactibilidad de Servicios. Antecedente de otro trámite; revisión de aplicabilidad. |
|
||||
| 11 | Convenio de Pagos para Obras Necesarias | Equivalencia propuesta: Convenio de Coordinación de Pagos para Obras Necesarias → Convenio de Pagos para Obras Necesarias. Antecedente de otro trámite; revisión de aplicabilidad. |
|
||||
| 11 | Convenio de Recuperación de Caudal | Equivalencia propuesta: Convenio de Coordinación de Pagos para Recuperación de Caudal → Convenio de Recuperación de Caudal. Antecedente de otro trámite; revisión de aplicabilidad. |
|
||||
| 11 | Convenio de Adhesión al Fideicomiso de Obras Necesarias | No existe equivalencia específica verificada con el convenio genérico ni responsable de carga confirmado. |
|
||||
| 11 | Convenio de Adhesión al Fideicomiso de Recuperación de Caudal | No existe equivalencia específica verificada con el convenio genérico ni responsable de carga confirmado. |
|
||||
| 11 | Comprobante del Primer Pago de los Convenios de Adhesión | Archivo comprobante, no concepto de pago. Depende de convenio aplicable. |
|
||||
| 11 | Poder / Carta Poder | Solo cuando no sea propietario; revisar diferencia con Poder del Representante Legal. |
|
||||
| 11 | Dictamen de Factibilidad de Servicios | Equivalencia propuesta: Factibilidad de Servicios → Dictamen de Factibilidad de Servicios. Dictamen/oficio de resultado generado por Agua. |
|
||||
| 12 | Autorización de Puntos de Conexión del Fraccionamiento | Equivalencia propuesta: Autorización de Puntos de Conexión del Desarrollo → Autorización de Puntos de Conexión del Fraccionamiento. Antecedente generado por Agua. |
|
||||
| 12 | Dictamen de Factibilidad de Servicios | Equivalencia propuesta: Factibilidad de Servicios → Dictamen de Factibilidad de Servicios. Antecedente generado por Agua. |
|
||||
| 12 | Planos Autorizados de Proyectos Ejecutivos de Obras Necesarias | Solo cuando sean requeridos para la conexión. Confirmar quién entrega/carga el plano autorizado. |
|
||||
| 12 | Autorización de Proyectos de Redes Internas | Resultado generado por Agua. |
|
||||
| 13 | Autorización de Proyectos de Redes Internas | Antecedente generado por Agua; no hay reutilización automática de archivos del trámite anterior. |
|
||||
| 19 | Pruebas Liberadas | Confirmar emisor/cargador y obligatoriedad de las pruebas liberadas. |
|
||||
| 20 | Liberación de Supervisión | Confirmar emisor/cargador y si se obtiene del trámite de supervisión. |
|
||||
| 21 | Pruebas Liberadas | Confirmar emisor/cargador y obligatoriedad de las pruebas liberadas. |
|
||||
| 22 | Acta Constitutiva | Condicionado a persona moral o representación. |
|
||||
| 22 | Poder del Representante Legal | Condicionado a persona moral o representación. |
|
||||
| 22 | Dictamen de Factibilidad de Servicios | Equivalencia propuesta: Factibilidad Habitacional Vigente → Dictamen de Factibilidad de Servicios. Vigencia explícita en la especificación. Antecedente; confirmar que el dictamen general cubre el habitacional. |
|
||||
| 22 | Autorización de Proyectos de Redes Internas | Equivalencia propuesta: Autorización de Redes Internas → Autorización de Proyectos de Redes Internas. Antecedente generado por Agua. |
|
||||
| 23 | Carta de Asignación | Confirmar emisor/cargador y aplicabilidad. |
|
||||
| 24 | Pruebas Liberadas | Confirmar emisor/cargador y obligatoriedad. |
|
||||
| 24 | Comprobante de Pagos de Derechos y Aportaciones | Archivo comprobante, no pago. Revisar obligatoriedad. |
|
||||
| 24 | Contrato de Vivienda | Confirmar si es contrato emitido por Agua o documento proporcionado por el cliente. |
|
||||
|
||||
## EsCliente: decisiones pendientes
|
||||
|
||||
No hay relaciones previas para inferir quién carga los siguientes documentos. Se deja NULL únicamente en la tabla variable de propuesta; nunca se inserta NULL en la tabla real.
|
||||
Para resultados explícitos de Agua se utiliza 0; para documentos que aporta el desarrollador, 1.
|
||||
|
||||
| Trámite | Documento | Motivo |
|
||||
| --- | --- | --- |
|
||||
| 6 | Contrato / Convenio de Adhesión al Fideicomiso | Existe en catálogo sin relaciones; no se pudo verificar quién carga el convenio formalizado. Relación pendiente. |
|
||||
| 11 | Convenio de Adhesión al Fideicomiso de Obras Necesarias | No existe equivalencia específica verificada con el convenio genérico ni responsable de carga confirmado. |
|
||||
| 11 | Convenio de Adhesión al Fideicomiso de Recuperación de Caudal | No existe equivalencia específica verificada con el convenio genérico ni responsable de carga confirmado. |
|
||||
| 12 | Planos Autorizados de Proyectos Ejecutivos de Obras Necesarias | Solo cuando sean requeridos para la conexión. Confirmar quién entrega/carga el plano autorizado. |
|
||||
| 19 | Pruebas Liberadas | Confirmar emisor/cargador y obligatoriedad de las pruebas liberadas. |
|
||||
| 20 | Liberación de Supervisión | Confirmar emisor/cargador y si se obtiene del trámite de supervisión. |
|
||||
| 21 | Pruebas Liberadas | Confirmar emisor/cargador y obligatoriedad de las pruebas liberadas. |
|
||||
| 23 | Carta de Asignación | Confirmar emisor/cargador y aplicabilidad. |
|
||||
| 24 | Pruebas Liberadas | Confirmar emisor/cargador y obligatoriedad. |
|
||||
| 24 | Contrato de Vivienda | Confirmar si es contrato emitido por Agua o documento proporcionado por el cliente. |
|
||||
|
||||
## Vigencia
|
||||
|
||||
Únicamente se propone TieneVigencia = 1 para el dictamen usado como «Factibilidad Habitacional Vigente» en el trámite 22, porque la vigencia es explícita en esa especificación.
|
||||
Las demás relaciones nuevas se dejan en 0. No se modifican relaciones existentes ni se crean bloqueos por vencimiento.
|
||||
|
||||
Recomendaciones para revisión, sin activarlas automáticamente:
|
||||
|
||||
- Constancias de no adeudo: confirmar periodo de validez según emisor.
|
||||
- Prefactibilidad y factibilidad: confirmar plazo y si se aplica también a antecedentes.
|
||||
- Identificación oficial: confirmar captura de vencimiento.
|
||||
- Comprobante de domicilio: confirmar si se valida antigüedad máxima y cómo se captura.
|
||||
- Oficios o licencias municipales y rasantes: confirmar si tienen vencimiento documental.
|
||||
- Permisos vigentes del Ayuntamiento (1009): ya existe en catálogo, pero no está relacionado actualmente; no se agrega como requisito nuevo.
|
||||
|
||||
## GIS: alcance preciso
|
||||
|
||||
- Existe GIS, clave actual 2, con extensión .gis y máximo de 100 MB; está relacionado con Prefactibilidad (1).
|
||||
- Existe Archivo GIS de la Etapa, clave actual 1016, con extensión gis y sin máximo configurado en catálogo.
|
||||
- Se reutiliza por nombre Archivo GIS de la Etapa para Autorización de proyectos de redes internas (12), con EsRequerido = 1, EsCliente = 1, TieneVigencia = 0, EsActivo = 1.
|
||||
- Su posición en la lista completa es 18; en la parte actualmente lista es 17 porque el antecedente de planos autorizados sigue pendiente de EsCliente.
|
||||
- No se crea un tercer GIS, no se fusionan los dos tipos ya existentes y no se elimina la relación 1/2.
|
||||
- ServicioGisFraccionamiento sigue llamando RegisterExternalStageFile con trámite 1 y documento 2. TramiteDocumentoService también reconoce GIS por la clave 2. Este código no se modifica.
|
||||
- Por tanto, este SQL prepara la relación de destino; NO mueve por sí solo la operación de la pantalla ni libera el requisito GIS anterior. Eso corresponde al cambio funcional separado que indica la especificación.
|
||||
|
||||
## Extensiones y diferencias de metadatos
|
||||
|
||||
La BD utiliza ambas notaciones (.pdf / pdf y .gis / gis), además de listas como pdf,dwg.
|
||||
El servicio admite separadores coma, punto y coma, barra vertical o espacio y normaliza el punto inicial. Para tipos nuevos se usa la notación sin punto indicada en la especificación.
|
||||
Los planos específicos usan pdf,dwg; las memorias descriptivas pdf,xls,xlsx; el formato de alta de lotes xls,xlsx.
|
||||
No se fija extensión para EPANET ni para otros documentos cuyo formato no fue definido.
|
||||
|
||||
Los 14 registros reutilizados mantienen exactamente sus descripciones, extensiones y tamaños consultados. No hay cambios de metadatos propuestos para ellos.
|
||||
El SQL compara esos valores con la BD nuevamente y los muestra como diferencias si cambiaron desde esta revisión; no ejecuta UPDATE sobre el catálogo ni sobre relaciones existentes.
|
||||
|
||||
## Conceptos descartados y condiciones de inclusión
|
||||
|
||||
- Pago conforme a rangos del artículo 52: corresponde al módulo de pagos; no se inserta como tipo documental.
|
||||
- Importes, pagos de derechos y aportaciones y pagos adelantados/saldos: no se convierten en documentos.
|
||||
- Teléfono, dirección, correo, RFC capturable y datos de contacto: no se crean como tipos documentales.
|
||||
- Número de manzana, lote, m² y tipo de vivienda son campos del archivo Relación de Viviendas, no cuatro documentos distintos.
|
||||
- Sí se incluyen los archivos Comprobante del Primer Pago y Comprobante de Pagos de Derechos y Aportaciones: son evidencias documentales expresamente solicitadas, no registros ni conceptos de pago.
|
||||
- Memoria de Cálculo se encontró en el catálogo y se propone opcional para el trámite 8.
|
||||
- Convenio de Aportación para Recuperación de Caudal se encontró y se reutiliza para el trámite 4.
|
||||
- No se encontraron antecedentes configurados en Supervisión de obra externa (10), por lo que no se inventan relaciones adicionales allí.
|
||||
- La constancia independiente de No Adeudo de Agua de Hermosillo no pudo identificarse inequívocamente; no se crea ni se vincula por inferencia.
|
||||
|
||||
## Verificación y entrega
|
||||
|
||||
El SQL completo está en Propuesta_Catalogo_Documentos_Tramites.sql, junto a este reporte.
|
||||
No se ejecutó la rama de inserción ni se hicieron pruebas de escritura con rollback, para no consumir identidades ni modificar datos.
|
||||
Se validaron sintaxis y diagnóstico contra SQL Server: 18 trámites resueltos, 66 documentos propuestos, 117 relaciones diagnosticadas, 45 documentos y 99 relaciones listos, 18 relaciones pendientes.
|
||||
La comparación de nombres no detectó duplicados exactos/por mayúsculas y espacios. La duplicidad semántica GIS queda documentada.
|
||||
Las decisiones pendientes están en los datos del propio SQL, no ocultas en un UPDATE. No deben quitarse las marcas de revisión sin resolver primero el documento canónico y su configuración.
|
||||
@@ -0,0 +1,601 @@
|
||||
/*
|
||||
PROPUESTA PARA REVISIÓN. NO EJECUTADA SOBRE LOS DATOS.
|
||||
Diagnóstico por defecto: @Aplicar = 0; no modifica tablas de negocio.
|
||||
Para aplicar después de aprobar: configurar @CveUsuario y @Aplicar = 1.
|
||||
Resolver las revisiones y EsCliente pendientes; o autorizar expresamente
|
||||
una carga parcial con @PermitirPendientes = 1.
|
||||
|
||||
Se conservan todos los documentos, relaciones, metadatos, archivos,
|
||||
excepciones por solicitud y componentes GIS existentes.
|
||||
GIS: se prepara Archivo GIS de la Etapa -> trámite 12; no se retira GIS -> 1.
|
||||
Los IDs documentales siempre se resuelven por nombre, nunca se fijan.
|
||||
Las claves de trámite y sus nombres se verificaron en la BD.
|
||||
Los órdenes nuevos se agregan al máximo existente, sin reordenar filas previas.
|
||||
No inserta pagos, no crea ni altera PAs ni estructuras de negocio.
|
||||
*/
|
||||
SET NOCOUNT ON;
|
||||
SET XACT_ABORT ON;
|
||||
|
||||
DECLARE @Aplicar bit = 0;
|
||||
DECLARE @CveUsuario int = NULL; -- Configurar una clave real de Sis_Usuarios.
|
||||
DECLARE @PermitirPendientes bit = 0; -- Mantener 0 para evitar una carga parcial inadvertida.
|
||||
|
||||
DECLARE @Tramites TABLE
|
||||
(
|
||||
CveVerificada int PRIMARY KEY,
|
||||
NombreVerificado nvarchar(200) COLLATE Modern_Spanish_CS_AS NOT NULL,
|
||||
CveTipoTramite int NULL
|
||||
);
|
||||
INSERT INTO @Tramites (CveVerificada, NombreVerificado)
|
||||
VALUES
|
||||
(1, N'Prefactibilidad de servicios'),
|
||||
(3, N'Convenio de pagos para obras necesarias'),
|
||||
(4, N'Convenio de recuperación de caudal'),
|
||||
(5, N'Autorización de puntos de conexión del fraccionamiento'),
|
||||
(6, N'Convenio de adhesión'),
|
||||
(7, N'Autorización de proyectos y presupuesto de obras de cabeza'),
|
||||
(8, N'Autorización de proyectos de obra necesaria'),
|
||||
(9, N'Convenio de obras necesarias en especie'),
|
||||
(10, N'Supervisión de obra externa'),
|
||||
(11, N'Factibilidad de servicios'),
|
||||
(12, N'Autorización de proyectos de redes internas'),
|
||||
(13, N'Supervisión de obra de redes internas'),
|
||||
(19, N'Entrega de Infraestructura Externa'),
|
||||
(20, N'Contratación de Macromedidor'),
|
||||
(21, N'Entrega de Infraestructura Interna'),
|
||||
(22, N'Convenio de Actualización de Pagos de Derechos y Aportaciones'),
|
||||
(23, N'Contratación de Vivienda'),
|
||||
(24, N'Entrega - Recepción');
|
||||
|
||||
DECLARE @Documentos TABLE
|
||||
(
|
||||
Nombre nvarchar(200) COLLATE Modern_Spanish_CI_AS PRIMARY KEY,
|
||||
Descripcion nvarchar(500) NULL,
|
||||
Extensiones nvarchar(200) NULL,
|
||||
TamanoMaximoMb int NULL,
|
||||
RevisionPendiente nvarchar(1000) NULL,
|
||||
CveTipoDocumento int NULL,
|
||||
Coincidencias int NOT NULL DEFAULT (0),
|
||||
EsActivoActual bit NULL
|
||||
);
|
||||
INSERT INTO @Documentos
|
||||
(Nombre, Descripcion, Extensiones, TamanoMaximoMb, RevisionPendiente)
|
||||
VALUES
|
||||
(N'Escrito de Solicitud de Prefactibilidad', N'Escrito de Solicitud de Prefactibilidad', NULL, NULL, NULL),
|
||||
(N'Escrituras del Terreno', N'Escrituras del Terreno', NULL, NULL, NULL),
|
||||
(N'Croquis de Ubicación del Predio', N'Croquis de Ubicación del Predio', NULL, NULL, NULL),
|
||||
(N'Dictamen de Uso de Suelo', N'Dictamen de Uso de Suelo', NULL, NULL, NULL),
|
||||
(N'Poder del Representante Legal', N'Poder del Representante Legal', NULL, NULL, NULL),
|
||||
(N'Identificación Oficial', N'Identificación Oficial', NULL, NULL, NULL),
|
||||
(N'Constancia de No Adeudo de Tesorería Municipal', N'Constancia de No Adeudo de Tesorería Municipal', NULL, NULL, NULL),
|
||||
(N'Escrito de Solicitud de Convenio de Pagos para Obras Necesarias', N'Escrito de Solicitud de Convenio de Pagos para Obras Necesarias', NULL, NULL, NULL),
|
||||
(N'Constancia de Situación Fiscal', N'Constancia de Situación Fiscal', NULL, NULL, NULL),
|
||||
(N'Comprobante de Domicilio', N'Comprobante de Domicilio', NULL, NULL, NULL),
|
||||
(N'Dictamen de Prefactibilidad de Servicios', N'Dictamen resultado del trámite de Prefactibilidad de Servicios.', N'pdf', NULL, NULL),
|
||||
(N'Acta Constitutiva', N'Acta Constitutiva', NULL, NULL, NULL),
|
||||
(N'Escrito de Solicitud de Convenio para Recuperación de Caudal', N'Escrito de Solicitud de Convenio para Recuperación de Caudal', NULL, NULL, NULL),
|
||||
(N'Convenio de Recuperación de Caudal', N'Convenio correspondiente al proceso de recuperación de caudal.', N'pdf', NULL, NULL),
|
||||
(N'Convenio de Aportación para Recuperación de Caudal', N'Convenio de aportación para recuperación de caudal cuando corresponda.', N'pdf', NULL, NULL),
|
||||
(N'Solicitud de Puntos de Conexión', N'Solicitud de Puntos de Conexión', NULL, NULL, NULL),
|
||||
(N'Dictamen de Factibilidad de Servicios', N'Dictamen resultado del trámite de Factibilidad de Servicios.', N'pdf', NULL, NULL),
|
||||
(N'Autorización de Puntos de Conexión del Fraccionamiento', N'Oficio de autorización de los puntos de conexión del fraccionamiento.', N'pdf', NULL, NULL),
|
||||
(N'Formato KYC Persona Física', N'Formato KYC Persona Física', NULL, NULL, NULL),
|
||||
(N'Formato Beneficiario Controlador', N'Formato Beneficiario Controlador', NULL, NULL, NULL),
|
||||
(N'Contrato / Convenio de Adhesión al Fideicomiso', N'Documento correspondiente a la adhesión al fideicomiso.', N'pdf', NULL, NULL),
|
||||
(N'Solicitud de Revisión y Autorización de Proyectos y Presupuesto', N'Solicitud de Revisión y Autorización de Proyectos y Presupuesto', NULL, NULL, NULL),
|
||||
(N'Proyecto Ejecutivo de Infraestructura Hidráulica', N'Proyecto ejecutivo correspondiente a obras de infraestructura hidráulica.', NULL, NULL, NULL),
|
||||
(N'Presupuesto a Costo Directo', N'Presupuesto a Costo Directo', NULL, NULL, N'Existe Presupuesto de Obra (1007): confirmar si es el mismo documento o un presupuesto distinto a costo directo.'),
|
||||
(N'Autorización de Proyecto de Obras de Cabeza', N'Autorización de Proyecto de Obras de Cabeza', NULL, NULL, N'Existe Autorización de Proyectos y Presupuesto de Obras de Cabeza (1026), un documento conjunto. Confirmar si se separan las dos autorizaciones.'),
|
||||
(N'Autorización de Presupuesto de Obras de Cabeza', N'Autorización de Presupuesto de Obras de Cabeza', NULL, NULL, N'Existe Autorización de Proyectos y Presupuesto de Obras de Cabeza (1026), un documento conjunto. Confirmar si se separan las dos autorizaciones.'),
|
||||
(N'Memoria de cálculo', N'Memoria de cálculo correspondiente al proyecto de infraestructura hidráulica.', NULL, NULL, NULL),
|
||||
(N'Autorización de Proyecto de Obra Necesaria', N'Documento de autorización del proyecto de obra necesaria.', N'pdf', NULL, NULL),
|
||||
(N'Autorización de Presupuesto de Obra Necesaria', N'Autorización de Presupuesto de Obra Necesaria', NULL, NULL, NULL),
|
||||
(N'Escrito de Solicitud de Convenio de Obra Necesaria en Especie', N'Escrito de Solicitud de Convenio de Obra Necesaria en Especie', NULL, NULL, NULL),
|
||||
(N'Convenio de Ejecución de Obras Necesarias en Especie', N'Convenio correspondiente a la ejecución de obras necesarias mediante aportación en especie.', N'pdf', NULL, NULL),
|
||||
(N'Solicitud para Asignación de Supervisor', N'Solicitud para Asignación de Supervisor', NULL, NULL, NULL),
|
||||
(N'Programa de Obra', N'Programa de ejecución de la obra.', NULL, NULL, NULL),
|
||||
(N'Escrito de Solicitud de Factibilidad de Servicios', N'Escrito de Solicitud de Factibilidad de Servicios', NULL, NULL, NULL),
|
||||
(N'Convenio de Pagos para Obras Necesarias', N'Convenio que establece los pagos correspondientes a obras necesarias.', N'pdf', NULL, NULL),
|
||||
(N'Convenio de Adhesión al Fideicomiso de Obras Necesarias', N'Convenio de Adhesión al Fideicomiso de Obras Necesarias', NULL, NULL, N'Confirmar si es documento diferente del Contrato / Convenio de Adhesión al Fideicomiso (1023).'),
|
||||
(N'Convenio de Adhesión al Fideicomiso de Recuperación de Caudal', N'Convenio de Adhesión al Fideicomiso de Recuperación de Caudal', NULL, NULL, N'Confirmar si es documento diferente del Contrato / Convenio de Adhesión al Fideicomiso (1023).'),
|
||||
(N'Comprobante del Primer Pago de los Convenios de Adhesión', N'Comprobante del Primer Pago de los Convenios de Adhesión', NULL, NULL, NULL),
|
||||
(N'Poder / Carta Poder', N'Poder / Carta Poder', NULL, NULL, N'Confirmar si basta Poder del Representante Legal o si Carta Poder es un tipo distinto.'),
|
||||
(N'Escrito de Solicitud de Revisión y Autorización de Proyectos', N'Escrito de Solicitud de Revisión y Autorización de Proyectos', NULL, NULL, NULL),
|
||||
(N'Oficio de Licencia de Uso de Suelo', N'Oficio de Licencia de Uso de Suelo', NULL, NULL, NULL),
|
||||
(N'Convenio de Fraccionamiento', N'Convenio de Fraccionamiento', NULL, NULL, NULL),
|
||||
(N'Plano del Convenio de Fraccionamiento Sellado y Firmado', N'Plano del Convenio de Fraccionamiento Sellado y Firmado', NULL, NULL, NULL),
|
||||
(N'Oficio de Rasantes Autorizado', N'Oficio de Rasantes Autorizado', NULL, NULL, NULL),
|
||||
(N'Plano de Rasantes Autorizado', N'Plano de Rasantes Autorizado', N'pdf,dwg', NULL, NULL),
|
||||
(N'Planos Autorizados de Proyectos Ejecutivos de Obras Necesarias', N'Planos Autorizados de Proyectos Ejecutivos de Obras Necesarias', NULL, NULL, NULL),
|
||||
(N'Memorias Descriptivas y Cálculos Hidráulicos', N'Memorias Descriptivas y Cálculos Hidráulicos', N'pdf,xls,xlsx', NULL, NULL),
|
||||
(N'Planos de Redes Internas de Agua Potable', N'Planos de Redes Internas de Agua Potable', N'pdf,dwg', NULL, NULL),
|
||||
(N'Planos de Redes Internas de Alcantarillado Sanitario', N'Planos de Redes Internas de Alcantarillado Sanitario', N'pdf,dwg', NULL, NULL),
|
||||
(N'Plano de Sembrado de Vivienda', N'Plano de Sembrado de Vivienda', NULL, NULL, NULL),
|
||||
(N'Plano de Nomenclatura', N'Plano de Nomenclatura', NULL, NULL, NULL),
|
||||
(N'Formato de Alta de Lotes', N'Formato de Alta de Lotes', N'xls,xlsx', NULL, NULL),
|
||||
(N'Corrida Hidráulica EPANET', N'Corrida Hidráulica EPANET', NULL, NULL, NULL),
|
||||
(N'Archivo GIS de la Etapa', N'Archivo GIS correspondiente a los lotes y geometrías de la etapa del fraccionamiento.', N'gis', NULL, NULL),
|
||||
(N'Autorización de Proyectos de Redes Internas', N'Documento mediante el cual se autoriza el proyecto de redes internas.', N'pdf', NULL, NULL),
|
||||
(N'Solicitud para Entrega de Infraestructura Externa', N'Solicitud para Entrega de Infraestructura Externa', NULL, NULL, NULL),
|
||||
(N'Pruebas Liberadas', N'Pruebas Liberadas', NULL, NULL, NULL),
|
||||
(N'Solicitud para Contratación del Macromedidor', N'Solicitud para Contratación del Macromedidor', NULL, NULL, NULL),
|
||||
(N'Liberación de Supervisión', N'Liberación de Supervisión', NULL, NULL, NULL),
|
||||
(N'Solicitud para Entrega de Infraestructura Interna', N'Solicitud para Entrega de Infraestructura Interna', NULL, NULL, NULL),
|
||||
(N'Relación de Viviendas', N'Relación de viviendas con número de manzana, número de lote, m² de construcción y tipo de vivienda.', NULL, NULL, NULL),
|
||||
(N'Carta de Asignación', N'Carta de Asignación', NULL, NULL, NULL),
|
||||
(N'Constancia RFC del Propietario', N'Constancia RFC del Propietario', NULL, NULL, N'Confirmar si se acepta la misma Constancia de Situación Fiscal o si es una constancia de RFC diferente.'),
|
||||
(N'Solicitud de Entrega-Recepción', N'Solicitud de Entrega-Recepción', NULL, NULL, NULL),
|
||||
(N'Comprobante de Pagos de Derechos y Aportaciones', N'Comprobante de Pagos de Derechos y Aportaciones', NULL, NULL, NULL),
|
||||
(N'Contrato de Vivienda', N'Contrato de Vivienda', NULL, NULL, NULL);
|
||||
|
||||
DECLARE @Relaciones TABLE
|
||||
(
|
||||
CveVerificada int NOT NULL,
|
||||
Documento nvarchar(200) COLLATE Modern_Spanish_CI_AS NOT NULL,
|
||||
EsRequerido bit NOT NULL,
|
||||
EsCliente bit NULL,
|
||||
TieneVigencia bit NOT NULL,
|
||||
OrdenEspecificacion int NOT NULL,
|
||||
Nota nvarchar(1000) NULL,
|
||||
PRIMARY KEY (CveVerificada, Documento)
|
||||
);
|
||||
INSERT INTO @Relaciones
|
||||
(CveVerificada, Documento, EsRequerido, EsCliente, TieneVigencia, OrdenEspecificacion, Nota)
|
||||
VALUES
|
||||
(1, N'Escrito de Solicitud de Prefactibilidad', 1, 1, 0, 1, NULL),
|
||||
(1, N'Escrituras del Terreno', 1, 1, 0, 2, NULL),
|
||||
(1, N'Croquis de Ubicación del Predio', 1, 1, 0, 3, NULL),
|
||||
(1, N'Dictamen de Uso de Suelo', 1, 1, 0, 4, NULL),
|
||||
(1, N'Poder del Representante Legal', 0, 1, 0, 5, N'Condicionado a representación; se unifica Poder Notarial / Poder del Representante Legal.'),
|
||||
(1, N'Identificación Oficial', 1, 1, 0, 6, NULL),
|
||||
(1, N'Constancia de No Adeudo de Tesorería Municipal', 1, 1, 0, 7, NULL),
|
||||
(3, N'Escrito de Solicitud de Convenio de Pagos para Obras Necesarias', 1, 1, 0, 1, NULL),
|
||||
(3, N'Identificación Oficial', 1, 1, 0, 2, NULL),
|
||||
(3, N'Constancia de Situación Fiscal', 1, 1, 0, 3, NULL),
|
||||
(3, N'Comprobante de Domicilio', 1, 1, 0, 4, NULL),
|
||||
(3, N'Constancia de No Adeudo de Tesorería Municipal', 1, 1, 0, 5, NULL),
|
||||
(3, N'Dictamen de Prefactibilidad de Servicios', 0, 0, 0, 6, N'Equivalencia propuesta: Prefactibilidad de Servicios → Dictamen de Prefactibilidad de Servicios. Antecedente emitido por Agua; no existe reutilización automática de archivos entre solicitudes.'),
|
||||
(3, N'Acta Constitutiva', 0, 1, 0, 7, N'Depende de persona moral o representación; no se crea una condición nueva.'),
|
||||
(3, N'Poder del Representante Legal', 0, 1, 0, 8, N'Depende de persona moral o representación; no se crea una condición nueva.'),
|
||||
(4, N'Escrito de Solicitud de Convenio para Recuperación de Caudal', 1, 1, 0, 1, NULL),
|
||||
(4, N'Identificación Oficial', 1, 1, 0, 2, NULL),
|
||||
(4, N'Constancia de Situación Fiscal', 1, 1, 0, 3, NULL),
|
||||
(4, N'Comprobante de Domicilio', 1, 1, 0, 4, NULL),
|
||||
(4, N'Constancia de No Adeudo de Tesorería Municipal', 1, 1, 0, 5, NULL),
|
||||
(4, N'Dictamen de Prefactibilidad de Servicios', 0, 0, 0, 6, N'Equivalencia propuesta: Prefactibilidad de Servicios → Dictamen de Prefactibilidad de Servicios. Antecedente emitido por Agua; no existe reutilización automática de archivos entre solicitudes.'),
|
||||
(4, N'Acta Constitutiva', 0, 1, 0, 7, N'Depende de persona moral o representación; no se crea una condición nueva.'),
|
||||
(4, N'Poder del Representante Legal', 0, 1, 0, 8, N'Depende de persona moral o representación; no se crea una condición nueva.'),
|
||||
(4, N'Convenio de Recuperación de Caudal', 0, 0, 0, 9, N'Resultado generado por Agua.'),
|
||||
(4, N'Convenio de Aportación para Recuperación de Caudal', 0, 0, 0, 10, N'Ya existe en el catálogo; documento condicionado al caso.'),
|
||||
(5, N'Solicitud de Puntos de Conexión', 1, 1, 0, 1, NULL),
|
||||
(5, N'Croquis de Ubicación del Predio', 1, 1, 0, 2, NULL),
|
||||
(5, N'Dictamen de Factibilidad de Servicios', 0, 0, 0, 3, N'Equivalencia propuesta: Factibilidad de Servicios → Dictamen de Factibilidad de Servicios. La especificación admite Factibilidad Habitacional / Factibilidad de Servicios; se reutiliza el dictamen existente.'),
|
||||
(5, N'Autorización de Puntos de Conexión del Fraccionamiento', 0, 0, 0, 4, N'Equivalencia propuesta: Autorización de Puntos de Conexión del Desarrollo → Autorización de Puntos de Conexión del Fraccionamiento. Resultado generado por Agua.'),
|
||||
(6, N'Formato KYC Persona Física', 0, 1, 0, 1, N'Revisar aplicación por persona física/moral, representación o beneficiario.'),
|
||||
(6, N'Formato Beneficiario Controlador', 0, 1, 0, 2, N'Revisar aplicación por persona física/moral, representación o beneficiario.'),
|
||||
(6, N'Poder del Representante Legal', 0, 1, 0, 3, N'Revisar aplicación por persona física/moral, representación o beneficiario.'),
|
||||
(6, N'Identificación Oficial', 0, 1, 0, 4, N'Equivalencia propuesta: Identificación Oficial del Representante Legal → Identificación Oficial. Revisar aplicación por persona física/moral, representación o beneficiario.'),
|
||||
(6, N'Constancia de Situación Fiscal', 0, 1, 0, 5, N'Equivalencia propuesta: Constancia de Situación Fiscal del Representante Legal → Constancia de Situación Fiscal. Revisar aplicación por persona física/moral, representación o beneficiario.'),
|
||||
(6, N'Comprobante de Domicilio', 1, 1, 0, 6, NULL),
|
||||
(6, N'Contrato / Convenio de Adhesión al Fideicomiso', 0, NULL, 0, 7, N'Existe en catálogo sin relaciones; no se pudo verificar quién carga el convenio formalizado. Relación pendiente.'),
|
||||
(7, N'Solicitud de Revisión y Autorización de Proyectos y Presupuesto', 1, 1, 0, 1, NULL),
|
||||
(7, N'Proyecto Ejecutivo de Infraestructura Hidráulica', 1, 1, 0, 2, N'Equivalencia propuesta: Proyecto Ejecutivo Hidráulico → Proyecto Ejecutivo de Infraestructura Hidráulica.'),
|
||||
(7, N'Presupuesto a Costo Directo', 1, 1, 0, 3, NULL),
|
||||
(8, N'Solicitud de Revisión y Autorización de Proyectos y Presupuesto', 1, 1, 0, 1, NULL),
|
||||
(8, N'Proyecto Ejecutivo de Infraestructura Hidráulica', 1, 1, 0, 2, N'Equivalencia propuesta: Proyecto Ejecutivo Hidráulico → Proyecto Ejecutivo de Infraestructura Hidráulica.'),
|
||||
(8, N'Presupuesto a Costo Directo', 1, 1, 0, 3, NULL),
|
||||
(7, N'Autorización de Proyecto de Obras de Cabeza', 0, 0, 0, 4, N'Resultado; revisar documento conjunto existente antes de crear tipos separados.'),
|
||||
(7, N'Autorización de Presupuesto de Obras de Cabeza', 0, 0, 0, 5, N'Resultado; revisar documento conjunto existente antes de crear tipos separados.'),
|
||||
(8, N'Memoria de cálculo', 0, 1, 0, 4, N'Equivalencia propuesta: Memoria de Cálculo → Memoria de cálculo. Existe en el catálogo pero no tiene relación actual; se propone opcional por la condición si corresponde.'),
|
||||
(8, N'Autorización de Proyecto de Obra Necesaria', 0, 0, 0, 5, N'Resultado generado por Agua.'),
|
||||
(8, N'Autorización de Presupuesto de Obra Necesaria', 0, 0, 0, 6, N'Resultado generado por Agua.'),
|
||||
(9, N'Escrito de Solicitud de Convenio de Obra Necesaria en Especie', 1, 1, 0, 1, NULL),
|
||||
(9, N'Autorización de Proyecto de Obras de Cabeza', 0, 0, 0, 2, N'Antecedentes alternativos: obras de cabeza / obra necesaria; no se exigen ambas variantes.'),
|
||||
(9, N'Autorización de Proyecto de Obra Necesaria', 0, 0, 0, 3, N'Antecedentes alternativos: obras de cabeza / obra necesaria; no se exigen ambas variantes.'),
|
||||
(9, N'Autorización de Presupuesto de Obras de Cabeza', 0, 0, 0, 4, N'Antecedentes alternativos: obras de cabeza / obra necesaria; no se exigen ambas variantes.'),
|
||||
(9, N'Autorización de Presupuesto de Obra Necesaria', 0, 0, 0, 5, N'Antecedentes alternativos: obras de cabeza / obra necesaria; no se exigen ambas variantes.'),
|
||||
(9, N'Identificación Oficial', 1, 1, 0, 6, NULL),
|
||||
(9, N'Constancia de Situación Fiscal', 1, 1, 0, 7, NULL),
|
||||
(9, N'Comprobante de Domicilio', 1, 1, 0, 8, NULL),
|
||||
(9, N'Constancia de No Adeudo de Tesorería Municipal', 1, 1, 0, 9, NULL),
|
||||
(9, N'Dictamen de Prefactibilidad de Servicios', 0, 0, 0, 10, N'Equivalencia propuesta: Prefactibilidad de Servicios → Dictamen de Prefactibilidad de Servicios. Antecedente emitido por Agua.'),
|
||||
(9, N'Acta Constitutiva', 0, 1, 0, 11, N'Condicionado a persona moral o representación.'),
|
||||
(9, N'Poder del Representante Legal', 0, 1, 0, 12, N'Condicionado a persona moral o representación.'),
|
||||
(9, N'Convenio de Ejecución de Obras Necesarias en Especie', 0, 0, 0, 13, N'Equivalencia propuesta: Convenio de Ejecución de Obra Necesaria en Especie → Convenio de Ejecución de Obras Necesarias en Especie. Documento resultante formalizado por Agua.'),
|
||||
(10, N'Solicitud para Asignación de Supervisor', 1, 1, 0, 1, NULL),
|
||||
(10, N'Programa de Obra', 1, 1, 0, 2, NULL),
|
||||
(11, N'Escrito de Solicitud de Factibilidad de Servicios', 1, 1, 0, 1, NULL),
|
||||
(11, N'Dictamen de Prefactibilidad de Servicios', 0, 0, 0, 2, N'Equivalencia propuesta: Prefactibilidad de Servicios → Dictamen de Prefactibilidad de Servicios. Antecedente de otro trámite; revisión de aplicabilidad.'),
|
||||
(11, N'Convenio de Pagos para Obras Necesarias', 0, 0, 0, 3, N'Equivalencia propuesta: Convenio de Coordinación de Pagos para Obras Necesarias → Convenio de Pagos para Obras Necesarias. Antecedente de otro trámite; revisión de aplicabilidad.'),
|
||||
(11, N'Convenio de Recuperación de Caudal', 0, 0, 0, 4, N'Equivalencia propuesta: Convenio de Coordinación de Pagos para Recuperación de Caudal → Convenio de Recuperación de Caudal. Antecedente de otro trámite; revisión de aplicabilidad.'),
|
||||
(11, N'Convenio de Adhesión al Fideicomiso de Obras Necesarias', 0, NULL, 0, 5, N'No existe equivalencia específica verificada con el convenio genérico ni responsable de carga confirmado.'),
|
||||
(11, N'Convenio de Adhesión al Fideicomiso de Recuperación de Caudal', 0, NULL, 0, 6, N'No existe equivalencia específica verificada con el convenio genérico ni responsable de carga confirmado.'),
|
||||
(11, N'Comprobante del Primer Pago de los Convenios de Adhesión', 0, 1, 0, 7, N'Archivo comprobante, no concepto de pago. Depende de convenio aplicable.'),
|
||||
(11, N'Poder / Carta Poder', 0, 1, 0, 8, N'Solo cuando no sea propietario; revisar diferencia con Poder del Representante Legal.'),
|
||||
(11, N'Identificación Oficial', 1, 1, 0, 9, NULL),
|
||||
(11, N'Constancia de No Adeudo de Tesorería Municipal', 1, 1, 0, 10, NULL),
|
||||
(11, N'Dictamen de Factibilidad de Servicios', 0, 0, 0, 11, N'Equivalencia propuesta: Factibilidad de Servicios → Dictamen de Factibilidad de Servicios. Dictamen/oficio de resultado generado por Agua.'),
|
||||
(12, N'Escrito de Solicitud de Revisión y Autorización de Proyectos', 1, 1, 0, 1, NULL),
|
||||
(12, N'Constancia de No Adeudo de Tesorería Municipal', 1, 1, 0, 2, NULL),
|
||||
(12, N'Oficio de Licencia de Uso de Suelo', 1, 1, 0, 3, NULL),
|
||||
(12, N'Convenio de Fraccionamiento', 1, 1, 0, 4, NULL),
|
||||
(12, N'Plano del Convenio de Fraccionamiento Sellado y Firmado', 1, 1, 0, 5, NULL),
|
||||
(12, N'Oficio de Rasantes Autorizado', 1, 1, 0, 6, NULL),
|
||||
(12, N'Plano de Rasantes Autorizado', 1, 1, 0, 7, NULL),
|
||||
(12, N'Autorización de Puntos de Conexión del Fraccionamiento', 0, 0, 0, 8, N'Equivalencia propuesta: Autorización de Puntos de Conexión del Desarrollo → Autorización de Puntos de Conexión del Fraccionamiento. Antecedente generado por Agua.'),
|
||||
(12, N'Dictamen de Factibilidad de Servicios', 0, 0, 0, 9, N'Equivalencia propuesta: Factibilidad de Servicios → Dictamen de Factibilidad de Servicios. Antecedente generado por Agua.'),
|
||||
(12, N'Planos Autorizados de Proyectos Ejecutivos de Obras Necesarias', 0, NULL, 0, 10, N'Solo cuando sean requeridos para la conexión. Confirmar quién entrega/carga el plano autorizado.'),
|
||||
(12, N'Memorias Descriptivas y Cálculos Hidráulicos', 1, 1, 0, 11, NULL),
|
||||
(12, N'Planos de Redes Internas de Agua Potable', 1, 1, 0, 12, NULL),
|
||||
(12, N'Planos de Redes Internas de Alcantarillado Sanitario', 1, 1, 0, 13, NULL),
|
||||
(12, N'Plano de Sembrado de Vivienda', 1, 1, 0, 14, NULL),
|
||||
(12, N'Plano de Nomenclatura', 1, 1, 0, 15, NULL),
|
||||
(12, N'Formato de Alta de Lotes', 1, 1, 0, 16, NULL),
|
||||
(12, N'Corrida Hidráulica EPANET', 1, 1, 0, 17, NULL),
|
||||
(12, N'Archivo GIS de la Etapa', 1, 1, 0, 18, NULL),
|
||||
(12, N'Autorización de Proyectos de Redes Internas', 0, 0, 0, 19, N'Resultado generado por Agua.'),
|
||||
(13, N'Solicitud para Asignación de Supervisor', 1, 1, 0, 1, NULL),
|
||||
(13, N'Programa de Obra', 1, 1, 0, 2, NULL),
|
||||
(13, N'Autorización de Proyectos de Redes Internas', 0, 0, 0, 3, N'Antecedente generado por Agua; no hay reutilización automática de archivos del trámite anterior.'),
|
||||
(19, N'Solicitud para Entrega de Infraestructura Externa', 1, 1, 0, 1, NULL),
|
||||
(19, N'Pruebas Liberadas', 0, NULL, 0, 2, N'Confirmar emisor/cargador y obligatoriedad de las pruebas liberadas.'),
|
||||
(20, N'Solicitud para Contratación del Macromedidor', 1, 1, 0, 1, NULL),
|
||||
(20, N'Liberación de Supervisión', 0, NULL, 0, 2, N'Confirmar emisor/cargador y si se obtiene del trámite de supervisión.'),
|
||||
(21, N'Solicitud para Entrega de Infraestructura Interna', 1, 1, 0, 1, NULL),
|
||||
(21, N'Pruebas Liberadas', 0, NULL, 0, 2, N'Confirmar emisor/cargador y obligatoriedad de las pruebas liberadas.'),
|
||||
(22, N'Acta Constitutiva', 0, 1, 0, 1, N'Condicionado a persona moral o representación.'),
|
||||
(22, N'Poder del Representante Legal', 0, 1, 0, 2, N'Condicionado a persona moral o representación.'),
|
||||
(22, N'Identificación Oficial', 1, 1, 0, 3, N'Equivalencia propuesta: Identificación del Representante Legal → Identificación Oficial.'),
|
||||
(22, N'Constancia de Situación Fiscal', 1, 1, 0, 4, NULL),
|
||||
(22, N'Constancia de No Adeudo de Tesorería Municipal', 1, 1, 0, 5, N'Equivalencia propuesta: Constancia de No Adeudo de Tesorería → Constancia de No Adeudo de Tesorería Municipal.'),
|
||||
(22, N'Dictamen de Factibilidad de Servicios', 0, 0, 1, 6, N'Equivalencia propuesta: Factibilidad Habitacional Vigente → Dictamen de Factibilidad de Servicios. Vigencia explícita en la especificación. Antecedente; confirmar que el dictamen general cubre el habitacional.'),
|
||||
(22, N'Autorización de Proyectos de Redes Internas', 0, 0, 0, 7, N'Equivalencia propuesta: Autorización de Redes Internas → Autorización de Proyectos de Redes Internas. Antecedente generado por Agua.'),
|
||||
(22, N'Plano de Sembrado de Vivienda', 1, 1, 0, 8, NULL),
|
||||
(22, N'Relación de Viviendas', 1, 1, 0, 9, NULL),
|
||||
(23, N'Carta de Asignación', 0, NULL, 0, 1, N'Confirmar emisor/cargador y aplicabilidad.'),
|
||||
(23, N'Identificación Oficial', 1, 1, 0, 2, N'Equivalencia propuesta: Identificación Oficial / INE → Identificación Oficial.'),
|
||||
(23, N'Constancia RFC del Propietario', 1, 1, 0, 3, NULL),
|
||||
(24, N'Solicitud de Entrega-Recepción', 1, 1, 0, 1, NULL),
|
||||
(24, N'Pruebas Liberadas', 0, NULL, 0, 2, N'Confirmar emisor/cargador y obligatoriedad.'),
|
||||
(24, N'Comprobante de Pagos de Derechos y Aportaciones', 0, 1, 0, 3, N'Archivo comprobante, no pago. Revisar obligatoriedad.'),
|
||||
(24, N'Contrato de Vivienda', 0, NULL, 0, 4, N'Confirmar si es contrato emitido por Agua o documento proporcionado por el cliente.');
|
||||
|
||||
BEGIN TRY
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
IF OBJECT_ID('dbo.Tra_TiposDocumento', 'U') IS NULL
|
||||
OR OBJECT_ID('dbo.Tra_TiposTramiteDocumento', 'U') IS NULL
|
||||
OR OBJECT_ID('dbo.Tra_TiposTramite', 'U') IS NULL
|
||||
THROW 51000, 'No se encuentra la estructura de documentos revisada.', 1;
|
||||
|
||||
IF COL_LENGTH('dbo.Tra_TiposDocumento', 'EsCliente') IS NOT NULL
|
||||
OR COL_LENGTH('dbo.Tra_TiposTramiteDocumento', 'TieneVigencia') IS NULL
|
||||
THROW 51000, 'La estructura de documentos no coincide con la nueva versión revisada.', 1;
|
||||
|
||||
IF @Aplicar = 1
|
||||
BEGIN
|
||||
-- Resolver nombres y órdenes sobre un conjunto estable antes de insertar.
|
||||
DECLARE @FilasBloqueadas bigint;
|
||||
SELECT @FilasBloqueadas = COUNT_BIG(*)
|
||||
FROM dbo.Tra_TiposDocumento WITH (TABLOCKX, HOLDLOCK);
|
||||
SELECT @FilasBloqueadas = COUNT_BIG(*)
|
||||
FROM dbo.Tra_TiposTramiteDocumento WITH (TABLOCKX, HOLDLOCK);
|
||||
SELECT @FilasBloqueadas = COUNT_BIG(*)
|
||||
FROM dbo.Tra_TiposTramite WITH (TABLOCKX, HOLDLOCK);
|
||||
END;
|
||||
|
||||
UPDATE T
|
||||
SET CveTipoTramite = B.CveTipoTramite
|
||||
FROM @Tramites AS T
|
||||
INNER JOIN dbo.Tra_TiposTramite AS B ON B.CveTipoTramite = T.CveVerificada
|
||||
AND B.TipoTramite COLLATE Modern_Spanish_CS_AS = T.NombreVerificado
|
||||
AND B.EsActivo = 1;
|
||||
|
||||
-- Comparación sin distinción de mayúsculas, respetando acentos.
|
||||
-- No se buscan equivalencias semánticas automáticamente.
|
||||
UPDATE D
|
||||
SET
|
||||
Coincidencias = C.Cantidad,
|
||||
CveTipoDocumento = CASE WHEN C.Cantidad = 1 THEN C.Clave END,
|
||||
EsActivoActual = CASE WHEN C.Cantidad = 1 THEN CONVERT(bit, C.Activo) END
|
||||
FROM @Documentos AS D
|
||||
OUTER APPLY
|
||||
(
|
||||
SELECT
|
||||
COUNT(*) AS Cantidad,
|
||||
MIN(B.CveTipoDocumento) AS Clave,
|
||||
MIN(CONVERT(int, B.EsActivo)) AS Activo
|
||||
FROM dbo.Tra_TiposDocumento AS B
|
||||
WHERE LTRIM(RTRIM(B.TipoDocumento)) COLLATE Modern_Spanish_CI_AS = D.Nombre
|
||||
) AS C;
|
||||
|
||||
-- Diagnóstico 1: trámites verificados, no encontrados o cuyo nombre cambió.
|
||||
SELECT
|
||||
T.CveVerificada,
|
||||
T.NombreVerificado,
|
||||
B.TipoTramite AS NombreActual,
|
||||
T.CveTipoTramite AS ClaveResuelta,
|
||||
CASE WHEN T.CveTipoTramite IS NULL THEN 'PENDIENTE' ELSE 'Verificado' END AS Estado
|
||||
FROM @Tramites AS T
|
||||
LEFT JOIN dbo.Tra_TiposTramite AS B ON B.CveTipoTramite = T.CveVerificada
|
||||
ORDER BY T.CveVerificada;
|
||||
|
||||
-- Diagnóstico 2: posibles duplicados por nombre (incluye mayúsculas/espacios).
|
||||
SELECT
|
||||
LTRIM(RTRIM(TipoDocumento)) COLLATE Modern_Spanish_CI_AS AS NombreComparado,
|
||||
COUNT(*) AS Coincidencias
|
||||
FROM dbo.Tra_TiposDocumento
|
||||
GROUP BY LTRIM(RTRIM(TipoDocumento)) COLLATE Modern_Spanish_CI_AS
|
||||
HAVING COUNT(*) > 1;
|
||||
|
||||
-- Diagnóstico 3: catálogo completo de la propuesta y diferencias de metadatos.
|
||||
SELECT
|
||||
D.Nombre AS DocumentoPropuesto,
|
||||
D.CveTipoDocumento,
|
||||
B.TipoDocumento AS NombreActual,
|
||||
CASE
|
||||
WHEN D.RevisionPendiente IS NOT NULL THEN 'PENDIENTE: revisar equivalencia'
|
||||
WHEN D.Coincidencias > 1 THEN 'PENDIENTE: nombre duplicado'
|
||||
WHEN D.Coincidencias = 0 THEN 'Nuevo'
|
||||
ELSE 'Existente: conservar'
|
||||
END AS Estado,
|
||||
B.Descripcion AS DescripcionActual,
|
||||
D.Descripcion AS DescripcionPropuesta,
|
||||
B.ExtensionesPermitidas AS ExtensionesActuales,
|
||||
D.Extensiones AS ExtensionesPropuestas,
|
||||
B.TamanoMaximoMb AS TamanoActual,
|
||||
D.TamanoMaximoMb AS TamanoPropuesto,
|
||||
B.EsActivo AS EsActivoActual,
|
||||
D.RevisionPendiente,
|
||||
CONVERT(bit, CASE WHEN D.CveTipoDocumento IS NOT NULL AND EXISTS
|
||||
(
|
||||
SELECT D.Descripcion, D.Extensiones, D.TamanoMaximoMb
|
||||
EXCEPT
|
||||
SELECT B.Descripcion, B.ExtensionesPermitidas, B.TamanoMaximoMb
|
||||
) THEN 1 ELSE 0 END) AS DiferenciasMetadatosNoActualizar
|
||||
FROM @Documentos AS D
|
||||
LEFT JOIN dbo.Tra_TiposDocumento AS B ON B.CveTipoDocumento = D.CveTipoDocumento
|
||||
ORDER BY D.Nombre;
|
||||
|
||||
DECLARE @Plan TABLE
|
||||
(
|
||||
CveVerificada int NOT NULL,
|
||||
Documento nvarchar(200) COLLATE Modern_Spanish_CI_AS NOT NULL,
|
||||
MotivoPendiente nvarchar(2000) NULL,
|
||||
ExisteRelacion bit NOT NULL,
|
||||
OrdenPropuesto int NULL,
|
||||
PRIMARY KEY (CveVerificada, Documento)
|
||||
);
|
||||
|
||||
INSERT INTO @Plan
|
||||
(CveVerificada, Documento, MotivoPendiente, ExisteRelacion, OrdenPropuesto)
|
||||
SELECT
|
||||
R.CveVerificada,
|
||||
R.Documento,
|
||||
NULLIF(CONCAT(
|
||||
CASE WHEN T.CveTipoTramite IS NULL THEN N'Trámite no verificado. ' ELSE N'' END,
|
||||
CASE WHEN D.Coincidencias > 1 THEN N'Documento duplicado por nombre. ' ELSE N'' END,
|
||||
CASE WHEN D.EsActivoActual = 0 THEN N'Documento existente inactivo: no reactivar automáticamente. ' ELSE N'' END,
|
||||
CASE WHEN D.RevisionPendiente IS NOT NULL THEN D.RevisionPendiente + N' ' ELSE N'' END,
|
||||
CASE WHEN R.EsCliente IS NULL THEN N'Falta confirmar EsCliente. ' ELSE N'' END
|
||||
), N''),
|
||||
CONVERT(bit, CASE WHEN B.CveTipoDocumento IS NULL THEN 0 ELSE 1 END),
|
||||
B.Orden
|
||||
FROM @Relaciones AS R
|
||||
INNER JOIN @Tramites AS T ON T.CveVerificada = R.CveVerificada
|
||||
INNER JOIN @Documentos AS D ON D.Nombre = R.Documento
|
||||
LEFT JOIN dbo.Tra_TiposTramiteDocumento AS B ON B.CveTipoTramite = T.CveTipoTramite
|
||||
AND B.CveTipoDocumento = D.CveTipoDocumento;
|
||||
|
||||
;WITH Nuevas AS
|
||||
(
|
||||
SELECT
|
||||
P.CveVerificada,
|
||||
P.Documento,
|
||||
ISNULL(M.OrdenMaximo, 0) +
|
||||
ROW_NUMBER() OVER
|
||||
(
|
||||
PARTITION BY P.CveVerificada
|
||||
ORDER BY R.OrdenEspecificacion, P.Documento
|
||||
) AS OrdenNuevo
|
||||
FROM @Plan AS P
|
||||
INNER JOIN @Relaciones AS R ON R.CveVerificada = P.CveVerificada
|
||||
AND R.Documento = P.Documento
|
||||
INNER JOIN @Tramites AS T ON T.CveVerificada = P.CveVerificada
|
||||
OUTER APPLY
|
||||
(
|
||||
SELECT MAX(B.Orden) AS OrdenMaximo
|
||||
FROM dbo.Tra_TiposTramiteDocumento AS B
|
||||
WHERE B.CveTipoTramite = T.CveTipoTramite
|
||||
) AS M
|
||||
WHERE P.MotivoPendiente IS NULL
|
||||
AND P.ExisteRelacion = 0
|
||||
)
|
||||
UPDATE P
|
||||
SET OrdenPropuesto = N.OrdenNuevo
|
||||
FROM @Plan AS P
|
||||
INNER JOIN Nuevas AS N ON N.CveVerificada = P.CveVerificada
|
||||
AND N.Documento = P.Documento;
|
||||
|
||||
-- Diagnóstico 4: cada relación, su orden y diferencias; nunca se sobrescriben.
|
||||
SELECT
|
||||
R.CveVerificada AS CveTipoTramite,
|
||||
T.NombreVerificado AS TipoTramite,
|
||||
D.CveTipoDocumento,
|
||||
R.Documento AS TipoDocumento,
|
||||
R.EsRequerido,
|
||||
R.EsCliente,
|
||||
R.TieneVigencia,
|
||||
R.OrdenEspecificacion,
|
||||
P.OrdenPropuesto,
|
||||
1 AS EsActivoPropuesto,
|
||||
P.ExisteRelacion,
|
||||
P.MotivoPendiente,
|
||||
B.EsRequerido AS EsRequeridoActual,
|
||||
B.EsCliente AS EsClienteActual,
|
||||
B.TieneVigencia AS TieneVigenciaActual,
|
||||
B.Orden AS OrdenActual,
|
||||
B.EsActivo AS EsActivoActual,
|
||||
CONVERT(bit, CASE WHEN P.ExisteRelacion = 1 AND EXISTS
|
||||
(
|
||||
SELECT R.EsRequerido, R.EsCliente, R.TieneVigencia, R.OrdenEspecificacion, CONVERT(bit, 1)
|
||||
EXCEPT
|
||||
SELECT B.EsRequerido, B.EsCliente, B.TieneVigencia, B.Orden, B.EsActivo
|
||||
) THEN 1 ELSE 0 END) AS DiferenciaConEspecificacionNoActualizar,
|
||||
R.Nota
|
||||
FROM @Relaciones AS R
|
||||
INNER JOIN @Plan AS P ON P.CveVerificada = R.CveVerificada AND P.Documento = R.Documento
|
||||
INNER JOIN @Tramites AS T ON T.CveVerificada = R.CveVerificada
|
||||
INNER JOIN @Documentos AS D ON D.Nombre = R.Documento
|
||||
LEFT JOIN dbo.Tra_TiposTramiteDocumento AS B ON B.CveTipoTramite = T.CveTipoTramite
|
||||
AND B.CveTipoDocumento = D.CveTipoDocumento
|
||||
ORDER BY R.CveVerificada, R.OrdenEspecificacion;
|
||||
|
||||
-- Diagnóstico 5: relaciones anteriores, incluidas las ajenas a esta propuesta.
|
||||
SELECT
|
||||
R.CveTipoTramite,
|
||||
T.TipoTramite,
|
||||
R.CveTipoDocumento,
|
||||
D.TipoDocumento,
|
||||
R.EsRequerido,
|
||||
R.EsCliente,
|
||||
R.TieneVigencia,
|
||||
R.Orden,
|
||||
R.EsActivo
|
||||
FROM dbo.Tra_TiposTramiteDocumento AS R
|
||||
INNER JOIN dbo.Tra_TiposTramite AS T ON T.CveTipoTramite = R.CveTipoTramite
|
||||
INNER JOIN dbo.Tra_TiposDocumento AS D ON D.CveTipoDocumento = R.CveTipoDocumento
|
||||
ORDER BY R.CveTipoTramite, R.Orden, R.CveTipoDocumento;
|
||||
|
||||
IF @Aplicar = 0
|
||||
BEGIN
|
||||
COMMIT TRANSACTION;
|
||||
SELECT
|
||||
'SOLO DIAGNÓSTICO: no se insertaron ni actualizaron datos de negocio.' AS Resultado,
|
||||
(SELECT COUNT(*) FROM @Documentos WHERE Coincidencias = 0 AND RevisionPendiente IS NULL) AS DocumentosNuevosListos,
|
||||
(SELECT COUNT(*) FROM @Plan WHERE MotivoPendiente IS NULL AND ExisteRelacion = 0) AS RelacionesNuevasListas,
|
||||
(SELECT COUNT(*) FROM @Plan WHERE MotivoPendiente IS NOT NULL) AS RelacionesPendientes;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF @CveUsuario IS NULL OR NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM dbo.Sis_Usuarios
|
||||
WHERE CveUsuario = @CveUsuario AND Activo = 1
|
||||
)
|
||||
THROW 51000, 'Configure @CveUsuario con una clave real y activa antes de aplicar.', 1;
|
||||
|
||||
IF @PermitirPendientes = 0
|
||||
AND
|
||||
(
|
||||
EXISTS (SELECT 1 FROM @Plan WHERE MotivoPendiente IS NOT NULL)
|
||||
OR EXISTS (SELECT 1 FROM @Documentos WHERE RevisionPendiente IS NOT NULL)
|
||||
)
|
||||
THROW 51000, 'Hay decisiones pendientes. Resolverlas antes de aplicar o autorizar explícitamente una carga parcial.', 1;
|
||||
|
||||
IF EXISTS (SELECT 1 FROM @Documentos WHERE Coincidencias > 1)
|
||||
THROW 51000, 'Existen coincidencias documentales ambiguas. No se insertará ningún dato.', 1;
|
||||
|
||||
INSERT INTO dbo.Tra_TiposDocumento
|
||||
(TipoDocumento, Descripcion, ExtensionesPermitidas, TamanoMaximoMb, EsActivo, CveUsuario)
|
||||
SELECT D.Nombre, D.Descripcion, D.Extensiones, D.TamanoMaximoMb, 1, @CveUsuario
|
||||
FROM @Documentos AS D
|
||||
WHERE D.RevisionPendiente IS NULL
|
||||
AND NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Tra_TiposDocumento AS B
|
||||
WHERE LTRIM(RTRIM(B.TipoDocumento)) COLLATE Modern_Spanish_CI_AS = D.Nombre
|
||||
);
|
||||
|
||||
UPDATE D
|
||||
SET CveTipoDocumento = B.CveTipoDocumento
|
||||
FROM @Documentos AS D
|
||||
INNER JOIN dbo.Tra_TiposDocumento AS B ON
|
||||
LTRIM(RTRIM(B.TipoDocumento)) COLLATE Modern_Spanish_CI_AS = D.Nombre
|
||||
WHERE D.RevisionPendiente IS NULL;
|
||||
|
||||
-- Recalcular exclusivamente órdenes nuevos bajo bloqueo.
|
||||
;WITH Nuevas AS
|
||||
(
|
||||
SELECT
|
||||
P.CveVerificada,
|
||||
P.Documento,
|
||||
ISNULL(M.OrdenMaximo, 0) +
|
||||
ROW_NUMBER() OVER
|
||||
(
|
||||
PARTITION BY P.CveVerificada
|
||||
ORDER BY R.OrdenEspecificacion, P.Documento
|
||||
) AS OrdenNuevo
|
||||
FROM @Plan AS P
|
||||
INNER JOIN @Relaciones AS R ON R.CveVerificada = P.CveVerificada AND R.Documento = P.Documento
|
||||
INNER JOIN @Tramites AS T ON T.CveVerificada = P.CveVerificada
|
||||
INNER JOIN @Documentos AS D ON D.Nombre = P.Documento
|
||||
OUTER APPLY
|
||||
(
|
||||
SELECT MAX(B.Orden) AS OrdenMaximo
|
||||
FROM dbo.Tra_TiposTramiteDocumento AS B
|
||||
WHERE B.CveTipoTramite = T.CveTipoTramite
|
||||
) AS M
|
||||
WHERE P.MotivoPendiente IS NULL
|
||||
AND NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Tra_TiposTramiteDocumento AS B
|
||||
WHERE B.CveTipoTramite = T.CveTipoTramite
|
||||
AND B.CveTipoDocumento = D.CveTipoDocumento
|
||||
)
|
||||
)
|
||||
UPDATE P
|
||||
SET OrdenPropuesto = N.OrdenNuevo
|
||||
FROM @Plan AS P
|
||||
INNER JOIN Nuevas AS N ON N.CveVerificada = P.CveVerificada AND N.Documento = P.Documento;
|
||||
|
||||
INSERT INTO dbo.Tra_TiposTramiteDocumento
|
||||
(CveTipoTramite, CveTipoDocumento, EsRequerido, EsCliente, TieneVigencia, Orden, EsActivo)
|
||||
SELECT
|
||||
T.CveTipoTramite,
|
||||
D.CveTipoDocumento,
|
||||
R.EsRequerido,
|
||||
R.EsCliente,
|
||||
R.TieneVigencia,
|
||||
P.OrdenPropuesto,
|
||||
1
|
||||
FROM @Relaciones AS R
|
||||
INNER JOIN @Tramites AS T ON T.CveVerificada = R.CveVerificada
|
||||
INNER JOIN @Documentos AS D ON D.Nombre = R.Documento
|
||||
INNER JOIN @Plan AS P ON P.CveVerificada = R.CveVerificada AND P.Documento = R.Documento
|
||||
WHERE P.MotivoPendiente IS NULL
|
||||
AND D.CveTipoDocumento IS NOT NULL
|
||||
AND NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Tra_TiposTramiteDocumento AS B
|
||||
WHERE B.CveTipoTramite = T.CveTipoTramite
|
||||
AND B.CveTipoDocumento = D.CveTipoDocumento
|
||||
);
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
|
||||
-- Comprobación final: estructura solicitada, sin alterar los registros previos.
|
||||
SELECT
|
||||
R.CveTipoTramite,
|
||||
T.TipoTramite,
|
||||
R.CveTipoDocumento,
|
||||
D.TipoDocumento,
|
||||
R.EsRequerido,
|
||||
R.EsCliente,
|
||||
R.TieneVigencia,
|
||||
R.Orden,
|
||||
R.EsActivo
|
||||
FROM dbo.Tra_TiposTramiteDocumento AS R
|
||||
INNER JOIN dbo.Tra_TiposTramite AS T ON T.CveTipoTramite = R.CveTipoTramite
|
||||
INNER JOIN dbo.Tra_TiposDocumento AS D ON D.CveTipoDocumento = R.CveTipoDocumento
|
||||
WHERE EXISTS (SELECT 1 FROM @Tramites AS P WHERE P.CveTipoTramite = R.CveTipoTramite)
|
||||
ORDER BY R.CveTipoTramite, R.Orden, R.CveTipoDocumento;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
IF @@TRANCOUNT > 0
|
||||
ROLLBACK TRANSACTION;
|
||||
THROW;
|
||||
END CATCH;
|
||||
File diff suppressed because it is too large
Load Diff
246
Entregables/Gis/PruebasFlujoGis.js.txt
Normal file
246
Entregables/Gis/PruebasFlujoGis.js.txt
Normal file
@@ -0,0 +1,246 @@
|
||||
// Ejecutar desde la raíz del proyecto:
|
||||
// node Entregables/Gis/PruebasFlujoGis.js.txt
|
||||
// Controles y transporte simulados: no abre navegador ni modifica la BD.
|
||||
const archivos = require('node:fs');
|
||||
const entornoVirtual = require('node:vm');
|
||||
const comprobar = require('node:assert/strict');
|
||||
const controles = new Map();
|
||||
const solicitudes = [];
|
||||
const alertas = [];
|
||||
|
||||
function crearControl() {
|
||||
return {
|
||||
length: 1,
|
||||
atributos: {},
|
||||
eventos: {},
|
||||
texto: '',
|
||||
prop() {
|
||||
return this;
|
||||
},
|
||||
toggle() {
|
||||
return this;
|
||||
},
|
||||
trigger() {
|
||||
return this;
|
||||
},
|
||||
hide() {
|
||||
return this;
|
||||
},
|
||||
show() {
|
||||
return this;
|
||||
},
|
||||
removeClass() {
|
||||
return this;
|
||||
},
|
||||
addClass() {
|
||||
return this;
|
||||
},
|
||||
text(valor) {
|
||||
this.texto = valor;
|
||||
return this;
|
||||
},
|
||||
attr(nombre, valor) {
|
||||
if (valor === undefined) {
|
||||
return this.atributos[nombre];
|
||||
}
|
||||
|
||||
this.atributos[nombre] = valor;
|
||||
return this;
|
||||
},
|
||||
filter(selector) {
|
||||
const bandera = selector.match(/\[([^=]+)=/)[1];
|
||||
const control = this;
|
||||
return {
|
||||
each(ejecutar) {
|
||||
if (control.atributos[bandera] !== '1') {
|
||||
ejecutar.call(control);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
};
|
||||
},
|
||||
on(evento, selector, ejecutar) {
|
||||
const accion = typeof selector === 'function' ? selector : ejecutar;
|
||||
this.eventos[evento] = this.eventos[evento] || [];
|
||||
this.eventos[evento].push(accion);
|
||||
return this;
|
||||
},
|
||||
off() {
|
||||
throw new Error('La inicialización no debe desmontar eventos existentes.');
|
||||
},
|
||||
click() {
|
||||
throw new Error('El guardado no debe cerrar el modal ni perder el borrador.');
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function consultar(selector) {
|
||||
if (typeof selector === 'function') {
|
||||
return;
|
||||
}
|
||||
|
||||
if (selector && selector.atributos) {
|
||||
return selector;
|
||||
}
|
||||
|
||||
if (!controles.has(selector)) {
|
||||
controles.set(selector, crearControl());
|
||||
}
|
||||
|
||||
return controles.get(selector);
|
||||
}
|
||||
|
||||
consultar.extend = Object.assign;
|
||||
consultar.each = function (coleccion, ejecutar) {
|
||||
Object.keys(coleccion).forEach(clave => ejecutar(clave, coleccion[clave]));
|
||||
};
|
||||
consultar.ajax = function (solicitud) {
|
||||
solicitudes.push(solicitud.data.valores);
|
||||
return {
|
||||
done(ejecutar) {
|
||||
ejecutar({
|
||||
success: true,
|
||||
message: 'Guardado'
|
||||
});
|
||||
return this;
|
||||
},
|
||||
fail() {
|
||||
return this;
|
||||
},
|
||||
always(ejecutar) {
|
||||
ejecutar();
|
||||
return this;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class FormularioPrueba {
|
||||
constructor() {
|
||||
this.valores = {};
|
||||
}
|
||||
|
||||
append(clave, valor) {
|
||||
this.valores[clave] = valor;
|
||||
}
|
||||
}
|
||||
|
||||
const entorno = {
|
||||
window: {
|
||||
jQuery: consultar,
|
||||
SIGAlerts: {
|
||||
enqueue(alerta) {
|
||||
alertas.push(alerta);
|
||||
}
|
||||
}
|
||||
},
|
||||
document: {},
|
||||
FormData: FormularioPrueba
|
||||
};
|
||||
let codigo = archivos.readFileSync('SIG.Web/Scripts/fraccionamiento-gis.js', 'utf8');
|
||||
codigo = codigo.replace(' function registrarEventos() {', `
|
||||
interfaz.pruebas = {
|
||||
crear: crearEstado,
|
||||
seleccionar: function (estado) {
|
||||
actual = estado;
|
||||
},
|
||||
guardar: function (estado, soloArchivo) {
|
||||
actual = estado;
|
||||
guardar(estado, soloArchivo);
|
||||
},
|
||||
configurarArchivo: configurarArchivo,
|
||||
configurarGuardado: configurarGuardado,
|
||||
configurarEliminacion: configurarEliminacion,
|
||||
registrarEventos: registrarEventos,
|
||||
mostrarErrorServidor: mostrarErrorServidor
|
||||
};
|
||||
function registrarEventos() {`);
|
||||
entornoVirtual.runInNewContext(codigo, entorno);
|
||||
const pruebas = entorno.window.GisFraccionamiento.pruebas;
|
||||
const estado = pruebas.crear(1);
|
||||
estado.geoJson = { type: 'FeatureCollection' };
|
||||
estado.clavesPoligono = ['id:1', 'id:2', 'id:3'];
|
||||
estado.archivo = { name: 'prueba.gis' };
|
||||
|
||||
pruebas.guardar(estado, true);
|
||||
comprobar.equal(solicitudes.length, 1);
|
||||
comprobar.equal(solicitudes[0].metodo, 'GuardarArchivo');
|
||||
comprobar.equal('vinculos' in solicitudes[0], false);
|
||||
comprobar.equal(estado.tieneArchivoServidor, true);
|
||||
comprobar.equal(alertas[0].type, 5);
|
||||
comprobar.equal(consultar('#LblEtapaGisMensaje').texto, '');
|
||||
|
||||
estado.vinculosPorClavePoligono = { 'id:1': 10 };
|
||||
estado.poligonoPorCveLote = { 10: 'id:1' };
|
||||
estado.tieneCambios = true;
|
||||
pruebas.guardar(estado, false);
|
||||
comprobar.equal(JSON.parse(solicitudes[1].vinculos).length, 1);
|
||||
comprobar.equal('file' in solicitudes[1], false);
|
||||
|
||||
estado.archivo = { name: 'reemplazo.gis' };
|
||||
estado.vinculosPorClavePoligono['id:previo'] = 20;
|
||||
estado.tieneCambios = true;
|
||||
pruebas.guardar(estado, true);
|
||||
comprobar.equal(estado.vinculosPorClavePoligono['id:previo'], 20);
|
||||
comprobar.equal(estado.tieneCambios, true);
|
||||
comprobar.equal('vinculos' in solicitudes[2], false);
|
||||
pruebas.guardar(estado, false);
|
||||
comprobar.equal(JSON.parse(solicitudes[3].vinculos).length, 2);
|
||||
|
||||
estado.vinculosPorClavePoligono = {};
|
||||
estado.tieneCambios = true;
|
||||
pruebas.guardar(estado, false);
|
||||
comprobar.equal(solicitudes[4].vinculos, '[]');
|
||||
|
||||
estado.archivo = { name: 'pendiente.gis' };
|
||||
estado.tieneCambios = true;
|
||||
pruebas.guardar(estado, false);
|
||||
comprobar.equal(solicitudes.length, 5);
|
||||
comprobar.match(consultar('#LblEtapaGisMensaje').texto, /Guarde primero el archivo/);
|
||||
comprobar.equal(estado.requiereActualizarDetalle, true);
|
||||
|
||||
pruebas.mostrarErrorServidor({
|
||||
message: 'Fallo simulado',
|
||||
codigo: 'PRUEBA'
|
||||
});
|
||||
comprobar.equal(alertas[alertas.length - 1].type, 1);
|
||||
comprobar.match(alertas[alertas.length - 1].message, /PRUEBA/);
|
||||
|
||||
for (let repeticion = 0; repeticion < 3; repeticion++) {
|
||||
pruebas.configurarArchivo(estado);
|
||||
pruebas.configurarGuardado(estado);
|
||||
pruebas.configurarEliminacion(estado);
|
||||
pruebas.registrarEventos();
|
||||
}
|
||||
comprobar.equal(consultar('#TxtGisLocal').eventos['adsdropzone:fileadded.sigGis'].length, 1);
|
||||
comprobar.equal(consultar('#BtnGuardarEtapaGis').eventos['click.sigGis'].length, 1);
|
||||
comprobar.equal(consultar('#BtnGuardarVinculosEtapaGis').eventos['click.sigGis'].length, 1);
|
||||
comprobar.equal(consultar('#BtnEliminarEtapaGis').eventos['click.sigGis'].length, 1);
|
||||
comprobar.equal(consultar(entorno.document).eventos['shown.bs.modal.sigGisMain'].length, 1);
|
||||
|
||||
const otraEtapa = pruebas.crear(2);
|
||||
otraEtapa.geoJson = { type: 'FeatureCollection' };
|
||||
otraEtapa.clavesPoligono = ['id:otro'];
|
||||
otraEtapa.archivo = { name: 'otra-etapa.gis' };
|
||||
pruebas.seleccionar(otraEtapa);
|
||||
consultar('#BtnGuardarEtapaGis').eventos['click.sigGis'][0]({
|
||||
preventDefault() {}
|
||||
});
|
||||
comprobar.equal(solicitudes[5].CveFraccionamientoEtapa, 2);
|
||||
|
||||
// Simular que UpdatePanel reemplaza un botón por un nuevo elemento.
|
||||
controles.delete('#BtnGuardarVinculosEtapaGis');
|
||||
pruebas.configurarGuardado(otraEtapa);
|
||||
pruebas.configurarGuardado(otraEtapa);
|
||||
comprobar.equal(consultar('#BtnGuardarVinculosEtapaGis').eventos['click.sigGis'].length, 1);
|
||||
|
||||
// La confirmación debe usar la misma cola y no ejecutar la eliminación al abrirla.
|
||||
consultar('#BtnEliminarEtapaGis').eventos['click.sigGis'][0]({
|
||||
preventDefault() {}
|
||||
});
|
||||
comprobar.equal(alertas[alertas.length - 1].type, 3);
|
||||
comprobar.equal(typeof alertas[alertas.length - 1].acceptCallback, 'function');
|
||||
comprobar.equal(solicitudes.length, 6);
|
||||
|
||||
console.log(
|
||||
'OK: guardados separados y parciales; alertas centrales; inicialización repetida, ' +
|
||||
'reapertura en otra etapa y reemplazo de controles sin duplicar eventos.');
|
||||
287
Entregables/Gis/PruebasServicioGis.cs
Normal file
287
Entregables/Gis/PruebasServicioGis.cs
Normal file
@@ -0,0 +1,287 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.Remoting.Messaging;
|
||||
using System.Runtime.Remoting.Proxies;
|
||||
using SIG.Web.AppCode.Contracts.Bitacora;
|
||||
using SIG.Web.AppCode.Contracts.Documentos;
|
||||
using SIG.Web.AppCode.Contracts.Fraccionamientos;
|
||||
using SIG.Web.AppCode.Models.Bitacora;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.Documentos;
|
||||
using SIG.Web.AppCode.Models.Fraccionamientos;
|
||||
using SIG.Web.AppCode.Services.Fraccionamientos;
|
||||
|
||||
// Usa el servicio compilado real con dependencias simuladas; no conecta a la BD.
|
||||
public sealed class SustitutoGis<T> : RealProxy
|
||||
{
|
||||
private readonly Func<IMethodCallMessage, object> _ejecutar;
|
||||
|
||||
public SustitutoGis(Func<IMethodCallMessage, object> ejecutar)
|
||||
: base(typeof(T))
|
||||
{
|
||||
_ejecutar = ejecutar;
|
||||
}
|
||||
|
||||
public override IMessage Invoke(IMessage mensaje)
|
||||
{
|
||||
var llamada = (IMethodCallMessage)mensaje;
|
||||
try
|
||||
{
|
||||
return new ReturnMessage(
|
||||
_ejecutar(llamada),
|
||||
null,
|
||||
0,
|
||||
llamada.LogicalCallContext,
|
||||
llamada);
|
||||
}
|
||||
catch (Exception excepcion)
|
||||
{
|
||||
return new ReturnMessage(excepcion, llamada);
|
||||
}
|
||||
}
|
||||
|
||||
public T Crear()
|
||||
{
|
||||
return (T)GetTransparentProxy();
|
||||
}
|
||||
}
|
||||
|
||||
public static class PruebasServicioGis
|
||||
{
|
||||
private static byte[] _archivo;
|
||||
private static List<VinculoLoteGisFraccionamiento> _vinculos =
|
||||
new List<VinculoLoteGisFraccionamiento>();
|
||||
private static int _guardadosVinculos;
|
||||
private static int _limpiezas;
|
||||
private static int _escriturasArchivo;
|
||||
private static bool _fallarDocumento;
|
||||
|
||||
private static void Comprobar(bool resultado, string mensaje)
|
||||
{
|
||||
if (!resultado)
|
||||
{
|
||||
throw new Exception(mensaje);
|
||||
}
|
||||
}
|
||||
|
||||
private static VinculoLoteGisFraccionamiento Vinculo(int lote, string clave)
|
||||
{
|
||||
return new VinculoLoteGisFraccionamiento
|
||||
{
|
||||
CveFraccionamientoLote = lote,
|
||||
GISPoligonoClave = clave
|
||||
};
|
||||
}
|
||||
|
||||
public static void Main()
|
||||
{
|
||||
var contexto = new ContextoGisFraccionamiento
|
||||
{
|
||||
CveCliente = 1,
|
||||
CveFraccionamiento = 1,
|
||||
CveFraccionamientoEtapa = 1,
|
||||
Etapa = "Prueba sin BD"
|
||||
};
|
||||
var repositorio = new SustitutoGis<IRepositorioGisFraccionamiento>(llamada =>
|
||||
{
|
||||
switch (llamada.MethodName)
|
||||
{
|
||||
case "ObtenerContexto":
|
||||
return DbResult<ContextoGisFraccionamiento>.Ok(contexto);
|
||||
case "ListarVinculos":
|
||||
return DbResult<List<VinculoLoteGisFraccionamiento>>.Ok(
|
||||
_vinculos
|
||||
.Select(vinculo => Vinculo(
|
||||
vinculo.CveFraccionamientoLote,
|
||||
vinculo.GISPoligonoClave))
|
||||
.ToList());
|
||||
case "GuardarVinculos":
|
||||
_guardadosVinculos++;
|
||||
_vinculos = ((IList<VinculoLoteGisFraccionamiento>)llamada.Args[1]).ToList();
|
||||
return DbResult<bool>.Ok(true);
|
||||
case "LimpiarVinculos":
|
||||
_limpiezas++;
|
||||
_vinculos.Clear();
|
||||
return DbResult<bool>.Ok(true);
|
||||
default:
|
||||
throw new Exception(llamada.MethodName);
|
||||
}
|
||||
}).Crear();
|
||||
var almacen = new SustitutoGis<IAlmacenArchivosGisFraccionamiento>(llamada =>
|
||||
{
|
||||
switch (llamada.MethodName)
|
||||
{
|
||||
case "Existe":
|
||||
return _archivo != null;
|
||||
case "ObtenerRutaFisica":
|
||||
return @"C:\PruebaEnMemoria\gis-1-1.gis";
|
||||
case "Guardar":
|
||||
_escriturasArchivo++;
|
||||
using (var copia = new MemoryStream())
|
||||
{
|
||||
((Stream)llamada.Args[1]).CopyTo(copia);
|
||||
_archivo = copia.ToArray();
|
||||
}
|
||||
return null;
|
||||
case "AbrirLectura":
|
||||
return new MemoryStream(_archivo);
|
||||
case "Eliminar":
|
||||
_archivo = null;
|
||||
return null;
|
||||
default:
|
||||
throw new Exception(llamada.MethodName);
|
||||
}
|
||||
}).Crear();
|
||||
var bitacora = new SustitutoGis<IBitacoraService>(llamada =>
|
||||
{
|
||||
Comprobar(
|
||||
llamada.MethodName == "Registrar",
|
||||
"Llamada inesperada a bitácora.");
|
||||
return DbResult<long>.Ok(1);
|
||||
}).Crear();
|
||||
var documentos = new SustitutoGis<ITramiteDocumentoService>(llamada =>
|
||||
{
|
||||
Comprobar(
|
||||
llamada.MethodName == "RegisterExternalStageFile",
|
||||
"Registro documental inesperado.");
|
||||
return _fallarDocumento
|
||||
? DbResult<TramiteDocumentoSaveResultModel>.Fail("Fallo simulado", "", null)
|
||||
: DbResult<TramiteDocumentoSaveResultModel>.Ok(new TramiteDocumentoSaveResultModel());
|
||||
}).Crear();
|
||||
var servicio = new ServicioGisFraccionamiento(
|
||||
repositorio,
|
||||
almacen,
|
||||
bitacora,
|
||||
documentos);
|
||||
|
||||
var resultado = servicio.Guardar(
|
||||
1,
|
||||
"prueba.gis",
|
||||
new MemoryStream(new byte[] { 1 }),
|
||||
1,
|
||||
null,
|
||||
2,
|
||||
"");
|
||||
Comprobar(
|
||||
resultado.Success && resultado.Data.VinculosGuardados == 0,
|
||||
"Debe guardar sin vínculos.");
|
||||
Comprobar(
|
||||
_guardadosVinculos == 0 && _limpiezas == 0,
|
||||
"Guardar archivo no debe tocar lotes.");
|
||||
|
||||
resultado = servicio.Guardar(
|
||||
1,
|
||||
"",
|
||||
null,
|
||||
0,
|
||||
new List<VinculoLoteGisFraccionamiento>
|
||||
{
|
||||
Vinculo(10, "id:1")
|
||||
},
|
||||
2,
|
||||
"");
|
||||
Comprobar(
|
||||
resultado.Success && _guardadosVinculos == 1,
|
||||
"Debe permitir un vínculo parcial.");
|
||||
Comprobar(
|
||||
_escriturasArchivo == 1,
|
||||
"Vincular no debe escribir el archivo.");
|
||||
|
||||
resultado = servicio.Guardar(
|
||||
1,
|
||||
"otro.gis",
|
||||
new MemoryStream(new byte[] { 2 }),
|
||||
1,
|
||||
null,
|
||||
2,
|
||||
"");
|
||||
Comprobar(
|
||||
resultado.Success && resultado.Data.VinculosGuardados == 1,
|
||||
"Reemplazar conserva vínculos.");
|
||||
Comprobar(
|
||||
_guardadosVinculos == 1 && _limpiezas == 0,
|
||||
"Reemplazar no debe tocar lotes.");
|
||||
|
||||
resultado = servicio.Guardar(
|
||||
1,
|
||||
"",
|
||||
null,
|
||||
0,
|
||||
new List<VinculoLoteGisFraccionamiento>
|
||||
{
|
||||
Vinculo(10, "id:1"),
|
||||
Vinculo(20, "id:2")
|
||||
},
|
||||
2,
|
||||
"");
|
||||
Comprobar(
|
||||
resultado.Success && _vinculos.Count == 2,
|
||||
"Debe permitir continuar vinculando.");
|
||||
resultado = servicio.Guardar(
|
||||
1,
|
||||
"",
|
||||
null,
|
||||
0,
|
||||
new List<VinculoLoteGisFraccionamiento>
|
||||
{
|
||||
Vinculo(10, "id:1"),
|
||||
Vinculo(20, "id:1")
|
||||
},
|
||||
2,
|
||||
"");
|
||||
Comprobar(
|
||||
!resultado.Success && _vinculos.Count == 2,
|
||||
"Debe rechazar polígonos duplicados.");
|
||||
|
||||
_fallarDocumento = true;
|
||||
resultado = servicio.Guardar(
|
||||
1,
|
||||
"fallo.gis",
|
||||
new MemoryStream(new byte[] { 9 }),
|
||||
1,
|
||||
null,
|
||||
2,
|
||||
"");
|
||||
Comprobar(
|
||||
!resultado.Success && _archivo[0] == 2,
|
||||
"Debe restaurar el archivo si falla el registro.");
|
||||
Comprobar(
|
||||
_vinculos.Count == 2,
|
||||
"Un fallo de archivo no debe alterar los vínculos.");
|
||||
|
||||
resultado = servicio.Guardar(
|
||||
1,
|
||||
"",
|
||||
null,
|
||||
0,
|
||||
new List<VinculoLoteGisFraccionamiento>(),
|
||||
2,
|
||||
"");
|
||||
Comprobar(
|
||||
resultado.Success && _limpiezas == 1 && _vinculos.Count == 0,
|
||||
"Debe guardar la desvinculación explícita.");
|
||||
Comprobar(
|
||||
_archivo[0] == 2,
|
||||
"Desvincular conserva el archivo.");
|
||||
_archivo = null;
|
||||
resultado = servicio.Guardar(
|
||||
1,
|
||||
"",
|
||||
null,
|
||||
0,
|
||||
new List<VinculoLoteGisFraccionamiento>
|
||||
{
|
||||
Vinculo(10, "id:1")
|
||||
},
|
||||
2,
|
||||
"");
|
||||
Comprobar(
|
||||
!resultado.Success,
|
||||
"No debe vincular sin archivo guardado.");
|
||||
Console.WriteLine(
|
||||
"OK: archivo sin lotes, vínculos parciales sucesivos, conservación, " +
|
||||
"duplicados, restauración y desvinculación.");
|
||||
}
|
||||
}
|
||||
159
Fraccionamientos_AltaConEtapas.sql
Normal file
159
Fraccionamientos_AltaConEtapas.sql
Normal file
@@ -0,0 +1,159 @@
|
||||
-- Ejecutar en la base de datos de la plataforma.
|
||||
-- Respeta el fideicomiso capturado; hereda la última etapa sólo cuando se omite.
|
||||
-- Actualiza únicamente el procedimiento, sin modificar datos existentes.
|
||||
|
||||
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_EtapaSave]
|
||||
@CveFraccionamientoEtapa int = NULL,
|
||||
@CveFraccionamiento int,
|
||||
@Etapa varchar(150),
|
||||
@Hectareas decimal(18,4) = NULL,
|
||||
@Orden int = 0,
|
||||
@EsActivo bit = 1,
|
||||
@CveUsuarioEjecuta int,
|
||||
@ErrorMostrar varchar(max) OUTPUT,
|
||||
@ErrorTipo int OUTPUT,
|
||||
@Return bit OUTPUT,
|
||||
@Fideicomiso bit = NULL
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
|
||||
|
||||
BEGIN TRY
|
||||
DECLARE @EsSuperUsuario bit = 0;
|
||||
|
||||
SELECT @EsSuperUsuario = CASE
|
||||
WHEN R.NombreRol = 'SuperUsuario' THEN 1
|
||||
ELSE 0
|
||||
END
|
||||
FROM dbo.Sis_Usuarios AS U
|
||||
INNER JOIN dbo.Sis_Roles AS R
|
||||
ON R.CveRol = U.CveRol
|
||||
WHERE U.CveUsuario = @CveUsuarioEjecuta
|
||||
AND U.Activo = 1;
|
||||
|
||||
IF NULLIF(LTRIM(RTRIM(@Etapa)), '') IS NULL
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Capture el nombre de la etapa.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF @Hectareas IS NOT NULL AND @Hectareas < 0
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Las hectáreas de la etapa no pueden ser negativas.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Fraccionamientos AS F
|
||||
WHERE F.CveFraccionamiento = @CveFraccionamiento
|
||||
AND
|
||||
(
|
||||
@EsSuperUsuario = 1
|
||||
OR EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Sis_UsuariosClientes AS UC
|
||||
WHERE UC.CveUsuario = @CveUsuarioEjecuta
|
||||
AND UC.CveCliente = F.CveCliente
|
||||
AND UC.Activo = 1
|
||||
)
|
||||
)
|
||||
)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'El fraccionamiento no existe o no está asignado al usuario.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF @CveFraccionamientoEtapa IS NOT NULL
|
||||
AND NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.FraccionamientosEtapas
|
||||
WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa
|
||||
AND CveFraccionamiento = @CveFraccionamiento
|
||||
)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'La etapa no existe o no pertenece al fraccionamiento.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.FraccionamientosEtapas
|
||||
WHERE CveFraccionamiento = @CveFraccionamiento
|
||||
AND Etapa = LTRIM(RTRIM(@Etapa))
|
||||
AND
|
||||
(
|
||||
@CveFraccionamientoEtapa IS NULL
|
||||
OR CveFraccionamientoEtapa <> @CveFraccionamientoEtapa
|
||||
)
|
||||
)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Ya existe una etapa con ese nombre en el fraccionamiento.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF @CveFraccionamientoEtapa IS NULL
|
||||
BEGIN
|
||||
DECLARE @OrdenNuevo int;
|
||||
|
||||
SELECT @OrdenNuevo = ISNULL(MAX(Orden), 0) + 1
|
||||
FROM dbo.FraccionamientosEtapas WITH (UPDLOCK, HOLDLOCK)
|
||||
WHERE CveFraccionamiento = @CveFraccionamiento;
|
||||
|
||||
IF @Fideicomiso IS NULL
|
||||
BEGIN
|
||||
SET @Fideicomiso = 0;
|
||||
SELECT TOP (1) @Fideicomiso = Fideicomiso
|
||||
FROM dbo.FraccionamientosEtapas WITH (UPDLOCK, HOLDLOCK)
|
||||
WHERE CveFraccionamiento = @CveFraccionamiento
|
||||
ORDER BY CveFraccionamientoEtapa DESC;
|
||||
END;
|
||||
|
||||
INSERT INTO dbo.FraccionamientosEtapas
|
||||
(CveFraccionamiento, Etapa, Hectareas, Orden, EsActivo, CveUsuario, Fideicomiso)
|
||||
VALUES
|
||||
(@CveFraccionamiento, LTRIM(RTRIM(@Etapa)), @Hectareas, @OrdenNuevo, @EsActivo, @CveUsuarioEjecuta, ISNULL(@Fideicomiso, 0));
|
||||
|
||||
SET @CveFraccionamientoEtapa = CONVERT(int, SCOPE_IDENTITY());
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
UPDATE dbo.FraccionamientosEtapas
|
||||
SET Etapa = LTRIM(RTRIM(@Etapa)),
|
||||
Hectareas = @Hectareas,
|
||||
EsActivo = @EsActivo,
|
||||
Fideicomiso = ISNULL(@Fideicomiso, Fideicomiso),
|
||||
FechaModificacion = GETDATE(),
|
||||
CveUsuario = @CveUsuarioEjecuta
|
||||
WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa;
|
||||
END;
|
||||
|
||||
SELECT @CveFraccionamientoEtapa AS CveFraccionamientoEtapa;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'Ocurrió un error al guardar 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_EtapaSave'),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE()
|
||||
);
|
||||
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
815
Fraccionamientos_Etapas_TiposVivienda.sql
Normal file
815
Fraccionamientos_Etapas_TiposVivienda.sql
Normal file
@@ -0,0 +1,815 @@
|
||||
-- Migración preparada para revisión. Ejecutar sólo con autorización de instalación.
|
||||
-- La aplicación coordina las transacciones y registra la bitácora.
|
||||
IF COL_LENGTH('dbo.FraccionamientosEtapas', 'Fideicomiso') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE dbo.FraccionamientosEtapas
|
||||
ADD Fideicomiso bit NOT NULL CONSTRAINT DF_Etapas_Fideicomiso DEFAULT (0);
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID('dbo.FraccionamientosTiposVivienda', 'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE dbo.FraccionamientosTiposVivienda
|
||||
(
|
||||
CveTipoVivienda int IDENTITY(1,1) NOT NULL CONSTRAINT PK_FraccionamientosTiposVivienda PRIMARY KEY,
|
||||
TipoVivienda varchar(100) COLLATE Modern_Spanish_CS_AS NOT NULL,
|
||||
CONSTRAINT UQ_FraccionamientosTiposVivienda UNIQUE (TipoVivienda)
|
||||
);
|
||||
END;
|
||||
GO
|
||||
|
||||
INSERT INTO dbo.FraccionamientosTiposVivienda (TipoVivienda)
|
||||
SELECT T.TipoVivienda
|
||||
FROM (VALUES ('Económica'), ('Interés social'), ('Medio Económica'), ('Residencial')) AS T(TipoVivienda)
|
||||
WHERE NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM dbo.FraccionamientosTiposVivienda AS V
|
||||
WHERE V.TipoVivienda = T.TipoVivienda COLLATE Modern_Spanish_CS_AS
|
||||
);
|
||||
GO
|
||||
|
||||
IF OBJECT_ID('dbo.FraccionamientosEtapasTiposVivienda', 'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE dbo.FraccionamientosEtapasTiposVivienda
|
||||
(
|
||||
CveEtapaTipoVivienda int IDENTITY(1,1) NOT NULL CONSTRAINT PK_EtapasTiposVivienda PRIMARY KEY,
|
||||
CveFraccionamientoEtapa int NOT NULL,
|
||||
CveTipoVivienda int NOT NULL,
|
||||
Cantidad int NOT NULL,
|
||||
CONSTRAINT CK_EtapasTiposVivienda_Cantidad CHECK (Cantidad > 0),
|
||||
CONSTRAINT UQ_EtapasTiposVivienda UNIQUE (CveFraccionamientoEtapa, CveTipoVivienda),
|
||||
CONSTRAINT FK_EtapasTiposVivienda_Etapa FOREIGN KEY (CveFraccionamientoEtapa)
|
||||
REFERENCES dbo.FraccionamientosEtapas (CveFraccionamientoEtapa),
|
||||
CONSTRAINT FK_EtapasTiposVivienda_Tipo FOREIGN KEY (CveTipoVivienda)
|
||||
REFERENCES dbo.FraccionamientosTiposVivienda (CveTipoVivienda)
|
||||
);
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID('dbo.FraccionamientosEtapasTiposViviendaLotes', 'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE dbo.FraccionamientosEtapasTiposViviendaLotes
|
||||
(
|
||||
CveEtapaTipoViviendaLote int IDENTITY(1,1) NOT NULL CONSTRAINT PK_EtapasTiposViviendaLotes PRIMARY KEY,
|
||||
CveEtapaTipoVivienda int NOT NULL,
|
||||
CveFraccionamientoLote int NOT NULL,
|
||||
CONSTRAINT UQ_EtapasTiposViviendaLotes UNIQUE (CveFraccionamientoLote),
|
||||
CONSTRAINT FK_EtapasTiposViviendaLotes_Tipo FOREIGN KEY (CveEtapaTipoVivienda)
|
||||
REFERENCES dbo.FraccionamientosEtapasTiposVivienda (CveEtapaTipoVivienda),
|
||||
CONSTRAINT FK_EtapasTiposViviendaLotes_Lote FOREIGN KEY (CveFraccionamientoLote)
|
||||
REFERENCES dbo.FraccionamientosLotes (CveFraccionamientoLote)
|
||||
);
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_EtapaGet]
|
||||
@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 @EsSuperUsuario bit = 0;
|
||||
|
||||
SELECT @EsSuperUsuario = CASE
|
||||
WHEN R.NombreRol = 'SuperUsuario' THEN 1
|
||||
ELSE 0
|
||||
END
|
||||
FROM dbo.Sis_Usuarios AS U
|
||||
INNER JOIN dbo.Sis_Roles AS R
|
||||
ON R.CveRol = U.CveRol
|
||||
WHERE U.CveUsuario = @CveUsuarioEjecuta
|
||||
AND U.Activo = 1;
|
||||
|
||||
SELECT
|
||||
E.CveFraccionamientoEtapa,
|
||||
E.CveFraccionamiento,
|
||||
F.CveCliente,
|
||||
E.Etapa,
|
||||
E.Hectareas,
|
||||
E.Orden,
|
||||
E.Avance,
|
||||
E.Fideicomiso,
|
||||
E.EsActivo
|
||||
FROM dbo.FraccionamientosEtapas AS E
|
||||
INNER JOIN dbo.Fraccionamientos AS F
|
||||
ON F.CveFraccionamiento = E.CveFraccionamiento
|
||||
WHERE E.CveFraccionamientoEtapa = @CveFraccionamientoEtapa
|
||||
AND
|
||||
(
|
||||
@EsSuperUsuario = 1
|
||||
OR EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Sis_UsuariosClientes AS UC
|
||||
WHERE UC.CveUsuario = @CveUsuarioEjecuta
|
||||
AND UC.CveCliente = F.CveCliente
|
||||
AND UC.Activo = 1
|
||||
)
|
||||
);
|
||||
|
||||
IF @@ROWCOUNT = 0
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'La etapa no existe o no está asignada al usuario.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'Ocurrió un error al consultar 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_EtapaGet'),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE()
|
||||
);
|
||||
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_EtapaList]
|
||||
@CveFraccionamiento 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 @EsSuperUsuario bit = 0;
|
||||
|
||||
SELECT @EsSuperUsuario = CASE
|
||||
WHEN R.NombreRol = 'SuperUsuario' THEN 1
|
||||
ELSE 0
|
||||
END
|
||||
FROM dbo.Sis_Usuarios AS U
|
||||
INNER JOIN dbo.Sis_Roles AS R
|
||||
ON R.CveRol = U.CveRol
|
||||
WHERE U.CveUsuario = @CveUsuarioEjecuta
|
||||
AND U.Activo = 1;
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Fraccionamientos AS F
|
||||
WHERE F.CveFraccionamiento = @CveFraccionamiento
|
||||
AND
|
||||
(
|
||||
@EsSuperUsuario = 1
|
||||
OR EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Sis_UsuariosClientes AS UC
|
||||
WHERE UC.CveUsuario = @CveUsuarioEjecuta
|
||||
AND UC.CveCliente = F.CveCliente
|
||||
AND UC.Activo = 1
|
||||
)
|
||||
)
|
||||
)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'El fraccionamiento no existe o no está asignado al usuario.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
SELECT
|
||||
E.CveFraccionamientoEtapa,
|
||||
E.CveFraccionamiento,
|
||||
E.Etapa,
|
||||
E.Hectareas,
|
||||
E.Orden,
|
||||
E.Avance,
|
||||
E.Fideicomiso,
|
||||
E.EsActivo
|
||||
FROM dbo.FraccionamientosEtapas AS E
|
||||
WHERE E.CveFraccionamiento = @CveFraccionamiento
|
||||
ORDER BY E.Orden, E.Etapa;
|
||||
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'Ocurrió un error al consultar las etapas; 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_EtapaList'),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE()
|
||||
);
|
||||
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
CREATE OR ALTER PROCEDURE [dbo].[PA_Fraccionamientos_EtapaSave]
|
||||
@CveFraccionamientoEtapa int = NULL,
|
||||
@CveFraccionamiento int,
|
||||
@Etapa varchar(150),
|
||||
@Hectareas decimal(18,4) = NULL,
|
||||
@Orden int = 0,
|
||||
@EsActivo bit = 1,
|
||||
@CveUsuarioEjecuta int,
|
||||
@ErrorMostrar varchar(max) OUTPUT,
|
||||
@ErrorTipo int OUTPUT,
|
||||
@Return bit OUTPUT,
|
||||
@Fideicomiso bit = NULL
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
|
||||
|
||||
BEGIN TRY
|
||||
DECLARE @EsSuperUsuario bit = 0;
|
||||
|
||||
SELECT @EsSuperUsuario = CASE
|
||||
WHEN R.NombreRol = 'SuperUsuario' THEN 1
|
||||
ELSE 0
|
||||
END
|
||||
FROM dbo.Sis_Usuarios AS U
|
||||
INNER JOIN dbo.Sis_Roles AS R
|
||||
ON R.CveRol = U.CveRol
|
||||
WHERE U.CveUsuario = @CveUsuarioEjecuta
|
||||
AND U.Activo = 1;
|
||||
|
||||
IF NULLIF(LTRIM(RTRIM(@Etapa)), '') IS NULL
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Capture el nombre de la etapa.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF @Hectareas IS NOT NULL AND @Hectareas < 0
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Las hectáreas de la etapa no pueden ser negativas.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Fraccionamientos AS F
|
||||
WHERE F.CveFraccionamiento = @CveFraccionamiento
|
||||
AND
|
||||
(
|
||||
@EsSuperUsuario = 1
|
||||
OR EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Sis_UsuariosClientes AS UC
|
||||
WHERE UC.CveUsuario = @CveUsuarioEjecuta
|
||||
AND UC.CveCliente = F.CveCliente
|
||||
AND UC.Activo = 1
|
||||
)
|
||||
)
|
||||
)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'El fraccionamiento no existe o no está asignado al usuario.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF @CveFraccionamientoEtapa IS NOT NULL
|
||||
AND NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.FraccionamientosEtapas
|
||||
WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa
|
||||
AND CveFraccionamiento = @CveFraccionamiento
|
||||
)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'La etapa no existe o no pertenece al fraccionamiento.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.FraccionamientosEtapas
|
||||
WHERE CveFraccionamiento = @CveFraccionamiento
|
||||
AND Etapa = LTRIM(RTRIM(@Etapa))
|
||||
AND
|
||||
(
|
||||
@CveFraccionamientoEtapa IS NULL
|
||||
OR CveFraccionamientoEtapa <> @CveFraccionamientoEtapa
|
||||
)
|
||||
)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Ya existe una etapa con ese nombre en el fraccionamiento.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF @CveFraccionamientoEtapa IS NULL
|
||||
BEGIN
|
||||
DECLARE @OrdenNuevo int;
|
||||
|
||||
SELECT @OrdenNuevo = ISNULL(MAX(Orden), 0) + 1
|
||||
FROM dbo.FraccionamientosEtapas WITH (UPDLOCK, HOLDLOCK)
|
||||
WHERE CveFraccionamiento = @CveFraccionamiento;
|
||||
|
||||
IF @Fideicomiso IS NULL
|
||||
BEGIN
|
||||
SET @Fideicomiso = 0;
|
||||
SELECT TOP (1) @Fideicomiso = Fideicomiso
|
||||
FROM dbo.FraccionamientosEtapas WITH (UPDLOCK, HOLDLOCK)
|
||||
WHERE CveFraccionamiento = @CveFraccionamiento
|
||||
ORDER BY CveFraccionamientoEtapa DESC;
|
||||
END;
|
||||
|
||||
INSERT INTO dbo.FraccionamientosEtapas
|
||||
(CveFraccionamiento, Etapa, Hectareas, Orden, EsActivo, CveUsuario, Fideicomiso)
|
||||
VALUES
|
||||
(@CveFraccionamiento, LTRIM(RTRIM(@Etapa)), @Hectareas, @OrdenNuevo, @EsActivo, @CveUsuarioEjecuta, ISNULL(@Fideicomiso, 0));
|
||||
|
||||
SET @CveFraccionamientoEtapa = CONVERT(int, SCOPE_IDENTITY());
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
UPDATE dbo.FraccionamientosEtapas
|
||||
SET Etapa = LTRIM(RTRIM(@Etapa)),
|
||||
Hectareas = @Hectareas,
|
||||
EsActivo = @EsActivo,
|
||||
Fideicomiso = ISNULL(@Fideicomiso, Fideicomiso),
|
||||
FechaModificacion = GETDATE(),
|
||||
CveUsuario = @CveUsuarioEjecuta
|
||||
WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa;
|
||||
END;
|
||||
|
||||
SELECT @CveFraccionamientoEtapa AS CveFraccionamientoEtapa;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'Ocurrió un error al guardar 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_EtapaSave'),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE()
|
||||
);
|
||||
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Fraccionamientos_TipoViviendaList
|
||||
@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
|
||||
SELECT CveTipoVivienda, TipoVivienda
|
||||
FROM dbo.FraccionamientosTiposVivienda
|
||||
ORDER BY CveTipoVivienda;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'No fue posible procesar los tipos de vivienda; contacte a Sistemas.';
|
||||
SET @ErrorTipo = 1;
|
||||
SET @Return = 0;
|
||||
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
|
||||
'Número: ', ERROR_NUMBER(),
|
||||
'; Procedimiento: ', ERROR_PROCEDURE(),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE());
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Fraccionamientos_EtapaTipoViviendaList
|
||||
@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
|
||||
SELECT
|
||||
T.CveEtapaTipoVivienda,
|
||||
T.CveFraccionamientoEtapa,
|
||||
T.CveTipoVivienda,
|
||||
V.TipoVivienda,
|
||||
T.Cantidad,
|
||||
(SELECT COUNT(*) FROM dbo.FraccionamientosEtapasTiposViviendaLotes AS L
|
||||
WHERE L.CveEtapaTipoVivienda = T.CveEtapaTipoVivienda) AS LotesVinculados
|
||||
FROM dbo.FraccionamientosEtapasTiposVivienda AS T
|
||||
INNER JOIN dbo.FraccionamientosTiposVivienda AS V ON V.CveTipoVivienda = T.CveTipoVivienda
|
||||
WHERE T.CveFraccionamientoEtapa = @CveFraccionamientoEtapa
|
||||
ORDER BY V.CveTipoVivienda;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'No fue posible procesar los tipos de vivienda; contacte a Sistemas.';
|
||||
SET @ErrorTipo = 1;
|
||||
SET @Return = 0;
|
||||
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
|
||||
'Número: ', ERROR_NUMBER(),
|
||||
'; Procedimiento: ', ERROR_PROCEDURE(),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE());
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Fraccionamientos_EtapaTipoViviendaSave
|
||||
@CveFraccionamientoEtapa int,
|
||||
@CveTipoVivienda int,
|
||||
@Cantidad 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
|
||||
IF @Cantidad <= 0
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Capture una cantidad mayor que cero.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
DECLARE @CveEtapaTipoVivienda int;
|
||||
SELECT @CveEtapaTipoVivienda = CveEtapaTipoVivienda
|
||||
FROM dbo.FraccionamientosEtapasTiposVivienda WITH (UPDLOCK, HOLDLOCK)
|
||||
WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa
|
||||
AND CveTipoVivienda = @CveTipoVivienda;
|
||||
|
||||
IF @Cantidad < (SELECT COUNT(*) FROM dbo.FraccionamientosEtapasTiposViviendaLotes
|
||||
WHERE CveEtapaTipoVivienda = @CveEtapaTipoVivienda)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'La cantidad no puede ser menor que los lotes vinculados.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF @CveEtapaTipoVivienda IS NULL
|
||||
BEGIN
|
||||
INSERT INTO dbo.FraccionamientosEtapasTiposVivienda
|
||||
(CveFraccionamientoEtapa, CveTipoVivienda, Cantidad)
|
||||
VALUES
|
||||
(@CveFraccionamientoEtapa, @CveTipoVivienda, @Cantidad);
|
||||
SET @CveEtapaTipoVivienda = CONVERT(int, SCOPE_IDENTITY());
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
UPDATE dbo.FraccionamientosEtapasTiposVivienda
|
||||
SET Cantidad = @Cantidad
|
||||
WHERE CveEtapaTipoVivienda = @CveEtapaTipoVivienda;
|
||||
END;
|
||||
|
||||
SELECT @CveEtapaTipoVivienda AS CveEtapaTipoVivienda;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'No fue posible procesar los tipos de vivienda; contacte a Sistemas.';
|
||||
SET @ErrorTipo = 1;
|
||||
SET @Return = 0;
|
||||
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
|
||||
'Número: ', ERROR_NUMBER(),
|
||||
'; Procedimiento: ', ERROR_PROCEDURE(),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE());
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Fraccionamientos_EtapaTipoViviendaDelete
|
||||
@CveFraccionamientoEtapa int,
|
||||
@CveEtapaTipoVivienda 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
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1 FROM dbo.FraccionamientosEtapasTiposViviendaLotes
|
||||
WHERE CveEtapaTipoVivienda = @CveEtapaTipoVivienda
|
||||
)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Retire los vínculos con lotes antes de eliminar este registro.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
DELETE FROM dbo.FraccionamientosEtapasTiposVivienda
|
||||
WHERE CveEtapaTipoVivienda = @CveEtapaTipoVivienda
|
||||
AND CveFraccionamientoEtapa = @CveFraccionamientoEtapa;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'No fue posible procesar los tipos de vivienda; contacte a Sistemas.';
|
||||
SET @ErrorTipo = 1;
|
||||
SET @Return = 0;
|
||||
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
|
||||
'Número: ', ERROR_NUMBER(),
|
||||
'; Procedimiento: ', ERROR_PROCEDURE(),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE());
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Fraccionamientos_EtapaTipoViviendaLoteList
|
||||
@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
|
||||
SELECT
|
||||
V.CveEtapaTipoViviendaLote,
|
||||
V.CveEtapaTipoVivienda,
|
||||
T.CveFraccionamientoEtapa,
|
||||
V.CveFraccionamientoLote,
|
||||
L.Numero AS Lote,
|
||||
C.TipoVivienda
|
||||
FROM dbo.FraccionamientosEtapasTiposViviendaLotes AS V
|
||||
INNER JOIN dbo.FraccionamientosEtapasTiposVivienda AS T ON T.CveEtapaTipoVivienda = V.CveEtapaTipoVivienda
|
||||
INNER JOIN dbo.FraccionamientosTiposVivienda AS C ON C.CveTipoVivienda = T.CveTipoVivienda
|
||||
INNER JOIN dbo.FraccionamientosLotes AS L ON L.CveFraccionamientoLote = V.CveFraccionamientoLote
|
||||
WHERE T.CveFraccionamientoEtapa = @CveFraccionamientoEtapa
|
||||
ORDER BY C.CveTipoVivienda, L.Numero;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'No fue posible procesar los tipos de vivienda; contacte a Sistemas.';
|
||||
SET @ErrorTipo = 1;
|
||||
SET @Return = 0;
|
||||
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
|
||||
'Número: ', ERROR_NUMBER(),
|
||||
'; Procedimiento: ', ERROR_PROCEDURE(),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE());
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Fraccionamientos_EtapaTipoViviendaLoteSave
|
||||
@CveFraccionamientoEtapa int,
|
||||
@CveEtapaTipoVivienda int,
|
||||
@CveFraccionamientoLote 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 @Cantidad int;
|
||||
SELECT @Cantidad = Cantidad
|
||||
FROM dbo.FraccionamientosEtapasTiposVivienda WITH (UPDLOCK, HOLDLOCK)
|
||||
WHERE CveEtapaTipoVivienda = @CveEtapaTipoVivienda
|
||||
AND CveFraccionamientoEtapa = @CveFraccionamientoEtapa;
|
||||
|
||||
IF @Cantidad IS NULL OR NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM dbo.FraccionamientosLotes
|
||||
WHERE CveFraccionamientoLote = @CveFraccionamientoLote
|
||||
AND CveFraccionamientoEtapa = @CveFraccionamientoEtapa
|
||||
AND EsActivo = 1
|
||||
)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Seleccione un tipo registrado y un lote activo de la misma etapa.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1 FROM dbo.FraccionamientosEtapasTiposViviendaLotes WITH (UPDLOCK, HOLDLOCK)
|
||||
WHERE CveFraccionamientoLote = @CveFraccionamientoLote
|
||||
)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'El lote ya tiene una clasificación vinculada.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF @Cantidad <= (SELECT COUNT(*) FROM dbo.FraccionamientosEtapasTiposViviendaLotes
|
||||
WHERE CveEtapaTipoVivienda = @CveEtapaTipoVivienda)
|
||||
BEGIN
|
||||
SET @ErrorMostrar = 'Ya se vinculó la cantidad capturada para este tipo.';
|
||||
SET @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
INSERT INTO dbo.FraccionamientosEtapasTiposViviendaLotes
|
||||
(CveEtapaTipoVivienda, CveFraccionamientoLote)
|
||||
VALUES
|
||||
(@CveEtapaTipoVivienda, @CveFraccionamientoLote);
|
||||
SELECT CONVERT(int, SCOPE_IDENTITY()) AS CveEtapaTipoViviendaLote;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'No fue posible procesar los tipos de vivienda; contacte a Sistemas.';
|
||||
SET @ErrorTipo = 1;
|
||||
SET @Return = 0;
|
||||
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
|
||||
'Número: ', ERROR_NUMBER(),
|
||||
'; Procedimiento: ', ERROR_PROCEDURE(),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE());
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Fraccionamientos_EtapaTipoViviendaLoteDelete
|
||||
@CveFraccionamientoEtapa int,
|
||||
@CveEtapaTipoViviendaLote 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
|
||||
DELETE V
|
||||
FROM dbo.FraccionamientosEtapasTiposViviendaLotes AS V
|
||||
INNER JOIN dbo.FraccionamientosEtapasTiposVivienda AS T ON T.CveEtapaTipoVivienda = V.CveEtapaTipoVivienda
|
||||
WHERE V.CveEtapaTipoViviendaLote = @CveEtapaTipoViviendaLote
|
||||
AND T.CveFraccionamientoEtapa = @CveFraccionamientoEtapa;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'No fue posible procesar los tipos de vivienda; contacte a Sistemas.';
|
||||
SET @ErrorTipo = 1;
|
||||
SET @Return = 0;
|
||||
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
|
||||
'Número: ', ERROR_NUMBER(),
|
||||
'; Procedimiento: ', ERROR_PROCEDURE(),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE());
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
-- Catálogo de campos auditables para registros y vínculos nuevos.
|
||||
DECLARE @Tablas TABLE
|
||||
(
|
||||
Nombre varchar(128) COLLATE Modern_Spanish_CS_AS,
|
||||
Llave varchar(128) COLLATE Modern_Spanish_CS_AS
|
||||
);
|
||||
INSERT INTO @Tablas (Nombre, Llave)
|
||||
VALUES
|
||||
('FraccionamientosEtapasTiposVivienda', 'CveEtapaTipoVivienda'),
|
||||
('FraccionamientosEtapasTiposViviendaLotes', 'CveEtapaTipoViviendaLote');
|
||||
|
||||
INSERT INTO dbo.Bit_Tablas
|
||||
(NombreTablaSQL, NombreMostrar, NombreCampoLlaveSQL, Activo, FechaAlta)
|
||||
SELECT T.Nombre, T.Nombre, T.Llave, 1, GETDATE()
|
||||
FROM @Tablas AS T
|
||||
WHERE NOT EXISTS (SELECT 1 FROM dbo.Bit_Tablas AS B WHERE B.NombreTablaSQL = T.Nombre);
|
||||
|
||||
INSERT INTO dbo.Bit_Campos
|
||||
(CveTabla, NombreCampoSQL, NombreMostrar, TipoDatoSQL, MostrarEnBitacora, Activo, FechaAlta)
|
||||
SELECT B.CveTabla, C.name, C.name, TYPE_NAME(C.user_type_id), 1, 1, GETDATE()
|
||||
FROM dbo.Bit_Tablas AS B
|
||||
INNER JOIN sys.columns AS C ON C.object_id = OBJECT_ID('dbo.' + B.NombreTablaSQL)
|
||||
WHERE
|
||||
(B.NombreTablaSQL IN ('FraccionamientosEtapasTiposVivienda', 'FraccionamientosEtapasTiposViviendaLotes')
|
||||
OR (B.NombreTablaSQL = 'FraccionamientosEtapas' AND C.name = 'Fideicomiso'))
|
||||
AND NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM dbo.Bit_Campos AS E
|
||||
WHERE E.CveTabla = B.CveTabla AND E.NombreCampoSQL = C.name
|
||||
);
|
||||
|
||||
DECLARE @Acciones TABLE (Codigo varchar(150) COLLATE Modern_Spanish_CI_AS);
|
||||
INSERT INTO @Acciones (Codigo)
|
||||
VALUES
|
||||
('GuardarTipoViviendaEtapa'),
|
||||
('EliminarTipoViviendaEtapa'),
|
||||
('VincularLoteTipoViviendaEtapa'),
|
||||
('DesvincularLoteTipoViviendaEtapa');
|
||||
|
||||
INSERT INTO dbo.Bit_DefinicionesAccion
|
||||
(CodigoAccion, NombreAccion, DescripcionAccion, CveTabla, CveTipoMovimiento, Activo)
|
||||
SELECT Codigo, Codigo, Codigo, NULL, NULL, 1
|
||||
FROM @Acciones AS A
|
||||
WHERE NOT EXISTS (SELECT 1 FROM dbo.Bit_DefinicionesAccion AS D WHERE D.CodigoAccion = A.Codigo);
|
||||
GO
|
||||
|
||||
-- Detalle de etapa: hereda los permisos del detalle de desarrollador.
|
||||
DECLARE @CvePadre int;
|
||||
DECLARE @CvePlataforma int;
|
||||
SELECT @CvePadre = CveModulo, @CvePlataforma = CvePlataforma
|
||||
FROM dbo.Sis_Modulos
|
||||
WHERE Url = '~/Pages/Desarrolladores/DesarrolladorDetalle.aspx';
|
||||
|
||||
IF @CvePadre IS NULL
|
||||
BEGIN
|
||||
THROW 51001, 'No existe el módulo Detalle de desarrollador.', 1;
|
||||
END;
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM dbo.Sis_Modulos WHERE Url = '~/Pages/Fraccionamientos/EtapaDetalle.aspx')
|
||||
BEGIN
|
||||
INSERT INTO dbo.Sis_Modulos
|
||||
(CveModuloPadre, CvePlataforma, NombreModulo, Url,
|
||||
ClaseCssIcono, OrdenVisualizacion, Visible, Activo, FechaCreacion)
|
||||
VALUES
|
||||
(@CvePadre, @CvePlataforma, 'Detalle de etapa', '~/Pages/Fraccionamientos/EtapaDetalle.aspx',
|
||||
'fa fa-building', 1, 0, 1, GETDATE());
|
||||
END;
|
||||
|
||||
INSERT INTO dbo.Sis_RolesModulos
|
||||
(CveRol, CveModulo, PuedeVer, PuedeCrear, PuedeModificar,
|
||||
PuedeEliminar, PuedeImprimir, PuedeExportar, FechaCreacion)
|
||||
SELECT
|
||||
R.CveRol, D.CveModulo, R.PuedeVer, R.PuedeCrear, R.PuedeModificar,
|
||||
R.PuedeEliminar, R.PuedeImprimir, R.PuedeExportar, GETDATE()
|
||||
FROM dbo.Sis_RolesModulos AS R
|
||||
INNER JOIN dbo.Sis_Modulos AS D ON D.Url = '~/Pages/Fraccionamientos/EtapaDetalle.aspx'
|
||||
WHERE R.CveModulo = @CvePadre
|
||||
AND NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM dbo.Sis_RolesModulos AS E
|
||||
WHERE E.CveRol = R.CveRol AND E.CveModulo = D.CveModulo
|
||||
);
|
||||
GO
|
||||
136
Fraccionamientos_ListadoAgrupado.sql
Normal file
136
Fraccionamientos_ListadoAgrupado.sql
Normal file
@@ -0,0 +1,136 @@
|
||||
-- Listado conjunto de fraccionamientos activos y todas sus etapas por desarrollador.
|
||||
-- Conserva el alcance por usuario del listado de fraccionamientos existente.
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Fraccionamientos_DesarrolladorEtapasList
|
||||
@CveCliente 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 @EsSuperUsuario bit = 0;
|
||||
|
||||
SELECT @EsSuperUsuario = CASE
|
||||
WHEN R.NombreRol = 'SuperUsuario' THEN 1
|
||||
ELSE 0
|
||||
END
|
||||
FROM dbo.Sis_Usuarios AS U
|
||||
INNER JOIN dbo.Sis_Roles AS R ON R.CveRol = U.CveRol
|
||||
WHERE U.CveUsuario = @CveUsuarioEjecuta
|
||||
AND U.Activo = 1;
|
||||
|
||||
;WITH FraccionamientosCliente AS
|
||||
(
|
||||
SELECT
|
||||
F.CveFraccionamiento,
|
||||
F.Fraccionamiento,
|
||||
F.Ubicacion,
|
||||
F.Hectareas AS HectareasFraccionamiento,
|
||||
COALESCE(FE.Estatus, 'Estatus no disponible') AS Estatus
|
||||
FROM dbo.Fraccionamientos AS F
|
||||
LEFT JOIN dbo.Fraccionamientos_Estatus AS FE ON FE.CveEstatus = F.CveEstatus
|
||||
WHERE F.CveCliente = @CveCliente
|
||||
AND F.EsActivo = 1
|
||||
AND
|
||||
(
|
||||
@EsSuperUsuario = 1
|
||||
OR EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Sis_UsuariosClientes AS UC
|
||||
WHERE UC.CveUsuario = @CveUsuarioEjecuta
|
||||
AND UC.CveCliente = F.CveCliente
|
||||
AND UC.Activo = 1
|
||||
)
|
||||
)
|
||||
),
|
||||
Filas AS
|
||||
(
|
||||
SELECT
|
||||
F.CveFraccionamiento,
|
||||
CAST(NULL AS int) AS CveFraccionamientoEtapa,
|
||||
F.Fraccionamiento,
|
||||
F.Ubicacion,
|
||||
F.HectareasFraccionamiento,
|
||||
F.Estatus,
|
||||
COUNT(E.CveFraccionamientoEtapa) AS NumeroEtapas,
|
||||
CAST(1 AS bit) AS EsFraccionamiento,
|
||||
CAST(NULL AS varchar(150)) AS Etapa,
|
||||
CAST(NULL AS decimal(18,4)) AS Hectareas,
|
||||
CAST(0 AS bit) AS Fideicomiso,
|
||||
CAST(1 AS bit) AS EsActivo,
|
||||
0 AS OrdenEtapa
|
||||
FROM FraccionamientosCliente AS F
|
||||
LEFT JOIN dbo.FraccionamientosEtapas AS E ON E.CveFraccionamiento = F.CveFraccionamiento
|
||||
GROUP BY
|
||||
F.CveFraccionamiento,
|
||||
F.Fraccionamiento,
|
||||
F.Ubicacion,
|
||||
F.HectareasFraccionamiento,
|
||||
F.Estatus
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
F.CveFraccionamiento,
|
||||
E.CveFraccionamientoEtapa,
|
||||
F.Fraccionamiento,
|
||||
F.Ubicacion,
|
||||
F.HectareasFraccionamiento,
|
||||
F.Estatus,
|
||||
0 AS NumeroEtapas,
|
||||
CAST(0 AS bit) AS EsFraccionamiento,
|
||||
E.Etapa,
|
||||
E.Hectareas,
|
||||
E.Fideicomiso,
|
||||
E.EsActivo,
|
||||
E.Orden AS OrdenEtapa
|
||||
FROM FraccionamientosCliente AS F
|
||||
INNER JOIN dbo.FraccionamientosEtapas AS E ON E.CveFraccionamiento = F.CveFraccionamiento
|
||||
)
|
||||
SELECT
|
||||
CveFraccionamiento,
|
||||
CveFraccionamientoEtapa,
|
||||
Fraccionamiento,
|
||||
Ubicacion,
|
||||
HectareasFraccionamiento,
|
||||
Estatus,
|
||||
NumeroEtapas,
|
||||
EsFraccionamiento,
|
||||
Etapa,
|
||||
Hectareas,
|
||||
Fideicomiso,
|
||||
EsActivo
|
||||
FROM Filas
|
||||
ORDER BY
|
||||
Fraccionamiento,
|
||||
CveFraccionamiento,
|
||||
EsFraccionamiento DESC,
|
||||
OrdenEtapa,
|
||||
CveFraccionamientoEtapa;
|
||||
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SET @ErrorMostrar = 'Ocurrió un error al consultar los desarrollos; 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_DesarrolladorEtapasList'),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE()
|
||||
);
|
||||
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
353
Migracion_Bitacora_Eventos_20260920.sql
Normal file
353
Migracion_Bitacora_Eventos_20260920.sql
Normal file
@@ -0,0 +1,353 @@
|
||||
/*
|
||||
Rediseño aprobado: evento -> registros -> campos/relaciones.
|
||||
Instalado el 20/09/2026 en SIG_PlataformaDesarolladores con autorización del usuario.
|
||||
Instalación: aplicación detenida, respaldo verificado y UNA transacción del
|
||||
instalador en UNA conexión para este archivo y Procedimientos_Bitacora_Eventos_20260920.sql.
|
||||
El instalador debe detenerse ante cualquier error, revertir y no continuar lotes.
|
||||
Ningún PA administra transacciones. No agrupar historia por fecha/usuario.
|
||||
*/
|
||||
SET NOCOUNT ON;
|
||||
IF @@TRANCOUNT = 0
|
||||
THROW 51000, 'La migración requiere una transacción externa del instalador.', 1;
|
||||
IF OBJECT_ID(N'dbo.Bit_Bitacora', N'U') IS NULL
|
||||
OR OBJECT_ID(N'dbo.Bit_DefinicionesAccion', N'U') IS NULL
|
||||
OR OBJECT_ID(N'dbo.Bit_BitacoraCampos', N'U') IS NULL
|
||||
OR OBJECT_ID(N'dbo.Bit_BitacoraRelaciones', N'U') IS NULL
|
||||
THROW 51000, 'No se encontró la estructura de bitácora revisada.', 1;
|
||||
|
||||
-- Impedir escrituras concurrentes durante la migración.
|
||||
DECLARE @Registros bigint;
|
||||
SELECT @Registros = COUNT_BIG(*) FROM dbo.Bit_Bitacora WITH (TABLOCKX, HOLDLOCK);
|
||||
CREATE TABLE #ControlMigracionBitacora
|
||||
(
|
||||
Registros bigint NOT NULL,
|
||||
Campos bigint NOT NULL,
|
||||
Relaciones bigint NOT NULL
|
||||
);
|
||||
INSERT INTO #ControlMigracionBitacora
|
||||
SELECT @Registros,
|
||||
(SELECT COUNT_BIG(*) FROM dbo.Bit_BitacoraCampos),
|
||||
(SELECT COUNT_BIG(*) FROM dbo.Bit_BitacoraRelaciones);
|
||||
GO
|
||||
|
||||
IF @@TRANCOUNT = 0
|
||||
THROW 51000, 'La migración requiere una transacción externa.', 1;
|
||||
IF OBJECT_ID(N'dbo.Bit_BitacoraEventos', N'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE dbo.Bit_BitacoraEventos
|
||||
(
|
||||
CveBitacoraEvento bigint IDENTITY(1, 1) NOT NULL
|
||||
CONSTRAINT PK_Bit_BitacoraEventos PRIMARY KEY,
|
||||
CveDefinicionAccion int NULL,
|
||||
CveUsuarioEjecuta int NOT NULL,
|
||||
CveUsuarioAutoriza int NULL,
|
||||
FechaAutorizacion datetime NULL,
|
||||
DescripcionMovimiento nvarchar(1000) COLLATE Modern_Spanish_CS_AS NOT NULL,
|
||||
FechaMovimiento datetime NOT NULL
|
||||
CONSTRAINT DF_Bit_BitacoraEventos_Fecha DEFAULT SYSDATETIME(),
|
||||
DireccionIP varchar(50) COLLATE Modern_Spanish_CS_AS NULL,
|
||||
NombreEquipo varchar(150) COLLATE Modern_Spanish_CS_AS NULL,
|
||||
Modulo varchar(150) COLLATE Modern_Spanish_CS_AS NULL,
|
||||
EsHistorico bit NOT NULL CONSTRAINT DF_Bit_BitacoraEventos_Historico DEFAULT (0),
|
||||
CONSTRAINT FK_Bit_BitacoraEventos_Accion FOREIGN KEY (CveDefinicionAccion)
|
||||
REFERENCES dbo.Bit_DefinicionesAccion(CveDefinicionAccion),
|
||||
CONSTRAINT FK_Bit_BitacoraEventos_Usuario FOREIGN KEY (CveUsuarioEjecuta)
|
||||
REFERENCES dbo.Sis_Usuarios(CveUsuario),
|
||||
CONSTRAINT FK_Bit_BitacoraEventos_Autoriza FOREIGN KEY (CveUsuarioAutoriza)
|
||||
REFERENCES dbo.Sis_Usuarios(CveUsuario),
|
||||
CONSTRAINT CK_Bit_BitacoraEventos_Autorizacion
|
||||
CHECK (CveUsuarioAutoriza IS NOT NULL OR FechaAutorizacion IS NULL)
|
||||
);
|
||||
END;
|
||||
IF COL_LENGTH('dbo.Bit_Bitacora', 'CveBitacoraEvento') IS NULL
|
||||
ALTER TABLE dbo.Bit_Bitacora ADD CveBitacoraEvento bigint NULL;
|
||||
IF COL_LENGTH('dbo.Bit_Bitacora', 'LlaveRegistroTexto') IS NULL
|
||||
ALTER TABLE dbo.Bit_Bitacora ADD LlaveRegistroTexto nvarchar(250) COLLATE Modern_Spanish_CS_AS NULL;
|
||||
IF COL_LENGTH('dbo.Bit_BitacoraCampos', 'ValorAnteriorMostrar') IS NULL
|
||||
ALTER TABLE dbo.Bit_BitacoraCampos ADD ValorAnteriorMostrar nvarchar(max) COLLATE Modern_Spanish_CS_AS NULL;
|
||||
IF COL_LENGTH('dbo.Bit_BitacoraCampos', 'ValorNuevoMostrar') IS NULL
|
||||
ALTER TABLE dbo.Bit_BitacoraCampos ADD ValorNuevoMostrar nvarchar(max) COLLATE Modern_Spanish_CS_AS NULL;
|
||||
IF COL_LENGTH('dbo.Bit_DefinicionesAccion', 'CodigoAccion') IS NULL
|
||||
ALTER TABLE dbo.Bit_DefinicionesAccion ADD CodigoAccion varchar(150) COLLATE Modern_Spanish_CI_AS NULL;
|
||||
GO
|
||||
IF @@TRANCOUNT = 0
|
||||
THROW 51000, 'La migración requiere una transacción externa.', 1;
|
||||
IF COL_LENGTH('dbo.Bit_Bitacora', 'DescripcionMovimiento') IS NOT NULL
|
||||
BEGIN
|
||||
EXEC sys.sp_executesql N' CREATE TABLE #CorrespondenciaEventos
|
||||
(
|
||||
CveBitacora bigint NOT NULL PRIMARY KEY,
|
||||
CveBitacoraEvento bigint NOT NULL UNIQUE
|
||||
);
|
||||
|
||||
-- OUTPUT conserva la correspondencia real de las identidades; nunca se igualan claves.
|
||||
MERGE dbo.Bit_BitacoraEventos AS Destino
|
||||
USING
|
||||
(
|
||||
SELECT *
|
||||
FROM dbo.Bit_Bitacora
|
||||
WHERE CveBitacoraEvento IS NULL
|
||||
) AS Origen
|
||||
ON 1 = 0
|
||||
WHEN NOT MATCHED THEN
|
||||
INSERT (CveDefinicionAccion, CveUsuarioEjecuta, CveUsuarioAutoriza, FechaAutorizacion, DescripcionMovimiento, FechaMovimiento, DireccionIP, NombreEquipo, Modulo, EsHistorico)
|
||||
VALUES (Origen.CveDefinicionAccion, Origen.CveUsuarioEjecuta, Origen.CveUsuarioAutoriza, Origen.FechaAutorizacion, Origen.DescripcionMovimiento, Origen.FechaMovimiento, Origen.DireccionIP, Origen.NombreEquipo, Origen.Modulo, 1)
|
||||
OUTPUT Origen.CveBitacora, inserted.CveBitacoraEvento
|
||||
INTO #CorrespondenciaEventos(CveBitacora, CveBitacoraEvento);
|
||||
|
||||
UPDATE B
|
||||
SET B.CveBitacoraEvento = C.CveBitacoraEvento
|
||||
FROM dbo.Bit_Bitacora AS B
|
||||
INNER JOIN #CorrespondenciaEventos AS C ON C.CveBitacora = B.CveBitacora;
|
||||
|
||||
UPDATE dbo.Bit_Bitacora
|
||||
SET LlaveRegistroTexto = LlaveRegistro
|
||||
WHERE LlaveRegistroTexto IS NULL;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT B.CveBitacora, B.CveDefinicionAccion, B.CveUsuarioEjecuta, B.CveUsuarioAutoriza, B.FechaAutorizacion, B.DescripcionMovimiento, B.FechaMovimiento, B.DireccionIP, B.NombreEquipo, B.Modulo
|
||||
FROM dbo.Bit_Bitacora AS B
|
||||
EXCEPT
|
||||
SELECT B.CveBitacora, E.CveDefinicionAccion, E.CveUsuarioEjecuta, E.CveUsuarioAutoriza, E.FechaAutorizacion, E.DescripcionMovimiento, E.FechaMovimiento, E.DireccionIP, E.NombreEquipo, E.Modulo
|
||||
FROM dbo.Bit_Bitacora AS B
|
||||
INNER JOIN dbo.Bit_BitacoraEventos AS E ON E.CveBitacoraEvento = B.CveBitacoraEvento
|
||||
)
|
||||
THROW 51000, ''La copia de los encabezados no coincide; se cancela la migración.'', 1;
|
||||
|
||||
IF EXISTS (SELECT 1 FROM dbo.Bit_Bitacora WHERE CveBitacoraEvento IS NULL OR LlaveRegistroTexto IS NULL)
|
||||
THROW 51000, ''Hay registros sin evento o sin clave histórica.'', 1;
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT CveBitacoraEvento
|
||||
FROM dbo.Bit_Bitacora
|
||||
GROUP BY CveBitacoraEvento
|
||||
HAVING COUNT_BIG(*) <> 1
|
||||
)
|
||||
THROW 51000, ''La correspondencia histórica no es de uno a uno.'', 1;
|
||||
-- Las dependencias de las columnas trasladadas se quitan después de verificar la copia.
|
||||
DECLARE @Retirar nvarchar(max) = N'''';
|
||||
SELECT @Retirar += N''ALTER TABLE dbo.Bit_Bitacora DROP CONSTRAINT '' + QUOTENAME(F.name) + N'';'' + CHAR(10)
|
||||
FROM sys.foreign_keys AS F
|
||||
WHERE F.parent_object_id = OBJECT_ID(N''dbo.Bit_Bitacora'')
|
||||
AND EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM sys.foreign_key_columns AS FC
|
||||
INNER JOIN sys.columns AS C ON C.object_id = FC.parent_object_id AND C.column_id = FC.parent_column_id
|
||||
WHERE FC.constraint_object_id = F.object_id
|
||||
AND C.name IN (''CveDefinicionAccion'', ''CveUsuarioEjecuta'', ''CveUsuarioAutoriza'', ''FechaAutorizacion'', ''DescripcionMovimiento'', ''FechaMovimiento'', ''DireccionIP'', ''NombreEquipo'', ''Modulo'')
|
||||
);
|
||||
SELECT @Retirar += N''ALTER TABLE dbo.Bit_Bitacora DROP CONSTRAINT '' + QUOTENAME(D.name) + N'';'' + CHAR(10)
|
||||
FROM sys.default_constraints AS D
|
||||
INNER JOIN sys.columns AS C ON C.object_id = D.parent_object_id AND C.column_id = D.parent_column_id
|
||||
WHERE D.parent_object_id = OBJECT_ID(N''dbo.Bit_Bitacora'')
|
||||
AND C.name IN (''CveDefinicionAccion'', ''CveUsuarioEjecuta'', ''CveUsuarioAutoriza'', ''FechaAutorizacion'', ''DescripcionMovimiento'', ''FechaMovimiento'', ''DireccionIP'', ''NombreEquipo'', ''Modulo'');
|
||||
IF OBJECT_ID(N''dbo.CK_Bit_Bitacora_Autorizacion'', N''C'') IS NOT NULL
|
||||
SET @Retirar += N''ALTER TABLE dbo.Bit_Bitacora DROP CONSTRAINT CK_Bit_Bitacora_Autorizacion;'';
|
||||
EXEC sys.sp_executesql @Retirar;
|
||||
|
||||
IF EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N''dbo.Bit_Bitacora'') AND name = N''IX_Bit_Bitacora_Tabla_Llave_Fecha'')
|
||||
DROP INDEX IX_Bit_Bitacora_Tabla_Llave_Fecha ON dbo.Bit_Bitacora;
|
||||
|
||||
-- Sus columnas pasan al evento; los índices equivalentes se crean en el padre.
|
||||
IF EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N''dbo.Bit_Bitacora'') AND name = N''IX_Bit_Bitacora_FechaMovimiento'')
|
||||
DROP INDEX IX_Bit_Bitacora_FechaMovimiento ON dbo.Bit_Bitacora;
|
||||
IF EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N''dbo.Bit_Bitacora'') AND name = N''IX_Bit_Bitacora_CveUsuarioEjecuta'')
|
||||
DROP INDEX IX_Bit_Bitacora_CveUsuarioEjecuta ON dbo.Bit_Bitacora;
|
||||
IF EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N''dbo.Bit_Bitacora'') AND name = N''IX_Bit_Bitacora_CveUsuarioAutoriza'')
|
||||
DROP INDEX IX_Bit_Bitacora_CveUsuarioAutoriza ON dbo.Bit_Bitacora;
|
||||
|
||||
-- Si hay otras dependencias no revisadas, ALTER falla y el instalador revierte.
|
||||
ALTER TABLE dbo.Bit_Bitacora ALTER COLUMN LlaveRegistro nvarchar(250) COLLATE Modern_Spanish_CS_AS NULL;
|
||||
UPDATE dbo.Bit_Bitacora SET LlaveRegistro = NULL
|
||||
WHERE TRY_CONVERT(bigint, LlaveRegistro) IS NULL;
|
||||
ALTER TABLE dbo.Bit_Bitacora ALTER COLUMN LlaveRegistro bigint NULL;
|
||||
ALTER TABLE dbo.Bit_Bitacora DROP COLUMN
|
||||
CveDefinicionAccion,
|
||||
CveUsuarioEjecuta,
|
||||
CveUsuarioAutoriza,
|
||||
FechaAutorizacion,
|
||||
DescripcionMovimiento,
|
||||
FechaMovimiento,
|
||||
DireccionIP,
|
||||
NombreEquipo,
|
||||
Modulo;
|
||||
';
|
||||
END;
|
||||
GO
|
||||
|
||||
IF @@TRANCOUNT = 0
|
||||
THROW 51000, 'La migración requiere una transacción externa.', 1;
|
||||
IF EXISTS (SELECT 1 FROM dbo.Bit_Bitacora WHERE CveBitacoraEvento IS NULL)
|
||||
THROW 51000, 'Hay registros sin evento.', 1;
|
||||
ALTER TABLE dbo.Bit_Bitacora ALTER COLUMN CveBitacoraEvento bigint NOT NULL;
|
||||
IF OBJECT_ID(N'dbo.FK_Bit_Bitacora_Evento', N'F') IS NULL
|
||||
ALTER TABLE dbo.Bit_Bitacora WITH CHECK ADD CONSTRAINT FK_Bit_Bitacora_Evento
|
||||
FOREIGN KEY (CveBitacoraEvento) REFERENCES dbo.Bit_BitacoraEventos(CveBitacoraEvento);
|
||||
IF OBJECT_ID(N'dbo.CK_Bit_Bitacora_Llave', N'C') IS NULL
|
||||
ALTER TABLE dbo.Bit_Bitacora WITH CHECK ADD CONSTRAINT CK_Bit_Bitacora_Llave
|
||||
CHECK (LlaveRegistro IS NOT NULL OR NULLIF(LlaveRegistroTexto, N'') IS NOT NULL);
|
||||
|
||||
IF OBJECT_ID(N'dbo.UQ_Bit_DefinicionesAccion', N'UQ') IS NOT NULL
|
||||
ALTER TABLE dbo.Bit_DefinicionesAccion DROP CONSTRAINT UQ_Bit_DefinicionesAccion;
|
||||
ALTER TABLE dbo.Bit_DefinicionesAccion ALTER COLUMN CveTabla int NULL;
|
||||
ALTER TABLE dbo.Bit_DefinicionesAccion ALTER COLUMN CveTipoMovimiento tinyint NULL;
|
||||
UPDATE dbo.Bit_DefinicionesAccion
|
||||
SET CodigoAccion = CONCAT('Historica_', CveDefinicionAccion)
|
||||
WHERE CodigoAccion IS NULL;
|
||||
ALTER TABLE dbo.Bit_DefinicionesAccion ALTER COLUMN CodigoAccion varchar(150) COLLATE Modern_Spanish_CI_AS NOT NULL;
|
||||
IF OBJECT_ID(N'dbo.UQ_Bit_DefinicionesAccion_Codigo', N'UQ') IS NULL
|
||||
ALTER TABLE dbo.Bit_DefinicionesAccion ADD CONSTRAINT UQ_Bit_DefinicionesAccion_Codigo UNIQUE (CodigoAccion);
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.Bit_BitacoraEventos') AND name = N'IX_Bit_BitacoraEventos_Fecha')
|
||||
CREATE INDEX IX_Bit_BitacoraEventos_Fecha ON dbo.Bit_BitacoraEventos (FechaMovimiento DESC, CveBitacoraEvento DESC);
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.Bit_BitacoraEventos') AND name = N'IX_Bit_BitacoraEventos_Usuario_Fecha')
|
||||
CREATE INDEX IX_Bit_BitacoraEventos_Usuario_Fecha ON dbo.Bit_BitacoraEventos (CveUsuarioEjecuta, FechaMovimiento DESC);
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.Bit_BitacoraEventos') AND name = N'IX_Bit_BitacoraEventos_Autoriza_Fecha')
|
||||
CREATE INDEX IX_Bit_BitacoraEventos_Autoriza_Fecha ON dbo.Bit_BitacoraEventos (CveUsuarioAutoriza, FechaAutorizacion);
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.Bit_BitacoraEventos') AND name = N'IX_Bit_BitacoraEventos_Accion_Fecha')
|
||||
CREATE INDEX IX_Bit_BitacoraEventos_Accion_Fecha ON dbo.Bit_BitacoraEventos (CveDefinicionAccion, FechaMovimiento DESC);
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.Bit_Bitacora') AND name = N'IX_Bit_Bitacora_Evento')
|
||||
CREATE INDEX IX_Bit_Bitacora_Evento ON dbo.Bit_Bitacora (CveBitacoraEvento, CveBitacora);
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.Bit_Bitacora') AND name = N'IX_Bit_Bitacora_Tabla_LlaveNumero')
|
||||
CREATE INDEX IX_Bit_Bitacora_Tabla_LlaveNumero ON dbo.Bit_Bitacora (CveTabla, LlaveRegistro, CveBitacoraEvento) WHERE LlaveRegistro IS NOT NULL;
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.Bit_Bitacora') AND name = N'IX_Bit_Bitacora_Tabla_LlaveTexto')
|
||||
CREATE INDEX IX_Bit_Bitacora_Tabla_LlaveTexto ON dbo.Bit_Bitacora (CveTabla, LlaveRegistroTexto, CveBitacoraEvento) WHERE LlaveRegistroTexto IS NOT NULL;
|
||||
|
||||
-- Conservar índices equivalentes de campos y todas las relaciones existentes.
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM sys.index_columns AS IC
|
||||
INNER JOIN sys.indexes AS I ON I.object_id = IC.object_id AND I.index_id = IC.index_id
|
||||
INNER JOIN sys.columns AS C ON C.object_id = IC.object_id AND C.column_id = IC.column_id
|
||||
WHERE IC.object_id = OBJECT_ID(N'dbo.Bit_BitacoraCampos')
|
||||
AND IC.key_ordinal = 1 AND C.name = N'CveBitacora'
|
||||
AND I.is_disabled = 0 AND I.has_filter = 0
|
||||
)
|
||||
CREATE INDEX IX_Bit_BitacoraCampos_Registro ON dbo.Bit_BitacoraCampos(CveBitacora);
|
||||
|
||||
-- Códigos de operaciones reales de los servicios; las claves las asigna IDENTITY.
|
||||
DECLARE @Acciones TABLE
|
||||
(
|
||||
CodigoAccion varchar(150) COLLATE Modern_Spanish_CI_AS NOT NULL PRIMARY KEY,
|
||||
NombreAccion varchar(150) COLLATE Modern_Spanish_CS_AS NOT NULL
|
||||
);
|
||||
INSERT INTO @Acciones(CodigoAccion, NombreAccion)
|
||||
VALUES
|
||||
('ActualizarAvanceEtapa', 'Actualizar avance etapa'),
|
||||
('ActualizarProductoServicioPrecioTramite', 'Actualizar producto servicio precio tramite'),
|
||||
('AgregarSolicitudEtapa', 'Agregar solicitud etapa'),
|
||||
('AgregarTipoTramitePadreTramite', 'Agregar tipo tramite padre tramite'),
|
||||
('CambiarEstatusSolicitud', 'Cambiar estatus de solicitud'),
|
||||
('CancelarCita', 'Cancelar cita'),
|
||||
('CargarDocumentoSolicitud', 'Cargar documento solicitud'),
|
||||
('CargarDocumentoVisita', 'Cargar documento visita'),
|
||||
('EliminarArchivoEtapa', 'Eliminar archivo etapa'),
|
||||
('EliminarClasificacion', 'Eliminar clasificacion'),
|
||||
('EliminarComentarioVisita', 'Eliminar comentario visita'),
|
||||
('EliminarConfiguracionSolicitud', 'Eliminar configuracion solicitud'),
|
||||
('EliminarCuestionarioVisita', 'Eliminar cuestionario visita'),
|
||||
('EliminarDiaFestivo', 'Eliminar dia festivo'),
|
||||
('EliminarDocumentoRequeridoTramite', 'Eliminar documento requerido tramite'),
|
||||
('EliminarDocumentoSolicitud', 'Eliminar documento solicitud'),
|
||||
('EliminarDocumentoVisita', 'Eliminar documento visita'),
|
||||
('EliminarEstatusTramite', 'Eliminar estatus tramite'),
|
||||
('EliminarEtapa', 'Eliminar etapa'),
|
||||
('EliminarFraccionamiento', 'Eliminar fraccionamiento'),
|
||||
('EliminarGisEtapa', 'Eliminar gis etapa'),
|
||||
('EliminarLote', 'Eliminar lote'),
|
||||
('EliminarOpcionTramite', 'Eliminar opcion tramite'),
|
||||
('EliminarOpcionVisita', 'Eliminar opcion visita'),
|
||||
('EliminarPagoDetalleTramite', 'Eliminar pago detalle tramite'),
|
||||
('EliminarPagoTramite', 'Eliminar pago tramite'),
|
||||
('EliminarPlantillaVisita', 'Eliminar plantilla visita'),
|
||||
('EliminarPreguntaTramite', 'Eliminar pregunta tramite'),
|
||||
('EliminarPreguntaVisita', 'Eliminar pregunta visita'),
|
||||
('EliminarProductoServicio', 'Eliminar producto servicio'),
|
||||
('EliminarTipoDocumentoTramite', 'Eliminar tipo documento tramite'),
|
||||
('EliminarTipoTramite', 'Eliminar tipo tramite'),
|
||||
('EliminarTipoTramitePadreTramite', 'Eliminar tipo tramite padre tramite'),
|
||||
('EliminarTurno', 'Eliminar turno'),
|
||||
('EliminarUnidadMedida', 'Eliminar unidad medida'),
|
||||
('EliminarUsuario', 'Eliminar usuario'),
|
||||
('GuardarCita', 'Guardar cita'),
|
||||
('GuardarClasificacion', 'Guardar clasificacion'),
|
||||
('GuardarClienteUsuario', 'Guardar cliente usuario'),
|
||||
('GuardarComentarioVisita', 'Guardar comentario visita'),
|
||||
('GuardarCondicionesEtapa', 'Guardar condiciones etapa'),
|
||||
('GuardarConfiguracionSolicitud', 'Guardar configuracion solicitud'),
|
||||
('GuardarConfiguracionVisitas', 'Guardar configuracion visitas'),
|
||||
('GuardarCuestionarioVisita', 'Guardar cuestionario visita'),
|
||||
('GuardarDiaFestivo', 'Guardar dia festivo'),
|
||||
('GuardarDocumentoRequeridoTramite', 'Guardar documento requerido tramite'),
|
||||
('GuardarEstatusTramite', 'Guardar estatus tramite'),
|
||||
('GuardarEtapa', 'Guardar etapa'),
|
||||
('GuardarFraccionamiento', 'Guardar fraccionamiento'),
|
||||
('GuardarGisEtapa', 'Guardar gis etapa'),
|
||||
('GuardarLote', 'Guardar lote'),
|
||||
('GuardarLotes', 'Guardar lotes'),
|
||||
('GuardarOpcionTramite', 'Guardar opcion tramite'),
|
||||
('GuardarOpcionVisita', 'Guardar opcion visita'),
|
||||
('GuardarPagoDetalleTramite', 'Guardar pago detalle tramite'),
|
||||
('GuardarPagoTramite', 'Guardar pago tramite'),
|
||||
('GuardarPlantillaVisita', 'Guardar plantilla visita'),
|
||||
('GuardarPreguntaTramite', 'Guardar pregunta tramite'),
|
||||
('GuardarPreguntaVisita', 'Guardar pregunta visita'),
|
||||
('GuardarProductoServicio', 'Guardar producto servicio'),
|
||||
('GuardarTipoDocumentoTramite', 'Guardar tipo documento tramite'),
|
||||
('GuardarTipoTramite', 'Guardar tipo tramite'),
|
||||
('GuardarTurno', 'Guardar turno'),
|
||||
('GuardarUnidadMedida', 'Guardar unidad medida'),
|
||||
('GuardarUsuario', 'Guardar usuario'),
|
||||
('GuardarVisita', 'Guardar visita'),
|
||||
('LimpiarLotesEtapa', 'Limpiar lotes etapa'),
|
||||
('MoverOrdenEtapa', 'Mover orden etapa'),
|
||||
('RegistrarArchivoEtapa', 'Registrar archivo etapa'),
|
||||
('ReiniciarContrasenaUsuario', 'Reiniciar contraseña de usuario'),
|
||||
('ReordenarCatalogoTramite', 'Reordenar catalogo tramite'),
|
||||
('ReordenarPlantillaVisita', 'Reordenar plantilla visita'),
|
||||
('RevisarDocumentoSolicitud', 'Revisar documento solicitud');
|
||||
|
||||
INSERT INTO dbo.Bit_DefinicionesAccion
|
||||
(CodigoAccion, NombreAccion, DescripcionAccion, CveTabla, CveTipoMovimiento, Activo)
|
||||
SELECT A.CodigoAccion, A.NombreAccion, A.NombreAccion, NULL, NULL, 1
|
||||
FROM @Acciones AS A
|
||||
WHERE NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM dbo.Bit_DefinicionesAccion AS D WHERE D.CodigoAccion = A.CodigoAccion
|
||||
);
|
||||
|
||||
-- Resolver el turno con metadatos existentes, sin claves de catálogo inventadas.
|
||||
UPDATE C
|
||||
SET C.CveTablaReferencia = T.CveTabla,
|
||||
C.CveCampoMostrarReferencia = M.CveCampo
|
||||
FROM dbo.Bit_Campos AS C
|
||||
INNER JOIN dbo.Bit_Tablas AS H ON H.CveTabla = C.CveTabla
|
||||
INNER JOIN dbo.Bit_Tablas AS T ON T.NombreTablaSQL = 'Sis_Turnos'
|
||||
INNER JOIN dbo.Bit_Campos AS M ON M.CveTabla = T.CveTabla AND M.NombreCampoSQL = 'Turno'
|
||||
WHERE H.NombreTablaSQL = 'Sis_TurnosHorarios' AND C.NombreCampoSQL = 'CveTurno';
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1 FROM #ControlMigracionBitacora
|
||||
WHERE Registros <> (SELECT COUNT_BIG(*) FROM dbo.Bit_Bitacora)
|
||||
OR Campos <> (SELECT COUNT_BIG(*) FROM dbo.Bit_BitacoraCampos)
|
||||
OR Relaciones <> (SELECT COUNT_BIG(*) FROM dbo.Bit_BitacoraRelaciones)
|
||||
)
|
||||
THROW 51000, 'Cambió la cantidad de registros, campos o relaciones durante la migración.', 1;
|
||||
|
||||
SELECT
|
||||
(SELECT COUNT_BIG(*) FROM dbo.Bit_BitacoraEventos WHERE EsHistorico = 1) AS EventosHistoricos,
|
||||
(SELECT COUNT_BIG(*) FROM dbo.Bit_Bitacora) AS Registros,
|
||||
(SELECT COUNT_BIG(*) FROM dbo.Bit_BitacoraCampos) AS Campos,
|
||||
(SELECT COUNT_BIG(*) FROM dbo.Bit_BitacoraRelaciones) AS Relaciones;
|
||||
DROP TABLE #ControlMigracionBitacora;
|
||||
GO
|
||||
420
Migracion_DocumentosTramites_20260914.sql
Normal file
420
Migracion_DocumentosTramites_20260914.sql
Normal file
@@ -0,0 +1,420 @@
|
||||
/*
|
||||
Migración a la estructura solicitada.
|
||||
La relación final es dbo.Tra_TiposTramiteDocumento con exactamente:
|
||||
CveTipoTramite, CveTipoDocumento, EsRequerido, EsCliente,
|
||||
TieneVigencia, Orden, EsActivo.
|
||||
PK: (CveTipoTramite, CveTipoDocumento). EsRequerido DEFAULT (0).
|
||||
|
||||
Orden: Exportar -> Preparar -> ALTER de PAs revisados -> Finalizar.
|
||||
Ejecutar en una sola transacción de instalación, sin escrituras concurrentes.
|
||||
Exportar y guardar el XML completo, los PAs originales y un respaldo de la BD.
|
||||
El XML conserva también las claves antiguas y SeValida; no se inventa una
|
||||
columna equivalente en la relación nueva.
|
||||
Review, StageContextGet y DownloadGet existentes no necesitan cambios.
|
||||
|
||||
Los contratos, los trece PAs y la bitácora se adaptan a la clave compuesta.
|
||||
Establecer @ReferenciasAdaptadas = 1 únicamente con esa versión de aplicación.
|
||||
*/
|
||||
SET NOCOUNT ON;
|
||||
SET XACT_ABORT ON;
|
||||
|
||||
DECLARE @Fase varchar(20) = 'Exportar';
|
||||
DECLARE @Respaldo xml = NULL;
|
||||
DECLARE @ReferenciasAdaptadas bit = 0;
|
||||
|
||||
IF @Fase NOT IN ('Exportar', 'Preparar', 'Finalizar')
|
||||
THROW 51000, 'Fase desconocida.', 1;
|
||||
|
||||
IF @Fase = 'Exportar'
|
||||
BEGIN
|
||||
IF OBJECT_ID('dbo.Tra_DocumentosRequeridos', 'U') IS NULL
|
||||
THROW 51000, 'La relación anterior ya no existe. Utilice el respaldo original.', 1;
|
||||
|
||||
EXEC sys.sp_executesql N'
|
||||
SELECT
|
||||
DB_NAME() AS [@Base],
|
||||
(
|
||||
SELECT CveTipoDocumento AS [@Clave], EsCliente AS [@EsCliente]
|
||||
FROM dbo.Tra_TiposDocumento
|
||||
ORDER BY CveTipoDocumento
|
||||
FOR XML PATH(''TipoDocumento''), TYPE
|
||||
),
|
||||
(
|
||||
SELECT
|
||||
CveDocumentoRequerido AS [@ClaveAnterior],
|
||||
CveTipoTramite AS [@Tramite],
|
||||
CveTipoDocumento AS [@Documento],
|
||||
EsRequerido AS [@Requerido],
|
||||
Orden AS [@Orden],
|
||||
EsActivo AS [@Activo],
|
||||
SeValida AS [@SeValida]
|
||||
FROM dbo.Tra_DocumentosRequeridos
|
||||
ORDER BY CveDocumentoRequerido
|
||||
FOR XML PATH(''Relacion''), TYPE
|
||||
)
|
||||
FOR XML PATH(''Respaldo''), TYPE;';
|
||||
RETURN;
|
||||
END;
|
||||
|
||||
IF @ReferenciasAdaptadas <> 1
|
||||
THROW 51000, 'Falta completar la adaptación de contratos, borrado, ordenamiento y bitácora. No instalar todavía.', 1;
|
||||
|
||||
IF @Respaldo IS NULL
|
||||
OR @Respaldo.exist('/Respaldo/@Base') <> 1
|
||||
OR @Respaldo.value('(/Respaldo/@Base)[1]', 'nvarchar(128)') <> DB_NAME()
|
||||
THROW 51000, 'Se requiere el XML completo exportado desde esta base antes de migrar.', 1;
|
||||
|
||||
BEGIN TRY
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
IF @Fase = 'Preparar'
|
||||
BEGIN
|
||||
IF OBJECT_ID('dbo.Tra_DocumentosRequeridos', 'U') IS NULL
|
||||
OR OBJECT_ID('dbo.Tra_TiposTramiteDocumento') IS NOT NULL
|
||||
THROW 51000, 'La relación de origen debe existir y el nombre de destino debe estar libre.', 1;
|
||||
|
||||
EXEC sys.sp_executesql N'
|
||||
DECLARE @Cantidad bigint;
|
||||
SELECT @Cantidad = COUNT_BIG(*) FROM dbo.Tra_TiposDocumento WITH (TABLOCKX, HOLDLOCK);
|
||||
SELECT @Cantidad = COUNT_BIG(*) FROM dbo.Tra_DocumentosRequeridos WITH (TABLOCKX, HOLDLOCK);
|
||||
SELECT @Cantidad = COUNT_BIG(*) FROM dbo.Tra_Solicitudes WITH (TABLOCKX, HOLDLOCK);
|
||||
SELECT @Cantidad = COUNT_BIG(*) FROM dbo.Tra_DocumentosSolicitud WITH (TABLOCKX, HOLDLOCK);
|
||||
|
||||
DECLARE @Tipos TABLE (Clave int PRIMARY KEY, EsCliente bit NOT NULL);
|
||||
INSERT INTO @Tipos (Clave, EsCliente)
|
||||
SELECT N.value(''@Clave'', ''int''), N.value(''@EsCliente'', ''bit'')
|
||||
FROM @Xml.nodes(''/Respaldo/TipoDocumento'') AS T(N);
|
||||
|
||||
DECLARE @Relaciones TABLE
|
||||
(
|
||||
ClaveAnterior int PRIMARY KEY,
|
||||
Tramite int NOT NULL,
|
||||
Documento int NOT NULL,
|
||||
Requerido bit NOT NULL,
|
||||
Orden int NOT NULL,
|
||||
Activo bit NOT NULL,
|
||||
SeValida bit NOT NULL
|
||||
);
|
||||
INSERT INTO @Relaciones
|
||||
SELECT
|
||||
N.value(''@ClaveAnterior'', ''int''),
|
||||
N.value(''@Tramite'', ''int''),
|
||||
N.value(''@Documento'', ''int''),
|
||||
N.value(''@Requerido'', ''bit''),
|
||||
N.value(''@Orden'', ''int''),
|
||||
N.value(''@Activo'', ''bit''),
|
||||
N.value(''@SeValida'', ''bit'')
|
||||
FROM @Xml.nodes(''/Respaldo/Relacion'') AS T(N);
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT CveTipoDocumento, EsCliente FROM dbo.Tra_TiposDocumento
|
||||
EXCEPT SELECT Clave, EsCliente FROM @Tipos
|
||||
)
|
||||
OR EXISTS
|
||||
(
|
||||
SELECT Clave, EsCliente FROM @Tipos
|
||||
EXCEPT SELECT CveTipoDocumento, EsCliente FROM dbo.Tra_TiposDocumento
|
||||
)
|
||||
OR EXISTS
|
||||
(
|
||||
SELECT CveDocumentoRequerido, CveTipoTramite, CveTipoDocumento,
|
||||
EsRequerido, Orden, EsActivo, SeValida
|
||||
FROM dbo.Tra_DocumentosRequeridos
|
||||
EXCEPT SELECT ClaveAnterior, Tramite, Documento, Requerido, Orden, Activo, SeValida
|
||||
FROM @Relaciones
|
||||
)
|
||||
OR EXISTS
|
||||
(
|
||||
SELECT ClaveAnterior, Tramite, Documento, Requerido, Orden, Activo, SeValida
|
||||
FROM @Relaciones
|
||||
EXCEPT SELECT CveDocumentoRequerido, CveTipoTramite, CveTipoDocumento,
|
||||
EsRequerido, Orden, EsActivo, SeValida
|
||||
FROM dbo.Tra_DocumentosRequeridos
|
||||
)
|
||||
THROW 51000, ''El respaldo está incompleto o los datos cambiaron. No se retirarán columnas.'', 1;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM sys.foreign_keys
|
||||
WHERE referenced_object_id = OBJECT_ID(''dbo.Tra_DocumentosRequeridos'')
|
||||
)
|
||||
THROW 51000, ''Existen referencias a la clave antigua que deben migrarse primero.'', 1;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT CveTipoTramite, CveTipoDocumento
|
||||
FROM dbo.Tra_DocumentosRequeridos
|
||||
GROUP BY CveTipoTramite, CveTipoDocumento
|
||||
HAVING COUNT_BIG(*) > 1
|
||||
)
|
||||
THROW 51000, ''Hay relaciones duplicadas. No se eliminarán automáticamente.'', 1;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Tra_DocumentosSolicitud AS D
|
||||
LEFT JOIN dbo.Tra_Solicitudes AS S ON S.CveSolicitud = D.CveSolicitud
|
||||
LEFT JOIN dbo.Tra_DocumentosRequeridos AS R ON R.CveTipoTramite = S.CveTipoTramite
|
||||
AND R.CveTipoDocumento = D.CveTipoDocumento
|
||||
WHERE S.CveSolicitud IS NULL OR R.CveTipoDocumento IS NULL
|
||||
)
|
||||
THROW 51000, ''Hay documentos sin solicitud o sin configuración por trámite. Revisar antes de migrar.'', 1;
|
||||
|
||||
ALTER TABLE dbo.Tra_DocumentosRequeridos WITH CHECK CHECK CONSTRAINT ALL;
|
||||
ALTER TABLE dbo.Tra_DocumentosSolicitud WITH CHECK CHECK CONSTRAINT ALL;
|
||||
ALTER TABLE dbo.Tra_TiposDocumento WITH CHECK CHECK CONSTRAINT ALL;',
|
||||
N'@Xml xml', @Xml = @Respaldo;
|
||||
|
||||
ALTER TABLE dbo.Tra_DocumentosRequeridos ADD EsCliente bit NULL;
|
||||
ALTER TABLE dbo.Tra_DocumentosRequeridos
|
||||
ADD TieneVigencia bit NOT NULL
|
||||
CONSTRAINT DF_Tra_TiposTramiteDocumento_TieneVigencia DEFAULT (0) WITH VALUES;
|
||||
|
||||
EXEC sys.sp_executesql N'
|
||||
UPDATE R
|
||||
SET EsCliente = D.EsCliente
|
||||
FROM dbo.Tra_DocumentosRequeridos AS R
|
||||
INNER JOIN dbo.Tra_TiposDocumento AS D ON D.CveTipoDocumento = R.CveTipoDocumento;
|
||||
|
||||
ALTER TABLE dbo.Tra_DocumentosRequeridos ALTER COLUMN EsCliente bit NOT NULL;
|
||||
ALTER TABLE dbo.Tra_DocumentosRequeridos
|
||||
ADD CONSTRAINT DF_Tra_TiposTramiteDocumento_EsCliente DEFAULT (1) FOR EsCliente;';
|
||||
|
||||
EXEC sys.sp_rename
|
||||
@objname = N'dbo.Tra_DocumentosRequeridos',
|
||||
@newname = N'Tra_TiposTramiteDocumento',
|
||||
@objtype = N'OBJECT';
|
||||
|
||||
EXEC sys.sp_executesql N'
|
||||
ALTER TABLE dbo.Tra_TiposTramiteDocumento DROP CONSTRAINT PK_Tra_DocumentosRequeridos;
|
||||
ALTER TABLE dbo.Tra_TiposTramiteDocumento DROP CONSTRAINT UQ_Tra_DocumentosRequeridos;
|
||||
ALTER TABLE dbo.Tra_TiposTramiteDocumento DROP COLUMN CveDocumentoRequerido, SeValida;
|
||||
|
||||
ALTER TABLE dbo.Tra_TiposTramiteDocumento
|
||||
ADD CONSTRAINT PK_Tra_TiposTramiteDocumento
|
||||
PRIMARY KEY CLUSTERED (CveTipoTramite, CveTipoDocumento);
|
||||
|
||||
DECLARE @Restriccion sysname;
|
||||
SELECT @Restriccion = name
|
||||
FROM sys.default_constraints
|
||||
WHERE parent_object_id = OBJECT_ID(''dbo.Tra_TiposTramiteDocumento'')
|
||||
AND parent_column_id = COLUMNPROPERTY(parent_object_id, ''EsRequerido'', ''ColumnId'');
|
||||
|
||||
IF @Restriccion IS NOT NULL
|
||||
BEGIN
|
||||
DECLARE @Sql nvarchar(max) =
|
||||
N''ALTER TABLE dbo.Tra_TiposTramiteDocumento DROP CONSTRAINT '' + QUOTENAME(@Restriccion);
|
||||
EXEC sys.sp_executesql @Sql;
|
||||
END;
|
||||
|
||||
ALTER TABLE dbo.Tra_TiposTramiteDocumento
|
||||
ADD CONSTRAINT DF_Tra_TiposTramiteDocumento_EsRequerido DEFAULT (0) FOR EsRequerido;';
|
||||
|
||||
EXEC sys.sp_rename
|
||||
@objname = N'dbo.FK_Tra_DocumentosRequeridos_TiposTramite',
|
||||
@newname = N'FK_Tra_TiposTramiteDocumento_TipoTramite',
|
||||
@objtype = N'OBJECT';
|
||||
EXEC sys.sp_rename
|
||||
@objname = N'dbo.FK_Tra_DocumentosRequeridos_TiposDocumento',
|
||||
@newname = N'FK_Tra_TiposTramiteDocumento_TipoDocumento',
|
||||
@objtype = N'OBJECT';
|
||||
|
||||
IF COL_LENGTH('dbo.Tra_DocumentosSolicitud', 'FechaDocumento') IS NULL
|
||||
ALTER TABLE dbo.Tra_DocumentosSolicitud ADD FechaDocumento date NULL;
|
||||
IF COL_LENGTH('dbo.Tra_DocumentosSolicitud', 'FechaVencimiento') IS NULL
|
||||
ALTER TABLE dbo.Tra_DocumentosSolicitud ADD FechaVencimiento date NULL;
|
||||
IF COL_LENGTH('dbo.Tra_DocumentosSolicitud', 'EsActivo') IS NULL
|
||||
ALTER TABLE dbo.Tra_DocumentosSolicitud
|
||||
ADD EsActivo bit NOT NULL
|
||||
CONSTRAINT DF_Tra_DocumentosSolicitud_EsActivo DEFAULT (1) WITH VALUES;
|
||||
IF COL_LENGTH('dbo.Tra_DocumentosSolicitud', 'CveFraccionamientoEtapa') IS NULL
|
||||
ALTER TABLE dbo.Tra_DocumentosSolicitud ADD CveFraccionamientoEtapa int NULL;
|
||||
|
||||
EXEC sys.sp_executesql N'
|
||||
UPDATE D
|
||||
SET CveFraccionamientoEtapa = S.CveFraccionamientoEtapa
|
||||
FROM dbo.Tra_DocumentosSolicitud AS D
|
||||
INNER JOIN dbo.Tra_Solicitudes AS S ON S.CveSolicitud = D.CveSolicitud
|
||||
WHERE D.CveFraccionamientoEtapa IS NULL;
|
||||
|
||||
ALTER TABLE dbo.Tra_DocumentosSolicitud ALTER COLUMN CveFraccionamientoEtapa int NOT NULL;
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM sys.indexes
|
||||
WHERE object_id = OBJECT_ID(''dbo.Tra_Solicitudes'')
|
||||
AND name = ''UQ_Tra_Solicitudes_SolicitudEtapa''
|
||||
)
|
||||
ALTER TABLE dbo.Tra_Solicitudes
|
||||
ADD CONSTRAINT UQ_Tra_Solicitudes_SolicitudEtapa UNIQUE (CveSolicitud, CveFraccionamientoEtapa);
|
||||
|
||||
IF OBJECT_ID(''dbo.FK_Tra_DocumentosSolicitud_SolicitudEtapa'', ''F'') IS NULL
|
||||
ALTER TABLE dbo.Tra_DocumentosSolicitud WITH CHECK
|
||||
ADD CONSTRAINT FK_Tra_DocumentosSolicitud_SolicitudEtapa
|
||||
FOREIGN KEY (CveSolicitud, CveFraccionamientoEtapa)
|
||||
REFERENCES dbo.Tra_Solicitudes (CveSolicitud, CveFraccionamientoEtapa);
|
||||
|
||||
IF OBJECT_ID(''dbo.FK_Tra_DocumentosSolicitud_Etapa'', ''F'') IS NULL
|
||||
ALTER TABLE dbo.Tra_DocumentosSolicitud WITH CHECK
|
||||
ADD CONSTRAINT FK_Tra_DocumentosSolicitud_Etapa
|
||||
FOREIGN KEY (CveFraccionamientoEtapa)
|
||||
REFERENCES dbo.FraccionamientosEtapas (CveFraccionamientoEtapa);';
|
||||
END;
|
||||
|
||||
IF @Fase = 'Finalizar'
|
||||
BEGIN
|
||||
-- Se conserva intacto el catálogo de bitácora anterior y todo su historial.
|
||||
DECLARE @TablasBitacora TABLE
|
||||
(
|
||||
NombreTablaSQL varchar(128),
|
||||
NombreMostrar varchar(150),
|
||||
NombreCampoLlaveSQL varchar(128)
|
||||
);
|
||||
INSERT INTO @TablasBitacora
|
||||
(NombreTablaSQL, NombreMostrar, NombreCampoLlaveSQL)
|
||||
VALUES
|
||||
('Tra_TiposTramiteDocumento', 'Documentos por tipo de trámite', NULL),
|
||||
('Tra_DocumentosSolicitud', 'Documentos cargados de solicitudes', 'CveDocumentoSolicitud');
|
||||
|
||||
INSERT INTO dbo.Bit_Tablas
|
||||
(NombreTablaSQL, NombreMostrar, Descripcion, NombreCampoLlaveSQL, Activo)
|
||||
SELECT
|
||||
T.NombreTablaSQL,
|
||||
T.NombreMostrar,
|
||||
T.NombreMostrar,
|
||||
T.NombreCampoLlaveSQL,
|
||||
1
|
||||
FROM @TablasBitacora AS T
|
||||
WHERE NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Bit_Tablas AS B
|
||||
WHERE B.NombreTablaSQL = T.NombreTablaSQL
|
||||
);
|
||||
|
||||
DECLARE @CamposBitacora TABLE
|
||||
(
|
||||
NombreTablaSQL varchar(128),
|
||||
NombreCampoSQL varchar(128),
|
||||
NombreMostrar varchar(150),
|
||||
TipoDatoSQL varchar(50)
|
||||
);
|
||||
INSERT INTO @CamposBitacora
|
||||
(NombreTablaSQL, NombreCampoSQL, NombreMostrar, TipoDatoSQL)
|
||||
VALUES
|
||||
('Tra_TiposTramiteDocumento', 'CveTipoTramite', 'Tipo de trámite', 'int'),
|
||||
('Tra_TiposTramiteDocumento', 'CveTipoDocumento', 'Tipo de documento', 'int'),
|
||||
('Tra_TiposTramiteDocumento', 'EsRequerido', 'Requerido', 'bit'),
|
||||
('Tra_TiposTramiteDocumento', 'EsCliente', 'Lo proporciona el desarrollador', 'bit'),
|
||||
('Tra_TiposTramiteDocumento', 'TieneVigencia', 'Tiene vigencia', 'bit'),
|
||||
('Tra_TiposTramiteDocumento', 'Orden', 'Orden', 'int'),
|
||||
('Tra_TiposTramiteDocumento', 'EsActivo', 'Activo', 'bit'),
|
||||
('Tra_DocumentosSolicitud', 'CveDocumentoSolicitud', 'Documento', 'int'),
|
||||
('Tra_DocumentosSolicitud', 'CveSolicitud', 'Solicitud', 'int'),
|
||||
('Tra_DocumentosSolicitud', 'CveTipoDocumento', 'Tipo de documento', 'int'),
|
||||
('Tra_DocumentosSolicitud', 'NombreArchivo', 'Nombre del archivo', 'varchar'),
|
||||
('Tra_DocumentosSolicitud', 'NombreArchivoFisico', 'Nombre físico', 'varchar'),
|
||||
('Tra_DocumentosSolicitud', 'RutaArchivo', 'Ruta del archivo', 'varchar'),
|
||||
('Tra_DocumentosSolicitud', 'ContentType', 'Tipo de contenido', 'varchar'),
|
||||
('Tra_DocumentosSolicitud', 'TamanoBytes', 'Tamaño en bytes', 'bigint'),
|
||||
('Tra_DocumentosSolicitud', 'ComentarioCliente', 'Comentario del cliente', 'varchar'),
|
||||
('Tra_DocumentosSolicitud', 'ComentarioAdministrativo', 'Observaciones de revisión', 'varchar'),
|
||||
('Tra_DocumentosSolicitud', 'EsAprobado', 'Aprobado', 'bit'),
|
||||
('Tra_DocumentosSolicitud', 'CveUsuarioRevisa', 'Usuario que revisa', 'int'),
|
||||
('Tra_DocumentosSolicitud', 'FechaRevision', 'Fecha de revisión', 'datetime'),
|
||||
('Tra_DocumentosSolicitud', 'FechaDocumento', 'Fecha del documento', 'date'),
|
||||
('Tra_DocumentosSolicitud', 'FechaVencimiento', 'Fecha de vencimiento', 'date');
|
||||
|
||||
INSERT INTO dbo.Bit_Campos
|
||||
(CveTabla, NombreCampoSQL, NombreMostrar, MostrarEnBitacora, TipoDatoSQL, Activo)
|
||||
SELECT
|
||||
B.CveTabla,
|
||||
C.NombreCampoSQL,
|
||||
C.NombreMostrar,
|
||||
1,
|
||||
C.TipoDatoSQL,
|
||||
1
|
||||
FROM @CamposBitacora AS C
|
||||
INNER JOIN dbo.Bit_Tablas AS B ON B.NombreTablaSQL = C.NombreTablaSQL
|
||||
WHERE NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Bit_Campos AS E
|
||||
WHERE E.CveTabla = B.CveTabla
|
||||
AND E.NombreCampoSQL = C.NombreCampoSQL
|
||||
);
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM @CamposBitacora AS C
|
||||
INNER JOIN dbo.Bit_Tablas AS B ON B.NombreTablaSQL = C.NombreTablaSQL
|
||||
INNER JOIN dbo.Bit_Campos AS E ON E.CveTabla = B.CveTabla
|
||||
AND E.NombreCampoSQL = C.NombreCampoSQL
|
||||
WHERE B.Activo <> 1 OR E.Activo <> 1
|
||||
)
|
||||
THROW 51000, 'La configuración necesaria de bitácora está inactiva.', 1;
|
||||
|
||||
IF (SELECT COUNT(*) FROM sys.columns WHERE object_id = OBJECT_ID('dbo.Tra_TiposTramiteDocumento')) <> 7
|
||||
THROW 51000, 'La relación no tiene exactamente las siete columnas solicitadas.', 1;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1 FROM sys.sql_modules
|
||||
WHERE definition LIKE '%Tra_DocumentosRequeridos%'
|
||||
)
|
||||
THROW 51000, 'Todavía hay módulos que utilizan la relación anterior.', 1;
|
||||
|
||||
DECLARE @Modulos TABLE (Nombre nvarchar(517) PRIMARY KEY);
|
||||
INSERT INTO @Modulos
|
||||
SELECT QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + N'.' + QUOTENAME(OBJECT_NAME(object_id))
|
||||
FROM sys.sql_modules
|
||||
WHERE definition LIKE '%Tra_TiposDocumento%';
|
||||
|
||||
DECLARE @Modulo nvarchar(517);
|
||||
WHILE EXISTS (SELECT 1 FROM @Modulos)
|
||||
BEGIN
|
||||
SELECT TOP (1) @Modulo = Nombre FROM @Modulos ORDER BY Nombre;
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1 FROM sys.dm_sql_referenced_entities(@Modulo, 'OBJECT')
|
||||
WHERE referenced_id = OBJECT_ID('dbo.Tra_TiposDocumento')
|
||||
AND (referenced_minor_name = 'EsCliente' OR is_select_all = 1)
|
||||
)
|
||||
THROW 51000, 'Todavía hay una dependencia de EsCliente en el catálogo.', 1;
|
||||
DELETE FROM @Modulos WHERE Nombre = @Modulo;
|
||||
END;
|
||||
|
||||
EXEC sys.sp_executesql N'
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Tra_TiposTramiteDocumento AS R
|
||||
INNER JOIN dbo.Tra_TiposDocumento AS D ON D.CveTipoDocumento = R.CveTipoDocumento
|
||||
WHERE R.EsCliente <> D.EsCliente
|
||||
)
|
||||
THROW 51000, ''Los responsables no coinciden con el origen durante la migración.'', 1;
|
||||
|
||||
DECLARE @Restriccion sysname;
|
||||
SELECT @Restriccion = name
|
||||
FROM sys.default_constraints
|
||||
WHERE parent_object_id = OBJECT_ID(''dbo.Tra_TiposDocumento'')
|
||||
AND parent_column_id = COLUMNPROPERTY(parent_object_id, ''EsCliente'', ''ColumnId'');
|
||||
IF @Restriccion IS NOT NULL
|
||||
BEGIN
|
||||
DECLARE @Sql nvarchar(max) =
|
||||
N''ALTER TABLE dbo.Tra_TiposDocumento DROP CONSTRAINT '' + QUOTENAME(@Restriccion);
|
||||
EXEC sys.sp_executesql @Sql;
|
||||
END;
|
||||
ALTER TABLE dbo.Tra_TiposDocumento DROP COLUMN EsCliente;';
|
||||
END;
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
SELECT @Fase AS FaseCompletada;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
IF XACT_STATE() <> 0
|
||||
ROLLBACK TRANSACTION;
|
||||
THROW;
|
||||
END CATCH;
|
||||
319
Pagos_Comprobantes_Aprobacion_20260924.sql
Normal file
319
Pagos_Comprobantes_Aprobacion_20260924.sql
Normal file
@@ -0,0 +1,319 @@
|
||||
-- Preparar únicamente. Instalar requiere autorización separada.
|
||||
-- Requiere los scripts Pagos_Convenios_*_20260922.sql y la bitácora de eventos.
|
||||
-- No concede Pagos.AprobarPagos automáticamente: asignarlo desde permisos de usuario.
|
||||
IF OBJECT_ID(N'dbo.Tra_ComprobantesPago', N'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE dbo.Tra_ComprobantesPago
|
||||
(
|
||||
CveComprobantePago int IDENTITY(1, 1) NOT NULL PRIMARY KEY,
|
||||
CveSolicitudPago int NOT NULL REFERENCES dbo.Tra_SolicitudesPago(CveSolicitudPago),
|
||||
CveCliente int NOT NULL REFERENCES dbo.Clientes(CveCliente),
|
||||
CveUnidadCobro int NOT NULL REFERENCES dbo.Gral_UnidadesCobro(CveUnidadCobro),
|
||||
CveFormaPago tinyint NOT NULL,
|
||||
FechaPago datetime NOT NULL,
|
||||
Importe decimal(19, 6) NOT NULL CHECK (Importe > 0),
|
||||
Referencia varchar(200) COLLATE Modern_Spanish_CS_AS NOT NULL,
|
||||
NombreArchivo nvarchar(255) COLLATE Modern_Spanish_CS_AS NOT NULL,
|
||||
NombreFisico varchar(50) COLLATE Modern_Spanish_CS_AS NOT NULL,
|
||||
TipoContenido varchar(100) COLLATE Modern_Spanish_CS_AS NOT NULL,
|
||||
TamanoBytes bigint NOT NULL CHECK (TamanoBytes > 0 AND TamanoBytes <= 5242880),
|
||||
CveUsuarioEnvia int NOT NULL REFERENCES dbo.Sis_Usuarios(CveUsuario),
|
||||
FechaEnvio datetime NOT NULL,
|
||||
CveUsuarioAprueba int NULL REFERENCES dbo.Sis_Usuarios(CveUsuario),
|
||||
FechaAprobacion datetime NULL,
|
||||
CvePago int NULL REFERENCES dbo.Tra_Pagos(CvePago),
|
||||
CONSTRAINT CK_Tra_ComprobantesPago_Aprobacion CHECK
|
||||
(
|
||||
(CvePago IS NULL AND CveUsuarioAprueba IS NULL AND FechaAprobacion IS NULL)
|
||||
OR (CvePago IS NOT NULL AND CveUsuarioAprueba IS NOT NULL AND FechaAprobacion IS NOT NULL)
|
||||
)
|
||||
);
|
||||
CREATE INDEX IX_Tra_ComprobantesPago_Solicitud ON dbo.Tra_ComprobantesPago(CveSolicitudPago, CveComprobantePago);
|
||||
CREATE UNIQUE INDEX UX_Tra_ComprobantesPago_Abono ON dbo.Tra_ComprobantesPago(CvePago) WHERE CvePago IS NOT NULL;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ComprobantePagoListar
|
||||
@CveSolicitudPago 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
|
||||
SELECT C.*
|
||||
FROM dbo.Tra_ComprobantesPago AS C
|
||||
WHERE C.CveSolicitudPago = @CveSolicitudPago
|
||||
ORDER BY C.FechaEnvio DESC, C.CveComprobantePago DESC;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SELECT
|
||||
@ErrorMostrar = 'No fue posible completar la operación de comprobantes. Contacte a Sistemas.',
|
||||
@ErrorTipo = 1,
|
||||
@Return = 0;
|
||||
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
|
||||
'Número: ', ERROR_NUMBER(),
|
||||
'; Procedimiento: ', ERROR_PROCEDURE(),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE()
|
||||
);
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ComprobantePagoObtener
|
||||
@CveComprobantePago 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
|
||||
-- Dentro de la transacción de aprobación, evita aprobar dos veces el mismo comprobante.
|
||||
SELECT C.*
|
||||
FROM dbo.Tra_ComprobantesPago AS C WITH (UPDLOCK, HOLDLOCK)
|
||||
WHERE C.CveComprobantePago = @CveComprobantePago;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SELECT
|
||||
@ErrorMostrar = 'No fue posible completar la operación de comprobantes. Contacte a Sistemas.',
|
||||
@ErrorTipo = 1,
|
||||
@Return = 0;
|
||||
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
|
||||
'Número: ', ERROR_NUMBER(),
|
||||
'; Procedimiento: ', ERROR_PROCEDURE(),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE()
|
||||
);
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ComprobantePagoFormasListar
|
||||
@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
|
||||
SELECT
|
||||
CveFormaPago,
|
||||
FormaPago
|
||||
FROM dbo.Vta_FormaPago
|
||||
WHERE ClaveFormaPagoSAT IN ('01', '02', '03', '04', '28')
|
||||
ORDER BY FormaPago;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SELECT
|
||||
@ErrorMostrar = 'No fue posible completar la operación de comprobantes. Contacte a Sistemas.',
|
||||
@ErrorTipo = 1,
|
||||
@Return = 0;
|
||||
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
|
||||
'Número: ', ERROR_NUMBER(),
|
||||
'; Procedimiento: ', ERROR_PROCEDURE(),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE()
|
||||
);
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ComprobantePagoRegistrar
|
||||
@CveSolicitudPago int,
|
||||
@CveFormaPago tinyint,
|
||||
@FechaPago datetime,
|
||||
@Importe decimal(19, 6),
|
||||
@Referencia varchar(200),
|
||||
@NombreArchivo nvarchar(255),
|
||||
@NombreFisico varchar(50),
|
||||
@TipoContenido varchar(100),
|
||||
@TamanoBytes bigint,
|
||||
@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 @@TRANCOUNT = 0 OR XACT_STATE() <> 1
|
||||
THROW 51500, 'La operación requiere la transacción del servicio.', 1;
|
||||
|
||||
INSERT INTO dbo.Tra_ComprobantesPago
|
||||
(
|
||||
CveSolicitudPago,
|
||||
CveCliente, CveUnidadCobro, CveFormaPago, FechaPago, Importe,
|
||||
Referencia, NombreArchivo, NombreFisico, TipoContenido, TamanoBytes,
|
||||
CveUsuarioEnvia, FechaEnvio
|
||||
)
|
||||
SELECT
|
||||
S.CveSolicitudPago,
|
||||
S.CveCliente, S.CveUnidadCobro, @CveFormaPago, @FechaPago, @Importe,
|
||||
@Referencia, @NombreArchivo, @NombreFisico, @TipoContenido, @TamanoBytes,
|
||||
@CveUsuarioEjecuta, GETDATE()
|
||||
FROM dbo.Tra_SolicitudesPago AS S
|
||||
WHERE S.CveSolicitudPago = @CveSolicitudPago;
|
||||
IF @@ROWCOUNT = 0
|
||||
BEGIN
|
||||
SELECT @ErrorMostrar = 'La obligación ya no existe.', @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
SELECT CONVERT(int, SCOPE_IDENTITY()) AS CveComprobantePago;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SELECT
|
||||
@ErrorMostrar = 'No fue posible completar la operación de comprobantes. Contacte a Sistemas.',
|
||||
@ErrorTipo = 1,
|
||||
@Return = 0;
|
||||
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
|
||||
'Número: ', ERROR_NUMBER(),
|
||||
'; Procedimiento: ', ERROR_PROCEDURE(),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE()
|
||||
);
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ComprobantePagoAprobar
|
||||
@CveComprobantePago int,
|
||||
@CvePago 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
|
||||
IF @@TRANCOUNT = 0 OR XACT_STATE() <> 1
|
||||
THROW 51500, 'La operación requiere la transacción del servicio.', 1;
|
||||
|
||||
UPDATE dbo.Tra_ComprobantesPago
|
||||
SET
|
||||
CvePago = @CvePago,
|
||||
CveUsuarioAprueba = @CveUsuarioEjecuta,
|
||||
FechaAprobacion = GETDATE()
|
||||
WHERE CveComprobantePago = @CveComprobantePago
|
||||
AND CvePago IS NULL;
|
||||
IF @@ROWCOUNT = 0
|
||||
BEGIN
|
||||
SELECT @ErrorMostrar = 'El comprobante ya fue aprobado o no está disponible.', @ErrorTipo = 2;
|
||||
RETURN;
|
||||
END;
|
||||
SET @Return = 1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
SELECT
|
||||
@ErrorMostrar = 'No fue posible completar la operación de comprobantes. Contacte a Sistemas.',
|
||||
@ErrorTipo = 1,
|
||||
@Return = 0;
|
||||
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
|
||||
'Número: ', ERROR_NUMBER(),
|
||||
'; Procedimiento: ', ERROR_PROCEDURE(),
|
||||
'; Línea: ', ERROR_LINE(),
|
||||
'; Detalle: ', ERROR_MESSAGE()
|
||||
);
|
||||
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
|
||||
END CATCH;
|
||||
END;
|
||||
GO
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM dbo.Sis_Permisos WHERE CodigoPermiso = 'Pagos.AprobarPagos')
|
||||
BEGIN
|
||||
INSERT INTO dbo.Sis_Permisos
|
||||
(CodigoPermiso, NombrePermiso, Descripcion, Activo, FechaCreacion)
|
||||
VALUES
|
||||
('Pagos.AprobarPagos', 'Aprobar pagos', 'Aprobar comprobantes y aplicar sus abonos al saldo.', 1, GETDATE());
|
||||
END;
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM dbo.Bit_Tablas WHERE NombreTablaSQL = 'Tra_ComprobantesPago')
|
||||
BEGIN
|
||||
INSERT INTO dbo.Bit_Tablas
|
||||
(NombreTablaSQL, NombreMostrar, Descripcion, NombreCampoLlaveSQL, Activo, FechaAlta, FechaMod)
|
||||
VALUES
|
||||
('Tra_ComprobantesPago', 'Comprobantes de pago', 'Envío y aprobación de comprobantes',
|
||||
'CveComprobantePago', 1, GETDATE(), NULL);
|
||||
END;
|
||||
|
||||
INSERT INTO dbo.Bit_Campos
|
||||
(CveTabla, NombreCampoSQL, NombreMostrar, MostrarEnBitacora, Activo, FechaAlta, FechaMod, TipoDatoSQL)
|
||||
SELECT
|
||||
B.CveTabla,
|
||||
C.name,
|
||||
C.name,
|
||||
CASE WHEN C.name LIKE 'Cve%' OR C.name = 'NombreFisico' THEN 0 ELSE 1 END,
|
||||
1,
|
||||
GETDATE(),
|
||||
NULL,
|
||||
T.name
|
||||
FROM dbo.Bit_Tablas AS B
|
||||
INNER JOIN sys.columns AS C ON C.object_id = OBJECT_ID(N'dbo.Tra_ComprobantesPago')
|
||||
INNER JOIN sys.types AS T ON T.user_type_id = C.user_type_id
|
||||
WHERE B.NombreTablaSQL = 'Tra_ComprobantesPago'
|
||||
AND NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Bit_Campos AS X
|
||||
WHERE X.CveTabla = B.CveTabla AND X.NombreCampoSQL = C.name
|
||||
);
|
||||
|
||||
INSERT INTO dbo.Bit_DefinicionesAccion
|
||||
(CveTabla, CveTipoMovimiento, NombreAccion, DescripcionAccion, Activo, Fecha, CodigoAccion)
|
||||
SELECT
|
||||
B.CveTabla,
|
||||
NULL,
|
||||
A.Nombre,
|
||||
A.Nombre,
|
||||
1,
|
||||
GETDATE(),
|
||||
A.Codigo
|
||||
FROM dbo.Bit_Tablas AS B
|
||||
CROSS JOIN
|
||||
(
|
||||
VALUES
|
||||
('EnviarComprobantePago', 'Enviar comprobante de pago'),
|
||||
('AprobarComprobantePago', 'Aprobar comprobante de pago')
|
||||
) AS A(Codigo, Nombre)
|
||||
WHERE B.NombreTablaSQL = 'Tra_ComprobantesPago'
|
||||
AND NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Bit_DefinicionesAccion AS D
|
||||
WHERE D.CodigoAccion = A.Codigo
|
||||
);
|
||||
GO
|
||||
391
Pagos_Convenios_Configuracion_20260922.sql
Normal file
391
Pagos_Convenios_Configuracion_20260922.sql
Normal file
@@ -0,0 +1,391 @@
|
||||
/*
|
||||
Pagos y Convenios: configuración de auditoría y permisos.
|
||||
NO EJECUTADO. Instalar después de estructura y procedimientos,
|
||||
en la misma transacción del instalador, sólo con autorización separada.
|
||||
Requiere la adaptación de servicios y pantallas antes de habilitar el módulo.
|
||||
Prepara menús y replica sólo el acceso de consulta del módulo de Trámites.
|
||||
No asigna permisos de operación ni crea productos, cuentas o usuarios.
|
||||
Conserva claves de Bit_Tablas/Bit_Campos y el historial de acciones.
|
||||
*/
|
||||
-- Reasignar los nombres antes de registrar el nuevo significado de Tra_Pagos.
|
||||
-- Relaciones de visualización sólo si ambos campos ya están registrados.
|
||||
SET NOCOUNT ON;
|
||||
|
||||
IF DB_NAME() <> N'SIG_PlataformaDesarolladores'
|
||||
THROW 51400, N'La base seleccionada no corresponde a la revisada.', 1;
|
||||
|
||||
IF @@TRANCOUNT = 0
|
||||
OR XACT_STATE() <> 1
|
||||
THROW 51401, N'Se requiere una transacción activa del instalador.', 1;
|
||||
|
||||
IF OBJECT_ID(N'dbo.Tra_TiposTramitePagos', N'U') IS NULL
|
||||
OR COL_LENGTH(N'dbo.Tra_Pagos', N'ValorConversion') IS NULL
|
||||
THROW 51402, N'Instale primero la estructura de Pagos y Convenios.', 1;
|
||||
|
||||
UPDATE dbo.Bit_Tablas
|
||||
SET NombreTablaSQL = 'Tra_TiposTramitePagos',
|
||||
NombreMostrar = 'Plantillas de pagos por trámite',
|
||||
FechaMod = GETDATE()
|
||||
WHERE NombreTablaSQL = 'Tra_Pagos'
|
||||
AND NombreCampoLlaveSQL = 'CveTramitePago';
|
||||
|
||||
UPDATE dbo.Bit_Tablas
|
||||
SET NombreTablaSQL = 'Tra_TiposTramitePagosDetalle',
|
||||
NombreMostrar = 'Productos de plantilla de pago',
|
||||
FechaMod = GETDATE()
|
||||
WHERE NombreTablaSQL = 'Tra_PagosDetalle';
|
||||
|
||||
UPDATE dbo.Bit_Tablas
|
||||
SET NombreTablaSQL = 'Tra_SolicitudesPago',
|
||||
NombreMostrar = 'Obligaciones de pago',
|
||||
FechaMod = GETDATE()
|
||||
WHERE NombreTablaSQL = 'Tra_SolicitudesPagos';
|
||||
|
||||
UPDATE dbo.Bit_Tablas
|
||||
SET NombreTablaSQL = 'Tra_Pagos',
|
||||
NombreMostrar = 'Abonos recibidos',
|
||||
FechaMod = GETDATE()
|
||||
WHERE NombreTablaSQL = 'Vta_Pagos';
|
||||
|
||||
DECLARE @Tablas TABLE (
|
||||
NombreTablaSQL VARCHAR (128) COLLATE Modern_Spanish_CS_AS PRIMARY KEY,
|
||||
NombreMostrar VARCHAR (150) COLLATE Modern_Spanish_CS_AS,
|
||||
NombreCampoLlaveSQL VARCHAR (128) COLLATE Modern_Spanish_CS_AS);
|
||||
|
||||
INSERT INTO @Tablas
|
||||
VALUES (N'Gral_UnidadesCobro', N'Unidades de cobro', N'CveUnidadCobro'),
|
||||
(N'Gral_UnidadesCobroValores', N'Histórico de equivalencias', N'CveUnidadCobroValor'),
|
||||
(N'Tra_TiposSolicitudPago', N'Tipos de obligación', N'CveTipoSolicitudPago'),
|
||||
(N'Tra_TiposTramitePagos', N'Plantillas de pagos por trámite', N'CveTramitePago'),
|
||||
(N'Tra_TiposTramitePagosDetalle', N'Productos de plantilla de pago', N'CveTramitePagoDetalle'),
|
||||
(N'Tra_SolicitudesPago', N'Obligaciones de pago', N'CveSolicitudPago'),
|
||||
(N'Tra_SolicitudesPagoDetalle', N'Productos de obligación', N'CveSolicitudPagoDetalle'),
|
||||
(N'Tra_SolicitudesPagoParcialidades', N'Parcialidades de obligación', N'CveSolicitudPagoParcialidad'),
|
||||
(N'Tra_Pagos', N'Abonos recibidos', N'CvePago'),
|
||||
(N'Tra_PagosAplicaciones', N'Aplicaciones de abonos', N'CvePagoAplicacion'),
|
||||
(N'Tra_SolicitudesPagoRequeridoBitacora', N'Cambios de pago requerido', N'CveSolicitudPagoRequeridoBitacora'),
|
||||
(N'Tra_SolicitudesPagoConvenio', N'Convenios', N'CveSolicitudPago'),
|
||||
(N'Tra_SolicitudesPagoConvenioOrigen', N'Adeudos de origen de convenio', N'CveConvenioOrigen'),
|
||||
(N'Tra_SolicitudesPagoConvenioOrigenDetalle', N'Distribución de saldo convenido', N'CveConvenioOrigenDetalle'),
|
||||
(N'Tra_PagosCfdi', N'Documentos fiscales de abonos', N'CvePagoCfdi'),
|
||||
(N'Fac_CfdiDocumentos', N'Documentos fiscales', N'CveCfdiDocumento'),
|
||||
(N'Sis_UsuariosPermisos', N'Permisos particulares de usuario', N'CveUsuarioPermiso');
|
||||
|
||||
IF EXISTS (SELECT 1
|
||||
FROM @Tablas AS T
|
||||
WHERE OBJECT_ID(N'dbo.' + T.NombreTablaSQL, N'U') IS NULL
|
||||
OR COL_LENGTH(N'dbo.' + T.NombreTablaSQL, T.NombreCampoLlaveSQL) IS NULL)
|
||||
THROW 51403, N'Falta una tabla o llave de la configuración de auditoría.', 1;
|
||||
|
||||
INSERT INTO dbo.Bit_Tablas (NombreTablaSQL, NombreMostrar, Descripcion, NombreCampoLlaveSQL, Activo, FechaAlta, FechaMod)
|
||||
SELECT T.NombreTablaSQL,
|
||||
T.NombreMostrar,
|
||||
T.NombreMostrar,
|
||||
T.NombreCampoLlaveSQL,
|
||||
1,
|
||||
GETDATE(),
|
||||
NULL
|
||||
FROM @Tablas AS T
|
||||
WHERE NOT EXISTS (SELECT 1
|
||||
FROM dbo.Bit_Tablas AS B
|
||||
WHERE B.NombreTablaSQL = T.NombreTablaSQL);
|
||||
|
||||
-- Completar llaves que no estaban configuradas, conservando su CveTabla.
|
||||
UPDATE B
|
||||
SET NombreCampoLlaveSQL = T.NombreCampoLlaveSQL,
|
||||
FechaMod = GETDATE()
|
||||
FROM dbo.Bit_Tablas AS B
|
||||
INNER JOIN @Tablas AS T ON T.NombreTablaSQL = B.NombreTablaSQL
|
||||
WHERE NULLIF(LTRIM(RTRIM(B.NombreCampoLlaveSQL)), '') IS NULL;
|
||||
|
||||
DECLARE @Etiquetas TABLE (
|
||||
NombreCampoSQL VARCHAR (128) COLLATE Modern_Spanish_CS_AS PRIMARY KEY,
|
||||
NombreMostrar VARCHAR (150) COLLATE Modern_Spanish_CS_AS);
|
||||
|
||||
INSERT INTO @Etiquetas
|
||||
VALUES (N'Codigo', N'Código'),
|
||||
(N'Nombre', N'Nombre'),
|
||||
(N'EsMoneda', N'Es moneda'),
|
||||
(N'RequiereConversion', N'Requiere conversión'),
|
||||
(N'Activo', N'Activo'),
|
||||
(N'FechaVigencia', N'Fecha de vigencia'),
|
||||
(N'ValorMXN', N'Equivalencia en MXN'),
|
||||
(N'Fuente', N'Fuente'),
|
||||
(N'Importe', N'Importe'),
|
||||
(N'Descripcion', N'Descripción'),
|
||||
(N'Cantidad', N'Cantidad'),
|
||||
(N'PrecioUnitario', N'Precio unitario final'),
|
||||
(N'EsRequerido', N'Requerido'),
|
||||
(N'NumeroParcialidad', N'Parcialidad'),
|
||||
(N'FechaVencimiento', N'Fecha de vencimiento'),
|
||||
(N'FechaProrroga', N'Prórroga'),
|
||||
(N'FechaGeneracion', N'Fecha de generación'),
|
||||
(N'EstadoAdministrativo', N'Estado administrativo'),
|
||||
(N'FechaPago', N'Fecha de pago'),
|
||||
(N'Referencia', N'Referencia'),
|
||||
(N'Observaciones', N'Observaciones'),
|
||||
(N'ValorConversion', N'Conversión del abono'),
|
||||
(N'ImporteMXN', N'Importe en MXN'),
|
||||
(N'ImporteAplicado', N'Importe aplicado'),
|
||||
(N'ImporteAplicadoMXN', N'Aplicación en MXN'),
|
||||
(N'ImportePagoConsumido', N'Importe consumido del abono'),
|
||||
(N'ValorConversionObligacion', N'Conversión de la obligación'),
|
||||
(N'ValorAnterior', N'Valor anterior'),
|
||||
(N'ValorNuevo', N'Valor nuevo'),
|
||||
(N'Observacion', N'Observación'),
|
||||
(N'ImporteSaldoConvenido', N'Saldo convenido'),
|
||||
(N'ImporteSaldoOriginal', N'Saldo antes del convenio'),
|
||||
(N'ImporteTomadoConvenio', N'Saldo trasladado al convenio'),
|
||||
(N'ImporteVinculadoMXN', N'Importe documentado en MXN'),
|
||||
(N'ImporteValidado', N'Importe validado'),
|
||||
(N'UuidExterno', N'UUID externo'),
|
||||
(N'FechaTimbradoExterno', N'Fecha de timbrado externo'),
|
||||
(N'OrigenRegistro', N'Origen del documento'),
|
||||
(N'Permitido', N'Permitido'),
|
||||
(N'FechaRegistro', N'Fecha de registro'),
|
||||
(N'FechaAlta', N'Fecha de alta'),
|
||||
(N'FechaModificacion', N'Fecha de modificación'),
|
||||
(N'FechaValidacion', N'Fecha de validación'),
|
||||
(N'EsActivo', N'Activo'),
|
||||
(N'Autorizado', N'Abono autorizado'),
|
||||
(N'Notas', N'Notas'),
|
||||
(N'Orden', N'Orden'),
|
||||
(N'TipoSolicitudPago', N'Tipo de obligación');
|
||||
|
||||
INSERT INTO dbo.Bit_Campos (CveTabla, NombreCampoSQL, NombreMostrar, MostrarEnBitacora, Activo, FechaAlta, FechaMod, TipoDatoSQL)
|
||||
SELECT B.CveTabla,
|
||||
C.name,
|
||||
COALESCE (E.NombreMostrar, C.name),
|
||||
CASE WHEN C.name LIKE 'Cve%'
|
||||
OR C.name LIKE 'Ruta%'
|
||||
OR C.name LIKE 'Hash%'
|
||||
OR Y.name IN ('binary', 'varbinary', 'image', 'timestamp') THEN 0 ELSE 1 END,
|
||||
1,
|
||||
GETDATE(),
|
||||
NULL,
|
||||
Y.name
|
||||
FROM @Tablas AS T
|
||||
INNER JOIN dbo.Bit_Tablas AS B ON B.NombreTablaSQL = T.NombreTablaSQL
|
||||
INNER JOIN sys.columns AS C ON C.object_id = OBJECT_ID(N'dbo.' + T.NombreTablaSQL)
|
||||
INNER JOIN sys.types AS Y ON Y.user_type_id = C.user_type_id
|
||||
LEFT OUTER JOIN @Etiquetas AS E ON E.NombreCampoSQL = C.name
|
||||
WHERE NOT EXISTS (SELECT 1
|
||||
FROM dbo.Bit_Campos AS X
|
||||
WHERE X.CveTabla = B.CveTabla
|
||||
AND X.NombreCampoSQL = C.name);
|
||||
|
||||
DECLARE @Referencias TABLE (
|
||||
Columna VARCHAR (128) COLLATE Modern_Spanish_CS_AS,
|
||||
Tabla VARCHAR (128) COLLATE Modern_Spanish_CS_AS,
|
||||
CampoMostrar VARCHAR (128) COLLATE Modern_Spanish_CS_AS);
|
||||
|
||||
INSERT INTO @Referencias
|
||||
VALUES ('CveUnidadCobro', 'Gral_UnidadesCobro', 'Nombre'),
|
||||
('CveTipoSolicitudPago', 'Tra_TiposSolicitudPago', 'TipoSolicitudPago'),
|
||||
('CveSolicitudPago', 'Tra_SolicitudesPago', 'Descripcion'),
|
||||
('CveSolicitudPagoOrigen', 'Tra_SolicitudesPago', 'Descripcion'),
|
||||
('CveSolicitudPagoConvenio', 'Tra_SolicitudesPago', 'Descripcion'),
|
||||
('CveTramitePago', 'Tra_TiposTramitePagos', 'Nombre'),
|
||||
('CveCliente', 'Clientes', 'Nombre'),
|
||||
('CvePS', 'ProductosServicios', 'PS'),
|
||||
('CveFraccionamiento', 'Fraccionamientos', 'Fraccionamiento'),
|
||||
('CveFraccionamientoEtapa', 'FraccionamientosEtapas', 'Etapa'),
|
||||
('CveUsuarioRegistro', 'Sis_Usuarios', 'NombreUsuario'),
|
||||
('CveUsuarioModificacion', 'Sis_Usuarios', 'NombreUsuario'),
|
||||
('CveUsuarioValida', 'Sis_Usuarios', 'NombreUsuario'),
|
||||
('CvePermiso', 'Sis_Permisos', 'NombrePermiso');
|
||||
|
||||
UPDATE C
|
||||
SET CveTablaReferencia = B.CveTabla,
|
||||
CveCampoMostrarReferencia = M.CveCampo,
|
||||
MostrarEnBitacora = 1,
|
||||
FechaMod = GETDATE()
|
||||
FROM dbo.Bit_Campos AS C
|
||||
INNER JOIN dbo.Bit_Tablas AS T ON T.CveTabla = C.CveTabla
|
||||
INNER JOIN @Tablas AS A ON A.NombreTablaSQL = T.NombreTablaSQL
|
||||
INNER JOIN @Referencias AS R ON R.Columna = C.NombreCampoSQL
|
||||
INNER JOIN dbo.Bit_Tablas AS B ON B.NombreTablaSQL = R.Tabla
|
||||
INNER JOIN dbo.Bit_Campos AS M ON M.CveTabla = B.CveTabla
|
||||
AND M.NombreCampoSQL = R.CampoMostrar
|
||||
WHERE C.CveTablaReferencia IS NULL;
|
||||
|
||||
DECLARE @Acciones TABLE (
|
||||
CodigoAccion VARCHAR (150) COLLATE Modern_Spanish_CI_AS,
|
||||
NombreAccion VARCHAR (150) COLLATE Modern_Spanish_CS_AS,
|
||||
NombreTablaSQL VARCHAR (128) COLLATE Modern_Spanish_CS_AS);
|
||||
|
||||
INSERT INTO @Acciones
|
||||
VALUES ('GuardarSolicitudPago', 'Guardar obligación de pago', 'Tra_SolicitudesPago'),
|
||||
('GenerarSolicitudesPago', 'Generar obligaciones del trámite', 'Tra_SolicitudesPago'),
|
||||
('CambiarRequeridoSolicitudPago', 'Cambiar pago requerido', 'Tra_SolicitudesPago'),
|
||||
('CancelarSolicitudPago', 'Cancelar obligación de pago', 'Tra_SolicitudesPago'),
|
||||
('RegistrarAbono', 'Registrar abono', 'Tra_Pagos'),
|
||||
('AplicarAbono', 'Aplicar abono a parcialidades', 'Tra_PagosAplicaciones'),
|
||||
('CancelarAbono', 'Cancelar abono', 'Tra_Pagos'),
|
||||
('GuardarConvenio', 'Guardar convenio', 'Tra_SolicitudesPagoConvenio'),
|
||||
('CancelarConvenio', 'Cancelar convenio', 'Tra_SolicitudesPagoConvenio'),
|
||||
('GuardarUnidadCobro', 'Guardar unidad de cobro', 'Gral_UnidadesCobro'),
|
||||
('AgregarEquivalenciaUnidadCobro', 'Agregar equivalencia', 'Gral_UnidadesCobroValores'),
|
||||
('GuardarCfdiExterno', 'Guardar documento fiscal externo', 'Fac_CfdiDocumentos'),
|
||||
('VincularCfdiAbono', 'Vincular documento fiscal a abono', 'Tra_PagosCfdi'),
|
||||
('GuardarPermisoUsuario', 'Modificar permiso particular', 'Sis_UsuariosPermisos');
|
||||
|
||||
INSERT INTO dbo.Bit_DefinicionesAccion (CveTabla, CveTipoMovimiento, NombreAccion, DescripcionAccion, Activo, Fecha, CodigoAccion)
|
||||
SELECT T.CveTabla,
|
||||
NULL,
|
||||
A.NombreAccion,
|
||||
A.NombreAccion,
|
||||
1,
|
||||
GETDATE(),
|
||||
A.CodigoAccion
|
||||
FROM @Acciones AS A
|
||||
INNER JOIN dbo.Bit_Tablas AS T ON T.NombreTablaSQL = A.NombreTablaSQL
|
||||
WHERE NOT EXISTS (SELECT 1
|
||||
FROM dbo.Bit_DefinicionesAccion AS D
|
||||
WHERE D.CodigoAccion = A.CodigoAccion);
|
||||
|
||||
DECLARE @Permisos TABLE (
|
||||
CodigoPermiso VARCHAR (100) COLLATE Modern_Spanish_CI_AS,
|
||||
NombrePermiso VARCHAR (150) COLLATE Modern_Spanish_CS_AS,
|
||||
Descripcion VARCHAR (255) COLLATE Modern_Spanish_CS_AS);
|
||||
|
||||
INSERT INTO @Permisos
|
||||
VALUES (N'Pagos.RegistrarAbono', N'Registrar abonos', N'Registrar y aplicar pagos recibidos.'),
|
||||
(N'Pagos.CambiarRequerido', N'Cambiar pago requerido', N'Modificar requerido de una obligación con observación.'),
|
||||
(N'Pagos.AdministrarDocumentosFiscales', N'Administrar documentos fiscales de pagos', N'Cargar y validar XML/PDF y vincularlos a abonos.'),
|
||||
(N'Convenios.Crear', N'Crear convenios', N'Crear obligaciones de tipo convenio.'),
|
||||
(N'Convenios.Modificar', N'Modificar convenios', N'Editar convenios sin alterar historia de abonos.'),
|
||||
(N'Convenios.Cancelar', N'Cancelar convenios', N'Cancelar convenios y liberar su saldo de origen cuando proceda.'),
|
||||
(N'Convenios.DisminuirImporte', N'Disminuir importe de convenio', N'Permitir un importe de convenio menor al saldo seleccionado.');
|
||||
|
||||
INSERT INTO dbo.Sis_Permisos (CodigoPermiso, NombrePermiso, Descripcion, Activo, FechaCreacion)
|
||||
SELECT P.CodigoPermiso,
|
||||
P.NombrePermiso,
|
||||
P.Descripcion,
|
||||
1,
|
||||
GETDATE()
|
||||
FROM @Permisos AS P
|
||||
WHERE NOT EXISTS (SELECT 1
|
||||
FROM dbo.Sis_Permisos AS S
|
||||
WHERE S.CodigoPermiso = P.CodigoPermiso);
|
||||
|
||||
SELECT S.CvePermiso,
|
||||
S.CodigoPermiso,
|
||||
S.NombrePermiso,
|
||||
S.Activo
|
||||
FROM dbo.Sis_Permisos AS S
|
||||
INNER JOIN @Permisos AS P ON P.CodigoPermiso = S.CodigoPermiso
|
||||
ORDER BY S.CodigoPermiso;
|
||||
GO
|
||||
|
||||
-- Accesos de consulta. Los permisos de operación siguen siendo específicos.
|
||||
-- El contenedor y los roles se resuelven desde el módulo real de Trámites.
|
||||
DECLARE @ModuloTramites INT;
|
||||
DECLARE @ModuloPadre INT;
|
||||
DECLARE @Plataforma INT;
|
||||
|
||||
IF (SELECT COUNT(*)
|
||||
FROM dbo.Sis_Modulos
|
||||
WHERE Url = '~/Pages/Desarrolladores/Tramites.aspx'
|
||||
AND Activo = 1) <> 1
|
||||
THROW 51410, N'No se encontró un módulo único y activo de Trámites.', 1;
|
||||
|
||||
SELECT @ModuloTramites = CveModulo,
|
||||
@ModuloPadre = CveModuloPadre,
|
||||
@Plataforma = CvePlataforma
|
||||
FROM dbo.Sis_Modulos
|
||||
WHERE Url = '~/Pages/Desarrolladores/Tramites.aspx'
|
||||
AND Activo = 1;
|
||||
|
||||
DECLARE @PantallasPagos TABLE
|
||||
(
|
||||
Nombre VARCHAR(150),
|
||||
Url VARCHAR(500),
|
||||
UrlPadre VARCHAR(500),
|
||||
Visible BIT,
|
||||
Icono VARCHAR(150),
|
||||
Posicion INT
|
||||
);
|
||||
|
||||
INSERT INTO @PantallasPagos
|
||||
(Nombre, Url, UrlPadre, Visible, Icono, Posicion)
|
||||
VALUES
|
||||
('Pagos', '~/Pages/Desarrolladores/Pagos.aspx', NULL, 1, 'fa fa-credit-card', 1),
|
||||
('Detalle de pago', '~/Pages/Desarrolladores/PagoDetalle.aspx',
|
||||
'~/Pages/Desarrolladores/Pagos.aspx', 0, 'fa fa-credit-card', 2),
|
||||
('Convenios', '~/Pages/Desarrolladores/Convenios.aspx', NULL, 1, 'fa fa-handshake-o', 3),
|
||||
('Detalle de convenio', '~/Pages/Desarrolladores/ConvenioDetalle.aspx',
|
||||
'~/Pages/Desarrolladores/Convenios.aspx', 0, 'fa fa-handshake-o', 4);
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT M.Url
|
||||
FROM dbo.Sis_Modulos AS M
|
||||
INNER JOIN @PantallasPagos AS P ON P.Url = M.Url
|
||||
GROUP BY M.Url
|
||||
HAVING COUNT(*) > 1
|
||||
)
|
||||
THROW 51411, N'Existen rutas duplicadas para las pantallas de pagos.', 1;
|
||||
|
||||
DECLARE @UltimoOrdenPagos INT =
|
||||
(
|
||||
SELECT ISNULL(MAX(OrdenVisualizacion), 0)
|
||||
FROM dbo.Sis_Modulos
|
||||
WHERE CveModuloPadre = @ModuloPadre
|
||||
);
|
||||
|
||||
INSERT INTO dbo.Sis_Modulos
|
||||
(CveModuloPadre, CvePlataforma, NombreModulo, Url, ClaseCssIcono,
|
||||
OrdenVisualizacion, Visible, Activo, FechaCreacion)
|
||||
SELECT @ModuloPadre,
|
||||
@Plataforma,
|
||||
P.Nombre,
|
||||
P.Url,
|
||||
P.Icono,
|
||||
@UltimoOrdenPagos + P.Posicion,
|
||||
P.Visible,
|
||||
1,
|
||||
GETDATE()
|
||||
FROM @PantallasPagos AS P
|
||||
WHERE NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Sis_Modulos AS M
|
||||
WHERE M.Url = P.Url
|
||||
);
|
||||
|
||||
UPDATE M
|
||||
SET CveModuloPadre = Padre.CveModulo
|
||||
FROM dbo.Sis_Modulos AS M
|
||||
INNER JOIN @PantallasPagos AS P ON P.Url = M.Url
|
||||
INNER JOIN dbo.Sis_Modulos AS Padre ON Padre.Url = P.UrlPadre
|
||||
WHERE P.Visible = 0
|
||||
AND ISNULL(M.CveModuloPadre, 0) <> Padre.CveModulo;
|
||||
|
||||
INSERT INTO dbo.Sis_RolesModulos
|
||||
(CveRol, CveModulo, PuedeVer, PuedeCrear, PuedeModificar,
|
||||
PuedeEliminar, PuedeImprimir, PuedeExportar, FechaCreacion)
|
||||
SELECT R.CveRol,
|
||||
M.CveModulo,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
GETDATE()
|
||||
FROM dbo.Sis_RolesModulos AS R
|
||||
INNER JOIN dbo.Sis_Modulos AS M ON M.Activo = 1
|
||||
INNER JOIN @PantallasPagos AS P ON P.Url = M.Url
|
||||
WHERE R.CveModulo = @ModuloTramites
|
||||
AND R.PuedeVer = 1
|
||||
AND NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Sis_RolesModulos AS Existente
|
||||
WHERE Existente.CveRol = R.CveRol
|
||||
AND Existente.CveModulo = M.CveModulo
|
||||
);
|
||||
GO
|
||||
|
||||
|
||||
841
Pagos_Convenios_Estructura_20260922.sql
Normal file
841
Pagos_Convenios_Estructura_20260922.sql
Normal file
@@ -0,0 +1,841 @@
|
||||
/*
|
||||
Pagos y Convenios - estructura y migración de datos existentes.
|
||||
Preparado el 22/09/2026 para SIG_PlataformaDesarolladores.
|
||||
|
||||
NO EJECUTADO. La edición de este archivo no autoriza su instalación.
|
||||
Migración de una sola aplicación. Ejecutar completa dentro de una
|
||||
transacción del instalador, que debe detenerse ante la primera excepción
|
||||
y confirmar únicamente después de instalar y verificar PAs y aplicación.
|
||||
|
||||
NO INSTALAR DE FORMA AISLADA:
|
||||
El renombrado conserva identidades y FK, pero los PAs, la vista
|
||||
Vta_SaldosFavor, los servicios y la configuración de bitácora todavía
|
||||
deben adaptarse en una entrega posterior. Este archivo no los modifica.
|
||||
|
||||
Alcance:
|
||||
- Renombrar las cuatro tablas aprobadas conservando sus claves actuales.
|
||||
- Migrar las obligaciones existentes desde sus ventas y detalles reales.
|
||||
- Separar importe abonado, saldo trasladado a convenio y saldo pendiente.
|
||||
- Preparar unidades, parcialidades, aplicaciones y CFDI externos.
|
||||
- No crear abonos a partir de facturas: un CFDI no prueba que hubo pago.
|
||||
- No crear usuarios, permisos, cuentas, productos ni tipos de cambio.
|
||||
|
||||
Decisiones de estructura:
|
||||
- Una obligación, sus productos y sus parcialidades usan una sola unidad.
|
||||
- Importe y PrecioUnitario nuevos incluyen impuestos; las ventas anteriores
|
||||
mantienen intactos sus precios netos, impuestos y documentos fiscales.
|
||||
- EstadoAdministrativo es ACTIVO/CANCELADO/SUSTITUIDO. El estado financiero
|
||||
se deriva del saldo; no se persiste un CveEstatusPago que pueda desfasarse.
|
||||
- Saldo cobrable = importe - aplicaciones vigentes - saldo convenido vigente.
|
||||
El saldo trasladado se presenta por separado, nunca como dinero pagado.
|
||||
- Cada aplicación identifica parcialidad Y producto. ImporteAplicado está
|
||||
expresado en la unidad de la obligación; ImportePagoConsumido, en la del
|
||||
abono. Ambos factores a MXN se congelan en la aplicación/pago.
|
||||
- Convenios conservan detalle del saldo trasladado por producto y parcialidad.
|
||||
Esta primera estructura exige la misma unidad entre convenio y orígenes.
|
||||
- Las sumas entre filas, concurrencia, permisos, inmutabilidad del abono,
|
||||
distribución proporcional y redondeo pertenecen a servicios/PAs pendientes.
|
||||
La estructura por sí sola no implementa esas operaciones.
|
||||
- Al cancelar un convenio se libera el traslado sólo mediante la operación
|
||||
coordinada posterior; nunca se borran el origen ni los abonos históricos.
|
||||
- FechaProrroga, cuando exista, sustituye el vencimiento para calcular atraso.
|
||||
- Las equivalencias son históricos de sólo inserción en la futura API.
|
||||
No se cargan valores UMA, UDI ni divisas.
|
||||
- En CFDI externos los metadatos no conocidos permanecen NULL. No se fabrica
|
||||
XML sin timbrar ni un intento de PAC. Archivos protegidos bajo Documentos,
|
||||
resueltos por el servicio existente; las rutas nunca son URLs públicas.
|
||||
- Generación automática al crear trámite, importes finales y reparto
|
||||
proporcional son criterios propuestos; no se ejecutan en esta migración.
|
||||
|
||||
Estado inspeccionado: tres obligaciones/ventas, tres CFDI y cero abonos.
|
||||
La venta 1019 y su CFDI tienen importes distintos; no se corrigen aquí.
|
||||
Los precontroles detienen la migración si aparecen abonos o datos ambiguos.
|
||||
*/
|
||||
SET NOCOUNT ON;
|
||||
SET ANSI_NULLS ON;
|
||||
SET QUOTED_IDENTIFIER ON;
|
||||
SET ANSI_PADDING ON;
|
||||
SET ANSI_WARNINGS ON;
|
||||
SET ARITHABORT ON;
|
||||
SET CONCAT_NULL_YIELDS_NULL ON;
|
||||
SET NUMERIC_ROUNDABORT OFF;
|
||||
|
||||
IF DB_NAME() <> N'SIG_PlataformaDesarolladores'
|
||||
THROW 51200, N'La base seleccionada no corresponde a la revisada.', 1;
|
||||
IF @@TRANCOUNT = 0 OR XACT_STATE() <> 1
|
||||
THROW 51201, N'Se requiere una transacción activa del instalador.', 1;
|
||||
|
||||
IF OBJECT_ID(N'dbo.Tra_Pagos', N'U') IS NULL
|
||||
OR OBJECT_ID(N'dbo.Tra_PagosDetalle', N'U') IS NULL
|
||||
OR OBJECT_ID(N'dbo.Tra_SolicitudesPagos', N'U') IS NULL
|
||||
OR OBJECT_ID(N'dbo.Vta_Pagos', N'U') IS NULL
|
||||
OR COL_LENGTH(N'dbo.Tra_Pagos', N'CveTramitePago') IS NULL
|
||||
OR COL_LENGTH(N'dbo.Vta_Pagos', N'CvePago') IS NULL
|
||||
THROW 51202, N'No se encontró la estructura de origen revisada.', 1;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM sys.objects
|
||||
WHERE schema_id = SCHEMA_ID(N'dbo')
|
||||
AND name IN
|
||||
(
|
||||
N'Tra_TiposTramitePagos', N'Tra_TiposTramitePagosDetalle',
|
||||
N'Tra_SolicitudesPago', N'Gral_UnidadesCobro',
|
||||
N'Gral_UnidadesCobroValores', N'Tra_TiposSolicitudPago',
|
||||
N'Tra_SolicitudesPagoDetalle', N'Tra_SolicitudesPagoParcialidades',
|
||||
N'Tra_PagosAplicaciones', N'Tra_SolicitudesPagoConvenio',
|
||||
N'Tra_SolicitudesPagoConvenioOrigen',
|
||||
N'Tra_SolicitudesPagoConvenioOrigenDetalle',
|
||||
N'Tra_SolicitudesPagoRequeridoBitacora', N'Tra_PagosCfdi'
|
||||
)
|
||||
)
|
||||
THROW 51203, N'Ya existen objetos destino; revise si la migración fue aplicada.', 1;
|
||||
|
||||
DECLARE @TablaPlantillas int = OBJECT_ID(N'dbo.Tra_Pagos');
|
||||
DECLARE @TablaDetallePlantillas int = OBJECT_ID(N'dbo.Tra_PagosDetalle');
|
||||
DECLARE @TablaSolicitudes int = OBJECT_ID(N'dbo.Tra_SolicitudesPagos');
|
||||
DECLARE @TablaAbonos int = OBJECT_ID(N'dbo.Vta_Pagos');
|
||||
DECLARE @Relaciones TABLE (Clave int PRIMARY KEY, Tabla int, Referencia int);
|
||||
INSERT INTO @Relaciones (Clave, Tabla, Referencia)
|
||||
SELECT object_id, parent_object_id, referenced_object_id
|
||||
FROM sys.foreign_keys
|
||||
WHERE parent_object_id IN
|
||||
(@TablaPlantillas, @TablaDetallePlantillas, @TablaSolicitudes, @TablaAbonos)
|
||||
OR referenced_object_id IN
|
||||
(@TablaPlantillas, @TablaDetallePlantillas, @TablaSolicitudes, @TablaAbonos);
|
||||
|
||||
-- Bloquear el origen durante toda la instalación coordinada.
|
||||
DECLARE @CantidadPlantillas bigint, @CantidadDetalles bigint;
|
||||
DECLARE @CantidadSolicitudes bigint, @CantidadAbonos bigint;
|
||||
SELECT @CantidadPlantillas = COUNT_BIG(*) FROM dbo.Tra_Pagos WITH (TABLOCKX, HOLDLOCK);
|
||||
SELECT @CantidadDetalles = COUNT_BIG(*) FROM dbo.Tra_PagosDetalle WITH (TABLOCKX, HOLDLOCK);
|
||||
SELECT @CantidadSolicitudes = COUNT_BIG(*) FROM dbo.Tra_SolicitudesPagos WITH (TABLOCKX, HOLDLOCK);
|
||||
SELECT @CantidadAbonos = COUNT_BIG(*) FROM dbo.Vta_Pagos WITH (TABLOCKX, HOLDLOCK);
|
||||
IF @CantidadAbonos <> 0
|
||||
THROW 51204, N'Existen abonos que requieren conciliación de conversión y aplicaciones.', 1;
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM dbo.Gral_Monedas WHERE Abreviatura = 'MXN')
|
||||
OR NOT EXISTS (SELECT 1 FROM dbo.Gral_Monedas WHERE Abreviatura = 'USD')
|
||||
OR EXISTS
|
||||
(
|
||||
SELECT Abreviatura FROM dbo.Gral_Monedas
|
||||
GROUP BY Abreviatura HAVING COUNT(*) > 1
|
||||
)
|
||||
THROW 51205, N'Las monedas existentes no permiten una correspondencia inequívoca.', 1;
|
||||
|
||||
SELECT
|
||||
SP.CveSolicitudPago, SP.CveSolicitud, SP.CveTramitePago, SP.CveVenta,
|
||||
S.CveCliente, S.CveFraccionamiento, S.CveFraccionamientoEtapa, S.CveTipoTramite,
|
||||
P.Nombre AS Descripcion, P.EsRequerido, V.CveMoneda,
|
||||
CONVERT(decimal(19, 6), V.Total) AS Importe,
|
||||
V.Fecha AS FechaGeneracion, V.FechaVencimiento2 AS FechaVencimiento,
|
||||
SP.FechaAlta, SP.CveUsuario
|
||||
INTO #PagosOrigenSolicitudes
|
||||
FROM dbo.Tra_SolicitudesPagos AS SP
|
||||
INNER JOIN dbo.Tra_Solicitudes AS S ON S.CveSolicitud = SP.CveSolicitud
|
||||
INNER JOIN dbo.Ventas AS V WITH (HOLDLOCK) ON V.CveVenta = SP.CveVenta
|
||||
INNER JOIN dbo.Tra_Pagos AS P ON P.CveTramitePago = SP.CveTramitePago
|
||||
WHERE V.CveCliente = S.CveCliente AND P.CveTipoTramite = S.CveTipoTramite;
|
||||
|
||||
IF (SELECT COUNT_BIG(*) FROM #PagosOrigenSolicitudes) <> @CantidadSolicitudes
|
||||
OR EXISTS
|
||||
(
|
||||
SELECT 1 FROM #PagosOrigenSolicitudes
|
||||
WHERE Importe <= 0 OR FechaVencimiento IS NULL
|
||||
)
|
||||
THROW 51206, N'Existen obligaciones con contexto, importe o vencimiento por conciliar.', 1;
|
||||
|
||||
SELECT
|
||||
O.CveSolicitudPago, D.CveVentaDetalle, D.CvePS,
|
||||
PS.PS AS Descripcion, D.Cantidad,
|
||||
CONVERT(decimal(19, 6),
|
||||
D.Importe + D.IVA + ISNULL(D.IEPS, 0)
|
||||
- ISNULL(D.ImporteRetIVA, 0) - ISNULL(D.ImporteRetISR, 0)) AS Importe
|
||||
INTO #PagosOrigenDetalle
|
||||
FROM #PagosOrigenSolicitudes AS O
|
||||
INNER JOIN dbo.VentasDetalle AS D WITH (HOLDLOCK) ON D.CveVenta = O.CveVenta
|
||||
INNER JOIN dbo.ProductosServicios AS PS ON PS.CvePS = D.CvePS;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1 FROM #PagosOrigenDetalle
|
||||
WHERE Cantidad <= 0 OR Importe < 0
|
||||
)
|
||||
OR EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM #PagosOrigenSolicitudes AS O
|
||||
OUTER APPLY
|
||||
(
|
||||
SELECT SUM(D.Importe) AS Importe
|
||||
FROM #PagosOrigenDetalle AS D
|
||||
WHERE D.CveSolicitudPago = O.CveSolicitudPago
|
||||
) AS T
|
||||
WHERE T.Importe IS NULL OR T.Importe <> O.Importe
|
||||
)
|
||||
THROW 51207, N'El detalle de venta no concilia con el total de la obligación.', 1;
|
||||
|
||||
-- La plantilla actual obtiene costo vigente e IVA 16% del PA existente.
|
||||
-- No convertir esta regla de migración en una tasa fiscal para futuros cobros.
|
||||
IF OBJECT_DEFINITION(OBJECT_ID(N'dbo.PA_Vta_TramiteConceptoList'))
|
||||
NOT LIKE N'%@PorcentajeIVA decimal(9, 6) = 0.16%'
|
||||
OR OBJECT_DEFINITION(OBJECT_ID(N'dbo.PA_Vta_TramiteConceptoList')) IS NULL
|
||||
THROW 51208, N'Cambió la regla de cálculo de la plantilla; revise su migración.', 1;
|
||||
|
||||
SELECT
|
||||
D.CveTramitePagoDetalle, D.CveTramitePago, D.Cantidad, CT.CveMoneda,
|
||||
CONVERT(decimal(19, 6), CT.Importe + ROUND(CT.Importe * 0.16, 2)) AS PrecioUnitario
|
||||
INTO #PagosOrigenPlantilla
|
||||
FROM dbo.Tra_PagosDetalle AS D
|
||||
INNER JOIN dbo.Tra_Pagos AS P ON P.CveTramitePago = D.CveTramitePago
|
||||
CROSS APPLY
|
||||
(
|
||||
SELECT TOP (1) C.CveMoneda, C.Importe
|
||||
FROM dbo.Tra_CostosTramite AS C
|
||||
WHERE C.CveTipoTramite = P.CveTipoTramite AND C.CvePS = D.CvePS
|
||||
AND C.EsActivo = 1
|
||||
AND (C.FechaInicioVigencia IS NULL OR C.FechaInicioVigencia <= CONVERT(date, GETDATE()))
|
||||
AND (C.FechaFinVigencia IS NULL OR C.FechaFinVigencia >= CONVERT(date, GETDATE()))
|
||||
ORDER BY ISNULL(C.FechaInicioVigencia, CONVERT(date, '19000101')) DESC, C.CveCostoTramite DESC
|
||||
) AS CT;
|
||||
|
||||
IF (SELECT COUNT_BIG(*) FROM #PagosOrigenPlantilla) <> @CantidadDetalles
|
||||
OR EXISTS (SELECT 1 FROM #PagosOrigenPlantilla WHERE Cantidad <> 1 OR PrecioUnitario < 0)
|
||||
OR EXISTS
|
||||
(
|
||||
SELECT CveTramitePago FROM #PagosOrigenPlantilla
|
||||
GROUP BY CveTramitePago HAVING COUNT(DISTINCT CveMoneda) <> 1
|
||||
)
|
||||
OR EXISTS
|
||||
(
|
||||
SELECT 1 FROM dbo.Tra_Pagos AS P
|
||||
WHERE NOT EXISTS
|
||||
(
|
||||
SELECT 1 FROM #PagosOrigenPlantilla AS D
|
||||
WHERE D.CveTramitePago = P.CveTramitePago
|
||||
)
|
||||
)
|
||||
THROW 51209, N'La configuración de cobros requiere conciliación de costos, cantidades o monedas.', 1;
|
||||
|
||||
SELECT CveCfdiDocumento, Total, Estado, CveOrigen, TipoOrigen,
|
||||
HASHBYTES('SHA2_256', XmlSinTimbrar) AS HuellaXml
|
||||
INTO #PagosOrigenCfdi
|
||||
FROM dbo.Fac_CfdiDocumentos WITH (HOLDLOCK);
|
||||
|
||||
EXEC sys.sp_rename N'dbo.Tra_Pagos', N'Tra_TiposTramitePagos';
|
||||
EXEC sys.sp_rename N'dbo.Tra_PagosDetalle', N'Tra_TiposTramitePagosDetalle';
|
||||
EXEC sys.sp_rename N'dbo.Tra_SolicitudesPagos', N'Tra_SolicitudesPago';
|
||||
EXEC sys.sp_rename N'dbo.Vta_Pagos', N'Tra_Pagos';
|
||||
|
||||
-- Fase 1: lote separado para resolver los nuevos nombres y columnas.
|
||||
EXEC sys.sp_executesql N'CREATE TABLE dbo.Gral_UnidadesCobro
|
||||
(
|
||||
CveUnidadCobro int IDENTITY(1, 1) NOT NULL CONSTRAINT PK_Gral_UnidadesCobro PRIMARY KEY,
|
||||
Codigo varchar(10) COLLATE Modern_Spanish_CI_AS NOT NULL,
|
||||
Nombre varchar(100) COLLATE Modern_Spanish_CS_AS NOT NULL,
|
||||
EsMoneda bit NOT NULL,
|
||||
RequiereConversion bit NOT NULL,
|
||||
CveMoneda int NULL,
|
||||
Activo bit NOT NULL CONSTRAINT DF_Gral_UnidadesCobro_Activo DEFAULT (1),
|
||||
CONSTRAINT UQ_Gral_UnidadesCobro_Codigo UNIQUE (Codigo),
|
||||
CONSTRAINT FK_Gral_UnidadesCobro_Moneda FOREIGN KEY (CveMoneda)
|
||||
REFERENCES dbo.Gral_Monedas (CveMoneda),
|
||||
CONSTRAINT CK_Gral_UnidadesCobro_Moneda CHECK
|
||||
((EsMoneda = 1 AND CveMoneda IS NOT NULL) OR (EsMoneda = 0 AND CveMoneda IS NULL))
|
||||
);
|
||||
CREATE UNIQUE INDEX UX_Gral_UnidadesCobro_Moneda
|
||||
ON dbo.Gral_UnidadesCobro (CveMoneda) WHERE CveMoneda IS NOT NULL;
|
||||
|
||||
INSERT INTO dbo.Gral_UnidadesCobro
|
||||
(Codigo, Nombre, EsMoneda, RequiereConversion, CveMoneda, Activo)
|
||||
SELECT Abreviatura, Moneda, 1, CASE WHEN Abreviatura = ''MXN'' THEN 0 ELSE 1 END,
|
||||
CveMoneda, Estatus
|
||||
FROM dbo.Gral_Monedas;
|
||||
|
||||
INSERT INTO dbo.Gral_UnidadesCobro (Codigo, Nombre, EsMoneda, RequiereConversion)
|
||||
VALUES (''UMA'', ''Unidad de Medida y Actualización'', 0, 1),
|
||||
(''UDI'', ''Unidad de Inversión'', 0, 1);
|
||||
|
||||
CREATE TABLE dbo.Gral_UnidadesCobroValores
|
||||
(
|
||||
CveUnidadCobroValor int IDENTITY(1, 1) NOT NULL CONSTRAINT PK_Gral_UnidadesCobroValores PRIMARY KEY,
|
||||
CveUnidadCobro int NOT NULL,
|
||||
FechaVigencia date NOT NULL,
|
||||
ValorMXN decimal(19, 8) NOT NULL,
|
||||
Fuente varchar(500) COLLATE Modern_Spanish_CS_AS NOT NULL,
|
||||
CveUsuarioRegistro int NOT NULL,
|
||||
FechaRegistro datetime2(0) NOT NULL CONSTRAINT DF_Gral_UnidadesCobroValores_Fecha DEFAULT (SYSDATETIME()),
|
||||
CONSTRAINT FK_Gral_UnidadesCobroValores_Unidad FOREIGN KEY (CveUnidadCobro)
|
||||
REFERENCES dbo.Gral_UnidadesCobro (CveUnidadCobro),
|
||||
CONSTRAINT FK_Gral_UnidadesCobroValores_Usuario FOREIGN KEY (CveUsuarioRegistro)
|
||||
REFERENCES dbo.Sis_Usuarios (CveUsuario),
|
||||
CONSTRAINT UQ_Gral_UnidadesCobroValores_Vigencia UNIQUE (CveUnidadCobro, FechaVigencia),
|
||||
CONSTRAINT UQ_Gral_UnidadesCobroValores_Unidad UNIQUE (CveUnidadCobroValor, CveUnidadCobro),
|
||||
CONSTRAINT CK_Gral_UnidadesCobroValores_Valor CHECK (ValorMXN > 0)
|
||||
);
|
||||
|
||||
CREATE TABLE dbo.Tra_TiposSolicitudPago
|
||||
(
|
||||
CveTipoSolicitudPago int IDENTITY(1, 1) NOT NULL CONSTRAINT PK_Tra_TiposSolicitudPago PRIMARY KEY,
|
||||
Codigo varchar(30) COLLATE Modern_Spanish_CI_AS NOT NULL,
|
||||
TipoSolicitudPago varchar(100) COLLATE Modern_Spanish_CS_AS NOT NULL,
|
||||
Activo bit NOT NULL CONSTRAINT DF_Tra_TiposSolicitudPago_Activo DEFAULT (1),
|
||||
CONSTRAINT UQ_Tra_TiposSolicitudPago_Codigo UNIQUE (Codigo)
|
||||
);
|
||||
-- Claves iniciales indicadas por la especificación; identidad nueva sin datos previos.
|
||||
INSERT INTO dbo.Tra_TiposSolicitudPago (Codigo, TipoSolicitudPago)
|
||||
VALUES (''NORMAL'', ''Normal''), (''CONVENIO'', ''Convenio'');
|
||||
|
||||
ALTER TABLE dbo.Tra_TiposTramitePagos ADD
|
||||
CveUnidadCobro int NULL,
|
||||
Importe decimal(19, 6) NULL;
|
||||
ALTER TABLE dbo.Tra_TiposTramitePagosDetalle ADD
|
||||
Descripcion varchar(1000) COLLATE Modern_Spanish_CS_AS NULL,
|
||||
PrecioUnitario decimal(19, 6) NULL,
|
||||
CveUnidadCobro int NULL,
|
||||
Importe decimal(19, 6) NULL;
|
||||
|
||||
ALTER TABLE dbo.Tra_SolicitudesPago ADD
|
||||
CveTipoSolicitudPago int NULL,
|
||||
CveCliente int NULL,
|
||||
CveFraccionamiento int NULL,
|
||||
CveFraccionamientoEtapa int NULL,
|
||||
CveTipoTramite int NULL,
|
||||
Descripcion varchar(1000) COLLATE Modern_Spanish_CS_AS NULL,
|
||||
Importe decimal(19, 6) NULL,
|
||||
CveUnidadCobro int NULL,
|
||||
EsRequerido bit NULL,
|
||||
FechaGeneracion datetime2(0) NULL,
|
||||
EstadoAdministrativo varchar(20) COLLATE Modern_Spanish_CS_AS NOT NULL
|
||||
CONSTRAINT DF_Tra_SolicitudesPago_Estado DEFAULT (''ACTIVO''),
|
||||
CveUsuarioModificacion int NULL,
|
||||
FechaModificacion datetime2(0) NULL;
|
||||
';
|
||||
|
||||
-- Fase 2: lote separado para resolver los nuevos nombres y columnas.
|
||||
EXEC sys.sp_executesql N'UPDATE D
|
||||
SET Descripcion = PS.PS,
|
||||
PrecioUnitario = O.PrecioUnitario,
|
||||
CveUnidadCobro = U.CveUnidadCobro,
|
||||
Importe = ROUND(O.Cantidad * O.PrecioUnitario, 6)
|
||||
FROM dbo.Tra_TiposTramitePagosDetalle AS D
|
||||
INNER JOIN #PagosOrigenPlantilla AS O ON O.CveTramitePagoDetalle = D.CveTramitePagoDetalle
|
||||
INNER JOIN dbo.Gral_UnidadesCobro AS U ON U.CveMoneda = O.CveMoneda
|
||||
INNER JOIN dbo.ProductosServicios AS PS ON PS.CvePS = D.CvePS;
|
||||
|
||||
;WITH Totales AS
|
||||
(
|
||||
SELECT CveTramitePago, MAX(CveUnidadCobro) AS CveUnidadCobro, SUM(Importe) AS Importe
|
||||
FROM dbo.Tra_TiposTramitePagosDetalle
|
||||
GROUP BY CveTramitePago
|
||||
)
|
||||
UPDATE P
|
||||
SET CveUnidadCobro = T.CveUnidadCobro,
|
||||
Importe = T.Importe
|
||||
FROM dbo.Tra_TiposTramitePagos AS P
|
||||
INNER JOIN Totales AS T ON T.CveTramitePago = P.CveTramitePago;
|
||||
|
||||
UPDATE S
|
||||
SET CveTipoSolicitudPago = T.CveTipoSolicitudPago,
|
||||
CveCliente = O.CveCliente,
|
||||
CveFraccionamiento = O.CveFraccionamiento,
|
||||
CveFraccionamientoEtapa = O.CveFraccionamientoEtapa,
|
||||
CveTipoTramite = O.CveTipoTramite,
|
||||
Descripcion = O.Descripcion,
|
||||
Importe = O.Importe,
|
||||
CveUnidadCobro = U.CveUnidadCobro,
|
||||
EsRequerido = O.EsRequerido,
|
||||
FechaGeneracion = O.FechaGeneracion
|
||||
FROM dbo.Tra_SolicitudesPago AS S
|
||||
INNER JOIN #PagosOrigenSolicitudes AS O ON O.CveSolicitudPago = S.CveSolicitudPago
|
||||
INNER JOIN dbo.Gral_UnidadesCobro AS U ON U.CveMoneda = O.CveMoneda
|
||||
INNER JOIN dbo.Tra_TiposSolicitudPago AS T ON T.Codigo = ''NORMAL'';
|
||||
|
||||
ALTER TABLE dbo.Tra_TiposTramitePagos ALTER COLUMN CveUnidadCobro int NOT NULL;
|
||||
ALTER TABLE dbo.Tra_TiposTramitePagos ALTER COLUMN Importe decimal(19, 6) NOT NULL;
|
||||
ALTER TABLE dbo.Tra_TiposTramitePagos ADD
|
||||
CONSTRAINT FK_Tra_TiposTramitePagos_Unidad FOREIGN KEY (CveUnidadCobro)
|
||||
REFERENCES dbo.Gral_UnidadesCobro (CveUnidadCobro),
|
||||
CONSTRAINT UQ_Tra_TiposTramitePagos_Unidad UNIQUE (CveTramitePago, CveUnidadCobro),
|
||||
CONSTRAINT CK_Tra_TiposTramitePagos_Importe CHECK (Importe >= 0);
|
||||
ALTER TABLE dbo.Tra_TiposTramitePagosDetalle ALTER COLUMN Descripcion varchar(1000) COLLATE Modern_Spanish_CS_AS NOT NULL;
|
||||
ALTER TABLE dbo.Tra_TiposTramitePagosDetalle ALTER COLUMN PrecioUnitario decimal(19, 6) NOT NULL;
|
||||
ALTER TABLE dbo.Tra_TiposTramitePagosDetalle ALTER COLUMN CveUnidadCobro int NOT NULL;
|
||||
ALTER TABLE dbo.Tra_TiposTramitePagosDetalle ALTER COLUMN Importe decimal(19, 6) NOT NULL;
|
||||
ALTER TABLE dbo.Tra_TiposTramitePagosDetalle ADD
|
||||
CONSTRAINT FK_Tra_TiposTramitePagosDetalle_Unidad FOREIGN KEY (CveTramitePago, CveUnidadCobro)
|
||||
REFERENCES dbo.Tra_TiposTramitePagos (CveTramitePago, CveUnidadCobro),
|
||||
CONSTRAINT CK_Tra_TiposTramitePagosDetalle_Importe CHECK
|
||||
(PrecioUnitario >= 0 AND Importe >= 0 AND Importe = ROUND(Cantidad * PrecioUnitario, 6));
|
||||
|
||||
ALTER TABLE dbo.Tra_SolicitudesPago ALTER COLUMN CveTipoSolicitudPago int NOT NULL;
|
||||
ALTER TABLE dbo.Tra_SolicitudesPago ALTER COLUMN CveCliente int NOT NULL;
|
||||
ALTER TABLE dbo.Tra_SolicitudesPago ALTER COLUMN CveFraccionamiento int NOT NULL;
|
||||
ALTER TABLE dbo.Tra_SolicitudesPago ALTER COLUMN Descripcion varchar(1000) COLLATE Modern_Spanish_CS_AS NOT NULL;
|
||||
ALTER TABLE dbo.Tra_SolicitudesPago ALTER COLUMN Importe decimal(19, 6) NOT NULL;
|
||||
ALTER TABLE dbo.Tra_SolicitudesPago ALTER COLUMN CveUnidadCobro int NOT NULL;
|
||||
ALTER TABLE dbo.Tra_SolicitudesPago ALTER COLUMN EsRequerido bit NOT NULL;
|
||||
ALTER TABLE dbo.Tra_SolicitudesPago ALTER COLUMN FechaGeneracion datetime2(0) NOT NULL;
|
||||
-- Se conservan FechaAlta y CveUsuario como fecha/usuario de registro reales.
|
||||
-- No se inventa un autor histórico a partir del usuario que ejecuta la migración.
|
||||
ALTER TABLE dbo.Tra_SolicitudesPago DROP CONSTRAINT UQ_Tra_SolicitudesPagos_Venta;
|
||||
ALTER TABLE dbo.Tra_SolicitudesPago DROP CONSTRAINT UQ_Tra_SolicitudesPagos_SolicitudPago;
|
||||
DROP INDEX IX_Tra_SolicitudesPagos_Solicitud ON dbo.Tra_SolicitudesPago;
|
||||
ALTER TABLE dbo.Tra_SolicitudesPago ALTER COLUMN CveSolicitud int NULL;
|
||||
ALTER TABLE dbo.Tra_SolicitudesPago ALTER COLUMN CveTramitePago int NULL;
|
||||
ALTER TABLE dbo.Tra_SolicitudesPago ALTER COLUMN CveVenta int NULL;
|
||||
CREATE INDEX IX_Tra_SolicitudesPagos_Solicitud
|
||||
ON dbo.Tra_SolicitudesPago (CveSolicitud)
|
||||
INCLUDE (CveTramitePago, CveVenta, FechaAlta);
|
||||
CREATE UNIQUE INDEX UX_Tra_SolicitudesPago_Venta
|
||||
ON dbo.Tra_SolicitudesPago (CveVenta) WHERE CveVenta IS NOT NULL;
|
||||
CREATE UNIQUE INDEX UX_Tra_SolicitudesPago_PlantillaSolicitud
|
||||
ON dbo.Tra_SolicitudesPago (CveSolicitud, CveTramitePago)
|
||||
WHERE CveSolicitud IS NOT NULL AND CveTramitePago IS NOT NULL;
|
||||
ALTER TABLE dbo.Tra_SolicitudesPago ADD
|
||||
CONSTRAINT FK_Tra_SolicitudesPago_Tipo FOREIGN KEY (CveTipoSolicitudPago)
|
||||
REFERENCES dbo.Tra_TiposSolicitudPago (CveTipoSolicitudPago),
|
||||
CONSTRAINT FK_Tra_SolicitudesPago_Cliente FOREIGN KEY (CveCliente)
|
||||
REFERENCES dbo.Clientes (CveCliente),
|
||||
CONSTRAINT FK_Tra_SolicitudesPago_Fraccionamiento FOREIGN KEY (CveFraccionamiento)
|
||||
REFERENCES dbo.Fraccionamientos (CveFraccionamiento),
|
||||
CONSTRAINT FK_Tra_SolicitudesPago_Etapa FOREIGN KEY (CveFraccionamientoEtapa)
|
||||
REFERENCES dbo.FraccionamientosEtapas (CveFraccionamientoEtapa),
|
||||
CONSTRAINT FK_Tra_SolicitudesPago_TipoTramite FOREIGN KEY (CveTipoTramite)
|
||||
REFERENCES dbo.Tra_TiposTramite (CveTipoTramite),
|
||||
CONSTRAINT FK_Tra_SolicitudesPago_Unidad FOREIGN KEY (CveUnidadCobro)
|
||||
REFERENCES dbo.Gral_UnidadesCobro (CveUnidadCobro),
|
||||
CONSTRAINT FK_Tra_SolicitudesPago_UsuarioModificacion FOREIGN KEY (CveUsuarioModificacion)
|
||||
REFERENCES dbo.Sis_Usuarios (CveUsuario),
|
||||
CONSTRAINT UQ_Tra_SolicitudesPago_Unidad UNIQUE (CveSolicitudPago, CveUnidadCobro),
|
||||
CONSTRAINT CK_Tra_SolicitudesPago_Importe CHECK (Importe >= 0),
|
||||
CONSTRAINT CK_Tra_SolicitudesPago_Estado CHECK
|
||||
(EstadoAdministrativo IN (''ACTIVO'', ''CANCELADO'', ''SUSTITUIDO''));
|
||||
CREATE INDEX IX_Tra_SolicitudesPago_ClienteEstado
|
||||
ON dbo.Tra_SolicitudesPago (CveCliente, EstadoAdministrativo, FechaGeneracion)
|
||||
INCLUDE (CveFraccionamiento, CveFraccionamientoEtapa, CveSolicitud, Importe, CveUnidadCobro);
|
||||
';
|
||||
|
||||
-- Fase 3: lote separado para resolver los nuevos nombres y columnas.
|
||||
EXEC sys.sp_executesql N'CREATE TABLE dbo.Tra_SolicitudesPagoDetalle
|
||||
(
|
||||
CveSolicitudPagoDetalle int IDENTITY(1, 1) NOT NULL CONSTRAINT PK_Tra_SolicitudesPagoDetalle PRIMARY KEY,
|
||||
CveSolicitudPago int NOT NULL,
|
||||
CvePS int NOT NULL,
|
||||
Descripcion varchar(1000) COLLATE Modern_Spanish_CS_AS NOT NULL,
|
||||
Cantidad decimal(18, 4) NOT NULL,
|
||||
PrecioUnitario decimal(19, 6) NOT NULL,
|
||||
CveUnidadCobro int NOT NULL,
|
||||
Importe decimal(19, 6) NOT NULL,
|
||||
CveVentaDetalleOrigen int NULL,
|
||||
CONSTRAINT FK_Tra_SolicitudesPagoDetalle_SolicitudUnidad FOREIGN KEY (CveSolicitudPago, CveUnidadCobro)
|
||||
REFERENCES dbo.Tra_SolicitudesPago (CveSolicitudPago, CveUnidadCobro),
|
||||
CONSTRAINT FK_Tra_SolicitudesPagoDetalle_Producto FOREIGN KEY (CvePS)
|
||||
REFERENCES dbo.ProductosServicios (CvePS),
|
||||
CONSTRAINT FK_Tra_SolicitudesPagoDetalle_VentaOrigen FOREIGN KEY (CveVentaDetalleOrigen)
|
||||
REFERENCES dbo.VentasDetalle (CveVentaDetalle),
|
||||
CONSTRAINT UQ_Tra_SolicitudesPagoDetalle_Solicitud UNIQUE (CveSolicitudPagoDetalle, CveSolicitudPago),
|
||||
CONSTRAINT CK_Tra_SolicitudesPagoDetalle_Importes CHECK
|
||||
(Cantidad > 0 AND PrecioUnitario >= 0 AND Importe >= 0)
|
||||
);
|
||||
CREATE INDEX IX_Tra_SolicitudesPagoDetalle_Solicitud
|
||||
ON dbo.Tra_SolicitudesPagoDetalle (CveSolicitudPago, CvePS);
|
||||
CREATE UNIQUE INDEX UX_Tra_SolicitudesPagoDetalle_VentaOrigen
|
||||
ON dbo.Tra_SolicitudesPagoDetalle (CveVentaDetalleOrigen) WHERE CveVentaDetalleOrigen IS NOT NULL;
|
||||
|
||||
CREATE TABLE dbo.Tra_SolicitudesPagoParcialidades
|
||||
(
|
||||
CveSolicitudPagoParcialidad int IDENTITY(1, 1) NOT NULL CONSTRAINT PK_Tra_SolicitudesPagoParcialidades PRIMARY KEY,
|
||||
CveSolicitudPago int NOT NULL,
|
||||
NumeroParcialidad int NOT NULL,
|
||||
FechaVencimiento date NOT NULL,
|
||||
Importe decimal(19, 6) NOT NULL,
|
||||
CveUnidadCobro int NOT NULL,
|
||||
FechaProrroga date NULL,
|
||||
CONSTRAINT FK_Tra_SolicitudesPagoParcialidades_SolicitudUnidad FOREIGN KEY (CveSolicitudPago, CveUnidadCobro)
|
||||
REFERENCES dbo.Tra_SolicitudesPago (CveSolicitudPago, CveUnidadCobro),
|
||||
CONSTRAINT UQ_Tra_SolicitudesPagoParcialidades_Numero UNIQUE (CveSolicitudPago, NumeroParcialidad),
|
||||
CONSTRAINT UQ_Tra_SolicitudesPagoParcialidades_Solicitud UNIQUE (CveSolicitudPagoParcialidad, CveSolicitudPago),
|
||||
CONSTRAINT CK_Tra_SolicitudesPagoParcialidades_Importe CHECK (Importe >= 0 AND NumeroParcialidad > 0),
|
||||
CONSTRAINT CK_Tra_SolicitudesPagoParcialidades_Prorroga CHECK
|
||||
(FechaProrroga IS NULL OR FechaProrroga >= FechaVencimiento)
|
||||
);
|
||||
CREATE INDEX IX_Tra_SolicitudesPagoParcialidades_Vencimiento
|
||||
ON dbo.Tra_SolicitudesPagoParcialidades (FechaVencimiento, CveSolicitudPago)
|
||||
INCLUDE (FechaProrroga, Importe, CveUnidadCobro);
|
||||
|
||||
INSERT INTO dbo.Tra_SolicitudesPagoDetalle
|
||||
(CveSolicitudPago, CvePS, Descripcion, Cantidad, PrecioUnitario,
|
||||
CveUnidadCobro, Importe, CveVentaDetalleOrigen)
|
||||
SELECT D.CveSolicitudPago, D.CvePS, D.Descripcion, D.Cantidad,
|
||||
CONVERT(decimal(19, 6), D.Importe / D.Cantidad),
|
||||
S.CveUnidadCobro, D.Importe, D.CveVentaDetalle
|
||||
FROM #PagosOrigenDetalle AS D
|
||||
INNER JOIN dbo.Tra_SolicitudesPago AS S ON S.CveSolicitudPago = D.CveSolicitudPago;
|
||||
|
||||
INSERT INTO dbo.Tra_SolicitudesPagoParcialidades
|
||||
(CveSolicitudPago, NumeroParcialidad, FechaVencimiento, Importe, CveUnidadCobro)
|
||||
SELECT O.CveSolicitudPago, 1, O.FechaVencimiento, O.Importe, S.CveUnidadCobro
|
||||
FROM #PagosOrigenSolicitudes AS O
|
||||
INNER JOIN dbo.Tra_SolicitudesPago AS S ON S.CveSolicitudPago = O.CveSolicitudPago;
|
||||
|
||||
-- La restricción anterior impedía más de un abono por solicitud/plantilla.
|
||||
DROP INDEX UX_Vta_Pagos_SolicitudTramitePagoActivo ON dbo.Tra_Pagos;
|
||||
DROP INDEX IX_Vta_Pagos_Cliente_Venta ON dbo.Tra_Pagos;
|
||||
ALTER TABLE dbo.Tra_Pagos ALTER COLUMN CveVenta int NULL;
|
||||
ALTER TABLE dbo.Tra_Pagos ALTER COLUMN CveTramitePago int NULL;
|
||||
ALTER TABLE dbo.Tra_Pagos ALTER COLUMN CveMoneda int NULL;
|
||||
ALTER TABLE dbo.Tra_Pagos ALTER COLUMN Importe decimal(19, 6) NOT NULL;
|
||||
CREATE INDEX IX_Vta_Pagos_Cliente_Venta
|
||||
ON dbo.Tra_Pagos (CveCliente, CveVenta, EsActivo);
|
||||
-- Cero abonos fue comprobado con bloqueo; no se inventan factores históricos.
|
||||
ALTER TABLE dbo.Tra_Pagos ADD
|
||||
CveUnidadCobro int NOT NULL,
|
||||
CveUnidadCobroValor int NULL,
|
||||
ValorConversion decimal(19, 8) NOT NULL,
|
||||
ImporteMXN decimal(19, 6) NOT NULL;
|
||||
ALTER TABLE dbo.Tra_Pagos ADD
|
||||
CONSTRAINT FK_Tra_Pagos_Unidad FOREIGN KEY (CveUnidadCobro)
|
||||
REFERENCES dbo.Gral_UnidadesCobro (CveUnidadCobro),
|
||||
CONSTRAINT FK_Tra_Pagos_Equivalencia FOREIGN KEY (CveUnidadCobroValor, CveUnidadCobro)
|
||||
REFERENCES dbo.Gral_UnidadesCobroValores (CveUnidadCobroValor, CveUnidadCobro),
|
||||
CONSTRAINT CK_Tra_Pagos_Conversion CHECK
|
||||
(ValorConversion > 0 AND ImporteMXN > 0
|
||||
AND ImporteMXN = CONVERT(decimal(19, 6), ROUND(Importe * ValorConversion, 6)));
|
||||
CREATE INDEX IX_Tra_Pagos_ClienteFecha
|
||||
ON dbo.Tra_Pagos (CveCliente, FechaPago) INCLUDE (Importe, ImporteMXN, CveUnidadCobro, EsActivo);
|
||||
|
||||
CREATE TABLE dbo.Tra_PagosAplicaciones
|
||||
(
|
||||
CvePagoAplicacion int IDENTITY(1, 1) NOT NULL CONSTRAINT PK_Tra_PagosAplicaciones PRIMARY KEY,
|
||||
CvePago int NOT NULL,
|
||||
CveSolicitudPago int NOT NULL,
|
||||
CveSolicitudPagoParcialidad int NOT NULL,
|
||||
CveSolicitudPagoDetalle int NOT NULL,
|
||||
CveUnidadCobro int NOT NULL,
|
||||
ImporteAplicado decimal(19, 6) NOT NULL,
|
||||
ValorConversionObligacion decimal(19, 8) NOT NULL,
|
||||
ImporteAplicadoMXN decimal(19, 6) NOT NULL,
|
||||
ImportePagoConsumido decimal(19, 6) NOT NULL,
|
||||
CveUsuarioRegistro int NOT NULL,
|
||||
FechaRegistro datetime2(0) NOT NULL CONSTRAINT DF_Tra_PagosAplicaciones_Fecha DEFAULT (SYSDATETIME()),
|
||||
CONSTRAINT FK_Tra_PagosAplicaciones_Pago FOREIGN KEY (CvePago)
|
||||
REFERENCES dbo.Tra_Pagos (CvePago),
|
||||
CONSTRAINT FK_Tra_PagosAplicaciones_Parcialidad FOREIGN KEY (CveSolicitudPagoParcialidad, CveSolicitudPago)
|
||||
REFERENCES dbo.Tra_SolicitudesPagoParcialidades (CveSolicitudPagoParcialidad, CveSolicitudPago),
|
||||
CONSTRAINT FK_Tra_PagosAplicaciones_Detalle FOREIGN KEY (CveSolicitudPagoDetalle, CveSolicitudPago)
|
||||
REFERENCES dbo.Tra_SolicitudesPagoDetalle (CveSolicitudPagoDetalle, CveSolicitudPago),
|
||||
CONSTRAINT FK_Tra_PagosAplicaciones_Unidad FOREIGN KEY (CveSolicitudPago, CveUnidadCobro)
|
||||
REFERENCES dbo.Tra_SolicitudesPago (CveSolicitudPago, CveUnidadCobro),
|
||||
CONSTRAINT FK_Tra_PagosAplicaciones_Usuario FOREIGN KEY (CveUsuarioRegistro)
|
||||
REFERENCES dbo.Sis_Usuarios (CveUsuario),
|
||||
CONSTRAINT UQ_Tra_PagosAplicaciones_Destino UNIQUE
|
||||
(CvePago, CveSolicitudPagoParcialidad, CveSolicitudPagoDetalle),
|
||||
CONSTRAINT CK_Tra_PagosAplicaciones_Importes CHECK
|
||||
(ImporteAplicado > 0 AND ValorConversionObligacion > 0
|
||||
AND ImporteAplicadoMXN > 0 AND ImportePagoConsumido > 0
|
||||
AND ImporteAplicadoMXN = CONVERT(decimal(19, 6), ROUND(ImporteAplicado * ValorConversionObligacion, 6)))
|
||||
);
|
||||
CREATE INDEX IX_Tra_PagosAplicaciones_Parcialidad
|
||||
ON dbo.Tra_PagosAplicaciones (CveSolicitudPagoParcialidad)
|
||||
INCLUDE (CvePago, ImporteAplicado, CveSolicitudPagoDetalle);
|
||||
CREATE INDEX IX_Tra_PagosAplicaciones_Detalle
|
||||
ON dbo.Tra_PagosAplicaciones (CveSolicitudPagoDetalle) INCLUDE (CvePago, ImporteAplicado);
|
||||
|
||||
CREATE TABLE dbo.Tra_SolicitudesPagoRequeridoBitacora
|
||||
(
|
||||
CveSolicitudPagoRequeridoBitacora int IDENTITY(1, 1) NOT NULL
|
||||
CONSTRAINT PK_Tra_SolicitudesPagoRequeridoBitacora PRIMARY KEY,
|
||||
CveSolicitudPago int NOT NULL,
|
||||
ValorAnterior bit NOT NULL,
|
||||
ValorNuevo bit NOT NULL,
|
||||
Observacion varchar(2000) COLLATE Modern_Spanish_CS_AS NOT NULL,
|
||||
CveUsuarioRegistro int NOT NULL,
|
||||
FechaRegistro datetime2(0) NOT NULL CONSTRAINT DF_Tra_SolicitudesPagoRequeridoBitacora_Fecha DEFAULT (SYSDATETIME()),
|
||||
CONSTRAINT FK_Tra_SolicitudesPagoRequeridoBitacora_Solicitud FOREIGN KEY (CveSolicitudPago)
|
||||
REFERENCES dbo.Tra_SolicitudesPago (CveSolicitudPago),
|
||||
CONSTRAINT FK_Tra_SolicitudesPagoRequeridoBitacora_Usuario FOREIGN KEY (CveUsuarioRegistro)
|
||||
REFERENCES dbo.Sis_Usuarios (CveUsuario),
|
||||
CONSTRAINT CK_Tra_SolicitudesPagoRequeridoBitacora_Cambio CHECK
|
||||
(ValorAnterior <> ValorNuevo AND LEN(LTRIM(RTRIM(Observacion))) > 0)
|
||||
);
|
||||
CREATE INDEX IX_Tra_SolicitudesPagoRequeridoBitacora_Solicitud
|
||||
ON dbo.Tra_SolicitudesPagoRequeridoBitacora (CveSolicitudPago, FechaRegistro);
|
||||
';
|
||||
|
||||
-- Fase 4: lote separado para resolver los nuevos nombres y columnas.
|
||||
EXEC sys.sp_executesql N'CREATE TABLE dbo.Tra_SolicitudesPagoConvenio
|
||||
(
|
||||
CveSolicitudPago int NOT NULL CONSTRAINT PK_Tra_SolicitudesPagoConvenio PRIMARY KEY,
|
||||
ImporteSaldoConvenido decimal(19, 6) NOT NULL,
|
||||
Observaciones varchar(2000) COLLATE Modern_Spanish_CS_AS NULL,
|
||||
CveUsuarioRegistro int NOT NULL,
|
||||
FechaRegistro datetime2(0) NOT NULL CONSTRAINT DF_Tra_SolicitudesPagoConvenio_Fecha DEFAULT (SYSDATETIME()),
|
||||
CONSTRAINT FK_Tra_SolicitudesPagoConvenio_Solicitud FOREIGN KEY (CveSolicitudPago)
|
||||
REFERENCES dbo.Tra_SolicitudesPago (CveSolicitudPago),
|
||||
CONSTRAINT FK_Tra_SolicitudesPagoConvenio_Usuario FOREIGN KEY (CveUsuarioRegistro)
|
||||
REFERENCES dbo.Sis_Usuarios (CveUsuario),
|
||||
CONSTRAINT CK_Tra_SolicitudesPagoConvenio_Saldo CHECK (ImporteSaldoConvenido > 0)
|
||||
);
|
||||
|
||||
CREATE TABLE dbo.Tra_SolicitudesPagoConvenioOrigen
|
||||
(
|
||||
CveConvenioOrigen int IDENTITY(1, 1) NOT NULL CONSTRAINT PK_Tra_SolicitudesPagoConvenioOrigen PRIMARY KEY,
|
||||
CveSolicitudPagoConvenio int NOT NULL,
|
||||
CveSolicitudPagoOrigen int NOT NULL,
|
||||
ImporteSaldoOriginal decimal(19, 6) NOT NULL,
|
||||
ImporteTomadoConvenio decimal(19, 6) NOT NULL,
|
||||
CveUnidadCobro int NOT NULL,
|
||||
CONSTRAINT FK_Tra_SolicitudesPagoConvenioOrigen_Convenio FOREIGN KEY (CveSolicitudPagoConvenio)
|
||||
REFERENCES dbo.Tra_SolicitudesPagoConvenio (CveSolicitudPago),
|
||||
CONSTRAINT FK_Tra_SolicitudesPagoConvenioOrigen_UnidadOrigen FOREIGN KEY (CveSolicitudPagoOrigen, CveUnidadCobro)
|
||||
REFERENCES dbo.Tra_SolicitudesPago (CveSolicitudPago, CveUnidadCobro),
|
||||
CONSTRAINT FK_Tra_SolicitudesPagoConvenioOrigen_UnidadConvenio FOREIGN KEY (CveSolicitudPagoConvenio, CveUnidadCobro)
|
||||
REFERENCES dbo.Tra_SolicitudesPago (CveSolicitudPago, CveUnidadCobro),
|
||||
CONSTRAINT UQ_Tra_SolicitudesPagoConvenioOrigen_Origen UNIQUE (CveSolicitudPagoConvenio, CveSolicitudPagoOrigen),
|
||||
CONSTRAINT UQ_Tra_SolicitudesPagoConvenioOrigen_Solicitud UNIQUE (CveConvenioOrigen, CveSolicitudPagoOrigen),
|
||||
CONSTRAINT CK_Tra_SolicitudesPagoConvenioOrigen_Saldo CHECK
|
||||
(CveSolicitudPagoConvenio <> CveSolicitudPagoOrigen
|
||||
AND ImporteTomadoConvenio > 0 AND ImporteSaldoOriginal >= ImporteTomadoConvenio)
|
||||
);
|
||||
CREATE INDEX IX_Tra_SolicitudesPagoConvenioOrigen_Adeudo
|
||||
ON dbo.Tra_SolicitudesPagoConvenioOrigen (CveSolicitudPagoOrigen)
|
||||
INCLUDE (CveSolicitudPagoConvenio, ImporteTomadoConvenio);
|
||||
|
||||
CREATE TABLE dbo.Tra_SolicitudesPagoConvenioOrigenDetalle
|
||||
(
|
||||
CveConvenioOrigenDetalle int IDENTITY(1, 1) NOT NULL CONSTRAINT PK_Tra_SolicitudesPagoConvenioOrigenDetalle PRIMARY KEY,
|
||||
CveConvenioOrigen int NOT NULL,
|
||||
CveSolicitudPagoOrigen int NOT NULL,
|
||||
CveSolicitudPagoDetalleOrigen int NOT NULL,
|
||||
CveSolicitudPagoParcialidadOrigen int NOT NULL,
|
||||
ImporteSaldoOriginal decimal(19, 6) NOT NULL,
|
||||
ImporteTomadoConvenio decimal(19, 6) NOT NULL,
|
||||
CONSTRAINT FK_Tra_SolicitudesPagoConvenioOrigenDetalle_Origen FOREIGN KEY (CveConvenioOrigen, CveSolicitudPagoOrigen)
|
||||
REFERENCES dbo.Tra_SolicitudesPagoConvenioOrigen (CveConvenioOrigen, CveSolicitudPagoOrigen),
|
||||
CONSTRAINT FK_Tra_SolicitudesPagoConvenioOrigenDetalle_Producto FOREIGN KEY (CveSolicitudPagoDetalleOrigen, CveSolicitudPagoOrigen)
|
||||
REFERENCES dbo.Tra_SolicitudesPagoDetalle (CveSolicitudPagoDetalle, CveSolicitudPago),
|
||||
CONSTRAINT FK_Tra_SolicitudesPagoConvenioOrigenDetalle_Parcialidad FOREIGN KEY (CveSolicitudPagoParcialidadOrigen, CveSolicitudPagoOrigen)
|
||||
REFERENCES dbo.Tra_SolicitudesPagoParcialidades (CveSolicitudPagoParcialidad, CveSolicitudPago),
|
||||
CONSTRAINT UQ_Tra_SolicitudesPagoConvenioOrigenDetalle_Origen UNIQUE
|
||||
(CveConvenioOrigen, CveSolicitudPagoDetalleOrigen, CveSolicitudPagoParcialidadOrigen),
|
||||
CONSTRAINT CK_Tra_SolicitudesPagoConvenioOrigenDetalle_Saldo CHECK
|
||||
(ImporteTomadoConvenio > 0 AND ImporteSaldoOriginal >= ImporteTomadoConvenio)
|
||||
);
|
||||
CREATE INDEX IX_Tra_SolicitudesPagoConvenioOrigenDetalle_Producto
|
||||
ON dbo.Tra_SolicitudesPagoConvenioOrigenDetalle (CveSolicitudPagoDetalleOrigen)
|
||||
INCLUDE (CveConvenioOrigen, ImporteTomadoConvenio);
|
||||
CREATE INDEX IX_Tra_SolicitudesPagoConvenioOrigenDetalle_Parcialidad
|
||||
ON dbo.Tra_SolicitudesPagoConvenioOrigenDetalle (CveSolicitudPagoParcialidadOrigen)
|
||||
INCLUDE (CveConvenioOrigen, ImporteTomadoConvenio);
|
||||
';
|
||||
|
||||
-- Fase 5: lote separado para resolver los nuevos nombres y columnas.
|
||||
EXEC sys.sp_executesql N'ALTER TABLE dbo.Fac_CfdiDocumentos ADD
|
||||
OrigenRegistro varchar(10) COLLATE Modern_Spanish_CS_AS NOT NULL
|
||||
CONSTRAINT DF_Fac_CfdiDocumentos_OrigenRegistro DEFAULT (''INTERNO''),
|
||||
UuidExterno uniqueidentifier NULL,
|
||||
FechaTimbradoExterno datetime2(0) NULL,
|
||||
RutaXmlExterno varchar(500) COLLATE Modern_Spanish_CS_AS NULL,
|
||||
HashXmlExterno binary(32) NULL,
|
||||
RutaPdf varchar(500) COLLATE Modern_Spanish_CS_AS NULL,
|
||||
HashPdf binary(32) NULL,
|
||||
ImporteValidado bit NOT NULL CONSTRAINT DF_Fac_CfdiDocumentos_ImporteValidado DEFAULT (0),
|
||||
CveUsuarioValida int NULL,
|
||||
FechaValidacion datetime2(0) NULL;
|
||||
|
||||
-- Un documento externo puede capturarse manualmente sin un borrador de XML.
|
||||
-- Las exigencias del flujo interno se conservan mediante CHECK condicional.
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN CveEmpresa int NULL;
|
||||
DROP INDEX IX_Fac_CfdiDocumentos_Cliente_Fecha ON dbo.Fac_CfdiDocumentos;
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN FechaEmision datetime2(0) NULL;
|
||||
CREATE INDEX IX_Fac_CfdiDocumentos_Cliente_Fecha
|
||||
ON dbo.Fac_CfdiDocumentos (CveCliente, FechaEmision DESC, CveCfdiDocumento DESC);
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN TipoComprobante char(1) COLLATE Modern_Spanish_CS_AS NULL;
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN Exportacion varchar(2) COLLATE Modern_Spanish_CS_AS NULL;
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN LugarExpedicion varchar(5) COLLATE Modern_Spanish_CI_AS NULL;
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN Subtotal decimal(19, 6) NULL;
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN Descuento decimal(19, 6) NULL;
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN TotalImpuestosTrasladados decimal(19, 6) NULL;
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN TotalImpuestosRetenidos decimal(19, 6) NULL;
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN RfcEmisor varchar(13) COLLATE Modern_Spanish_CS_AS NULL;
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN NombreEmisor varchar(300) COLLATE Modern_Spanish_CS_AS NULL;
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN RegimenFiscalEmisor varchar(3) COLLATE Modern_Spanish_CS_AS NULL;
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN RfcReceptor varchar(13) COLLATE Modern_Spanish_CS_AS NULL;
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN NombreReceptor varchar(300) COLLATE Modern_Spanish_CS_AS NULL;
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN DomicilioFiscalReceptor varchar(5) COLLATE Modern_Spanish_CI_AS NULL;
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN RegimenFiscalReceptor varchar(3) COLLATE Modern_Spanish_CS_AS NULL;
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN UsoCfdi varchar(5) COLLATE Modern_Spanish_CS_AS NULL;
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN XmlSinTimbrar varbinary(max) NULL;
|
||||
ALTER TABLE dbo.Fac_CfdiDocumentos ALTER COLUMN HashXmlSinTimbrar binary(32) NULL;
|
||||
';
|
||||
|
||||
-- Fase 6: lote separado para resolver los nuevos nombres y columnas.
|
||||
EXEC sys.sp_executesql N'ALTER TABLE dbo.Fac_CfdiDocumentos ADD
|
||||
CONSTRAINT FK_Fac_CfdiDocumentos_UsuarioValida FOREIGN KEY (CveUsuarioValida)
|
||||
REFERENCES dbo.Sis_Usuarios (CveUsuario),
|
||||
CONSTRAINT CK_Fac_CfdiDocumentos_OrigenRegistro CHECK (OrigenRegistro IN (''INTERNO'', ''EXTERNO'')),
|
||||
CONSTRAINT CK_Fac_CfdiDocumentos_DatosInternos CHECK
|
||||
(
|
||||
OrigenRegistro = ''EXTERNO''
|
||||
OR
|
||||
(
|
||||
CveEmpresa IS NOT NULL AND FechaEmision IS NOT NULL
|
||||
AND TipoComprobante IS NOT NULL AND Exportacion IS NOT NULL
|
||||
AND LugarExpedicion IS NOT NULL AND Subtotal IS NOT NULL
|
||||
AND Descuento IS NOT NULL AND TotalImpuestosTrasladados IS NOT NULL
|
||||
AND TotalImpuestosRetenidos IS NOT NULL AND RfcEmisor IS NOT NULL
|
||||
AND NombreEmisor IS NOT NULL AND RegimenFiscalEmisor IS NOT NULL
|
||||
AND RfcReceptor IS NOT NULL AND NombreReceptor IS NOT NULL
|
||||
AND DomicilioFiscalReceptor IS NOT NULL AND RegimenFiscalReceptor IS NOT NULL
|
||||
AND UsoCfdi IS NOT NULL AND XmlSinTimbrar IS NOT NULL
|
||||
AND HashXmlSinTimbrar IS NOT NULL
|
||||
)
|
||||
),
|
||||
CONSTRAINT CK_Fac_CfdiDocumentos_OrigenXml CHECK
|
||||
(
|
||||
(OrigenRegistro = ''INTERNO'' AND UuidExterno IS NULL AND RutaXmlExterno IS NULL
|
||||
AND HashXmlExterno IS NULL AND FechaTimbradoExterno IS NULL)
|
||||
OR
|
||||
(OrigenRegistro = ''EXTERNO'' AND XmlSinTimbrar IS NULL AND HashXmlSinTimbrar IS NULL
|
||||
AND CveCfdiTimbradoVigente IS NULL)
|
||||
),
|
||||
CONSTRAINT CK_Fac_CfdiDocumentos_Archivos CHECK
|
||||
(
|
||||
((RutaXmlExterno IS NULL AND HashXmlExterno IS NULL)
|
||||
OR (RutaXmlExterno IS NOT NULL AND HashXmlExterno IS NOT NULL))
|
||||
AND
|
||||
((RutaPdf IS NULL AND HashPdf IS NULL)
|
||||
OR (RutaPdf IS NOT NULL AND HashPdf IS NOT NULL))
|
||||
),
|
||||
CONSTRAINT CK_Fac_CfdiDocumentos_Validacion CHECK
|
||||
(
|
||||
(ImporteValidado = 0 AND CveUsuarioValida IS NULL AND FechaValidacion IS NULL)
|
||||
OR (ImporteValidado = 1 AND CveUsuarioValida IS NOT NULL AND FechaValidacion IS NOT NULL)
|
||||
),
|
||||
CONSTRAINT CK_Fac_CfdiDocumentos_ExternoCompleto CHECK
|
||||
(
|
||||
OrigenRegistro = ''INTERNO'' OR Estado <> ''TIMBRADO''
|
||||
OR
|
||||
(UuidExterno IS NOT NULL AND RutaXmlExterno IS NOT NULL
|
||||
AND RutaPdf IS NOT NULL AND ImporteValidado = 1)
|
||||
);
|
||||
CREATE UNIQUE INDEX UX_Fac_CfdiDocumentos_UuidExterno
|
||||
ON dbo.Fac_CfdiDocumentos (UuidExterno) WHERE UuidExterno IS NOT NULL;
|
||||
|
||||
CREATE TABLE dbo.Tra_PagosCfdi
|
||||
(
|
||||
CvePagoCfdi int IDENTITY(1, 1) NOT NULL CONSTRAINT PK_Tra_PagosCfdi PRIMARY KEY,
|
||||
CvePago int NOT NULL,
|
||||
CveCfdiDocumento bigint NOT NULL,
|
||||
ImporteVinculadoMXN decimal(19, 6) NOT NULL,
|
||||
CveUsuarioRegistro int NOT NULL,
|
||||
FechaRegistro datetime2(0) NOT NULL CONSTRAINT DF_Tra_PagosCfdi_Fecha DEFAULT (SYSDATETIME()),
|
||||
CONSTRAINT FK_Tra_PagosCfdi_Pago FOREIGN KEY (CvePago) REFERENCES dbo.Tra_Pagos (CvePago),
|
||||
CONSTRAINT FK_Tra_PagosCfdi_Documento FOREIGN KEY (CveCfdiDocumento)
|
||||
REFERENCES dbo.Fac_CfdiDocumentos (CveCfdiDocumento),
|
||||
CONSTRAINT FK_Tra_PagosCfdi_Usuario FOREIGN KEY (CveUsuarioRegistro)
|
||||
REFERENCES dbo.Sis_Usuarios (CveUsuario),
|
||||
CONSTRAINT UQ_Tra_PagosCfdi_Vinculo UNIQUE (CvePago, CveCfdiDocumento),
|
||||
CONSTRAINT CK_Tra_PagosCfdi_Importe CHECK (ImporteVinculadoMXN > 0)
|
||||
);
|
||||
CREATE INDEX IX_Tra_PagosCfdi_Documento ON dbo.Tra_PagosCfdi (CveCfdiDocumento);
|
||||
|
||||
-- No vincular los CFDI actuales a abonos inexistentes.
|
||||
-- Su relación original con Ventas se conserva en TipoOrigen/CveOrigen.
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT CveCfdiDocumento, Total, Estado, CveOrigen, TipoOrigen, HuellaXml
|
||||
FROM #PagosOrigenCfdi
|
||||
EXCEPT
|
||||
SELECT CveCfdiDocumento, Total, Estado, CveOrigen, TipoOrigen,
|
||||
HASHBYTES(''SHA2_256'', XmlSinTimbrar)
|
||||
FROM dbo.Fac_CfdiDocumentos
|
||||
)
|
||||
OR (SELECT COUNT_BIG(*) FROM #PagosOrigenCfdi) <> (SELECT COUNT_BIG(*) FROM dbo.Fac_CfdiDocumentos)
|
||||
THROW 51210, N''No se conservaron los documentos fiscales originales.'', 1;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT CveSolicitudPago, CveSolicitud, CveTramitePago, CveVenta, Importe, FechaAlta, CveUsuario
|
||||
FROM #PagosOrigenSolicitudes
|
||||
EXCEPT
|
||||
SELECT CveSolicitudPago, CveSolicitud, CveTramitePago, CveVenta, Importe, FechaAlta, CveUsuario
|
||||
FROM dbo.Tra_SolicitudesPago
|
||||
)
|
||||
THROW 51211, N''No se conservaron las claves, importes o autores de las obligaciones.'', 1;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.Tra_SolicitudesPago AS S
|
||||
OUTER APPLY
|
||||
(
|
||||
SELECT SUM(D.Importe) AS Importe
|
||||
FROM dbo.Tra_SolicitudesPagoDetalle AS D
|
||||
WHERE D.CveSolicitudPago = S.CveSolicitudPago
|
||||
) AS D
|
||||
OUTER APPLY
|
||||
(
|
||||
SELECT SUM(P.Importe) AS Importe
|
||||
FROM dbo.Tra_SolicitudesPagoParcialidades AS P
|
||||
WHERE P.CveSolicitudPago = S.CveSolicitudPago
|
||||
) AS P
|
||||
WHERE D.Importe IS NULL OR D.Importe <> S.Importe
|
||||
OR P.Importe IS NULL OR P.Importe <> S.Importe
|
||||
)
|
||||
THROW 51212, N''Los detalles o parcialidades no concilian con la obligación.'', 1;
|
||||
';
|
||||
|
||||
IF @TablaPlantillas <> OBJECT_ID(N'dbo.Tra_TiposTramitePagos')
|
||||
OR @TablaDetallePlantillas <> OBJECT_ID(N'dbo.Tra_TiposTramitePagosDetalle')
|
||||
OR @TablaSolicitudes <> OBJECT_ID(N'dbo.Tra_SolicitudesPago')
|
||||
OR @TablaAbonos <> OBJECT_ID(N'dbo.Tra_Pagos')
|
||||
THROW 51213, N'No se conservaron las identidades de las tablas originales.', 1;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT R.Clave, R.Tabla, R.Referencia FROM @Relaciones AS R
|
||||
EXCEPT
|
||||
SELECT F.object_id, F.parent_object_id, F.referenced_object_id
|
||||
FROM sys.foreign_keys AS F
|
||||
WHERE F.is_disabled = 0 AND F.is_not_trusted = 0
|
||||
)
|
||||
THROW 51214, N'No se conservaron todas las relaciones originales verificadas.', 1;
|
||||
|
||||
-- Consulta dinámica: estos nombres tienen una responsabilidad nueva tras renombrar.
|
||||
DECLARE @ConteosCorrectos bit;
|
||||
EXEC sys.sp_executesql
|
||||
N'SELECT @Correcto = CONVERT(bit, CASE WHEN
|
||||
(SELECT COUNT_BIG(*) FROM dbo.Tra_TiposTramitePagos) = @Plantillas
|
||||
AND (SELECT COUNT_BIG(*) FROM dbo.Tra_TiposTramitePagosDetalle) = @Detalles
|
||||
AND (SELECT COUNT_BIG(*) FROM dbo.Tra_SolicitudesPago) = @Solicitudes
|
||||
AND (SELECT COUNT_BIG(*) FROM dbo.Tra_Pagos) = @Abonos
|
||||
THEN 1 ELSE 0 END);',
|
||||
N'@Plantillas bigint, @Detalles bigint, @Solicitudes bigint, @Abonos bigint, @Correcto bit OUTPUT',
|
||||
@Plantillas = @CantidadPlantillas,
|
||||
@Detalles = @CantidadDetalles,
|
||||
@Solicitudes = @CantidadSolicitudes,
|
||||
@Abonos = @CantidadAbonos,
|
||||
@Correcto = @ConteosCorrectos OUTPUT;
|
||||
IF ISNULL(@ConteosCorrectos, 0) = 0
|
||||
THROW 51215, N'Los conteos finales no coinciden con el origen.', 1;
|
||||
|
||||
SELECT
|
||||
@CantidadPlantillas AS PlantillasConservadas,
|
||||
@CantidadSolicitudes AS ObligacionesMigradas,
|
||||
@CantidadAbonos AS AbonosConservados,
|
||||
N'Estructura preparada en la transacción. Faltan PAs, aplicación y configuración antes de confirmar.' AS Resultado;
|
||||
|
||||
-- Mostrar diferencias fiscales existentes sin corregirlas.
|
||||
SELECT O.CveSolicitudPago, O.CveVenta, O.Importe AS ImporteObligacion,
|
||||
F.CveCfdiDocumento, F.Total AS ImporteCfdi
|
||||
FROM #PagosOrigenSolicitudes AS O
|
||||
INNER JOIN dbo.Fac_CfdiDocumentos AS F ON F.TipoOrigen = 'VENTA' AND F.CveOrigen = O.CveVenta
|
||||
WHERE F.Total <> O.Importe;
|
||||
|
||||
DROP TABLE #PagosOrigenSolicitudes;
|
||||
DROP TABLE #PagosOrigenDetalle;
|
||||
DROP TABLE #PagosOrigenPlantilla;
|
||||
DROP TABLE #PagosOrigenCfdi;
|
||||
5266
Pagos_Convenios_Procedimientos_20260922.sql
Normal file
5266
Pagos_Convenios_Procedimientos_20260922.sql
Normal file
File diff suppressed because it is too large
Load Diff
3757
Procedimientos_Bitacora_Eventos_20260920.sql
Normal file
3757
Procedimientos_Bitacora_Eventos_20260920.sql
Normal file
File diff suppressed because it is too large
Load Diff
1064
Procedimientos_DocumentosSolicitudConfiguracion_20260918.sql
Normal file
1064
Procedimientos_DocumentosSolicitudConfiguracion_20260918.sql
Normal file
File diff suppressed because it is too large
Load Diff
1529
Procedimientos_DocumentosTramites_20260914.sql
Normal file
1529
Procedimientos_DocumentosTramites_20260914.sql
Normal file
File diff suppressed because it is too large
Load Diff
212
Revision_CambioEstatus_20260908.md
Normal file
212
Revision_CambioEstatus_20260908.md
Normal file
@@ -0,0 +1,212 @@
|
||||
# Revisión del cambio de estatus — 08/09/2026
|
||||
|
||||
## Estado de entrega
|
||||
|
||||
Implementación preparada en archivos. Los scripts SQL **no se ejecutaron contra la base de datos**.
|
||||
La entrega conserva ASP.NET WebForms, compilación dinámica desde App_Code y .NET Framework 4.8.1.
|
||||
|
||||
Aplicar el SQL y los archivos de aplicación como una misma actualización. El código nuevo depende
|
||||
de las columnas y firmas incluidas en estos scripts; el flujo no estará operativo con los PA anteriores.
|
||||
|
||||
## Acuerdos utilizados
|
||||
|
||||
- El desarrollador corresponde a Empresa, CveRol = 3. SuperUsuario = 1 y Administrador = 2.
|
||||
- El siguiente estatus es el siguiente activo por Orden (CveEstatusSolicitud como desempate).
|
||||
Se determina antes de comprobar EsCliente; no se saltan estatus internos.
|
||||
- La secuencia consultada es 3 → 4 → 5 → 6 → 7 → 10 → 8.
|
||||
El desarrollador se detiene antes de 7, porque EsCliente = 0.
|
||||
- Autorizado es CveEstatusSolicitud = 7, con EsCliente = 0.
|
||||
- Los tipos de documento existentes comienzan con EsCliente = 1. El catálogo permite
|
||||
asignarlos posteriormente a Administrador (0) o Desarrollador (1).
|
||||
- Se conserva el criterio de pago realizado: existencia de Vta_Pagos activo asociado a
|
||||
la solicitud, concepto de pago y venta. No se exige adicionalmente Autorizado.
|
||||
- Se considera documento pendiente el requerido que no tiene archivo registrado.
|
||||
La revisión/aprobación documental anterior se conserva y no se agrega como requisito nuevo.
|
||||
|
||||
## Comportamiento implementado
|
||||
|
||||
El modal muestra (Folio) Etapa - Trámite y observaciones obligatorias de 1 a 1000 caracteres.
|
||||
Administrador/SuperUsuario conservan selección libre de estatus, incluso tras autorizar.
|
||||
El desarrollador ve un destino fijo; el servicio verifica nuevamente el destino al guardar.
|
||||
|
||||
Las condiciones se capturan solamente al autorizar con EsCliente = 0, para Administrador/SuperUsuario.
|
||||
La lista aplicable proviene del PA existente. Los paneles no aplicables tienen Visible = false,
|
||||
con sus validadores dentro del panel y el grupo CambioEstatusTramite. Las condiciones visibles
|
||||
aceptan únicamente 0/1 en el modelo de captura; NULL bloquea el guardado.
|
||||
Se conserva la asignación automática de AprobadoPrefactibilidad = 1 al autorizar prefactibilidad.
|
||||
El desarrollador no consulta ni actualiza condiciones durante el movimiento.
|
||||
|
||||
La validación del servicio se realiza en este orden:
|
||||
1. Sesión, observaciones, estatus destino y vigencia del estatus anterior.
|
||||
2. Condiciones aplicables.
|
||||
3. Documentos requeridos del responsable correspondiente.
|
||||
4. Pagos requeridos.
|
||||
5. Movimiento, historial, condiciones, generación de solicitudes y bitácora.
|
||||
|
||||
Un requisito pendiente dirige a su pestaña y resalta las filas en rojo. Pagos es de consulta;
|
||||
no permite resolver pagos dentro del modal. Supervisiones es una pestaña vacía del detalle principal.
|
||||
|
||||
En Documentos, las etapas disponibles son las solicitudes del mismo tipo de trámite en el
|
||||
fraccionamiento. Cambiar la etapa permite administrar sus documentos. Guardar estatus siempre
|
||||
valida la solicitud original; si faltan documentos suyos, regresa el grid a esa solicitud.
|
||||
|
||||
El filtro por responsable también se verifica en el servicio al cargar, eliminar y descargar.
|
||||
Los GIS conservan su flujo especializado de administración de la etapa; no se cargan como archivos
|
||||
genéricos desde el formulario nuevo. La eliminación documental usa DELETE físico del registro y
|
||||
bitácora; conserva el almacenamiento existente, sin agregar purga del archivo físico.
|
||||
Sin el registro, el endpoint de descarga deja de autorizar ese documento.
|
||||
|
||||
## Atomicidad y concurrencia
|
||||
|
||||
TramiteSolicitudService usa TransactionLogic con aislamiento Serializable para leer los requisitos
|
||||
y conservarlos estables hasta terminar. El servicio confirma únicamente después de completar todas
|
||||
las operaciones. La bitácora y la generación de solicitudes participan en la misma transacción.
|
||||
|
||||
PA_Tramites_SolicitudEstatusUpdate inserta el historial antes de actualizar Tra_Solicitudes.
|
||||
Registra CveSolicitud, CveEstatusSolicitudAnterior, destino, CveUsuario, Comentarios y FechaAlta.
|
||||
Compara el estatus previo capturado con el actual, además de la comprobación en el servicio.
|
||||
|
||||
El historial existente estaba vacío. Se agrega el estatus anterior como nullable para no inventar
|
||||
datos si se instala sobre una instancia con movimientos históricos. El flujo nuevo siempre envía
|
||||
un estatus anterior conocido, un usuario autenticado y observaciones obligatorias.
|
||||
|
||||
## SQL separado y objetos afectados
|
||||
|
||||
### Tramites_CambioEstatus_Estructura_20260908.sql
|
||||
|
||||
- Tra_TiposDocumento: EsCliente bit NOT NULL, predeterminado 1 para los tipos existentes.
|
||||
- Tra_HistorialEstatusSolicitud: CveEstatusSolicitudAnterior int y llave foránea a Tra_EstatusSolicitud.
|
||||
- No se crean tablas para Supervisiones.
|
||||
|
||||
### Tramites_CambioEstatus_Procedimientos_20260908.sql
|
||||
|
||||
Modifica:
|
||||
- PA_Tramites_SolicitudEstatusUpdate: observaciones e historial; se retiran el bloqueo por rol > 2
|
||||
y el bloqueo por autorización previa. Las condiciones se actualizan mediante el servicio y
|
||||
PA_Fraccionamientos_EtapaCondicionUpdate, sin duplicar sus modificaciones dentro de este PA.
|
||||
- PA_Tramites_EstatusSolicitudOptionList: devuelve todos los estatus activos para poder calcular
|
||||
correctamente el siguiente. El método público usado por los filtros conserva en C# la vista
|
||||
EsCliente del desarrollador.
|
||||
- PA_Tramites_DocumentoSolicitudFraccionamientoList: agrega responsable, obligatoriedad y SeValida.
|
||||
El parámetro IncluirRequisitos permite consultar todos los requisitos activos, también opcionales
|
||||
y pendientes de solicitudes finales; el modo ordinario conserva su selección anterior.
|
||||
- PA_Tramites_DocumentoSolicitudUploadContextGet: agrega EsCliente y traslada el bloqueo de estado
|
||||
final al servicio C#.
|
||||
- PA_Tramites_DocumentoSolicitudSave y PA_Tramites_DocumentoSolicitudDelete: retiran el bloqueo
|
||||
general de solicitud final. C# conserva el bloqueo para desarrollador y permite administrador.
|
||||
Se elimina la administración de transacciones SQL y XACT_ABORT, según la arquitectura del proyecto.
|
||||
- PA_Tra_TipoDocumentoList, PA_Tra_TipoDocumentoGet y PA_Tra_TipoDocumentoSave: leen/guardan EsCliente.
|
||||
|
||||
Crea:
|
||||
- PA_Tra_SolicitudPagoList: consulta pagos configurados y realizados por solicitud, incluyendo
|
||||
requisitos todavía sin venta o sin detalles. No ejecuta cobros ni aplica reglas de rol.
|
||||
|
||||
No se agregaron bloqueos SQL por responsable o por avance secuencial.
|
||||
Las comprobaciones preexistentes de acceso al cliente en consultas documentales se conservaron.
|
||||
|
||||
## Comparación con BD
|
||||
|
||||
Las versiones usadas como base se consultaron directamente en
|
||||
localhost / SIG_PlataformaDesarolladores. Las nueve definiciones originales se volvieron a
|
||||
comparar al terminar: no cambiaron durante el trabajo.
|
||||
|
||||
- No se encontraron definiciones de los PA_Tramites_* afectados en los scripts anteriores revisados.
|
||||
Los scripts nuevos parten de las definiciones de BD, no de reconstrucciones del repositorio.
|
||||
- PA_Tra_TipoDocumentoList/Get/Save coincidían con Catalogos_Tramites_Internos.sql tras normalizar
|
||||
formato y comentarios.
|
||||
- PA_Tra_MostrarCondicionesporTramite y PA_Fraccionamientos_EtapaCondicionUpdate coincidían con
|
||||
Tramites_CambioEstatus_Condiciones_20260907.sql; se reutilizan sin modificarlos.
|
||||
- PA_Tra_GenerarSolicitudesPorFlujo tiene una diferencia funcional: la BD requiere también
|
||||
EsCliente = 0 para considerar cumplido el trámite padre; el script anterior del repo no.
|
||||
Se conserva el PA de BD y su invocación, sin reemplazarlo ni incluirlo en el script de instalación.
|
||||
- La BD contiene lógica adicional de condiciones y parámetros opcionales en
|
||||
PA_Tramites_SolicitudEstatusUpdate; se revisó esa definición antes de preparar el cambio.
|
||||
- El PA documental Save instalado contenía BEGIN/COMMIT/ROLLBACK y XACT_ABORT; el script preparado
|
||||
los elimina para que el servicio sea dueño de la transacción.
|
||||
|
||||
## Portlet y carga de archivos
|
||||
|
||||
Patrón reutilizado de Metronic:
|
||||
|
||||
```html
|
||||
<div id="PortletDocumentoEstatus" class="portlet box blue">
|
||||
<div class="portlet-title">
|
||||
<div class="caption">Agregar o Actualizar</div>
|
||||
<div class="tools">
|
||||
<a href="javascript:;" class="expand"
|
||||
title="Mostrar u ocultar captura"></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="portlet-body" style="display:none;">
|
||||
<!-- Captura -->
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
El selector real es .portlet-title > .tools > .collapse/.expand, y el cuerpo .portlet-body.
|
||||
Un portlet inicialmente cerrado usa expand; al abrirlo se cambia a collapse.
|
||||
El id estable permite que custom.js conserve su estado durante postbacks parciales.
|
||||
No se modificaron Metronic ni custom.js.
|
||||
|
||||
Se reutiliza ADSdropzoneLocal y su API ADSLocalDropzone.getFile.
|
||||
El botón copia el File seleccionado a FileUpload mediante DataTransfer y realiza un postback
|
||||
completo declarado con PostBackTrigger. La entrada nativa sigue disponible como alternativa.
|
||||
La persistencia pasa por TramiteDocumentoService y su almacenamiento protegido existente.
|
||||
Los eventos nuevos se inicializan una vez por elemento y utilizan el puente global ya existente
|
||||
de SIGDetalle para cargas y postbacks parciales.
|
||||
|
||||
## Verificación realizada
|
||||
|
||||
- Precompilación completa con aspnet_compiler de .NET Framework: correcta, incluyendo páginas,
|
||||
App_Code y AjaxControlToolkit. No se generó ni desplegó SIG.Web.dll.
|
||||
- Sintaxis JavaScript de la página revisada con node --check: correcta.
|
||||
- Ambos scripts analizados con Microsoft.SqlServer.TransactSql.ScriptDom TSql160Parser:
|
||||
cero errores de sintaxis, sin conexión de ejecución SQL.
|
||||
- git diff --check: correcto.
|
||||
- 31 pruebas de comportamiento sobre las clases de servicio realmente compiladas,
|
||||
con contratos simulados y transacciones ambientales, sin conexiones a BD:
|
||||
- 20 de estatus: secuencia, prohibición de saltos, admin/superusuario después de autorizar,
|
||||
observaciones, condiciones 0/1 y NULL, condiciones no aplicables, orden de requisitos,
|
||||
requisitos opcionales, pago activo, captura obsoleta y rollback ante fallos.
|
||||
- 11 documentales: filtrado por responsable, carga/descarga/eliminación, pertenencia de la
|
||||
solicitud, estado final y registro de archivos externos.
|
||||
- Los escenarios de rollback comprueban que TransactionScope revierte y no confirma cuando
|
||||
falla el movimiento, la bitácora o la generación. La escritura SQL real del historial
|
||||
queda pendiente de la prueba de integración tras instalar los scripts.
|
||||
|
||||
Pendiente tras autorización e instalación de BD: prueba integrada en navegador con usuarios reales,
|
||||
carga/reemplazo/eliminación de archivos, pestañas/validadores tras postbacks parciales y comprobación
|
||||
de filas reales en historial y bitácora. No se presenta esa integración como ya probada.
|
||||
|
||||
## Archivos modificados
|
||||
|
||||
- SIG.Web/App_Code/Models/Tramites/TramiteSolicitudModels.cs
|
||||
- SIG.Web/App_Code/Models/Tramites/TramiteCatalogModels.cs
|
||||
- SIG.Web/App_Code/Models/Documentos/TramiteDocumentoModels.cs
|
||||
- SIG.Web/App_Code/Services/Tramites/TramiteSolicitudService.cs
|
||||
- SIG.Web/App_Code/Repositories/Tramites/TramiteSolicitudRepository.cs
|
||||
- SIG.Web/App_Code/Services/Tramites/TramiteSolicitudBitacoraFactory.cs
|
||||
- SIG.Web/App_Code/Services/Documentos/TramiteDocumentoService.cs
|
||||
- SIG.Web/App_Code/Repositories/Documentos/TramiteDocumentoRepository.cs
|
||||
- SIG.Web/App_Code/Contracts/Tramites/ITramiteSolicitudService.cs
|
||||
- SIG.Web/App_Code/Contracts/Tramites/ITramiteSolicitudRepository.cs
|
||||
- SIG.Web/App_Code/Contracts/Documentos/ITramiteDocumentoService.cs
|
||||
- SIG.Web/App_Code/Contracts/Documentos/ITramiteDocumentoRepository.cs
|
||||
- SIG.Web/App_Code/Repositories/Tramites/TramiteCatalogRepository.cs
|
||||
- SIG.Web/App_Code/Services/Tramites/TramiteCatalogBitacoraFactory.cs
|
||||
- SIG.Web/App_Code/Configuration/AppServices.cs
|
||||
- SIG.Web/Pages/Catalogos/TiposDocumento.aspx
|
||||
- SIG.Web/Pages/Catalogos/TiposDocumento.aspx.cs
|
||||
- SIG.Web/Pages/Fraccionamientos/FraccionamientoDetalle.aspx
|
||||
- SIG.Web/Pages/Fraccionamientos/FraccionamientoDetalle.aspx.cs
|
||||
- SIG.Web/Styles/FraccionamientoDetalle.css
|
||||
|
||||
## Archivos nuevos
|
||||
|
||||
- Tramites_CambioEstatus_Estructura_20260908.sql
|
||||
- Tramites_CambioEstatus_Procedimientos_20260908.sql
|
||||
- Revision_CambioEstatus_20260908.md
|
||||
- Entrega_CambioEstatus_20260908.zip
|
||||
|
||||
El ZIP incluye los 20 archivos de aplicación, los dos scripts y este informe; excluye binarios,
|
||||
credenciales, archivos ajenos al cambio y su propia copia. No se crearon commits.
|
||||
33
Rollback_DocumentosTramites_20260914.sql
Normal file
33
Rollback_DocumentosTramites_20260914.sql
Normal file
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
Reversión de la migración a la clave compuesta. No ejecutada.
|
||||
|
||||
Ejecutar Preparar, los ALTER revisados y Finalizar dentro de una única
|
||||
transacción de instalación, verificando datos y dependencias antes del
|
||||
COMMIT externo. Un error debe revertir esa transacción completa.
|
||||
|
||||
Después del COMMIT:
|
||||
Se retiró una columna IDENTITY y sus valores quedaron conservados en el XML.
|
||||
Agregar otra columna IDENTITY no garantiza recuperar la correspondencia
|
||||
entre las claves antiguas y las relaciones. No se asignarán claves nuevas
|
||||
ni se reconstruirán los datos históricos suponiendo su orden.
|
||||
|
||||
La vuelta exacta requiere restaurar el respaldo previo de la base, los PAs
|
||||
originales y el código anterior. Antes de restaurar, respaldar y revisar
|
||||
cualquier dato posterior a la migración. Esa restauración requiere
|
||||
autorización independiente y no se ejecuta automáticamente aquí.
|
||||
|
||||
Respaldo previo verificado en la sesión del 14/09/2026:
|
||||
E:\SqlServer2022\MSSQL16.MSSQLSERVER\MSSQL\Backup\SIG_PlataformaDesarolladores_documentos_20260914_180234.bak
|
||||
|
||||
Sustituye la reversión anterior, que sólo restauraba EsCliente y no era
|
||||
compatible con la estructura exacta de clave compuesta.
|
||||
*/
|
||||
SET NOCOUNT ON;
|
||||
|
||||
IF OBJECT_ID('dbo.Tra_TiposTramiteDocumento', 'U') IS NOT NULL
|
||||
THROW 51000, 'La reversión posterior al COMMIT requiere revisar y restaurar el respaldo previo; no se modificarán datos automáticamente.', 1;
|
||||
|
||||
IF OBJECT_ID('dbo.Tra_DocumentosRequeridos', 'U') IS NULL
|
||||
THROW 51000, 'No se reconoce el estado de la relación. Revisar antes de restaurar.', 1;
|
||||
|
||||
SELECT 'La relación anterior sigue presente. No se ha aplicado ninguna restauración.' AS Resultado;
|
||||
@@ -1,5 +1,8 @@
|
||||
using System;
|
||||
using System.Configuration;
|
||||
using SIG.Web.AppCode.Contracts.Clientes;
|
||||
using SIG.Web.AppCode.Repositories.Clientes;
|
||||
using SIG.Web.AppCode.Services.Clientes;
|
||||
using SIG.Web.AppCode.Contracts.Bitacora;
|
||||
using SIG.Web.AppCode.Contracts.Database;
|
||||
using SIG.Web.AppCode.Contracts.Documentos;
|
||||
@@ -43,10 +46,14 @@ namespace SIG.Web.AppCode.Configuration
|
||||
private static IDbExecutor DbExecutor { get; set; }
|
||||
public static IBitacoraService BitacoraService { get; private set; }
|
||||
public static IPasswordHasher PasswordHasher { get; private set; }
|
||||
public static IServicioDesarrolladores ServicioDesarrolladores { get; private set; }
|
||||
public static ICaptchaService CaptchaService { get; private set; }
|
||||
public static IUserRepository UserRepository { get; private set; }
|
||||
private static IUserAdministrationRepository UserAdministrationRepository { get; set; }
|
||||
public static IUserAdministrationService UserAdministrationService { get; private set; }
|
||||
public static IServicioTurnos ServicioTurnos { get; private set; }
|
||||
public static IServicioCalendarioVisitas ServicioCalendarioVisitas { get; private set; }
|
||||
public static SIG.Web.AppCode.Contracts.Visitas.IServicioVisitas ServicioVisitas { get; private set; }
|
||||
public static IServicioPerfilUsuario ServicioPerfilUsuario { get; private set; }
|
||||
public static IGeneralCatalogRepository GeneralCatalogRepository { get; private set; }
|
||||
public static IServicioProductoServicio ServicioProductoServicio { get; private set; }
|
||||
@@ -58,6 +65,7 @@ namespace SIG.Web.AppCode.Configuration
|
||||
public static ITramiteCatalogService TramiteCatalogService { get; private set; }
|
||||
public static ITramiteSolicitudService TramiteSolicitudService { get; private set; }
|
||||
public static IServicioVentaTramite ServicioVentaTramite { get; private set; }
|
||||
public static IServicioPagosConvenios ServicioPagosConvenios { get; private set; }
|
||||
public static IServicioTimbradoCfdi ServicioTimbradoCfdi { get; private set; }
|
||||
public static IPublicRegistrationService PublicRegistrationService { get; private set; }
|
||||
public static ILoginAttemptRepository LoginAttemptRepository { get; private set; }
|
||||
@@ -96,11 +104,25 @@ namespace SIG.Web.AppCode.Configuration
|
||||
UserAdministrationService = new UserAdministrationService(
|
||||
UserAdministrationRepository,
|
||||
PasswordHasher,
|
||||
BitacoraService,
|
||||
new SmtpEmailSender());
|
||||
ServicioTurnos = new ServicioTurnos(
|
||||
new RepositorioTurnos(DbExecutor),
|
||||
BitacoraService);
|
||||
ServicioCalendarioVisitas = new ServicioCalendarioVisitas(
|
||||
new RepositorioCalendarioVisitas(DbExecutor),
|
||||
BitacoraService);
|
||||
ServicioPerfilUsuario = new ServicioPerfilUsuario(
|
||||
new RepositorioPerfilUsuario(DbExecutor),
|
||||
PasswordHasher);
|
||||
GeneralCatalogRepository = new GeneralCatalogRepository(DbExecutor);
|
||||
ServicioDesarrolladores = new ServicioDesarrolladores(
|
||||
new RepositorioDesarrolladores(DbExecutor),
|
||||
GeneralCatalogRepository,
|
||||
UserAdministrationRepository,
|
||||
UserContext,
|
||||
PasswordHasher,
|
||||
BitacoraService);
|
||||
ServicioProductoServicio = new ServicioProductoServicio(
|
||||
new RepositorioProductoServicio(DbExecutor),
|
||||
BitacoraService);
|
||||
@@ -110,6 +132,8 @@ namespace SIG.Web.AppCode.Configuration
|
||||
ClienteDocumentoService = new ClienteDocumentoService(
|
||||
new ClienteDocumentoRepository(DbExecutor));
|
||||
|
||||
ITramiteSolicitudRepository tramiteSolicitudRepository =
|
||||
new TramiteSolicitudRepository(DbExecutor);
|
||||
ITramiteDocumentoRepository tramiteDocumentoRepository =
|
||||
new TramiteDocumentoRepository(DbExecutor);
|
||||
ITramiteDocumentoFileStore tramiteDocumentoFileStore =
|
||||
@@ -117,10 +141,10 @@ namespace SIG.Web.AppCode.Configuration
|
||||
TramiteDocumentoService = new TramiteDocumentoService(
|
||||
tramiteDocumentoRepository,
|
||||
tramiteDocumentoFileStore,
|
||||
BitacoraService);
|
||||
BitacoraService,
|
||||
UserContext,
|
||||
tramiteSolicitudRepository);
|
||||
|
||||
ITramiteSolicitudRepository tramiteSolicitudRepository =
|
||||
new TramiteSolicitudRepository(DbExecutor);
|
||||
IRepositorioFraccionamiento repositorioFraccionamiento =
|
||||
new RepositorioFraccionamiento(DbExecutor);
|
||||
|
||||
@@ -138,13 +162,23 @@ namespace SIG.Web.AppCode.Configuration
|
||||
almacenArchivosGis,
|
||||
BitacoraService,
|
||||
TramiteDocumentoService);
|
||||
ServicioVisitas = new SIG.Web.AppCode.Services.Visitas.ServicioVisitas(
|
||||
new SIG.Web.AppCode.Repositories.Visitas.RepositorioVisitas(DbExecutor),
|
||||
BitacoraService,
|
||||
new SIG.Web.AppCode.Services.Visitas.AlmacenDocumentosVisita(),
|
||||
UserAdministrationRepository,
|
||||
UserContext,
|
||||
ServicioGisFraccionamiento,
|
||||
ServicioFraccionamiento);
|
||||
TramiteCatalogService = new TramiteCatalogService(
|
||||
new TramiteCatalogRepository(DbExecutor),
|
||||
BitacoraService);
|
||||
TramiteSolicitudService = new TramiteSolicitudService(
|
||||
tramiteSolicitudRepository,
|
||||
repositorioFraccionamiento,
|
||||
BitacoraService);
|
||||
BitacoraService,
|
||||
TramiteDocumentoService,
|
||||
UserContext);
|
||||
var clienteProfact = new ClienteTimbradoPacProfact(
|
||||
new ProveedorCredencialPacConfiguracion());
|
||||
ServicioTimbradoCfdi = new ServicioTimbradoCfdi(
|
||||
@@ -161,7 +195,8 @@ namespace SIG.Web.AppCode.Configuration
|
||||
new AlmacenArchivosCfdi());
|
||||
ServicioVentaTramite = new ServicioVentaTramite(
|
||||
new RepositorioVentaTramite(DbExecutor),
|
||||
ServicioTimbradoCfdi);
|
||||
ServicioTimbradoCfdi,
|
||||
tramiteSolicitudRepository);
|
||||
LoginAttemptRepository = new LoginAttemptRepository(DbExecutor);
|
||||
UserSessionRepository = new UserSessionRepository(DbExecutor);
|
||||
|
||||
@@ -172,6 +207,13 @@ namespace SIG.Web.AppCode.Configuration
|
||||
|
||||
PermissionService = new PermissionService(
|
||||
permissionRepository);
|
||||
ServicioPagosConvenios = new ServicioPagosConvenios(
|
||||
new RepositorioPagosConvenios(DbExecutor),
|
||||
tramiteSolicitudRepository,
|
||||
UserAdministrationRepository,
|
||||
UserContext,
|
||||
PermissionService,
|
||||
BitacoraService);
|
||||
MenuProvider = new MenuProvider(menuRepository);
|
||||
NotificationCenter = new DummyNotificationCenter();
|
||||
SearchProvider = new DummyBuscadorCatalogoDataProvider();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Web.Optimization;
|
||||
using System.Web.Optimization;
|
||||
using System.Web.UI;
|
||||
|
||||
namespace SIG.Web.AppCode.Configuration
|
||||
@@ -57,8 +57,14 @@ namespace SIG.Web.AppCode.Configuration
|
||||
"~/Scripts/UcBuscadorCatalogo.js",
|
||||
"~/Scripts/SigPdfViewer.js",
|
||||
"~/Scripts/SigPdfDrawer.js",
|
||||
"~/Scripts/PanelLateral.js",
|
||||
"~/Scripts/DocumentosEtapa.js",
|
||||
"~/Scripts/Visitas.js",
|
||||
"~/Scripts/PagosConvenios.js",
|
||||
"~/Scripts/custom.js",
|
||||
"~/Scripts/sig-alerts.js"
|
||||
"~/Scripts/sig-alerts.js",
|
||||
"~/Scripts/filtrosig.js",
|
||||
"~/Scripts/scrollsig.js"
|
||||
));
|
||||
|
||||
bundles.Add(new ScriptBundle("~/bundles/WebFormsJs").Include(
|
||||
@@ -117,7 +123,12 @@ namespace SIG.Web.AppCode.Configuration
|
||||
"~/Styles/Filtros.css",
|
||||
"~/Styles/SigPdfViewer.css",
|
||||
"~/Styles/SigPdfDrawer.css",
|
||||
"~/Styles/Estilos2.css",
|
||||
"~/Styles/PanelLateral.css",
|
||||
"~/Styles/DetalleEtapa.css",
|
||||
"~/Styles/DocumentosEtapa.css",
|
||||
"~/Styles/Estilos.css",
|
||||
"~/Styles/filtrosig.css",
|
||||
"~/Styles/scrollsig.css",
|
||||
"~/Metronic/assets/global/plugins/bootstrap-switch/css/bootstrap-switch.min.css",
|
||||
"~/Metronic/assets/global/plugins/bootstrap-toastr/toastr.min.css",
|
||||
"~/Metronic/assets/layouts/layout3/css/jquery.datetimepicker.css",
|
||||
@@ -126,7 +137,10 @@ namespace SIG.Web.AppCode.Configuration
|
||||
"~/Metronic/assets/global/css/plugins.css",
|
||||
"~/Metronic/assets/admin/layout/css/layout.css")
|
||||
.Include("~/Metronic/Carusel/slick.css", new CssRewriteUrlTransform())
|
||||
.Include("~/Metronic/Carusel/slick-theme.css", new CssRewriteUrlTransform()));
|
||||
.Include("~/Metronic/Carusel/slick-theme.css", new CssRewriteUrlTransform())
|
||||
.Include("~/Styles/Visitas.css", new CssRewriteUrlTransform())
|
||||
.Include("~/Styles/SeguimientoSolicitud.css", new CssRewriteUrlTransform())
|
||||
.Include("~/Styles/PagosConvenios.css", new CssRewriteUrlTransform()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,15 @@ namespace SIG.Web.AppCode.Contracts.Bitacora
|
||||
{
|
||||
public interface IBitacoraRepository
|
||||
{
|
||||
DbResult<long> RegistrarOperacion(
|
||||
ModeloOperacionBitacora operacion, BitacoraContextoModel contexto);
|
||||
|
||||
DbResult<ResultadoPaginado<ModeloEventoBitacora>> ConsultarEventos(
|
||||
BitacoraConsultaModel consulta, int cveUsuarioEjecuta);
|
||||
|
||||
DbResult<List<BitacoraCampoModel>> ObtenerEvento(
|
||||
long cveBitacoraEvento, int cveUsuarioEjecuta);
|
||||
|
||||
DbResult<long> Agregar(
|
||||
BitacoraEventoModel evento,
|
||||
BitacoraContextoModel contexto);
|
||||
|
||||
@@ -6,6 +6,13 @@ namespace SIG.Web.AppCode.Contracts.Bitacora
|
||||
{
|
||||
public interface IBitacoraService
|
||||
{
|
||||
DbResult<long> RegistrarOperacion(ModeloOperacionBitacora operacion);
|
||||
|
||||
DbResult<ResultadoPaginado<ModeloEventoBitacora>> ConsultarEventos(
|
||||
BitacoraConsultaModel consulta);
|
||||
|
||||
DbResult<List<BitacoraCampoModel>> ObtenerEvento(long cveBitacoraEvento);
|
||||
|
||||
DbResult<long> Registrar(BitacoraEventoModel evento);
|
||||
|
||||
DbResult<List<BitacoraModel>> Listar(BitacoraFiltroModel filtro);
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Models.Busqueda;
|
||||
|
||||
namespace SIG.Web.AppCode.Contracts.Busqueda
|
||||
{
|
||||
public interface IProveedorBuscadorCatalogo
|
||||
{
|
||||
ResultadoBuscador Buscar(SolicitudBuscador solicitud);
|
||||
Dictionary<string, object> ObtenerPorClave(string clave, IEnumerable<FiltroBuscador> filtros);
|
||||
List<OpcionFiltroBuscador> ObtenerOpciones(string campo, IEnumerable<FiltroBuscador> filtros);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Models.Clientes;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
|
||||
namespace SIG.Web.AppCode.Contracts.Clientes
|
||||
{
|
||||
public interface IRepositorioDesarrolladores
|
||||
{
|
||||
DbResult<List<ModeloDesarrollador>> Listar(
|
||||
string texto, bool incluirInactivos, int usuario, string dominio);
|
||||
DbResult<ModeloDesarrollador> Obtener(int cveCliente, int usuario, string dominio);
|
||||
DbResult<ResultadoAltaDesarrollador> Agregar(
|
||||
SolicitudAltaDesarrollador solicitud, string hashContrasena, int usuario, string dominio);
|
||||
DbResult<bool> Actualizar(ModeloDesarrollador desarrollador, int usuario, string dominio);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Models.Clientes;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.General;
|
||||
|
||||
namespace SIG.Web.AppCode.Contracts.Clientes
|
||||
{
|
||||
public interface IServicioDesarrolladores
|
||||
{
|
||||
bool PuedeCambiarAsociadoCanadevi { get; }
|
||||
DbResult<List<ModeloDesarrollador>> Listar(string texto, bool incluirInactivos);
|
||||
DbResult<ModeloDesarrollador> Obtener(int cveCliente);
|
||||
DbResult<PostalCodeLookupModel> ConsultarCodigoPostal(string codigoPostal);
|
||||
DbResult<ResultadoAltaDesarrollador> Agregar(SolicitudAltaDesarrollador solicitud);
|
||||
DbResult<bool> Actualizar(ModeloDesarrollador desarrollador);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.Documentos;
|
||||
@@ -6,6 +7,31 @@ namespace SIG.Web.AppCode.Contracts.Documentos
|
||||
{
|
||||
public interface ITramiteDocumentoRepository
|
||||
{
|
||||
DbResult<List<SolicitudDocumentoConfiguracionModel>> ListarConfiguracionSolicitud(
|
||||
int cveFraccionamiento,
|
||||
int cveSolicitud,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio,
|
||||
int? cveFraccionamientoEtapa = null);
|
||||
|
||||
DbResult<bool> ActualizarVencimientoEtapa(
|
||||
int cveFraccionamientoEtapa,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
|
||||
DbResult<bool> GuardarConfiguracionSolicitud(
|
||||
SolicitudDocumentoConfiguracionModel configuracion,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
|
||||
DbResult<bool> EliminarConfiguracionSolicitud(
|
||||
int cveFraccionamiento,
|
||||
int cveSolicitud,
|
||||
int cveTipoDocumento,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio,
|
||||
int? cveFraccionamientoEtapa = null);
|
||||
|
||||
DbResult<List<TramiteDocumentoSolicitudModel>> ListForDevelopment(
|
||||
int developmentId,
|
||||
int? stageId,
|
||||
@@ -13,12 +39,20 @@ namespace SIG.Web.AppCode.Contracts.Documentos
|
||||
int executingUser,
|
||||
string domainName);
|
||||
|
||||
DbResult<List<TramiteDocumentoSolicitudModel>> ListarRequisitos(
|
||||
int cveFraccionamiento,
|
||||
int? cveEtapa,
|
||||
int? cveTipoTramite,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
|
||||
DbResult<TramiteDocumentoUploadContextModel> GetUploadContext(
|
||||
int developmentId,
|
||||
int requestId,
|
||||
int documentTypeId,
|
||||
int executingUser,
|
||||
string domainName);
|
||||
string domainName,
|
||||
int? cveFraccionamientoEtapa = null);
|
||||
|
||||
DbResult<TramiteDocumentoUploadContextModel> GetStageUploadContext(
|
||||
int stageId,
|
||||
@@ -38,7 +72,11 @@ namespace SIG.Web.AppCode.Contracts.Documentos
|
||||
long contentLength,
|
||||
string clientComment,
|
||||
int executingUser,
|
||||
string domainName);
|
||||
string domainName,
|
||||
DateTime? fechaDocumento = null,
|
||||
DateTime? fechaVencimiento = null,
|
||||
bool actualizarFechas = false,
|
||||
int? cveFraccionamientoEtapa = null);
|
||||
|
||||
DbResult<TramiteDocumentoReviewResultModel> Review(
|
||||
int developmentId,
|
||||
|
||||
@@ -1,12 +1,39 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.Bitacora;
|
||||
using SIG.Web.AppCode.Models.Documentos;
|
||||
|
||||
namespace SIG.Web.AppCode.Contracts.Documentos
|
||||
{
|
||||
public interface ITramiteDocumentoService
|
||||
{
|
||||
DbResult<List<SolicitudDocumentoConfiguracionModel>> ListarConfiguracionSolicitud(
|
||||
int cveFraccionamiento,
|
||||
int cveSolicitud,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio,
|
||||
int? cveFraccionamientoEtapa = null);
|
||||
|
||||
DbResult<bool> ActualizarVencimientoEtapa(
|
||||
int cveFraccionamientoEtapa,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
|
||||
DbResult<bool> GuardarConfiguracionSolicitud(
|
||||
SolicitudDocumentoConfiguracionModel configuracion,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
|
||||
DbResult<bool> EliminarConfiguracionSolicitud(
|
||||
int cveFraccionamiento,
|
||||
int cveSolicitud,
|
||||
int cveTipoDocumento,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio,
|
||||
int? cveFraccionamientoEtapa = null);
|
||||
|
||||
DbResult<List<TramiteDocumentoSolicitudModel>> ListForDevelopment(
|
||||
int developmentId,
|
||||
int? stageId,
|
||||
@@ -14,12 +41,20 @@ namespace SIG.Web.AppCode.Contracts.Documentos
|
||||
int executingUser,
|
||||
string domainName);
|
||||
|
||||
DbResult<List<TramiteDocumentoSolicitudModel>> ListarRequisitos(
|
||||
int cveFraccionamiento,
|
||||
int? cveEtapa,
|
||||
int? cveTipoTramite,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
|
||||
DbResult<TramiteDocumentoUploadContextModel> GetUploadContext(
|
||||
int developmentId,
|
||||
int requestId,
|
||||
int documentTypeId,
|
||||
int executingUser,
|
||||
string domainName);
|
||||
string domainName,
|
||||
int? cveFraccionamientoEtapa = null);
|
||||
|
||||
DbResult<TramiteDocumentoSaveResultModel> Upload(
|
||||
int developmentId,
|
||||
@@ -31,7 +66,17 @@ namespace SIG.Web.AppCode.Contracts.Documentos
|
||||
long contentLength,
|
||||
string clientComment,
|
||||
int executingUser,
|
||||
string domainName);
|
||||
string domainName,
|
||||
DateTime? fechaDocumento = null,
|
||||
DateTime? fechaVencimiento = null,
|
||||
int? cveFraccionamientoEtapa = null);
|
||||
|
||||
DbResult<bool> Eliminar(
|
||||
int cveFraccionamiento,
|
||||
int cveSolicitud,
|
||||
int cveDocumentoSolicitud,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
|
||||
DbResult<TramiteDocumentoReviewResultModel> Review(
|
||||
int developmentId,
|
||||
@@ -57,13 +102,15 @@ namespace SIG.Web.AppCode.Contracts.Documentos
|
||||
string contentType,
|
||||
long contentLength,
|
||||
int executingUser,
|
||||
string domainName);
|
||||
string domainName,
|
||||
ModeloOperacionBitacora operacionBitacora = null);
|
||||
|
||||
DbResult<bool> RemoveExternalStageFile(
|
||||
int stageId,
|
||||
int procedureTypeId,
|
||||
int documentTypeId,
|
||||
int executingUser,
|
||||
string domainName);
|
||||
string domainName,
|
||||
ModeloOperacionBitacora operacionBitacora = null);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.Fraccionamientos;
|
||||
|
||||
@@ -6,6 +6,17 @@ namespace SIG.Web.AppCode.Contracts.Fraccionamientos
|
||||
{
|
||||
public interface IRepositorioFraccionamiento
|
||||
{
|
||||
DbResult<List<OpcionTipoVivienda>> ListarTiposVivienda(int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<List<ModeloTipoViviendaEtapa>> ListarTiposViviendaEtapa(int cveEtapa, int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<int> GuardarTipoViviendaEtapa(ModeloTipoViviendaEtapa registro, int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<bool> EliminarTipoViviendaEtapa(int cveEtapa, int cveRegistro, int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<List<ModeloLoteTipoViviendaEtapa>> ListarLotesTipoViviendaEtapa(int cveEtapa, int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<int> VincularLoteTipoViviendaEtapa(int cveEtapa, int cveRegistro, int cveLote, int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<bool> DesvincularLoteTipoViviendaEtapa(int cveEtapa, int cveVinculo, int cveUsuarioEjecuta, string nombreDominio);
|
||||
|
||||
DbResult<List<ModeloFilaDesarrollos>> ListarDesarrollos(
|
||||
int cveCliente, int cveUsuarioEjecuta, string nombreDominio);
|
||||
|
||||
DbResult<List<OpcionClienteFraccionamiento>> ListarClientes(int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<List<OpcionEstatusFraccionamiento>> ListarEstatus(int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<List<ModeloFraccionamiento>> Listar(string texto, int? cveCliente, bool incluirInactivo, int cveUsuarioEjecuta, string nombreDominio);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.Fraccionamientos;
|
||||
|
||||
@@ -6,6 +6,17 @@ namespace SIG.Web.AppCode.Contracts.Fraccionamientos
|
||||
{
|
||||
public interface IServicioFraccionamiento
|
||||
{
|
||||
DbResult<List<OpcionTipoVivienda>> ListarTiposVivienda(int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<List<ModeloTipoViviendaEtapa>> ListarTiposViviendaEtapa(int cveEtapa, int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<int> GuardarTipoViviendaEtapa(ModeloTipoViviendaEtapa registro, int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<bool> EliminarTipoViviendaEtapa(int cveEtapa, int cveRegistro, int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<List<ModeloLoteTipoViviendaEtapa>> ListarLotesTipoViviendaEtapa(int cveEtapa, int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<int> VincularLoteTipoViviendaEtapa(int cveEtapa, int cveRegistro, int cveLote, int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<bool> DesvincularLoteTipoViviendaEtapa(int cveEtapa, int cveVinculo, int cveUsuarioEjecuta, string nombreDominio);
|
||||
|
||||
DbResult<List<ModeloFilaDesarrollos>> ListarDesarrollos(
|
||||
int cveCliente, int cveUsuarioEjecuta, string nombreDominio);
|
||||
|
||||
DbResult<List<OpcionClienteFraccionamiento>> ListarClientes(int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<List<OpcionEstatusFraccionamiento>> ListarEstatus(int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<List<ModeloFraccionamiento>> Listar(string texto, int? cveCliente, bool incluirInactivo, int cveUsuarioEjecuta, string nombreDominio);
|
||||
@@ -14,6 +25,11 @@ namespace SIG.Web.AppCode.Contracts.Fraccionamientos
|
||||
int cveFraccionamiento,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
DbResult<int> GuardarConEtapas(
|
||||
ModeloFraccionamiento fraccionamiento,
|
||||
IList<ModeloEtapaFraccionamiento> etapas,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
DbResult<int> Guardar(ModeloFraccionamiento fraccionamiento, int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<bool> Eliminar(int cveFraccionamiento, int cveUsuarioEjecuta, string nombreDominio);
|
||||
DbResult<List<ModeloEtapaFraccionamiento>> ListarEtapas(int cveFraccionamiento, int cveUsuarioEjecuta, string nombreDominio);
|
||||
|
||||
14
SIG.Web/App_Code/Contracts/General/IRepositorioTurnos.cs
Normal file
14
SIG.Web/App_Code/Contracts/General/IRepositorioTurnos.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.General;
|
||||
|
||||
namespace SIG.Web.AppCode.Contracts.General
|
||||
{
|
||||
public interface IRepositorioTurnos
|
||||
{
|
||||
DbResult<List<ModeloTurno>> Listar(string texto, bool incluirInactivos, int usuario, string dominio);
|
||||
DbResult<ModeloTurno> Obtener(int cveTurno, int usuario, string dominio);
|
||||
DbResult<int> Guardar(ModeloTurno turno, int usuario, string dominio);
|
||||
DbResult<bool> Eliminar(int cveTurno, int usuario, string dominio);
|
||||
}
|
||||
}
|
||||
14
SIG.Web/App_Code/Contracts/General/IServicioTurnos.cs
Normal file
14
SIG.Web/App_Code/Contracts/General/IServicioTurnos.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.General;
|
||||
|
||||
namespace SIG.Web.AppCode.Contracts.General
|
||||
{
|
||||
public interface IServicioTurnos
|
||||
{
|
||||
DbResult<List<ModeloTurno>> Listar(string texto, bool incluirInactivos, int usuario, string dominio);
|
||||
DbResult<ModeloTurno> Obtener(int cveTurno, int usuario, string dominio);
|
||||
DbResult<int> Guardar(ModeloTurno turno, int usuario, string dominio);
|
||||
DbResult<bool> Eliminar(int cveTurno, int usuario, string dominio);
|
||||
}
|
||||
}
|
||||
@@ -4,5 +4,6 @@ namespace SIG.Web.AppCode.Contracts.Security
|
||||
{
|
||||
bool IsConfigured { get; }
|
||||
void SendVerification(string recipient, string verificationUrl);
|
||||
void EnviarContrasena(string destinatario, string nombreUsuario, string contrasena);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.Security;
|
||||
|
||||
namespace SIG.Web.AppCode.Contracts.Security
|
||||
{
|
||||
public interface IRepositorioCalendarioVisitas
|
||||
{
|
||||
DbResult<ModeloConfiguracionVisitas> ObtenerConfiguracion(int usuario, string dominio);
|
||||
DbResult<int> GuardarConfiguracion(ModeloConfiguracionVisitas configuracion, int usuario, string dominio);
|
||||
DbResult<List<ModeloDiaFestivo>> ListarDiasFestivos(string texto, int usuario, string dominio);
|
||||
DbResult<ModeloDiaFestivo> ObtenerDiaFestivo(int clave, int usuario, string dominio);
|
||||
DbResult<int> GuardarDiaFestivo(ModeloDiaFestivo dia, int usuario, string dominio);
|
||||
DbResult<bool> EliminarDiaFestivo(int clave, int usuario, string dominio);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.Security;
|
||||
|
||||
namespace SIG.Web.AppCode.Contracts.Security
|
||||
{
|
||||
public interface IServicioCalendarioVisitas
|
||||
{
|
||||
DbResult<ModeloConfiguracionVisitas> ObtenerConfiguracion(int usuario, string dominio);
|
||||
DbResult<int> GuardarConfiguracion(ModeloConfiguracionVisitas configuracion, int usuario, string dominio);
|
||||
DbResult<List<ModeloDiaFestivo>> ListarDiasFestivos(string texto, int usuario, string dominio);
|
||||
DbResult<ModeloDiaFestivo> ObtenerDiaFestivo(int clave, int usuario, string dominio);
|
||||
DbResult<int> GuardarDiaFestivo(ModeloDiaFestivo dia, int usuario, string dominio);
|
||||
DbResult<bool> EliminarDiaFestivo(int clave, int usuario, string dominio);
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,12 @@ namespace SIG.Web.AppCode.Contracts.Security
|
||||
{
|
||||
public interface IUserAdministrationRepository
|
||||
{
|
||||
DbResult<List<UserAdministrationModel>> ListarCatalogo(
|
||||
string texto, int tipoUsuario, bool incluirInactivos, int usuario, string dominio);
|
||||
|
||||
DbResult<UserAdministrationModel> ReiniciarContrasena(
|
||||
int cveUsuario, string hashContrasena, int usuario, string dominio);
|
||||
|
||||
DbResult<List<UserAdministrationModel>> ListUsers(string text, int executingUser, string domainName);
|
||||
DbResult<UserAdministrationModel> GetUser(int userId, int executingUser, string domainName);
|
||||
DbResult<List<RoleOptionModel>> ListRoles(int executingUser, string domainName);
|
||||
|
||||
@@ -6,6 +6,11 @@ namespace SIG.Web.AppCode.Contracts.Security
|
||||
{
|
||||
public interface IUserAdministrationService
|
||||
{
|
||||
DbResult<List<UserAdministrationModel>> ListarCatalogo(
|
||||
string texto, int tipoUsuario, bool incluirInactivos, int usuario, string dominio);
|
||||
|
||||
DbResult<bool> ReiniciarContrasenaYEnviar(int cveUsuario, int usuario, string dominio);
|
||||
|
||||
DbResult<List<UserAdministrationModel>> ListUsers(
|
||||
string text,
|
||||
int executingUser,
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.Tramites;
|
||||
|
||||
namespace SIG.Web.AppCode.Contracts.Tramites
|
||||
{
|
||||
public interface IRepositorioPagosConvenios
|
||||
{
|
||||
DbResult<List<ModeloFormaComprobantePago>> ListarFormasComprobante(int usuario, string dominio);
|
||||
|
||||
DbResult<List<ModeloComprobantePago>> ListarComprobantes(
|
||||
int cveSolicitudPago, int usuario, string dominio);
|
||||
|
||||
DbResult<ModeloComprobantePago> ObtenerComprobante(
|
||||
int cveComprobantePago, int usuario, string dominio);
|
||||
|
||||
DbResult<int> RegistrarComprobante(ModeloComprobantePago comprobante, int usuario, string dominio);
|
||||
|
||||
DbResult<bool> AprobarComprobante(int cveComprobantePago, int cvePago, int usuario, string dominio);
|
||||
|
||||
DbResult<List<ModeloObligacionPago>> ListarObligaciones(
|
||||
ModeloFiltroObligacionesPago filtro,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<ModeloObligacionPago> ObtenerObligacion(
|
||||
int cveSolicitudPago,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<List<ModeloObligacionPago>> ListarConvenios(
|
||||
int? cveCliente, bool? soloPendientes, bool soloVencidos,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<int> GuardarObligacion(
|
||||
ModeloCapturaObligacion obligacion,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<List<ModeloClaveObligacionPago>> GenerarObligaciones(
|
||||
int cveSolicitud, DateTime fechaVencimiento, int? cveTramitePago,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<bool> CambiarRequerido(
|
||||
int cveSolicitudPago, bool esRequerido, string observacion,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<bool> CancelarObligacion(
|
||||
int cveSolicitudPago,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<List<ModeloAbono>> ListarAbonos(
|
||||
ModeloFiltroAbonos filtro,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<ModeloAbono> ObtenerAbono(
|
||||
int cvePago,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<int> RegistrarAbono(
|
||||
ModeloCapturaAbono abono,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<bool> AplicarAbono(
|
||||
int cvePago, List<ModeloCapturaAplicacionAbono> aplicaciones,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<bool> CancelarAbono(
|
||||
int cvePago,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<bool> CancelarConvenio(
|
||||
int cveSolicitudPago,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<int> GuardarConvenio(
|
||||
ModeloCapturaConvenio convenio, bool permitirDisminucion,
|
||||
int usuario, string dominio);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.Tramites;
|
||||
|
||||
namespace SIG.Web.AppCode.Contracts.Tramites
|
||||
{
|
||||
public interface IServicioPagosConvenios
|
||||
{
|
||||
DbResult<List<ModeloFormaComprobantePago>> ListarFormasComprobante(int usuario, string dominio);
|
||||
|
||||
DbResult<List<ModeloComprobantePago>> ListarComprobantes(
|
||||
int cveSolicitudPago, int usuario, string dominio);
|
||||
|
||||
DbResult<int> EnviarComprobante(
|
||||
ModeloComprobantePago comprobante, System.IO.Stream contenido, int usuario, string dominio);
|
||||
|
||||
DbResult<int> AprobarComprobante(int cveComprobantePago, int usuario, string dominio);
|
||||
|
||||
DbResult<ModeloArchivoComprobantePago> ObtenerArchivoComprobante(
|
||||
int cveComprobantePago, int usuario, string dominio);
|
||||
|
||||
DbResult<List<ModeloObligacionPago>> ListarObligaciones(
|
||||
ModeloFiltroObligacionesPago filtro,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<ModeloObligacionPago> ObtenerObligacion(
|
||||
int cveSolicitudPago,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<List<ModeloObligacionPago>> ListarConvenios(
|
||||
int? cveCliente, bool? soloPendientes, bool soloVencidos,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<int> GuardarObligacion(
|
||||
ModeloCapturaObligacion obligacion,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<List<ModeloClaveObligacionPago>> GenerarObligaciones(
|
||||
int cveSolicitud, DateTime fechaVencimiento, int? cveTramitePago,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<bool> CambiarRequerido(
|
||||
int cveSolicitudPago, bool esRequerido, string observacion,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<bool> CancelarObligacion(
|
||||
int cveSolicitudPago,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<List<ModeloAbono>> ListarAbonos(
|
||||
ModeloFiltroAbonos filtro,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<ModeloAbono> ObtenerAbono(
|
||||
int cvePago,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<int> RegistrarAbono(
|
||||
ModeloCapturaAbono abono,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<bool> AplicarAbono(
|
||||
int cvePago, List<ModeloCapturaAplicacionAbono> aplicaciones,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<bool> CancelarAbono(
|
||||
int cvePago,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<bool> CancelarConvenio(
|
||||
int cveSolicitudPago,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<int> GuardarConvenio(
|
||||
ModeloCapturaConvenio convenio,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<List<ModeloProporcionProductoConvenio>> SugerirDistribucionConvenio(
|
||||
int cveSolicitudPagoOrigen, decimal importeNuevo,
|
||||
int usuario, string dominio);
|
||||
|
||||
DbResult<ModeloPropuestaConvenio> PrepararDistribucionConvenio(
|
||||
int cveSolicitudPagoOrigen, decimal saldoSeleccionado, decimal importeNuevo,
|
||||
int usuario, string dominio);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.Tramites;
|
||||
|
||||
@@ -33,9 +33,9 @@ namespace SIG.Web.AppCode.Contracts.Tramites
|
||||
DbResult<int> SaveTipoDocumento(TipoDocumentoModel model, int usuario, string dominio);
|
||||
DbResult<bool> DeleteTipoDocumento(int id, int usuario, string dominio);
|
||||
DbResult<List<DocumentoRequeridoModel>> ListDocumentosRequeridos(int? tipoTramite, bool incluirInactivos, int usuario, string dominio);
|
||||
DbResult<DocumentoRequeridoModel> GetDocumentoRequerido(int id, int usuario, string dominio);
|
||||
DbResult<DocumentoRequeridoModel> GetDocumentoRequerido(int cveTipoTramite, int cveTipoDocumento, int usuario, string dominio);
|
||||
DbResult<int> SaveDocumentoRequerido(DocumentoRequeridoModel model, int usuario, string dominio);
|
||||
DbResult<bool> DeleteDocumentoRequerido(int id, int usuario, string dominio);
|
||||
DbResult<bool> DeleteDocumentoRequerido(int cveTipoTramite, int cveTipoDocumento, int usuario, string dominio);
|
||||
DbResult<List<TipoPreguntaModel>> ListTiposPregunta(int usuario, string dominio);
|
||||
DbResult<List<PreguntaTramiteModel>> ListPreguntas(int tipoTramite, bool soloConOpciones, int usuario, string dominio);
|
||||
DbResult<PreguntaTramiteModel> GetPregunta(int id, int usuario, string dominio);
|
||||
@@ -56,6 +56,6 @@ namespace SIG.Web.AppCode.Contracts.Tramites
|
||||
DbResult<List<ModeloProductoServicioTramite>> ListProductosServicios(string texto, bool incluirInactivos, int usuario, string dominio);
|
||||
DbResult<ModeloProductoServicioTramite> GetProductoServicio(int id, int usuario, string dominio);
|
||||
DbResult<int> UpdateProductoServicioPrecio(int id, decimal precio, int usuario, string dominio);
|
||||
DbResult<bool> MoveOrder(TramiteCatalogOrderEntity entity, int id, int referenceId, bool placeAfter, int usuario, string dominio);
|
||||
DbResult<bool> MoveOrder(TramiteCatalogOrderEntity entity, int id, int referenceId, bool placeAfter, int usuario, string dominio, int? cveTipoTramite = null);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,30 @@ namespace SIG.Web.AppCode.Contracts.Tramites
|
||||
{
|
||||
public interface ITramiteSolicitudRepository
|
||||
{
|
||||
DbResult<bool> ActualizarProceso(
|
||||
int? cveSolicitud, int? cveFraccionamientoEtapa,
|
||||
int cveUsuarioEjecuta, string nombreDominio);
|
||||
|
||||
DbResult<List<ModeloAccionPendienteSolicitud>> ListarAccionesPendientes(
|
||||
int cveSolicitud, int cveUsuarioEjecuta, string nombreDominio);
|
||||
|
||||
DbResult<List<ModeloComentarioSolicitud>> ListarComentarios(
|
||||
int cveSolicitud, int cveUsuarioEjecuta, string nombreDominio);
|
||||
|
||||
DbResult<ModeloComentarioSolicitud> AgregarComentario(
|
||||
int cveSolicitud, int? cveComentarioPadre, string comentario,
|
||||
int cveUsuarioEjecuta, string nombreDominio);
|
||||
|
||||
DbResult<ModeloResultadoTableroTramites> ConsultarTablero(
|
||||
ModeloFiltroTableroTramites filtros,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
|
||||
DbResult<List<ModeloHistorialEstatusSolicitud>> ListarHistorialEstatus(
|
||||
int cveSolicitud,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
|
||||
DbResult<int> EnsureStageRequest(
|
||||
int stageId,
|
||||
int procedureTypeId,
|
||||
@@ -49,9 +73,16 @@ namespace SIG.Web.AppCode.Contracts.Tramites
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
|
||||
DbResult<List<ModeloPagoSolicitud>> ListarPagosSolicitud(
|
||||
int cveSolicitud,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
|
||||
DbResult<TramiteSolicitudStatusChangeModel> CambiarEstatus(
|
||||
int cveSolicitud,
|
||||
int cveEstatusSolicitud,
|
||||
int cveEstatusSolicitudAnterior,
|
||||
string observaciones,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
|
||||
|
||||
@@ -6,6 +6,30 @@ namespace SIG.Web.AppCode.Contracts.Tramites
|
||||
{
|
||||
public interface ITramiteSolicitudService
|
||||
{
|
||||
DbResult<List<ModeloAccionPendienteSolicitud>> ListarAccionesPendientes(
|
||||
int cveSolicitud, int cveUsuarioEjecuta, string nombreDominio);
|
||||
|
||||
DbResult<List<ModeloComentarioSolicitud>> ListarComentarios(
|
||||
int cveSolicitud, int cveUsuarioEjecuta, string nombreDominio);
|
||||
|
||||
DbResult<ModeloComentarioSolicitud> AgregarComentario(
|
||||
int cveSolicitud, int? cveComentarioPadre, string comentario,
|
||||
int cveUsuarioEjecuta, string nombreDominio);
|
||||
|
||||
DbResult<bool> ActualizarCondicionesSolicitud(
|
||||
ModeloCambioEstatusTramite condiciones,
|
||||
int cveUsuarioEjecuta, string nombreDominio);
|
||||
|
||||
DbResult<ModeloResultadoTableroTramites> ConsultarTablero(
|
||||
ModeloFiltroTableroTramites filtros,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
|
||||
DbResult<List<ModeloHistorialEstatusSolicitud>> ListarHistorialEstatus(
|
||||
int cveSolicitud,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
|
||||
DbResult<List<TramiteSolicitudTipoOptionModel>> ListAvailableTypesForStage(
|
||||
int developmentId,
|
||||
int stageId,
|
||||
@@ -43,6 +67,11 @@ namespace SIG.Web.AppCode.Contracts.Tramites
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
|
||||
DbResult<ModeloContextoCambioEstatus> ObtenerContextoCambioEstatus(
|
||||
int cveSolicitud,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio);
|
||||
|
||||
DbResult<TramiteSolicitudStatusChangeModel> CambiarEstatus(
|
||||
ModeloCambioEstatusTramite cambioEstatus,
|
||||
int cveUsuarioEjecuta,
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
using System.IO;
|
||||
using SIG.Web.AppCode.Models.Visitas;
|
||||
|
||||
namespace SIG.Web.AppCode.Contracts.Visitas
|
||||
{
|
||||
public interface IAlmacenDocumentosVisita
|
||||
{
|
||||
void Guardar(ModeloDocumentoVisita documento, Stream contenido);
|
||||
Stream Abrir(ModeloDocumentoVisita documento);
|
||||
void Eliminar(ModeloDocumentoVisita documento);
|
||||
}
|
||||
}
|
||||
44
SIG.Web/App_Code/Contracts/Visitas/IRepositorioVisitas.cs
Normal file
44
SIG.Web/App_Code/Contracts/Visitas/IRepositorioVisitas.cs
Normal file
@@ -0,0 +1,44 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.Visitas;
|
||||
|
||||
namespace SIG.Web.AppCode.Contracts.Visitas
|
||||
{
|
||||
public interface IRepositorioVisitas
|
||||
{
|
||||
DbResult<List<ModeloUsuarioSupervision>> ListarUsuariosSupervision(bool supervisores, int usuario, string dominio);
|
||||
DbResult<List<ModeloPlantillaVisita>> ListarPlantillas(string texto, int usuario, string dominio);
|
||||
DbResult<ModeloPlantillaVisita> ObtenerPlantilla(int clave, int usuario, string dominio);
|
||||
DbResult<int> GuardarPlantilla(ModeloPlantillaVisita plantilla, int usuario, string dominio);
|
||||
DbResult<bool> EliminarPlantilla(int clave, int usuario, string dominio);
|
||||
DbResult<int> GuardarPregunta(ModeloPreguntaVisita pregunta, int usuario, string dominio);
|
||||
DbResult<bool> EliminarPregunta(int clave, int usuario, string dominio);
|
||||
DbResult<int> GuardarOpcion(ModeloOpcionVisita opcion, int usuario, string dominio);
|
||||
DbResult<bool> EliminarOpcion(int clave, int usuario, string dominio);
|
||||
DbResult<bool> ActualizarOrdenPregunta(int clave, int referencia, bool colocarDespues, int usuario, string dominio);
|
||||
DbResult<bool> ActualizarOrdenOpcion(int clave, int referencia, bool colocarDespues, int usuario, string dominio);
|
||||
DbResult<List<ModeloCita>> ListarCitas(string texto, DateTime? desde, DateTime? hasta, int usuario, string dominio);
|
||||
DbResult<ModeloCita> ObtenerCita(int clave, int usuario, string dominio);
|
||||
DbResult<ModeloDisponibilidadVisita> ObtenerDisponibilidad(DateTime fechaDesde, int duracionMinutos, int? supervisor, int citaExcluir, int usuario, string dominio);
|
||||
DbResult<int> GuardarCita(ModeloCita cita, int usuario, string dominio);
|
||||
DbResult<bool> CancelarCita(int clave, int usuario, string dominio);
|
||||
DbResult<ModeloVisita> ObtenerVisita(int clave, int usuario, string dominio);
|
||||
DbResult<int> GuardarVisita(ModeloVisita visita, int usuario, string dominio);
|
||||
DbResult<ModeloCuestionarioVisita> ObtenerCuestionario(int clave, int usuario, string dominio);
|
||||
DbResult<int> GuardarCuestionario(ModeloCuestionarioVisita cuestionario, int usuario, string dominio);
|
||||
DbResult<bool> EliminarCuestionario(int clave, int usuario, string dominio);
|
||||
DbResult<ModeloDocumentoVisita> ObtenerDocumento(int clave, int usuario, string dominio);
|
||||
DbResult<int> GuardarDocumento(ModeloDocumentoVisita documento, int usuario, string dominio);
|
||||
DbResult<bool> EliminarDocumento(int clave, int usuario, string dominio);
|
||||
DbResult<int> GuardarComentario(ModeloComentarioVisita comentario, int usuario, string dominio);
|
||||
DbResult<bool> EliminarComentario(int clave, int usuario, string dominio);
|
||||
DbResult<List<ModeloDisponibilidadVisita>> ListarDisponibilidad(DateTime fechaDesde, int duracionMinutos, int? supervisor, int citaExcluir, int usuario, string dominio);
|
||||
DbResult<List<ModeloVisita>> ListarSupervisiones(int? cliente, int? etapa, int usuario, string dominio);
|
||||
DbResult<List<ModeloLoteSupervision>> ListarLotesVisita(int visita, int usuario, string dominio);
|
||||
DbResult<List<ModeloLoteSupervision>> ListarHistorialLote(int lote, int usuario, string dominio);
|
||||
DbResult<int> GuardarLoteVisita(ModeloLoteSupervision lote, int usuario, string dominio);
|
||||
DbResult<List<ModeloVinculoGisSupervision>> ListarVinculosGis(int etapa, int usuario, string dominio);
|
||||
DbResult<int> GuardarVinculoGis(ModeloVinculoGisSupervision vinculo, int usuario, string dominio);
|
||||
}
|
||||
}
|
||||
45
SIG.Web/App_Code/Contracts/Visitas/IServicioVisitas.cs
Normal file
45
SIG.Web/App_Code/Contracts/Visitas/IServicioVisitas.cs
Normal file
@@ -0,0 +1,45 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.Visitas;
|
||||
|
||||
namespace SIG.Web.AppCode.Contracts.Visitas
|
||||
{
|
||||
public interface IServicioVisitas
|
||||
{
|
||||
DbResult<List<ModeloUsuarioSupervision>> ListarUsuariosSupervision(bool supervisores, int usuario, string dominio);
|
||||
DbResult<List<ModeloPlantillaVisita>> ListarPlantillas(string texto, int usuario, string dominio);
|
||||
DbResult<ModeloPlantillaVisita> ObtenerPlantilla(int clave, int usuario, string dominio);
|
||||
DbResult<int> GuardarPlantilla(ModeloPlantillaVisita plantilla, int usuario, string dominio);
|
||||
DbResult<bool> EliminarPlantilla(int clave, int usuario, string dominio);
|
||||
DbResult<int> GuardarPregunta(int plantilla, ModeloPreguntaVisita pregunta, int usuario, string dominio);
|
||||
DbResult<bool> EliminarPregunta(int plantilla, int clave, int usuario, string dominio);
|
||||
DbResult<int> GuardarOpcion(int plantilla, ModeloOpcionVisita opcion, int usuario, string dominio);
|
||||
DbResult<bool> EliminarOpcion(int plantilla, int clave, int usuario, string dominio);
|
||||
DbResult<bool> ActualizarOrdenPregunta(int plantilla, int clave, int referencia, bool colocarDespues, int usuario, string dominio);
|
||||
DbResult<bool> ActualizarOrdenOpcion(int plantilla, int clave, int referencia, bool colocarDespues, int usuario, string dominio);
|
||||
DbResult<List<ModeloCita>> ListarCitas(string texto, DateTime? desde, DateTime? hasta, int usuario, string dominio);
|
||||
DbResult<ModeloCita> ObtenerCita(int clave, int usuario, string dominio);
|
||||
DbResult<ModeloDisponibilidadVisita> ObtenerDisponibilidad(DateTime fechaDesde, int duracionMinutos, int? supervisor, int citaExcluir, int usuario, string dominio);
|
||||
DbResult<int> GuardarCita(ModeloCita cita, int usuario, string dominio);
|
||||
DbResult<bool> CancelarCita(int clave, int usuario, string dominio);
|
||||
DbResult<ModeloVisita> ObtenerVisita(int clave, int usuario, string dominio);
|
||||
DbResult<int> GuardarVisita(ModeloVisita visita, int usuario, string dominio);
|
||||
DbResult<ModeloCuestionarioVisita> ObtenerCuestionario(int clave, int usuario, string dominio);
|
||||
DbResult<int> GuardarCuestionario(ModeloCuestionarioVisita cuestionario, int usuario, string dominio);
|
||||
DbResult<bool> EliminarCuestionario(int visita, int clave, int usuario, string dominio);
|
||||
DbResult<bool> EliminarDocumento(int visita, int clave, int usuario, string dominio);
|
||||
DbResult<int> GuardarComentario(int visita, ModeloComentarioVisita comentario, int usuario, string dominio);
|
||||
DbResult<bool> EliminarComentario(int visita, int clave, int usuario, string dominio);
|
||||
DbResult<int> CargarDocumento(int visita, int? cuestionario, string nombreArchivo, string tipoContenido, System.IO.Stream contenido, long longitud, int usuario, string dominio);
|
||||
DbResult<ArchivoVisita> AbrirDocumento(int clave, int usuario, string dominio);
|
||||
DbResult<List<ModeloDisponibilidadVisita>> ListarDisponibilidad(DateTime fechaDesde, int duracionMinutos, int? supervisor, int citaExcluir, int usuario, string dominio);
|
||||
DbResult<List<ModeloVisita>> ListarSupervisiones(int? cliente, int? etapa, int usuario, string dominio);
|
||||
DbResult<List<ModeloLoteSupervision>> ListarLotesVisita(int visita, int usuario, string dominio);
|
||||
DbResult<List<ModeloLoteSupervision>> ListarHistorialLote(int lote, int usuario, string dominio);
|
||||
DbResult<int> GuardarLoteVisita(ModeloLoteSupervision lote, int usuario, string dominio);
|
||||
DbResult<List<ModeloVinculoGisSupervision>> ListarVinculosGis(int etapa, int usuario, string dominio);
|
||||
DbResult<int> GuardarVinculoGis(int etapa, ModeloVinculoGisSupervision vinculo, int usuario, string dominio);
|
||||
DbResult<List<ModeloPoligonoSupervision>> ListarPoligonosGis(int etapa, int usuario, string dominio);
|
||||
}
|
||||
}
|
||||
@@ -53,9 +53,11 @@ namespace SIG.Web.Pages.Fraccionamientos
|
||||
"POST",
|
||||
StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
if (string.Equals(metodo, "Save", StringComparison.OrdinalIgnoreCase))
|
||||
if (string.Equals(metodo, "Save", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(metodo, "GuardarArchivo", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(metodo, "GuardarVinculos", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
Guardar(contexto, actualUsuario);
|
||||
Guardar(contexto, actualUsuario, metodo);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -162,7 +164,8 @@ namespace SIG.Web.Pages.Fraccionamientos
|
||||
|
||||
private static void Guardar(
|
||||
HttpContext contexto,
|
||||
UserSessionModel actualUsuario)
|
||||
UserSessionModel actualUsuario,
|
||||
string metodo)
|
||||
{
|
||||
int cveFraccionamientoEtapa;
|
||||
if (!IntentarObtenerCveEtapa(contexto, out cveFraccionamientoEtapa))
|
||||
@@ -179,15 +182,27 @@ namespace SIG.Web.Pages.Fraccionamientos
|
||||
return;
|
||||
}
|
||||
|
||||
IList<VinculoLoteGisFraccionamiento> vinculos;
|
||||
bool soloArchivo = string.Equals(
|
||||
metodo, "GuardarArchivo", StringComparison.OrdinalIgnoreCase);
|
||||
bool soloVinculos = string.Equals(
|
||||
metodo, "GuardarVinculos", StringComparison.OrdinalIgnoreCase);
|
||||
IList<VinculoLoteGisFraccionamiento> vinculos = null;
|
||||
string vinculosJson = contexto.Request.Form["vinculos"];
|
||||
|
||||
try
|
||||
{
|
||||
vinculos = string.IsNullOrWhiteSpace(vinculosJson)
|
||||
? new List<VinculoLoteGisFraccionamiento>()
|
||||
: SerializadorJson.Deserialize<List<VinculoLoteGisFraccionamiento>>(
|
||||
vinculosJson);
|
||||
if (!soloArchivo)
|
||||
{
|
||||
vinculos = string.IsNullOrWhiteSpace(vinculosJson)
|
||||
? null
|
||||
: SerializadorJson.Deserialize<List<VinculoLoteGisFraccionamiento>>(
|
||||
vinculosJson);
|
||||
}
|
||||
|
||||
if (soloVinculos && vinculos == null)
|
||||
{
|
||||
throw new FormatException("No se recibió la lista de vínculos.");
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
@@ -203,7 +218,9 @@ namespace SIG.Web.Pages.Fraccionamientos
|
||||
return;
|
||||
}
|
||||
|
||||
HttpPostedFile archivoPublicado = contexto.Request.Files["file"];
|
||||
HttpPostedFile archivoPublicado = soloVinculos
|
||||
? null
|
||||
: contexto.Request.Files["file"];
|
||||
Stream contenido = archivoPublicado != null
|
||||
? archivoPublicado.InputStream
|
||||
: null;
|
||||
@@ -236,7 +253,11 @@ namespace SIG.Web.Pages.Fraccionamientos
|
||||
new
|
||||
{
|
||||
success = true,
|
||||
message = "GIS y vínculos guardados correctamente.",
|
||||
message = soloArchivo
|
||||
? "Archivo GIS guardado. Puede vincular los lotes por separado."
|
||||
: soloVinculos
|
||||
? "Vínculos guardados. Puede continuar con los lotes pendientes después."
|
||||
: "GIS y vínculos guardados correctamente.",
|
||||
data = resultado.Data
|
||||
});
|
||||
}
|
||||
|
||||
52
SIG.Web/App_Code/Handlers/Visitas/DescargaDocumentoVisita.cs
Normal file
52
SIG.Web/App_Code/Handlers/Visitas/DescargaDocumentoVisita.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
using System;
|
||||
using System.Web;
|
||||
using System.Web.SessionState;
|
||||
using SIG.Web.AppCode.Configuration;
|
||||
|
||||
namespace SIG.Web.AppCode.Handlers.Visitas
|
||||
{
|
||||
public sealed class DescargaDocumentoVisita : IHttpHandler, IReadOnlySessionState
|
||||
{
|
||||
public bool IsReusable { get { return false; } }
|
||||
|
||||
public void ProcessRequest(HttpContext contexto)
|
||||
{
|
||||
var usuario = AppServices.UserContext.GetCurrentUser();
|
||||
int clave;
|
||||
if (usuario == null)
|
||||
{
|
||||
contexto.Response.StatusCode = 401;
|
||||
return;
|
||||
}
|
||||
if (!int.TryParse(contexto.Request.QueryString["documento"], out clave) || clave <= 0)
|
||||
{
|
||||
contexto.Response.StatusCode = 400;
|
||||
return;
|
||||
}
|
||||
var resultado = AppServices.ServicioVisitas.AbrirDocumento(clave, usuario.CveUsuario, usuario.NombreDominio);
|
||||
if (!resultado.Success || resultado.Data == null)
|
||||
{
|
||||
contexto.Response.StatusCode = 404;
|
||||
contexto.Response.ContentType = "text/plain";
|
||||
contexto.Response.Write(resultado.UserMessage);
|
||||
return;
|
||||
}
|
||||
using (resultado.Data.Contenido)
|
||||
{
|
||||
contexto.Response.Clear();
|
||||
contexto.Response.ContentType = resultado.Data.TipoContenido;
|
||||
contexto.Response.Cache.SetCacheability(HttpCacheability.NoCache);
|
||||
contexto.Response.Cache.SetNoStore();
|
||||
contexto.Response.AddHeader("X-Content-Type-Options", "nosniff");
|
||||
bool mostrarImagen = contexto.Request.QueryString["vista"] == "1" &&
|
||||
(resultado.Data.TipoContenido == "image/jpeg" || resultado.Data.TipoContenido == "image/png" ||
|
||||
resultado.Data.TipoContenido == "image/gif" || resultado.Data.TipoContenido == "image/webp");
|
||||
contexto.Response.AddHeader("Content-Disposition",
|
||||
(mostrarImagen ? "inline" : "attachment") +
|
||||
"; filename*=UTF-8''" + Uri.EscapeDataString(resultado.Data.NombreArchivo));
|
||||
resultado.Data.Contenido.CopyTo(contexto.Response.OutputStream);
|
||||
}
|
||||
contexto.ApplicationInstance.CompleteRequest();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,84 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace SIG.Web.AppCode.Models.Bitacora
|
||||
{
|
||||
// Datos de una ejecución; nunca se conserva este objeto en sesión ni en estado global.
|
||||
public sealed class ModeloOperacionBitacora
|
||||
{
|
||||
public ModeloOperacionBitacora()
|
||||
{
|
||||
Registros = new List<ModeloRegistroBitacora>();
|
||||
}
|
||||
|
||||
public string CodigoAccion { get; set; }
|
||||
public string DescripcionMovimiento { get; set; }
|
||||
public int? CveUsuarioAutoriza { get; set; }
|
||||
public DateTime? FechaAutorizacion { get; set; }
|
||||
public IList<ModeloRegistroBitacora> Registros { get; set; }
|
||||
|
||||
public static ModeloOperacionBitacora Crear(
|
||||
string codigoAccion, params ModeloRegistroBitacora[] registros)
|
||||
{
|
||||
return Crear(codigoAccion, (IEnumerable<ModeloRegistroBitacora>)registros);
|
||||
}
|
||||
|
||||
public static ModeloOperacionBitacora Crear(
|
||||
string codigoAccion, IEnumerable<ModeloRegistroBitacora> registros)
|
||||
{
|
||||
var lista = registros.ToList();
|
||||
return new ModeloOperacionBitacora
|
||||
{
|
||||
CodigoAccion = codigoAccion,
|
||||
DescripcionMovimiento = lista.Count == 0
|
||||
? codigoAccion : lista[0].DescripcionRegistro,
|
||||
Registros = lista
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class ModeloRegistroBitacora
|
||||
{
|
||||
public ModeloRegistroBitacora()
|
||||
{
|
||||
DiscriminarCamposSinCambios = true;
|
||||
Campos = new List<BitacoraCampoEventoModel>();
|
||||
Relaciones = new List<BitacoraRelacionEventoModel>();
|
||||
}
|
||||
|
||||
public string NombreTablaSQL { get; set; }
|
||||
public BitacoraTipoMovimiento TipoMovimiento { get; set; }
|
||||
public long? LlaveRegistro { get; set; }
|
||||
public string LlaveRegistroTexto { get; set; }
|
||||
// Descripción de trabajo para que el servicio forme el encabezado de la operación.
|
||||
public string DescripcionRegistro { get; set; }
|
||||
// Sólo para efectos auditables sin valores de campos: archivos físicos o secretos.
|
||||
public bool RegistrarSinCampos { get; set; }
|
||||
public bool DiscriminarCamposSinCambios { get; set; }
|
||||
public IList<BitacoraCampoEventoModel> Campos { get; set; }
|
||||
public IList<BitacoraRelacionEventoModel> Relaciones { get; set; }
|
||||
}
|
||||
|
||||
public sealed class ModeloEventoBitacora
|
||||
{
|
||||
public long CveBitacoraEvento { get; set; }
|
||||
public int? CveDefinicionAccion { get; set; }
|
||||
public string CodigoAccion { get; set; }
|
||||
public string NombreAccion { get; set; }
|
||||
public int CveUsuarioEjecuta { get; set; }
|
||||
public string NombreUsuarioEjecuta { get; set; }
|
||||
public int? CveUsuarioAutoriza { get; set; }
|
||||
public DateTime? FechaAutorizacion { get; set; }
|
||||
public string DescripcionMovimiento { get; set; }
|
||||
public DateTime FechaMovimiento { get; set; }
|
||||
public string DireccionIP { get; set; }
|
||||
public string NombreEquipo { get; set; }
|
||||
public string Modulo { get; set; }
|
||||
public bool EsHistorico { get; set; }
|
||||
}
|
||||
|
||||
// Contrato anterior conservado para consumidores externos durante la migración.
|
||||
public sealed class BitacoraEventoModel
|
||||
{
|
||||
public BitacoraEventoModel()
|
||||
@@ -29,6 +105,8 @@ namespace SIG.Web.AppCode.Models.Bitacora
|
||||
public string NombreCampoSQL { get; set; }
|
||||
public object ValorAnterior { get; set; }
|
||||
public object ValorNuevo { get; set; }
|
||||
public string ValorAnteriorMostrar { get; set; }
|
||||
public string ValorNuevoMostrar { get; set; }
|
||||
}
|
||||
|
||||
public sealed class BitacoraRelacionEventoModel
|
||||
@@ -134,6 +212,8 @@ namespace SIG.Web.AppCode.Models.Bitacora
|
||||
|
||||
public sealed class BitacoraCampoModel
|
||||
{
|
||||
public int Orden { get; set; }
|
||||
public string LlaveRegistro { get; set; }
|
||||
public long CveBitacoraCampo { get; set; }
|
||||
public long CveBitacora { get; set; }
|
||||
public int CveCampo { get; set; }
|
||||
|
||||
75
SIG.Web/App_Code/Models/Busqueda/ModelosBuscadorCatalogo.cs
Normal file
75
SIG.Web/App_Code/Models/Busqueda/ModelosBuscadorCatalogo.cs
Normal file
@@ -0,0 +1,75 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace SIG.Web.AppCode.Models.Busqueda
|
||||
{
|
||||
public enum TipoFiltroBuscador { Lista, Texto, Numero, Fecha, FechaHora }
|
||||
public enum OperadorFiltroBuscador { Igual, MayorQue, MenorQue, MayorOIgualQue, MenorOIgualQue }
|
||||
|
||||
[Serializable]
|
||||
public sealed class ColumnaBuscador
|
||||
{
|
||||
public string Campo { get; set; }
|
||||
public string Titulo { get; set; }
|
||||
public bool Buscar { get; set; } = true;
|
||||
public bool Mostrar { get; set; } = true;
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class DefinicionFiltroBuscador
|
||||
{
|
||||
public string Clave { get; set; }
|
||||
public string Campo { get; set; }
|
||||
public string Titulo { get; set; }
|
||||
public TipoFiltroBuscador Tipo { get; set; }
|
||||
public bool ConBuscador { get; set; } = true;
|
||||
public List<OpcionFiltroBuscador> Opciones { get; set; } = new List<OpcionFiltroBuscador>();
|
||||
public List<OperadorFiltroBuscador> Operadores { get; set; } =
|
||||
new List<OperadorFiltroBuscador> { OperadorFiltroBuscador.Igual };
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class OpcionFiltroBuscador
|
||||
{
|
||||
public string Valor { get; set; }
|
||||
public string Texto { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class FiltroBuscador
|
||||
{
|
||||
public string Clave { get; set; }
|
||||
public string Campo { get; set; }
|
||||
public string Titulo { get; set; }
|
||||
public OperadorFiltroBuscador Operador { get; set; }
|
||||
public string Valor { get; set; }
|
||||
public string Texto { get; set; }
|
||||
}
|
||||
|
||||
public sealed class OrdenBuscador
|
||||
{
|
||||
public string Columna { get; set; }
|
||||
public bool Descendente { get; set; }
|
||||
}
|
||||
|
||||
public sealed class SolicitudBuscador
|
||||
{
|
||||
public string Texto { get; set; }
|
||||
public string Columna { get; set; }
|
||||
public int Pagina { get; set; } = 1;
|
||||
public int TamanoPagina { get; set; } = 50;
|
||||
public List<OrdenBuscador> Ordenes { get; set; } = new List<OrdenBuscador>();
|
||||
public List<FiltroBuscador> Filtros { get; set; } = new List<FiltroBuscador>();
|
||||
}
|
||||
|
||||
public sealed class ResultadoBuscador
|
||||
{
|
||||
// Nombres del protocolo consumido por el JavaScript original de SIG.
|
||||
public bool Ok { get; set; } = true;
|
||||
public string Mensaje { get; set; } = string.Empty;
|
||||
public List<Dictionary<string, object>> Items { get; set; } = new List<Dictionary<string, object>>();
|
||||
public int Pagina { get; set; } = 1;
|
||||
public int TotalRegistros { get; set; }
|
||||
public bool TieneMas { get; set; }
|
||||
}
|
||||
}
|
||||
47
SIG.Web/App_Code/Models/Clientes/ModelosDesarrolladores.cs
Normal file
47
SIG.Web/App_Code/Models/Clientes/ModelosDesarrolladores.cs
Normal file
@@ -0,0 +1,47 @@
|
||||
using System;
|
||||
|
||||
namespace SIG.Web.AppCode.Models.Clientes
|
||||
{
|
||||
[Serializable]
|
||||
public sealed class ModeloDesarrollador
|
||||
{
|
||||
public int CveCliente { get; set; }
|
||||
public string RFC { get; set; }
|
||||
public string Nombre { get; set; }
|
||||
public string Direccion { get; set; }
|
||||
public string NoExt { get; set; }
|
||||
public string Duplicador { get; set; }
|
||||
public string Referencia { get; set; }
|
||||
public string Telefono { get; set; }
|
||||
public string Mail { get; set; }
|
||||
public string Adherente { get; set; }
|
||||
public string Colonia { get; set; }
|
||||
public string CP { get; set; }
|
||||
public string Ciudad { get; set; }
|
||||
public string Estado { get; set; }
|
||||
public string Pais { get; set; }
|
||||
public int CvePais { get; set; }
|
||||
public int CveSATEstado { get; set; }
|
||||
public int CveMunicipio { get; set; }
|
||||
public int CveLocalidad { get; set; }
|
||||
public int CveColonia { get; set; }
|
||||
public bool AsociadoCanadevi { get; set; }
|
||||
public bool Estatus { get; set; }
|
||||
}
|
||||
|
||||
public sealed class SolicitudAltaDesarrollador
|
||||
{
|
||||
public ModeloDesarrollador Desarrollador { get; set; }
|
||||
public bool GenerarUsuario { get; set; }
|
||||
public string NombreUsuario { get; set; }
|
||||
public string CorreoUsuario { get; set; }
|
||||
}
|
||||
|
||||
public sealed class ResultadoAltaDesarrollador
|
||||
{
|
||||
public int CveCliente { get; set; }
|
||||
public int CveUsuario { get; set; }
|
||||
public string ContrasenaTemporal { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,46 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace SIG.Web.AppCode.Models.Documentos
|
||||
{
|
||||
[Serializable]
|
||||
public sealed class SolicitudDocumentoConfiguracionModel
|
||||
{
|
||||
public int CveSolicitud { get; set; }
|
||||
public int CveTipoDocumento { get; set; }
|
||||
public int CveCliente { get; set; }
|
||||
public int CveFraccionamiento { get; set; }
|
||||
public int CveFraccionamientoEtapa { get; set; }
|
||||
public string Folio { get; set; }
|
||||
public string Etapa { get; set; }
|
||||
public string TipoTramite { get; set; }
|
||||
public string TipoDocumento { get; set; }
|
||||
public bool EsRequerido { get; set; }
|
||||
public bool EsCliente { get; set; }
|
||||
public bool TieneVigencia { get; set; }
|
||||
public int Orden { get; set; }
|
||||
public bool EsActivo { get; set; }
|
||||
public bool EsParticular { get; set; }
|
||||
public bool EsConfigurado { get; set; }
|
||||
public bool EsFinalSolicitud { get; set; }
|
||||
|
||||
public string Origen
|
||||
{
|
||||
get { return EsParticular ? "Particular" : (EsConfigurado ? "General" : "Sin agregar"); }
|
||||
}
|
||||
|
||||
public string Responsable
|
||||
{
|
||||
get { return EsCliente ? "Desarrollador" : "Agua de Hermosillo"; }
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class TramiteDocumentoSolicitudModel
|
||||
{
|
||||
public bool TieneVigencia { get; set; }
|
||||
public DateTime? FechaDocumento { get; set; }
|
||||
public DateTime? FechaVencimiento { get; set; }
|
||||
public int CveDocumentoSolicitud { get; set; }
|
||||
public int CveSolicitud { get; set; }
|
||||
public string Folio { get; set; }
|
||||
@@ -27,10 +63,44 @@ namespace SIG.Web.AppCode.Models.Documentos
|
||||
public bool EsGis { get; set; }
|
||||
public bool PuedeAdministrarGis { get; set; }
|
||||
public string EstadoDocumento { get; set; }
|
||||
public bool EsCliente { get; set; }
|
||||
public bool EsRequerido { get; set; }
|
||||
|
||||
public bool Vencido { get; set; }
|
||||
public bool FechaExpirada { get; set; }
|
||||
|
||||
public string Agrupacion
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!TieneArchivo)
|
||||
{
|
||||
return "Pendientes";
|
||||
}
|
||||
if (FechaExpirada && EsRequerido)
|
||||
{
|
||||
return "Vencidos";
|
||||
}
|
||||
return EsAprobado == true ? "Aprobados" : "Por aprobar";
|
||||
}
|
||||
}
|
||||
|
||||
public string Responsable
|
||||
{
|
||||
get { return EsCliente ? "Desarrollador" : "Agua de Hermosillo"; }
|
||||
}
|
||||
|
||||
public bool EstaPendiente
|
||||
{
|
||||
get { return EsRequerido && !TieneArchivo; }
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class TramiteDocumentoUploadContextModel
|
||||
{
|
||||
public bool TieneVigencia { get; set; }
|
||||
public DateTime? FechaDocumentoAnterior { get; set; }
|
||||
public DateTime? FechaVencimientoAnterior { get; set; }
|
||||
public int CveDocumentoSolicitud { get; set; }
|
||||
public int CveSolicitud { get; set; }
|
||||
public string Folio { get; set; }
|
||||
@@ -45,6 +115,7 @@ namespace SIG.Web.AppCode.Models.Documentos
|
||||
public string ExtensionesPermitidas { get; set; }
|
||||
public int? TamanoMaximoMb { get; set; }
|
||||
public bool EsFinalSolicitud { get; set; }
|
||||
public bool EsCliente { get; set; }
|
||||
public string NombreArchivoAnterior { get; set; }
|
||||
public string NombreArchivoFisicoAnterior { get; set; }
|
||||
public string RutaArchivoAnterior { get; set; }
|
||||
@@ -59,6 +130,10 @@ namespace SIG.Web.AppCode.Models.Documentos
|
||||
|
||||
public sealed class TramiteDocumentoSaveResultModel
|
||||
{
|
||||
public DateTime? FechaDocumento { get; set; }
|
||||
public DateTime? FechaVencimiento { get; set; }
|
||||
public DateTime? FechaDocumentoAnterior { get; set; }
|
||||
public DateTime? FechaVencimientoAnterior { get; set; }
|
||||
public int CveDocumentoSolicitud { get; set; }
|
||||
public int CveSolicitud { get; set; }
|
||||
public string Folio { get; set; }
|
||||
|
||||
@@ -1,7 +1,23 @@
|
||||
using System;
|
||||
using System;
|
||||
|
||||
namespace SIG.Web.AppCode.Models.Fraccionamientos
|
||||
{
|
||||
public sealed class ModeloFilaDesarrollos
|
||||
{
|
||||
public int CveFraccionamiento { get; set; }
|
||||
public int? CveFraccionamientoEtapa { get; set; }
|
||||
public string Fraccionamiento { get; set; }
|
||||
public string Ubicacion { get; set; }
|
||||
public decimal? HectareasFraccionamiento { get; set; }
|
||||
public string Estatus { get; set; }
|
||||
public int NumeroEtapas { get; set; }
|
||||
public bool EsFraccionamiento { get; set; }
|
||||
public string Etapa { get; set; }
|
||||
public decimal? Hectareas { get; set; }
|
||||
public bool Fideicomiso { get; set; }
|
||||
public bool EsActivo { get; set; }
|
||||
}
|
||||
|
||||
public sealed class ModeloFraccionamiento
|
||||
{
|
||||
public int CveFraccionamiento { get; set; }
|
||||
@@ -35,6 +51,34 @@ namespace SIG.Web.AppCode.Models.Fraccionamientos
|
||||
public int Orden { get; set; }
|
||||
public decimal Avance { get; set; }
|
||||
public bool EsActivo { get; set; }
|
||||
// Null al guardar conserva el valor actual; en altas hereda la última etapa creada.
|
||||
public bool? Fideicomiso { get; set; }
|
||||
}
|
||||
|
||||
public sealed class OpcionTipoVivienda
|
||||
{
|
||||
public int CveTipoVivienda { get; set; }
|
||||
public string TipoVivienda { get; set; }
|
||||
}
|
||||
|
||||
public sealed class ModeloTipoViviendaEtapa
|
||||
{
|
||||
public int CveEtapaTipoVivienda { get; set; }
|
||||
public int CveFraccionamientoEtapa { get; set; }
|
||||
public int CveTipoVivienda { get; set; }
|
||||
public string TipoVivienda { get; set; }
|
||||
public int Cantidad { get; set; }
|
||||
public int LotesVinculados { get; set; }
|
||||
}
|
||||
|
||||
public sealed class ModeloLoteTipoViviendaEtapa
|
||||
{
|
||||
public int CveEtapaTipoViviendaLote { get; set; }
|
||||
public int CveEtapaTipoVivienda { get; set; }
|
||||
public int CveFraccionamientoEtapa { get; set; }
|
||||
public int CveFraccionamientoLote { get; set; }
|
||||
public string Lote { get; set; }
|
||||
public string TipoVivienda { get; set; }
|
||||
}
|
||||
|
||||
public sealed class ResultadoAvanceEtapaFraccionamiento
|
||||
|
||||
55
SIG.Web/App_Code/Models/General/ModelosTurnos.cs
Normal file
55
SIG.Web/App_Code/Models/General/ModelosTurnos.cs
Normal file
@@ -0,0 +1,55 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
|
||||
namespace SIG.Web.AppCode.Models.General
|
||||
{
|
||||
[Serializable]
|
||||
public sealed class ModeloTurno
|
||||
{
|
||||
public ModeloTurno()
|
||||
{
|
||||
Horarios = new List<ModeloHorarioTurno>();
|
||||
EsActivo = true;
|
||||
}
|
||||
|
||||
public int CveTurno { get; set; }
|
||||
public string Turno { get; set; }
|
||||
public bool EsActivo { get; set; }
|
||||
public int NumeroHorarios { get; set; }
|
||||
public List<ModeloHorarioTurno> Horarios { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloHorarioTurno
|
||||
{
|
||||
public int CveTurnoHorario { get; set; }
|
||||
public int CveTurno { get; set; }
|
||||
public int DiaSemana { get; set; }
|
||||
public TimeSpan HoraInicio { get; set; }
|
||||
public TimeSpan HoraFin { get; set; }
|
||||
|
||||
public string Dia
|
||||
{
|
||||
get
|
||||
{
|
||||
string[] dias = { "", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo" };
|
||||
return DiaSemana >= 1 && DiaSemana <= 7 ? dias[DiaSemana] : "";
|
||||
}
|
||||
}
|
||||
|
||||
public string Inicio
|
||||
{
|
||||
get { return HoraInicio.ToString(@"hh\:mm", CultureInfo.InvariantCulture); }
|
||||
}
|
||||
|
||||
public string Fin
|
||||
{
|
||||
get
|
||||
{
|
||||
return HoraFin.ToString(@"hh\:mm", CultureInfo.InvariantCulture) +
|
||||
(HoraFin < HoraInicio ? " (día siguiente)" : "");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
22
SIG.Web/App_Code/Models/Security/ModelosCalendarioVisitas.cs
Normal file
22
SIG.Web/App_Code/Models/Security/ModelosCalendarioVisitas.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace SIG.Web.AppCode.Models.Security
|
||||
{
|
||||
[Serializable]
|
||||
public sealed class ModeloDiaFestivo
|
||||
{
|
||||
public int CveDiaFestivo { get; set; }
|
||||
public DateTime Fecha { get; set; }
|
||||
public string Descripcion { get; set; }
|
||||
public bool EsActivo { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloConfiguracionVisitas
|
||||
{
|
||||
public int CveConfiguracionVisitas { get; set; }
|
||||
public int DuracionPredeterminadaMinutos { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -26,6 +26,7 @@ namespace SIG.Web.AppCode.Models.Security
|
||||
public int CveColonia { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class UserAdministrationModel
|
||||
{
|
||||
public int CveUsuario { get; set; }
|
||||
@@ -36,6 +37,9 @@ namespace SIG.Web.AppCode.Models.Security
|
||||
public bool Activo { get; set; }
|
||||
public bool DebeCambiarContrasena { get; set; }
|
||||
public bool CorreoVerificado { get; set; }
|
||||
public bool EsSupervisor { get; set; }
|
||||
public int? CveTurno { get; set; }
|
||||
public string Turno { get; set; }
|
||||
public DateTime FechaCreacion { get; set; }
|
||||
}
|
||||
|
||||
|
||||
401
SIG.Web/App_Code/Models/Tramites/ModelosPagosConvenios.cs
Normal file
401
SIG.Web/App_Code/Models/Tramites/ModelosPagosConvenios.cs
Normal file
@@ -0,0 +1,401 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace SIG.Web.AppCode.Models.Tramites
|
||||
{
|
||||
[Serializable]
|
||||
public sealed class ModeloComprobantePago
|
||||
{
|
||||
public int CveComprobantePago { get; set; }
|
||||
public int CveSolicitudPago { get; set; }
|
||||
public int CveCliente { get; set; }
|
||||
public int CveUnidadCobro { get; set; }
|
||||
public byte CveFormaPago { get; set; }
|
||||
public DateTime FechaPago { get; set; }
|
||||
public decimal Importe { get; set; }
|
||||
public string Referencia { get; set; }
|
||||
public string NombreArchivo { get; set; }
|
||||
public string NombreFisico { get; set; }
|
||||
public string TipoContenido { get; set; }
|
||||
public long TamanoBytes { get; set; }
|
||||
public int CveUsuarioEnvia { get; set; }
|
||||
public DateTime FechaEnvio { get; set; }
|
||||
public int? CveUsuarioAprueba { get; set; }
|
||||
public DateTime? FechaAprobacion { get; set; }
|
||||
public int? CvePago { get; set; }
|
||||
public string Estado { get { return CvePago.HasValue ? "Aprobado" : "Pendiente de aprobación"; } }
|
||||
}
|
||||
|
||||
public sealed class ModeloArchivoComprobantePago
|
||||
{
|
||||
public string RutaFisica { get; set; }
|
||||
public string NombreArchivo { get; set; }
|
||||
public string TipoContenido { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloFormaComprobantePago
|
||||
{
|
||||
public byte CveFormaPago { get; set; }
|
||||
public string FormaPago { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloFiltroObligacionesPago
|
||||
{
|
||||
public int? CveSolicitudPago { get; set; }
|
||||
public int? CveCliente { get; set; }
|
||||
public int? CveFraccionamiento { get; set; }
|
||||
public int? CveSolicitud { get; set; }
|
||||
public int? CveTipoTramite { get; set; }
|
||||
public int? CveTipoSolicitudPago { get; set; }
|
||||
public string EstadoAdministrativo { get; set; }
|
||||
public bool? SoloPendientes { get; set; }
|
||||
public bool SoloVencidos { get; set; }
|
||||
public DateTime? Desde { get; set; }
|
||||
public DateTime? Hasta { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloFiltroAbonos
|
||||
{
|
||||
public int? CvePago { get; set; }
|
||||
public int? CveCliente { get; set; }
|
||||
public int? CveFraccionamiento { get; set; }
|
||||
public int? CveSolicitud { get; set; }
|
||||
public DateTime? Desde { get; set; }
|
||||
public DateTime? Hasta { get; set; }
|
||||
public bool? EsActivo { get; set; }
|
||||
public bool SoloPendientesFacturar { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloObligacionPago
|
||||
{
|
||||
public ModeloObligacionPago()
|
||||
{
|
||||
Productos = new List<ModeloProductoObligacion>();
|
||||
Parcialidades = new List<ModeloParcialidadObligacion>();
|
||||
Aplicaciones = new List<ModeloAplicacionAbono>();
|
||||
Origenes = new List<ModeloOrigenConvenio>();
|
||||
DetallesOrigen = new List<ModeloDetalleOrigenConvenio>();
|
||||
CambiosRequerido = new List<ModeloCambioRequeridoPago>();
|
||||
}
|
||||
|
||||
public int CveSolicitudPago { get; set; }
|
||||
public int CveTipoSolicitudPago { get; set; }
|
||||
public string TipoSolicitudPago { get; set; }
|
||||
public int CveCliente { get; set; }
|
||||
public string Cliente { get; set; }
|
||||
public int CveFraccionamiento { get; set; }
|
||||
public string Fraccionamiento { get; set; }
|
||||
public int? CveFraccionamientoEtapa { get; set; }
|
||||
public string Etapa { get; set; }
|
||||
public int? CveSolicitud { get; set; }
|
||||
public int? CveTipoTramite { get; set; }
|
||||
public string TipoTramite { get; set; }
|
||||
public int? CveTramitePago { get; set; }
|
||||
public int? CveVenta { get; set; }
|
||||
public string Descripcion { get; set; }
|
||||
public decimal Importe { get; set; }
|
||||
public int CveUnidadCobro { get; set; }
|
||||
public string UnidadCobro { get; set; }
|
||||
public bool EsRequerido { get; set; }
|
||||
public DateTime FechaGeneracion { get; set; }
|
||||
public DateTime FechaAlta { get; set; }
|
||||
public int CveUsuario { get; set; }
|
||||
public string EstadoAdministrativo { get; set; }
|
||||
public int? CveUsuarioModificacion { get; set; }
|
||||
public DateTime? FechaModificacion { get; set; }
|
||||
public decimal ImporteAbonado { get; set; }
|
||||
public decimal ImporteConvenido { get; set; }
|
||||
public decimal SaldoPendiente { get; set; }
|
||||
public decimal ImporteVencido { get; set; }
|
||||
public DateTime? PrimerVencimiento { get; set; }
|
||||
public bool EstaVencido { get; set; }
|
||||
public string EstatusFinanciero { get; set; }
|
||||
public ModeloDatosConvenio Convenio { get; set; }
|
||||
public List<ModeloProductoObligacion> Productos { get; set; }
|
||||
public List<ModeloParcialidadObligacion> Parcialidades { get; set; }
|
||||
public List<ModeloAplicacionAbono> Aplicaciones { get; set; }
|
||||
public List<ModeloOrigenConvenio> Origenes { get; set; }
|
||||
public List<ModeloDetalleOrigenConvenio> DetallesOrigen { get; set; }
|
||||
public List<ModeloCambioRequeridoPago> CambiosRequerido { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloProductoObligacion
|
||||
{
|
||||
public int CveSolicitudPagoDetalle { get; set; }
|
||||
public int CveSolicitudPago { get; set; }
|
||||
public int CvePS { get; set; }
|
||||
public string Descripcion { get; set; }
|
||||
public decimal Cantidad { get; set; }
|
||||
public decimal PrecioUnitario { get; set; }
|
||||
public int CveUnidadCobro { get; set; }
|
||||
public decimal Importe { get; set; }
|
||||
public int? CveVentaDetalleOrigen { get; set; }
|
||||
public decimal ImporteAbonado { get; set; }
|
||||
public decimal ImporteConvenido { get; set; }
|
||||
public decimal SaldoPendiente { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloParcialidadObligacion
|
||||
{
|
||||
public int CveSolicitudPagoParcialidad { get; set; }
|
||||
public int CveSolicitudPago { get; set; }
|
||||
public int NumeroParcialidad { get; set; }
|
||||
public DateTime FechaVencimiento { get; set; }
|
||||
public decimal Importe { get; set; }
|
||||
public int CveUnidadCobro { get; set; }
|
||||
public DateTime? FechaProrroga { get; set; }
|
||||
public DateTime VencimientoEfectivo { get; set; }
|
||||
public decimal ImporteAbonado { get; set; }
|
||||
public decimal ImporteConvenido { get; set; }
|
||||
public decimal SaldoPendiente { get; set; }
|
||||
public bool EstaVencida { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloAplicacionAbono
|
||||
{
|
||||
public int CvePagoAplicacion { get; set; }
|
||||
public int CvePago { get; set; }
|
||||
public int CveSolicitudPago { get; set; }
|
||||
public int CveSolicitudPagoParcialidad { get; set; }
|
||||
public int CveSolicitudPagoDetalle { get; set; }
|
||||
public int CveUnidadCobro { get; set; }
|
||||
public decimal ImporteAplicado { get; set; }
|
||||
public decimal ValorConversionObligacion { get; set; }
|
||||
public decimal ImporteAplicadoMXN { get; set; }
|
||||
public decimal ImportePagoConsumido { get; set; }
|
||||
public int CveUsuarioRegistro { get; set; }
|
||||
public DateTime FechaRegistro { get; set; }
|
||||
public DateTime FechaPago { get; set; }
|
||||
public string Referencia { get; set; }
|
||||
public bool EsActivo { get; set; }
|
||||
public bool Autorizado { get; set; }
|
||||
public string Descripcion { get; set; }
|
||||
public int NumeroParcialidad { get; set; }
|
||||
public string Producto { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloDatosConvenio
|
||||
{
|
||||
public int CveSolicitudPago { get; set; }
|
||||
public decimal ImporteSaldoConvenido { get; set; }
|
||||
public string Observaciones { get; set; }
|
||||
public int CveUsuarioRegistro { get; set; }
|
||||
public DateTime FechaRegistro { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloOrigenConvenio
|
||||
{
|
||||
public int CveConvenioOrigen { get; set; }
|
||||
public int CveSolicitudPagoConvenio { get; set; }
|
||||
public int CveSolicitudPagoOrigen { get; set; }
|
||||
public decimal ImporteSaldoOriginal { get; set; }
|
||||
public decimal ImporteTomadoConvenio { get; set; }
|
||||
public int CveUnidadCobro { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloCambioRequeridoPago
|
||||
{
|
||||
public int CveSolicitudPagoRequeridoBitacora { get; set; }
|
||||
public int CveSolicitudPago { get; set; }
|
||||
public bool ValorAnterior { get; set; }
|
||||
public bool ValorNuevo { get; set; }
|
||||
public string Observacion { get; set; }
|
||||
public int CveUsuarioRegistro { get; set; }
|
||||
public DateTime FechaRegistro { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloAbono
|
||||
{
|
||||
public ModeloAbono()
|
||||
{
|
||||
Aplicaciones = new List<ModeloAplicacionAbono>();
|
||||
Documentos = new List<ModeloDocumentoAbono>();
|
||||
}
|
||||
|
||||
public int CvePago { get; set; }
|
||||
public int CveCliente { get; set; }
|
||||
public string Cliente { get; set; }
|
||||
public DateTime FechaPago { get; set; }
|
||||
public decimal Importe { get; set; }
|
||||
public int CveUnidadCobro { get; set; }
|
||||
public string UnidadCobro { get; set; }
|
||||
public decimal ValorConversion { get; set; }
|
||||
public decimal ImporteMXN { get; set; }
|
||||
public string Referencia { get; set; }
|
||||
public string Observaciones { get; set; }
|
||||
public byte CveFormaPago { get; set; }
|
||||
public int? CveBancoCuenta { get; set; }
|
||||
public bool EsActivo { get; set; }
|
||||
public bool Autorizado { get; set; }
|
||||
public int CveUsuario { get; set; }
|
||||
public DateTime FechaAlta { get; set; }
|
||||
public decimal ImporteAplicado { get; set; }
|
||||
public decimal ImporteSinAplicar { get; set; }
|
||||
public decimal ImporteSinAplicarMXN { get; set; }
|
||||
public decimal ImporteDocumentadoMXN { get; set; }
|
||||
public decimal ImportePendienteFacturarMXN { get; set; }
|
||||
public List<ModeloAplicacionAbono> Aplicaciones { get; set; }
|
||||
public List<ModeloDocumentoAbono> Documentos { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloDocumentoAbono
|
||||
{
|
||||
public int CvePagoCfdi { get; set; }
|
||||
public long CveCfdiDocumento { get; set; }
|
||||
public decimal ImporteVinculadoMXN { get; set; }
|
||||
public string Serie { get; set; }
|
||||
public string Folio { get; set; }
|
||||
public decimal Total { get; set; }
|
||||
public string Moneda { get; set; }
|
||||
public string Estado { get; set; }
|
||||
public bool ImporteValidado { get; set; }
|
||||
public string Uuid { get; set; }
|
||||
public bool TienePdf { get; set; }
|
||||
public bool TieneXml { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloCapturaObligacion
|
||||
{
|
||||
public ModeloCapturaObligacion()
|
||||
{
|
||||
Productos = new List<ModeloCapturaProductoPago>();
|
||||
Parcialidades = new List<ModeloCapturaParcialidadPago>();
|
||||
}
|
||||
|
||||
public int? CveSolicitudPago { get; set; }
|
||||
public int CveTipoSolicitudPago { get; set; }
|
||||
public int CveCliente { get; set; }
|
||||
public int CveFraccionamiento { get; set; }
|
||||
public int? CveFraccionamientoEtapa { get; set; }
|
||||
public int? CveSolicitud { get; set; }
|
||||
public int? CveTipoTramite { get; set; }
|
||||
public int? CveTramitePago { get; set; }
|
||||
public string Descripcion { get; set; }
|
||||
public decimal Importe { get; set; }
|
||||
public int CveUnidadCobro { get; set; }
|
||||
public bool EsRequerido { get; set; }
|
||||
public DateTime FechaGeneracion { get; set; }
|
||||
public List<ModeloCapturaProductoPago> Productos { get; set; }
|
||||
public List<ModeloCapturaParcialidadPago> Parcialidades { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloCapturaProductoPago
|
||||
{
|
||||
public int CvePS { get; set; }
|
||||
public string Descripcion { get; set; }
|
||||
public decimal Cantidad { get; set; }
|
||||
public decimal PrecioUnitario { get; set; }
|
||||
public decimal Importe { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloCapturaParcialidadPago
|
||||
{
|
||||
public int NumeroParcialidad { get; set; }
|
||||
public DateTime FechaVencimiento { get; set; }
|
||||
public decimal Importe { get; set; }
|
||||
public DateTime? FechaProrroga { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloCapturaOrigenConvenio
|
||||
{
|
||||
public int CveSolicitudPagoOrigen { get; set; }
|
||||
public int CveSolicitudPagoDetalleOrigen { get; set; }
|
||||
public int CveSolicitudPagoParcialidadOrigen { get; set; }
|
||||
public decimal ImporteTomadoConvenio { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloCapturaAbono
|
||||
{
|
||||
public int CveCliente { get; set; }
|
||||
public DateTime FechaPago { get; set; }
|
||||
public decimal Importe { get; set; }
|
||||
public int CveUnidadCobro { get; set; }
|
||||
public byte CveFormaPago { get; set; }
|
||||
public int? CveBancoCuenta { get; set; }
|
||||
public string Referencia { get; set; }
|
||||
public string Observaciones { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloCapturaAplicacionAbono
|
||||
{
|
||||
public int CveSolicitudPagoDetalle { get; set; }
|
||||
public int CveSolicitudPagoParcialidad { get; set; }
|
||||
public decimal ImporteAplicado { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloClaveObligacionPago
|
||||
{
|
||||
public int CveSolicitudPago { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloProporcionProductoConvenio
|
||||
{
|
||||
public int CveSolicitudPagoDetalleOrigen { get; set; }
|
||||
public int CvePS { get; set; }
|
||||
public string Descripcion { get; set; }
|
||||
public decimal SaldoOrigen { get; set; }
|
||||
public decimal ImportePropuesto { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloDetalleOrigenConvenio
|
||||
{
|
||||
public int CveConvenioOrigenDetalle { get; set; }
|
||||
public int CveConvenioOrigen { get; set; }
|
||||
public int CveSolicitudPagoOrigen { get; set; }
|
||||
public int CveSolicitudPagoDetalleOrigen { get; set; }
|
||||
public int CveSolicitudPagoParcialidadOrigen { get; set; }
|
||||
public decimal ImporteSaldoOriginal { get; set; }
|
||||
public decimal ImporteTomadoConvenio { get; set; }
|
||||
public string Producto { get; set; }
|
||||
public int Parcialidad { get; set; }
|
||||
public DateTime Vencimiento { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloPropuestaConvenio
|
||||
{
|
||||
public ModeloPropuestaConvenio()
|
||||
{
|
||||
Productos = new List<ModeloProporcionProductoConvenio>();
|
||||
Origenes = new List<ModeloDetalleOrigenConvenio>();
|
||||
}
|
||||
|
||||
public List<ModeloProporcionProductoConvenio> Productos { get; set; }
|
||||
public List<ModeloDetalleOrigenConvenio> Origenes { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloCapturaConvenio
|
||||
{
|
||||
public ModeloCapturaConvenio()
|
||||
{
|
||||
Obligacion = new ModeloCapturaObligacion();
|
||||
Origenes = new List<ModeloCapturaOrigenConvenio>();
|
||||
}
|
||||
|
||||
public ModeloCapturaObligacion Obligacion { get; set; }
|
||||
public string Observaciones { get; set; }
|
||||
public List<ModeloCapturaOrigenConvenio> Origenes { get; set; }
|
||||
}
|
||||
}
|
||||
88
SIG.Web/App_Code/Models/Tramites/ModelosTableroTramites.cs
Normal file
88
SIG.Web/App_Code/Models/Tramites/ModelosTableroTramites.cs
Normal file
@@ -0,0 +1,88 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace SIG.Web.AppCode.Models.Tramites
|
||||
{
|
||||
public enum AgrupacionTableroTramites : byte
|
||||
{
|
||||
PorTramite = 1,
|
||||
PorCliente = 2
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloFiltroTableroTramites
|
||||
{
|
||||
public ModeloFiltroTableroTramites()
|
||||
{
|
||||
Agrupacion = AgrupacionTableroTramites.PorTramite;
|
||||
SoloActivos = true;
|
||||
EstatusSeleccionados = new List<int>();
|
||||
}
|
||||
|
||||
public AgrupacionTableroTramites Agrupacion { get; set; }
|
||||
public int? CveFraccionamiento { get; set; }
|
||||
public bool SoloActivos { get; set; }
|
||||
public bool SoloBloqueados { get; set; }
|
||||
public List<int> EstatusSeleccionados { get; set; }
|
||||
public bool MostrarAutorizados { get; set; }
|
||||
public bool MostrarCancelados { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloFilaTableroTramites
|
||||
{
|
||||
public int? CveSolicitud { get; set; }
|
||||
public int? CveTipoTramite { get; set; }
|
||||
public int? CveFraccionamiento { get; set; }
|
||||
public int? CveFraccionamientoEtapa { get; set; }
|
||||
public int? CveCliente { get; set; }
|
||||
public int CveAgrupacion { get; set; }
|
||||
public string Agrupacion { get; set; }
|
||||
public int Nivel { get; set; }
|
||||
public string Cliente { get; set; }
|
||||
public string Tramite { get; set; }
|
||||
public string Fraccionamiento { get; set; }
|
||||
public string Etapa { get; set; }
|
||||
public string Estatus { get; set; }
|
||||
public DateTime? FechaInicio { get; set; }
|
||||
public decimal? Avance { get; set; }
|
||||
public byte EstatusProceso { get; set; }
|
||||
public string NombreEstatusProceso
|
||||
{
|
||||
get
|
||||
{
|
||||
switch (EstatusProceso)
|
||||
{
|
||||
case 1: return "En proceso";
|
||||
case 2: return "Revisar errores";
|
||||
case 3: return "Revisar";
|
||||
case 4: return "Autorizado";
|
||||
default: return "Sin iniciar";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloFraccionamientoTableroTramites
|
||||
{
|
||||
public int CveFraccionamiento { get; set; }
|
||||
public string Fraccionamiento { get; set; }
|
||||
}
|
||||
|
||||
public sealed class ModeloResultadoTableroTramites
|
||||
{
|
||||
public List<ModeloFilaTableroTramites> Filas { get; set; }
|
||||
public List<ModeloFraccionamientoTableroTramites> Fraccionamientos { get; set; }
|
||||
public List<TramiteSolicitudEstatusOptionModel> Estatus { get; set; }
|
||||
}
|
||||
|
||||
public sealed class ModeloHistorialEstatusSolicitud
|
||||
{
|
||||
public int CveHistorialEstatusSolicitud { get; set; }
|
||||
public int CveSolicitud { get; set; }
|
||||
public string Estatus { get; set; }
|
||||
public DateTime FechaCambio { get; set; }
|
||||
public string Comentarios { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
|
||||
namespace SIG.Web.AppCode.Models.Tramites
|
||||
{
|
||||
@@ -59,11 +59,20 @@ namespace SIG.Web.AppCode.Models.Tramites
|
||||
|
||||
public sealed class DocumentoRequeridoModel
|
||||
{
|
||||
public int CveDocumentoRequerido { get; set; }
|
||||
public int? CveTipoTramiteAnterior { get; set; }
|
||||
public int? CveTipoDocumentoAnterior { get; set; }
|
||||
public int CveTipoTramite { get; set; }
|
||||
public string TipoTramite { get; set; }
|
||||
public int CveTipoDocumento { get; set; }
|
||||
public string TipoDocumento { get; set; }
|
||||
public bool EsCliente { get; set; }
|
||||
public bool TieneVigencia { get; set; }
|
||||
|
||||
public string Responsable
|
||||
{
|
||||
get { return EsCliente ? "Desarrollador" : "Agua de Hermosillo"; }
|
||||
}
|
||||
|
||||
public bool EsRequerido { get; set; }
|
||||
public int Orden { get; set; }
|
||||
public bool EsActivo { get; set; }
|
||||
|
||||
@@ -1,14 +1,42 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Models.Documentos;
|
||||
|
||||
namespace SIG.Web.AppCode.Models.Tramites
|
||||
{
|
||||
[Serializable]
|
||||
public sealed class ModeloAccionPendienteSolicitud
|
||||
{
|
||||
public string TipoAccion { get; set; }
|
||||
public int CveReferencia { get; set; }
|
||||
public string Descripcion { get; set; }
|
||||
public bool VisibleCliente { get; set; }
|
||||
public int Orden { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloComentarioSolicitud
|
||||
{
|
||||
public int CveComentarioSolicitud { get; set; }
|
||||
public int CveSolicitud { get; set; }
|
||||
public int? CveComentarioPadre { get; set; }
|
||||
public string Comentario { get; set; }
|
||||
public string ComentarioPadre { get; set; }
|
||||
public int CveUsuario { get; set; }
|
||||
public string Usuario { get; set; }
|
||||
public int? CveRolAutor { get; set; }
|
||||
public string NombreCliente { get; set; }
|
||||
public DateTime FechaAlta { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public sealed class TramiteSolicitudModel
|
||||
{
|
||||
public int CveSolicitud { get; set; }
|
||||
public string Folio { get; set; }
|
||||
public int CveCliente { get; set; }
|
||||
public int CveFraccionamiento { get; set; }
|
||||
public string Fraccionamiento { get; set; }
|
||||
public int CveFraccionamientoEtapa { get; set; }
|
||||
public string Etapa { get; set; }
|
||||
public int CveTipoTramite { get; set; }
|
||||
@@ -22,6 +50,7 @@ namespace SIG.Web.AppCode.Models.Tramites
|
||||
public bool EsAutorizada { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class TramiteSolicitudEstatusOptionModel
|
||||
{
|
||||
public int CveEstatusSolicitud { get; set; }
|
||||
@@ -51,6 +80,84 @@ namespace SIG.Web.AppCode.Models.Tramites
|
||||
public DateTime? FechaAutorizacion { get; set; }
|
||||
public bool HuboCambio { get; set; }
|
||||
public bool HuboCambioCondiciones { get; set; }
|
||||
public string Observaciones { get; set; }
|
||||
public string PestanaPendiente { get; set; }
|
||||
public string MensajeValidacion { get; set; }
|
||||
}
|
||||
|
||||
public sealed class ModeloContextoCambioEstatus
|
||||
{
|
||||
public TramiteSolicitudModel Solicitud { get; set; }
|
||||
public bool EsAdministrador { get; set; }
|
||||
public int? CveSiguienteEstatus { get; set; }
|
||||
public List<TramiteSolicitudEstatusOptionModel> Estatus { get; set; }
|
||||
public List<ModeloCondicionMostrarTramite> Condiciones { get; set; }
|
||||
public List<TramiteDocumentoSolicitudModel> Documentos { get; set; }
|
||||
public List<ModeloPagoSolicitud> Pagos { get; set; }
|
||||
}
|
||||
|
||||
public sealed class ModeloPagoSolicitud
|
||||
{
|
||||
public int CveSolicitud { get; set; }
|
||||
public int CveTramitePago { get; set; }
|
||||
public string NombrePago { get; set; }
|
||||
public bool EsRequerido { get; set; }
|
||||
public bool EsActivo { get; set; }
|
||||
public bool TienePago { get; set; }
|
||||
public decimal? Total { get; set; }
|
||||
public decimal ImportePagado { get; set; }
|
||||
public int? CveSolicitudPago { get; set; }
|
||||
public int? CveUnidadCobro { get; set; }
|
||||
public string UnidadCobro { get; set; }
|
||||
public decimal? ImporteConvenido { get; set; }
|
||||
public decimal? SaldoPendiente { get; set; }
|
||||
|
||||
public decimal? SaldoPorCubrir
|
||||
{
|
||||
get
|
||||
{
|
||||
if (SaldoPendiente.HasValue)
|
||||
{
|
||||
return Math.Max(0m, SaldoPendiente.Value);
|
||||
}
|
||||
|
||||
// Compatibilidad durante la instalación coordinada de los nuevos PAs.
|
||||
if (Total.HasValue)
|
||||
{
|
||||
return Math.Max(0m, Total.Value - ImportePagado - ImporteConvenido.GetValueOrDefault());
|
||||
}
|
||||
|
||||
return TienePago ? (decimal?)0m : null;
|
||||
}
|
||||
}
|
||||
|
||||
public bool EstaPendiente
|
||||
{
|
||||
get
|
||||
{
|
||||
decimal? saldo = SaldoPorCubrir;
|
||||
return EsActivo && EsRequerido && (saldo.HasValue ? saldo.Value > 0 : !TienePago);
|
||||
}
|
||||
}
|
||||
|
||||
public string EstadoPago
|
||||
{
|
||||
get
|
||||
{
|
||||
if ((Total.HasValue && ImportePagado >= Total.Value) ||
|
||||
(!Total.HasValue && TienePago && !SaldoPendiente.HasValue))
|
||||
{
|
||||
return "Pagado";
|
||||
}
|
||||
|
||||
if (ImportePagado > 0)
|
||||
{
|
||||
return "Parcialmente pagado";
|
||||
}
|
||||
|
||||
return ImporteConvenido.GetValueOrDefault() > 0 ? "Saldo convenido" : "Pendiente";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class ModeloCondicionMostrarTramite
|
||||
@@ -63,6 +170,8 @@ namespace SIG.Web.AppCode.Models.Tramites
|
||||
{
|
||||
public int CveSolicitud { get; set; }
|
||||
public int CveEstatusSolicitud { get; set; }
|
||||
public int CveEstatusSolicitudAnterior { get; set; }
|
||||
public string Observaciones { get; set; }
|
||||
public List<int> CvesCondicionesMostradas { get; set; }
|
||||
public bool? AprobadoPrefactibilidad { get; set; }
|
||||
public bool? RequiereObrasExternas { get; set; }
|
||||
|
||||
@@ -181,6 +181,7 @@ namespace SIG.Web.AppCode.Models.Ventas
|
||||
public int CveSolicitud { get; set; }
|
||||
public int CveTramitePago { get; set; }
|
||||
public string Observaciones { get; set; }
|
||||
public DateTime FechaVencimiento { get; set; }
|
||||
}
|
||||
|
||||
public sealed class ModeloPagoVentaTramite
|
||||
|
||||
226
SIG.Web/App_Code/Models/Visitas/ModelosVisitas.cs
Normal file
226
SIG.Web/App_Code/Models/Visitas/ModelosVisitas.cs
Normal file
@@ -0,0 +1,226 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace SIG.Web.AppCode.Models.Visitas
|
||||
{
|
||||
[Serializable]
|
||||
public sealed class ModeloCita
|
||||
{
|
||||
public int CveCita { get; set; }
|
||||
public int CveVisita { get; set; }
|
||||
public int CveCliente { get; set; }
|
||||
public int CveFraccionamiento { get; set; }
|
||||
public int CveFraccionamientoEtapa { get; set; }
|
||||
public string Fraccionamiento { get; set; }
|
||||
public string Etapa { get; set; }
|
||||
public int CveSupervisor { get; set; }
|
||||
public string Supervisor { get; set; }
|
||||
public DateTime FechaInicio { get; set; }
|
||||
public DateTime FechaFin { get; set; }
|
||||
public int DuracionMinutos { get; set; }
|
||||
public bool Cancelada { get; set; }
|
||||
public bool? SeRealizo { get; set; }
|
||||
public string Comentarios { get; set; }
|
||||
public int? CveSolicitud { get; set; }
|
||||
public int? CveUsuarioDesarrollador { get; set; }
|
||||
public int? CveProgramacionOrigen { get; set; }
|
||||
public int CveEstatusProgramacion { get; set; }
|
||||
public string EstatusProgramacion { get; set; }
|
||||
public bool Reprogramar { get; set; }
|
||||
|
||||
// Los nombres públicos existentes siguen disponibles para las páginas actuales.
|
||||
public int CveProgramacionVisita
|
||||
{
|
||||
get { return CveCita; }
|
||||
set { CveCita = value; }
|
||||
}
|
||||
|
||||
public int CveUsuarioSupervisor
|
||||
{
|
||||
get { return CveSupervisor; }
|
||||
set { CveSupervisor = value; }
|
||||
}
|
||||
|
||||
public string Observaciones
|
||||
{
|
||||
get { return Comentarios; }
|
||||
set { Comentarios = value; }
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloDisponibilidadVisita
|
||||
{
|
||||
public int CveSupervisor { get; set; }
|
||||
public string Supervisor { get; set; }
|
||||
public DateTime FechaInicio { get; set; }
|
||||
public DateTime FechaFin { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloPlantillaVisita
|
||||
{
|
||||
public int CvePlantilla { get; set; }
|
||||
public string Nombre { get; set; }
|
||||
public bool EsPorLote { get; set; }
|
||||
public bool EsActivo { get; set; }
|
||||
public List<ModeloPreguntaVisita> Preguntas { get; set; } = new List<ModeloPreguntaVisita>();
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloPreguntaVisita
|
||||
{
|
||||
public int CvePreguntaPlantilla { get; set; }
|
||||
public int CvePlantilla { get; set; }
|
||||
public int CveTipoPregunta { get; set; }
|
||||
public string Pregunta { get; set; }
|
||||
public bool EsRequerida { get; set; }
|
||||
public bool EsActivo { get; set; }
|
||||
public int Orden { get; set; }
|
||||
public List<ModeloOpcionVisita> Opciones { get; set; } = new List<ModeloOpcionVisita>();
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloOpcionVisita
|
||||
{
|
||||
public int CveOpcionPregunta { get; set; }
|
||||
public int CvePreguntaPlantilla { get; set; }
|
||||
public string TextoOpcion { get; set; }
|
||||
public int Orden { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloVisita
|
||||
{
|
||||
public int CveVisita { get; set; }
|
||||
public int CveCita { get; set; }
|
||||
public int CveCliente { get; set; }
|
||||
public int CveFraccionamiento { get; set; }
|
||||
public int CveFraccionamientoEtapa { get; set; }
|
||||
public string Fraccionamiento { get; set; }
|
||||
public string Etapa { get; set; }
|
||||
public string Supervisor { get; set; }
|
||||
public DateTime FechaInicio { get; set; }
|
||||
public bool? SeRealizo { get; set; }
|
||||
public DateTime? FechaReal { get; set; }
|
||||
public DateTime? FechaFin { get; set; }
|
||||
public DateTime FechaRegistro { get; set; }
|
||||
public int CveSupervisor { get; set; }
|
||||
public int? CveSolicitud { get; set; }
|
||||
|
||||
public int? CveProgramacionVisita
|
||||
{
|
||||
get { return CveCita > 0 ? (int?)CveCita : null; }
|
||||
set { CveCita = value ?? 0; }
|
||||
}
|
||||
|
||||
public int CveUsuarioSupervisor
|
||||
{
|
||||
get { return CveSupervisor; }
|
||||
set { CveSupervisor = value; }
|
||||
}
|
||||
public string Observaciones { get; set; }
|
||||
public List<ModeloCuestionarioVisita> Cuestionarios { get; set; } = new List<ModeloCuestionarioVisita>();
|
||||
public List<ModeloDocumentoVisita> Documentos { get; set; } = new List<ModeloDocumentoVisita>();
|
||||
public List<ModeloComentarioVisita> Comentarios { get; set; } = new List<ModeloComentarioVisita>();
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloCuestionarioVisita
|
||||
{
|
||||
public int CveCuestionarioVisita { get; set; }
|
||||
public int CveVisita { get; set; }
|
||||
public int CvePlantilla { get; set; }
|
||||
public int? CveFraccionamientoLote { get; set; }
|
||||
public string Lote { get; set; }
|
||||
public string NombrePlantilla { get; set; }
|
||||
public string DefinicionPlantilla { get; set; }
|
||||
public bool? PasoSupervision { get; set; }
|
||||
public bool? AguaPotableTerminada { get; set; }
|
||||
public bool? DrenajeTerminado { get; set; }
|
||||
public string Observaciones { get; set; }
|
||||
public bool Finalizado { get; set; }
|
||||
public ModeloPlantillaVisita Plantilla { get; set; }
|
||||
public List<ModeloRespuestaVisita> Respuestas { get; set; } = new List<ModeloRespuestaVisita>();
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloRespuestaVisita
|
||||
{
|
||||
public int CveRespuestaVisita { get; set; }
|
||||
public int CveCuestionarioVisita { get; set; }
|
||||
public int CvePreguntaPlantilla { get; set; }
|
||||
public string Valor { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloDocumentoVisita
|
||||
{
|
||||
public int CveDocumentoVisita { get; set; }
|
||||
public int CveVisita { get; set; }
|
||||
public int? CveCuestionarioVisita { get; set; }
|
||||
public int CveCliente { get; set; }
|
||||
public string NombreArchivo { get; set; }
|
||||
public string NombreFisico { get; set; }
|
||||
public string TipoContenido { get; set; }
|
||||
public long TamanoBytes { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloComentarioVisita
|
||||
{
|
||||
public int CveComentarioVisita { get; set; }
|
||||
public int CveVisita { get; set; }
|
||||
public string Comentario { get; set; }
|
||||
public string Usuario { get; set; }
|
||||
public DateTime FechaAlta { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ArchivoVisita
|
||||
{
|
||||
public string NombreArchivo { get; set; }
|
||||
public string TipoContenido { get; set; }
|
||||
public Stream Contenido { get; set; }
|
||||
}
|
||||
[Serializable]
|
||||
public sealed class ModeloLoteSupervision
|
||||
{
|
||||
public int CveVisitaLote { get; set; }
|
||||
public int CveVisita { get; set; }
|
||||
public int CveFraccionamientoLote { get; set; }
|
||||
public string Lote { get; set; }
|
||||
public bool? Aprobado { get; set; }
|
||||
public string Observaciones { get; set; }
|
||||
public DateTime FechaVisita { get; set; }
|
||||
public string Supervisor { get; set; }
|
||||
public bool SeRealizo { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloVinculoGisSupervision
|
||||
{
|
||||
public int CveLoteGIS { get; set; }
|
||||
public int CveFraccionamientoLote { get; set; }
|
||||
public string Lote { get; set; }
|
||||
public int CveTipoGIS { get; set; }
|
||||
public string TipoGIS { get; set; }
|
||||
public string GISPoligonoClave { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloPoligonoSupervision
|
||||
{
|
||||
public string Clave { get; set; }
|
||||
public string Nombre { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModeloUsuarioSupervision
|
||||
{
|
||||
public int CveUsuario { get; set; }
|
||||
public string NombreUsuario { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
@@ -22,6 +22,160 @@ namespace SIG.Web.AppCode.Repositories.Bitacora
|
||||
{
|
||||
}
|
||||
|
||||
public DbResult<long> RegistrarOperacion(
|
||||
ModeloOperacionBitacora operacion, BitacoraContextoModel contexto)
|
||||
{
|
||||
return ExecuteCustom(BitacoraDomain, conexion =>
|
||||
{
|
||||
using (IDbCommand comando = conexion.CreateCommand())
|
||||
{
|
||||
StoredProcedureCommand.Configure(
|
||||
comando, "dbo.PA_Bit_BitacoraEventoRegistrar", contexto.CveUsuarioEjecuta);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CodigoAccion", operacion.CodigoAccion, DbType.String);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@DescripcionMovimiento", operacion.DescripcionMovimiento, DbType.String);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CveUsuarioAutoriza", operacion.CveUsuarioAutoriza, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@FechaAutorizacion", operacion.FechaAutorizacion, DbType.DateTime2);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@DireccionIP", contexto.DireccionIP, DbType.String);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@NombreEquipo", contexto.NombreEquipo, DbType.String);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@Modulo", contexto.Modulo, DbType.String);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@RegistrosXml", SerializarRegistros(operacion.Registros), DbType.Xml);
|
||||
|
||||
ModeloEventoBitacora resultado;
|
||||
using (IDataReader lector = comando.ExecuteReader())
|
||||
{
|
||||
resultado = lector.ToObject<ModeloEventoBitacora>();
|
||||
}
|
||||
StoredProcedureCommand.EnsureSuccess(comando);
|
||||
if (resultado == null || resultado.CveBitacoraEvento <= 0)
|
||||
{
|
||||
throw new InvalidOperationException("El registro de la operación no devolvió su clave.");
|
||||
}
|
||||
return resultado.CveBitacoraEvento;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<BitacoraCampoModel>> ObtenerEvento(
|
||||
long cveBitacoraEvento, int cveUsuarioEjecuta)
|
||||
{
|
||||
return ExecuteCustom(BitacoraDomain, conexion =>
|
||||
{
|
||||
using (IDbCommand comando = conexion.CreateCommand())
|
||||
{
|
||||
StoredProcedureCommand.Configure(
|
||||
comando, "dbo.PA_Bit_BitacoraEventoObtener", cveUsuarioEjecuta);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CveBitacoraEvento", cveBitacoraEvento, DbType.Int64);
|
||||
|
||||
List<BitacoraCampoModel> campos;
|
||||
using (IDataReader lector = comando.ExecuteReader())
|
||||
{
|
||||
campos = lector.ToList<BitacoraCampoModel>();
|
||||
}
|
||||
StoredProcedureCommand.EnsureSuccess(comando);
|
||||
return campos;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static string SerializarRegistros(IEnumerable<ModeloRegistroBitacora> registros)
|
||||
{
|
||||
var documento = new XElement(
|
||||
"Registros",
|
||||
registros.Select((registro, indice) => new XElement(
|
||||
"Registro",
|
||||
new XAttribute("Orden", indice + 1),
|
||||
new XAttribute("NombreTablaSQL", registro.NombreTablaSQL),
|
||||
new XAttribute("CveTipoMovimiento", (byte)registro.TipoMovimiento),
|
||||
registro.LlaveRegistro.HasValue
|
||||
? new XAttribute("LlaveRegistro", registro.LlaveRegistro.Value)
|
||||
: new XAttribute("LlaveRegistroTexto", registro.LlaveRegistroTexto),
|
||||
new XAttribute("DiscriminarCamposSinCambios", registro.DiscriminarCamposSinCambios ? 1 : 0),
|
||||
new XAttribute("RegistrarSinCampos", registro.RegistrarSinCampos ? 1 : 0),
|
||||
XElement.Parse(SerializeFields(registro.Campos)),
|
||||
XElement.Parse(SerializeRelations(registro.Relaciones)))));
|
||||
return documento.ToString(SaveOptions.DisableFormatting);
|
||||
}
|
||||
|
||||
public DbResult<ResultadoPaginado<ModeloEventoBitacora>> ConsultarEventos(
|
||||
BitacoraConsultaModel consulta,
|
||||
int cveUsuarioEjecuta)
|
||||
{
|
||||
int registrosOmitidos = checked(
|
||||
(consulta.Pagina - 1) * consulta.RegistrosPorPagina);
|
||||
|
||||
return ExecuteCustom(BitacoraDomain, conexion =>
|
||||
{
|
||||
using (IDbCommand comando = conexion.CreateCommand())
|
||||
{
|
||||
StoredProcedureCommand.Configure(
|
||||
comando,
|
||||
"dbo.PA_Bit_BitacoraEventoListar",
|
||||
cveUsuarioEjecuta);
|
||||
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando,
|
||||
"@RelacionesXml",
|
||||
SerializeFilters(consulta.Filtros),
|
||||
DbType.Xml);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando,
|
||||
"@RelacionesMostrarXml",
|
||||
SerializeRelationsToShow(
|
||||
consulta.RelacionesMostrar),
|
||||
DbType.Xml);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando,
|
||||
"@RegistrosOmitidos",
|
||||
registrosOmitidos,
|
||||
DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando,
|
||||
"@RegistrosPorPagina",
|
||||
consulta.RegistrosPorPagina,
|
||||
DbType.Int32);
|
||||
|
||||
int totalRegistros = 0;
|
||||
var bitacoras = new List<ModeloEventoBitacora>();
|
||||
|
||||
using (IDataReader lector = comando.ExecuteReader())
|
||||
{
|
||||
if (lector.Read() && !lector.IsDBNull(0))
|
||||
{
|
||||
totalRegistros = lector.GetInt32(0);
|
||||
}
|
||||
|
||||
if (lector.NextResult())
|
||||
{
|
||||
bitacoras = lector.ToList<ModeloEventoBitacora>();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
StoredProcedureCommand.EnsureSuccess(comando);
|
||||
|
||||
return new ResultadoPaginado<ModeloEventoBitacora>
|
||||
{
|
||||
Registros = bitacoras,
|
||||
Pagina = consulta.Pagina,
|
||||
RegistrosPorPagina = consulta.RegistrosPorPagina,
|
||||
TotalRegistros = totalRegistros,
|
||||
TotalPaginas = (int)Math.Ceiling(
|
||||
totalRegistros /
|
||||
(decimal)consulta.RegistrosPorPagina)
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<long> Agregar(
|
||||
BitacoraEventoModel evento,
|
||||
BitacoraContextoModel contexto)
|
||||
@@ -394,7 +548,11 @@ namespace SIG.Web.AppCode.Repositories.Bitacora
|
||||
IsNull(field == null ? null : field.ValorNuevo) ? 1 : 0),
|
||||
new XAttribute(
|
||||
"ValorNuevo",
|
||||
FormatValue(field == null ? null : field.ValorNuevo)))));
|
||||
FormatValue(field == null ? null : field.ValorNuevo)),
|
||||
field == null || field.ValorAnteriorMostrar == null
|
||||
? null : new XAttribute("ValorAnteriorMostrar", field.ValorAnteriorMostrar),
|
||||
field == null || field.ValorNuevoMostrar == null
|
||||
? null : new XAttribute("ValorNuevoMostrar", field.ValorNuevoMostrar))));
|
||||
|
||||
return document.ToString(SaveOptions.DisableFormatting);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using SIG.Web.AppCode.Contracts.Clientes;
|
||||
using SIG.Web.AppCode.Contracts.Database;
|
||||
using SIG.Web.AppCode.Models.Clientes;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Repositories.Database;
|
||||
|
||||
namespace SIG.Web.AppCode.Repositories.Clientes
|
||||
{
|
||||
public sealed class RepositorioDesarrolladores : RepositoryBase, IRepositorioDesarrolladores
|
||||
{
|
||||
private const string ProcedimientoListado = "dbo.PA_Clientes_DesarrolladorList";
|
||||
private const string ProcedimientoConsulta = "dbo.PA_Clientes_DesarrolladorGet";
|
||||
private const string ProcedimientoAlta = "dbo.PA_Clientes_DesarrolladorAdd";
|
||||
private const string ProcedimientoActualizacion = "dbo.PA_Clientes_DesarrolladorUpdate";
|
||||
|
||||
public RepositorioDesarrolladores(IDbExecutor ejecutor) : base(ejecutor)
|
||||
{
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloDesarrollador>> Listar(
|
||||
string texto, bool incluirInactivos, int usuario, string dominio)
|
||||
{
|
||||
return QueryList<ModeloDesarrollador>(
|
||||
ProcedimientoListado, usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@Texto", texto, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@IncluirInactivos", incluirInactivos, DbType.Boolean);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<ModeloDesarrollador> Obtener(int cveCliente, int usuario, string dominio)
|
||||
{
|
||||
return QueryOne<ModeloDesarrollador>(
|
||||
ProcedimientoConsulta, usuario, dominio,
|
||||
comando => StoredProcedureCommand.AddInput(comando, "@CveCliente", cveCliente, DbType.Int32));
|
||||
}
|
||||
|
||||
public DbResult<ResultadoAltaDesarrollador> Agregar(
|
||||
SolicitudAltaDesarrollador solicitud, string hashContrasena, int usuario, string dominio)
|
||||
{
|
||||
return QueryOne<ResultadoAltaDesarrollador>(
|
||||
ProcedimientoAlta, usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
AgregarParametros(comando, solicitud.Desarrollador);
|
||||
StoredProcedureCommand.AddInput(comando, "@GenerarUsuario", solicitud.GenerarUsuario, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(comando, "@NombreUsuario", solicitud.NombreUsuario, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@CorreoUsuario", solicitud.CorreoUsuario, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@HashContrasena", hashContrasena, DbType.String);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> Actualizar(ModeloDesarrollador desarrollador, int usuario, string dominio)
|
||||
{
|
||||
return Execute(
|
||||
ProcedimientoActualizacion, usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCliente", desarrollador.CveCliente, DbType.Int32);
|
||||
AgregarParametros(comando, desarrollador);
|
||||
});
|
||||
}
|
||||
|
||||
private static void AgregarParametros(IDbCommand comando, ModeloDesarrollador desarrollador)
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@RFC", desarrollador.RFC, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@Nombre", desarrollador.Nombre, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@Direccion", desarrollador.Direccion, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@NoExt", desarrollador.NoExt, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@Duplicador", desarrollador.Duplicador, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@Referencia", desarrollador.Referencia, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@Telefono", desarrollador.Telefono, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@Mail", desarrollador.Mail, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@Adherente", desarrollador.Adherente, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@Colonia", desarrollador.Colonia, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@CP", desarrollador.CP, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@Ciudad", desarrollador.Ciudad, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@Estado", desarrollador.Estado, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@Pais", desarrollador.Pais, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@CvePais", desarrollador.CvePais, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSATEstado", desarrollador.CveSATEstado, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveMunicipio", desarrollador.CveMunicipio, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveLocalidad", desarrollador.CveLocalidad, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveColonia", desarrollador.CveColonia, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@AsociadoCanadevi", desarrollador.AsociadoCanadevi, DbType.Boolean);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using SIG.Web.AppCode.Contracts.Database;
|
||||
@@ -16,6 +17,96 @@ namespace SIG.Web.AppCode.Repositories.Documentos
|
||||
{
|
||||
}
|
||||
|
||||
public DbResult<List<SolicitudDocumentoConfiguracionModel>> ListarConfiguracionSolicitud(
|
||||
int cveFraccionamiento,
|
||||
int cveSolicitud,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio,
|
||||
int? cveFraccionamientoEtapa = null)
|
||||
{
|
||||
return QueryList<SolicitudDocumentoConfiguracionModel>(
|
||||
"dbo.PA_Tramites_SolicitudDocumentoConfiguracionList",
|
||||
cveUsuarioEjecuta,
|
||||
nombreDominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoEtapa", cveFraccionamientoEtapa, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CveFraccionamiento", cveFraccionamiento, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CveSolicitud", cveSolicitud, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
public DbResult<bool> ActualizarVencimientoEtapa(
|
||||
int cveFraccionamientoEtapa,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Tramites_DocumentoEtapaVencimientoActualizar",
|
||||
cveUsuarioEjecuta,
|
||||
nombreDominio,
|
||||
comando => StoredProcedureCommand.AddInput(
|
||||
comando, "@CveFraccionamientoEtapa", cveFraccionamientoEtapa, DbType.Int32));
|
||||
}
|
||||
|
||||
public DbResult<bool> GuardarConfiguracionSolicitud(
|
||||
SolicitudDocumentoConfiguracionModel configuracion,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Tramites_SolicitudDocumentoConfiguracionSave",
|
||||
cveUsuarioEjecuta,
|
||||
nombreDominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoEtapa", configuracion.CveFraccionamientoEtapa == 0 ? (int?)null : configuracion.CveFraccionamientoEtapa, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CveFraccionamiento", configuracion.CveFraccionamiento, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CveSolicitud", configuracion.CveSolicitud, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CveTipoDocumento", configuracion.CveTipoDocumento, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@EsRequerido", configuracion.EsRequerido, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@EsCliente", configuracion.EsCliente, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@TieneVigencia", configuracion.TieneVigencia, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@Orden", configuracion.Orden, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@EsActivo", configuracion.EsActivo, DbType.Boolean);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> EliminarConfiguracionSolicitud(
|
||||
int cveFraccionamiento,
|
||||
int cveSolicitud,
|
||||
int cveTipoDocumento,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio,
|
||||
int? cveFraccionamientoEtapa = null)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Tramites_SolicitudDocumentoConfiguracionDelete",
|
||||
cveUsuarioEjecuta,
|
||||
nombreDominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoEtapa", cveFraccionamientoEtapa, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CveFraccionamiento", cveFraccionamiento, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CveSolicitud", cveSolicitud, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CveTipoDocumento", cveTipoDocumento, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<TramiteDocumentoSolicitudModel>> ListForDevelopment(
|
||||
int developmentId,
|
||||
int? stageId,
|
||||
@@ -47,12 +138,40 @@ namespace SIG.Web.AppCode.Repositories.Documentos
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<TramiteDocumentoSolicitudModel>> ListarRequisitos(
|
||||
int cveFraccionamiento,
|
||||
int? cveEtapa,
|
||||
int? cveTipoTramite,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio)
|
||||
{
|
||||
const string procedimiento =
|
||||
"dbo.PA_Tramites_DocumentoSolicitudFraccionamientoList";
|
||||
|
||||
return QueryList<TramiteDocumentoSolicitudModel>(
|
||||
procedimiento,
|
||||
cveUsuarioEjecuta,
|
||||
nombreDominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CveFraccionamiento", cveFraccionamiento, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CveFraccionamientoEtapa", cveEtapa, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CveTipoTramite", cveTipoTramite, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@IncluirRequisitos", true, DbType.Boolean);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<TramiteDocumentoUploadContextModel> GetUploadContext(
|
||||
int developmentId,
|
||||
int requestId,
|
||||
int documentTypeId,
|
||||
int executingUser,
|
||||
string domainName)
|
||||
string domainName,
|
||||
int? cveFraccionamientoEtapa = null)
|
||||
{
|
||||
return QueryOne<TramiteDocumentoUploadContextModel>(
|
||||
"dbo.PA_Tramites_DocumentoSolicitudUploadContextGet",
|
||||
@@ -60,6 +179,7 @@ namespace SIG.Web.AppCode.Repositories.Documentos
|
||||
domainName,
|
||||
command =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(command, "@CveFraccionamientoEtapa", cveFraccionamientoEtapa, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
command,
|
||||
"@CveFraccionamiento",
|
||||
@@ -120,7 +240,11 @@ namespace SIG.Web.AppCode.Repositories.Documentos
|
||||
long contentLength,
|
||||
string clientComment,
|
||||
int executingUser,
|
||||
string domainName)
|
||||
string domainName,
|
||||
DateTime? fechaDocumento = null,
|
||||
DateTime? fechaVencimiento = null,
|
||||
bool actualizarFechas = false,
|
||||
int? cveFraccionamientoEtapa = null)
|
||||
{
|
||||
return QueryOne<TramiteDocumentoSaveResultModel>(
|
||||
"dbo.PA_Tramites_DocumentoSolicitudSave",
|
||||
@@ -128,6 +252,7 @@ namespace SIG.Web.AppCode.Repositories.Documentos
|
||||
domainName,
|
||||
command =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(command, "@CveFraccionamientoEtapa", cveFraccionamientoEtapa, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(command, "@CveFraccionamiento", developmentId, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(command, "@CveSolicitud", requestId, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(command, "@CveTipoDocumento", documentTypeId, DbType.Int32);
|
||||
@@ -137,6 +262,9 @@ namespace SIG.Web.AppCode.Repositories.Documentos
|
||||
StoredProcedureCommand.AddInput(command, "@ContentType", contentType, DbType.String);
|
||||
StoredProcedureCommand.AddInput(command, "@TamanoBytes", contentLength, DbType.Int64);
|
||||
StoredProcedureCommand.AddInput(command, "@ComentarioCliente", clientComment, DbType.String);
|
||||
StoredProcedureCommand.AddInput(command, "@FechaDocumento", fechaDocumento, DbType.Date);
|
||||
StoredProcedureCommand.AddInput(command, "@FechaVencimiento", fechaVencimiento, DbType.Date);
|
||||
StoredProcedureCommand.AddInput(command, "@ActualizarFechas", actualizarFechas, DbType.Boolean);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Globalization;
|
||||
@@ -21,6 +21,17 @@ namespace SIG.Web.AppCode.Repositories.Fraccionamientos
|
||||
{
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloFilaDesarrollos>> ListarDesarrollos(
|
||||
int cveCliente, int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
return QueryList<ModeloFilaDesarrollos>(
|
||||
"dbo.PA_Fraccionamientos_DesarrolladorEtapasList",
|
||||
cveUsuarioEjecuta,
|
||||
nombreDominio,
|
||||
comando => StoredProcedureCommand.AddInput(
|
||||
comando, "@CveCliente", cveCliente, DbType.Int32));
|
||||
}
|
||||
|
||||
public DbResult<List<OpcionClienteFraccionamiento>> ListarClientes(int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
return QueryList<OpcionClienteFraccionamiento>(
|
||||
@@ -313,6 +324,10 @@ namespace SIG.Web.AppCode.Repositories.Fraccionamientos
|
||||
DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamiento", etapa.CveFraccionamiento, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@Etapa", etapa.Etapa, DbType.String);
|
||||
if (etapa.Fideicomiso.HasValue)
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@Fideicomiso", etapa.Fideicomiso.Value, DbType.Boolean);
|
||||
}
|
||||
StoredProcedureCommand.AddInput(comando, "@Hectareas", etapa.Hectareas, DbType.Decimal);
|
||||
StoredProcedureCommand.AddInput(comando, "@EsActivo", etapa.EsActivo, DbType.Boolean);
|
||||
});
|
||||
@@ -573,6 +588,82 @@ namespace SIG.Web.AppCode.Repositories.Fraccionamientos
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<OpcionTipoVivienda>> ListarTiposVivienda(int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
return QueryList<OpcionTipoVivienda>(
|
||||
"dbo.PA_Fraccionamientos_TipoViviendaList", cveUsuarioEjecuta, nombreDominio,
|
||||
comando =>
|
||||
{
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloTipoViviendaEtapa>> ListarTiposViviendaEtapa(int cveEtapa, int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
return QueryList<ModeloTipoViviendaEtapa>(
|
||||
"dbo.PA_Fraccionamientos_EtapaTipoViviendaList", cveUsuarioEjecuta, nombreDominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoEtapa", cveEtapa, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> GuardarTipoViviendaEtapa(ModeloTipoViviendaEtapa registro, int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
return QueryScalarId(
|
||||
"dbo.PA_Fraccionamientos_EtapaTipoViviendaSave", cveUsuarioEjecuta, nombreDominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoEtapa", registro.CveFraccionamientoEtapa, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveTipoVivienda", registro.CveTipoVivienda, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@Cantidad", registro.Cantidad, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> EliminarTipoViviendaEtapa(int cveEtapa, int cveRegistro, int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Fraccionamientos_EtapaTipoViviendaDelete", cveUsuarioEjecuta, nombreDominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoEtapa", cveEtapa, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveEtapaTipoVivienda", cveRegistro, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloLoteTipoViviendaEtapa>> ListarLotesTipoViviendaEtapa(int cveEtapa, int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
return QueryList<ModeloLoteTipoViviendaEtapa>(
|
||||
"dbo.PA_Fraccionamientos_EtapaTipoViviendaLoteList", cveUsuarioEjecuta, nombreDominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoEtapa", cveEtapa, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> VincularLoteTipoViviendaEtapa(int cveEtapa, int cveRegistro, int cveLote, int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
return QueryScalarId(
|
||||
"dbo.PA_Fraccionamientos_EtapaTipoViviendaLoteSave", cveUsuarioEjecuta, nombreDominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoEtapa", cveEtapa, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveEtapaTipoVivienda", cveRegistro, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoLote", cveLote, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> DesvincularLoteTipoViviendaEtapa(int cveEtapa, int cveVinculo, int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Fraccionamientos_EtapaTipoViviendaLoteDelete", cveUsuarioEjecuta, nombreDominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoEtapa", cveEtapa, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveEtapaTipoViviendaLote", cveVinculo, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
private static int ObtenerValorBitAnulable(bool? valor)
|
||||
{
|
||||
if (!valor.HasValue)
|
||||
|
||||
78
SIG.Web/App_Code/Repositories/General/RepositorioTurnos.cs
Normal file
78
SIG.Web/App_Code/Repositories/General/RepositorioTurnos.cs
Normal file
@@ -0,0 +1,78 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using Newtonsoft.Json;
|
||||
using SIG.Web.AppCode.Contracts.Database;
|
||||
using SIG.Web.AppCode.Contracts.General;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.General;
|
||||
using SIG.Web.AppCode.Repositories.Database;
|
||||
using SIG.Web.AppCode.Utilities;
|
||||
|
||||
namespace SIG.Web.AppCode.Repositories.General
|
||||
{
|
||||
public sealed class RepositorioTurnos : RepositoryBase, IRepositorioTurnos
|
||||
{
|
||||
public RepositorioTurnos(IDbExecutor ejecutor) : base(ejecutor)
|
||||
{
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloTurno>> Listar(
|
||||
string texto, bool incluirInactivos, int usuario, string dominio)
|
||||
{
|
||||
return QueryList<ModeloTurno>(
|
||||
"dbo.PA_Sis_TurnoList", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@Texto", texto, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@IncluirInactivos", incluirInactivos, DbType.Boolean);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<ModeloTurno> Obtener(int cveTurno, int usuario, string dominio)
|
||||
{
|
||||
return QueryReader(
|
||||
"dbo.PA_Sis_TurnoGet", usuario, dominio,
|
||||
comando => StoredProcedureCommand.AddInput(comando, "@CveTurno", cveTurno, DbType.Int32),
|
||||
lector =>
|
||||
{
|
||||
ModeloTurno turno = lector.ToObject<ModeloTurno>();
|
||||
if (lector.NextResult() && turno != null)
|
||||
{
|
||||
turno.Horarios = lector.ToList<ModeloHorarioTurno>();
|
||||
}
|
||||
|
||||
return turno;
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> Guardar(ModeloTurno turno, int usuario, string dominio)
|
||||
{
|
||||
string horarios = JsonConvert.SerializeObject(turno.Horarios.Select(horario => new
|
||||
{
|
||||
horario.CveTurnoHorario,
|
||||
horario.DiaSemana,
|
||||
HoraInicio = horario.HoraInicio.ToString(@"hh\:mm", CultureInfo.InvariantCulture),
|
||||
HoraFin = horario.HoraFin.ToString(@"hh\:mm", CultureInfo.InvariantCulture)
|
||||
}));
|
||||
|
||||
return QueryScalarId(
|
||||
"dbo.PA_Sis_TurnoSave", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveTurno", turno.CveTurno, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@Turno", turno.Turno, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@EsActivo", turno.EsActivo, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(comando, "@HorariosJson", horarios, DbType.String);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> Eliminar(int cveTurno, int usuario, string dominio)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Sis_TurnoDelete", usuario, dominio,
|
||||
comando => StoredProcedureCommand.AddInput(comando, "@CveTurno", cveTurno, DbType.Int32));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using Newtonsoft.Json;
|
||||
using SIG.Web.AppCode.Contracts.Database;
|
||||
using SIG.Web.AppCode.Contracts.Security;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.Security;
|
||||
using SIG.Web.AppCode.Repositories.Database;
|
||||
using SIG.Web.AppCode.Utilities;
|
||||
|
||||
namespace SIG.Web.AppCode.Repositories.Security
|
||||
{
|
||||
public sealed class RepositorioCalendarioVisitas : RepositoryBase, IRepositorioCalendarioVisitas
|
||||
{
|
||||
public RepositorioCalendarioVisitas(IDbExecutor ejecutor) : base(ejecutor)
|
||||
{
|
||||
}
|
||||
|
||||
public DbResult<ModeloConfiguracionVisitas> ObtenerConfiguracion(int usuario, string dominio)
|
||||
{
|
||||
return QueryOne<ModeloConfiguracionVisitas>(
|
||||
"dbo.PA_Sis_ConfiguracionVisitasObtener", usuario, dominio,
|
||||
null);
|
||||
}
|
||||
|
||||
public DbResult<int> GuardarConfiguracion(ModeloConfiguracionVisitas configuracion, int usuario, string dominio)
|
||||
{
|
||||
return QueryScalarId(
|
||||
"dbo.PA_Sis_ConfiguracionVisitasGuardar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@DuracionPredeterminadaMinutos", configuracion.DuracionPredeterminadaMinutos, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloDiaFestivo>> ListarDiasFestivos(string texto, int usuario, string dominio)
|
||||
{
|
||||
return QueryList<ModeloDiaFestivo>(
|
||||
"dbo.PA_Sis_DiaFestivoListar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@Texto", texto, DbType.String);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<ModeloDiaFestivo> ObtenerDiaFestivo(int clave, int usuario, string dominio)
|
||||
{
|
||||
return QueryOne<ModeloDiaFestivo>(
|
||||
"dbo.PA_Sis_DiaFestivoObtener", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveDiaFestivo", clave, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> GuardarDiaFestivo(ModeloDiaFestivo dia, int usuario, string dominio)
|
||||
{
|
||||
return QueryScalarId(
|
||||
"dbo.PA_Sis_DiaFestivoGuardar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveDiaFestivo", dia.CveDiaFestivo, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@Fecha", dia.Fecha, DbType.Date);
|
||||
StoredProcedureCommand.AddInput(comando, "@Descripcion", dia.Descripcion, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@EsActivo", dia.EsActivo, DbType.Boolean);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> EliminarDiaFestivo(int clave, int usuario, string dominio)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Sis_DiaFestivoEliminar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveDiaFestivo", clave, DbType.Int32);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,31 @@ namespace SIG.Web.AppCode.Repositories.Security
|
||||
{
|
||||
}
|
||||
|
||||
public DbResult<List<UserAdministrationModel>> ListarCatalogo(
|
||||
string texto, int tipoUsuario, bool incluirInactivos, int usuario, string dominio)
|
||||
{
|
||||
return QueryList<UserAdministrationModel>(
|
||||
"dbo.PA_Sis_UsuarioList", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@Texto", texto, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@TipoUsuario", tipoUsuario, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@IncluirInactivos", incluirInactivos, DbType.Boolean);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<UserAdministrationModel> ReiniciarContrasena(
|
||||
int cveUsuario, string hashContrasena, int usuario, string dominio)
|
||||
{
|
||||
return QueryOne<UserAdministrationModel>(
|
||||
"dbo.PA_Sis_UsuarioContrasenaUpdate", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveUsuario", cveUsuario, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@HashContrasena", hashContrasena, DbType.String);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<UserAdministrationModel>> ListUsers(string text, int executingUser, string domainName)
|
||||
{
|
||||
return QueryList<UserAdministrationModel>(
|
||||
@@ -57,6 +82,8 @@ namespace SIG.Web.AppCode.Repositories.Security
|
||||
StoredProcedureCommand.AddInput(command, "@HashContrasena", passwordHash, DbType.String);
|
||||
StoredProcedureCommand.AddInput(command, "@Activo", user.Activo, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(command, "@DebeCambiarContrasena", user.DebeCambiarContrasena, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(command, "@EsSupervisor", user.EsSupervisor, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(command, "@CveTurno", user.CveTurno, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,404 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using Newtonsoft.Json;
|
||||
using SIG.Web.AppCode.Contracts.Database;
|
||||
using SIG.Web.AppCode.Contracts.Tramites;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.Tramites;
|
||||
using SIG.Web.AppCode.Repositories.Database;
|
||||
using SIG.Web.AppCode.Utilities;
|
||||
|
||||
namespace SIG.Web.AppCode.Repositories.Tramites
|
||||
{
|
||||
public sealed class RepositorioPagosConvenios : RepositoryBase, IRepositorioPagosConvenios
|
||||
{
|
||||
private const string ProcedimientoComprobantes = "dbo.PA_Tra_ComprobantePagoListar";
|
||||
private const string ProcedimientoFormasComprobante = "dbo.PA_Tra_ComprobantePagoFormasListar";
|
||||
|
||||
public DbResult<List<ModeloFormaComprobantePago>> ListarFormasComprobante(int usuario, string dominio)
|
||||
{
|
||||
return QueryList<ModeloFormaComprobantePago>(ProcedimientoFormasComprobante, usuario, dominio, null);
|
||||
}
|
||||
private const string ProcedimientoComprobante = "dbo.PA_Tra_ComprobantePagoObtener";
|
||||
private const string ProcedimientoRegistrarComprobante = "dbo.PA_Tra_ComprobantePagoRegistrar";
|
||||
private const string ProcedimientoAprobarComprobante = "dbo.PA_Tra_ComprobantePagoAprobar";
|
||||
|
||||
public DbResult<List<ModeloComprobantePago>> ListarComprobantes(
|
||||
int cveSolicitudPago, int usuario, string dominio)
|
||||
{
|
||||
return QueryList<ModeloComprobantePago>(ProcedimientoComprobantes, usuario, dominio,
|
||||
comando => StoredProcedureCommand.AddInput(comando, "@CveSolicitudPago", cveSolicitudPago, DbType.Int32));
|
||||
}
|
||||
|
||||
public DbResult<ModeloComprobantePago> ObtenerComprobante(
|
||||
int cveComprobantePago, int usuario, string dominio)
|
||||
{
|
||||
return QueryOne<ModeloComprobantePago>(ProcedimientoComprobante, usuario, dominio,
|
||||
comando => StoredProcedureCommand.AddInput(comando, "@CveComprobantePago", cveComprobantePago, DbType.Int32));
|
||||
}
|
||||
|
||||
public DbResult<int> RegistrarComprobante(ModeloComprobantePago comprobante, int usuario, string dominio)
|
||||
{
|
||||
return QueryScalarId(ProcedimientoRegistrarComprobante, usuario, dominio, comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSolicitudPago", comprobante.CveSolicitudPago, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFormaPago", comprobante.CveFormaPago, DbType.Byte);
|
||||
StoredProcedureCommand.AddInput(comando, "@FechaPago", comprobante.FechaPago, DbType.DateTime);
|
||||
AgregarImporte(comando, "@Importe", comprobante.Importe);
|
||||
StoredProcedureCommand.AddInput(comando, "@Referencia", comprobante.Referencia, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@NombreArchivo", comprobante.NombreArchivo, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@NombreFisico", comprobante.NombreFisico, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@TipoContenido", comprobante.TipoContenido, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@TamanoBytes", comprobante.TamanoBytes, DbType.Int64);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> AprobarComprobante(int cveComprobantePago, int cvePago, int usuario, string dominio)
|
||||
{
|
||||
return Execute(ProcedimientoAprobarComprobante, usuario, dominio, comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveComprobantePago", cveComprobantePago, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CvePago", cvePago, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
private const string ProcedimientoListarObligaciones = "dbo.PA_Tra_SolicitudPagoListar";
|
||||
private const string ProcedimientoObtenerObligacion = "dbo.PA_Tra_SolicitudPagoObtener";
|
||||
private const string ProcedimientoListarConvenios = "dbo.PA_Tra_ConvenioListar";
|
||||
private const string ProcedimientoGuardarObligacion = "dbo.PA_Tra_SolicitudPagoGuardar";
|
||||
private const string ProcedimientoGenerarObligaciones = "dbo.PA_Tra_SolicitudPagoGenerarPorSolicitud";
|
||||
private const string ProcedimientoCambiarRequerido = "dbo.PA_Tra_SolicitudPagoCambiarRequerido";
|
||||
private const string ProcedimientoCancelarObligacion = "dbo.PA_Tra_SolicitudPagoCancelar";
|
||||
private const string ProcedimientoListarAbonos = "dbo.PA_Tra_PagoListar";
|
||||
private const string ProcedimientoObtenerAbono = "dbo.PA_Tra_PagoObtener";
|
||||
private const string ProcedimientoRegistrarAbono = "dbo.PA_Tra_PagoRegistrar";
|
||||
private const string ProcedimientoAplicarAbono = "dbo.PA_Tra_PagoAplicar";
|
||||
private const string ProcedimientoCancelarAbono = "dbo.PA_Tra_PagoCancelar";
|
||||
private const string ProcedimientoGuardarConvenio = "dbo.PA_Tra_ConvenioGuardar";
|
||||
private const string ProcedimientoCancelarConvenio = "dbo.PA_Tra_ConvenioCancelar";
|
||||
|
||||
public RepositorioPagosConvenios(IDbExecutor ejecutor) : base(ejecutor)
|
||||
{
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloObligacionPago>> ListarObligaciones(
|
||||
ModeloFiltroObligacionesPago filtro,
|
||||
int usuario, string dominio)
|
||||
{
|
||||
return QueryList<ModeloObligacionPago>(
|
||||
ProcedimientoListarObligaciones, usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSolicitudPago", filtro.CveSolicitudPago, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCliente", filtro.CveCliente, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamiento", filtro.CveFraccionamiento, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSolicitud", filtro.CveSolicitud, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveTipoTramite", filtro.CveTipoTramite, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveTipoSolicitudPago", filtro.CveTipoSolicitudPago, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@EstadoAdministrativo", filtro.EstadoAdministrativo, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@SoloPendientes", filtro.SoloPendientes, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(comando, "@SoloVencidos", filtro.SoloVencidos, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(comando, "@Desde", filtro.Desde, DbType.Date);
|
||||
StoredProcedureCommand.AddInput(comando, "@Hasta", filtro.Hasta, DbType.Date);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<ModeloObligacionPago> ObtenerObligacion(
|
||||
int cveSolicitudPago,
|
||||
int usuario, string dominio)
|
||||
{
|
||||
return QueryReader(
|
||||
ProcedimientoObtenerObligacion, usuario, dominio,
|
||||
comando => StoredProcedureCommand.AddInput(comando, "@CveSolicitudPago", cveSolicitudPago, DbType.Int32),
|
||||
lector =>
|
||||
{
|
||||
ModeloObligacionPago obligacion = lector.ToObject<ModeloObligacionPago>();
|
||||
if (obligacion == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!lector.NextResult())
|
||||
{
|
||||
throw new InvalidOperationException("Falta el resultado de productos en la consulta de pagos.");
|
||||
}
|
||||
|
||||
obligacion.Productos = lector.ToList<ModeloProductoObligacion>();
|
||||
|
||||
if (!lector.NextResult())
|
||||
{
|
||||
throw new InvalidOperationException("Falta el resultado de parcialidades en la consulta de pagos.");
|
||||
}
|
||||
|
||||
obligacion.Parcialidades = lector.ToList<ModeloParcialidadObligacion>();
|
||||
|
||||
if (!lector.NextResult())
|
||||
{
|
||||
throw new InvalidOperationException("Falta el resultado de aplicaciones en la consulta de pagos.");
|
||||
}
|
||||
|
||||
obligacion.Aplicaciones = lector.ToList<ModeloAplicacionAbono>();
|
||||
|
||||
if (!lector.NextResult())
|
||||
{
|
||||
throw new InvalidOperationException("Falta el resultado de convenio en la consulta de pagos.");
|
||||
}
|
||||
|
||||
obligacion.Convenio = lector.ToObject<ModeloDatosConvenio>();
|
||||
|
||||
if (!lector.NextResult())
|
||||
{
|
||||
throw new InvalidOperationException("Falta el resultado de origenes en la consulta de pagos.");
|
||||
}
|
||||
|
||||
obligacion.Origenes = lector.ToList<ModeloOrigenConvenio>();
|
||||
|
||||
if (!lector.NextResult())
|
||||
{
|
||||
throw new InvalidOperationException("Falta el resultado de cambiosrequerido en la consulta de pagos.");
|
||||
}
|
||||
|
||||
obligacion.CambiosRequerido = lector.ToList<ModeloCambioRequeridoPago>();
|
||||
|
||||
if (!lector.NextResult())
|
||||
{
|
||||
throw new InvalidOperationException("Falta el desglose de origen en la consulta de pagos.");
|
||||
}
|
||||
|
||||
obligacion.DetallesOrigen = lector.ToList<ModeloDetalleOrigenConvenio>();
|
||||
|
||||
return obligacion;
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloObligacionPago>> ListarConvenios(
|
||||
int? cveCliente, bool? soloPendientes, bool soloVencidos,
|
||||
int usuario, string dominio)
|
||||
{
|
||||
return QueryList<ModeloObligacionPago>(
|
||||
ProcedimientoListarConvenios, usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCliente", cveCliente, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@SoloPendientes", soloPendientes, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(comando, "@SoloVencidos", soloVencidos, DbType.Boolean);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> GuardarObligacion(
|
||||
ModeloCapturaObligacion obligacion,
|
||||
int usuario, string dominio)
|
||||
{
|
||||
return QueryScalarId(
|
||||
ProcedimientoGuardarObligacion, usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSolicitudPago", obligacion.CveSolicitudPago, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCliente", obligacion.CveCliente, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamiento", obligacion.CveFraccionamiento, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoEtapa", obligacion.CveFraccionamientoEtapa, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@Descripcion", obligacion.Descripcion, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveUnidadCobro", obligacion.CveUnidadCobro, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@EsRequerido", obligacion.EsRequerido, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(comando, "@FechaGeneracion", obligacion.FechaGeneracion, DbType.DateTime2);
|
||||
AgregarImporte(comando, "@Importe", obligacion.Importe);
|
||||
AgregarJson(comando, "@DetalleJson", obligacion.Productos);
|
||||
AgregarJson(comando, "@ParcialidadesJson", obligacion.Parcialidades);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveTipoSolicitudPago", obligacion.CveTipoSolicitudPago, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSolicitud", obligacion.CveSolicitud, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveTipoTramite", obligacion.CveTipoTramite, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveTramitePago", obligacion.CveTramitePago, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloClaveObligacionPago>> GenerarObligaciones(
|
||||
int cveSolicitud, DateTime fechaVencimiento, int? cveTramitePago,
|
||||
int usuario, string dominio)
|
||||
{
|
||||
return QueryList<ModeloClaveObligacionPago>(
|
||||
ProcedimientoGenerarObligaciones, usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSolicitud", cveSolicitud, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@FechaVencimiento", fechaVencimiento.Date, DbType.Date);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveTramitePago", cveTramitePago, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> CambiarRequerido(
|
||||
int cveSolicitudPago, bool esRequerido, string observacion,
|
||||
int usuario, string dominio)
|
||||
{
|
||||
return Execute(
|
||||
ProcedimientoCambiarRequerido, usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSolicitudPago", cveSolicitudPago, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@EsRequerido", esRequerido, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(comando, "@Observacion", observacion, DbType.String);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> CancelarObligacion(
|
||||
int cveSolicitudPago,
|
||||
int usuario, string dominio)
|
||||
{
|
||||
return Execute(
|
||||
ProcedimientoCancelarObligacion, usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSolicitudPago", cveSolicitudPago, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloAbono>> ListarAbonos(
|
||||
ModeloFiltroAbonos filtro,
|
||||
int usuario, string dominio)
|
||||
{
|
||||
return QueryList<ModeloAbono>(
|
||||
ProcedimientoListarAbonos, usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CvePago", filtro.CvePago, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCliente", filtro.CveCliente, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamiento", filtro.CveFraccionamiento, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSolicitud", filtro.CveSolicitud, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@Desde", filtro.Desde, DbType.Date);
|
||||
StoredProcedureCommand.AddInput(comando, "@Hasta", filtro.Hasta, DbType.Date);
|
||||
StoredProcedureCommand.AddInput(comando, "@EsActivo", filtro.EsActivo, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(comando, "@SoloPendientesFacturar", filtro.SoloPendientesFacturar, DbType.Boolean);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<ModeloAbono> ObtenerAbono(
|
||||
int cvePago,
|
||||
int usuario, string dominio)
|
||||
{
|
||||
return QueryReader(
|
||||
ProcedimientoObtenerAbono, usuario, dominio,
|
||||
comando => StoredProcedureCommand.AddInput(comando, "@CvePago", cvePago, DbType.Int32),
|
||||
lector =>
|
||||
{
|
||||
ModeloAbono abono = lector.ToObject<ModeloAbono>();
|
||||
if (abono == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!lector.NextResult())
|
||||
{
|
||||
throw new InvalidOperationException("Falta el resultado de aplicaciones en la consulta de pagos.");
|
||||
}
|
||||
|
||||
abono.Aplicaciones = lector.ToList<ModeloAplicacionAbono>();
|
||||
|
||||
if (!lector.NextResult())
|
||||
{
|
||||
throw new InvalidOperationException("Falta el resultado de documentos en la consulta de pagos.");
|
||||
}
|
||||
|
||||
abono.Documentos = lector.ToList<ModeloDocumentoAbono>();
|
||||
|
||||
return abono;
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> RegistrarAbono(
|
||||
ModeloCapturaAbono abono,
|
||||
int usuario, string dominio)
|
||||
{
|
||||
return QueryScalarId(
|
||||
ProcedimientoRegistrarAbono, usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCliente", abono.CveCliente, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@FechaPago", abono.FechaPago, DbType.DateTime);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveUnidadCobro", abono.CveUnidadCobro, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFormaPago", abono.CveFormaPago, DbType.Byte);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveBancoCuenta", abono.CveBancoCuenta, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@Referencia", abono.Referencia, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@Observaciones", abono.Observaciones, DbType.String);
|
||||
AgregarImporte(comando, "@Importe", abono.Importe);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> AplicarAbono(
|
||||
int cvePago, List<ModeloCapturaAplicacionAbono> aplicaciones,
|
||||
int usuario, string dominio)
|
||||
{
|
||||
return Execute(
|
||||
ProcedimientoAplicarAbono, usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CvePago", cvePago, DbType.Int32);
|
||||
AgregarJson(comando, "@AplicacionesJson", aplicaciones);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> CancelarAbono(
|
||||
int cvePago,
|
||||
int usuario, string dominio)
|
||||
{
|
||||
return Execute(
|
||||
ProcedimientoCancelarAbono, usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CvePago", cvePago, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> CancelarConvenio(
|
||||
int cveSolicitudPago,
|
||||
int usuario, string dominio)
|
||||
{
|
||||
return Execute(
|
||||
ProcedimientoCancelarConvenio, usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSolicitudPago", cveSolicitudPago, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> GuardarConvenio(
|
||||
ModeloCapturaConvenio convenio, bool permitirDisminucion,
|
||||
int usuario, string dominio)
|
||||
{
|
||||
return QueryScalarId(
|
||||
ProcedimientoGuardarConvenio, usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
ModeloCapturaObligacion obligacion = convenio.Obligacion;
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSolicitudPago", obligacion.CveSolicitudPago, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCliente", obligacion.CveCliente, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamiento", obligacion.CveFraccionamiento, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoEtapa", obligacion.CveFraccionamientoEtapa, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@Descripcion", obligacion.Descripcion, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveUnidadCobro", obligacion.CveUnidadCobro, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@EsRequerido", obligacion.EsRequerido, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(comando, "@FechaGeneracion", obligacion.FechaGeneracion, DbType.DateTime2);
|
||||
AgregarImporte(comando, "@Importe", obligacion.Importe);
|
||||
AgregarJson(comando, "@DetalleJson", obligacion.Productos);
|
||||
AgregarJson(comando, "@ParcialidadesJson", obligacion.Parcialidades);
|
||||
StoredProcedureCommand.AddInput(comando, "@Observaciones", convenio.Observaciones, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@PermitirDisminucion", permitirDisminucion, DbType.Boolean);
|
||||
AgregarJson(comando, "@OrigenesJson", convenio.Origenes);
|
||||
});
|
||||
}
|
||||
|
||||
private static void AgregarImporte(IDbCommand comando, string nombre, decimal importe)
|
||||
{
|
||||
IDbDataParameter parametro = StoredProcedureCommand.AddInput(
|
||||
comando, nombre, importe, DbType.Decimal);
|
||||
parametro.Precision = 19;
|
||||
parametro.Scale = 6;
|
||||
}
|
||||
|
||||
private static void AgregarJson(IDbCommand comando, string nombre, object datos)
|
||||
{
|
||||
IDbDataParameter parametro = StoredProcedureCommand.AddInput(
|
||||
comando, nombre, JsonConvert.SerializeObject(datos), DbType.String);
|
||||
parametro.Size = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
@@ -232,57 +232,52 @@ namespace SIG.Web.AppCode.Repositories.Tramites
|
||||
}
|
||||
|
||||
public DbResult<DocumentoRequeridoModel> GetDocumentoRequerido(
|
||||
int id,
|
||||
int cveTipoTramite,
|
||||
int cveTipoDocumento,
|
||||
int usuario,
|
||||
string dominio)
|
||||
{
|
||||
/*
|
||||
* El registro se obtiene desde el listado existente.
|
||||
* No se utiliza un PA específico Get para documento requerido.
|
||||
* El control de acceso al módulo permanece en el mecanismo
|
||||
* existente del proyecto.
|
||||
*/
|
||||
return QueryReader(
|
||||
"dbo.PA_Tra_DocumentoRequeridoList",
|
||||
return QueryOne<DocumentoRequeridoModel>(
|
||||
"dbo.PA_Tra_DocumentoRequeridoGet",
|
||||
usuario,
|
||||
dominio,
|
||||
command =>
|
||||
comando =>
|
||||
{
|
||||
Add(
|
||||
command,
|
||||
"@CveTipoTramite",
|
||||
null,
|
||||
DbType.Int32);
|
||||
|
||||
Add(
|
||||
command,
|
||||
"@IncluirInactivos",
|
||||
true,
|
||||
DbType.Boolean);
|
||||
},
|
||||
reader =>
|
||||
reader
|
||||
.ToList<DocumentoRequeridoModel>()
|
||||
.FirstOrDefault(
|
||||
item =>
|
||||
item.CveDocumentoRequerido == id));
|
||||
Add(comando, "@CveTipoTramite", cveTipoTramite, DbType.Int32);
|
||||
Add(comando, "@CveTipoDocumento", cveTipoDocumento, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> SaveDocumentoRequerido(DocumentoRequeridoModel model, int usuario, string dominio)
|
||||
{
|
||||
return Save("dbo.PA_Tra_DocumentoRequeridoSave", usuario, dominio, command =>
|
||||
{
|
||||
Add(command, "@CveDocumentoRequerido", NullableId(model.CveDocumentoRequerido), DbType.Int32);
|
||||
Add(command, "@CveTipoTramiteAnterior", model.CveTipoTramiteAnterior, DbType.Int32);
|
||||
Add(command, "@CveTipoDocumentoAnterior", model.CveTipoDocumentoAnterior, DbType.Int32);
|
||||
Add(command, "@CveTipoTramite", model.CveTipoTramite, DbType.Int32);
|
||||
Add(command, "@CveTipoDocumento", model.CveTipoDocumento, DbType.Int32);
|
||||
Add(command, "@EsCliente", model.EsCliente, DbType.Boolean);
|
||||
Add(command, "@TieneVigencia", model.TieneVigencia, DbType.Boolean);
|
||||
Add(command, "@EsRequerido", model.EsRequerido, DbType.Boolean);
|
||||
Add(command, "@EsActivo", model.EsActivo, DbType.Boolean);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> DeleteDocumentoRequerido(int id, int usuario, string dominio)
|
||||
public DbResult<bool> DeleteDocumentoRequerido(
|
||||
int cveTipoTramite,
|
||||
int cveTipoDocumento,
|
||||
int usuario,
|
||||
string dominio)
|
||||
{
|
||||
return Delete("dbo.PA_Tra_DocumentoRequeridoDelete", "@CveDocumentoRequerido", id, usuario, dominio);
|
||||
return Execute(
|
||||
"dbo.PA_Tra_DocumentoRequeridoDelete",
|
||||
usuario,
|
||||
dominio,
|
||||
comando =>
|
||||
{
|
||||
Add(comando, "@CveTipoTramite", cveTipoTramite, DbType.Int32);
|
||||
Add(comando, "@CveTipoDocumento", cveTipoDocumento, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<TipoPreguntaModel>> ListTiposPregunta(int usuario, string dominio)
|
||||
@@ -469,7 +464,8 @@ namespace SIG.Web.AppCode.Repositories.Tramites
|
||||
int referenceId,
|
||||
bool placeAfter,
|
||||
int usuario,
|
||||
string dominio)
|
||||
string dominio,
|
||||
int? cveTipoTramite = null)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Tra_CatalogoOrdenMove",
|
||||
@@ -481,6 +477,7 @@ namespace SIG.Web.AppCode.Repositories.Tramites
|
||||
Add(command, "@CveRegistro", id, DbType.Int32);
|
||||
Add(command, "@CveReferencia", referenceId, DbType.Int32);
|
||||
Add(command, "@ColocarDespues", placeAfter, DbType.Boolean);
|
||||
Add(command, "@CveTipoTramite", cveTipoTramite, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ using SIG.Web.AppCode.Contracts.Tramites;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.Tramites;
|
||||
using SIG.Web.AppCode.Repositories.Database;
|
||||
using SIG.Web.AppCode.Utilities;
|
||||
|
||||
namespace SIG.Web.AppCode.Repositories.Tramites
|
||||
{
|
||||
@@ -16,6 +17,138 @@ namespace SIG.Web.AppCode.Repositories.Tramites
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public DbResult<bool> ActualizarProceso(
|
||||
int? cveSolicitud, int? cveFraccionamientoEtapa,
|
||||
int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Tra_SolicitudProcesoActualizar",
|
||||
cveUsuarioEjecuta, nombreDominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CveSolicitud", cveSolicitud, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CveFraccionamientoEtapa", cveFraccionamientoEtapa, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloAccionPendienteSolicitud>> ListarAccionesPendientes(
|
||||
int cveSolicitud, int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
return QueryList<ModeloAccionPendienteSolicitud>(
|
||||
"dbo.PA_Tra_SolicitudAccionesPendientesList",
|
||||
cveUsuarioEjecuta, nombreDominio,
|
||||
comando => StoredProcedureCommand.AddInput(
|
||||
comando, "@CveSolicitud", cveSolicitud, DbType.Int32));
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloComentarioSolicitud>> ListarComentarios(
|
||||
int cveSolicitud, int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
const string procedimiento = "dbo.PA_Tra_SolicitudComentarioList";
|
||||
return QueryList<ModeloComentarioSolicitud>(
|
||||
procedimiento, cveUsuarioEjecuta, nombreDominio,
|
||||
comando => StoredProcedureCommand.AddInput(
|
||||
comando, "@CveSolicitud", cveSolicitud, DbType.Int32));
|
||||
}
|
||||
|
||||
public DbResult<ModeloComentarioSolicitud> AgregarComentario(
|
||||
int cveSolicitud, int? cveComentarioPadre, string comentario,
|
||||
int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
const string procedimiento = "dbo.PA_Tra_SolicitudComentarioAdd";
|
||||
return QueryOne<ModeloComentarioSolicitud>(
|
||||
procedimiento, cveUsuarioEjecuta, nombreDominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CveSolicitud", cveSolicitud, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@CveComentarioPadre", cveComentarioPadre, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@Comentario", comentario, DbType.String);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<ModeloResultadoTableroTramites> ConsultarTablero(
|
||||
ModeloFiltroTableroTramites filtros,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio)
|
||||
{
|
||||
return QueryReader(
|
||||
"dbo.PA_Tra_ReporteTramitesList",
|
||||
cveUsuarioEjecuta,
|
||||
nombreDominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando,
|
||||
"@CveAgrupacion",
|
||||
(byte)filtros.Agrupacion,
|
||||
DbType.Byte);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando,
|
||||
"@CveFraccionamiento",
|
||||
filtros.CveFraccionamiento,
|
||||
DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando,
|
||||
"@SoloActivos",
|
||||
filtros.SoloActivos,
|
||||
DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando,
|
||||
"@SoloBloqueados",
|
||||
filtros.SoloBloqueados,
|
||||
DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@EstatusSeleccionados",
|
||||
string.Join(",", filtros.EstatusSeleccionados), DbType.String);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@MostrarAutorizados", filtros.MostrarAutorizados, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando, "@MostrarCancelados", filtros.MostrarCancelados, DbType.Boolean);
|
||||
},
|
||||
lector =>
|
||||
{
|
||||
var resultado = new ModeloResultadoTableroTramites
|
||||
{
|
||||
Filas = lector.ToList<ModeloFilaTableroTramites>(),
|
||||
Fraccionamientos = new List<ModeloFraccionamientoTableroTramites>()
|
||||
};
|
||||
|
||||
if (lector.NextResult())
|
||||
{
|
||||
resultado.Fraccionamientos =
|
||||
lector.ToList<ModeloFraccionamientoTableroTramites>();
|
||||
}
|
||||
|
||||
resultado.Estatus = lector.NextResult()
|
||||
? lector.ToList<TramiteSolicitudEstatusOptionModel>()
|
||||
: new List<TramiteSolicitudEstatusOptionModel>();
|
||||
|
||||
return resultado;
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloHistorialEstatusSolicitud>> ListarHistorialEstatus(
|
||||
int cveSolicitud,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio)
|
||||
{
|
||||
return QueryList<ModeloHistorialEstatusSolicitud>(
|
||||
"dbo.PA_Tra_SolicitudHistorialEstatusList",
|
||||
cveUsuarioEjecuta,
|
||||
nombreDominio,
|
||||
comando => StoredProcedureCommand.AddInput(
|
||||
comando,
|
||||
"@CveSolicitud",
|
||||
cveSolicitud,
|
||||
DbType.Int32));
|
||||
}
|
||||
|
||||
public DbResult<int> EnsureStageRequest(
|
||||
int stageId,
|
||||
int procedureTypeId,
|
||||
@@ -188,9 +321,29 @@ namespace SIG.Web.AppCode.Repositories.Tramites
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloPagoSolicitud>> ListarPagosSolicitud(
|
||||
int cveSolicitud,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio)
|
||||
{
|
||||
const string procedimiento = "dbo.PA_Tra_SolicitudPagoList";
|
||||
|
||||
return QueryList<ModeloPagoSolicitud>(
|
||||
procedimiento,
|
||||
cveUsuarioEjecuta,
|
||||
nombreDominio,
|
||||
comando => StoredProcedureCommand.AddInput(
|
||||
comando,
|
||||
"@CveSolicitud",
|
||||
cveSolicitud,
|
||||
DbType.Int32));
|
||||
}
|
||||
|
||||
public DbResult<TramiteSolicitudStatusChangeModel> CambiarEstatus(
|
||||
int cveSolicitud,
|
||||
int cveEstatusSolicitud,
|
||||
int cveEstatusSolicitudAnterior,
|
||||
string observaciones,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio)
|
||||
{
|
||||
@@ -210,6 +363,16 @@ namespace SIG.Web.AppCode.Repositories.Tramites
|
||||
"@CveEstatusSolicitud",
|
||||
cveEstatusSolicitud,
|
||||
DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando,
|
||||
"@CveEstatusSolicitudAnterior",
|
||||
cveEstatusSolicitudAnterior,
|
||||
DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando,
|
||||
"@Observaciones",
|
||||
observaciones,
|
||||
DbType.String);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -125,6 +125,11 @@ namespace SIG.Web.AppCode.Repositories.Ventas
|
||||
"@Observaciones",
|
||||
venta.Observaciones,
|
||||
DbType.String);
|
||||
StoredProcedureCommand.AddInput(
|
||||
comando,
|
||||
"@FechaVencimiento",
|
||||
venta.FechaVencimiento,
|
||||
DbType.Date);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
455
SIG.Web/App_Code/Repositories/Visitas/RepositorioVisitas.cs
Normal file
455
SIG.Web/App_Code/Repositories/Visitas/RepositorioVisitas.cs
Normal file
@@ -0,0 +1,455 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using Newtonsoft.Json;
|
||||
using SIG.Web.AppCode.Contracts.Database;
|
||||
using SIG.Web.AppCode.Contracts.Visitas;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.Visitas;
|
||||
using SIG.Web.AppCode.Repositories.Database;
|
||||
using SIG.Web.AppCode.Utilities;
|
||||
|
||||
namespace SIG.Web.AppCode.Repositories.Visitas
|
||||
{
|
||||
public sealed class RepositorioVisitas : RepositoryBase, IRepositorioVisitas
|
||||
{
|
||||
public RepositorioVisitas(IDbExecutor ejecutor) : base(ejecutor)
|
||||
{
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloUsuarioSupervision>> ListarUsuariosSupervision(
|
||||
bool supervisores, int usuario, string dominio)
|
||||
{
|
||||
return QueryList<ModeloUsuarioSupervision>(
|
||||
"dbo.PA_Vis_UsuarioListar", usuario, dominio,
|
||||
comando => StoredProcedureCommand.AddInput(
|
||||
comando, "@Supervisores", supervisores, DbType.Boolean));
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloPlantillaVisita>> ListarPlantillas(string texto, int usuario, string dominio)
|
||||
{
|
||||
return QueryList<ModeloPlantillaVisita>(
|
||||
"dbo.PA_Vis_PlantillaCuestionarioListar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@Texto", texto, DbType.String);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<ModeloPlantillaVisita> ObtenerPlantilla(int clave, int usuario, string dominio)
|
||||
{
|
||||
return QueryReader(
|
||||
"dbo.PA_Vis_PlantillaCuestionarioObtener", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CvePlantilla", clave, DbType.Int32);
|
||||
},
|
||||
lector =>
|
||||
{
|
||||
ModeloPlantillaVisita modelo = lector.ToObject<ModeloPlantillaVisita>();
|
||||
if (lector.NextResult() && modelo != null)
|
||||
{
|
||||
modelo.Preguntas = lector.ToList<ModeloPreguntaVisita>();
|
||||
}
|
||||
if (lector.NextResult() && modelo != null)
|
||||
{
|
||||
List<ModeloOpcionVisita> opciones = lector.ToList<ModeloOpcionVisita>();
|
||||
foreach (ModeloPreguntaVisita pregunta in modelo.Preguntas)
|
||||
{
|
||||
pregunta.Opciones = opciones.Where(opcion => opcion.CvePreguntaPlantilla == pregunta.CvePreguntaPlantilla).ToList();
|
||||
}
|
||||
}
|
||||
return modelo;
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> GuardarPlantilla(ModeloPlantillaVisita plantilla, int usuario, string dominio)
|
||||
{
|
||||
return QueryScalarId(
|
||||
"dbo.PA_Vis_PlantillaCuestionarioGuardar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CvePlantilla", plantilla.CvePlantilla, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@Nombre", plantilla.Nombre, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@EsPorLote", plantilla.EsPorLote, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(comando, "@EsActivo", plantilla.EsActivo, DbType.Boolean);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> EliminarPlantilla(int clave, int usuario, string dominio)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Vis_PlantillaCuestionarioEliminar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CvePlantilla", clave, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> GuardarPregunta(ModeloPreguntaVisita pregunta, int usuario, string dominio)
|
||||
{
|
||||
return QueryScalarId(
|
||||
"dbo.PA_Vis_PreguntaPlantillaGuardar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CvePreguntaPlantilla", pregunta.CvePreguntaPlantilla, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CvePlantilla", pregunta.CvePlantilla, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveTipoPregunta", pregunta.CveTipoPregunta, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@Pregunta", pregunta.Pregunta, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@EsRequerida", pregunta.EsRequerida, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(comando, "@EsActivo", pregunta.EsActivo, DbType.Boolean);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> EliminarPregunta(int clave, int usuario, string dominio)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Vis_PreguntaPlantillaEliminar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CvePreguntaPlantilla", clave, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> GuardarOpcion(ModeloOpcionVisita opcion, int usuario, string dominio)
|
||||
{
|
||||
return QueryScalarId(
|
||||
"dbo.PA_Vis_OpcionPreguntaGuardar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveOpcionPregunta", opcion.CveOpcionPregunta, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CvePreguntaPlantilla", opcion.CvePreguntaPlantilla, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@TextoOpcion", opcion.TextoOpcion, DbType.String);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> EliminarOpcion(int clave, int usuario, string dominio)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Vis_OpcionPreguntaEliminar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveOpcionPregunta", clave, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> ActualizarOrdenPregunta(int clave, int referencia, bool colocarDespues, int usuario, string dominio)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Vis_PreguntaPlantillaActualizarOrden", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CvePreguntaPlantilla", clave, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveReferencia", referencia, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@ColocarDespues", colocarDespues, DbType.Boolean);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> ActualizarOrdenOpcion(int clave, int referencia, bool colocarDespues, int usuario, string dominio)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Vis_OpcionPreguntaActualizarOrden", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveOpcionPregunta", clave, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveReferencia", referencia, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@ColocarDespues", colocarDespues, DbType.Boolean);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloCita>> ListarCitas(string texto, DateTime? desde, DateTime? hasta, int usuario, string dominio)
|
||||
{
|
||||
return QueryList<ModeloCita>(
|
||||
"dbo.PA_Vis_CitaListar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@Texto", texto, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@Desde", desde, DbType.Date);
|
||||
StoredProcedureCommand.AddInput(comando, "@Hasta", hasta, DbType.Date);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<ModeloCita> ObtenerCita(int clave, int usuario, string dominio)
|
||||
{
|
||||
return QueryOne<ModeloCita>(
|
||||
"dbo.PA_Vis_CitaObtener", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCita", clave, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<ModeloDisponibilidadVisita> ObtenerDisponibilidad(DateTime fechaDesde, int duracionMinutos, int? supervisor, int citaExcluir, int usuario, string dominio)
|
||||
{
|
||||
return QueryOne<ModeloDisponibilidadVisita>(
|
||||
"dbo.PA_Vis_CitaObtenerDisponibilidad", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@FechaDesde", fechaDesde, DbType.DateTime2);
|
||||
StoredProcedureCommand.AddInput(comando, "@DuracionMinutos", duracionMinutos, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSupervisor", supervisor, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCitaExcluir", citaExcluir, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> GuardarCita(ModeloCita cita, int usuario, string dominio)
|
||||
{
|
||||
return QueryScalarId(
|
||||
"dbo.PA_Vis_CitaGuardar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCita", cita.CveCita, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoEtapa", cita.CveFraccionamientoEtapa, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSupervisor", cita.CveSupervisor, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@FechaInicio", cita.FechaInicio, DbType.DateTime2);
|
||||
StoredProcedureCommand.AddInput(comando, "@DuracionMinutos", cita.DuracionMinutos, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@Comentarios", cita.Comentarios, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSolicitud", cita.CveSolicitud, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveUsuarioDesarrollador", cita.CveUsuarioDesarrollador, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@Reprogramar", cita.Reprogramar, DbType.Boolean);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> CancelarCita(int clave, int usuario, string dominio)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Vis_CitaCancelar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCita", clave, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<ModeloVisita> ObtenerVisita(int clave, int usuario, string dominio)
|
||||
{
|
||||
return QueryReader(
|
||||
"dbo.PA_Vis_VisitaObtener", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveVisita", clave, DbType.Int32);
|
||||
},
|
||||
lector =>
|
||||
{
|
||||
ModeloVisita modelo = lector.ToObject<ModeloVisita>();
|
||||
if (lector.NextResult() && modelo != null)
|
||||
{
|
||||
modelo.Cuestionarios = lector.ToList<ModeloCuestionarioVisita>();
|
||||
}
|
||||
if (lector.NextResult() && modelo != null)
|
||||
{
|
||||
modelo.Documentos = lector.ToList<ModeloDocumentoVisita>();
|
||||
}
|
||||
if (lector.NextResult() && modelo != null)
|
||||
{
|
||||
modelo.Comentarios = lector.ToList<ModeloComentarioVisita>();
|
||||
}
|
||||
return modelo;
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> GuardarVisita(ModeloVisita visita, int usuario, string dominio)
|
||||
{
|
||||
return QueryScalarId(
|
||||
"dbo.PA_Vis_VisitaGuardar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveVisita", visita.CveVisita, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@SeRealizo", visita.SeRealizo, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(comando, "@FechaReal", visita.FechaReal, DbType.DateTime2);
|
||||
StoredProcedureCommand.AddInput(comando, "@FechaFin", visita.FechaFin, DbType.DateTime2);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCita", visita.CveProgramacionVisita, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoEtapa", visita.CveFraccionamientoEtapa, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSupervisor", visita.CveSupervisor, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSolicitud", visita.CveSolicitud, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@Observaciones", visita.Observaciones, DbType.String);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<ModeloCuestionarioVisita> ObtenerCuestionario(int clave, int usuario, string dominio)
|
||||
{
|
||||
return QueryReader(
|
||||
"dbo.PA_Vis_CuestionarioVisitaObtener", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCuestionarioVisita", clave, DbType.Int32);
|
||||
},
|
||||
lector =>
|
||||
{
|
||||
ModeloCuestionarioVisita modelo = lector.ToObject<ModeloCuestionarioVisita>();
|
||||
if (lector.NextResult() && modelo != null)
|
||||
{
|
||||
modelo.Respuestas = lector.ToList<ModeloRespuestaVisita>();
|
||||
modelo.Plantilla = JsonConvert.DeserializeObject<ModeloPlantillaVisita>(modelo.DefinicionPlantilla);
|
||||
}
|
||||
return modelo;
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> GuardarCuestionario(ModeloCuestionarioVisita cuestionario, int usuario, string dominio)
|
||||
{
|
||||
return QueryScalarId(
|
||||
"dbo.PA_Vis_CuestionarioVisitaGuardar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCuestionarioVisita", cuestionario.CveCuestionarioVisita, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveVisita", cuestionario.CveVisita, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CvePlantilla", cuestionario.CvePlantilla, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoLote", cuestionario.CveFraccionamientoLote, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@PasoSupervision", cuestionario.PasoSupervision, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(comando, "@AguaPotableTerminada", cuestionario.AguaPotableTerminada, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(comando, "@DrenajeTerminado", cuestionario.DrenajeTerminado, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(comando, "@Observaciones", cuestionario.Observaciones, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@Finalizado", cuestionario.Finalizado, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(comando, "@RespuestasJson", JsonConvert.SerializeObject(cuestionario.Respuestas), DbType.String);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> EliminarCuestionario(int clave, int usuario, string dominio)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Vis_CuestionarioVisitaEliminar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCuestionarioVisita", clave, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<ModeloDocumentoVisita> ObtenerDocumento(int clave, int usuario, string dominio)
|
||||
{
|
||||
return QueryOne<ModeloDocumentoVisita>(
|
||||
"dbo.PA_Vis_DocumentoVisitaObtener", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveDocumentoVisita", clave, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> GuardarDocumento(ModeloDocumentoVisita documento, int usuario, string dominio)
|
||||
{
|
||||
return QueryScalarId(
|
||||
"dbo.PA_Vis_DocumentoVisitaGuardar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveVisita", documento.CveVisita, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCuestionarioVisita", documento.CveCuestionarioVisita, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@NombreArchivo", documento.NombreArchivo, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@NombreFisico", documento.NombreFisico, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@TipoContenido", documento.TipoContenido, DbType.String);
|
||||
StoredProcedureCommand.AddInput(comando, "@TamanoBytes", documento.TamanoBytes, DbType.Int64);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> EliminarDocumento(int clave, int usuario, string dominio)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Vis_DocumentoVisitaEliminar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveDocumentoVisita", clave, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> GuardarComentario(ModeloComentarioVisita comentario, int usuario, string dominio)
|
||||
{
|
||||
return QueryScalarId(
|
||||
"dbo.PA_Vis_ComentarioVisitaGuardar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveComentarioVisita", comentario.CveComentarioVisita, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveVisita", comentario.CveVisita, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@Comentario", comentario.Comentario, DbType.String);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<bool> EliminarComentario(int clave, int usuario, string dominio)
|
||||
{
|
||||
return Execute(
|
||||
"dbo.PA_Vis_ComentarioVisitaEliminar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveComentarioVisita", clave, DbType.Int32);
|
||||
});
|
||||
}
|
||||
public DbResult<List<ModeloDisponibilidadVisita>> ListarDisponibilidad(DateTime fechaDesde, int duracionMinutos, int? supervisor, int citaExcluir, int usuario, string dominio)
|
||||
{
|
||||
return QueryList<ModeloDisponibilidadVisita>(
|
||||
"dbo.PA_Vis_CitaObtenerDisponibilidad", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@FechaDesde", fechaDesde, DbType.DateTime2);
|
||||
StoredProcedureCommand.AddInput(comando, "@DuracionMinutos", duracionMinutos, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveSupervisor", supervisor, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCitaExcluir", citaExcluir, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@MaxOpciones", 24, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloVisita>> ListarSupervisiones(int? cliente, int? etapa, int usuario, string dominio)
|
||||
{
|
||||
return QueryList<ModeloVisita>(
|
||||
"dbo.PA_Vis_VisitaListar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveCliente", cliente, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoEtapa", etapa, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloLoteSupervision>> ListarLotesVisita(int visita, int usuario, string dominio)
|
||||
{
|
||||
return QueryList<ModeloLoteSupervision>(
|
||||
"dbo.PA_Vis_VisitaLotesListar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveVisita", visita, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloLoteSupervision>> ListarHistorialLote(int lote, int usuario, string dominio)
|
||||
{
|
||||
return QueryList<ModeloLoteSupervision>(
|
||||
"dbo.PA_Vis_LoteHistorialListar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoLote", lote, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> GuardarLoteVisita(ModeloLoteSupervision lote, int usuario, string dominio)
|
||||
{
|
||||
return QueryScalarId(
|
||||
"dbo.PA_Vis_VisitaLoteGuardar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveVisita", lote.CveVisita, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoLote", lote.CveFraccionamientoLote, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@Aprobado", lote.Aprobado, DbType.Boolean);
|
||||
StoredProcedureCommand.AddInput(comando, "@Observaciones", lote.Observaciones, DbType.String);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloVinculoGisSupervision>> ListarVinculosGis(int etapa, int usuario, string dominio)
|
||||
{
|
||||
return QueryList<ModeloVinculoGisSupervision>(
|
||||
"dbo.PA_Vis_LotesGISListar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoEtapa", etapa, DbType.Int32);
|
||||
});
|
||||
}
|
||||
|
||||
public DbResult<int> GuardarVinculoGis(ModeloVinculoGisSupervision vinculo, int usuario, string dominio)
|
||||
{
|
||||
return QueryScalarId(
|
||||
"dbo.PA_Vis_LoteGISGuardar", usuario, dominio,
|
||||
comando =>
|
||||
{
|
||||
StoredProcedureCommand.AddInput(comando, "@CveFraccionamientoLote", vinculo.CveFraccionamientoLote, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@CveTipoGIS", vinculo.CveTipoGIS, DbType.Int32);
|
||||
StoredProcedureCommand.AddInput(comando, "@GISPoligonoClave", vinculo.GISPoligonoClave, DbType.String);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -89,6 +89,14 @@ namespace SIG.Web.AppCode.Security
|
||||
return;
|
||||
}
|
||||
|
||||
if (CurrentUser.DebeCambiarContrasena &&
|
||||
!IsAuthenticatedUtilityPage(currentPath))
|
||||
{
|
||||
Response.Redirect("~/Pages/Security/Perfil.aspx", true);
|
||||
Context.ApplicationInstance.CompleteRequest();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!IsHomePage(currentPath) &&
|
||||
!IsAuthenticatedUtilityPage(currentPath) &&
|
||||
!AppServices.PermissionService.CanAccessPage(CurrentUser.CveUsuario, currentPath))
|
||||
|
||||
@@ -22,6 +22,163 @@ namespace SIG.Web.AppCode.Services.Bitacora
|
||||
_contextoProvider = contextoProvider;
|
||||
}
|
||||
|
||||
public DbResult<long> RegistrarOperacion(ModeloOperacionBitacora operacion)
|
||||
{
|
||||
if (operacion == null || string.IsNullOrWhiteSpace(operacion.CodigoAccion) ||
|
||||
operacion.CodigoAccion.Length > 150 ||
|
||||
string.IsNullOrWhiteSpace(operacion.DescripcionMovimiento) ||
|
||||
operacion.DescripcionMovimiento.Length > 1000 ||
|
||||
operacion.Registros == null ||
|
||||
(operacion.FechaAutorizacion.HasValue && !operacion.CveUsuarioAutoriza.HasValue))
|
||||
{
|
||||
return Fail<long>("Los datos de la operación de bitácora están incompletos.");
|
||||
}
|
||||
|
||||
var registros = new List<ModeloRegistroBitacora>();
|
||||
foreach (ModeloRegistroBitacora registro in operacion.Registros)
|
||||
{
|
||||
if (registro == null ||
|
||||
(!registro.LlaveRegistro.HasValue && string.IsNullOrWhiteSpace(registro.LlaveRegistroTexto)) ||
|
||||
(registro.LlaveRegistro.HasValue && registro.LlaveRegistroTexto != null) ||
|
||||
(registro.LlaveRegistroTexto != null && registro.LlaveRegistroTexto.Length > 250))
|
||||
{
|
||||
return Fail<long>("La clave del registro de bitácora no es válida.");
|
||||
}
|
||||
|
||||
string validacion = Validar(new BitacoraEventoModel
|
||||
{
|
||||
NombreTablaSQL = registro.NombreTablaSQL,
|
||||
LlaveRegistro = registro.LlaveRegistroTexto ??
|
||||
Convert.ToString(registro.LlaveRegistro, System.Globalization.CultureInfo.InvariantCulture),
|
||||
TipoMovimiento = registro.TipoMovimiento,
|
||||
DescripcionMovimiento = operacion.DescripcionMovimiento,
|
||||
Campos = registro.Campos,
|
||||
Relaciones = registro.Relaciones
|
||||
}, registro.RegistrarSinCampos);
|
||||
|
||||
if (validacion != null)
|
||||
{
|
||||
return Fail<long>(validacion);
|
||||
}
|
||||
|
||||
// Omitir ediciones sin cambios, salvo un efecto declarado explícitamente sin campos.
|
||||
if (!registro.RegistrarSinCampos && registro.TipoMovimiento == BitacoraTipoMovimiento.Editado &&
|
||||
registro.DiscriminarCamposSinCambios &&
|
||||
!registro.Campos.Any(campo =>
|
||||
!object.Equals(campo.ValorAnterior, campo.ValorNuevo) ||
|
||||
!string.Equals(campo.ValorAnteriorMostrar, campo.ValorNuevoMostrar,
|
||||
StringComparison.Ordinal)))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
registros.Add(registro);
|
||||
}
|
||||
|
||||
if (registros.Count == 0)
|
||||
{
|
||||
return DbResult<long>.Ok(0);
|
||||
}
|
||||
|
||||
BitacoraContextoModel contexto = _contextoProvider.Obtener();
|
||||
if (contexto == null || contexto.CveUsuarioEjecuta <= 0)
|
||||
{
|
||||
return Fail<long>("No existe un usuario autenticado para registrar la bitácora.");
|
||||
}
|
||||
|
||||
var normalizada = new ModeloOperacionBitacora
|
||||
{
|
||||
CodigoAccion = operacion.CodigoAccion,
|
||||
DescripcionMovimiento = operacion.DescripcionMovimiento,
|
||||
CveUsuarioAutoriza = operacion.CveUsuarioAutoriza,
|
||||
FechaAutorizacion = operacion.FechaAutorizacion,
|
||||
Registros = registros
|
||||
};
|
||||
using (var transaccion = new TransactionLogic(
|
||||
Transaction.Current == null
|
||||
? IsolationLevel.ReadCommitted
|
||||
: Transaction.Current.IsolationLevel))
|
||||
{
|
||||
DbResult<long> resultado = _repository.RegistrarOperacion(normalizada, contexto);
|
||||
if (resultado.Success)
|
||||
{
|
||||
transaccion.Commit();
|
||||
}
|
||||
return resultado;
|
||||
}
|
||||
}
|
||||
|
||||
public DbResult<ResultadoPaginado<ModeloEventoBitacora>> ConsultarEventos(
|
||||
BitacoraConsultaModel consulta)
|
||||
{
|
||||
string mensajeValidacion = ValidarConsulta(consulta);
|
||||
|
||||
if (mensajeValidacion != null)
|
||||
{
|
||||
return Fail<ResultadoPaginado<ModeloEventoBitacora>>(
|
||||
mensajeValidacion);
|
||||
}
|
||||
|
||||
BitacoraContextoModel contexto = _contextoProvider.Obtener();
|
||||
|
||||
if (contexto.CveUsuarioEjecuta <= 0)
|
||||
{
|
||||
return Fail<ResultadoPaginado<ModeloEventoBitacora>>(
|
||||
"No existe un usuario autenticado para consultar la bitácora.");
|
||||
}
|
||||
|
||||
BitacoraConsultaModel consultaNormalizada =
|
||||
NormalizarConsulta(consulta);
|
||||
|
||||
using (var transaccionConsulta = new TransactionLogic(
|
||||
TransactionScopeOption.Suppress))
|
||||
{
|
||||
DbResult<ResultadoPaginado<ModeloEventoBitacora>> resultado =
|
||||
_repository.ConsultarEventos(
|
||||
consultaNormalizada,
|
||||
contexto.CveUsuarioEjecuta);
|
||||
|
||||
if (resultado.Success)
|
||||
{
|
||||
transaccionConsulta.Commit();
|
||||
}
|
||||
|
||||
return resultado;
|
||||
}
|
||||
}
|
||||
|
||||
public DbResult<List<BitacoraCampoModel>> ObtenerEvento(long cveBitacoraEvento)
|
||||
{
|
||||
if (cveBitacoraEvento <= 0)
|
||||
{
|
||||
return Fail<List<BitacoraCampoModel>>(
|
||||
"La clave del movimiento de bitácora no es válida.");
|
||||
}
|
||||
|
||||
BitacoraContextoModel contexto = _contextoProvider.Obtener();
|
||||
|
||||
if (contexto.CveUsuarioEjecuta <= 0)
|
||||
{
|
||||
return Fail<List<BitacoraCampoModel>>(
|
||||
"No existe un usuario autenticado para consultar la bitácora.");
|
||||
}
|
||||
|
||||
using (var transaccionConsulta = new TransactionLogic(
|
||||
TransactionScopeOption.Suppress))
|
||||
{
|
||||
DbResult<List<BitacoraCampoModel>> resultado =
|
||||
_repository.ObtenerEvento(
|
||||
cveBitacoraEvento,
|
||||
contexto.CveUsuarioEjecuta);
|
||||
|
||||
if (resultado.Success)
|
||||
{
|
||||
transaccionConsulta.Commit();
|
||||
}
|
||||
|
||||
return resultado;
|
||||
}
|
||||
}
|
||||
|
||||
public DbResult<long> Registrar(BitacoraEventoModel evento)
|
||||
{
|
||||
string validationMessage = Validar(evento);
|
||||
@@ -39,7 +196,18 @@ namespace SIG.Web.AppCode.Services.Bitacora
|
||||
"No existe un usuario autenticado para registrar la bitácora.");
|
||||
}
|
||||
|
||||
return _repository.Agregar(evento, contexto);
|
||||
using (var transaccion = new TransactionLogic(
|
||||
Transaction.Current == null
|
||||
? IsolationLevel.ReadCommitted
|
||||
: Transaction.Current.IsolationLevel))
|
||||
{
|
||||
DbResult<long> resultado = _repository.Agregar(evento, contexto);
|
||||
if (resultado.Success)
|
||||
{
|
||||
transaccion.Commit();
|
||||
}
|
||||
return resultado;
|
||||
}
|
||||
}
|
||||
|
||||
public DbResult<List<BitacoraModel>> Listar(
|
||||
@@ -291,7 +459,7 @@ namespace SIG.Web.AppCode.Services.Bitacora
|
||||
: null;
|
||||
}
|
||||
|
||||
private static string Validar(BitacoraEventoModel evento)
|
||||
private static string Validar(BitacoraEventoModel evento, bool permitirSinCampos = false)
|
||||
{
|
||||
if (evento == null)
|
||||
{
|
||||
@@ -382,7 +550,7 @@ namespace SIG.Web.AppCode.Services.Bitacora
|
||||
|
||||
if ((evento.TipoMovimiento == BitacoraTipoMovimiento.Agregado ||
|
||||
evento.TipoMovimiento == BitacoraTipoMovimiento.Editado) &&
|
||||
fields.Count == 0)
|
||||
fields.Count == 0 && !permitirSinCampos)
|
||||
{
|
||||
return "Las altas y modificaciones deben incluir los campos auditados.";
|
||||
}
|
||||
|
||||
165
SIG.Web/App_Code/Services/Busqueda/ProveedorBuscadorCatalogo.cs
Normal file
165
SIG.Web/App_Code/Services/Busqueda/ProveedorBuscadorCatalogo.cs
Normal file
@@ -0,0 +1,165 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using SIG.Web.AppCode.Contracts.Busqueda;
|
||||
using SIG.Web.AppCode.Models.Busqueda;
|
||||
|
||||
namespace SIG.Web.AppCode.Services.Busqueda
|
||||
{
|
||||
// Adaptador de la fuente tabular del control heredado. El origen se carga
|
||||
// mediante servicios de dominio; nunca ejecuta SQL ni guarda tablas en ViewState.
|
||||
public sealed class ProveedorBuscadorCatalogo : IProveedorBuscadorCatalogo
|
||||
{
|
||||
private readonly Func<DataTable> _cargar;
|
||||
private readonly IList<ColumnaBuscador> _columnas;
|
||||
private readonly string _clave;
|
||||
private readonly string _descripcion;
|
||||
private DataTable _datos;
|
||||
private static readonly CompareInfo Comparador = CultureInfo.GetCultureInfo("es-MX").CompareInfo;
|
||||
|
||||
public ProveedorBuscadorCatalogo(Func<DataTable> cargar, IList<ColumnaBuscador> columnas,
|
||||
string clave, string descripcion)
|
||||
{
|
||||
_cargar = cargar;
|
||||
_columnas = columnas;
|
||||
_clave = clave;
|
||||
_descripcion = descripcion;
|
||||
}
|
||||
|
||||
private DataTable Datos
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_datos == null)
|
||||
{
|
||||
_datos = _cargar();
|
||||
if (_datos == null || !_datos.Columns.Contains(_clave) || !_datos.Columns.Contains(_descripcion))
|
||||
{
|
||||
throw new InvalidOperationException("La fuente del buscador no contiene las columnas configuradas.");
|
||||
}
|
||||
}
|
||||
return _datos;
|
||||
}
|
||||
}
|
||||
|
||||
public ResultadoBuscador Buscar(SolicitudBuscador solicitud)
|
||||
{
|
||||
var campos = _columnas.Where(columna => columna.Buscar &&
|
||||
(string.IsNullOrEmpty(solicitud.Columna) || solicitud.Columna == "__ALL__" ||
|
||||
columna.Campo == solicitud.Columna)).Select(columna => columna.Campo).ToList();
|
||||
if (campos.Count == 0)
|
||||
{
|
||||
throw new ArgumentException("Seleccione un campo de búsqueda válido.");
|
||||
}
|
||||
|
||||
var filas = Filtrar(solicitud.Filtros).Where(fila =>
|
||||
campos.Any(campo => Comparador.IndexOf(Convert.ToString(fila[campo]), solicitud.Texto ?? "",
|
||||
CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace) >= 0));
|
||||
IOrderedEnumerable<DataRow> ordenadas = null;
|
||||
if ((solicitud.Ordenes == null || solicitud.Ordenes.Count == 0) &&
|
||||
!string.IsNullOrWhiteSpace(solicitud.Texto))
|
||||
{
|
||||
ordenadas = filas.OrderByDescending(fila => campos.Any(campo =>
|
||||
Comparador.Compare(Convert.ToString(fila[campo]), solicitud.Texto.Trim(),
|
||||
CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace) == 0));
|
||||
}
|
||||
foreach (var orden in solicitud.Ordenes ?? new List<OrdenBuscador>())
|
||||
{
|
||||
if (!_columnas.Any(columna => columna.Campo == orden.Columna))
|
||||
{
|
||||
throw new ArgumentException("Columna de ordenamiento no válida.");
|
||||
}
|
||||
Func<DataRow, object> valor = fila => fila[orden.Columna] == DBNull.Value ? null : fila[orden.Columna];
|
||||
ordenadas = ordenadas == null
|
||||
? (orden.Descendente ? filas.OrderByDescending(valor) : filas.OrderBy(valor))
|
||||
: (orden.Descendente ? ordenadas.ThenByDescending(valor) : ordenadas.ThenBy(valor));
|
||||
}
|
||||
var lista = (ordenadas == null ? filas.OrderBy(fila => Convert.ToString(fila[_clave]))
|
||||
: ordenadas.ThenBy(fila => Convert.ToString(fila[_clave]))).ToList();
|
||||
int cantidad = Math.Max(1, Math.Min(200, solicitud.TamanoPagina));
|
||||
int ultima = Math.Max(1, (int)Math.Ceiling(lista.Count / (double)cantidad));
|
||||
int pagina = Math.Max(1, Math.Min(ultima, solicitud.Pagina));
|
||||
return new ResultadoBuscador
|
||||
{
|
||||
Pagina = pagina,
|
||||
TotalRegistros = lista.Count,
|
||||
TieneMas = pagina < ultima,
|
||||
Items = lista.Skip((pagina - 1) * cantidad).Take(cantidad).Select(Convertir).ToList()
|
||||
};
|
||||
}
|
||||
|
||||
public Dictionary<string, object> ObtenerPorClave(string clave, IEnumerable<FiltroBuscador> filtros)
|
||||
{
|
||||
var fila = Filtrar(filtros).FirstOrDefault(registro => Convert.ToString(registro[_clave]) == clave);
|
||||
return fila == null ? null : Convertir(fila);
|
||||
}
|
||||
|
||||
public List<OpcionFiltroBuscador> ObtenerOpciones(string campo, IEnumerable<FiltroBuscador> filtros)
|
||||
{
|
||||
if (!Datos.Columns.Contains(campo))
|
||||
{
|
||||
throw new ArgumentException("Campo de filtro no válido.");
|
||||
}
|
||||
return Filtrar(filtros).Select(fila => Convert.ToString(fila[campo]))
|
||||
.Distinct().OrderBy(valor => valor)
|
||||
.Select(valor => new OpcionFiltroBuscador { Valor = valor, Texto = valor }).ToList();
|
||||
}
|
||||
|
||||
private IEnumerable<DataRow> Filtrar(IEnumerable<FiltroBuscador> filtros)
|
||||
{
|
||||
IEnumerable<DataRow> filas = Datos.Rows.Cast<DataRow>().Where(fila => fila.RowState != DataRowState.Deleted);
|
||||
foreach (var filtro in filtros ?? new List<FiltroBuscador>())
|
||||
{
|
||||
if (!Datos.Columns.Contains(filtro.Campo))
|
||||
{
|
||||
throw new ArgumentException("Campo de filtro no válido.");
|
||||
}
|
||||
var actual = filtro;
|
||||
filas = filas.Where(fila => Cumple(fila[actual.Campo], actual, Datos.Columns[actual.Campo].DataType));
|
||||
}
|
||||
return filas;
|
||||
}
|
||||
|
||||
private static bool Cumple(object dato, FiltroBuscador filtro, Type tipo)
|
||||
{
|
||||
if (dato == DBNull.Value)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
int comparacion;
|
||||
if (tipo == typeof(string))
|
||||
{
|
||||
comparacion = Comparador.Compare(Convert.ToString(dato), filtro.Valor,
|
||||
CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace);
|
||||
}
|
||||
else
|
||||
{
|
||||
object valor = Convert.ChangeType(filtro.Valor, tipo, CultureInfo.InvariantCulture);
|
||||
comparacion = ((IComparable)dato).CompareTo(valor);
|
||||
}
|
||||
switch (filtro.Operador)
|
||||
{
|
||||
case OperadorFiltroBuscador.Igual: return comparacion == 0;
|
||||
case OperadorFiltroBuscador.MayorQue: return comparacion > 0;
|
||||
case OperadorFiltroBuscador.MenorQue: return comparacion < 0;
|
||||
case OperadorFiltroBuscador.MayorOIgualQue: return comparacion >= 0;
|
||||
case OperadorFiltroBuscador.MenorOIgualQue: return comparacion <= 0;
|
||||
default: throw new ArgumentException("Operador no válido.");
|
||||
}
|
||||
}
|
||||
|
||||
private Dictionary<string, object> Convertir(DataRow fila)
|
||||
{
|
||||
var registro = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
|
||||
foreach (string campo in _columnas.Select(columna => columna.Campo).Concat(new[] { _clave, _descripcion }).Distinct())
|
||||
{
|
||||
registro[campo] = fila[campo] == DBNull.Value ? null : fila[campo];
|
||||
}
|
||||
registro["__SelectedValue"] = Convert.ToString(fila[_clave]);
|
||||
registro["__DisplayText"] = Convert.ToString(fila[_descripcion]);
|
||||
return registro;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
using SIG.Web.AppCode.Models.Bitacora;
|
||||
using SIG.Web.AppCode.Models.Clientes;
|
||||
|
||||
namespace SIG.Web.AppCode.Services.Clientes
|
||||
{
|
||||
internal static class FabricaBitacoraDesarrolladores
|
||||
{
|
||||
public static ModeloRegistroBitacora Crear(ModeloDesarrollador anterior, ModeloDesarrollador actual)
|
||||
{
|
||||
var evento = new ModeloRegistroBitacora
|
||||
{
|
||||
NombreTablaSQL = "Clientes",
|
||||
LlaveRegistro = actual.CveCliente,
|
||||
TipoMovimiento = anterior == null ? BitacoraTipoMovimiento.Agregado : BitacoraTipoMovimiento.Editado,
|
||||
DiscriminarCamposSinCambios = anterior != null,
|
||||
DescripcionRegistro = (anterior == null ? "Alta del desarrollador " : "Edición del desarrollador ") +
|
||||
actual.Nombre + "."
|
||||
};
|
||||
evento.Relaciones.Add(new BitacoraRelacionEventoModel
|
||||
{
|
||||
TipoRelacion = BitacoraTipoRelacion.Directa,
|
||||
NombreTablaSQL = "Clientes",
|
||||
NombreCampoSQL = "CveCliente",
|
||||
Valor = actual.CveCliente,
|
||||
VisibleDesarrollador = true
|
||||
});
|
||||
evento.Campos.Add(Campo("RFC", anterior == null ? null : (object)anterior.RFC, actual.RFC));
|
||||
evento.Campos.Add(Campo("Nombre", anterior == null ? null : (object)anterior.Nombre, actual.Nombre));
|
||||
evento.Campos.Add(Campo("Direccion", anterior == null ? null : (object)anterior.Direccion, actual.Direccion));
|
||||
evento.Campos.Add(Campo("NoExt", anterior == null ? null : (object)anterior.NoExt, actual.NoExt));
|
||||
evento.Campos.Add(Campo("Duplicador", anterior == null ? null : (object)anterior.Duplicador, actual.Duplicador));
|
||||
evento.Campos.Add(Campo("Referencia", anterior == null ? null : (object)anterior.Referencia, actual.Referencia));
|
||||
evento.Campos.Add(Campo("Telefono", anterior == null ? null : (object)anterior.Telefono, actual.Telefono));
|
||||
evento.Campos.Add(Campo("Mail", anterior == null ? null : (object)anterior.Mail, actual.Mail));
|
||||
evento.Campos.Add(Campo("Adherente", anterior == null ? null : (object)anterior.Adherente, actual.Adherente));
|
||||
evento.Campos.Add(Campo("Colonia", anterior == null ? null : (object)anterior.Colonia, actual.Colonia));
|
||||
evento.Campos.Add(Campo("CP", anterior == null ? null : (object)anterior.CP, actual.CP));
|
||||
evento.Campos.Add(Campo("Ciudad", anterior == null ? null : (object)anterior.Ciudad, actual.Ciudad));
|
||||
evento.Campos.Add(Campo("Estado", anterior == null ? null : (object)anterior.Estado, actual.Estado));
|
||||
evento.Campos.Add(Campo("Pais", anterior == null ? null : (object)anterior.Pais, actual.Pais));
|
||||
evento.Campos.Add(Campo("CvePais", anterior == null ? null : (object)anterior.CvePais, actual.CvePais));
|
||||
evento.Campos.Add(Campo("CveSATEstado", anterior == null ? null : (object)anterior.CveSATEstado, actual.CveSATEstado));
|
||||
evento.Campos.Add(Campo("CveMunicipio", anterior == null ? null : (object)anterior.CveMunicipio, actual.CveMunicipio));
|
||||
evento.Campos.Add(Campo("CveLocalidad", anterior == null ? null : (object)anterior.CveLocalidad, actual.CveLocalidad));
|
||||
evento.Campos.Add(Campo("CveColonia", anterior == null ? null : (object)anterior.CveColonia, actual.CveColonia));
|
||||
evento.Campos.Add(Campo("AsociadoCanadevi", anterior == null ? null : (object)anterior.AsociadoCanadevi, actual.AsociadoCanadevi));
|
||||
evento.Campos.Add(Campo("Estatus", anterior == null ? null : (object)anterior.Estatus, actual.Estatus));
|
||||
return evento;
|
||||
}
|
||||
|
||||
private static BitacoraCampoEventoModel Campo(string nombre, object anterior, object actual)
|
||||
{
|
||||
return new BitacoraCampoEventoModel
|
||||
{
|
||||
NombreCampoSQL = nombre,
|
||||
ValorAnterior = anterior,
|
||||
ValorNuevo = actual
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
399
SIG.Web/App_Code/Services/Clientes/ServicioDesarrolladores.cs
Normal file
399
SIG.Web/App_Code/Services/Clientes/ServicioDesarrolladores.cs
Normal file
@@ -0,0 +1,399 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Mail;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text.RegularExpressions;
|
||||
using SIG.Web.AppCode.Contracts.Bitacora;
|
||||
using SIG.Web.AppCode.Contracts.Clientes;
|
||||
using SIG.Web.AppCode.Contracts.General;
|
||||
using SIG.Web.AppCode.Contracts.Security;
|
||||
using SIG.Web.AppCode.Infrastructure.Transactions;
|
||||
using SIG.Web.AppCode.Models.Bitacora;
|
||||
using SIG.Web.AppCode.Models.Clientes;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
using SIG.Web.AppCode.Models.General;
|
||||
using SIG.Web.AppCode.Models.Security;
|
||||
using SIG.Web.AppCode.Session;
|
||||
|
||||
namespace SIG.Web.AppCode.Services.Clientes
|
||||
{
|
||||
public sealed class ServicioDesarrolladores : IServicioDesarrolladores
|
||||
{
|
||||
private readonly IRepositorioDesarrolladores _repositorio;
|
||||
private readonly IGeneralCatalogRepository _catalogos;
|
||||
private readonly IUserAdministrationRepository _usuarios;
|
||||
private readonly IUserContextProvider _contexto;
|
||||
private readonly IPasswordHasher _contrasenas;
|
||||
private readonly IBitacoraService _bitacora;
|
||||
|
||||
public ServicioDesarrolladores(
|
||||
IRepositorioDesarrolladores repositorio,
|
||||
IGeneralCatalogRepository catalogos,
|
||||
IUserAdministrationRepository usuarios,
|
||||
IUserContextProvider contexto,
|
||||
IPasswordHasher contrasenas,
|
||||
IBitacoraService bitacora)
|
||||
{
|
||||
_repositorio = repositorio;
|
||||
_catalogos = catalogos;
|
||||
_usuarios = usuarios;
|
||||
_contexto = contexto;
|
||||
_contrasenas = contrasenas;
|
||||
_bitacora = bitacora;
|
||||
}
|
||||
|
||||
public bool PuedeCambiarAsociadoCanadevi
|
||||
{
|
||||
get
|
||||
{
|
||||
UserSessionModel usuario = _contexto.GetCurrentUser();
|
||||
return usuario != null && !usuario.EsDesarrollador;
|
||||
}
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloDesarrollador>> Listar(string texto, bool incluirInactivos)
|
||||
{
|
||||
UserSessionModel usuario = _contexto.GetCurrentUser();
|
||||
if (usuario == null)
|
||||
{
|
||||
return Error<List<ModeloDesarrollador>>("La sesión ha terminado.");
|
||||
}
|
||||
|
||||
DbResult<List<ModeloDesarrollador>> consulta = _repositorio.Listar(
|
||||
(texto ?? string.Empty).Trim(), incluirInactivos,
|
||||
usuario.CveUsuario, usuario.NombreDominio);
|
||||
if (!consulta.Success || !usuario.EsDesarrollador)
|
||||
{
|
||||
return consulta;
|
||||
}
|
||||
|
||||
DbResult<List<UserClientModel>> clientes = _usuarios.ListUserClients(
|
||||
usuario.CveUsuario, usuario.CveUsuario, usuario.NombreDominio);
|
||||
if (!clientes.Success)
|
||||
{
|
||||
return Error<List<ModeloDesarrollador>>(clientes.UserMessage);
|
||||
}
|
||||
|
||||
var claves = new HashSet<int>(clientes.Data
|
||||
.Where(cliente => cliente.Activo && cliente.ClienteActivo)
|
||||
.Select(cliente => cliente.CveCliente));
|
||||
return DbResult<List<ModeloDesarrollador>>.Ok(
|
||||
consulta.Data.Where(desarrollador => claves.Contains(desarrollador.CveCliente)).ToList());
|
||||
}
|
||||
|
||||
public DbResult<ModeloDesarrollador> Obtener(int cveCliente)
|
||||
{
|
||||
UserSessionModel usuario = _contexto.GetCurrentUser();
|
||||
string error = ValidarAcceso(cveCliente, usuario);
|
||||
if (error != null)
|
||||
{
|
||||
return Error<ModeloDesarrollador>(error);
|
||||
}
|
||||
|
||||
DbResult<ModeloDesarrollador> consulta = _repositorio.Obtener(
|
||||
cveCliente, usuario.CveUsuario, usuario.NombreDominio);
|
||||
return consulta.Success && consulta.Data == null
|
||||
? Error<ModeloDesarrollador>("El desarrollador ya no existe.")
|
||||
: consulta;
|
||||
}
|
||||
|
||||
public DbResult<PostalCodeLookupModel> ConsultarCodigoPostal(string codigoPostal)
|
||||
{
|
||||
UserSessionModel usuario = _contexto.GetCurrentUser();
|
||||
if (usuario == null)
|
||||
{
|
||||
return Error<PostalCodeLookupModel>("La sesión ha terminado.");
|
||||
}
|
||||
|
||||
if (!Regex.IsMatch((codigoPostal ?? string.Empty).Trim(), @"^\d{5}$"))
|
||||
{
|
||||
return Error<PostalCodeLookupModel>("Capture un código postal de cinco dígitos.");
|
||||
}
|
||||
|
||||
return _catalogos.GetPostalCode(codigoPostal.Trim(), usuario.NombreDominio);
|
||||
}
|
||||
|
||||
public DbResult<ResultadoAltaDesarrollador> Agregar(SolicitudAltaDesarrollador solicitud)
|
||||
{
|
||||
UserSessionModel usuario = _contexto.GetCurrentUser();
|
||||
if (usuario == null || solicitud == null)
|
||||
{
|
||||
return Error<ResultadoAltaDesarrollador>("No se recibieron los datos o la sesión ha terminado.");
|
||||
}
|
||||
|
||||
string error = PrepararDatos(solicitud.Desarrollador);
|
||||
if (error != null)
|
||||
{
|
||||
return Error<ResultadoAltaDesarrollador>(error);
|
||||
}
|
||||
|
||||
if (solicitud.Desarrollador.AsociadoCanadevi && !PuedeCambiarAsociadoCanadevi)
|
||||
{
|
||||
return Error<ResultadoAltaDesarrollador>(
|
||||
"Sólo los usuarios de Agua de Hermosillo pueden cambiar Asociado CANADEVI.");
|
||||
}
|
||||
|
||||
solicitud.NombreUsuario = (solicitud.NombreUsuario ?? string.Empty).Trim();
|
||||
solicitud.CorreoUsuario = (solicitud.CorreoUsuario ?? string.Empty).Trim();
|
||||
if (solicitud.GenerarUsuario &&
|
||||
(solicitud.NombreUsuario.Length == 0 || solicitud.NombreUsuario.Length > 100 ||
|
||||
!CorreoValido(solicitud.CorreoUsuario)))
|
||||
{
|
||||
return Error<ResultadoAltaDesarrollador>("Capture un usuario y un correo válidos para el acceso.");
|
||||
}
|
||||
|
||||
if (!solicitud.GenerarUsuario)
|
||||
{
|
||||
solicitud.NombreUsuario = null;
|
||||
solicitud.CorreoUsuario = null;
|
||||
}
|
||||
|
||||
string contrasena = solicitud.GenerarUsuario ? GenerarContrasenaTemporal() : null;
|
||||
using (var transaccion = new TransactionLogic(System.Transactions.IsolationLevel.Serializable))
|
||||
{
|
||||
DbResult<ResultadoAltaDesarrollador> alta = _repositorio.Agregar(
|
||||
solicitud,
|
||||
solicitud.GenerarUsuario ? _contrasenas.HashPassword(contrasena) : null,
|
||||
usuario.CveUsuario, usuario.NombreDominio);
|
||||
if (!alta.Success || alta.Data == null || alta.Data.CveCliente <= 0)
|
||||
{
|
||||
return Error<ResultadoAltaDesarrollador>(
|
||||
alta.Success ? "No fue posible recuperar el desarrollador guardado." : alta.UserMessage);
|
||||
}
|
||||
|
||||
DbResult<ModeloDesarrollador> actual = _repositorio.Obtener(
|
||||
alta.Data.CveCliente, usuario.CveUsuario, usuario.NombreDominio);
|
||||
if (!actual.Success || actual.Data == null)
|
||||
{
|
||||
return Error<ResultadoAltaDesarrollador>(
|
||||
actual.Success ? "No fue posible consultar el desarrollador." : actual.UserMessage);
|
||||
}
|
||||
|
||||
var eventos = new List<ModeloRegistroBitacora>
|
||||
{
|
||||
FabricaBitacoraDesarrolladores.Crear(null, actual.Data)
|
||||
};
|
||||
if (solicitud.GenerarUsuario)
|
||||
{
|
||||
DbResult<UserAdministrationModel> usuarioCreado = _usuarios.GetUser(
|
||||
alta.Data.CveUsuario, usuario.CveUsuario, usuario.NombreDominio);
|
||||
if (!usuarioCreado.Success || usuarioCreado.Data == null)
|
||||
{
|
||||
return Error<ResultadoAltaDesarrollador>(
|
||||
usuarioCreado.Success ? "No fue posible consultar el usuario creado." : usuarioCreado.UserMessage);
|
||||
}
|
||||
|
||||
eventos.Add(SIG.Web.AppCode.Services.Security.UserAdministrationBitacoraFactory.CreateUser(
|
||||
null, usuarioCreado.Data, alta.Data.CveUsuario, BitacoraTipoMovimiento.Agregado));
|
||||
eventos.Add(SIG.Web.AppCode.Services.Security.UserAdministrationBitacoraFactory.CreateUserClient(
|
||||
null, alta.Data.CveUsuario, alta.Data.CveCliente, 1, true));
|
||||
}
|
||||
|
||||
DbResult<long> auditoria = _bitacora.RegistrarOperacion(
|
||||
ModeloOperacionBitacora.Crear("AgregarDesarrollador", eventos));
|
||||
if (!auditoria.Success)
|
||||
{
|
||||
return Error<ResultadoAltaDesarrollador>(auditoria.UserMessage);
|
||||
}
|
||||
|
||||
transaccion.Commit();
|
||||
// Sólo viaja a la respuesta del alta; no se conserva en sesión, ViewState ni bitácora.
|
||||
alta.Data.ContrasenaTemporal = contrasena;
|
||||
return alta;
|
||||
}
|
||||
}
|
||||
|
||||
public DbResult<bool> Actualizar(ModeloDesarrollador desarrollador)
|
||||
{
|
||||
if (desarrollador == null)
|
||||
{
|
||||
return Error<bool>("No se recibieron los datos del desarrollador.");
|
||||
}
|
||||
|
||||
DbResult<ModeloDesarrollador> consulta = Obtener(desarrollador.CveCliente);
|
||||
if (!consulta.Success)
|
||||
{
|
||||
return Error<bool>(consulta.UserMessage);
|
||||
}
|
||||
|
||||
if (!PuedeCambiarAsociadoCanadevi &&
|
||||
desarrollador.AsociadoCanadevi != consulta.Data.AsociadoCanadevi)
|
||||
{
|
||||
return Error<bool>("Sólo los usuarios de Agua de Hermosillo pueden cambiar Asociado CANADEVI.");
|
||||
}
|
||||
|
||||
string error = PrepararDatos(desarrollador);
|
||||
if (error != null)
|
||||
{
|
||||
return Error<bool>(error);
|
||||
}
|
||||
|
||||
UserSessionModel usuario = _contexto.GetCurrentUser();
|
||||
using (var transaccion = new TransactionLogic())
|
||||
{
|
||||
DbResult<ModeloDesarrollador> anterior = _repositorio.Obtener(
|
||||
desarrollador.CveCliente, usuario.CveUsuario, usuario.NombreDominio);
|
||||
if (!anterior.Success || anterior.Data == null)
|
||||
{
|
||||
return Error<bool>(anterior.Success ? "El desarrollador ya no existe." : anterior.UserMessage);
|
||||
}
|
||||
|
||||
DbResult<bool> guardado = _repositorio.Actualizar(
|
||||
desarrollador, usuario.CveUsuario, usuario.NombreDominio);
|
||||
if (!guardado.Success)
|
||||
{
|
||||
return guardado;
|
||||
}
|
||||
|
||||
DbResult<ModeloDesarrollador> actual = _repositorio.Obtener(
|
||||
desarrollador.CveCliente, usuario.CveUsuario, usuario.NombreDominio);
|
||||
if (!actual.Success || actual.Data == null)
|
||||
{
|
||||
return Error<bool>(actual.Success ? "No fue posible consultar el desarrollador." : actual.UserMessage);
|
||||
}
|
||||
|
||||
DbResult<long> auditoria = _bitacora.RegistrarOperacion(
|
||||
ModeloOperacionBitacora.Crear(
|
||||
"ActualizarDesarrollador",
|
||||
FabricaBitacoraDesarrolladores.Crear(anterior.Data, actual.Data)));
|
||||
if (!auditoria.Success)
|
||||
{
|
||||
return Error<bool>(auditoria.UserMessage);
|
||||
}
|
||||
|
||||
transaccion.Commit();
|
||||
return guardado;
|
||||
}
|
||||
}
|
||||
|
||||
private string ValidarAcceso(int cveCliente, UserSessionModel usuario)
|
||||
{
|
||||
if (usuario == null || cveCliente <= 0)
|
||||
{
|
||||
return "Seleccione un desarrollador válido con una sesión activa.";
|
||||
}
|
||||
|
||||
if (!usuario.EsDesarrollador)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
DbResult<List<UserClientModel>> clientes = _usuarios.ListUserClients(
|
||||
usuario.CveUsuario, usuario.CveUsuario, usuario.NombreDominio);
|
||||
if (!clientes.Success)
|
||||
{
|
||||
return clientes.UserMessage;
|
||||
}
|
||||
|
||||
return clientes.Data.Any(cliente => cliente.CveCliente == cveCliente &&
|
||||
cliente.Activo && cliente.ClienteActivo)
|
||||
? null : "El desarrollador no está asignado a su usuario.";
|
||||
}
|
||||
|
||||
private string PrepararDatos(ModeloDesarrollador desarrollador)
|
||||
{
|
||||
if (desarrollador == null)
|
||||
{
|
||||
return "Capture los datos del desarrollador.";
|
||||
}
|
||||
|
||||
desarrollador.RFC = (desarrollador.RFC ?? string.Empty).Trim();
|
||||
desarrollador.Nombre = (desarrollador.Nombre ?? string.Empty).Trim();
|
||||
desarrollador.Direccion = (desarrollador.Direccion ?? string.Empty).Trim();
|
||||
desarrollador.NoExt = (desarrollador.NoExt ?? string.Empty).Trim();
|
||||
desarrollador.Duplicador = (desarrollador.Duplicador ?? string.Empty).Trim();
|
||||
desarrollador.Referencia = (desarrollador.Referencia ?? string.Empty).Trim();
|
||||
desarrollador.Telefono = (desarrollador.Telefono ?? string.Empty).Trim();
|
||||
desarrollador.Mail = (desarrollador.Mail ?? string.Empty).Trim();
|
||||
desarrollador.Adherente = (desarrollador.Adherente ?? string.Empty).Trim();
|
||||
desarrollador.RFC = desarrollador.RFC.ToUpperInvariant();
|
||||
if (desarrollador.Nombre.Length == 0 || desarrollador.Direccion.Length == 0 ||
|
||||
!Regex.IsMatch(desarrollador.RFC, @"^[A-ZÑ&]{3,4}\d{6}[A-Z0-9]{3}$"))
|
||||
{
|
||||
return "Capture nombre, calle y un RFC válido.";
|
||||
}
|
||||
|
||||
if (desarrollador.RFC.Length > 15 ||
|
||||
desarrollador.Nombre.Length > 200 ||
|
||||
desarrollador.Direccion.Length > 90 ||
|
||||
desarrollador.NoExt.Length > 20 ||
|
||||
desarrollador.Duplicador.Length > 50 ||
|
||||
desarrollador.Referencia.Length > 200 ||
|
||||
desarrollador.Telefono.Length > 25 ||
|
||||
desarrollador.Mail.Length > 255 ||
|
||||
desarrollador.Adherente.Length > 200)
|
||||
{
|
||||
return "Uno de los campos excede la longitud permitida.";
|
||||
}
|
||||
|
||||
if (desarrollador.Mail.Length > 0 && !CorreoValido(desarrollador.Mail))
|
||||
{
|
||||
return "Capture un correo válido para el desarrollador.";
|
||||
}
|
||||
|
||||
DbResult<PostalCodeLookupModel> postal = ConsultarCodigoPostal(desarrollador.CP);
|
||||
if (!postal.Success || postal.Data == null)
|
||||
{
|
||||
return postal.Success ? "No se encontró el código postal." : postal.UserMessage;
|
||||
}
|
||||
|
||||
NeighborhoodOptionModel colonia = postal.Data.Colonias.FirstOrDefault(
|
||||
opcion => opcion.CveColonia == desarrollador.CveColonia);
|
||||
if (colonia == null)
|
||||
{
|
||||
return "Seleccione una colonia del código postal capturado.";
|
||||
}
|
||||
|
||||
desarrollador.CP = desarrollador.CP.Trim();
|
||||
desarrollador.Colonia = colonia.NombreAsentamiento;
|
||||
desarrollador.Ciudad = postal.Data.Ciudad;
|
||||
desarrollador.Estado = postal.Data.Estado;
|
||||
desarrollador.Pais = postal.Data.Pais;
|
||||
desarrollador.CvePais = postal.Data.CvePais;
|
||||
desarrollador.CveSATEstado = postal.Data.CveEstado;
|
||||
desarrollador.CveMunicipio = postal.Data.CveMunicipio;
|
||||
desarrollador.CveLocalidad = postal.Data.CveLocalidad;
|
||||
return null;
|
||||
}
|
||||
|
||||
private static bool CorreoValido(string correo)
|
||||
{
|
||||
try
|
||||
{
|
||||
return !string.IsNullOrWhiteSpace(correo) && correo.Length <= 255 &&
|
||||
new MailAddress(correo).Address == correo;
|
||||
}
|
||||
catch (FormatException)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private static string GenerarContrasenaTemporal()
|
||||
{
|
||||
const string caracteres = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@$%";
|
||||
var resultado = new char[20];
|
||||
var muestra = new byte[1];
|
||||
using (RandomNumberGenerator generador = RandomNumberGenerator.Create())
|
||||
{
|
||||
for (int posicion = 0; posicion < resultado.Length; posicion++)
|
||||
{
|
||||
do
|
||||
{
|
||||
generador.GetBytes(muestra);
|
||||
}
|
||||
while (muestra[0] >= 256 - (256 % caracteres.Length));
|
||||
resultado[posicion] = caracteres[muestra[0] % caracteres.Length];
|
||||
}
|
||||
}
|
||||
|
||||
return new string(resultado);
|
||||
}
|
||||
|
||||
private static DbResult<T> Error<T>(string mensaje)
|
||||
{
|
||||
return DbResult<T>.Fail(mensaje, string.Empty, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Web.Hosting;
|
||||
using SIG.Web.AppCode.Infrastructure;
|
||||
using SIG.Web.AppCode.Models.Tramites;
|
||||
|
||||
namespace SIG.Web.AppCode.Services.Documentos
|
||||
{
|
||||
internal sealed class AlmacenComprobantesPago
|
||||
{
|
||||
public void Guardar(ModeloComprobantePago comprobante, Stream contenido)
|
||||
{
|
||||
const int limite = 5 * 1024 * 1024;
|
||||
string extension = Path.GetExtension(comprobante.NombreArchivo ?? string.Empty).ToLowerInvariant();
|
||||
string tipo = extension == ".pdf" ? "application/pdf" :
|
||||
extension == ".png" ? "image/png" :
|
||||
extension == ".jpg" || extension == ".jpeg" ? "image/jpeg" : null;
|
||||
if (tipo == null || contenido == null || !contenido.CanRead ||
|
||||
comprobante.TamanoBytes <= 0 || comprobante.TamanoBytes > limite ||
|
||||
!string.Equals(tipo, comprobante.TipoContenido, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
throw new ControlledApplicationException("Seleccione un comprobante PDF, JPG o PNG de hasta 5 MB.");
|
||||
}
|
||||
byte[] archivo;
|
||||
using (var memoria = new MemoryStream())
|
||||
{
|
||||
var bloque = new byte[81920];
|
||||
int leidos;
|
||||
while ((leidos = contenido.Read(bloque, 0, bloque.Length)) > 0)
|
||||
{
|
||||
if (memoria.Length + leidos > limite)
|
||||
{
|
||||
throw new ControlledApplicationException("El comprobante excede 5 MB.");
|
||||
}
|
||||
memoria.Write(bloque, 0, leidos);
|
||||
}
|
||||
archivo = memoria.ToArray();
|
||||
}
|
||||
if (archivo.Length != comprobante.TamanoBytes || archivo.Length < 12 ||
|
||||
!SIG.Web.AppCode.Services.Visitas.AlmacenDocumentosVisita.FirmaValida(extension, archivo, 12))
|
||||
{
|
||||
throw new ControlledApplicationException("El contenido del comprobante no corresponde al formato indicado.");
|
||||
}
|
||||
comprobante.NombreArchivo = Path.GetFileName(comprobante.NombreArchivo);
|
||||
if (comprobante.NombreArchivo.Length > 255)
|
||||
{
|
||||
throw new ControlledApplicationException("El nombre del comprobante es demasiado largo.");
|
||||
}
|
||||
comprobante.NombreFisico = Guid.NewGuid().ToString("N") + extension;
|
||||
comprobante.TipoContenido = tipo;
|
||||
string raiz = HostingEnvironment.MapPath("~/Documentos/");
|
||||
Directory.CreateDirectory(raiz);
|
||||
Directory.CreateDirectory(Path.Combine(raiz, "Generales"));
|
||||
Directory.CreateDirectory(Path.Combine(raiz, "Clientes"));
|
||||
string ruta = Resolver(comprobante);
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(ruta));
|
||||
try
|
||||
{
|
||||
using (var destino = new FileStream(ruta, FileMode.CreateNew, FileAccess.Write, FileShare.None))
|
||||
{
|
||||
destino.Write(archivo, 0, archivo.Length);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
Eliminar(comprobante);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public string Resolver(ModeloComprobantePago comprobante)
|
||||
{
|
||||
Guid identificador;
|
||||
if (comprobante.CveCliente <= 0 || string.IsNullOrEmpty(comprobante.NombreFisico) ||
|
||||
Path.GetFileName(comprobante.NombreFisico) != comprobante.NombreFisico ||
|
||||
!Guid.TryParseExact(Path.GetFileNameWithoutExtension(comprobante.NombreFisico), "N", out identificador))
|
||||
{
|
||||
throw new ControlledApplicationException("El comprobante no está disponible.");
|
||||
}
|
||||
return Path.Combine(HostingEnvironment.MapPath("~/Documentos/Clientes/"),
|
||||
comprobante.CveCliente.ToString(System.Globalization.CultureInfo.InvariantCulture),
|
||||
"ComprobantesPago", comprobante.NombreFisico);
|
||||
}
|
||||
|
||||
public void Eliminar(ModeloComprobantePago comprobante)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(comprobante.NombreFisico))
|
||||
{
|
||||
string ruta = Resolver(comprobante);
|
||||
if (File.Exists(ruta))
|
||||
{
|
||||
File.Delete(ruta);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Models.Bitacora;
|
||||
using SIG.Web.AppCode.Models.Documentos;
|
||||
@@ -7,7 +7,48 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
{
|
||||
internal static class TramiteDocumentoBitacoraFactory
|
||||
{
|
||||
public static BitacoraEventoModel Upload(
|
||||
public static ModeloRegistroBitacora ConfiguracionSolicitud(
|
||||
SolicitudDocumentoConfiguracionModel anterior,
|
||||
SolicitudDocumentoConfiguracionModel actual)
|
||||
{
|
||||
var datos = actual ?? anterior;
|
||||
var movimiento = actual == null
|
||||
? BitacoraTipoMovimiento.Eliminado
|
||||
: (anterior.EsParticular ? BitacoraTipoMovimiento.Editado : BitacoraTipoMovimiento.Agregado);
|
||||
var evento = BaseEvent(
|
||||
0, datos.CveSolicitud, datos.CveCliente, datos.CveFraccionamiento,
|
||||
datos.CveFraccionamientoEtapa, movimiento,
|
||||
actual == null
|
||||
? "Se retiró la configuración particular del documento; vuelve a aplicar la configuración general."
|
||||
: "Se configuró el documento para esta solicitud.");
|
||||
evento.NombreTablaSQL = "Tra_SolicitudDocumentoConfiguracion";
|
||||
evento.LlaveRegistro = null;
|
||||
evento.LlaveRegistroTexto = datos.CveFraccionamientoEtapa.ToString(System.Globalization.CultureInfo.InvariantCulture) + "|" +
|
||||
datos.CveSolicitud.ToString(System.Globalization.CultureInfo.InvariantCulture) +
|
||||
"|" + datos.CveTipoDocumento.ToString(System.Globalization.CultureInfo.InvariantCulture);
|
||||
evento.Relaciones.RemoveAt(0);
|
||||
evento.Relaciones.Add(Relation(
|
||||
BitacoraTipoRelacion.Directa, evento.NombreTablaSQL, "CveFraccionamientoEtapa",
|
||||
datos.CveFraccionamientoEtapa, "Etapa de la configuración."));
|
||||
evento.Relaciones.Add(Relation(
|
||||
BitacoraTipoRelacion.Directa, evento.NombreTablaSQL, "CveTipoDocumento",
|
||||
datos.CveTipoDocumento, "Tipo de documento de la configuración."));
|
||||
evento.Campos = new List<BitacoraCampoEventoModel>
|
||||
{
|
||||
Field("CveFraccionamientoEtapa", anterior.CveFraccionamientoEtapa, actual == null ? null : (object)actual.CveFraccionamientoEtapa),
|
||||
Field("CveSolicitud", anterior.CveSolicitud, actual == null ? null : (object)actual.CveSolicitud),
|
||||
Field("CveTipoDocumento", anterior.CveTipoDocumento, actual == null ? null : (object)actual.CveTipoDocumento),
|
||||
Field("EsRequerido", anterior.EsRequerido, actual == null ? null : (object)actual.EsRequerido),
|
||||
Field("EsCliente", anterior.EsCliente, actual == null ? null : (object)actual.EsCliente),
|
||||
Field("TieneVigencia", anterior.TieneVigencia, actual == null ? null : (object)actual.TieneVigencia),
|
||||
Field("Orden", anterior.Orden, actual == null ? null : (object)actual.Orden),
|
||||
Field("EsActivo", anterior.EsActivo, actual == null ? null : (object)actual.EsActivo)
|
||||
};
|
||||
evento.DiscriminarCamposSinCambios = false;
|
||||
return evento;
|
||||
}
|
||||
|
||||
public static ModeloRegistroBitacora Upload(
|
||||
TramiteDocumentoSaveResultModel change)
|
||||
{
|
||||
BitacoraTipoMovimiento movement = change.EsNuevo
|
||||
@@ -26,7 +67,8 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
auditEvent.DiscriminarCamposSinCambios = false;
|
||||
auditEvent.Campos = new List<BitacoraCampoEventoModel>
|
||||
{
|
||||
Field("CveSolicitud", change.EsNuevo ? null : (object)change.CveSolicitud, change.CveSolicitud),
|
||||
Field("CveSolicitud", change.EsNuevo || change.CveSolicitud == 0 ? null : (object)change.CveSolicitud,
|
||||
change.CveSolicitud == 0 ? null : (object)change.CveSolicitud),
|
||||
Field("CveTipoDocumento", change.EsNuevo ? null : (object)change.CveTipoDocumento, change.CveTipoDocumento),
|
||||
Field("NombreArchivo", change.NombreArchivoAnterior, change.NombreArchivo),
|
||||
Field("NombreArchivoFisico", change.NombreArchivoFisicoAnterior, change.NombreArchivoFisico),
|
||||
@@ -37,13 +79,15 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
Field("ComentarioAdministrativo", change.ComentarioAdministrativoAnterior, change.ComentarioAdministrativo),
|
||||
Field("EsAprobado", change.EsAprobadoAnterior, change.EsAprobado),
|
||||
Field("CveUsuarioRevisa", change.CveUsuarioRevisaAnterior, change.CveUsuarioRevisa),
|
||||
Field("FechaRevision", change.FechaRevisionAnterior, change.FechaRevision)
|
||||
Field("FechaRevision", change.FechaRevisionAnterior, change.FechaRevision),
|
||||
Field("FechaDocumento", change.FechaDocumentoAnterior, change.FechaDocumento),
|
||||
Field("FechaVencimiento", change.FechaVencimientoAnterior, change.FechaVencimiento)
|
||||
};
|
||||
|
||||
return auditEvent;
|
||||
}
|
||||
|
||||
public static BitacoraEventoModel Review(
|
||||
public static ModeloRegistroBitacora Review(
|
||||
TramiteDocumentoReviewResultModel change)
|
||||
{
|
||||
string action = change.EsAprobado == true
|
||||
@@ -58,8 +102,7 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
change.CveFraccionamientoEtapa,
|
||||
BitacoraTipoMovimiento.Editado,
|
||||
"Se " + action + " el documento " +
|
||||
change.TipoDocumento + " del trámite " +
|
||||
change.TipoTramite + " de la etapa " +
|
||||
change.TipoDocumento + " de la etapa " +
|
||||
change.Etapa + ".");
|
||||
|
||||
auditEvent.Campos = new List<BitacoraCampoEventoModel>
|
||||
@@ -70,16 +113,10 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
Field("FechaRevision", change.FechaRevisionAnterior, change.FechaRevision)
|
||||
};
|
||||
|
||||
if (change.EsAprobado == true && change.FechaRevision.HasValue)
|
||||
{
|
||||
auditEvent.CveUsuarioAutoriza = change.CveUsuarioRevisa;
|
||||
auditEvent.FechaAutorizacion = change.FechaRevision;
|
||||
}
|
||||
|
||||
return auditEvent;
|
||||
}
|
||||
|
||||
public static BitacoraEventoModel Delete(
|
||||
public static ModeloRegistroBitacora Delete(
|
||||
TramiteDocumentoDeleteResultModel change)
|
||||
{
|
||||
return BaseEvent(
|
||||
@@ -90,8 +127,7 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
change.CveFraccionamientoEtapa,
|
||||
BitacoraTipoMovimiento.Eliminado,
|
||||
"Se eliminó el registro del documento " +
|
||||
change.TipoDocumento + " del trámite " +
|
||||
change.TipoTramite + " de la etapa " +
|
||||
change.TipoDocumento + " de la etapa " +
|
||||
change.Etapa + ".");
|
||||
}
|
||||
|
||||
@@ -101,7 +137,6 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
if (change.EsNuevo)
|
||||
{
|
||||
return "Se agregó el documento " + change.TipoDocumento +
|
||||
" al trámite " + change.TipoTramite +
|
||||
" de la etapa " + change.Etapa + ".";
|
||||
}
|
||||
|
||||
@@ -112,14 +147,13 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
change.ComentarioAdministrativoAnterior);
|
||||
|
||||
return "Se actualizó el documento " + change.TipoDocumento +
|
||||
" del trámite " + change.TipoTramite +
|
||||
" de la etapa " + change.Etapa +
|
||||
(teniaRevision
|
||||
? ". La revisión anterior se eliminó y el documento quedó pendiente nuevamente."
|
||||
? ". La versión anterior se conservó como histórico y la nueva quedó pendiente de revisión."
|
||||
: ". El documento quedó pendiente de revisión.");
|
||||
}
|
||||
|
||||
private static BitacoraEventoModel BaseEvent(
|
||||
private static ModeloRegistroBitacora BaseEvent(
|
||||
int documentRequestId,
|
||||
int requestId,
|
||||
int clientId,
|
||||
@@ -128,12 +162,12 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
BitacoraTipoMovimiento movement,
|
||||
string description)
|
||||
{
|
||||
var auditEvent = new BitacoraEventoModel
|
||||
var auditEvent = new ModeloRegistroBitacora
|
||||
{
|
||||
NombreTablaSQL = "Tra_DocumentosSolicitud",
|
||||
TipoMovimiento = movement,
|
||||
LlaveRegistro = Convert.ToString(documentRequestId),
|
||||
DescripcionMovimiento = description,
|
||||
LlaveRegistro = documentRequestId,
|
||||
DescripcionRegistro = description,
|
||||
DiscriminarCamposSinCambios = true
|
||||
};
|
||||
|
||||
@@ -144,13 +178,16 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
"CveDocumentoSolicitud",
|
||||
documentRequestId,
|
||||
"Documento de la solicitud."));
|
||||
auditEvent.Relaciones.Add(
|
||||
Relation(
|
||||
BitacoraTipoRelacion.Relacionada,
|
||||
"Tra_Solicitudes",
|
||||
"CveSolicitud",
|
||||
requestId,
|
||||
"Solicitud del documento."));
|
||||
if (requestId > 0)
|
||||
{
|
||||
auditEvent.Relaciones.Add(
|
||||
Relation(
|
||||
BitacoraTipoRelacion.Relacionada,
|
||||
"Tra_Solicitudes",
|
||||
"CveSolicitud",
|
||||
requestId,
|
||||
"Solicitud del documento."));
|
||||
}
|
||||
auditEvent.Relaciones.Add(
|
||||
Relation(
|
||||
BitacoraTipoRelacion.Relacionada,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Web.Hosting;
|
||||
@@ -29,17 +29,18 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
string relativeDirectory = Path.Combine(
|
||||
"Clientes",
|
||||
context.CveCliente.ToString(CultureInfo.InvariantCulture),
|
||||
"Solicitudes",
|
||||
context.CveSolicitud.ToString(CultureInfo.InvariantCulture));
|
||||
"Etapas",
|
||||
context.CveFraccionamientoEtapa.ToString(CultureInfo.InvariantCulture));
|
||||
string directory = Path.Combine(root, relativeDirectory);
|
||||
|
||||
Directory.CreateDirectory(directory);
|
||||
|
||||
string physicalFileName = string.Format(
|
||||
CultureInfo.InvariantCulture,
|
||||
"doc-{0}-{1}.bin",
|
||||
context.CveSolicitud,
|
||||
context.CveTipoDocumento);
|
||||
"doc-{0}-{1}-{2}.bin",
|
||||
context.CveFraccionamientoEtapa,
|
||||
context.CveTipoDocumento,
|
||||
Guid.NewGuid().ToString("N"));
|
||||
string relativePath = Path.Combine(
|
||||
relativeDirectory,
|
||||
physicalFileName);
|
||||
@@ -172,12 +173,7 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
File.Delete(preparedFile.TemporaryPath);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(preparedFile.PreviousPath) &&
|
||||
!PathsEqual(preparedFile.PreviousPath, preparedFile.FinalPath) &&
|
||||
File.Exists(preparedFile.PreviousPath))
|
||||
{
|
||||
File.Delete(preparedFile.PreviousPath);
|
||||
}
|
||||
// La versión anterior conserva su archivo para el histórico.
|
||||
}
|
||||
|
||||
public Stream OpenRead(string relativePath)
|
||||
@@ -202,6 +198,8 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
}
|
||||
|
||||
Directory.CreateDirectory(root);
|
||||
Directory.CreateDirectory(Path.Combine(root, "Generales"));
|
||||
Directory.CreateDirectory(Path.Combine(root, "Clientes"));
|
||||
return Path.GetFullPath(root);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Transactions;
|
||||
using SIG.Web.AppCode.Contracts.Bitacora;
|
||||
using SIG.Web.AppCode.Contracts.Documentos;
|
||||
using SIG.Web.AppCode.Contracts.Tramites;
|
||||
using SIG.Web.AppCode.Contracts.Security;
|
||||
using SIG.Web.AppCode.Session;
|
||||
using SIG.Web.AppCode.Infrastructure.Transactions;
|
||||
using SIG.Web.AppCode.Models.Bitacora;
|
||||
using SIG.Web.AppCode.Models.Common;
|
||||
@@ -18,13 +22,17 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
private const int GisDocumentTypeId = 2;
|
||||
|
||||
private readonly ITramiteDocumentoRepository _repository;
|
||||
private readonly ITramiteSolicitudRepository _repositorioSolicitud;
|
||||
private readonly ITramiteDocumentoFileStore _fileStore;
|
||||
private readonly IBitacoraService _bitacoraService;
|
||||
private readonly IUserContextProvider _contextoUsuario;
|
||||
|
||||
public TramiteDocumentoService(
|
||||
ITramiteDocumentoRepository repository,
|
||||
ITramiteDocumentoFileStore fileStore,
|
||||
IBitacoraService bitacoraService)
|
||||
IBitacoraService bitacoraService,
|
||||
IUserContextProvider contextoUsuario,
|
||||
ITramiteSolicitudRepository repositorioSolicitud)
|
||||
{
|
||||
if (repository == null)
|
||||
{
|
||||
@@ -41,11 +49,173 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
throw new ArgumentNullException("bitacoraService");
|
||||
}
|
||||
|
||||
_repositorioSolicitud = repositorioSolicitud ?? throw new ArgumentNullException("repositorioSolicitud");
|
||||
_contextoUsuario = contextoUsuario;
|
||||
_repository = repository;
|
||||
_fileStore = fileStore;
|
||||
_bitacoraService = bitacoraService;
|
||||
}
|
||||
|
||||
public DbResult<List<SolicitudDocumentoConfiguracionModel>> ListarConfiguracionSolicitud(
|
||||
int cveFraccionamiento,
|
||||
int cveSolicitud,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio,
|
||||
int? cveFraccionamientoEtapa = null)
|
||||
{
|
||||
UserSessionModel usuario = _contextoUsuario.GetCurrentUser();
|
||||
if (usuario == null || usuario.CveUsuario != cveUsuarioEjecuta)
|
||||
{
|
||||
return Fail<List<SolicitudDocumentoConfiguracionModel>>("La sesión del usuario no es válida.");
|
||||
}
|
||||
|
||||
// Los requisitos manuales corresponden a los usuarios de Agua de Hermosillo.
|
||||
if (usuario.EsDesarrollador)
|
||||
{
|
||||
return Fail<List<SolicitudDocumentoConfiguracionModel>>(
|
||||
"La configuración de requisitos corresponde a Agua de Hermosillo.");
|
||||
}
|
||||
|
||||
if (cveFraccionamiento <= 0 || (cveSolicitud <= 0 && !cveFraccionamientoEtapa.HasValue))
|
||||
{
|
||||
return Fail<List<SolicitudDocumentoConfiguracionModel>>("Seleccione una etapa o una solicitud válida.");
|
||||
}
|
||||
|
||||
var acceso = _repository.ListForDevelopment(
|
||||
cveFraccionamiento, null, null, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!acceso.Success)
|
||||
{
|
||||
return CopyFailure<List<TramiteDocumentoSolicitudModel>, List<SolicitudDocumentoConfiguracionModel>>(
|
||||
acceso, "No fue posible consultar el fraccionamiento.");
|
||||
}
|
||||
|
||||
return _repository.ListarConfiguracionSolicitud(
|
||||
cveFraccionamiento, cveSolicitud, cveUsuarioEjecuta, nombreDominio, cveFraccionamientoEtapa);
|
||||
}
|
||||
|
||||
public DbResult<bool> GuardarConfiguracionSolicitud(
|
||||
SolicitudDocumentoConfiguracionModel configuracion,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio)
|
||||
{
|
||||
if (configuracion == null || configuracion.CveTipoDocumento <= 0)
|
||||
{
|
||||
return Fail<bool>("Seleccione un documento válido.");
|
||||
}
|
||||
|
||||
using (var transaccion = new TransactionLogic(IsolationLevel.Serializable))
|
||||
{
|
||||
var consulta = ListarConfiguracionSolicitud(
|
||||
configuracion.CveFraccionamiento,
|
||||
configuracion.CveSolicitud,
|
||||
cveUsuarioEjecuta,
|
||||
nombreDominio,
|
||||
configuracion.CveFraccionamientoEtapa == 0 ? (int?)null : configuracion.CveFraccionamientoEtapa);
|
||||
if (!consulta.Success)
|
||||
{
|
||||
return CopyFailure<List<SolicitudDocumentoConfiguracionModel>, bool>(
|
||||
consulta, "No fue posible consultar los requisitos.");
|
||||
}
|
||||
|
||||
var anterior = consulta.Data.FirstOrDefault(
|
||||
documento => documento.CveTipoDocumento == configuracion.CveTipoDocumento);
|
||||
if (anterior == null)
|
||||
{
|
||||
return Fail<bool>("El tipo de documento ya no está disponible.");
|
||||
}
|
||||
|
||||
var resultado = _repository.GuardarConfiguracionSolicitud(
|
||||
configuracion, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!resultado.Success)
|
||||
{
|
||||
return resultado;
|
||||
}
|
||||
|
||||
// Los datos de relación para la bitácora provienen de la consulta.
|
||||
configuracion.CveCliente = anterior.CveCliente;
|
||||
configuracion.CveFraccionamientoEtapa = anterior.CveFraccionamientoEtapa;
|
||||
configuracion.EsParticular = true;
|
||||
configuracion.EsConfigurado = true;
|
||||
var bitacora = _bitacoraService.RegistrarOperacion(
|
||||
ModeloOperacionBitacora.Crear(
|
||||
"GuardarConfiguracionSolicitud",
|
||||
TramiteDocumentoBitacoraFactory.ConfiguracionSolicitud(anterior, configuracion)));
|
||||
if (!bitacora.Success)
|
||||
{
|
||||
return CopyFailure<long, bool>(bitacora, "No fue posible registrar el cambio.");
|
||||
}
|
||||
|
||||
DbResult<bool> resultadoProceso = ActualizarVencimientoEtapa(
|
||||
configuracion.CveFraccionamientoEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!resultadoProceso.Success)
|
||||
{
|
||||
return DbResult<bool>.Fail(
|
||||
resultadoProceso.UserMessage,
|
||||
resultadoProceso.TechnicalMessage,
|
||||
resultadoProceso.Exception);
|
||||
}
|
||||
|
||||
transaccion.Commit();
|
||||
return resultado;
|
||||
}
|
||||
}
|
||||
|
||||
public DbResult<bool> EliminarConfiguracionSolicitud(
|
||||
int cveFraccionamiento,
|
||||
int cveSolicitud,
|
||||
int cveTipoDocumento,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio,
|
||||
int? cveFraccionamientoEtapa = null)
|
||||
{
|
||||
using (var transaccion = new TransactionLogic(IsolationLevel.Serializable))
|
||||
{
|
||||
var consulta = ListarConfiguracionSolicitud(
|
||||
cveFraccionamiento, cveSolicitud, cveUsuarioEjecuta, nombreDominio, cveFraccionamientoEtapa);
|
||||
if (!consulta.Success)
|
||||
{
|
||||
return CopyFailure<List<SolicitudDocumentoConfiguracionModel>, bool>(
|
||||
consulta, "No fue posible consultar los requisitos.");
|
||||
}
|
||||
|
||||
var anterior = consulta.Data.FirstOrDefault(
|
||||
documento => documento.CveTipoDocumento == cveTipoDocumento);
|
||||
if (anterior == null || !anterior.EsParticular)
|
||||
{
|
||||
return Fail<bool>("El documento no tiene una configuración particular.");
|
||||
}
|
||||
|
||||
var resultado = _repository.EliminarConfiguracionSolicitud(
|
||||
cveFraccionamiento, cveSolicitud, cveTipoDocumento, cveUsuarioEjecuta, nombreDominio, cveFraccionamientoEtapa);
|
||||
if (!resultado.Success)
|
||||
{
|
||||
return resultado;
|
||||
}
|
||||
|
||||
var bitacora = _bitacoraService.RegistrarOperacion(
|
||||
ModeloOperacionBitacora.Crear(
|
||||
"EliminarConfiguracionSolicitud",
|
||||
TramiteDocumentoBitacoraFactory.ConfiguracionSolicitud(anterior, null)));
|
||||
if (!bitacora.Success)
|
||||
{
|
||||
return CopyFailure<long, bool>(bitacora, "No fue posible registrar el cambio.");
|
||||
}
|
||||
|
||||
DbResult<bool> resultadoProceso = ActualizarVencimientoEtapa(
|
||||
anterior.CveFraccionamientoEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!resultadoProceso.Success)
|
||||
{
|
||||
return DbResult<bool>.Fail(
|
||||
resultadoProceso.UserMessage,
|
||||
resultadoProceso.TechnicalMessage,
|
||||
resultadoProceso.Exception);
|
||||
}
|
||||
|
||||
transaccion.Commit();
|
||||
return resultado;
|
||||
}
|
||||
}
|
||||
|
||||
public DbResult<List<TramiteDocumentoSolicitudModel>> ListForDevelopment(
|
||||
int developmentId,
|
||||
int? stageId,
|
||||
@@ -59,12 +229,92 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
"Seleccione un fraccionamiento válido.");
|
||||
}
|
||||
|
||||
return _repository.ListForDevelopment(
|
||||
developmentId,
|
||||
NormalizeId(stageId),
|
||||
NormalizeId(procedureTypeId),
|
||||
executingUser,
|
||||
domainName);
|
||||
return FiltrarDocumentos(
|
||||
_repository.ListForDevelopment(
|
||||
developmentId,
|
||||
NormalizeId(stageId),
|
||||
NormalizeId(procedureTypeId),
|
||||
executingUser,
|
||||
domainName),
|
||||
executingUser);
|
||||
}
|
||||
|
||||
public DbResult<List<TramiteDocumentoSolicitudModel>> ListarRequisitos(
|
||||
int cveFraccionamiento,
|
||||
int? cveEtapa,
|
||||
int? cveTipoTramite,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio)
|
||||
{
|
||||
if (cveFraccionamiento <= 0)
|
||||
{
|
||||
return Fail<List<TramiteDocumentoSolicitudModel>>(
|
||||
"Seleccione un fraccionamiento válido.");
|
||||
}
|
||||
|
||||
return FiltrarDocumentos(
|
||||
_repository.ListarRequisitos(
|
||||
cveFraccionamiento,
|
||||
NormalizeId(cveEtapa),
|
||||
NormalizeId(cveTipoTramite),
|
||||
cveUsuarioEjecuta,
|
||||
nombreDominio),
|
||||
cveUsuarioEjecuta);
|
||||
}
|
||||
|
||||
private DbResult<List<TramiteDocumentoSolicitudModel>> FiltrarDocumentos(
|
||||
DbResult<List<TramiteDocumentoSolicitudModel>> resultado,
|
||||
int cveUsuarioEjecuta)
|
||||
{
|
||||
UserSessionModel usuario = _contextoUsuario.GetCurrentUser();
|
||||
if (usuario == null || usuario.CveUsuario != cveUsuarioEjecuta)
|
||||
{
|
||||
return Fail<List<TramiteDocumentoSolicitudModel>>(
|
||||
"La sesión del usuario no es válida.");
|
||||
}
|
||||
|
||||
if (!resultado.Success)
|
||||
{
|
||||
return resultado;
|
||||
}
|
||||
|
||||
List<TramiteDocumentoSolicitudModel> documentos =
|
||||
(resultado.Data ?? new List<TramiteDocumentoSolicitudModel>())
|
||||
.Where(documento => !usuario.EsDesarrollador || documento.EsCliente)
|
||||
.ToList();
|
||||
bool esAdministrador = !usuario.EsDesarrollador;
|
||||
|
||||
foreach (TramiteDocumentoSolicitudModel documento in documentos)
|
||||
{
|
||||
documento.PuedeActualizarArchivo =
|
||||
!documento.EsGis && (esAdministrador || !documento.EsFinalSolicitud);
|
||||
documento.PuedeRevisar = esAdministrador && documento.TieneArchivo;
|
||||
}
|
||||
|
||||
return DbResult<List<TramiteDocumentoSolicitudModel>>.Ok(documentos);
|
||||
}
|
||||
|
||||
private string ValidarCarga(
|
||||
TramiteDocumentoUploadContextModel documento,
|
||||
int cveUsuarioEjecuta)
|
||||
{
|
||||
UserSessionModel usuario = _contextoUsuario.GetCurrentUser();
|
||||
if (usuario == null || usuario.CveUsuario != cveUsuarioEjecuta)
|
||||
{
|
||||
return "La sesión del usuario no es válida.";
|
||||
}
|
||||
|
||||
if (usuario.EsDesarrollador && !documento.EsCliente)
|
||||
{
|
||||
return "El documento corresponde al administrador.";
|
||||
}
|
||||
|
||||
if (documento.EsFinalSolicitud && usuario.EsDesarrollador)
|
||||
{
|
||||
return "La solicitud ya está finalizada; no es posible modificar sus documentos.";
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public DbResult<TramiteDocumentoUploadContextModel> GetUploadContext(
|
||||
@@ -72,9 +322,10 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
int requestId,
|
||||
int documentTypeId,
|
||||
int executingUser,
|
||||
string domainName)
|
||||
string domainName,
|
||||
int? cveFraccionamientoEtapa = null)
|
||||
{
|
||||
if (developmentId <= 0 || requestId <= 0 || documentTypeId <= 0)
|
||||
if (developmentId <= 0 || (requestId <= 0 && !cveFraccionamientoEtapa.HasValue) || documentTypeId <= 0)
|
||||
{
|
||||
return Fail<TramiteDocumentoUploadContextModel>(
|
||||
"Seleccione un documento válido.");
|
||||
@@ -86,12 +337,23 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
"El archivo GIS se administra desde la opción Administrar GIS de la etapa.");
|
||||
}
|
||||
|
||||
return _repository.GetUploadContext(
|
||||
developmentId,
|
||||
requestId,
|
||||
documentTypeId,
|
||||
executingUser,
|
||||
domainName);
|
||||
DbResult<TramiteDocumentoUploadContextModel> resultado =
|
||||
_repository.GetUploadContext(
|
||||
developmentId,
|
||||
requestId,
|
||||
documentTypeId,
|
||||
executingUser,
|
||||
domainName,
|
||||
cveFraccionamientoEtapa);
|
||||
if (!resultado.Success || resultado.Data == null)
|
||||
{
|
||||
return resultado;
|
||||
}
|
||||
|
||||
string mensaje = ValidarCarga(resultado.Data, executingUser);
|
||||
return mensaje == null
|
||||
? resultado
|
||||
: Fail<TramiteDocumentoUploadContextModel>(mensaje);
|
||||
}
|
||||
|
||||
public DbResult<TramiteDocumentoSaveResultModel> Upload(
|
||||
@@ -104,7 +366,10 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
long contentLength,
|
||||
string clientComment,
|
||||
int executingUser,
|
||||
string domainName)
|
||||
string domainName,
|
||||
DateTime? fechaDocumento = null,
|
||||
DateTime? fechaVencimiento = null,
|
||||
int? cveFraccionamientoEtapa = null)
|
||||
{
|
||||
if (content == null || contentLength <= 0)
|
||||
{
|
||||
@@ -118,7 +383,8 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
requestId,
|
||||
documentTypeId,
|
||||
executingUser,
|
||||
domainName);
|
||||
domainName,
|
||||
cveFraccionamientoEtapa);
|
||||
|
||||
if (!contextResult.Success || contextResult.Data == null)
|
||||
{
|
||||
@@ -140,6 +406,16 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
return Fail<TramiteDocumentoSaveResultModel>(validation);
|
||||
}
|
||||
|
||||
if (uploadContext.TieneVigencia && !fechaVencimiento.HasValue)
|
||||
{
|
||||
return Fail<TramiteDocumentoSaveResultModel>("Capture la fecha de vencimiento del documento.");
|
||||
}
|
||||
if (fechaDocumento.HasValue && fechaVencimiento.HasValue &&
|
||||
fechaVencimiento.Value.Date < fechaDocumento.Value.Date)
|
||||
{
|
||||
return Fail<TramiteDocumentoSaveResultModel>("El vencimiento no puede ser anterior a la fecha del documento.");
|
||||
}
|
||||
|
||||
TramiteDocumentoPreparedFile preparedFile = null;
|
||||
|
||||
try
|
||||
@@ -151,8 +427,17 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
|
||||
DbResult<TramiteDocumentoSaveResultModel> saveResult;
|
||||
|
||||
using (var transaction = new TransactionLogic())
|
||||
using (var transaction = new TransactionLogic(IsolationLevel.Serializable))
|
||||
{
|
||||
DbResult<TramiteDocumentoUploadContextModel> contextoActual =
|
||||
GetUploadContext(
|
||||
developmentId, requestId, documentTypeId, executingUser, domainName, cveFraccionamientoEtapa);
|
||||
if (!contextoActual.Success || contextoActual.Data == null)
|
||||
{
|
||||
_fileStore.Rollback(preparedFile);
|
||||
return Fail<TramiteDocumentoSaveResultModel>(contextoActual.UserMessage);
|
||||
}
|
||||
|
||||
saveResult = _repository.SaveUpload(
|
||||
developmentId,
|
||||
requestId,
|
||||
@@ -164,7 +449,11 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
contentLength,
|
||||
TrimOrNull(clientComment),
|
||||
executingUser,
|
||||
domainName);
|
||||
domainName,
|
||||
fechaDocumento,
|
||||
fechaVencimiento,
|
||||
true,
|
||||
uploadContext.CveFraccionamientoEtapa);
|
||||
|
||||
if (!saveResult.Success || saveResult.Data == null)
|
||||
{
|
||||
@@ -173,9 +462,11 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
}
|
||||
|
||||
DbResult<long> auditResult =
|
||||
_bitacoraService.Registrar(
|
||||
TramiteDocumentoBitacoraFactory.Upload(
|
||||
saveResult.Data));
|
||||
_bitacoraService.RegistrarOperacion(
|
||||
ModeloOperacionBitacora.Crear(
|
||||
"CargarDocumentoSolicitud",
|
||||
TramiteDocumentoBitacoraFactory.Upload(
|
||||
saveResult.Data)));
|
||||
|
||||
if (!auditResult.Success)
|
||||
{
|
||||
@@ -186,6 +477,17 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
auditResult.Exception);
|
||||
}
|
||||
|
||||
DbResult<bool> resultadoProceso = ActualizarVencimientoEtapa(
|
||||
uploadContext.CveFraccionamientoEtapa, executingUser, domainName);
|
||||
if (!resultadoProceso.Success)
|
||||
{
|
||||
_fileStore.Rollback(preparedFile);
|
||||
return DbResult<TramiteDocumentoSaveResultModel>.Fail(
|
||||
resultadoProceso.UserMessage,
|
||||
resultadoProceso.TechnicalMessage,
|
||||
resultadoProceso.Exception);
|
||||
}
|
||||
|
||||
_fileStore.Promote(preparedFile);
|
||||
transaction.Commit();
|
||||
}
|
||||
@@ -222,6 +524,67 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
}
|
||||
}
|
||||
|
||||
public DbResult<bool> Eliminar(
|
||||
int cveFraccionamiento,
|
||||
int cveSolicitud,
|
||||
int cveDocumentoSolicitud,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio)
|
||||
{
|
||||
using (var transaccion = new TransactionLogic(IsolationLevel.Serializable))
|
||||
{
|
||||
DbResult<List<TramiteDocumentoSolicitudModel>> resultadoDocumentos =
|
||||
ListForDevelopment(
|
||||
cveFraccionamiento, null, null, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!resultadoDocumentos.Success)
|
||||
{
|
||||
return Fail<bool>(resultadoDocumentos.UserMessage);
|
||||
}
|
||||
|
||||
TramiteDocumentoSolicitudModel documento = resultadoDocumentos.Data
|
||||
.FirstOrDefault(elemento =>
|
||||
elemento.CveDocumentoSolicitud == cveDocumentoSolicitud &&
|
||||
elemento.CveDocumentoSolicitud > 0);
|
||||
|
||||
if (documento == null || !documento.PuedeActualizarArchivo)
|
||||
{
|
||||
return Fail<bool>("No es posible eliminar el documento seleccionado.");
|
||||
}
|
||||
|
||||
DbResult<TramiteDocumentoDeleteResultModel> resultado =
|
||||
_repository.Delete(
|
||||
cveFraccionamiento, cveDocumentoSolicitud, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!resultado.Success || resultado.Data == null)
|
||||
{
|
||||
return Fail<bool>(resultado.UserMessage);
|
||||
}
|
||||
|
||||
DbResult<long> bitacora = _bitacoraService.RegistrarOperacion(
|
||||
ModeloOperacionBitacora.Crear(
|
||||
"EliminarDocumentoSolicitud",
|
||||
TramiteDocumentoBitacoraFactory.Delete(resultado.Data)));
|
||||
if (!bitacora.Success)
|
||||
{
|
||||
return Fail<bool>(bitacora.UserMessage);
|
||||
}
|
||||
|
||||
// Se elimina físicamente el registro. El archivo queda sin una descarga
|
||||
// autorizable, siguiendo el almacenamiento existente de documentos.
|
||||
DbResult<bool> resultadoProceso = ActualizarVencimientoEtapa(
|
||||
resultado.Data.CveFraccionamientoEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!resultadoProceso.Success)
|
||||
{
|
||||
return DbResult<bool>.Fail(
|
||||
resultadoProceso.UserMessage,
|
||||
resultadoProceso.TechnicalMessage,
|
||||
resultadoProceso.Exception);
|
||||
}
|
||||
|
||||
transaccion.Commit();
|
||||
return DbResult<bool>.Ok(true);
|
||||
}
|
||||
}
|
||||
|
||||
public DbResult<TramiteDocumentoReviewResultModel> Review(
|
||||
int developmentId,
|
||||
int documentRequestId,
|
||||
@@ -262,10 +625,15 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
|
||||
if (result.Data.HuboCambio)
|
||||
{
|
||||
DbResult<long> auditResult =
|
||||
_bitacoraService.Registrar(
|
||||
TramiteDocumentoBitacoraFactory.Review(
|
||||
result.Data));
|
||||
ModeloOperacionBitacora operacion = ModeloOperacionBitacora.Crear(
|
||||
"RevisarDocumentoSolicitud",
|
||||
TramiteDocumentoBitacoraFactory.Review(result.Data));
|
||||
if (result.Data.EsAprobado == true && result.Data.FechaRevision.HasValue)
|
||||
{
|
||||
operacion.CveUsuarioAutoriza = result.Data.CveUsuarioRevisa;
|
||||
operacion.FechaAutorizacion = result.Data.FechaRevision;
|
||||
}
|
||||
DbResult<long> auditResult = _bitacoraService.RegistrarOperacion(operacion);
|
||||
|
||||
if (!auditResult.Success)
|
||||
{
|
||||
@@ -276,6 +644,16 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
}
|
||||
}
|
||||
|
||||
DbResult<bool> resultadoProceso = ActualizarVencimientoEtapa(
|
||||
result.Data.CveFraccionamientoEtapa, executingUser, domainName);
|
||||
if (!resultadoProceso.Success)
|
||||
{
|
||||
return DbResult<TramiteDocumentoReviewResultModel>.Fail(
|
||||
resultadoProceso.UserMessage,
|
||||
resultadoProceso.TechnicalMessage,
|
||||
resultadoProceso.Exception);
|
||||
}
|
||||
|
||||
transaction.Commit();
|
||||
return result;
|
||||
}
|
||||
@@ -287,6 +665,22 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
int executingUser,
|
||||
string domainName)
|
||||
{
|
||||
DbResult<List<TramiteDocumentoSolicitudModel>> documentos =
|
||||
ListForDevelopment(
|
||||
developmentId, null, null, executingUser, domainName);
|
||||
if (!documentos.Success)
|
||||
{
|
||||
return Fail<TramiteDocumentoFileModel>(documentos.UserMessage);
|
||||
}
|
||||
|
||||
if (!documentos.Data.Any(documento =>
|
||||
documento.CveDocumentoSolicitud == documentRequestId &&
|
||||
documento.CveDocumentoSolicitud > 0))
|
||||
{
|
||||
return Fail<TramiteDocumentoFileModel>(
|
||||
"El documento no está disponible para el usuario.");
|
||||
}
|
||||
|
||||
DbResult<TramiteDocumentoDownloadContextModel> result =
|
||||
_repository.GetDownloadContext(
|
||||
developmentId,
|
||||
@@ -338,8 +732,16 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
string contentType,
|
||||
long contentLength,
|
||||
int executingUser,
|
||||
string domainName)
|
||||
string domainName,
|
||||
ModeloOperacionBitacora operacionBitacora = null)
|
||||
{
|
||||
if (operacionBitacora != null &&
|
||||
(Transaction.Current == null || operacionBitacora.Registros == null))
|
||||
{
|
||||
return Fail<TramiteDocumentoSaveResultModel>(
|
||||
"La bitácora compartida requiere la transacción de la operación principal.");
|
||||
}
|
||||
|
||||
DbResult<TramiteDocumentoUploadContextModel> contextResult =
|
||||
_repository.GetStageUploadContext(
|
||||
stageId,
|
||||
@@ -355,6 +757,12 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
"No fue posible obtener la solicitud asociada a la etapa.");
|
||||
}
|
||||
|
||||
string mensajeValidacion = ValidarCarga(contextResult.Data, executingUser);
|
||||
if (mensajeValidacion != null)
|
||||
{
|
||||
return Fail<TramiteDocumentoSaveResultModel>(mensajeValidacion);
|
||||
}
|
||||
|
||||
TramiteDocumentoUploadContextModel uploadContext =
|
||||
contextResult.Data;
|
||||
|
||||
@@ -372,17 +780,18 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
contentLength,
|
||||
null,
|
||||
executingUser,
|
||||
domainName);
|
||||
domainName,
|
||||
cveFraccionamientoEtapa: stageId);
|
||||
|
||||
if (!result.Success || result.Data == null)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
DbResult<long> auditResult =
|
||||
_bitacoraService.Registrar(
|
||||
TramiteDocumentoBitacoraFactory.Upload(
|
||||
result.Data));
|
||||
DbResult<long> auditResult = RegistrarMovimientoArchivoEtapa(
|
||||
operacionBitacora,
|
||||
"RegistrarArchivoEtapa",
|
||||
TramiteDocumentoBitacoraFactory.Upload(result.Data));
|
||||
|
||||
if (!auditResult.Success)
|
||||
{
|
||||
@@ -392,6 +801,16 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
auditResult.Exception);
|
||||
}
|
||||
|
||||
DbResult<bool> resultadoProceso = ActualizarVencimientoEtapa(
|
||||
stageId, executingUser, domainName);
|
||||
if (!resultadoProceso.Success)
|
||||
{
|
||||
return DbResult<TramiteDocumentoSaveResultModel>.Fail(
|
||||
resultadoProceso.UserMessage,
|
||||
resultadoProceso.TechnicalMessage,
|
||||
resultadoProceso.Exception);
|
||||
}
|
||||
|
||||
transaction.Commit();
|
||||
return result;
|
||||
}
|
||||
@@ -402,8 +821,16 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
int procedureTypeId,
|
||||
int documentTypeId,
|
||||
int executingUser,
|
||||
string domainName)
|
||||
string domainName,
|
||||
ModeloOperacionBitacora operacionBitacora = null)
|
||||
{
|
||||
if (operacionBitacora != null &&
|
||||
(Transaction.Current == null || operacionBitacora.Registros == null))
|
||||
{
|
||||
return Fail<bool>(
|
||||
"La bitácora compartida requiere la transacción de la operación principal.");
|
||||
}
|
||||
|
||||
DbResult<TramiteDocumentoUploadContextModel> contextResult =
|
||||
_repository.GetStageUploadContext(
|
||||
stageId,
|
||||
@@ -419,6 +846,12 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
"No fue posible obtener la solicitud asociada a la etapa.");
|
||||
}
|
||||
|
||||
string mensajeValidacion = ValidarCarga(contextResult.Data, executingUser);
|
||||
if (mensajeValidacion != null)
|
||||
{
|
||||
return Fail<bool>(mensajeValidacion);
|
||||
}
|
||||
|
||||
if (contextResult.Data.CveDocumentoSolicitud <= 0)
|
||||
{
|
||||
return DbResult<bool>.Ok(true);
|
||||
@@ -441,10 +874,10 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
deleteResult.Exception);
|
||||
}
|
||||
|
||||
DbResult<long> auditResult =
|
||||
_bitacoraService.Registrar(
|
||||
TramiteDocumentoBitacoraFactory.Delete(
|
||||
deleteResult.Data));
|
||||
DbResult<long> auditResult = RegistrarMovimientoArchivoEtapa(
|
||||
operacionBitacora,
|
||||
"EliminarArchivoEtapa",
|
||||
TramiteDocumentoBitacoraFactory.Delete(deleteResult.Data));
|
||||
|
||||
if (!auditResult.Success)
|
||||
{
|
||||
@@ -454,11 +887,70 @@ namespace SIG.Web.AppCode.Services.Documentos
|
||||
auditResult.Exception);
|
||||
}
|
||||
|
||||
DbResult<bool> resultadoProceso = ActualizarVencimientoEtapa(
|
||||
stageId, executingUser, domainName);
|
||||
if (!resultadoProceso.Success)
|
||||
{
|
||||
return DbResult<bool>.Fail(
|
||||
resultadoProceso.UserMessage,
|
||||
resultadoProceso.TechnicalMessage,
|
||||
resultadoProceso.Exception);
|
||||
}
|
||||
|
||||
transaction.Commit();
|
||||
return DbResult<bool>.Ok(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public DbResult<bool> ActualizarVencimientoEtapa(
|
||||
int cveFraccionamientoEtapa,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio)
|
||||
{
|
||||
if (cveFraccionamientoEtapa <= 0)
|
||||
{
|
||||
return Fail<bool>("Seleccione una etapa válida.");
|
||||
}
|
||||
|
||||
using (var transaccion = new TransactionLogic(
|
||||
Transaction.Current == null ? IsolationLevel.ReadCommitted : Transaction.Current.IsolationLevel))
|
||||
{
|
||||
DbResult<bool> resultado = _repository.ActualizarVencimientoEtapa(
|
||||
cveFraccionamientoEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!resultado.Success)
|
||||
{
|
||||
return resultado;
|
||||
}
|
||||
|
||||
resultado = _repositorioSolicitud.ActualizarProceso(
|
||||
null, cveFraccionamientoEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!resultado.Success)
|
||||
{
|
||||
return resultado;
|
||||
}
|
||||
|
||||
transaccion.Commit();
|
||||
return resultado;
|
||||
}
|
||||
}
|
||||
|
||||
private DbResult<long> RegistrarMovimientoArchivoEtapa(
|
||||
ModeloOperacionBitacora operacionBitacora,
|
||||
string codigoAccion,
|
||||
ModeloRegistroBitacora registro)
|
||||
{
|
||||
if (operacionBitacora != null)
|
||||
{
|
||||
// El servicio que abrió la operación registra el conjunto antes de confirmar.
|
||||
operacionBitacora.Registros.Add(registro);
|
||||
return DbResult<long>.Ok(0);
|
||||
}
|
||||
|
||||
return _bitacoraService.RegistrarOperacion(
|
||||
ModeloOperacionBitacora.Crear(codigoAccion, registro));
|
||||
}
|
||||
|
||||
private static string ValidateFile(
|
||||
TramiteDocumentoUploadContextModel context,
|
||||
string originalFileName,
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
{
|
||||
internal static class FabricaBitacoraFraccionamiento
|
||||
{
|
||||
public static BitacoraEventoModel CrearFraccionamiento(
|
||||
public static ModeloRegistroBitacora CrearFraccionamiento(
|
||||
ModeloFraccionamiento anterior,
|
||||
ModeloFraccionamiento actual,
|
||||
int cveFraccionamiento,
|
||||
@@ -41,7 +41,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
return eventoBitacora;
|
||||
}
|
||||
|
||||
public static BitacoraEventoModel CrearEtapa(
|
||||
public static ModeloRegistroBitacora CrearEtapa(
|
||||
ModeloEtapaFraccionamiento anterior,
|
||||
ModeloEtapaFraccionamiento actual,
|
||||
int cveFraccionamientoEtapa,
|
||||
@@ -85,7 +85,62 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
return eventoBitacora;
|
||||
}
|
||||
|
||||
public static BitacoraEventoModel CrearEtapaAvance(
|
||||
public static ModeloRegistroBitacora CrearTipoViviendaEtapa(
|
||||
ModeloTipoViviendaEtapa anterior, ModeloTipoViviendaEtapa actual, ModeloEtapaFraccionamiento etapa)
|
||||
{
|
||||
var valores = actual ?? anterior;
|
||||
var movimiento = actual == null ? BitacoraTipoMovimiento.Eliminado :
|
||||
anterior == null ? BitacoraTipoMovimiento.Agregado : BitacoraTipoMovimiento.Editado;
|
||||
var evento = CrearEvento("FraccionamientosEtapasTiposVivienda", movimiento,
|
||||
valores.CveEtapaTipoVivienda, "Se actualizaron las cantidades por tipo de vivienda de la etapa " +
|
||||
etapa.Etapa + ".", etapa.CveCliente);
|
||||
evento.Relaciones.Add(CrearRelacion(BitacoraTipoRelacion.Directa,
|
||||
"FraccionamientosEtapasTiposVivienda", "CveEtapaTipoVivienda",
|
||||
valores.CveEtapaTipoVivienda, "Cantidad por tipo."));
|
||||
evento.Relaciones.Add(CrearRelacion(BitacoraTipoRelacion.Relacionada,
|
||||
"FraccionamientosEtapas", "CveFraccionamientoEtapa",
|
||||
etapa.CveFraccionamientoEtapa, "Etapa."));
|
||||
if (actual != null)
|
||||
{
|
||||
evento.Campos = new List<BitacoraCampoEventoModel>
|
||||
{
|
||||
CrearCampo("CveFraccionamientoEtapa", ObtenerValor(anterior, valor => valor.CveFraccionamientoEtapa), actual.CveFraccionamientoEtapa),
|
||||
CrearCampo("CveTipoVivienda", ObtenerValor(anterior, valor => valor.CveTipoVivienda), actual.CveTipoVivienda),
|
||||
CrearCampo("Cantidad", ObtenerValor(anterior, valor => valor.Cantidad), actual.Cantidad)
|
||||
};
|
||||
}
|
||||
|
||||
return evento;
|
||||
}
|
||||
|
||||
public static ModeloRegistroBitacora CrearVinculoTipoViviendaEtapa(
|
||||
ModeloLoteTipoViviendaEtapa vinculo, ModeloEtapaFraccionamiento etapa, bool eliminar)
|
||||
{
|
||||
var evento = CrearEvento("FraccionamientosEtapasTiposViviendaLotes",
|
||||
eliminar ? BitacoraTipoMovimiento.Eliminado : BitacoraTipoMovimiento.Agregado,
|
||||
vinculo.CveEtapaTipoViviendaLote,
|
||||
eliminar ? "Se retiró la clasificación del lote." : "Se vinculó la clasificación del lote.",
|
||||
etapa.CveCliente);
|
||||
evento.Relaciones.Add(CrearRelacion(BitacoraTipoRelacion.Directa,
|
||||
"FraccionamientosEtapasTiposViviendaLotes", "CveEtapaTipoViviendaLote",
|
||||
vinculo.CveEtapaTipoViviendaLote, "Vínculo."));
|
||||
evento.Relaciones.Add(CrearRelacion(BitacoraTipoRelacion.Relacionada,
|
||||
"FraccionamientosEtapas", "CveFraccionamientoEtapa", etapa.CveFraccionamientoEtapa, "Etapa."));
|
||||
evento.Relaciones.Add(CrearRelacion(BitacoraTipoRelacion.Relacionada,
|
||||
"FraccionamientosLotes", "CveFraccionamientoLote", vinculo.CveFraccionamientoLote, "Lote."));
|
||||
if (!eliminar)
|
||||
{
|
||||
evento.Campos = new List<BitacoraCampoEventoModel>
|
||||
{
|
||||
CrearCampo("CveEtapaTipoVivienda", null, vinculo.CveEtapaTipoVivienda),
|
||||
CrearCampo("CveFraccionamientoLote", null, vinculo.CveFraccionamientoLote)
|
||||
};
|
||||
}
|
||||
|
||||
return evento;
|
||||
}
|
||||
|
||||
public static ModeloRegistroBitacora CrearEtapaAvance(
|
||||
ResultadoAvanceEtapaFraccionamiento avance)
|
||||
{
|
||||
var eventoBitacora = CrearEvento(
|
||||
@@ -120,7 +175,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
return eventoBitacora;
|
||||
}
|
||||
|
||||
public static BitacoraEventoModel CrearCondicionesEtapa(
|
||||
public static ModeloRegistroBitacora CrearCondicionesEtapa(
|
||||
ModeloCondicionesEtapaFraccionamiento anterior,
|
||||
ModeloCondicionesEtapaFraccionamiento actual)
|
||||
{
|
||||
@@ -181,7 +236,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
return eventoBitacora;
|
||||
}
|
||||
|
||||
public static BitacoraEventoModel CrearEtapaGis(
|
||||
public static ModeloRegistroBitacora CrearEtapaGis(
|
||||
ModeloGisEtapaFraccionamiento gis)
|
||||
{
|
||||
BitacoraTipoMovimiento tipoMovimiento = gis.EsNuevo
|
||||
@@ -224,7 +279,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
return eventoBitacora;
|
||||
}
|
||||
|
||||
public static BitacoraEventoModel CrearCambioArchivoGisEtapa(
|
||||
public static ModeloRegistroBitacora CrearCambioArchivoGisEtapa(
|
||||
ContextoGisFraccionamiento contexto,
|
||||
bool teniaArchivo,
|
||||
bool archivoCargado,
|
||||
@@ -243,9 +298,8 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
{
|
||||
descripcion =
|
||||
"Se reemplazó el GIS de la etapa " + contexto.Etapa +
|
||||
". Se desvincularon " + lotesVinculadosAnteriores +
|
||||
" lotes y se vincularon " + lotesVinculadosActuales +
|
||||
" lotes al nuevo GIS.";
|
||||
". Vínculos anteriores: " + lotesVinculadosAnteriores +
|
||||
"; vínculos actuales: " + lotesVinculadosActuales + ".";
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -262,7 +316,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
descripcion);
|
||||
}
|
||||
|
||||
public static BitacoraEventoModel CrearEliminacionArchivoGisEtapa(
|
||||
public static ModeloRegistroBitacora CrearEliminacionArchivoGisEtapa(
|
||||
ContextoGisFraccionamiento contexto,
|
||||
int lotesDesvinculados)
|
||||
{
|
||||
@@ -273,7 +327,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
". Se desvincularon " + lotesDesvinculados + " lotes.");
|
||||
}
|
||||
|
||||
private static BitacoraEventoModel CrearEventoArchivoGisEtapa(
|
||||
private static ModeloRegistroBitacora CrearEventoArchivoGisEtapa(
|
||||
ContextoGisFraccionamiento contexto,
|
||||
BitacoraTipoMovimiento tipoMovimiento,
|
||||
string descripcion)
|
||||
@@ -285,6 +339,8 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
descripcion,
|
||||
contexto.CveCliente);
|
||||
|
||||
eventoBitacora.RegistrarSinCampos = true;
|
||||
|
||||
eventoBitacora.Relaciones.Add(
|
||||
CrearRelacion(
|
||||
BitacoraTipoRelacion.Directa,
|
||||
@@ -303,7 +359,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
return eventoBitacora;
|
||||
}
|
||||
|
||||
public static BitacoraEventoModel CrearLote(
|
||||
public static ModeloRegistroBitacora CrearLote(
|
||||
ModeloLoteFraccionamiento anterior,
|
||||
ModeloLoteFraccionamiento actual,
|
||||
int cveFraccionamientoLote,
|
||||
@@ -353,7 +409,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
return eventoBitacora;
|
||||
}
|
||||
|
||||
public static BitacoraEventoModel CrearLimpiezaLotesEtapa(
|
||||
public static ModeloRegistroBitacora CrearLimpiezaLotesEtapa(
|
||||
int cveFraccionamiento,
|
||||
int cveFraccionamientoEtapa,
|
||||
int cveCliente,
|
||||
@@ -384,12 +440,12 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
return eventoBitacora;
|
||||
}
|
||||
|
||||
public static IList<BitacoraEventoModel> CrearAltasLotes(
|
||||
public static IList<ModeloRegistroBitacora> CrearAltasLotes(
|
||||
IEnumerable<ModeloLoteFraccionamiento> lotesGuardados,
|
||||
int cveFraccionamiento,
|
||||
int cveCliente)
|
||||
{
|
||||
var eventos = new List<BitacoraEventoModel>();
|
||||
var eventos = new List<ModeloRegistroBitacora>();
|
||||
|
||||
foreach (ModeloLoteFraccionamiento lote in lotesGuardados)
|
||||
{
|
||||
@@ -405,19 +461,29 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
|
||||
return eventos;
|
||||
}
|
||||
private static BitacoraEventoModel CrearEvento(
|
||||
private static ModeloRegistroBitacora CrearEvento(
|
||||
string nombreTabla,
|
||||
BitacoraTipoMovimiento tipoMovimiento,
|
||||
object llaveRegistro,
|
||||
string descripcion,
|
||||
int cveCliente)
|
||||
{
|
||||
var eventoBitacora = new BitacoraEventoModel
|
||||
string llaveTexto = Convert.ToString(
|
||||
llaveRegistro, System.Globalization.CultureInfo.InvariantCulture);
|
||||
long llaveNumero;
|
||||
bool esNumerica = long.TryParse(
|
||||
llaveTexto,
|
||||
System.Globalization.NumberStyles.Integer,
|
||||
System.Globalization.CultureInfo.InvariantCulture,
|
||||
out llaveNumero);
|
||||
|
||||
var eventoBitacora = new ModeloRegistroBitacora
|
||||
{
|
||||
NombreTablaSQL = nombreTabla,
|
||||
TipoMovimiento = tipoMovimiento,
|
||||
LlaveRegistro = Convert.ToString(llaveRegistro),
|
||||
DescripcionMovimiento = descripcion,
|
||||
LlaveRegistro = esNumerica ? (long?)llaveNumero : null,
|
||||
LlaveRegistroTexto = esNumerica ? null : llaveTexto,
|
||||
DescripcionRegistro = descripcion,
|
||||
DiscriminarCamposSinCambios =
|
||||
tipoMovimiento != BitacoraTipoMovimiento.Agregado
|
||||
};
|
||||
@@ -488,7 +554,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
ModeloEtapaFraccionamiento anterior,
|
||||
ModeloEtapaFraccionamiento actual)
|
||||
{
|
||||
return new List<BitacoraCampoEventoModel>
|
||||
var campos = new List<BitacoraCampoEventoModel>
|
||||
{
|
||||
CrearCampo(
|
||||
"CveFraccionamiento",
|
||||
@@ -517,6 +583,13 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
ObtenerValor(anterior, elemento => elemento.EsActivo),
|
||||
actual.EsActivo)
|
||||
};
|
||||
if (actual.Fideicomiso.HasValue)
|
||||
{
|
||||
campos.Add(CrearCampo("Fideicomiso",
|
||||
ObtenerValor(anterior, elemento => elemento.Fideicomiso), actual.Fideicomiso));
|
||||
}
|
||||
|
||||
return campos;
|
||||
}
|
||||
|
||||
private static IList<BitacoraCampoEventoModel> CrearCamposGisEtapa(
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using SIG.Web.AppCode.Contracts.Bitacora;
|
||||
using SIG.Web.AppCode.Contracts.Fraccionamientos;
|
||||
@@ -26,6 +26,17 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
_servicioBitacora = bitacoraServicio;
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloFilaDesarrollos>> ListarDesarrollos(
|
||||
int cveCliente, int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
if (cveCliente <= 0)
|
||||
{
|
||||
return CrearFallo<List<ModeloFilaDesarrollos>>("Seleccione un desarrollador válido.");
|
||||
}
|
||||
|
||||
return _repositorio.ListarDesarrollos(cveCliente, cveUsuarioEjecuta, nombreDominio);
|
||||
}
|
||||
|
||||
public DbResult<List<OpcionClienteFraccionamiento>> ListarClientes(int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
return _repositorio.ListarClientes(cveUsuarioEjecuta, nombreDominio);
|
||||
@@ -63,6 +74,71 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
nombreDominio);
|
||||
}
|
||||
|
||||
public DbResult<int> GuardarConEtapas(
|
||||
ModeloFraccionamiento fraccionamiento,
|
||||
IList<ModeloEtapaFraccionamiento> etapas,
|
||||
int cveUsuarioEjecuta,
|
||||
string nombreDominio)
|
||||
{
|
||||
if (fraccionamiento == null || fraccionamiento.CveFraccionamiento > 0)
|
||||
{
|
||||
return CrearFallo<int>("Esta operación requiere un fraccionamiento nuevo.");
|
||||
}
|
||||
|
||||
if (etapas == null || etapas.Count == 0)
|
||||
{
|
||||
return CrearFallo<int>("Capture al menos una etapa.");
|
||||
}
|
||||
|
||||
var etapasNuevas = new List<ModeloEtapaFraccionamiento>();
|
||||
foreach (ModeloEtapaFraccionamiento etapa in etapas)
|
||||
{
|
||||
if (etapa == null || string.IsNullOrWhiteSpace(etapa.Etapa) ||
|
||||
etapa.Etapa.Trim().Length > 150)
|
||||
{
|
||||
return CrearFallo<int>("Cada etapa requiere un nombre de hasta 150 caracteres.");
|
||||
}
|
||||
|
||||
if (etapa.Hectareas.HasValue &&
|
||||
(etapa.Hectareas.Value < 0 || etapa.Hectareas.Value > 999999999.9999m))
|
||||
{
|
||||
return CrearFallo<int>("Capture hectáreas válidas para cada etapa.");
|
||||
}
|
||||
|
||||
etapasNuevas.Add(new ModeloEtapaFraccionamiento
|
||||
{
|
||||
Etapa = etapa.Etapa.Trim(),
|
||||
Hectareas = etapa.Hectareas,
|
||||
Fideicomiso = etapa.Fideicomiso,
|
||||
EsActivo = true
|
||||
});
|
||||
}
|
||||
|
||||
using (var transaccion = new TransactionLogic())
|
||||
{
|
||||
DbResult<int> resultado = Guardar(
|
||||
fraccionamiento, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!resultado.Success)
|
||||
{
|
||||
return resultado;
|
||||
}
|
||||
|
||||
foreach (ModeloEtapaFraccionamiento etapa in etapasNuevas)
|
||||
{
|
||||
etapa.CveFraccionamiento = resultado.Data;
|
||||
DbResult<int> resultadoEtapa = GuardarEtapa(
|
||||
etapa, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!resultadoEtapa.Success)
|
||||
{
|
||||
return resultadoEtapa;
|
||||
}
|
||||
}
|
||||
|
||||
transaccion.Commit();
|
||||
return resultado;
|
||||
}
|
||||
}
|
||||
|
||||
public DbResult<int> Guardar(
|
||||
ModeloFraccionamiento fraccionamiento,
|
||||
int cveUsuarioEjecuta,
|
||||
@@ -110,6 +186,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
if (esNuevoFraccionamiento)
|
||||
{
|
||||
return EjecutarEnTransaccion(
|
||||
"GuardarFraccionamiento",
|
||||
ejecutarGuardado,
|
||||
cveFraccionamiento => CrearListaEvento(
|
||||
FabricaBitacoraFraccionamiento.CrearFraccionamiento(
|
||||
@@ -120,6 +197,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
}
|
||||
|
||||
return EjecutarEnTransaccion(
|
||||
"GuardarFraccionamiento",
|
||||
() => _repositorio.Obtener(
|
||||
fraccionamiento.CveFraccionamiento,
|
||||
cveUsuarioEjecuta,
|
||||
@@ -144,6 +222,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
}
|
||||
|
||||
return EjecutarEnTransaccion(
|
||||
"EliminarFraccionamiento",
|
||||
() => _repositorio.Obtener(
|
||||
cveFraccionamiento,
|
||||
cveUsuarioEjecuta,
|
||||
@@ -209,6 +288,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
MidpointRounding.AwayFromZero);
|
||||
|
||||
return EjecutarEnTransaccion(
|
||||
"ActualizarAvanceEtapa",
|
||||
() => _repositorio.ActualizarAvanceEtapa(
|
||||
cveFraccionamientoEtapa,
|
||||
avance,
|
||||
@@ -218,7 +298,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
? CrearListaEvento(
|
||||
FabricaBitacoraFraccionamiento.CrearEtapaAvance(
|
||||
resultado))
|
||||
: new List<BitacoraEventoModel>());
|
||||
: new List<ModeloRegistroBitacora>());
|
||||
}
|
||||
|
||||
public DbResult<ModeloCondicionesEtapaFraccionamiento> ObtenerCondicionesEtapa(
|
||||
@@ -275,6 +355,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
}
|
||||
|
||||
DbResult<bool> resultadoBitacora = RegistrarEventos(
|
||||
"GuardarCondicionesEtapa",
|
||||
CrearListaEvento(
|
||||
FabricaBitacoraFraccionamiento.CrearCondicionesEtapa(
|
||||
resultadoAnterior.Data,
|
||||
@@ -288,6 +369,16 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
resultadoBitacora.Exception);
|
||||
}
|
||||
|
||||
DbResult<bool> resultadoProceso = _repositorioSolicitudTramite.ActualizarProceso(
|
||||
null, condiciones.CveFraccionamientoEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!resultadoProceso.Success)
|
||||
{
|
||||
return DbResult<ModeloCondicionesEtapaFraccionamiento>.Fail(
|
||||
resultadoProceso.UserMessage,
|
||||
resultadoProceso.TechnicalMessage,
|
||||
resultadoProceso.Exception);
|
||||
}
|
||||
|
||||
transaccion.Commit();
|
||||
return resultadoActual;
|
||||
}
|
||||
@@ -322,6 +413,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
}
|
||||
|
||||
return EjecutarEnTransaccion(
|
||||
"GuardarGisEtapa",
|
||||
() => _repositorio.GuardarGisEtapa(
|
||||
cveFraccionamientoEtapa,
|
||||
cveUsuarioEjecuta,
|
||||
@@ -330,7 +422,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
? CrearListaEvento(
|
||||
FabricaBitacoraFraccionamiento.CrearEtapaGis(
|
||||
resultado))
|
||||
: new List<BitacoraEventoModel>());
|
||||
: new List<ModeloRegistroBitacora>());
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloTramiteEtapaFraccionamiento>> ListarTramitesEtapa(
|
||||
@@ -469,6 +561,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
}
|
||||
|
||||
DbResult<bool> resultadoBitacora = RegistrarEventos(
|
||||
"GuardarEtapa",
|
||||
CrearListaEvento(
|
||||
FabricaBitacoraFraccionamiento.CrearEtapa(
|
||||
anterior,
|
||||
@@ -550,6 +643,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
}
|
||||
|
||||
DbResult<bool> resultadoBitacora = RegistrarEventos(
|
||||
"MoverOrdenEtapa",
|
||||
CrearListaEvento(
|
||||
FabricaBitacoraFraccionamiento.CrearEtapa(
|
||||
resultadoAnterior.Data,
|
||||
@@ -582,6 +676,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
}
|
||||
|
||||
return EjecutarEnTransaccion(
|
||||
"EliminarEtapa",
|
||||
() => _repositorio.ObtenerEtapa(
|
||||
cveFraccionamientoEtapa,
|
||||
cveUsuarioEjecuta,
|
||||
@@ -671,6 +766,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
}
|
||||
|
||||
return EjecutarEnTransaccion(
|
||||
"GuardarLote",
|
||||
() => _repositorio.ObtenerLote(
|
||||
cveFraccionamiento,
|
||||
lote.CveFraccionamientoLote,
|
||||
@@ -732,7 +828,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
}
|
||||
|
||||
DbResult<List<ModeloLoteFraccionamiento>> resultadoGuardado =
|
||||
EjecutarEnTransaccion(
|
||||
EjecutarEnTransaccion("GuardarLotes",
|
||||
() => _repositorio.Obtener(
|
||||
cveFraccionamiento,
|
||||
cveUsuarioEjecuta,
|
||||
@@ -770,6 +866,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
}
|
||||
|
||||
return EjecutarEnTransaccion(
|
||||
"EliminarLote",
|
||||
() => _repositorio.ObtenerLote(
|
||||
cveFraccionamiento,
|
||||
cveFraccionamientoLote,
|
||||
@@ -803,6 +900,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
}
|
||||
|
||||
return EjecutarEnTransaccion(
|
||||
"LimpiarLotesEtapa",
|
||||
() => _repositorio.Obtener(
|
||||
cveFraccionamiento,
|
||||
cveUsuarioEjecuta,
|
||||
@@ -820,9 +918,235 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
lotesEliminados)));
|
||||
}
|
||||
|
||||
public DbResult<List<OpcionTipoVivienda>> ListarTiposVivienda(int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
return _repositorio.ListarTiposVivienda(cveUsuarioEjecuta, nombreDominio);
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloTipoViviendaEtapa>> ListarTiposViviendaEtapa(
|
||||
int cveEtapa, int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
var etapa = ObtenerEtapa(cveEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!etapa.Success || etapa.Data == null)
|
||||
{
|
||||
return CrearFallo<List<ModeloTipoViviendaEtapa>>(etapa.UserMessage);
|
||||
}
|
||||
|
||||
return _repositorio.ListarTiposViviendaEtapa(cveEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
}
|
||||
|
||||
public DbResult<List<ModeloLoteTipoViviendaEtapa>> ListarLotesTipoViviendaEtapa(
|
||||
int cveEtapa, int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
var etapa = ObtenerEtapa(cveEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!etapa.Success || etapa.Data == null)
|
||||
{
|
||||
return CrearFallo<List<ModeloLoteTipoViviendaEtapa>>(etapa.UserMessage);
|
||||
}
|
||||
|
||||
return _repositorio.ListarLotesTipoViviendaEtapa(cveEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
}
|
||||
|
||||
public DbResult<int> GuardarTipoViviendaEtapa(
|
||||
ModeloTipoViviendaEtapa registro, int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
if (registro == null || registro.CveFraccionamientoEtapa <= 0 ||
|
||||
registro.CveTipoVivienda <= 0 || registro.Cantidad <= 0)
|
||||
{
|
||||
return CrearFallo<int>("Seleccione un tipo de vivienda y capture una cantidad mayor que cero.");
|
||||
}
|
||||
|
||||
using (var transaccion = new TransactionLogic(System.Transactions.IsolationLevel.Serializable))
|
||||
{
|
||||
var etapa = ObtenerEtapa(registro.CveFraccionamientoEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!etapa.Success || etapa.Data == null)
|
||||
{
|
||||
return CrearFallo<int>(etapa.UserMessage);
|
||||
}
|
||||
|
||||
var consulta = _repositorio.ListarTiposViviendaEtapa(
|
||||
registro.CveFraccionamientoEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!consulta.Success)
|
||||
{
|
||||
return CrearFallo<int>(consulta.UserMessage);
|
||||
}
|
||||
|
||||
var anterior = consulta.Data.Find(tipo => tipo.CveTipoVivienda == registro.CveTipoVivienda);
|
||||
if (anterior != null && registro.Cantidad < anterior.LotesVinculados)
|
||||
{
|
||||
return CrearFallo<int>("La cantidad no puede ser menor que los lotes ya vinculados.");
|
||||
}
|
||||
|
||||
var guardado = _repositorio.GuardarTipoViviendaEtapa(registro, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!guardado.Success)
|
||||
{
|
||||
return guardado;
|
||||
}
|
||||
|
||||
registro.CveEtapaTipoVivienda = guardado.Data;
|
||||
var auditoria = RegistrarEventos("GuardarTipoViviendaEtapa", CrearListaEvento(
|
||||
FabricaBitacoraFraccionamiento.CrearTipoViviendaEtapa(anterior, registro, etapa.Data)));
|
||||
if (!auditoria.Success)
|
||||
{
|
||||
return CrearFallo<int>(auditoria.UserMessage);
|
||||
}
|
||||
|
||||
transaccion.Commit();
|
||||
return guardado;
|
||||
}
|
||||
}
|
||||
|
||||
public DbResult<bool> EliminarTipoViviendaEtapa(
|
||||
int cveEtapa, int cveRegistro, int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
using (var transaccion = new TransactionLogic(System.Transactions.IsolationLevel.Serializable))
|
||||
{
|
||||
var etapa = ObtenerEtapa(cveEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!etapa.Success || etapa.Data == null)
|
||||
{
|
||||
return CrearFallo<bool>(etapa.UserMessage);
|
||||
}
|
||||
|
||||
var consulta = _repositorio.ListarTiposViviendaEtapa(cveEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!consulta.Success)
|
||||
{
|
||||
return CrearFallo<bool>(consulta.UserMessage);
|
||||
}
|
||||
|
||||
var anterior = consulta.Data.Find(tipo => tipo.CveEtapaTipoVivienda == cveRegistro);
|
||||
if (anterior == null || anterior.LotesVinculados > 0)
|
||||
{
|
||||
return CrearFallo<bool>("El registro no existe o tiene lotes vinculados. Retire primero sus vínculos.");
|
||||
}
|
||||
|
||||
var eliminado = _repositorio.EliminarTipoViviendaEtapa(
|
||||
cveEtapa, cveRegistro, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!eliminado.Success)
|
||||
{
|
||||
return eliminado;
|
||||
}
|
||||
|
||||
var auditoria = RegistrarEventos("EliminarTipoViviendaEtapa", CrearListaEvento(
|
||||
FabricaBitacoraFraccionamiento.CrearTipoViviendaEtapa(anterior, null, etapa.Data)));
|
||||
if (!auditoria.Success)
|
||||
{
|
||||
return CrearFallo<bool>(auditoria.UserMessage);
|
||||
}
|
||||
|
||||
transaccion.Commit();
|
||||
return eliminado;
|
||||
}
|
||||
}
|
||||
|
||||
public DbResult<int> VincularLoteTipoViviendaEtapa(
|
||||
int cveEtapa, int cveRegistro, int cveLote, int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
using (var transaccion = new TransactionLogic(System.Transactions.IsolationLevel.Serializable))
|
||||
{
|
||||
var etapa = ObtenerEtapa(cveEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!etapa.Success || etapa.Data == null)
|
||||
{
|
||||
return CrearFallo<int>(etapa.UserMessage);
|
||||
}
|
||||
|
||||
var tipos = _repositorio.ListarTiposViviendaEtapa(cveEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
var vinculos = _repositorio.ListarLotesTipoViviendaEtapa(cveEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
var lote = _repositorio.ObtenerLote(etapa.Data.CveFraccionamiento, cveLote, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!tipos.Success || !vinculos.Success || !lote.Success)
|
||||
{
|
||||
return CrearFallo<int>(!tipos.Success ? tipos.UserMessage :
|
||||
!vinculos.Success ? vinculos.UserMessage : lote.UserMessage);
|
||||
}
|
||||
|
||||
var tipo = tipos.Data.Find(registro => registro.CveEtapaTipoVivienda == cveRegistro);
|
||||
if (tipo == null || lote.Data == null ||
|
||||
lote.Data.CveFraccionamientoEtapa != cveEtapa || !lote.Data.EsActivo)
|
||||
{
|
||||
return CrearFallo<int>("Seleccione un tipo registrado y un lote activo de esta etapa.");
|
||||
}
|
||||
|
||||
if (vinculos.Data.Exists(vinculo => vinculo.CveFraccionamientoLote == cveLote))
|
||||
{
|
||||
return CrearFallo<int>("El lote ya tiene una clasificación vinculada.");
|
||||
}
|
||||
|
||||
if (tipo.LotesVinculados >= tipo.Cantidad)
|
||||
{
|
||||
return CrearFallo<int>("Ya se vinculó la cantidad de lotes capturada para este tipo.");
|
||||
}
|
||||
|
||||
var guardado = _repositorio.VincularLoteTipoViviendaEtapa(
|
||||
cveEtapa, cveRegistro, cveLote, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!guardado.Success)
|
||||
{
|
||||
return guardado;
|
||||
}
|
||||
|
||||
var actual = new ModeloLoteTipoViviendaEtapa
|
||||
{
|
||||
CveEtapaTipoViviendaLote = guardado.Data,
|
||||
CveEtapaTipoVivienda = cveRegistro,
|
||||
CveFraccionamientoEtapa = cveEtapa,
|
||||
CveFraccionamientoLote = cveLote
|
||||
};
|
||||
var auditoria = RegistrarEventos("VincularLoteTipoViviendaEtapa", CrearListaEvento(
|
||||
FabricaBitacoraFraccionamiento.CrearVinculoTipoViviendaEtapa(actual, etapa.Data, false)));
|
||||
if (!auditoria.Success)
|
||||
{
|
||||
return CrearFallo<int>(auditoria.UserMessage);
|
||||
}
|
||||
|
||||
transaccion.Commit();
|
||||
return guardado;
|
||||
}
|
||||
}
|
||||
|
||||
public DbResult<bool> DesvincularLoteTipoViviendaEtapa(
|
||||
int cveEtapa, int cveVinculo, int cveUsuarioEjecuta, string nombreDominio)
|
||||
{
|
||||
using (var transaccion = new TransactionLogic(System.Transactions.IsolationLevel.Serializable))
|
||||
{
|
||||
var etapa = ObtenerEtapa(cveEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!etapa.Success || etapa.Data == null)
|
||||
{
|
||||
return CrearFallo<bool>(etapa.UserMessage);
|
||||
}
|
||||
|
||||
var consulta = _repositorio.ListarLotesTipoViviendaEtapa(cveEtapa, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!consulta.Success)
|
||||
{
|
||||
return CrearFallo<bool>(consulta.UserMessage);
|
||||
}
|
||||
|
||||
var anterior = consulta.Data.Find(vinculo => vinculo.CveEtapaTipoViviendaLote == cveVinculo);
|
||||
if (anterior == null)
|
||||
{
|
||||
return CrearFallo<bool>("El vínculo ya no existe en esta etapa.");
|
||||
}
|
||||
|
||||
var eliminado = _repositorio.DesvincularLoteTipoViviendaEtapa(
|
||||
cveEtapa, cveVinculo, cveUsuarioEjecuta, nombreDominio);
|
||||
if (!eliminado.Success)
|
||||
{
|
||||
return eliminado;
|
||||
}
|
||||
|
||||
var auditoria = RegistrarEventos("DesvincularLoteTipoViviendaEtapa", CrearListaEvento(
|
||||
FabricaBitacoraFraccionamiento.CrearVinculoTipoViviendaEtapa(anterior, etapa.Data, true)));
|
||||
if (!auditoria.Success)
|
||||
{
|
||||
return CrearFallo<bool>(auditoria.UserMessage);
|
||||
}
|
||||
|
||||
transaccion.Commit();
|
||||
return eliminado;
|
||||
}
|
||||
}
|
||||
|
||||
private DbResult<TResult> EjecutarEnTransaccion<TResult>(
|
||||
string codigoAccion,
|
||||
Func<DbResult<TResult>> ejecutarOperacion,
|
||||
Func<TResult, IList<BitacoraEventoModel>> crearEventosBitacora)
|
||||
Func<TResult, IList<ModeloRegistroBitacora>> crearEventosBitacora)
|
||||
{
|
||||
using (var transaccion = new TransactionLogic())
|
||||
{
|
||||
@@ -833,7 +1157,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
return resultado;
|
||||
}
|
||||
|
||||
DbResult<bool> resultadoBitacora = RegistrarEventos(
|
||||
DbResult<bool> resultadoBitacora = RegistrarEventos(codigoAccion,
|
||||
crearEventosBitacora(resultado.Data));
|
||||
|
||||
if (!resultadoBitacora.Success)
|
||||
@@ -850,9 +1174,10 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
}
|
||||
|
||||
private DbResult<TResult> EjecutarEnTransaccion<TSnapshot, TResult>(
|
||||
string codigoAccion,
|
||||
Func<DbResult<TSnapshot>> obtenerEstadoAnterior,
|
||||
Func<DbResult<TResult>> ejecutarOperacion,
|
||||
Func<TSnapshot, TResult, IList<BitacoraEventoModel>> crearEventosBitacora)
|
||||
Func<TSnapshot, TResult, IList<ModeloRegistroBitacora>> crearEventosBitacora)
|
||||
{
|
||||
using (var transaccion = new TransactionLogic())
|
||||
{
|
||||
@@ -873,7 +1198,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
return resultado;
|
||||
}
|
||||
|
||||
DbResult<bool> resultadoBitacora = RegistrarEventos(
|
||||
DbResult<bool> resultadoBitacora = RegistrarEventos(codigoAccion,
|
||||
crearEventosBitacora(
|
||||
resultadoCapturaAnterior.Data,
|
||||
resultado.Data));
|
||||
@@ -892,7 +1217,8 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
}
|
||||
|
||||
private DbResult<bool> RegistrarEventos(
|
||||
IEnumerable<BitacoraEventoModel> eventos)
|
||||
string codigoAccion,
|
||||
IEnumerable<ModeloRegistroBitacora> eventos)
|
||||
{
|
||||
if (_servicioBitacora == null)
|
||||
{
|
||||
@@ -900,27 +1226,23 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
"El servicio de bitácora no está configurado.");
|
||||
}
|
||||
|
||||
foreach (BitacoraEventoModel eventoBitacora in eventos)
|
||||
DbResult<long> resultadoBitacora = _servicioBitacora.RegistrarOperacion(
|
||||
ModeloOperacionBitacora.Crear(codigoAccion, eventos));
|
||||
if (!resultadoBitacora.Success)
|
||||
{
|
||||
DbResult<long> resultadoBitacora =
|
||||
_servicioBitacora.Registrar(eventoBitacora);
|
||||
|
||||
if (!resultadoBitacora.Success)
|
||||
{
|
||||
return DbResult<bool>.Fail(
|
||||
resultadoBitacora.UserMessage,
|
||||
resultadoBitacora.TechnicalMessage,
|
||||
resultadoBitacora.Exception);
|
||||
}
|
||||
return DbResult<bool>.Fail(
|
||||
resultadoBitacora.UserMessage,
|
||||
resultadoBitacora.TechnicalMessage,
|
||||
resultadoBitacora.Exception);
|
||||
}
|
||||
|
||||
return DbResult<bool>.Ok(true);
|
||||
}
|
||||
|
||||
private static IList<BitacoraEventoModel> CrearListaEvento(
|
||||
BitacoraEventoModel eventoBitacora)
|
||||
private static IList<ModeloRegistroBitacora> CrearListaEvento(
|
||||
ModeloRegistroBitacora eventoBitacora)
|
||||
{
|
||||
return new List<BitacoraEventoModel> { eventoBitacora };
|
||||
return new List<ModeloRegistroBitacora> { eventoBitacora };
|
||||
}
|
||||
|
||||
private static string NormalizarLote(
|
||||
|
||||
@@ -146,6 +146,9 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
"Seleccione una etapa válida.");
|
||||
}
|
||||
|
||||
// Sin una lista de vínculos se guarda únicamente el archivo.
|
||||
// Una lista vacía expresa la desvinculación seleccionada por el usuario.
|
||||
bool guardarVinculos = vinculos != null;
|
||||
string validacion = ValidarVinculos(vinculos);
|
||||
if (!string.IsNullOrWhiteSpace(validacion))
|
||||
{
|
||||
@@ -154,6 +157,12 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
|
||||
bool tieneArchivoCargado = contenido != null && longitudContenido > 0;
|
||||
|
||||
if (!tieneArchivoCargado && !guardarVinculos)
|
||||
{
|
||||
return CrearFallo<ResultadoGuardadoGisFraccionamiento>(
|
||||
"Seleccione un archivo .gis antes de guardar.");
|
||||
}
|
||||
|
||||
if (tieneArchivoCargado)
|
||||
{
|
||||
if (!string.Equals(
|
||||
@@ -244,25 +253,46 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
}
|
||||
}
|
||||
|
||||
bool cambiaronVinculos = guardarVinculos &&
|
||||
!SonIgualesLosVinculos(vinculosAnteriores, vinculos);
|
||||
int cantidadVinculosActuales = guardarVinculos
|
||||
? ContarVinculados(vinculos)
|
||||
: ContarVinculados(vinculosAnteriores);
|
||||
bool archivoFueEscrito = false;
|
||||
|
||||
try
|
||||
{
|
||||
using (var transaccion = new TransactionLogic())
|
||||
{
|
||||
DbResult<bool> resultadoGuardadoVinculos =
|
||||
_repositorio.GuardarVinculos(
|
||||
cveFraccionamientoEtapa,
|
||||
vinculos,
|
||||
cveUsuarioEjecuta,
|
||||
nombreDominio);
|
||||
ModeloOperacionBitacora operacionBitacora = ModeloOperacionBitacora.Crear(
|
||||
"GuardarGisEtapa",
|
||||
FabricaBitacoraFraccionamiento.CrearCambioArchivoGisEtapa(
|
||||
contextoGis,
|
||||
teniaArchivo,
|
||||
tieneArchivoCargado,
|
||||
ContarVinculados(vinculosAnteriores),
|
||||
cantidadVinculosActuales));
|
||||
|
||||
if (!resultadoGuardadoVinculos.Success)
|
||||
if (cambiaronVinculos)
|
||||
{
|
||||
return DbResult<ResultadoGuardadoGisFraccionamiento>.Fail(
|
||||
resultadoGuardadoVinculos.UserMessage,
|
||||
resultadoGuardadoVinculos.TechnicalMessage,
|
||||
resultadoGuardadoVinculos.Exception);
|
||||
DbResult<bool> resultadoGuardadoVinculos = vinculos.Count == 0
|
||||
? _repositorio.LimpiarVinculos(
|
||||
cveFraccionamientoEtapa,
|
||||
cveUsuarioEjecuta,
|
||||
nombreDominio)
|
||||
: _repositorio.GuardarVinculos(
|
||||
cveFraccionamientoEtapa,
|
||||
vinculos,
|
||||
cveUsuarioEjecuta,
|
||||
nombreDominio);
|
||||
|
||||
if (!resultadoGuardadoVinculos.Success)
|
||||
{
|
||||
return DbResult<ResultadoGuardadoGisFraccionamiento>.Fail(
|
||||
resultadoGuardadoVinculos.UserMessage,
|
||||
resultadoGuardadoVinculos.TechnicalMessage,
|
||||
resultadoGuardadoVinculos.Exception);
|
||||
}
|
||||
}
|
||||
|
||||
if (tieneArchivoCargado)
|
||||
@@ -286,10 +316,11 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
nombreArchivoOriginal,
|
||||
nombreArchivoFisico,
|
||||
rutaRelativa,
|
||||
TipoContenidoGis,
|
||||
TipoContenidoGis,
|
||||
longitudContenido,
|
||||
cveUsuarioEjecuta,
|
||||
nombreDominio);
|
||||
nombreDominio,
|
||||
operacionBitacora);
|
||||
|
||||
if (!resultadoDocumento.Success)
|
||||
{
|
||||
@@ -306,21 +337,12 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
}
|
||||
}
|
||||
|
||||
bool cambiaronVinculos = !SonIgualesLosVinculos(vinculosAnteriores, vinculos);
|
||||
bool hayCambios = tieneArchivoCargado || cambiaronVinculos;
|
||||
|
||||
if (hayCambios)
|
||||
{
|
||||
BitacoraEventoModel eventoBitacora =
|
||||
FabricaBitacoraFraccionamiento.CrearCambioArchivoGisEtapa(
|
||||
contextoGis,
|
||||
teniaArchivo,
|
||||
tieneArchivoCargado,
|
||||
ContarVinculados(vinculosAnteriores),
|
||||
vinculos.Count);
|
||||
|
||||
DbResult<long> resultadoBitacora =
|
||||
_servicioBitacora.Registrar(eventoBitacora);
|
||||
_servicioBitacora.RegistrarOperacion(operacionBitacora);
|
||||
|
||||
if (!resultadoBitacora.Success)
|
||||
{
|
||||
@@ -349,7 +371,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
new ResultadoGuardadoGisFraccionamiento
|
||||
{
|
||||
CveFraccionamientoEtapa = cveFraccionamientoEtapa,
|
||||
VinculosGuardados = vinculos.Count,
|
||||
VinculosGuardados = cantidadVinculosActuales,
|
||||
ArchivoGuardado = tieneArchivoCargado,
|
||||
TieneArchivo = tieneArchivo,
|
||||
NombreArchivo = tieneArchivo
|
||||
@@ -452,6 +474,12 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
{
|
||||
using (var transaccion = new TransactionLogic())
|
||||
{
|
||||
ModeloOperacionBitacora operacionBitacora = ModeloOperacionBitacora.Crear(
|
||||
"EliminarGisEtapa",
|
||||
FabricaBitacoraFraccionamiento.CrearEliminacionArchivoGisEtapa(
|
||||
contextoGis,
|
||||
cantidadVinculados));
|
||||
|
||||
DbResult<bool> resultadoLimpieza =
|
||||
_repositorio.LimpiarVinculos(
|
||||
cveFraccionamientoEtapa,
|
||||
@@ -478,7 +506,8 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
1,
|
||||
2,
|
||||
cveUsuarioEjecuta,
|
||||
nombreDominio);
|
||||
nombreDominio,
|
||||
operacionBitacora);
|
||||
|
||||
if (!resultadoEliminacionDocumento.Success)
|
||||
{
|
||||
@@ -498,10 +527,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
}
|
||||
|
||||
DbResult<long> resultadoBitacora =
|
||||
_servicioBitacora.Registrar(
|
||||
FabricaBitacoraFraccionamiento.CrearEliminacionArchivoGisEtapa(
|
||||
contextoGis,
|
||||
cantidadVinculados));
|
||||
_servicioBitacora.RegistrarOperacion(operacionBitacora);
|
||||
|
||||
if (!resultadoBitacora.Success)
|
||||
{
|
||||
@@ -686,7 +712,7 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
|
||||
{
|
||||
if (vinculos == null || vinculos.Count == 0)
|
||||
{
|
||||
return "Debe vincular los polígonos del GIS con los lotes antes de guardar.";
|
||||
return null;
|
||||
}
|
||||
|
||||
var cvesLotes = new HashSet<int>();
|
||||
|
||||
@@ -6,7 +6,7 @@ namespace SIG.Web.AppCode.Services.General
|
||||
{
|
||||
internal static class FabricaBitacoraCatalogoProducto
|
||||
{
|
||||
public static BitacoraEventoModel CrearClasificacion(
|
||||
public static ModeloRegistroBitacora CrearClasificacion(
|
||||
ModeloClasificacion anterior,
|
||||
ModeloClasificacion actual,
|
||||
int cveClasificacion,
|
||||
@@ -53,7 +53,7 @@ namespace SIG.Web.AppCode.Services.General
|
||||
return eventoBitacora;
|
||||
}
|
||||
|
||||
public static BitacoraEventoModel CrearUnidadMedida(
|
||||
public static ModeloRegistroBitacora CrearUnidadMedida(
|
||||
ModeloUnidadMedida anterior,
|
||||
ModeloUnidadMedida actual,
|
||||
int cveUnidadMedida,
|
||||
@@ -94,7 +94,7 @@ namespace SIG.Web.AppCode.Services.General
|
||||
});
|
||||
}
|
||||
|
||||
private static BitacoraEventoModel CrearEvento(
|
||||
private static ModeloRegistroBitacora CrearEvento(
|
||||
string tabla,
|
||||
string campoLlave,
|
||||
int llave,
|
||||
@@ -102,12 +102,12 @@ namespace SIG.Web.AppCode.Services.General
|
||||
string descripcion,
|
||||
IList<BitacoraCampoEventoModel> campos)
|
||||
{
|
||||
var eventoBitacora = new BitacoraEventoModel
|
||||
var eventoBitacora = new ModeloRegistroBitacora
|
||||
{
|
||||
NombreTablaSQL = tabla,
|
||||
TipoMovimiento = movimiento,
|
||||
LlaveRegistro = llave.ToString(),
|
||||
DescripcionMovimiento = descripcion,
|
||||
LlaveRegistro = llave,
|
||||
DescripcionRegistro = descripcion,
|
||||
DiscriminarCamposSinCambios = movimiento !=
|
||||
BitacoraTipoMovimiento.Agregado,
|
||||
Campos = campos
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user