Compare commits

...

16 Commits

Author SHA1 Message Date
Jorge Luis caudillo esparza
50f1ced127 update documentos 2026-10-03 23:48:31 -07:00
Jorge Luis caudillo esparza
72d0e6a589 delete documentos 2026-10-03 23:48:06 -07:00
Jorge Luis caudillo esparza
58954219c8 delete documentos 2026-10-03 23:47:43 -07:00
Jorge Luis caudillo esparza
0776ed8c59 Cambios en Gis lotes 2026-10-03 14:43:42 -07:00
Jorge Luis caudillo esparza
d2b7b982f3 Lotes 2026-10-02 14:34:16 -07:00
Jorge Luis caudillo esparza
c2f249c937 -- 2026-10-02 14:33:58 -07:00
Jorge Luis caudillo esparza
b7c80baadc Ajustes Lotes 2026-10-02 00:20:26 -07:00
Jorge Luis caudillo esparza
a2bde9e920 Ajustes visualizacion 2026-09-29 09:38:51 -07:00
Jorge Luis caudillo esparza
78a6666e5a pagos no bloquean apenas que esten vinculados al tramite y se muestran botones cmo menu se veo feo el menu se esta mejorando 2026-09-28 17:41:25 -07:00
Jorge Luis caudillo esparza
2f52c96067 gclientes fraccionamientos 2026-09-28 16:36:20 -07:00
Jorge Luis caudillo esparza
24bcb27d07 Cambios endocumentos y tramites 2026-09-28 16:20:20 -07:00
Jorge Luis caudillo esparza
16d509cf06 -- 2026-09-28 08:32:20 -07:00
Jorge Luis caudillo esparza
1daf15d92f -- 2026-09-28 08:26:04 -07:00
Jorge Luis caudillo esparza
329b8b70d4 Documentos 2026-09-27 18:18:50 -07:00
Jorge Luis caudillo esparza
e8160eefba --documentos 2026-09-27 14:44:12 -07:00
Jorge Luis caudillo esparza
275c6dfd10 Ajustes pequeños 2026-09-08 16:08:12 -07:00
405 changed files with 115880 additions and 3763 deletions

1
.gitignore vendored
View File

@@ -76,3 +76,4 @@ coverage/
*.secrets.json
Web.local.config
appsettings.local.json
/SIG.Web/Documentos/**

View File

@@ -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.
@@ -125,3 +135,7 @@ Do not add the following until the user explicitly asks:
The starter must stay small and focused: commands, master page, login, contracts, dummy user session, bundle structure, copied assets, and centralized SQL foundation.
---
REGLA OBLIGATORIA: Nunca usar args.get_panelsUpdated() ni get_panelsUpdated() en JavaScript de WebForms/UpdatePanel de este proyecto; esa llamada rompe repetidamente el entorno. Para reinicializar después de postbacks parciales usar PageRequestManager.add_endRequest(function () { ... }) sin depender de args, o eventos delegados cuando corresponda.

View File

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

View File

@@ -1,4 +1,4 @@
# AGENTS_MANTENIMIENTO_PROYECTO.md
# AGENTS_MANTENIMIENTO_PROYECTO.md
These rules complement `AGENTS.md` and are mandatory whenever the task involves commands, security, error handling, user feedback, grids, PDF migration, file delivery, verification, or project evolution.
@@ -74,6 +74,8 @@ Controlled outcomes and technical failures must use different logs.
## Grid display rules
- Los valores numéricos de negocio (hectáreas, superficies, avances, porcentajes, cantidades, importes y saldos) deben alinearse a la derecha tanto en los campos de captura como en las celdas y resúmenes donde se muestran. Usar las clases visuales existentes o la alineación del control; esta regla no convierte claves, folios ni códigos en cantidades.
- Every new or modified `asp:GridView` must declare `GridLines="None"`.
- Its `CssClass` must include the exact utility class `Widthall` so the grid uses the full available width.
- Do not add `table-bordered` to a GridView. Existing visual classes such as `table`, `table-striped`, and `table-hover` may be retained when appropriate.

View File

@@ -18,6 +18,21 @@ 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.
- No separar `ON` en una línea independiente únicamente por estilo.
- Evitar subconsultas con `SELECT` directamente dentro de un `JOIN`. Cuando la consulta relacionada sea compleja, preferir un CTE con `WITH` y realizar el `JOIN` contra ese CTE.
- Una condición extensa del `ON` puede continuar en líneas adicionales, alineando cada `AND` para conservar la legibilidad.
## Parámetros y resultado obligatorios
Todos los procedimientos deben declarar:

View File

@@ -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`.
---
@@ -177,6 +177,12 @@ Do not mix placeholder naming systems in the same project.
- When a postback needs to recover related values from an already loaded catalog, store the typed serializable object list in a typed `ViewState` property and locate the selected object by its key.
- Do not copy server-owned catalog or model values into HTML `data-*` attributes, CSS classes, hidden fields, or other client-controlled markup merely to recover them during a postback. Read them from the typed object list stored in `ViewState`.
### Server-control visibility rules
- Never use the effective `Visible` property of an ASP.NET server control as business or page state, as an `if` condition, or as the input used to mutate another control or object. An invisible ancestor causes every descendant to report `Visible == false`, regardless of the value assigned directly to that descendant.
- Calculate visibility in independent, clearly named Boolean variables or a typed state model. Use those values both for decisions and for assigning each control's `Visible` property.
- When configuring children of a server container that starts hidden, make the parent container visible before assigning child visibility. After assigning the children, hide the parent again only when the independent visibility values indicate that none of its children should be rendered.
---
## Login and session rules
@@ -358,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.
@@ -373,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.
@@ -412,4 +420,3 @@ Rules:
- The home page must use `Site.master`.
---

View File

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

File diff suppressed because it is too large Load Diff

View 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

View 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
);

View File

@@ -0,0 +1,649 @@
/*
Preparado a partir de las definiciones instaladas; no ejecutado.
Instalar junto con la aplicación. No modifica conceptos, recibos ni pagos.
CveSolicitud se conserva únicamente como referencia histórica.
Los convenios históricos sin una solicitud conservan CveTipoTramite NULL:
su asignación requiere una decisión de negocio; no se elige un trámite arbitrario.
*/
SET NOCOUNT ON;
IF COL_LENGTH('dbo.Convenios', 'CveTipoTramite') IS NULL
ALTER TABLE dbo.Convenios ADD CveTipoTramite int NULL;
GO
UPDATE C
SET CveTipoTramite = S.CveTipoTramite
FROM dbo.Convenios AS C
INNER JOIN dbo.Tra_Solicitudes AS S ON S.CveSolicitud = C.CveSolicitud
WHERE C.CveTipoTramite IS NULL;
IF NOT EXISTS
(
SELECT 1
FROM sys.foreign_keys
WHERE name = 'FK_Convenios_TipoTramite'
)
ALTER TABLE dbo.Convenios WITH CHECK
ADD CONSTRAINT FK_Convenios_TipoTramite
FOREIGN KEY (CveTipoTramite)
REFERENCES dbo.Tra_TiposTramite (CveTipoTramite);
IF NOT EXISTS
(
SELECT 1
FROM sys.indexes
WHERE object_id = OBJECT_ID('dbo.Convenios')
AND name = 'IX_Convenios_Etapa_TipoTramite'
)
CREATE INDEX IX_Convenios_Etapa_TipoTramite
ON dbo.Convenios (CveFraccionamientoEtapa, CveTipoTramite);
DECLARE @QuitarRelacion nvarchar(max) = N'';
SELECT @QuitarRelacion = @QuitarRelacion
+ N'ALTER TABLE dbo.Convenios DROP CONSTRAINT ' + QUOTENAME(F.name) + N';'
FROM sys.foreign_keys AS F
WHERE F.parent_object_id = OBJECT_ID('dbo.Convenios')
AND F.referenced_object_id = OBJECT_ID('dbo.Tra_Solicitudes');
IF @QuitarRelacion <> N''
EXEC sys.sp_executesql @QuitarRelacion;
-- Resultado de diagnóstico; no cambia la clasificación de estos convenios.
SELECT CveConvenio, NumeroConvenio, CveFraccionamientoEtapa
FROM dbo.Convenios
WHERE CveTipoTramite IS NULL;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ConvenioAdd
@CveCliente int,
@CveFraccionamientoEtapa int,
@CveTipoTramite int,
@NumeroConvenio varchar(100),
@NumeroOficio varchar(100) = NULL,
@ViviendasAutorizadas int = NULL,
@ViviendasEnConvenio int,
@ViviendasPendientes int = NULL,
@ViviendasContratadas int = NULL,
@FechaConvenio date,
@Observaciones varchar(1000) = NULL,
@ConceptosXml xml,
@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
SET @NumeroConvenio = NULLIF(LTRIM(RTRIM(@NumeroConvenio)), '');
SET @NumeroOficio = NULLIF(LTRIM(RTRIM(@NumeroOficio)), '');
SET @Observaciones = NULLIF(LTRIM(RTRIM(@Observaciones)), '');
IF @CveCliente <= 0
BEGIN
SET @ErrorMostrar = 'Seleccione el desarrollador del convenio.';
SET @ErrorTipo = 2;
RETURN;
END;
IF @CveFraccionamientoEtapa <= 0
BEGIN
SET @ErrorMostrar = 'Seleccione el fraccionamiento y etapa del convenio.';
SET @ErrorTipo = 2;
RETURN;
END;
IF ISNULL(@CveTipoTramite, 0) <= 0
BEGIN
SET @ErrorMostrar = 'Seleccione el tipo de trámite del convenio.';
SET @ErrorTipo = 2;
RETURN;
END;
IF @NumeroConvenio IS NULL
BEGIN
SET @ErrorMostrar = 'Capture el número de convenio.';
SET @ErrorTipo = 2;
RETURN;
END;
IF @ViviendasEnConvenio < 0
OR ISNULL(@ViviendasAutorizadas, 0) < 0
OR ISNULL(@ViviendasPendientes, 0) < 0
OR ISNULL(@ViviendasContratadas, 0) < 0
BEGIN
SET @ErrorMostrar = 'Las cantidades de viviendas no son válidas.';
SET @ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1
FROM dbo.FraccionamientosEtapas AS E
INNER JOIN dbo.Fraccionamientos AS F ON F.CveFraccionamiento = E.CveFraccionamiento
WHERE E.CveFraccionamientoEtapa = @CveFraccionamientoEtapa
AND F.CveCliente = @CveCliente
)
BEGIN
SET @ErrorMostrar = 'La etapa seleccionada no pertenece al desarrollador indicado.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Convenios AS C
WHERE C.NumeroConvenio = @NumeroConvenio
)
BEGIN
SET @ErrorMostrar = 'Ya existe un convenio con ese número.';
SET @ErrorTipo = 2;
RETURN;
END;
DECLARE @Conceptos TABLE
(
Orden int NOT NULL PRIMARY KEY,
CveConvenioConcepto int NOT NULL,
Importe decimal(18,6) NOT NULL,
Tipo varchar(20) NOT NULL,
NumeroPagos int NOT NULL
);
DECLARE @Recibos TABLE
(
OrdenConcepto int NOT NULL,
Orden int NOT NULL,
Importe decimal(18,6) NOT NULL,
FechaVencimiento date NOT NULL,
Estatus varchar(30) NOT NULL,
PRIMARY KEY (OrdenConcepto, Orden)
);
IF @ConceptosXml IS NOT NULL
BEGIN
INSERT INTO @Conceptos
(
Orden,
CveConvenioConcepto,
Importe,
Tipo,
NumeroPagos
)
SELECT
C.value('@Orden', 'int'),
C.value('@CveConvenioConcepto', 'int'),
C.value('@Importe', 'decimal(18,6)'),
C.value('@Tipo', 'varchar(20)'),
C.value('@NumeroPagos', 'int')
FROM @ConceptosXml.nodes('/Conceptos/Concepto') AS X(C);
INSERT INTO @Recibos
(
OrdenConcepto,
Orden,
Importe,
FechaVencimiento,
Estatus
)
SELECT
C.value('@Orden', 'int'),
R.value('@Orden', 'int'),
R.value('@Importe', 'decimal(18,6)'),
R.value('@FechaVencimiento', 'date'),
COALESCE(
NULLIF(R.value('@Estatus', 'varchar(30)'), ''),
'PENDIENTE'
)
FROM @ConceptosXml.nodes('/Conceptos/Concepto') AS CX(C)
CROSS APPLY C.nodes('Recibos/Recibo') AS RX(R);
END;
IF NOT EXISTS (SELECT 1 FROM @Conceptos)
BEGIN
SET @ErrorMostrar = 'Agregue al menos un concepto al convenio.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM @Conceptos AS C
LEFT JOIN dbo.ConveniosConceptos AS CC ON CC.CveConvenioConcepto = C.CveConvenioConcepto
AND CC.EsActivo = 1
WHERE CC.CveConvenioConcepto IS NULL
OR C.Importe <= 0
OR NULLIF(LTRIM(RTRIM(C.Tipo)), '') IS NULL
OR C.NumeroPagos NOT BETWEEN 1 AND 12
)
BEGIN
SET @ErrorMostrar = 'Uno de los conceptos del convenio no es válido.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM @Recibos AS R
WHERE R.Importe <= 0
OR R.FechaVencimiento IS NULL
)
BEGIN
SET @ErrorMostrar = 'Todas las parcialidades deben tener importe y vencimiento válidos.';
SET @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM @Conceptos AS C
OUTER APPLY
(
SELECT
COUNT(*) AS NumeroRecibos,
SUM(R.Importe) AS ImporteRecibos
FROM @Recibos AS R
WHERE R.OrdenConcepto = C.Orden
) AS R
WHERE ISNULL(R.NumeroRecibos, 0) <> C.NumeroPagos
OR ISNULL(R.ImporteRecibos, 0) <> C.Importe
)
BEGIN
SET @ErrorMostrar =
'La cantidad y suma de las parcialidades debe coincidir con cada concepto.';
SET @ErrorTipo = 2;
RETURN;
END;
INSERT INTO dbo.Convenios
(
CveCliente,
NumeroConvenio,
NumeroOficio,
CveFraccionamientoEtapa,
CveTipoTramite,
ViviendasAutorizadas,
ViviendasEnConvenio,
ViviendasPendientes,
ViviendasContratadas,
FechaConvenio,
Observaciones,
Estatus,
CveConvenioOrigen,
CveUsuario
)
VALUES
(
@CveCliente,
@NumeroConvenio,
@NumeroOficio,
@CveFraccionamientoEtapa,
@CveTipoTramite,
@ViviendasAutorizadas,
@ViviendasEnConvenio,
@ViviendasPendientes,
@ViviendasContratadas,
@FechaConvenio,
@Observaciones,
'ACTIVO',
NULL,
@CveUsuarioEjecuta
);
DECLARE @CveConvenio int = CONVERT(int, SCOPE_IDENTITY());
DECLARE @OrdenConcepto int = 0;
DECLARE @CveConvenioConcepto int;
DECLARE @ImporteConcepto decimal(18,6);
DECLARE @Tipo varchar(20);
DECLARE @NumeroPagos int;
DECLARE @CveConvenioDetalle int;
WHILE EXISTS
(
SELECT 1
FROM @Conceptos
WHERE Orden > @OrdenConcepto
)
BEGIN
SELECT TOP (1)
@OrdenConcepto = C.Orden,
@CveConvenioConcepto = C.CveConvenioConcepto,
@ImporteConcepto = C.Importe,
@Tipo = C.Tipo,
@NumeroPagos = C.NumeroPagos
FROM @Conceptos AS C
WHERE C.Orden > @OrdenConcepto
ORDER BY C.Orden;
INSERT INTO dbo.ConveniosDetalle
(
CveConvenio,
CveConvenioConcepto,
Importe,
Tipo,
NumeroPagos,
Observaciones
)
VALUES
(
@CveConvenio,
@CveConvenioConcepto,
@ImporteConcepto,
@Tipo,
@NumeroPagos,
NULL
);
SET @CveConvenioDetalle = CONVERT(int, SCOPE_IDENTITY());
INSERT INTO dbo.ConveniosRecibos
(
CveConvenioDetalle,
NumeroRecibo,
Importe,
FechaVencimiento,
Estatus
)
SELECT
@CveConvenioDetalle,
CONCAT(
'RD',
CONVERT(char(8), GETDATE(), 112),
@CveConvenio,
'-',
RIGHT('000' + CONVERT(varchar(3), @OrdenConcepto), 3),
'-',
RIGHT('000' + CONVERT(varchar(3), R.Orden), 3)
),
R.Importe,
R.FechaVencimiento,
R.Estatus
FROM @Recibos AS R
WHERE R.OrdenConcepto = @OrdenConcepto
ORDER BY R.Orden;
END;
SELECT @CveConvenio AS CveConvenio;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar =
'Ocurrió un error al guardar el convenio; 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_ConvenioAdd'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
/*
Se vuelven a definir List/Get únicamente para alinear la salida
con Clientes.Nombre y devolver el encabezado completo del modal.
*/
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ConvenioList
@CveTipoTramite int = NULL,
@CveCliente int = NULL,
@CveFraccionamiento int = NULL,
@CveFraccionamientoEtapa int = NULL,
@Estatus varchar(30) = NULL,
@ConSaldoPendiente bit = NULL,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@ErrorMostrar = NULL,
@ErrorTipo = 0,
@Return = 0;
BEGIN TRY
;WITH PagadoRecibo AS
(
SELECT
PR.CveConvenioRecibo,
SUM(PR.ImporteAplicado) AS ImportePagado
FROM dbo.ConveniosPagosRecibos AS PR
GROUP BY PR.CveConvenioRecibo
),
Totales AS
(
SELECT
D.CveConvenio,
SUM(R.Importe) AS ImporteConvenio,
SUM(ISNULL(P.ImportePagado, 0)) AS ImportePagado,
SUM(R.Importe - ISNULL(P.ImportePagado, 0)) AS SaldoPendiente,
MAX(CASE WHEN P.CveConvenioRecibo IS NULL THEN 0 ELSE 1 END) AS TienePagos
FROM dbo.ConveniosDetalle AS D
LEFT JOIN dbo.ConveniosRecibos AS R ON R.CveConvenioDetalle = D.CveConvenioDetalle
LEFT JOIN PagadoRecibo AS P ON P.CveConvenioRecibo = R.CveConvenioRecibo
GROUP BY D.CveConvenio
)
SELECT
C.CveConvenio,
C.CveTipoTramite,
TT.TipoTramite,
C.CveCliente,
CL.Nombre AS Cliente,
F.CveFraccionamiento,
F.Fraccionamiento,
FE.CveFraccionamientoEtapa,
FE.Etapa,
C.NumeroConvenio,
C.NumeroOficio,
C.Estatus,
C.FechaConvenio,
ISNULL(T.ImporteConvenio, 0) AS ImporteConvenio,
ISNULL(T.ImportePagado, 0) AS ImportePagado,
ISNULL(T.SaldoPendiente, 0) AS SaldoPendiente,
CONVERT(bit, ISNULL(T.TienePagos, 0)) AS TienePagos
FROM dbo.Convenios AS C
LEFT JOIN dbo.Tra_TiposTramite AS TT ON TT.CveTipoTramite = C.CveTipoTramite
INNER JOIN dbo.FraccionamientosEtapas AS FE ON FE.CveFraccionamientoEtapa = C.CveFraccionamientoEtapa
INNER JOIN dbo.Fraccionamientos AS F ON F.CveFraccionamiento = FE.CveFraccionamiento
INNER JOIN dbo.Clientes AS CL ON CL.CveCliente = C.CveCliente
LEFT JOIN Totales AS T ON T.CveConvenio = C.CveConvenio
WHERE (@CveCliente IS NULL OR C.CveCliente = @CveCliente)
AND (@CveTipoTramite IS NULL OR C.CveTipoTramite = @CveTipoTramite)
AND (@CveFraccionamiento IS NULL OR F.CveFraccionamiento = @CveFraccionamiento)
AND (@CveFraccionamientoEtapa IS NULL OR C.CveFraccionamientoEtapa = @CveFraccionamientoEtapa)
AND (NULLIF(@Estatus, '') IS NULL OR C.Estatus = @Estatus)
AND
(
@ConSaldoPendiente IS NULL
OR @ConSaldoPendiente = CASE
WHEN ISNULL(T.SaldoPendiente, 0) > 0 THEN 1
ELSE 0
END
)
ORDER BY
C.FechaConvenio DESC,
C.CveConvenio DESC;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar =
'Ocurrió un error al consultar los convenios; 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_ConvenioList'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ConvenioGet
@CveConvenio 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 NOT EXISTS
(
SELECT 1
FROM dbo.Convenios
WHERE CveConvenio = @CveConvenio
)
BEGIN
SET @ErrorMostrar = 'No se encontró el convenio solicitado.';
SET @ErrorTipo = 2;
RETURN;
END;
;WITH PagadoRecibo AS
(
SELECT
PR.CveConvenioRecibo,
SUM(PR.ImporteAplicado) AS ImportePagado
FROM dbo.ConveniosPagosRecibos AS PR
GROUP BY PR.CveConvenioRecibo
),
Totales AS
(
SELECT
D.CveConvenio,
SUM(R.Importe) AS ImporteConvenio,
SUM(ISNULL(P.ImportePagado, 0)) AS ImportePagado,
SUM(R.Importe - ISNULL(P.ImportePagado, 0)) AS SaldoPendiente
FROM dbo.ConveniosDetalle AS D
LEFT JOIN dbo.ConveniosRecibos AS R ON R.CveConvenioDetalle = D.CveConvenioDetalle
LEFT JOIN PagadoRecibo AS P ON P.CveConvenioRecibo = R.CveConvenioRecibo
GROUP BY D.CveConvenio
)
SELECT
C.CveConvenio,
C.CveTipoTramite,
TT.TipoTramite,
C.CveCliente,
C.CveFraccionamientoEtapa,
C.NumeroConvenio,
C.NumeroOficio,
CL.Nombre AS Cliente,
F.Fraccionamiento,
FE.Etapa,
C.Estatus,
C.FechaConvenio,
C.ViviendasAutorizadas,
C.ViviendasEnConvenio,
C.ViviendasPendientes,
C.ViviendasContratadas,
C.Observaciones,
ISNULL(T.ImporteConvenio, 0) AS ImporteConvenio,
ISNULL(T.ImportePagado, 0) AS ImportePagado,
ISNULL(T.SaldoPendiente, 0) AS SaldoPendiente
FROM dbo.Convenios AS C
LEFT JOIN dbo.Tra_TiposTramite AS TT ON TT.CveTipoTramite = C.CveTipoTramite
INNER JOIN dbo.FraccionamientosEtapas AS FE ON FE.CveFraccionamientoEtapa = C.CveFraccionamientoEtapa
INNER JOIN dbo.Fraccionamientos AS F ON F.CveFraccionamiento = FE.CveFraccionamiento
INNER JOIN dbo.Clientes AS CL ON CL.CveCliente = C.CveCliente
LEFT JOIN Totales AS T ON T.CveConvenio = C.CveConvenio
WHERE C.CveConvenio = @CveConvenio;
SELECT
D.CveConvenioDetalle,
D.CveConvenioConcepto,
CC.Concepto,
D.Importe,
D.Tipo,
D.NumeroPagos
FROM dbo.ConveniosDetalle AS D
INNER JOIN dbo.ConveniosConceptos AS CC ON CC.CveConvenioConcepto = D.CveConvenioConcepto
WHERE D.CveConvenio = @CveConvenio
ORDER BY D.CveConvenioDetalle;
;WITH Pagado AS
(
SELECT
PR.CveConvenioRecibo,
SUM(PR.ImporteAplicado) AS ImportePagado
FROM dbo.ConveniosPagosRecibos AS PR
GROUP BY PR.CveConvenioRecibo
)
SELECT
R.CveConvenioRecibo,
R.CveConvenioDetalle,
R.NumeroRecibo,
R.Importe,
ISNULL(P.ImportePagado, 0) AS ImportePagado,
R.Importe - ISNULL(P.ImportePagado, 0) AS SaldoPendiente,
R.FechaVencimiento,
R.Estatus
FROM dbo.ConveniosRecibos AS R
INNER JOIN dbo.ConveniosDetalle AS D ON D.CveConvenioDetalle = R.CveConvenioDetalle
LEFT JOIN Pagado AS P ON P.CveConvenioRecibo = R.CveConvenioRecibo
WHERE D.CveConvenio = @CveConvenio
ORDER BY
R.CveConvenioDetalle,
R.FechaVencimiento,
R.CveConvenioRecibo;
SET @Return = 1;
END TRY
BEGIN CATCH
SET @ErrorMostrar =
'Ocurrió un error al consultar el detalle del convenio; 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_ConvenioGet'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO

View File

@@ -0,0 +1,146 @@
/*
Consolidación de documentos compartidos por etapa y tipo de documento.
Preparado para revisión; no ejecutado.
Requiere la migración Etapa_TipoTramite_20261002 ya instalada.
Ejecutar estructura y procedimientos en la misma transacción de instalación,
detenerse ante errores y confirmar sólo tras verificar los resultados.
No borra archivos ni filas históricas de documentos.
Las copias idénticas quedan como versiones históricas; se conserva una vigente.
Las configuraciones particulares idénticas se consolidan en una por etapa.
Si hubo ediciones diferentes por trámite, se detiene para no elegir una
aprobación, nota o marca de requerido arbitraria.
Convenios no se modifican.
*/
SET NOCOUNT ON;
IF @@TRANCOUNT = 0
THROW 51000, 'Abrir una transacción de instalación antes de ejecutar y revertirla ante cualquier error.', 1;
IF EXISTS
(
SELECT 1
FROM dbo.Tra_DocumentosSolicitud AS D
INNER JOIN dbo.Tra_DocumentosSolicitud AS O ON O.CveFraccionamientoEtapa = D.CveFraccionamientoEtapa
AND O.CveTipoDocumento = D.CveTipoDocumento
AND O.CveDocumentoSolicitud < D.CveDocumentoSolicitud
WHERE D.EsActivo = 1
AND O.EsActivo = 1
AND EXISTS
(
SELECT D.NombreArchivo, D.NombreArchivoFisico, D.RutaArchivo,
D.ContentType, D.TamanoBytes, D.ComentarioCliente,
D.ComentarioAdministrativo, D.EsAprobado, D.CveUsuarioCarga,
D.CveUsuarioRevisa, D.FechaRevision, D.FechaAlta, D.UltimaNota,
D.FechaDocumento, D.FechaVencimiento, D.Vencido
EXCEPT
SELECT O.NombreArchivo, O.NombreArchivoFisico, O.RutaArchivo,
O.ContentType, O.TamanoBytes, O.ComentarioCliente,
O.ComentarioAdministrativo, O.EsAprobado, O.CveUsuarioCarga,
O.CveUsuarioRevisa, O.FechaRevision, O.FechaAlta, O.UltimaNota,
O.FechaDocumento, O.FechaVencimiento, O.Vencido
)
)
THROW 51000, 'Hay versiones vigentes con datos distintos por trámite. Revisarlas antes de consolidar; no se eliminaron documentos.', 1;
IF EXISTS
(
SELECT 1
FROM dbo.Tra_SolicitudDocumentoConfiguracion
GROUP BY CveFraccionamientoEtapa, CveTipoDocumento
HAVING MIN(CONVERT(int, EsRequerido)) <> MAX(CONVERT(int, EsRequerido))
OR MIN(CONVERT(int, EsCliente)) <> MAX(CONVERT(int, EsCliente))
OR MIN(CONVERT(int, TieneVigencia)) <> MAX(CONVERT(int, TieneVigencia))
OR MIN(CONVERT(int, EsActivo)) <> MAX(CONVERT(int, EsActivo))
OR MIN(Orden) <> MAX(Orden)
)
THROW 51000, 'Hay configuraciones manuales distintas por trámite. Resolverlas antes de consolidar la marca de la etapa.', 1;
IF EXISTS
(
SELECT 1 FROM sys.indexes
WHERE object_id = OBJECT_ID('dbo.Tra_DocumentosSolicitud')
AND name = 'UX_Tra_DocumentosSolicitud_Etapa_Tramite_Documento'
)
DROP INDEX UX_Tra_DocumentosSolicitud_Etapa_Tramite_Documento
ON dbo.Tra_DocumentosSolicitud;
IF EXISTS
(
SELECT 1 FROM sys.indexes
WHERE object_id = OBJECT_ID('dbo.Tra_SolicitudDocumentoConfiguracion')
AND name = 'UX_Tra_ConfiguracionDocumento_Etapa_Tramite_Documento'
)
DROP INDEX UX_Tra_ConfiguracionDocumento_Etapa_Tramite_Documento
ON dbo.Tra_SolicitudDocumentoConfiguracion;
-- Las columnas se conservan por compatibilidad de esquema; ya no son propietarias.
ALTER TABLE dbo.Tra_DocumentosSolicitud ALTER COLUMN CveTipoTramite int NULL;
ALTER TABLE dbo.Tra_SolicitudDocumentoConfiguracion ALTER COLUMN CveTipoTramite int NULL;
;WITH Versiones AS
(
SELECT
CveDocumentoSolicitud,
ROW_NUMBER() OVER
(
PARTITION BY CveFraccionamientoEtapa, CveTipoDocumento
ORDER BY CveDocumentoSolicitud
) AS NumeroVersion
FROM dbo.Tra_DocumentosSolicitud
WHERE EsActivo = 1
)
UPDATE D
SET EsActivo = 0
FROM dbo.Tra_DocumentosSolicitud AS D
INNER JOIN Versiones AS V ON V.CveDocumentoSolicitud = D.CveDocumentoSolicitud
WHERE V.NumeroVersion > 1;
-- Sólo se retiran copias de configuración cuyos valores son idénticos.
;WITH Configuraciones AS
(
SELECT
CveConfiguracionDocumento,
ROW_NUMBER() OVER
(
PARTITION BY CveFraccionamientoEtapa, CveTipoDocumento
ORDER BY CveConfiguracionDocumento
) AS NumeroConfiguracion
FROM dbo.Tra_SolicitudDocumentoConfiguracion
)
DELETE C
FROM dbo.Tra_SolicitudDocumentoConfiguracion AS C
INNER JOIN Configuraciones AS O ON O.CveConfiguracionDocumento = C.CveConfiguracionDocumento
WHERE O.NumeroConfiguracion > 1;
UPDATE dbo.Tra_DocumentosSolicitud
SET CveTipoTramite = NULL
WHERE CveTipoTramite IS NOT NULL;
UPDATE dbo.Tra_SolicitudDocumentoConfiguracion
SET CveTipoTramite = NULL
WHERE CveTipoTramite IS NOT 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 NOT EXISTS
(
SELECT 1 FROM sys.indexes
WHERE object_id = OBJECT_ID('dbo.Tra_SolicitudDocumentoConfiguracion')
AND name = 'UX_Tra_ConfiguracionDocumento_Etapa_Documento'
)
CREATE UNIQUE INDEX UX_Tra_ConfiguracionDocumento_Etapa_Documento
ON dbo.Tra_SolicitudDocumentoConfiguracion (CveFraccionamientoEtapa, CveTipoDocumento);
IF EXISTS (SELECT 1 FROM sys.foreign_keys WHERE name = 'FK_Tra_DocumentosSolicitud_TipoTramite')
ALTER TABLE dbo.Tra_DocumentosSolicitud DROP CONSTRAINT FK_Tra_DocumentosSolicitud_TipoTramite;
IF EXISTS (SELECT 1 FROM sys.foreign_keys WHERE name = 'FK_Tra_ConfiguracionDocumento_TipoTramite')
ALTER TABLE dbo.Tra_SolicitudDocumentoConfiguracion DROP CONSTRAINT FK_Tra_ConfiguracionDocumento_TipoTramite;

File diff suppressed because it is too large Load Diff

View 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

View 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.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,340 @@
/*
Preparación únicamente; no ejecutado.
Requiere Documentos_Etapa_Estructura_20260927.sql ya instalado.
Instalar estructura, procedimientos y aplicación en una ventana coordinada.
El ejecutor debe abrir una transacción, detenerse y revertir ante cualquier
error, y confirmar sólo después de instalar y verificar todos los scripts.
Los registros sin solicitud se conservan en todos los tipos activos aplicables.
Se duplica únicamente la metadata: archivos, fechas, revisiones y versiones
conservan su contenido. El identificador original queda en el menor tipo;
no significa que ese tipo tenga prioridad funcional.
GIS histórico 2 se normaliza al documento configurado 1016 / trámite 12.
Las asignaciones directas existentes no vuelven a expandirse al reinstalar.
*/
SET NOCOUNT ON;
IF @@TRANCOUNT = 0
THROW 51000, 'Abrir una transacción de instalación antes de ejecutar este script y revertirla ante cualquier error.', 1;
SELECT
D.CveDocumentoSolicitud,
D.CveFraccionamientoEtapa,
CASE WHEN D.CveTipoDocumento = 2 THEN 1016 ELSE D.CveTipoDocumento END AS CveTipoDocumento,
S.CveTipoTramite AS TipoSolicitud,
CONVERT(int, NULL) AS TipoDirecto
INTO #OrigenDocumentos
FROM dbo.Tra_DocumentosSolicitud AS D
LEFT JOIN dbo.Tra_Solicitudes AS S ON S.CveSolicitud = D.CveSolicitud;
IF COL_LENGTH('dbo.Tra_DocumentosSolicitud', 'CveTipoTramite') IS NOT NULL
EXEC sys.sp_executesql N'
UPDATE O
SET TipoDirecto = D.CveTipoTramite,
CveTipoDocumento = D.CveTipoDocumento
FROM #OrigenDocumentos AS O
INNER JOIN dbo.Tra_DocumentosSolicitud AS D ON D.CveDocumentoSolicitud = O.CveDocumentoSolicitud
WHERE D.CveTipoTramite IS NOT NULL;';
SELECT DISTINCT
O.CveDocumentoSolicitud,
O.CveFraccionamientoEtapa,
O.CveTipoDocumento,
COALESCE(O.TipoDirecto, O.TipoSolicitud, T.CveTipoTramite) AS CveTipoTramite
INTO #TiposDocumentos
FROM #OrigenDocumentos AS O
LEFT JOIN dbo.Tra_TiposTramiteDocumento AS T ON T.CveTipoDocumento = O.CveTipoDocumento
AND T.EsActivo = 1
AND O.TipoDirecto IS NULL
AND O.TipoSolicitud IS NULL;
IF EXISTS (SELECT 1 FROM #TiposDocumentos WHERE CveTipoTramite IS NULL)
BEGIN
SELECT *
FROM #TiposDocumentos
WHERE CveTipoTramite IS NULL;
THROW 51000, 'Hay documentos sin tipo de trámite aplicable. Resolver su correspondencia y revertir la instalación.', 1;
END;
SELECT
D.CveConfiguracionDocumento,
D.CveFraccionamientoEtapa,
CASE WHEN D.CveTipoDocumento = 2 THEN 1016 ELSE D.CveTipoDocumento END AS CveTipoDocumento,
S.CveTipoTramite AS TipoSolicitud,
CONVERT(int, NULL) AS TipoDirecto
INTO #OrigenConfiguraciones
FROM dbo.Tra_SolicitudDocumentoConfiguracion AS D
LEFT JOIN dbo.Tra_Solicitudes AS S ON S.CveSolicitud = D.CveSolicitud;
IF COL_LENGTH('dbo.Tra_SolicitudDocumentoConfiguracion', 'CveTipoTramite') IS NOT NULL
EXEC sys.sp_executesql N'
UPDATE O
SET TipoDirecto = D.CveTipoTramite,
CveTipoDocumento = D.CveTipoDocumento
FROM #OrigenConfiguraciones AS O
INNER JOIN dbo.Tra_SolicitudDocumentoConfiguracion AS D ON D.CveConfiguracionDocumento = O.CveConfiguracionDocumento
WHERE D.CveTipoTramite IS NOT NULL;';
SELECT DISTINCT
O.CveConfiguracionDocumento,
O.CveFraccionamientoEtapa,
O.CveTipoDocumento,
COALESCE(O.TipoDirecto, O.TipoSolicitud, T.CveTipoTramite) AS CveTipoTramite
INTO #TiposConfiguraciones
FROM #OrigenConfiguraciones AS O
LEFT JOIN dbo.Tra_TiposTramiteDocumento AS T ON T.CveTipoDocumento = O.CveTipoDocumento
AND T.EsActivo = 1
AND O.TipoDirecto IS NULL
AND O.TipoSolicitud IS NULL;
IF EXISTS (SELECT 1 FROM #TiposConfiguraciones WHERE CveTipoTramite IS NULL)
BEGIN
SELECT *
FROM #TiposConfiguraciones
WHERE CveTipoTramite IS NULL;
THROW 51000, 'Hay configuraciones sin tipo de trámite aplicable. Resolver su correspondencia y revertir la instalación.', 1;
END;
-- Nunca reemplazar una configuración específica con otra compartida.
IF EXISTS
(
SELECT 1
FROM #TiposConfiguraciones
GROUP BY CveFraccionamientoEtapa, CveTipoTramite, CveTipoDocumento
HAVING COUNT(*) > 1
)
BEGIN
SELECT CveFraccionamientoEtapa, CveTipoTramite, CveTipoDocumento
FROM #TiposConfiguraciones
GROUP BY CveFraccionamientoEtapa, CveTipoTramite, CveTipoDocumento
HAVING COUNT(*) > 1;
THROW 51000, 'Hay configuraciones que convergen al mismo destino. Resolverlas conservando sus valores antes de instalar.', 1;
END;
IF EXISTS
(
SELECT 1
FROM #TiposDocumentos AS T
INNER JOIN dbo.Tra_DocumentosSolicitud AS D ON D.CveDocumentoSolicitud = T.CveDocumentoSolicitud
WHERE D.EsActivo = 1
GROUP BY T.CveFraccionamientoEtapa, T.CveTipoTramite, T.CveTipoDocumento
HAVING COUNT(*) > 1
)
THROW 51000, 'Hay versiones vigentes que convergen al mismo destino. Resolver su vigencia antes de instalar.', 1;
IF EXISTS
(
SELECT 1
FROM sys.indexes
WHERE object_id = OBJECT_ID('dbo.Tra_DocumentosSolicitud')
AND name = 'UX_Tra_DocumentosSolicitud_Etapa_TipoDocumento'
)
DROP INDEX UX_Tra_DocumentosSolicitud_Etapa_TipoDocumento ON dbo.Tra_DocumentosSolicitud;
IF EXISTS
(
SELECT 1
FROM sys.indexes
WHERE object_id = OBJECT_ID('dbo.Tra_SolicitudDocumentoConfiguracion')
AND name = 'UX_Tra_ConfiguracionDocumento_Solicitud'
)
DROP INDEX UX_Tra_ConfiguracionDocumento_Solicitud ON dbo.Tra_SolicitudDocumentoConfiguracion;
IF EXISTS
(
SELECT 1
FROM sys.indexes
WHERE object_id = OBJECT_ID('dbo.Tra_SolicitudDocumentoConfiguracion')
AND name = 'UX_Tra_ConfiguracionDocumento_Etapa'
)
DROP INDEX UX_Tra_ConfiguracionDocumento_Etapa ON dbo.Tra_SolicitudDocumentoConfiguracion;
IF COL_LENGTH('dbo.Tra_DocumentosSolicitud', 'CveTipoTramite') IS NULL
ALTER TABLE dbo.Tra_DocumentosSolicitud ADD CveTipoTramite int NULL;
-- El SQL dinámico compila después de agregar la columna.
EXEC sys.sp_executesql N'
;WITH DestinoOriginal AS
(
SELECT CveDocumentoSolicitud, MIN(CveTipoTramite) AS CveTipoTramite
FROM #TiposDocumentos
GROUP BY CveDocumentoSolicitud
)
UPDATE D
SET CveTipoTramite = T.CveTipoTramite,
CveTipoDocumento = T.CveTipoDocumento
FROM dbo.Tra_DocumentosSolicitud AS D
INNER JOIN DestinoOriginal AS O ON O.CveDocumentoSolicitud = D.CveDocumentoSolicitud
INNER JOIN #TiposDocumentos AS T ON T.CveDocumentoSolicitud = O.CveDocumentoSolicitud
AND T.CveTipoTramite = O.CveTipoTramite;
INSERT INTO dbo.Tra_DocumentosSolicitud
(
CveFraccionamientoEtapa,
CveTipoDocumento,
CveTipoTramite,
CveSolicitud,
NombreArchivo,
NombreArchivoFisico,
RutaArchivo,
ContentType,
TamanoBytes,
ComentarioCliente,
ComentarioAdministrativo,
EsAprobado,
CveUsuarioCarga,
CveUsuarioRevisa,
FechaRevision,
FechaAlta,
UltimaNota,
FechaDocumento,
FechaVencimiento,
EsActivo,
Vencido
)
SELECT
T.CveFraccionamientoEtapa,
T.CveTipoDocumento,
T.CveTipoTramite,
D.CveSolicitud,
D.NombreArchivo,
D.NombreArchivoFisico,
D.RutaArchivo,
D.ContentType,
D.TamanoBytes,
D.ComentarioCliente,
D.ComentarioAdministrativo,
D.EsAprobado,
D.CveUsuarioCarga,
D.CveUsuarioRevisa,
D.FechaRevision,
D.FechaAlta,
D.UltimaNota,
D.FechaDocumento,
D.FechaVencimiento,
D.EsActivo,
D.Vencido
FROM dbo.Tra_DocumentosSolicitud AS D
INNER JOIN #TiposDocumentos AS T ON T.CveDocumentoSolicitud = D.CveDocumentoSolicitud
WHERE T.CveTipoTramite <> D.CveTipoTramite;
ALTER TABLE dbo.Tra_DocumentosSolicitud ALTER COLUMN CveTipoTramite int NOT NULL;';
IF COL_LENGTH('dbo.Tra_SolicitudDocumentoConfiguracion', 'CveTipoTramite') IS NULL
ALTER TABLE dbo.Tra_SolicitudDocumentoConfiguracion ADD CveTipoTramite int NULL;
-- El SQL dinámico compila después de agregar la columna.
EXEC sys.sp_executesql N'
;WITH DestinoOriginal AS
(
SELECT CveConfiguracionDocumento, MIN(CveTipoTramite) AS CveTipoTramite
FROM #TiposConfiguraciones
GROUP BY CveConfiguracionDocumento
)
UPDATE D
SET CveTipoTramite = T.CveTipoTramite,
CveTipoDocumento = T.CveTipoDocumento
FROM dbo.Tra_SolicitudDocumentoConfiguracion AS D
INNER JOIN DestinoOriginal AS O ON O.CveConfiguracionDocumento = D.CveConfiguracionDocumento
INNER JOIN #TiposConfiguraciones AS T ON T.CveConfiguracionDocumento = O.CveConfiguracionDocumento
AND T.CveTipoTramite = O.CveTipoTramite;
INSERT INTO dbo.Tra_SolicitudDocumentoConfiguracion
(
CveFraccionamientoEtapa,
CveTipoDocumento,
CveTipoTramite,
CveSolicitud,
EsRequerido,
EsCliente,
TieneVigencia,
Orden,
EsActivo
)
SELECT
T.CveFraccionamientoEtapa,
T.CveTipoDocumento,
T.CveTipoTramite,
D.CveSolicitud,
D.EsRequerido,
D.EsCliente,
D.TieneVigencia,
D.Orden,
D.EsActivo
FROM dbo.Tra_SolicitudDocumentoConfiguracion AS D
INNER JOIN #TiposConfiguraciones AS T ON T.CveConfiguracionDocumento = D.CveConfiguracionDocumento
WHERE T.CveTipoTramite <> D.CveTipoTramite;
ALTER TABLE dbo.Tra_SolicitudDocumentoConfiguracion ALTER COLUMN CveTipoTramite int NOT NULL;';
IF NOT EXISTS
(
SELECT 1
FROM sys.indexes
WHERE object_id = OBJECT_ID('dbo.Tra_DocumentosSolicitud')
AND name = 'UX_Tra_DocumentosSolicitud_Etapa_Tramite_Documento'
)
EXEC sys.sp_executesql N'
CREATE UNIQUE INDEX UX_Tra_DocumentosSolicitud_Etapa_Tramite_Documento
ON dbo.Tra_DocumentosSolicitud (CveFraccionamientoEtapa, CveTipoTramite, CveTipoDocumento)
WHERE EsActivo = 1;';
IF NOT EXISTS
(
SELECT 1
FROM sys.indexes
WHERE object_id = OBJECT_ID('dbo.Tra_SolicitudDocumentoConfiguracion')
AND name = 'UX_Tra_ConfiguracionDocumento_Etapa_Tramite_Documento'
)
EXEC sys.sp_executesql N'
CREATE UNIQUE INDEX UX_Tra_ConfiguracionDocumento_Etapa_Tramite_Documento
ON dbo.Tra_SolicitudDocumentoConfiguracion
(CveFraccionamientoEtapa, CveTipoTramite, CveTipoDocumento);';
IF NOT EXISTS (SELECT 1 FROM sys.foreign_keys WHERE name = 'FK_Tra_DocumentosSolicitud_TipoTramite')
EXEC sys.sp_executesql N'
ALTER TABLE dbo.Tra_DocumentosSolicitud WITH CHECK
ADD CONSTRAINT FK_Tra_DocumentosSolicitud_TipoTramite
FOREIGN KEY (CveTipoTramite) REFERENCES dbo.Tra_TiposTramite (CveTipoTramite);';
IF NOT EXISTS (SELECT 1 FROM sys.foreign_keys WHERE name = 'FK_Tra_ConfiguracionDocumento_TipoTramite')
EXEC sys.sp_executesql N'
ALTER TABLE dbo.Tra_SolicitudDocumentoConfiguracion WITH CHECK
ADD CONSTRAINT FK_Tra_ConfiguracionDocumento_TipoTramite
FOREIGN KEY (CveTipoTramite) REFERENCES dbo.Tra_TiposTramite (CveTipoTramite);';
-- CveSolicitud se conserva sólo como referencia histórica, sin dependencia relacional.
DECLARE @QuitarRelaciones nvarchar(max) = N'';
SELECT @QuitarRelaciones = @QuitarRelaciones
+ N'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(F.parent_object_id))
+ N'.' + QUOTENAME(OBJECT_NAME(F.parent_object_id))
+ N' DROP CONSTRAINT ' + QUOTENAME(F.name) + N';'
FROM sys.foreign_keys AS F
WHERE F.parent_object_id IN
(OBJECT_ID('dbo.Tra_DocumentosSolicitud'), OBJECT_ID('dbo.Tra_SolicitudDocumentoConfiguracion'))
AND F.referenced_object_id = OBJECT_ID('dbo.Tra_Solicitudes');
IF @QuitarRelaciones <> N''
EXEC sys.sp_executesql @QuitarRelaciones;
INSERT INTO dbo.Bit_Campos
(CveTabla, NombreCampoSQL, NombreMostrar, MostrarEnBitacora, TipoDatoSQL, Activo)
SELECT
T.CveTabla,
'CveTipoTramite',
'Tipo de trámite',
1,
'int',
1
FROM dbo.Bit_Tablas AS T
WHERE T.NombreTablaSQL IN ('Tra_DocumentosSolicitud', 'Tra_SolicitudDocumentoConfiguracion')
AND NOT EXISTS
(
SELECT 1
FROM dbo.Bit_Campos AS C
WHERE C.CveTabla = T.CveTabla
AND C.NombreCampoSQL = 'CveTipoTramite'
);
DROP TABLE #TiposDocumentos;
DROP TABLE #OrigenDocumentos;
DROP TABLE #TiposConfiguraciones;
DROP TABLE #OrigenConfiguraciones;

File diff suppressed because it is too large Load Diff

View 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);

View 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

Binary file not shown.

View File

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

View File

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

View 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.');

View 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.");
}
}

View 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

View 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

View 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

View File

@@ -0,0 +1,110 @@
-- Preparado para revisión. La instalación requiere autorización independiente.
-- La configuración se conserva por etapa y nombre de capa del archivo original.
IF OBJECT_ID(N'dbo.FraccionamientosEtapasGISCapas', N'U') IS NULL
BEGIN
CREATE TABLE dbo.FraccionamientosEtapasGISCapas
(
CveFraccionamientoEtapa int NOT NULL,
NombreCapa nvarchar(250) COLLATE Modern_Spanish_CS_AS NOT NULL,
TipoCapa nvarchar(20) COLLATE Modern_Spanish_CS_AS NOT NULL,
Color nvarchar(7) COLLATE Modern_Spanish_CS_AS NOT NULL,
EsVisible bit NOT NULL,
CveUsuarioModifica int NOT NULL,
FechaModificacion datetime2 NOT NULL,
CONSTRAINT PK_FraccionamientosEtapasGISCapas
PRIMARY KEY (CveFraccionamientoEtapa, NombreCapa),
CONSTRAINT FK_FraccionamientosEtapasGISCapas_Etapa
FOREIGN KEY (CveFraccionamientoEtapa)
REFERENCES dbo.FraccionamientosEtapas (CveFraccionamientoEtapa),
CONSTRAINT CK_FraccionamientosEtapasGISCapas_Tipo
CHECK (TipoCapa IN (N'Agua', N'Drenaje', N'Lotificacion', N'Pozos', N'Otros')),
CONSTRAINT CK_FraccionamientosEtapasGISCapas_Color
CHECK (LEN(Color) = 7 AND Color COLLATE Latin1_General_BIN2
LIKE N'#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]')
);
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Fraccionamientos_EtapaGISCapasList
@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 NombreCapa, TipoCapa, Color, EsVisible
FROM dbo.FraccionamientosEtapasGISCapas
WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'No fue posible consultar la configuración de capas GIS.',
@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_Fraccionamientos_EtapaGISCapasSave
@CveFraccionamientoEtapa int,
@NombreCapa nvarchar(250),
@TipoCapa nvarchar(20),
@Color nvarchar(7),
@EsVisible 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
-- El servicio mantiene la transacción ambiental para proteger este upsert.
UPDATE dbo.FraccionamientosEtapasGISCapas WITH (UPDLOCK, HOLDLOCK)
SET TipoCapa = @TipoCapa,
Color = @Color,
EsVisible = @EsVisible,
CveUsuarioModifica = @CveUsuarioEjecuta,
FechaModificacion = SYSDATETIME()
WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa
AND NombreCapa = @NombreCapa;
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO dbo.FraccionamientosEtapasGISCapas
(
CveFraccionamientoEtapa, NombreCapa, TipoCapa, Color,
EsVisible, CveUsuarioModifica, FechaModificacion
)
VALUES
(
@CveFraccionamientoEtapa, @NombreCapa, @TipoCapa, @Color,
@EsVisible, @CveUsuarioEjecuta, SYSDATETIME()
);
END;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'No fue posible guardar la configuración de la capa GIS.',
@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

View 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

View 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;

View File

@@ -0,0 +1,142 @@
"CveDocumentoSolicitud","CveFraccionamientoEtapa","CveTipoDocumento","EsActivo","NombreArchivo","NombreAnterior","RutaAnterior","NombreNuevo","RutaNueva","TamanoBytes","SHA256"
"3","1022","1040","True","VL103M user manual 20230921.pdf","doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin","Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin","doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf","Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf","1146632","3C097C53A81FE7E60ECFB07A9FBD2163E8DB5DE7444050E0EC20ADAFCB7FBA3F"
"4","1022","1045","True","BORRADOR EDISA.docx","doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb.bin","Clientes/1006/Etapas/1022/doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb.bin","doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb-BORRADOR EDISA.docx","Clientes/1006/Etapas/1022/doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb-BORRADOR EDISA.docx","16889","3074B0379B55A18B47EB06A4BAE47985B155CAC0583DE78B651988C7599A3C77"
"5","1022","1046","True","ACTIVIDADES LETYYYY.docx","doc-1022-1046-c3b1e27e553449a7b5a4545222b63b0b.bin","Clientes/1006/Etapas/1022/doc-1022-1046-c3b1e27e553449a7b5a4545222b63b0b.bin","doc-1022-1046-c3b1e27e553449a7b5a4545222b63b0b-ACTIVIDADES LETYYYY.docx","Clientes/1006/Etapas/1022/doc-1022-1046-c3b1e27e553449a7b5a4545222b63b0b-ACTIVIDADES LETYYYY.docx","19908","8A139074FE52426D3FE0DCE395CCEDB031A03FB33462E2C989F695F14481C11D"
"6","1022","1051","True","Recibo-Ago (1).pdf","doc-1022-1051-b0ea49a4b15241e5a6010a8b890b9791.bin","Clientes/1006/Etapas/1022/doc-1022-1051-b0ea49a4b15241e5a6010a8b890b9791.bin","doc-1022-1051-b0ea49a4b15241e5a6010a8b890b9791-Recibo-Ago (1).pdf","Clientes/1006/Etapas/1022/doc-1022-1051-b0ea49a4b15241e5a6010a8b890b9791-Recibo-Ago (1).pdf","814619","86017314865C2064DDBA15CBC1318643BC2F2E0C254A3D274CEE3C17B81E9094"
"7","1022","1057","True","65007.jpeg","doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin","Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin","doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg","Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg","128129","0F80A31813107978A32D13201884611FB35347E738BFDC4538D1ECE97FAD2081"
"8","1022","1053","True","Etapa1_10_lotes.gis","doc-1022-1053-53864978166e40c2b3c7e06dd7c6333c.bin","Clientes/1006/Etapas/1022/doc-1022-1053-53864978166e40c2b3c7e06dd7c6333c.bin","doc-1022-1053-53864978166e40c2b3c7e06dd7c6333c-Etapa1_10_lotes.gis","Clientes/1006/Etapas/1022/doc-1022-1053-53864978166e40c2b3c7e06dd7c6333c-Etapa1_10_lotes.gis","8256","5271A9F0C57CF648101CFCDC4CB6635CB28FA2C637DECD4C60195751E8959EEF"
"9","1024","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin","Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin","doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"10","1024","1053","False","02_Copia_escrituras.pdf","doc-1024-1053-4026eac60fde4d57aca2ed30325c7aa7.bin","Clientes/4/Etapas/1024/doc-1024-1053-4026eac60fde4d57aca2ed30325c7aa7.bin","doc-1024-1053-4026eac60fde4d57aca2ed30325c7aa7-02_Copia_escrituras.pdf","Clientes/4/Etapas/1024/doc-1024-1053-4026eac60fde4d57aca2ed30325c7aa7-02_Copia_escrituras.pdf","44497","DE63A4F755D5199D1EB98A024C03627B1AB698403481CE8C6BC5D92E7E8746CC"
"11","1024","1046","False","04_Dictamen_uso_suelo.pdf","doc-1024-1046-168182c76cb843cbb3a2aff986bff057.bin","Clientes/4/Etapas/1024/doc-1024-1046-168182c76cb843cbb3a2aff986bff057.bin","doc-1024-1046-168182c76cb843cbb3a2aff986bff057-04_Dictamen_uso_suelo.pdf","Clientes/4/Etapas/1024/doc-1024-1046-168182c76cb843cbb3a2aff986bff057-04_Dictamen_uso_suelo.pdf","44359","AE0069AEC8DDBE09071581126BEA3272BC37A4D758A764BF8A05D58755F4BC28"
"12","1024","1069","False","05_Carta_poder_representante_legal.pdf","doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin","Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin","doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"13","1024","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin","Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin","doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"14","1024","1079","False","08_Constancia_no_adeudo_Agua_Hermosillo.pdf","doc-1024-1079-b838d1c6a81948a0ad275d93dca3b0f5.bin","Clientes/4/Etapas/1024/doc-1024-1079-b838d1c6a81948a0ad275d93dca3b0f5.bin","doc-1024-1079-b838d1c6a81948a0ad275d93dca3b0f5-08_Constancia_no_adeudo_Agua_Hermosillo.pdf","Clientes/4/Etapas/1024/doc-1024-1079-b838d1c6a81948a0ad275d93dca3b0f5-08_Constancia_no_adeudo_Agua_Hermosillo.pdf","44351","04CD6B0F2739837F7BD711819D031FB73BACD7675B752906EFE283F46A7C3006"
"15","1024","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin","Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin","doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"16","1024","1037","False","10_Comprobante_domicilio.pdf","doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin","Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin","doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf","Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf","44184","0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0"
"17","1024","1053","True","02_Copia_escrituras.pdf","doc-1024-1053-393eb44b58d24c128d4b5cc5090cc117.bin","Clientes/4/Etapas/1024/doc-1024-1053-393eb44b58d24c128d4b5cc5090cc117.bin","doc-1024-1053-393eb44b58d24c128d4b5cc5090cc117-02_Copia_escrituras.pdf","Clientes/4/Etapas/1024/doc-1024-1053-393eb44b58d24c128d4b5cc5090cc117-02_Copia_escrituras.pdf","44497","DE63A4F755D5199D1EB98A024C03627B1AB698403481CE8C6BC5D92E7E8746CC"
"18","1024","1046","True","04_Dictamen_uso_suelo.pdf","doc-1024-1046-746dbd30e6f343338537a9e5e0b3ee59.bin","Clientes/4/Etapas/1024/doc-1024-1046-746dbd30e6f343338537a9e5e0b3ee59.bin","doc-1024-1046-746dbd30e6f343338537a9e5e0b3ee59-04_Dictamen_uso_suelo.pdf","Clientes/4/Etapas/1024/doc-1024-1046-746dbd30e6f343338537a9e5e0b3ee59-04_Dictamen_uso_suelo.pdf","44359","AE0069AEC8DDBE09071581126BEA3272BC37A4D758A764BF8A05D58755F4BC28"
"19","1024","1069","True","05_Carta_poder_representante_legal.pdf","doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin","Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin","doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"20","1024","1040","True","06_Constancia_no_adeudo_tesoreria.pdf","doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin","Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin","doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"21","1024","1079","True","08_Constancia_no_adeudo_Agua_Hermosillo.pdf","doc-1024-1079-b25d1e7c30b0443cb66423c56c45c46c.bin","Clientes/4/Etapas/1024/doc-1024-1079-b25d1e7c30b0443cb66423c56c45c46c.bin","doc-1024-1079-b25d1e7c30b0443cb66423c56c45c46c-08_Constancia_no_adeudo_Agua_Hermosillo.pdf","Clientes/4/Etapas/1024/doc-1024-1079-b25d1e7c30b0443cb66423c56c45c46c-08_Constancia_no_adeudo_Agua_Hermosillo.pdf","44351","04CD6B0F2739837F7BD711819D031FB73BACD7675B752906EFE283F46A7C3006"
"22","1024","1034","True","09_Acta_Constitutiva_empresa.pdf","doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin","Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin","doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"23","1024","1037","True","10_Comprobante_domicilio.pdf","doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin","Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin","doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf","Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf","44184","0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0"
"24","1024","1082","False","11_Cedula_RFC.pdf","doc-1024-1082-02f16c7d84fb4781ae5f7e5280422788.bin","Clientes/4/Etapas/1024/doc-1024-1082-02f16c7d84fb4781ae5f7e5280422788.bin","doc-1024-1082-02f16c7d84fb4781ae5f7e5280422788-11_Cedula_RFC.pdf","Clientes/4/Etapas/1024/doc-1024-1082-02f16c7d84fb4781ae5f7e5280422788-11_Cedula_RFC.pdf","44347","75D97258546FDD49567B605CA676CD5DF97F539A7134F9A977BE14D9FA48F912"
"25","1024","1080","False","12_Autorizaciones_CIDUE.pdf","doc-1024-1080-2337d1e8ab91435891a9332b5fd58262.bin","Clientes/4/Etapas/1024/doc-1024-1080-2337d1e8ab91435891a9332b5fd58262.bin","doc-1024-1080-2337d1e8ab91435891a9332b5fd58262-12_Autorizaciones_CIDUE.pdf","Clientes/4/Etapas/1024/doc-1024-1080-2337d1e8ab91435891a9332b5fd58262-12_Autorizaciones_CIDUE.pdf","44232","B68667D2A258EC28F3445017A42014A1CDEC4AD6686AE5FB4AD15B275B1D4E7E"
"26","1024","1045","False","Croquis.png","doc-1024-1045-d447e83e74d14977957ca05ed2465c28.bin","Clientes/4/Etapas/1024/doc-1024-1045-d447e83e74d14977957ca05ed2465c28.bin","doc-1024-1045-d447e83e74d14977957ca05ed2465c28-Croquis.png","Clientes/4/Etapas/1024/doc-1024-1045-d447e83e74d14977957ca05ed2465c28-Croquis.png","984403","3A507595006CDBB8A59830E0B9634D11DCB85A4CBED1F2A5F35023043947E632"
"27","1024","1057","False","Identificación Oficial.jpg","doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin","Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin","doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg","Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"28","1024","1082","True","11_Cedula_RFC.pdf","doc-1024-1082-d9c8ba3f888249ae918d7dffbbf6764c.bin","Clientes/4/Etapas/1024/doc-1024-1082-d9c8ba3f888249ae918d7dffbbf6764c.bin","doc-1024-1082-d9c8ba3f888249ae918d7dffbbf6764c-11_Cedula_RFC.pdf","Clientes/4/Etapas/1024/doc-1024-1082-d9c8ba3f888249ae918d7dffbbf6764c-11_Cedula_RFC.pdf","44347","75D97258546FDD49567B605CA676CD5DF97F539A7134F9A977BE14D9FA48F912"
"29","1024","1080","True","12_Autorizaciones_CIDUE.pdf","doc-1024-1080-f691bac55afb4c6084d21a7d2ab8f3a2.bin","Clientes/4/Etapas/1024/doc-1024-1080-f691bac55afb4c6084d21a7d2ab8f3a2.bin","doc-1024-1080-f691bac55afb4c6084d21a7d2ab8f3a2-12_Autorizaciones_CIDUE.pdf","Clientes/4/Etapas/1024/doc-1024-1080-f691bac55afb4c6084d21a7d2ab8f3a2-12_Autorizaciones_CIDUE.pdf","44232","B68667D2A258EC28F3445017A42014A1CDEC4AD6686AE5FB4AD15B275B1D4E7E"
"30","1024","1045","True","Croquis.png","doc-1024-1045-61379c693d6241898e7cf30cffd8658a.bin","Clientes/4/Etapas/1024/doc-1024-1045-61379c693d6241898e7cf30cffd8658a.bin","doc-1024-1045-61379c693d6241898e7cf30cffd8658a-Croquis.png","Clientes/4/Etapas/1024/doc-1024-1045-61379c693d6241898e7cf30cffd8658a-Croquis.png","984403","3A507595006CDBB8A59830E0B9634D11DCB85A4CBED1F2A5F35023043947E632"
"31","1024","1057","True","Identificación Oficial.jpg","doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin","Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin","doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg","Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"32","1024","1051","True","01_Oficio_solicitud_obras_necesarias.pdf","doc-1024-1051-4037762f536045d59be5d818e2de6481.bin","Clientes/4/Etapas/1024/doc-1024-1051-4037762f536045d59be5d818e2de6481.bin","doc-1024-1051-4037762f536045d59be5d818e2de6481-01_Oficio_solicitud_obras_necesarias.pdf","Clientes/4/Etapas/1024/doc-1024-1051-4037762f536045d59be5d818e2de6481-01_Oficio_solicitud_obras_necesarias.pdf","44555","DDBDF6829D3A8F8587E42A768C32EF08AEE89848001C4E9B19EEE24480B75AB8"
"33","1028","1053","True","02_Copia_escrituras.pdf","doc-1028-1053-c2b0275d99924d3784d7aec44c0b8beb.bin","Clientes/4/Etapas/1028/doc-1028-1053-c2b0275d99924d3784d7aec44c0b8beb.bin","doc-1028-1053-c2b0275d99924d3784d7aec44c0b8beb-02_Copia_escrituras.pdf","Clientes/4/Etapas/1028/doc-1028-1053-c2b0275d99924d3784d7aec44c0b8beb-02_Copia_escrituras.pdf","44497","DE63A4F755D5199D1EB98A024C03627B1AB698403481CE8C6BC5D92E7E8746CC"
"34","1028","1046","True","04_Dictamen_uso_suelo.pdf","doc-1028-1046-c98e40e90f3b41cdb810222241f3fc9a.bin","Clientes/4/Etapas/1028/doc-1028-1046-c98e40e90f3b41cdb810222241f3fc9a.bin","doc-1028-1046-c98e40e90f3b41cdb810222241f3fc9a-04_Dictamen_uso_suelo.pdf","Clientes/4/Etapas/1028/doc-1028-1046-c98e40e90f3b41cdb810222241f3fc9a-04_Dictamen_uso_suelo.pdf","44359","AE0069AEC8DDBE09071581126BEA3272BC37A4D758A764BF8A05D58755F4BC28"
"35","1028","1069","True","05_Carta_poder_representante_legal.pdf","doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin","Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin","doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"36","1028","1040","True","06_Constancia_no_adeudo_tesoreria.pdf","doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin","Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin","doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"37","1028","1079","True","08_Constancia_no_adeudo_Agua_Hermosillo.pdf","doc-1028-1079-9be2156047bc4828b3e43b67fe3f6733.bin","Clientes/4/Etapas/1028/doc-1028-1079-9be2156047bc4828b3e43b67fe3f6733.bin","doc-1028-1079-9be2156047bc4828b3e43b67fe3f6733-08_Constancia_no_adeudo_Agua_Hermosillo.pdf","Clientes/4/Etapas/1028/doc-1028-1079-9be2156047bc4828b3e43b67fe3f6733-08_Constancia_no_adeudo_Agua_Hermosillo.pdf","44351","04CD6B0F2739837F7BD711819D031FB73BACD7675B752906EFE283F46A7C3006"
"38","1028","1034","True","09_Acta_Constitutiva_empresa.pdf","doc-1028-1034-583b7009cab246ed8287200ce7082495.bin","Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495.bin","doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"39","1028","1037","True","10_Comprobante_domicilio.pdf","doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin","Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin","doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf","Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf","44184","0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0"
"40","1028","1082","True","11_Cedula_RFC.pdf","doc-1028-1082-a21ee3513b5a4fe3b1f5f8f237ddc338.bin","Clientes/4/Etapas/1028/doc-1028-1082-a21ee3513b5a4fe3b1f5f8f237ddc338.bin","doc-1028-1082-a21ee3513b5a4fe3b1f5f8f237ddc338-11_Cedula_RFC.pdf","Clientes/4/Etapas/1028/doc-1028-1082-a21ee3513b5a4fe3b1f5f8f237ddc338-11_Cedula_RFC.pdf","44347","75D97258546FDD49567B605CA676CD5DF97F539A7134F9A977BE14D9FA48F912"
"41","1028","1080","True","12_Autorizaciones_CIDUE.pdf","doc-1028-1080-2fb84cc84de24223a9fcdeaf1fcd2470.bin","Clientes/4/Etapas/1028/doc-1028-1080-2fb84cc84de24223a9fcdeaf1fcd2470.bin","doc-1028-1080-2fb84cc84de24223a9fcdeaf1fcd2470-12_Autorizaciones_CIDUE.pdf","Clientes/4/Etapas/1028/doc-1028-1080-2fb84cc84de24223a9fcdeaf1fcd2470-12_Autorizaciones_CIDUE.pdf","44232","B68667D2A258EC28F3445017A42014A1CDEC4AD6686AE5FB4AD15B275B1D4E7E"
"42","1028","1045","True","Croquis.png","doc-1028-1045-7f4784759eaf43f09e2a6433309008df.bin","Clientes/4/Etapas/1028/doc-1028-1045-7f4784759eaf43f09e2a6433309008df.bin","doc-1028-1045-7f4784759eaf43f09e2a6433309008df-Croquis.png","Clientes/4/Etapas/1028/doc-1028-1045-7f4784759eaf43f09e2a6433309008df-Croquis.png","984403","3A507595006CDBB8A59830E0B9634D11DCB85A4CBED1F2A5F35023043947E632"
"43","1028","1057","True","Identificación Oficial.jpg","doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin","Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin","doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg","Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"44","1028","1051","True","01_Oficio_solicitud_obras_necesarias.pdf","doc-1028-1051-90d0c12832f9428abb0ac645be0c7156.bin","Clientes/4/Etapas/1028/doc-1028-1051-90d0c12832f9428abb0ac645be0c7156.bin","doc-1028-1051-90d0c12832f9428abb0ac645be0c7156-01_Oficio_solicitud_obras_necesarias.pdf","Clientes/4/Etapas/1028/doc-1028-1051-90d0c12832f9428abb0ac645be0c7156-01_Oficio_solicitud_obras_necesarias.pdf","44555","DDBDF6829D3A8F8587E42A768C32EF08AEE89848001C4E9B19EEE24480B75AB8"
"45","1022","1040","False","VL103M user manual 20230921.pdf","doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin","Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin","doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf","Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf","1146632","3C097C53A81FE7E60ECFB07A9FBD2163E8DB5DE7444050E0EC20ADAFCB7FBA3F"
"46","1022","1040","False","VL103M user manual 20230921.pdf","doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin","Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin","doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf","Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf","1146632","3C097C53A81FE7E60ECFB07A9FBD2163E8DB5DE7444050E0EC20ADAFCB7FBA3F"
"47","1022","1040","False","VL103M user manual 20230921.pdf","doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin","Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin","doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf","Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf","1146632","3C097C53A81FE7E60ECFB07A9FBD2163E8DB5DE7444050E0EC20ADAFCB7FBA3F"
"48","1022","1040","False","VL103M user manual 20230921.pdf","doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin","Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin","doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf","Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf","1146632","3C097C53A81FE7E60ECFB07A9FBD2163E8DB5DE7444050E0EC20ADAFCB7FBA3F"
"49","1022","1040","False","VL103M user manual 20230921.pdf","doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin","Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin","doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf","Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf","1146632","3C097C53A81FE7E60ECFB07A9FBD2163E8DB5DE7444050E0EC20ADAFCB7FBA3F"
"50","1022","1040","False","VL103M user manual 20230921.pdf","doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin","Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin","doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf","Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf","1146632","3C097C53A81FE7E60ECFB07A9FBD2163E8DB5DE7444050E0EC20ADAFCB7FBA3F"
"51","1022","1045","False","BORRADOR EDISA.docx","doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb.bin","Clientes/1006/Etapas/1022/doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb.bin","doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb-BORRADOR EDISA.docx","Clientes/1006/Etapas/1022/doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb-BORRADOR EDISA.docx","16889","3074B0379B55A18B47EB06A4BAE47985B155CAC0583DE78B651988C7599A3C77"
"52","1022","1057","False","65007.jpeg","doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin","Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin","doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg","Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg","128129","0F80A31813107978A32D13201884611FB35347E738BFDC4538D1ECE97FAD2081"
"53","1022","1057","False","65007.jpeg","doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin","Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin","doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg","Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg","128129","0F80A31813107978A32D13201884611FB35347E738BFDC4538D1ECE97FAD2081"
"54","1022","1057","False","65007.jpeg","doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin","Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin","doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg","Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg","128129","0F80A31813107978A32D13201884611FB35347E738BFDC4538D1ECE97FAD2081"
"55","1022","1057","False","65007.jpeg","doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin","Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin","doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg","Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg","128129","0F80A31813107978A32D13201884611FB35347E738BFDC4538D1ECE97FAD2081"
"56","1022","1057","False","65007.jpeg","doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin","Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin","doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg","Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg","128129","0F80A31813107978A32D13201884611FB35347E738BFDC4538D1ECE97FAD2081"
"57","1022","1057","False","65007.jpeg","doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin","Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin","doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg","Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg","128129","0F80A31813107978A32D13201884611FB35347E738BFDC4538D1ECE97FAD2081"
"58","1022","1057","False","65007.jpeg","doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin","Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin","doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg","Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg","128129","0F80A31813107978A32D13201884611FB35347E738BFDC4538D1ECE97FAD2081"
"59","1024","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin","Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin","doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"60","1024","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin","Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin","doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"61","1024","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin","Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin","doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"62","1024","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin","Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin","doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"63","1024","1069","False","05_Carta_poder_representante_legal.pdf","doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin","Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin","doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"64","1024","1069","False","05_Carta_poder_representante_legal.pdf","doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin","Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin","doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"65","1024","1069","False","05_Carta_poder_representante_legal.pdf","doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin","Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin","doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"66","1024","1069","False","05_Carta_poder_representante_legal.pdf","doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin","Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin","doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"67","1024","1069","False","05_Carta_poder_representante_legal.pdf","doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin","Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin","doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"68","1024","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin","Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin","doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"69","1024","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin","Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin","doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"70","1024","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin","Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin","doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"71","1024","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin","Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin","doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"72","1024","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin","Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin","doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"73","1024","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin","Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin","doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"74","1024","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin","Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin","doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"75","1024","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin","Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin","doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"76","1024","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin","Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin","doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"77","1024","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin","Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin","doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"78","1024","1037","False","10_Comprobante_domicilio.pdf","doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin","Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin","doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf","Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf","44184","0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0"
"79","1024","1037","False","10_Comprobante_domicilio.pdf","doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin","Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin","doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf","Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf","44184","0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0"
"80","1024","1037","False","10_Comprobante_domicilio.pdf","doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin","Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin","doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf","Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf","44184","0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0"
"81","1024","1037","False","10_Comprobante_domicilio.pdf","doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin","Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin","doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf","Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf","44184","0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0"
"82","1024","1069","False","05_Carta_poder_representante_legal.pdf","doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin","Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin","doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"83","1024","1069","False","05_Carta_poder_representante_legal.pdf","doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin","Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin","doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"84","1024","1069","False","05_Carta_poder_representante_legal.pdf","doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin","Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin","doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"85","1024","1069","False","05_Carta_poder_representante_legal.pdf","doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin","Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin","doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"86","1024","1069","False","05_Carta_poder_representante_legal.pdf","doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin","Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin","doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"87","1024","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin","Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin","doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"88","1024","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin","Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin","doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"89","1024","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin","Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin","doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"90","1024","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin","Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin","doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"91","1024","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin","Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin","doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"92","1024","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin","Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin","doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"93","1024","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin","Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin","doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"94","1024","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin","Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin","doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"95","1024","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin","Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin","doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"96","1024","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin","Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin","doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"97","1024","1037","False","10_Comprobante_domicilio.pdf","doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin","Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin","doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf","Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf","44184","0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0"
"98","1024","1037","False","10_Comprobante_domicilio.pdf","doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin","Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin","doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf","Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf","44184","0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0"
"99","1024","1037","False","10_Comprobante_domicilio.pdf","doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin","Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin","doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf","Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf","44184","0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0"
"100","1024","1037","False","10_Comprobante_domicilio.pdf","doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin","Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin","doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf","Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf","44184","0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0"
"101","1024","1045","False","Croquis.png","doc-1024-1045-d447e83e74d14977957ca05ed2465c28.bin","Clientes/4/Etapas/1024/doc-1024-1045-d447e83e74d14977957ca05ed2465c28.bin","doc-1024-1045-d447e83e74d14977957ca05ed2465c28-Croquis.png","Clientes/4/Etapas/1024/doc-1024-1045-d447e83e74d14977957ca05ed2465c28-Croquis.png","984403","3A507595006CDBB8A59830E0B9634D11DCB85A4CBED1F2A5F35023043947E632"
"102","1024","1057","False","Identificación Oficial.jpg","doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin","Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin","doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg","Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"103","1024","1057","False","Identificación Oficial.jpg","doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin","Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin","doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg","Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"104","1024","1057","False","Identificación Oficial.jpg","doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin","Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin","doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg","Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"105","1024","1057","False","Identificación Oficial.jpg","doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin","Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin","doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg","Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"106","1024","1057","False","Identificación Oficial.jpg","doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin","Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin","doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg","Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"107","1024","1057","False","Identificación Oficial.jpg","doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin","Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin","doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg","Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"108","1024","1057","False","Identificación Oficial.jpg","doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin","Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin","doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg","Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"109","1024","1045","False","Croquis.png","doc-1024-1045-61379c693d6241898e7cf30cffd8658a.bin","Clientes/4/Etapas/1024/doc-1024-1045-61379c693d6241898e7cf30cffd8658a.bin","doc-1024-1045-61379c693d6241898e7cf30cffd8658a-Croquis.png","Clientes/4/Etapas/1024/doc-1024-1045-61379c693d6241898e7cf30cffd8658a-Croquis.png","984403","3A507595006CDBB8A59830E0B9634D11DCB85A4CBED1F2A5F35023043947E632"
"110","1024","1057","False","Identificación Oficial.jpg","doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin","Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin","doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg","Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"111","1024","1057","False","Identificación Oficial.jpg","doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin","Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin","doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg","Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"112","1024","1057","False","Identificación Oficial.jpg","doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin","Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin","doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg","Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"113","1024","1057","False","Identificación Oficial.jpg","doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin","Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin","doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg","Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"114","1024","1057","False","Identificación Oficial.jpg","doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin","Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin","doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg","Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"115","1024","1057","False","Identificación Oficial.jpg","doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin","Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin","doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg","Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"116","1024","1057","False","Identificación Oficial.jpg","doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin","Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin","doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg","Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"117","1028","1069","False","05_Carta_poder_representante_legal.pdf","doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin","Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin","doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"118","1028","1069","False","05_Carta_poder_representante_legal.pdf","doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin","Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin","doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"119","1028","1069","False","05_Carta_poder_representante_legal.pdf","doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin","Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin","doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"120","1028","1069","False","05_Carta_poder_representante_legal.pdf","doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin","Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin","doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"121","1028","1069","False","05_Carta_poder_representante_legal.pdf","doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin","Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin","doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf","Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf","44650","A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1"
"122","1028","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin","Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin","doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"123","1028","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin","Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin","doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"124","1028","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin","Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin","doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"125","1028","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin","Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin","doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"126","1028","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin","Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin","doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"127","1028","1040","False","06_Constancia_no_adeudo_tesoreria.pdf","doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin","Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin","doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf","Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf","44515","4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F"
"128","1028","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1028-1034-583b7009cab246ed8287200ce7082495.bin","Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495.bin","doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"129","1028","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1028-1034-583b7009cab246ed8287200ce7082495.bin","Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495.bin","doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"130","1028","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1028-1034-583b7009cab246ed8287200ce7082495.bin","Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495.bin","doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"131","1028","1034","False","09_Acta_Constitutiva_empresa.pdf","doc-1028-1034-583b7009cab246ed8287200ce7082495.bin","Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495.bin","doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf","Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf","44281","4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3"
"132","1028","1037","False","10_Comprobante_domicilio.pdf","doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin","Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin","doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf","Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf","44184","0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0"
"133","1028","1037","False","10_Comprobante_domicilio.pdf","doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin","Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin","doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf","Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf","44184","0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0"
"134","1028","1037","False","10_Comprobante_domicilio.pdf","doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin","Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin","doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf","Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf","44184","0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0"
"135","1028","1037","False","10_Comprobante_domicilio.pdf","doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin","Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin","doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf","Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf","44184","0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0"
"136","1028","1045","False","Croquis.png","doc-1028-1045-7f4784759eaf43f09e2a6433309008df.bin","Clientes/4/Etapas/1028/doc-1028-1045-7f4784759eaf43f09e2a6433309008df.bin","doc-1028-1045-7f4784759eaf43f09e2a6433309008df-Croquis.png","Clientes/4/Etapas/1028/doc-1028-1045-7f4784759eaf43f09e2a6433309008df-Croquis.png","984403","3A507595006CDBB8A59830E0B9634D11DCB85A4CBED1F2A5F35023043947E632"
"137","1028","1057","False","Identificación Oficial.jpg","doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin","Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin","doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg","Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"138","1028","1057","False","Identificación Oficial.jpg","doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin","Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin","doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg","Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"139","1028","1057","False","Identificación Oficial.jpg","doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin","Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin","doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg","Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"140","1028","1057","False","Identificación Oficial.jpg","doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin","Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin","doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg","Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"141","1028","1057","False","Identificación Oficial.jpg","doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin","Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin","doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg","Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"142","1028","1057","False","Identificación Oficial.jpg","doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin","Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin","doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg","Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
"143","1028","1057","False","Identificación Oficial.jpg","doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin","Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin","doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg","Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg","55724","A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076"
1 CveDocumentoSolicitud CveFraccionamientoEtapa CveTipoDocumento EsActivo NombreArchivo NombreAnterior RutaAnterior NombreNuevo RutaNueva TamanoBytes SHA256
2 3 1022 1040 True VL103M user manual 20230921.pdf doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf 1146632 3C097C53A81FE7E60ECFB07A9FBD2163E8DB5DE7444050E0EC20ADAFCB7FBA3F
3 4 1022 1045 True BORRADOR EDISA.docx doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb.bin Clientes/1006/Etapas/1022/doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb.bin doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb-BORRADOR EDISA.docx Clientes/1006/Etapas/1022/doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb-BORRADOR EDISA.docx 16889 3074B0379B55A18B47EB06A4BAE47985B155CAC0583DE78B651988C7599A3C77
4 5 1022 1046 True ACTIVIDADES LETYYYY.docx doc-1022-1046-c3b1e27e553449a7b5a4545222b63b0b.bin Clientes/1006/Etapas/1022/doc-1022-1046-c3b1e27e553449a7b5a4545222b63b0b.bin doc-1022-1046-c3b1e27e553449a7b5a4545222b63b0b-ACTIVIDADES LETYYYY.docx Clientes/1006/Etapas/1022/doc-1022-1046-c3b1e27e553449a7b5a4545222b63b0b-ACTIVIDADES LETYYYY.docx 19908 8A139074FE52426D3FE0DCE395CCEDB031A03FB33462E2C989F695F14481C11D
5 6 1022 1051 True Recibo-Ago (1).pdf doc-1022-1051-b0ea49a4b15241e5a6010a8b890b9791.bin Clientes/1006/Etapas/1022/doc-1022-1051-b0ea49a4b15241e5a6010a8b890b9791.bin doc-1022-1051-b0ea49a4b15241e5a6010a8b890b9791-Recibo-Ago (1).pdf Clientes/1006/Etapas/1022/doc-1022-1051-b0ea49a4b15241e5a6010a8b890b9791-Recibo-Ago (1).pdf 814619 86017314865C2064DDBA15CBC1318643BC2F2E0C254A3D274CEE3C17B81E9094
6 7 1022 1057 True 65007.jpeg doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg 128129 0F80A31813107978A32D13201884611FB35347E738BFDC4538D1ECE97FAD2081
7 8 1022 1053 True Etapa1_10_lotes.gis doc-1022-1053-53864978166e40c2b3c7e06dd7c6333c.bin Clientes/1006/Etapas/1022/doc-1022-1053-53864978166e40c2b3c7e06dd7c6333c.bin doc-1022-1053-53864978166e40c2b3c7e06dd7c6333c-Etapa1_10_lotes.gis Clientes/1006/Etapas/1022/doc-1022-1053-53864978166e40c2b3c7e06dd7c6333c-Etapa1_10_lotes.gis 8256 5271A9F0C57CF648101CFCDC4CB6635CB28FA2C637DECD4C60195751E8959EEF
8 9 1024 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
9 10 1024 1053 False 02_Copia_escrituras.pdf doc-1024-1053-4026eac60fde4d57aca2ed30325c7aa7.bin Clientes/4/Etapas/1024/doc-1024-1053-4026eac60fde4d57aca2ed30325c7aa7.bin doc-1024-1053-4026eac60fde4d57aca2ed30325c7aa7-02_Copia_escrituras.pdf Clientes/4/Etapas/1024/doc-1024-1053-4026eac60fde4d57aca2ed30325c7aa7-02_Copia_escrituras.pdf 44497 DE63A4F755D5199D1EB98A024C03627B1AB698403481CE8C6BC5D92E7E8746CC
10 11 1024 1046 False 04_Dictamen_uso_suelo.pdf doc-1024-1046-168182c76cb843cbb3a2aff986bff057.bin Clientes/4/Etapas/1024/doc-1024-1046-168182c76cb843cbb3a2aff986bff057.bin doc-1024-1046-168182c76cb843cbb3a2aff986bff057-04_Dictamen_uso_suelo.pdf Clientes/4/Etapas/1024/doc-1024-1046-168182c76cb843cbb3a2aff986bff057-04_Dictamen_uso_suelo.pdf 44359 AE0069AEC8DDBE09071581126BEA3272BC37A4D758A764BF8A05D58755F4BC28
11 12 1024 1069 False 05_Carta_poder_representante_legal.pdf doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
12 13 1024 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
13 14 1024 1079 False 08_Constancia_no_adeudo_Agua_Hermosillo.pdf doc-1024-1079-b838d1c6a81948a0ad275d93dca3b0f5.bin Clientes/4/Etapas/1024/doc-1024-1079-b838d1c6a81948a0ad275d93dca3b0f5.bin doc-1024-1079-b838d1c6a81948a0ad275d93dca3b0f5-08_Constancia_no_adeudo_Agua_Hermosillo.pdf Clientes/4/Etapas/1024/doc-1024-1079-b838d1c6a81948a0ad275d93dca3b0f5-08_Constancia_no_adeudo_Agua_Hermosillo.pdf 44351 04CD6B0F2739837F7BD711819D031FB73BACD7675B752906EFE283F46A7C3006
14 15 1024 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
15 16 1024 1037 False 10_Comprobante_domicilio.pdf doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf 44184 0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0
16 17 1024 1053 True 02_Copia_escrituras.pdf doc-1024-1053-393eb44b58d24c128d4b5cc5090cc117.bin Clientes/4/Etapas/1024/doc-1024-1053-393eb44b58d24c128d4b5cc5090cc117.bin doc-1024-1053-393eb44b58d24c128d4b5cc5090cc117-02_Copia_escrituras.pdf Clientes/4/Etapas/1024/doc-1024-1053-393eb44b58d24c128d4b5cc5090cc117-02_Copia_escrituras.pdf 44497 DE63A4F755D5199D1EB98A024C03627B1AB698403481CE8C6BC5D92E7E8746CC
17 18 1024 1046 True 04_Dictamen_uso_suelo.pdf doc-1024-1046-746dbd30e6f343338537a9e5e0b3ee59.bin Clientes/4/Etapas/1024/doc-1024-1046-746dbd30e6f343338537a9e5e0b3ee59.bin doc-1024-1046-746dbd30e6f343338537a9e5e0b3ee59-04_Dictamen_uso_suelo.pdf Clientes/4/Etapas/1024/doc-1024-1046-746dbd30e6f343338537a9e5e0b3ee59-04_Dictamen_uso_suelo.pdf 44359 AE0069AEC8DDBE09071581126BEA3272BC37A4D758A764BF8A05D58755F4BC28
18 19 1024 1069 True 05_Carta_poder_representante_legal.pdf doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
19 20 1024 1040 True 06_Constancia_no_adeudo_tesoreria.pdf doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
20 21 1024 1079 True 08_Constancia_no_adeudo_Agua_Hermosillo.pdf doc-1024-1079-b25d1e7c30b0443cb66423c56c45c46c.bin Clientes/4/Etapas/1024/doc-1024-1079-b25d1e7c30b0443cb66423c56c45c46c.bin doc-1024-1079-b25d1e7c30b0443cb66423c56c45c46c-08_Constancia_no_adeudo_Agua_Hermosillo.pdf Clientes/4/Etapas/1024/doc-1024-1079-b25d1e7c30b0443cb66423c56c45c46c-08_Constancia_no_adeudo_Agua_Hermosillo.pdf 44351 04CD6B0F2739837F7BD711819D031FB73BACD7675B752906EFE283F46A7C3006
21 22 1024 1034 True 09_Acta_Constitutiva_empresa.pdf doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
22 23 1024 1037 True 10_Comprobante_domicilio.pdf doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf 44184 0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0
23 24 1024 1082 False 11_Cedula_RFC.pdf doc-1024-1082-02f16c7d84fb4781ae5f7e5280422788.bin Clientes/4/Etapas/1024/doc-1024-1082-02f16c7d84fb4781ae5f7e5280422788.bin doc-1024-1082-02f16c7d84fb4781ae5f7e5280422788-11_Cedula_RFC.pdf Clientes/4/Etapas/1024/doc-1024-1082-02f16c7d84fb4781ae5f7e5280422788-11_Cedula_RFC.pdf 44347 75D97258546FDD49567B605CA676CD5DF97F539A7134F9A977BE14D9FA48F912
24 25 1024 1080 False 12_Autorizaciones_CIDUE.pdf doc-1024-1080-2337d1e8ab91435891a9332b5fd58262.bin Clientes/4/Etapas/1024/doc-1024-1080-2337d1e8ab91435891a9332b5fd58262.bin doc-1024-1080-2337d1e8ab91435891a9332b5fd58262-12_Autorizaciones_CIDUE.pdf Clientes/4/Etapas/1024/doc-1024-1080-2337d1e8ab91435891a9332b5fd58262-12_Autorizaciones_CIDUE.pdf 44232 B68667D2A258EC28F3445017A42014A1CDEC4AD6686AE5FB4AD15B275B1D4E7E
25 26 1024 1045 False Croquis.png doc-1024-1045-d447e83e74d14977957ca05ed2465c28.bin Clientes/4/Etapas/1024/doc-1024-1045-d447e83e74d14977957ca05ed2465c28.bin doc-1024-1045-d447e83e74d14977957ca05ed2465c28-Croquis.png Clientes/4/Etapas/1024/doc-1024-1045-d447e83e74d14977957ca05ed2465c28-Croquis.png 984403 3A507595006CDBB8A59830E0B9634D11DCB85A4CBED1F2A5F35023043947E632
26 27 1024 1057 False Identificación Oficial.jpg doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
27 28 1024 1082 True 11_Cedula_RFC.pdf doc-1024-1082-d9c8ba3f888249ae918d7dffbbf6764c.bin Clientes/4/Etapas/1024/doc-1024-1082-d9c8ba3f888249ae918d7dffbbf6764c.bin doc-1024-1082-d9c8ba3f888249ae918d7dffbbf6764c-11_Cedula_RFC.pdf Clientes/4/Etapas/1024/doc-1024-1082-d9c8ba3f888249ae918d7dffbbf6764c-11_Cedula_RFC.pdf 44347 75D97258546FDD49567B605CA676CD5DF97F539A7134F9A977BE14D9FA48F912
28 29 1024 1080 True 12_Autorizaciones_CIDUE.pdf doc-1024-1080-f691bac55afb4c6084d21a7d2ab8f3a2.bin Clientes/4/Etapas/1024/doc-1024-1080-f691bac55afb4c6084d21a7d2ab8f3a2.bin doc-1024-1080-f691bac55afb4c6084d21a7d2ab8f3a2-12_Autorizaciones_CIDUE.pdf Clientes/4/Etapas/1024/doc-1024-1080-f691bac55afb4c6084d21a7d2ab8f3a2-12_Autorizaciones_CIDUE.pdf 44232 B68667D2A258EC28F3445017A42014A1CDEC4AD6686AE5FB4AD15B275B1D4E7E
29 30 1024 1045 True Croquis.png doc-1024-1045-61379c693d6241898e7cf30cffd8658a.bin Clientes/4/Etapas/1024/doc-1024-1045-61379c693d6241898e7cf30cffd8658a.bin doc-1024-1045-61379c693d6241898e7cf30cffd8658a-Croquis.png Clientes/4/Etapas/1024/doc-1024-1045-61379c693d6241898e7cf30cffd8658a-Croquis.png 984403 3A507595006CDBB8A59830E0B9634D11DCB85A4CBED1F2A5F35023043947E632
30 31 1024 1057 True Identificación Oficial.jpg doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
31 32 1024 1051 True 01_Oficio_solicitud_obras_necesarias.pdf doc-1024-1051-4037762f536045d59be5d818e2de6481.bin Clientes/4/Etapas/1024/doc-1024-1051-4037762f536045d59be5d818e2de6481.bin doc-1024-1051-4037762f536045d59be5d818e2de6481-01_Oficio_solicitud_obras_necesarias.pdf Clientes/4/Etapas/1024/doc-1024-1051-4037762f536045d59be5d818e2de6481-01_Oficio_solicitud_obras_necesarias.pdf 44555 DDBDF6829D3A8F8587E42A768C32EF08AEE89848001C4E9B19EEE24480B75AB8
32 33 1028 1053 True 02_Copia_escrituras.pdf doc-1028-1053-c2b0275d99924d3784d7aec44c0b8beb.bin Clientes/4/Etapas/1028/doc-1028-1053-c2b0275d99924d3784d7aec44c0b8beb.bin doc-1028-1053-c2b0275d99924d3784d7aec44c0b8beb-02_Copia_escrituras.pdf Clientes/4/Etapas/1028/doc-1028-1053-c2b0275d99924d3784d7aec44c0b8beb-02_Copia_escrituras.pdf 44497 DE63A4F755D5199D1EB98A024C03627B1AB698403481CE8C6BC5D92E7E8746CC
33 34 1028 1046 True 04_Dictamen_uso_suelo.pdf doc-1028-1046-c98e40e90f3b41cdb810222241f3fc9a.bin Clientes/4/Etapas/1028/doc-1028-1046-c98e40e90f3b41cdb810222241f3fc9a.bin doc-1028-1046-c98e40e90f3b41cdb810222241f3fc9a-04_Dictamen_uso_suelo.pdf Clientes/4/Etapas/1028/doc-1028-1046-c98e40e90f3b41cdb810222241f3fc9a-04_Dictamen_uso_suelo.pdf 44359 AE0069AEC8DDBE09071581126BEA3272BC37A4D758A764BF8A05D58755F4BC28
34 35 1028 1069 True 05_Carta_poder_representante_legal.pdf doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
35 36 1028 1040 True 06_Constancia_no_adeudo_tesoreria.pdf doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
36 37 1028 1079 True 08_Constancia_no_adeudo_Agua_Hermosillo.pdf doc-1028-1079-9be2156047bc4828b3e43b67fe3f6733.bin Clientes/4/Etapas/1028/doc-1028-1079-9be2156047bc4828b3e43b67fe3f6733.bin doc-1028-1079-9be2156047bc4828b3e43b67fe3f6733-08_Constancia_no_adeudo_Agua_Hermosillo.pdf Clientes/4/Etapas/1028/doc-1028-1079-9be2156047bc4828b3e43b67fe3f6733-08_Constancia_no_adeudo_Agua_Hermosillo.pdf 44351 04CD6B0F2739837F7BD711819D031FB73BACD7675B752906EFE283F46A7C3006
37 38 1028 1034 True 09_Acta_Constitutiva_empresa.pdf doc-1028-1034-583b7009cab246ed8287200ce7082495.bin Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495.bin doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
38 39 1028 1037 True 10_Comprobante_domicilio.pdf doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf 44184 0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0
39 40 1028 1082 True 11_Cedula_RFC.pdf doc-1028-1082-a21ee3513b5a4fe3b1f5f8f237ddc338.bin Clientes/4/Etapas/1028/doc-1028-1082-a21ee3513b5a4fe3b1f5f8f237ddc338.bin doc-1028-1082-a21ee3513b5a4fe3b1f5f8f237ddc338-11_Cedula_RFC.pdf Clientes/4/Etapas/1028/doc-1028-1082-a21ee3513b5a4fe3b1f5f8f237ddc338-11_Cedula_RFC.pdf 44347 75D97258546FDD49567B605CA676CD5DF97F539A7134F9A977BE14D9FA48F912
40 41 1028 1080 True 12_Autorizaciones_CIDUE.pdf doc-1028-1080-2fb84cc84de24223a9fcdeaf1fcd2470.bin Clientes/4/Etapas/1028/doc-1028-1080-2fb84cc84de24223a9fcdeaf1fcd2470.bin doc-1028-1080-2fb84cc84de24223a9fcdeaf1fcd2470-12_Autorizaciones_CIDUE.pdf Clientes/4/Etapas/1028/doc-1028-1080-2fb84cc84de24223a9fcdeaf1fcd2470-12_Autorizaciones_CIDUE.pdf 44232 B68667D2A258EC28F3445017A42014A1CDEC4AD6686AE5FB4AD15B275B1D4E7E
41 42 1028 1045 True Croquis.png doc-1028-1045-7f4784759eaf43f09e2a6433309008df.bin Clientes/4/Etapas/1028/doc-1028-1045-7f4784759eaf43f09e2a6433309008df.bin doc-1028-1045-7f4784759eaf43f09e2a6433309008df-Croquis.png Clientes/4/Etapas/1028/doc-1028-1045-7f4784759eaf43f09e2a6433309008df-Croquis.png 984403 3A507595006CDBB8A59830E0B9634D11DCB85A4CBED1F2A5F35023043947E632
42 43 1028 1057 True Identificación Oficial.jpg doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
43 44 1028 1051 True 01_Oficio_solicitud_obras_necesarias.pdf doc-1028-1051-90d0c12832f9428abb0ac645be0c7156.bin Clientes/4/Etapas/1028/doc-1028-1051-90d0c12832f9428abb0ac645be0c7156.bin doc-1028-1051-90d0c12832f9428abb0ac645be0c7156-01_Oficio_solicitud_obras_necesarias.pdf Clientes/4/Etapas/1028/doc-1028-1051-90d0c12832f9428abb0ac645be0c7156-01_Oficio_solicitud_obras_necesarias.pdf 44555 DDBDF6829D3A8F8587E42A768C32EF08AEE89848001C4E9B19EEE24480B75AB8
44 45 1022 1040 False VL103M user manual 20230921.pdf doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf 1146632 3C097C53A81FE7E60ECFB07A9FBD2163E8DB5DE7444050E0EC20ADAFCB7FBA3F
45 46 1022 1040 False VL103M user manual 20230921.pdf doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf 1146632 3C097C53A81FE7E60ECFB07A9FBD2163E8DB5DE7444050E0EC20ADAFCB7FBA3F
46 47 1022 1040 False VL103M user manual 20230921.pdf doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf 1146632 3C097C53A81FE7E60ECFB07A9FBD2163E8DB5DE7444050E0EC20ADAFCB7FBA3F
47 48 1022 1040 False VL103M user manual 20230921.pdf doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf 1146632 3C097C53A81FE7E60ECFB07A9FBD2163E8DB5DE7444050E0EC20ADAFCB7FBA3F
48 49 1022 1040 False VL103M user manual 20230921.pdf doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf 1146632 3C097C53A81FE7E60ECFB07A9FBD2163E8DB5DE7444050E0EC20ADAFCB7FBA3F
49 50 1022 1040 False VL103M user manual 20230921.pdf doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf 1146632 3C097C53A81FE7E60ECFB07A9FBD2163E8DB5DE7444050E0EC20ADAFCB7FBA3F
50 51 1022 1045 False BORRADOR EDISA.docx doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb.bin Clientes/1006/Etapas/1022/doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb.bin doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb-BORRADOR EDISA.docx Clientes/1006/Etapas/1022/doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb-BORRADOR EDISA.docx 16889 3074B0379B55A18B47EB06A4BAE47985B155CAC0583DE78B651988C7599A3C77
51 52 1022 1057 False 65007.jpeg doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg 128129 0F80A31813107978A32D13201884611FB35347E738BFDC4538D1ECE97FAD2081
52 53 1022 1057 False 65007.jpeg doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg 128129 0F80A31813107978A32D13201884611FB35347E738BFDC4538D1ECE97FAD2081
53 54 1022 1057 False 65007.jpeg doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg 128129 0F80A31813107978A32D13201884611FB35347E738BFDC4538D1ECE97FAD2081
54 55 1022 1057 False 65007.jpeg doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg 128129 0F80A31813107978A32D13201884611FB35347E738BFDC4538D1ECE97FAD2081
55 56 1022 1057 False 65007.jpeg doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg 128129 0F80A31813107978A32D13201884611FB35347E738BFDC4538D1ECE97FAD2081
56 57 1022 1057 False 65007.jpeg doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg 128129 0F80A31813107978A32D13201884611FB35347E738BFDC4538D1ECE97FAD2081
57 58 1022 1057 False 65007.jpeg doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg 128129 0F80A31813107978A32D13201884611FB35347E738BFDC4538D1ECE97FAD2081
58 59 1024 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
59 60 1024 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
60 61 1024 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
61 62 1024 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
62 63 1024 1069 False 05_Carta_poder_representante_legal.pdf doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
63 64 1024 1069 False 05_Carta_poder_representante_legal.pdf doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
64 65 1024 1069 False 05_Carta_poder_representante_legal.pdf doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
65 66 1024 1069 False 05_Carta_poder_representante_legal.pdf doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
66 67 1024 1069 False 05_Carta_poder_representante_legal.pdf doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
67 68 1024 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
68 69 1024 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
69 70 1024 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
70 71 1024 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
71 72 1024 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
72 73 1024 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
73 74 1024 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
74 75 1024 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
75 76 1024 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
76 77 1024 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
77 78 1024 1037 False 10_Comprobante_domicilio.pdf doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf 44184 0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0
78 79 1024 1037 False 10_Comprobante_domicilio.pdf doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf 44184 0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0
79 80 1024 1037 False 10_Comprobante_domicilio.pdf doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf 44184 0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0
80 81 1024 1037 False 10_Comprobante_domicilio.pdf doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf 44184 0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0
81 82 1024 1069 False 05_Carta_poder_representante_legal.pdf doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
82 83 1024 1069 False 05_Carta_poder_representante_legal.pdf doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
83 84 1024 1069 False 05_Carta_poder_representante_legal.pdf doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
84 85 1024 1069 False 05_Carta_poder_representante_legal.pdf doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
85 86 1024 1069 False 05_Carta_poder_representante_legal.pdf doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
86 87 1024 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
87 88 1024 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
88 89 1024 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
89 90 1024 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
90 91 1024 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
91 92 1024 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
92 93 1024 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
93 94 1024 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
94 95 1024 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
95 96 1024 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
96 97 1024 1037 False 10_Comprobante_domicilio.pdf doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf 44184 0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0
97 98 1024 1037 False 10_Comprobante_domicilio.pdf doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf 44184 0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0
98 99 1024 1037 False 10_Comprobante_domicilio.pdf doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf 44184 0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0
99 100 1024 1037 False 10_Comprobante_domicilio.pdf doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf 44184 0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0
100 101 1024 1045 False Croquis.png doc-1024-1045-d447e83e74d14977957ca05ed2465c28.bin Clientes/4/Etapas/1024/doc-1024-1045-d447e83e74d14977957ca05ed2465c28.bin doc-1024-1045-d447e83e74d14977957ca05ed2465c28-Croquis.png Clientes/4/Etapas/1024/doc-1024-1045-d447e83e74d14977957ca05ed2465c28-Croquis.png 984403 3A507595006CDBB8A59830E0B9634D11DCB85A4CBED1F2A5F35023043947E632
101 102 1024 1057 False Identificación Oficial.jpg doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
102 103 1024 1057 False Identificación Oficial.jpg doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
103 104 1024 1057 False Identificación Oficial.jpg doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
104 105 1024 1057 False Identificación Oficial.jpg doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
105 106 1024 1057 False Identificación Oficial.jpg doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
106 107 1024 1057 False Identificación Oficial.jpg doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
107 108 1024 1057 False Identificación Oficial.jpg doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
108 109 1024 1045 False Croquis.png doc-1024-1045-61379c693d6241898e7cf30cffd8658a.bin Clientes/4/Etapas/1024/doc-1024-1045-61379c693d6241898e7cf30cffd8658a.bin doc-1024-1045-61379c693d6241898e7cf30cffd8658a-Croquis.png Clientes/4/Etapas/1024/doc-1024-1045-61379c693d6241898e7cf30cffd8658a-Croquis.png 984403 3A507595006CDBB8A59830E0B9634D11DCB85A4CBED1F2A5F35023043947E632
109 110 1024 1057 False Identificación Oficial.jpg doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
110 111 1024 1057 False Identificación Oficial.jpg doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
111 112 1024 1057 False Identificación Oficial.jpg doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
112 113 1024 1057 False Identificación Oficial.jpg doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
113 114 1024 1057 False Identificación Oficial.jpg doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
114 115 1024 1057 False Identificación Oficial.jpg doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
115 116 1024 1057 False Identificación Oficial.jpg doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
116 117 1028 1069 False 05_Carta_poder_representante_legal.pdf doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
117 118 1028 1069 False 05_Carta_poder_representante_legal.pdf doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
118 119 1028 1069 False 05_Carta_poder_representante_legal.pdf doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
119 120 1028 1069 False 05_Carta_poder_representante_legal.pdf doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
120 121 1028 1069 False 05_Carta_poder_representante_legal.pdf doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf 44650 A40E9C9A5FBA9E40B133993051C39288D8A498CC71EBCFB354C2C9D73FA064F1
121 122 1028 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
122 123 1028 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
123 124 1028 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
124 125 1028 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
125 126 1028 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
126 127 1028 1040 False 06_Constancia_no_adeudo_tesoreria.pdf doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf 44515 4E2ADB80E976362F5A48D6D75FB421F193E2FB30AEE76F46132DB26BAD5CBF0F
127 128 1028 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1028-1034-583b7009cab246ed8287200ce7082495.bin Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495.bin doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
128 129 1028 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1028-1034-583b7009cab246ed8287200ce7082495.bin Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495.bin doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
129 130 1028 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1028-1034-583b7009cab246ed8287200ce7082495.bin Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495.bin doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
130 131 1028 1034 False 09_Acta_Constitutiva_empresa.pdf doc-1028-1034-583b7009cab246ed8287200ce7082495.bin Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495.bin doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf 44281 4461F94E3DCBE9BCF0FB45C099E3F87B969AC59BAB62E6CD7EA97133A5CD33A3
131 132 1028 1037 False 10_Comprobante_domicilio.pdf doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf 44184 0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0
132 133 1028 1037 False 10_Comprobante_domicilio.pdf doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf 44184 0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0
133 134 1028 1037 False 10_Comprobante_domicilio.pdf doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf 44184 0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0
134 135 1028 1037 False 10_Comprobante_domicilio.pdf doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf 44184 0222D8B303F2C0DA21863CA16BC160F2564963C14238009847C52C10526917D0
135 136 1028 1045 False Croquis.png doc-1028-1045-7f4784759eaf43f09e2a6433309008df.bin Clientes/4/Etapas/1028/doc-1028-1045-7f4784759eaf43f09e2a6433309008df.bin doc-1028-1045-7f4784759eaf43f09e2a6433309008df-Croquis.png Clientes/4/Etapas/1028/doc-1028-1045-7f4784759eaf43f09e2a6433309008df-Croquis.png 984403 3A507595006CDBB8A59830E0B9634D11DCB85A4CBED1F2A5F35023043947E632
136 137 1028 1057 False Identificación Oficial.jpg doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
137 138 1028 1057 False Identificación Oficial.jpg doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
138 139 1028 1057 False Identificación Oficial.jpg doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
139 140 1028 1057 False Identificación Oficial.jpg doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
140 141 1028 1057 False Identificación Oficial.jpg doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
141 142 1028 1057 False Identificación Oficial.jpg doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076
142 143 1028 1057 False Identificación Oficial.jpg doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg 55724 A5915340A4600EE8988CEDF4080E6828ED42FCD2DE432788102A328977A83076

View File

@@ -0,0 +1,243 @@
-- Migración de nombres físicos autorizada el 2026-10-03.
-- Requiere copias verificadas con el inventario CSV antes de ejecutarse.
-- Respaldo: Respaldo_NombresDocumentos_20261003.
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE @Mapeo TABLE
(
CveDocumentoSolicitud int PRIMARY KEY,
NombreAnterior varchar(255) COLLATE Modern_Spanish_CS_AS NOT NULL,
RutaAnterior varchar(1000) COLLATE Modern_Spanish_CS_AS NOT NULL,
NombreNuevo varchar(255) COLLATE Modern_Spanish_CS_AS NOT NULL,
RutaNueva varchar(1000) COLLATE Modern_Spanish_CS_AS NOT NULL
);
INSERT INTO @Mapeo
(CveDocumentoSolicitud, NombreAnterior, RutaAnterior, NombreNuevo, RutaNueva)
VALUES
(3, N'doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin', N'Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin', N'doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf', N'Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf'),
(4, N'doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb.bin', N'Clientes/1006/Etapas/1022/doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb.bin', N'doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb-BORRADOR EDISA.docx', N'Clientes/1006/Etapas/1022/doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb-BORRADOR EDISA.docx'),
(5, N'doc-1022-1046-c3b1e27e553449a7b5a4545222b63b0b.bin', N'Clientes/1006/Etapas/1022/doc-1022-1046-c3b1e27e553449a7b5a4545222b63b0b.bin', N'doc-1022-1046-c3b1e27e553449a7b5a4545222b63b0b-ACTIVIDADES LETYYYY.docx', N'Clientes/1006/Etapas/1022/doc-1022-1046-c3b1e27e553449a7b5a4545222b63b0b-ACTIVIDADES LETYYYY.docx'),
(6, N'doc-1022-1051-b0ea49a4b15241e5a6010a8b890b9791.bin', N'Clientes/1006/Etapas/1022/doc-1022-1051-b0ea49a4b15241e5a6010a8b890b9791.bin', N'doc-1022-1051-b0ea49a4b15241e5a6010a8b890b9791-Recibo-Ago (1).pdf', N'Clientes/1006/Etapas/1022/doc-1022-1051-b0ea49a4b15241e5a6010a8b890b9791-Recibo-Ago (1).pdf'),
(7, N'doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin', N'Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin', N'doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg', N'Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg'),
(8, N'doc-1022-1053-53864978166e40c2b3c7e06dd7c6333c.bin', N'Clientes/1006/Etapas/1022/doc-1022-1053-53864978166e40c2b3c7e06dd7c6333c.bin', N'doc-1022-1053-53864978166e40c2b3c7e06dd7c6333c-Etapa1_10_lotes.gis', N'Clientes/1006/Etapas/1022/doc-1022-1053-53864978166e40c2b3c7e06dd7c6333c-Etapa1_10_lotes.gis'),
(9, N'doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin', N'Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin', N'doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf'),
(10, N'doc-1024-1053-4026eac60fde4d57aca2ed30325c7aa7.bin', N'Clientes/4/Etapas/1024/doc-1024-1053-4026eac60fde4d57aca2ed30325c7aa7.bin', N'doc-1024-1053-4026eac60fde4d57aca2ed30325c7aa7-02_Copia_escrituras.pdf', N'Clientes/4/Etapas/1024/doc-1024-1053-4026eac60fde4d57aca2ed30325c7aa7-02_Copia_escrituras.pdf'),
(11, N'doc-1024-1046-168182c76cb843cbb3a2aff986bff057.bin', N'Clientes/4/Etapas/1024/doc-1024-1046-168182c76cb843cbb3a2aff986bff057.bin', N'doc-1024-1046-168182c76cb843cbb3a2aff986bff057-04_Dictamen_uso_suelo.pdf', N'Clientes/4/Etapas/1024/doc-1024-1046-168182c76cb843cbb3a2aff986bff057-04_Dictamen_uso_suelo.pdf'),
(12, N'doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin', N'Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin', N'doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf'),
(13, N'doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin', N'Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin', N'doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf'),
(14, N'doc-1024-1079-b838d1c6a81948a0ad275d93dca3b0f5.bin', N'Clientes/4/Etapas/1024/doc-1024-1079-b838d1c6a81948a0ad275d93dca3b0f5.bin', N'doc-1024-1079-b838d1c6a81948a0ad275d93dca3b0f5-08_Constancia_no_adeudo_Agua_Hermosillo.pdf', N'Clientes/4/Etapas/1024/doc-1024-1079-b838d1c6a81948a0ad275d93dca3b0f5-08_Constancia_no_adeudo_Agua_Hermosillo.pdf'),
(15, N'doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin', N'Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin', N'doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf'),
(16, N'doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin', N'Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin', N'doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf', N'Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf'),
(17, N'doc-1024-1053-393eb44b58d24c128d4b5cc5090cc117.bin', N'Clientes/4/Etapas/1024/doc-1024-1053-393eb44b58d24c128d4b5cc5090cc117.bin', N'doc-1024-1053-393eb44b58d24c128d4b5cc5090cc117-02_Copia_escrituras.pdf', N'Clientes/4/Etapas/1024/doc-1024-1053-393eb44b58d24c128d4b5cc5090cc117-02_Copia_escrituras.pdf'),
(18, N'doc-1024-1046-746dbd30e6f343338537a9e5e0b3ee59.bin', N'Clientes/4/Etapas/1024/doc-1024-1046-746dbd30e6f343338537a9e5e0b3ee59.bin', N'doc-1024-1046-746dbd30e6f343338537a9e5e0b3ee59-04_Dictamen_uso_suelo.pdf', N'Clientes/4/Etapas/1024/doc-1024-1046-746dbd30e6f343338537a9e5e0b3ee59-04_Dictamen_uso_suelo.pdf'),
(19, N'doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin', N'Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin', N'doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf'),
(20, N'doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin', N'Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin', N'doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf'),
(21, N'doc-1024-1079-b25d1e7c30b0443cb66423c56c45c46c.bin', N'Clientes/4/Etapas/1024/doc-1024-1079-b25d1e7c30b0443cb66423c56c45c46c.bin', N'doc-1024-1079-b25d1e7c30b0443cb66423c56c45c46c-08_Constancia_no_adeudo_Agua_Hermosillo.pdf', N'Clientes/4/Etapas/1024/doc-1024-1079-b25d1e7c30b0443cb66423c56c45c46c-08_Constancia_no_adeudo_Agua_Hermosillo.pdf'),
(22, N'doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin', N'Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin', N'doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf'),
(23, N'doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin', N'Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin', N'doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf', N'Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf'),
(24, N'doc-1024-1082-02f16c7d84fb4781ae5f7e5280422788.bin', N'Clientes/4/Etapas/1024/doc-1024-1082-02f16c7d84fb4781ae5f7e5280422788.bin', N'doc-1024-1082-02f16c7d84fb4781ae5f7e5280422788-11_Cedula_RFC.pdf', N'Clientes/4/Etapas/1024/doc-1024-1082-02f16c7d84fb4781ae5f7e5280422788-11_Cedula_RFC.pdf'),
(25, N'doc-1024-1080-2337d1e8ab91435891a9332b5fd58262.bin', N'Clientes/4/Etapas/1024/doc-1024-1080-2337d1e8ab91435891a9332b5fd58262.bin', N'doc-1024-1080-2337d1e8ab91435891a9332b5fd58262-12_Autorizaciones_CIDUE.pdf', N'Clientes/4/Etapas/1024/doc-1024-1080-2337d1e8ab91435891a9332b5fd58262-12_Autorizaciones_CIDUE.pdf'),
(26, N'doc-1024-1045-d447e83e74d14977957ca05ed2465c28.bin', N'Clientes/4/Etapas/1024/doc-1024-1045-d447e83e74d14977957ca05ed2465c28.bin', N'doc-1024-1045-d447e83e74d14977957ca05ed2465c28-Croquis.png', N'Clientes/4/Etapas/1024/doc-1024-1045-d447e83e74d14977957ca05ed2465c28-Croquis.png'),
(27, N'doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin', N'Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin', N'doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg', N'Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg'),
(28, N'doc-1024-1082-d9c8ba3f888249ae918d7dffbbf6764c.bin', N'Clientes/4/Etapas/1024/doc-1024-1082-d9c8ba3f888249ae918d7dffbbf6764c.bin', N'doc-1024-1082-d9c8ba3f888249ae918d7dffbbf6764c-11_Cedula_RFC.pdf', N'Clientes/4/Etapas/1024/doc-1024-1082-d9c8ba3f888249ae918d7dffbbf6764c-11_Cedula_RFC.pdf'),
(29, N'doc-1024-1080-f691bac55afb4c6084d21a7d2ab8f3a2.bin', N'Clientes/4/Etapas/1024/doc-1024-1080-f691bac55afb4c6084d21a7d2ab8f3a2.bin', N'doc-1024-1080-f691bac55afb4c6084d21a7d2ab8f3a2-12_Autorizaciones_CIDUE.pdf', N'Clientes/4/Etapas/1024/doc-1024-1080-f691bac55afb4c6084d21a7d2ab8f3a2-12_Autorizaciones_CIDUE.pdf'),
(30, N'doc-1024-1045-61379c693d6241898e7cf30cffd8658a.bin', N'Clientes/4/Etapas/1024/doc-1024-1045-61379c693d6241898e7cf30cffd8658a.bin', N'doc-1024-1045-61379c693d6241898e7cf30cffd8658a-Croquis.png', N'Clientes/4/Etapas/1024/doc-1024-1045-61379c693d6241898e7cf30cffd8658a-Croquis.png'),
(31, N'doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin', N'Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin', N'doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg', N'Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg'),
(32, N'doc-1024-1051-4037762f536045d59be5d818e2de6481.bin', N'Clientes/4/Etapas/1024/doc-1024-1051-4037762f536045d59be5d818e2de6481.bin', N'doc-1024-1051-4037762f536045d59be5d818e2de6481-01_Oficio_solicitud_obras_necesarias.pdf', N'Clientes/4/Etapas/1024/doc-1024-1051-4037762f536045d59be5d818e2de6481-01_Oficio_solicitud_obras_necesarias.pdf'),
(33, N'doc-1028-1053-c2b0275d99924d3784d7aec44c0b8beb.bin', N'Clientes/4/Etapas/1028/doc-1028-1053-c2b0275d99924d3784d7aec44c0b8beb.bin', N'doc-1028-1053-c2b0275d99924d3784d7aec44c0b8beb-02_Copia_escrituras.pdf', N'Clientes/4/Etapas/1028/doc-1028-1053-c2b0275d99924d3784d7aec44c0b8beb-02_Copia_escrituras.pdf'),
(34, N'doc-1028-1046-c98e40e90f3b41cdb810222241f3fc9a.bin', N'Clientes/4/Etapas/1028/doc-1028-1046-c98e40e90f3b41cdb810222241f3fc9a.bin', N'doc-1028-1046-c98e40e90f3b41cdb810222241f3fc9a-04_Dictamen_uso_suelo.pdf', N'Clientes/4/Etapas/1028/doc-1028-1046-c98e40e90f3b41cdb810222241f3fc9a-04_Dictamen_uso_suelo.pdf'),
(35, N'doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin', N'Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin', N'doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf'),
(36, N'doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin', N'Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin', N'doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf'),
(37, N'doc-1028-1079-9be2156047bc4828b3e43b67fe3f6733.bin', N'Clientes/4/Etapas/1028/doc-1028-1079-9be2156047bc4828b3e43b67fe3f6733.bin', N'doc-1028-1079-9be2156047bc4828b3e43b67fe3f6733-08_Constancia_no_adeudo_Agua_Hermosillo.pdf', N'Clientes/4/Etapas/1028/doc-1028-1079-9be2156047bc4828b3e43b67fe3f6733-08_Constancia_no_adeudo_Agua_Hermosillo.pdf'),
(38, N'doc-1028-1034-583b7009cab246ed8287200ce7082495.bin', N'Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495.bin', N'doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf'),
(39, N'doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin', N'Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin', N'doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf', N'Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf'),
(40, N'doc-1028-1082-a21ee3513b5a4fe3b1f5f8f237ddc338.bin', N'Clientes/4/Etapas/1028/doc-1028-1082-a21ee3513b5a4fe3b1f5f8f237ddc338.bin', N'doc-1028-1082-a21ee3513b5a4fe3b1f5f8f237ddc338-11_Cedula_RFC.pdf', N'Clientes/4/Etapas/1028/doc-1028-1082-a21ee3513b5a4fe3b1f5f8f237ddc338-11_Cedula_RFC.pdf'),
(41, N'doc-1028-1080-2fb84cc84de24223a9fcdeaf1fcd2470.bin', N'Clientes/4/Etapas/1028/doc-1028-1080-2fb84cc84de24223a9fcdeaf1fcd2470.bin', N'doc-1028-1080-2fb84cc84de24223a9fcdeaf1fcd2470-12_Autorizaciones_CIDUE.pdf', N'Clientes/4/Etapas/1028/doc-1028-1080-2fb84cc84de24223a9fcdeaf1fcd2470-12_Autorizaciones_CIDUE.pdf'),
(42, N'doc-1028-1045-7f4784759eaf43f09e2a6433309008df.bin', N'Clientes/4/Etapas/1028/doc-1028-1045-7f4784759eaf43f09e2a6433309008df.bin', N'doc-1028-1045-7f4784759eaf43f09e2a6433309008df-Croquis.png', N'Clientes/4/Etapas/1028/doc-1028-1045-7f4784759eaf43f09e2a6433309008df-Croquis.png'),
(43, N'doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin', N'Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin', N'doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg', N'Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg'),
(44, N'doc-1028-1051-90d0c12832f9428abb0ac645be0c7156.bin', N'Clientes/4/Etapas/1028/doc-1028-1051-90d0c12832f9428abb0ac645be0c7156.bin', N'doc-1028-1051-90d0c12832f9428abb0ac645be0c7156-01_Oficio_solicitud_obras_necesarias.pdf', N'Clientes/4/Etapas/1028/doc-1028-1051-90d0c12832f9428abb0ac645be0c7156-01_Oficio_solicitud_obras_necesarias.pdf'),
(45, N'doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin', N'Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin', N'doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf', N'Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf'),
(46, N'doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin', N'Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin', N'doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf', N'Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf'),
(47, N'doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin', N'Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin', N'doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf', N'Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf'),
(48, N'doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin', N'Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin', N'doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf', N'Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf'),
(49, N'doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin', N'Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin', N'doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf', N'Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf'),
(50, N'doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin', N'Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd.bin', N'doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf', N'Clientes/1006/Etapas/1022/doc-1022-1040-b6e404e6e7dc4597860185076b3289dd-VL103M user manual 20230921.pdf'),
(51, N'doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb.bin', N'Clientes/1006/Etapas/1022/doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb.bin', N'doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb-BORRADOR EDISA.docx', N'Clientes/1006/Etapas/1022/doc-1022-1045-b8d0648d970b4cababc65f30c58b1ccb-BORRADOR EDISA.docx'),
(52, N'doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin', N'Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin', N'doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg', N'Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg'),
(53, N'doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin', N'Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin', N'doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg', N'Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg'),
(54, N'doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin', N'Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin', N'doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg', N'Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg'),
(55, N'doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin', N'Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin', N'doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg', N'Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg'),
(56, N'doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin', N'Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin', N'doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg', N'Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg'),
(57, N'doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin', N'Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin', N'doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg', N'Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg'),
(58, N'doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin', N'Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422.bin', N'doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg', N'Clientes/1006/Etapas/1022/doc-1022-1057-626fd5ba8cc747fcae64ad2c8466f422-65007.jpeg'),
(59, N'doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin', N'Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin', N'doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf'),
(60, N'doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin', N'Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin', N'doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf'),
(61, N'doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin', N'Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin', N'doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf'),
(62, N'doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin', N'Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42.bin', N'doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1024/doc-1024-1034-3212891ee8f847aba1e83b01fc27ef42-09_Acta_Constitutiva_empresa.pdf'),
(63, N'doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin', N'Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin', N'doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf'),
(64, N'doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin', N'Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin', N'doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf'),
(65, N'doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin', N'Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin', N'doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf'),
(66, N'doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin', N'Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin', N'doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf'),
(67, N'doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin', N'Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8.bin', N'doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1024/doc-1024-1069-1c7a3c7eb01f44acac908819648f3ca8-05_Carta_poder_representante_legal.pdf'),
(68, N'doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin', N'Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin', N'doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf'),
(69, N'doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin', N'Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin', N'doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf'),
(70, N'doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin', N'Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin', N'doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf'),
(71, N'doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin', N'Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin', N'doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf'),
(72, N'doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin', N'Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin', N'doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf'),
(73, N'doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin', N'Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971.bin', N'doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1024/doc-1024-1040-cfb6478de0c64aa8933fa2df00de1971-06_Constancia_no_adeudo_tesoreria.pdf'),
(74, N'doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin', N'Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin', N'doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf'),
(75, N'doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin', N'Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin', N'doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf'),
(76, N'doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin', N'Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin', N'doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf'),
(77, N'doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin', N'Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba.bin', N'doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1024/doc-1024-1034-703001ed04cd4768805ea52d87c496ba-09_Acta_Constitutiva_empresa.pdf'),
(78, N'doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin', N'Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin', N'doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf', N'Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf'),
(79, N'doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin', N'Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin', N'doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf', N'Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf'),
(80, N'doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin', N'Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin', N'doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf', N'Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf'),
(81, N'doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin', N'Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096.bin', N'doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf', N'Clientes/4/Etapas/1024/doc-1024-1037-251daa4398b44a56bb95dcd11326c096-10_Comprobante_domicilio.pdf'),
(82, N'doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin', N'Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin', N'doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf'),
(83, N'doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin', N'Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin', N'doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf'),
(84, N'doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin', N'Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin', N'doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf'),
(85, N'doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin', N'Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin', N'doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf'),
(86, N'doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin', N'Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77.bin', N'doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1024/doc-1024-1069-a126b490c1e24edbab7b044bf0549e77-05_Carta_poder_representante_legal.pdf'),
(87, N'doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin', N'Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin', N'doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf'),
(88, N'doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin', N'Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin', N'doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf'),
(89, N'doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin', N'Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin', N'doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf'),
(90, N'doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin', N'Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin', N'doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf'),
(91, N'doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin', N'Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin', N'doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf'),
(92, N'doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin', N'Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d.bin', N'doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1024/doc-1024-1040-52f4c0205ee1446b884f6c64f20e505d-06_Constancia_no_adeudo_tesoreria.pdf'),
(93, N'doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin', N'Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin', N'doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf'),
(94, N'doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin', N'Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin', N'doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf'),
(95, N'doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin', N'Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin', N'doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf'),
(96, N'doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin', N'Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5.bin', N'doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1024/doc-1024-1034-1f93d872f1c549988ab7b6f3f9b574f5-09_Acta_Constitutiva_empresa.pdf'),
(97, N'doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin', N'Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin', N'doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf', N'Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf'),
(98, N'doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin', N'Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin', N'doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf', N'Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf'),
(99, N'doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin', N'Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin', N'doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf', N'Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf'),
(100, N'doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin', N'Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f.bin', N'doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf', N'Clientes/4/Etapas/1024/doc-1024-1037-8ab956638dc442e49632d23459f4cb2f-10_Comprobante_domicilio.pdf'),
(101, N'doc-1024-1045-d447e83e74d14977957ca05ed2465c28.bin', N'Clientes/4/Etapas/1024/doc-1024-1045-d447e83e74d14977957ca05ed2465c28.bin', N'doc-1024-1045-d447e83e74d14977957ca05ed2465c28-Croquis.png', N'Clientes/4/Etapas/1024/doc-1024-1045-d447e83e74d14977957ca05ed2465c28-Croquis.png'),
(102, N'doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin', N'Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin', N'doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg', N'Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg'),
(103, N'doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin', N'Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin', N'doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg', N'Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg'),
(104, N'doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin', N'Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin', N'doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg', N'Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg'),
(105, N'doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin', N'Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin', N'doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg', N'Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg'),
(106, N'doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin', N'Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin', N'doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg', N'Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg'),
(107, N'doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin', N'Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin', N'doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg', N'Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg'),
(108, N'doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin', N'Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e.bin', N'doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg', N'Clientes/4/Etapas/1024/doc-1024-1057-a00c7eb989a64e47baec43163755e90e-Identificación Oficial.jpg'),
(109, N'doc-1024-1045-61379c693d6241898e7cf30cffd8658a.bin', N'Clientes/4/Etapas/1024/doc-1024-1045-61379c693d6241898e7cf30cffd8658a.bin', N'doc-1024-1045-61379c693d6241898e7cf30cffd8658a-Croquis.png', N'Clientes/4/Etapas/1024/doc-1024-1045-61379c693d6241898e7cf30cffd8658a-Croquis.png'),
(110, N'doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin', N'Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin', N'doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg', N'Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg'),
(111, N'doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin', N'Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin', N'doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg', N'Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg'),
(112, N'doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin', N'Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin', N'doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg', N'Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg'),
(113, N'doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin', N'Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin', N'doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg', N'Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg'),
(114, N'doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin', N'Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin', N'doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg', N'Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg'),
(115, N'doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin', N'Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin', N'doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg', N'Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg'),
(116, N'doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin', N'Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3.bin', N'doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg', N'Clientes/4/Etapas/1024/doc-1024-1057-6f6f616d9d894e549d344781acf4b1f3-Identificación Oficial.jpg'),
(117, N'doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin', N'Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin', N'doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf'),
(118, N'doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin', N'Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin', N'doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf'),
(119, N'doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin', N'Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin', N'doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf'),
(120, N'doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin', N'Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin', N'doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf'),
(121, N'doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin', N'Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713.bin', N'doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf', N'Clientes/4/Etapas/1028/doc-1028-1069-320a3b0bf9294a92be5ebf802fcd4713-05_Carta_poder_representante_legal.pdf'),
(122, N'doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin', N'Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin', N'doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf'),
(123, N'doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin', N'Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin', N'doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf'),
(124, N'doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin', N'Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin', N'doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf'),
(125, N'doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin', N'Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin', N'doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf'),
(126, N'doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin', N'Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin', N'doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf'),
(127, N'doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin', N'Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072.bin', N'doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf', N'Clientes/4/Etapas/1028/doc-1028-1040-9bc673275f414c8d8d320e9bbf698072-06_Constancia_no_adeudo_tesoreria.pdf'),
(128, N'doc-1028-1034-583b7009cab246ed8287200ce7082495.bin', N'Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495.bin', N'doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf'),
(129, N'doc-1028-1034-583b7009cab246ed8287200ce7082495.bin', N'Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495.bin', N'doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf'),
(130, N'doc-1028-1034-583b7009cab246ed8287200ce7082495.bin', N'Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495.bin', N'doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf'),
(131, N'doc-1028-1034-583b7009cab246ed8287200ce7082495.bin', N'Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495.bin', N'doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf', N'Clientes/4/Etapas/1028/doc-1028-1034-583b7009cab246ed8287200ce7082495-09_Acta_Constitutiva_empresa.pdf'),
(132, N'doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin', N'Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin', N'doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf', N'Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf'),
(133, N'doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin', N'Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin', N'doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf', N'Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf'),
(134, N'doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin', N'Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin', N'doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf', N'Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf'),
(135, N'doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin', N'Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915.bin', N'doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf', N'Clientes/4/Etapas/1028/doc-1028-1037-06adb9de68924cebafe0052e68b83915-10_Comprobante_domicilio.pdf'),
(136, N'doc-1028-1045-7f4784759eaf43f09e2a6433309008df.bin', N'Clientes/4/Etapas/1028/doc-1028-1045-7f4784759eaf43f09e2a6433309008df.bin', N'doc-1028-1045-7f4784759eaf43f09e2a6433309008df-Croquis.png', N'Clientes/4/Etapas/1028/doc-1028-1045-7f4784759eaf43f09e2a6433309008df-Croquis.png'),
(137, N'doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin', N'Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin', N'doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg', N'Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg'),
(138, N'doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin', N'Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin', N'doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg', N'Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg'),
(139, N'doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin', N'Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin', N'doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg', N'Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg'),
(140, N'doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin', N'Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin', N'doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg', N'Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg'),
(141, N'doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin', N'Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin', N'doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg', N'Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg'),
(142, N'doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin', N'Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin', N'doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg', N'Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg'),
(143, N'doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin', N'Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c.bin', N'doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg', N'Clientes/4/Etapas/1028/doc-1028-1057-657aeb02d955432c8a9f4a1a12042c1c-Identificación Oficial.jpg');
BEGIN TRY
BEGIN TRANSACTION;
SELECT documento.*
INTO #Antes
FROM dbo.Tra_DocumentosSolicitud AS documento WITH (TABLOCKX, HOLDLOCK);
IF EXISTS
(
SELECT 1
FROM @Mapeo AS mapeo
LEFT JOIN #Antes AS documento ON documento.CveDocumentoSolicitud = mapeo.CveDocumentoSolicitud
WHERE documento.CveDocumentoSolicitud IS NULL
OR documento.NombreArchivoFisico IS NULL
OR documento.RutaArchivo IS NULL
OR NOT
(
(documento.NombreArchivoFisico = mapeo.NombreAnterior AND documento.RutaArchivo = mapeo.RutaAnterior)
OR (documento.NombreArchivoFisico = mapeo.NombreNuevo AND documento.RutaArchivo = mapeo.RutaNueva)
)
)
THROW 51000, 'El inventario cambió. Revisar antes de migrar.', 1;
IF EXISTS
(
SELECT 1
FROM #Antes AS documento
INNER JOIN @Mapeo AS mapeo ON documento.RutaArchivo = mapeo.RutaAnterior
WHERE NOT EXISTS
(
SELECT 1
FROM @Mapeo AS conocido
WHERE conocido.CveDocumentoSolicitud = documento.CveDocumentoSolicitud
)
)
THROW 51001, 'Existen nuevas referencias a los archivos anteriores.', 1;
UPDATE documento
SET NombreArchivoFisico = mapeo.NombreNuevo,
RutaArchivo = mapeo.RutaNueva
FROM dbo.Tra_DocumentosSolicitud AS documento
INNER JOIN @Mapeo AS mapeo ON documento.CveDocumentoSolicitud = mapeo.CveDocumentoSolicitud
WHERE documento.NombreArchivoFisico = mapeo.NombreAnterior
AND documento.RutaArchivo = mapeo.RutaAnterior;
DECLARE @Actualizados int = @@ROWCOUNT;
IF EXISTS
(
SELECT [CveDocumentoSolicitud], [CveSolicitud], [CveTipoDocumento], [NombreArchivo], [ContentType], [TamanoBytes], [ComentarioCliente], [ComentarioAdministrativo], [EsAprobado], [CveUsuarioCarga], [CveUsuarioRevisa], [FechaRevision], [FechaAlta], [UltimaNota], [FechaDocumento], [FechaVencimiento], [EsActivo], [CveFraccionamientoEtapa], [Vencido], [CveTipoTramite]
FROM #Antes
EXCEPT
SELECT [CveDocumentoSolicitud], [CveSolicitud], [CveTipoDocumento], [NombreArchivo], [ContentType], [TamanoBytes], [ComentarioCliente], [ComentarioAdministrativo], [EsAprobado], [CveUsuarioCarga], [CveUsuarioRevisa], [FechaRevision], [FechaAlta], [UltimaNota], [FechaDocumento], [FechaVencimiento], [EsActivo], [CveFraccionamientoEtapa], [Vencido], [CveTipoTramite]
FROM dbo.Tra_DocumentosSolicitud
)
OR EXISTS
(
SELECT [CveDocumentoSolicitud], [CveSolicitud], [CveTipoDocumento], [NombreArchivo], [ContentType], [TamanoBytes], [ComentarioCliente], [ComentarioAdministrativo], [EsAprobado], [CveUsuarioCarga], [CveUsuarioRevisa], [FechaRevision], [FechaAlta], [UltimaNota], [FechaDocumento], [FechaVencimiento], [EsActivo], [CveFraccionamientoEtapa], [Vencido], [CveTipoTramite]
FROM dbo.Tra_DocumentosSolicitud
EXCEPT
SELECT [CveDocumentoSolicitud], [CveSolicitud], [CveTipoDocumento], [NombreArchivo], [ContentType], [TamanoBytes], [ComentarioCliente], [ComentarioAdministrativo], [EsAprobado], [CveUsuarioCarga], [CveUsuarioRevisa], [FechaRevision], [FechaAlta], [UltimaNota], [FechaDocumento], [FechaVencimiento], [EsActivo], [CveFraccionamientoEtapa], [Vencido], [CveTipoTramite]
FROM #Antes
)
THROW 51002, 'Se detectó un cambio ajeno a las rutas.', 1;
IF EXISTS
(
SELECT 1
FROM @Mapeo AS mapeo
INNER JOIN dbo.Tra_DocumentosSolicitud AS documento ON documento.CveDocumentoSolicitud = mapeo.CveDocumentoSolicitud
WHERE documento.NombreArchivoFisico <> mapeo.NombreNuevo
OR documento.RutaArchivo <> mapeo.RutaNueva
)
THROW 51003, 'No se actualizaron todas las referencias.', 1;
COMMIT TRANSACTION;
SELECT @Actualizados AS ReferenciasActualizadas;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
THROW;
END CATCH;

View 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

View 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

View 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;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,412 @@
{
"type": "FeatureCollection",
"name": "Etapa1_10_lotes",
"crs": {
"type": "name",
"properties": {
"name": "EPSG:4326"
}
},
"features": [
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-1",
"Tipo": "Lote",
"Calle": "Calle Demo 1",
"Catastro": "CAT-001",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9555,
29.09
],
[
-110.95532,
29.09
],
[
-110.95532,
29.090139999999998
],
[
-110.9555,
29.090139999999998
],
[
-110.9555,
29.09
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-2",
"Tipo": "Lote",
"Calle": "Calle Demo 1",
"Catastro": "CAT-002",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9553,
29.09
],
[
-110.95512,
29.09
],
[
-110.95512,
29.090139999999998
],
[
-110.9553,
29.090139999999998
],
[
-110.9553,
29.09
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-3",
"Tipo": "Lote",
"Calle": "Calle Demo 1",
"Catastro": "CAT-003",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9551,
29.09
],
[
-110.95492,
29.09
],
[
-110.95492,
29.090139999999998
],
[
-110.9551,
29.090139999999998
],
[
-110.9551,
29.09
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-4",
"Tipo": "Lote",
"Calle": "Calle Demo 1",
"Catastro": "CAT-004",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9549,
29.09
],
[
-110.95472,
29.09
],
[
-110.95472,
29.090139999999998
],
[
-110.9549,
29.090139999999998
],
[
-110.9549,
29.09
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-5",
"Tipo": "Lote",
"Calle": "Calle Demo 1",
"Catastro": "CAT-005",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9547,
29.09
],
[
-110.95452,
29.09
],
[
-110.95452,
29.090139999999998
],
[
-110.9547,
29.090139999999998
],
[
-110.9547,
29.09
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-6",
"Tipo": "Lote",
"Calle": "Calle Demo 2",
"Catastro": "CAT-006",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9555,
29.09016
],
[
-110.95532,
29.09016
],
[
-110.95532,
29.0903
],
[
-110.9555,
29.0903
],
[
-110.9555,
29.09016
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-7",
"Tipo": "Lote",
"Calle": "Calle Demo 2",
"Catastro": "CAT-007",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9553,
29.09016
],
[
-110.95512,
29.09016
],
[
-110.95512,
29.0903
],
[
-110.9553,
29.0903
],
[
-110.9553,
29.09016
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-8",
"Tipo": "Lote",
"Calle": "Calle Demo 2",
"Catastro": "CAT-008",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9551,
29.09016
],
[
-110.95492,
29.09016
],
[
-110.95492,
29.0903
],
[
-110.9551,
29.0903
],
[
-110.9551,
29.09016
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-9",
"Tipo": "Lote",
"Calle": "Calle Demo 2",
"Catastro": "CAT-009",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9549,
29.09016
],
[
-110.95472,
29.09016
],
[
-110.95472,
29.0903
],
[
-110.9549,
29.0903
],
[
-110.9549,
29.09016
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-10",
"Tipo": "Lote",
"Calle": "Calle Demo 2",
"Catastro": "CAT-010",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9547,
29.09016
],
[
-110.95452,
29.09016
],
[
-110.95452,
29.0903
],
[
-110.9547,
29.0903
],
[
-110.9547,
29.09016
]
]
]
}
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 961 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 961 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 961 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

File diff suppressed because it is too large Load Diff

View 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.

View 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;

View File

@@ -1,5 +1,11 @@
using System;
using System.Configuration;
using SIG.Web.AppCode.Contracts.Clientes;
using SIG.Web.AppCode.Contracts.Convenios;
using SIG.Web.AppCode.Repositories.Clientes;
using SIG.Web.AppCode.Repositories.Convenios;
using SIG.Web.AppCode.Services.Clientes;
using SIG.Web.AppCode.Services.Convenios;
using SIG.Web.AppCode.Contracts.Bitacora;
using SIG.Web.AppCode.Contracts.Database;
using SIG.Web.AppCode.Contracts.Documentos;
@@ -12,6 +18,7 @@ using SIG.Web.AppCode.Contracts.Security;
using SIG.Web.AppCode.Contracts.Tramites;
using SIG.Web.AppCode.Contracts.Ventas;
using SIG.Web.AppCode.Notifications.Contracts;
using SIG.Web.AppCode.Notifications.Repositories;
using SIG.Web.AppCode.Notifications.Services;
using SIG.Web.AppCode.Repositories.Bitacora;
using SIG.Web.AppCode.Repositories.Database;
@@ -43,10 +50,15 @@ 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 IServicioPortalCliente ServicioPortalCliente { 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; }
@@ -54,10 +66,13 @@ namespace SIG.Web.AppCode.Configuration
public static IClienteDocumentoService ClienteDocumentoService { get; private set; }
public static ITramiteDocumentoService TramiteDocumentoService { get; private set; }
public static IServicioFraccionamiento ServicioFraccionamiento { get; private set; }
public static IServicioLotesEtapa ServicioLotesEtapa { get; private set; }
public static IServicioGisFraccionamiento ServicioGisFraccionamiento { get; private set; }
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 IServicioConvenios ServicioConvenios { get; private set; }
public static IServicioTimbradoCfdi ServicioTimbradoCfdi { get; private set; }
public static IPublicRegistrationService PublicRegistrationService { get; private set; }
public static ILoginAttemptRepository LoginAttemptRepository { get; private set; }
@@ -67,6 +82,8 @@ namespace SIG.Web.AppCode.Configuration
public static IPermissionService PermissionService { get; private set; }
public static IMenuProvider MenuProvider { get; private set; }
public static INotificationCenter NotificationCenter { get; private set; }
public static INotificacionService NotificacionService { get; private set; }
public static INotificacionConfiguracionService NotificacionConfiguracionService { get; private set; }
public static IBuscadorCatalogoDataProvider SearchProvider { get; private set; }
public static void Configure()
@@ -96,11 +113,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 +141,16 @@ namespace SIG.Web.AppCode.Configuration
ClienteDocumentoService = new ClienteDocumentoService(
new ClienteDocumentoRepository(DbExecutor));
ITramiteSolicitudRepository tramiteSolicitudRepository =
new TramiteSolicitudRepository(DbExecutor);
INotificacionRepository notificacionRepository =
new NotificacionRepository(DbExecutor);
NotificacionService = new NotificacionService(
notificacionRepository,
new SmtpEmailSender());
NotificacionConfiguracionService = new NotificacionConfiguracionService(
notificacionRepository,
NotificacionService);
ITramiteDocumentoRepository tramiteDocumentoRepository =
new TramiteDocumentoRepository(DbExecutor);
ITramiteDocumentoFileStore tramiteDocumentoFileStore =
@@ -117,16 +158,25 @@ namespace SIG.Web.AppCode.Configuration
TramiteDocumentoService = new TramiteDocumentoService(
tramiteDocumentoRepository,
tramiteDocumentoFileStore,
BitacoraService);
BitacoraService,
UserContext,
tramiteSolicitudRepository,
NotificacionConfiguracionService);
ITramiteSolicitudRepository tramiteSolicitudRepository =
new TramiteSolicitudRepository(DbExecutor);
IRepositorioFraccionamiento repositorioFraccionamiento =
new RepositorioFraccionamiento(DbExecutor);
ServicioFraccionamiento = new ServicioFraccionamiento(
new RepositorioFraccionamiento(DbExecutor),
repositorioFraccionamiento,
tramiteSolicitudRepository,
BitacoraService);
IRepositorioLotesEtapa repositorioLotesEtapa =
new RepositorioLotesEtapa(DbExecutor);
ServicioLotesEtapa = new ServicioLotesEtapa(
repositorioLotesEtapa,
BitacoraService);
IRepositorioGisFraccionamiento repositorioGis =
new RepositorioGisFraccionamiento(DbExecutor);
IAlmacenArchivosGisFraccionamiento almacenArchivosGis =
@@ -136,12 +186,24 @@ 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,
BitacoraService);
repositorioFraccionamiento,
BitacoraService,
TramiteDocumentoService,
UserContext,
NotificacionConfiguracionService);
var clienteProfact = new ClienteTimbradoPacProfact(
new ProveedorCredencialPacConfiguracion());
ServicioTimbradoCfdi = new ServicioTimbradoCfdi(
@@ -158,7 +220,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);
@@ -169,6 +232,21 @@ namespace SIG.Web.AppCode.Configuration
PermissionService = new PermissionService(
permissionRepository);
ServicioConvenios = new ServicioConvenios(new RepositorioConvenios(DbExecutor), UserContext);
ServicioPortalCliente = new ServicioPortalCliente(
new RepositorioPortalCliente(DbExecutor),
ServicioFraccionamiento,
TramiteDocumentoService,
TramiteSolicitudService,
new AlmacenComprobantesConvenio(),
UserContext);
ServicioPagosConvenios = new ServicioPagosConvenios(
new RepositorioPagosConvenios(DbExecutor),
tramiteSolicitudRepository,
UserAdministrationRepository,
UserContext,
PermissionService,
BitacoraService);
MenuProvider = new MenuProvider(menuRepository);
NotificationCenter = new DummyNotificationCenter();
SearchProvider = new DummyBuscadorCatalogoDataProvider();

View File

@@ -1,4 +1,4 @@
using System.Web.Optimization;
using System.Web.Optimization;
using System.Web.UI;
namespace SIG.Web.AppCode.Configuration
@@ -57,10 +57,22 @@ namespace SIG.Web.AppCode.Configuration
"~/Scripts/UcBuscadorCatalogo.js",
"~/Scripts/SigPdfViewer.js",
"~/Scripts/SigPdfDrawer.js",
"~/Scripts/PanelLateral.js",
"~/Scripts/DocumentosEtapa.js",
"~/Scripts/DocumentosEtapaCargaMasiva.js",
"~/Scripts/SigVisualizadorArchivo.js",
"~/Scripts/DocumentosEtapaNavegacion.js",
"~/Scripts/Visitas.js",
"~/Scripts/PagosConvenios.js",
"~/Scripts/custom.js",
"~/Scripts/sig-alerts.js"
"~/Scripts/sig-alerts.js",
"~/Scripts/filtrosig.js",
"~/Scripts/scrollsig.js",
"~/Scripts/sig-grid-agrupado.js",
"~/Scripts/Convenios.js",
"~/Scripts/VisorGis.js",
"~/Scripts/LotesEtapa.js"
));
bundles.Add(new ScriptBundle("~/bundles/WebFormsJs").Include(
"~/Scripts/WebForms/WebForms.js",
"~/Scripts/WebForms/WebUIValidation.js",
@@ -117,7 +129,20 @@ namespace SIG.Web.AppCode.Configuration
"~/Styles/Filtros.css",
"~/Styles/SigPdfViewer.css",
"~/Styles/SigPdfDrawer.css",
"~/Styles/Estilos2.css",
"~/Styles/PanelLateral.css",
"~/Styles/SigVisualizadorArchivo.css",
"~/Styles/DetalleEtapa.css",
"~/Styles/DocumentosEtapa.css",
"~/Styles/DocumentosEtapaCargaMasiva.css",
"~/Styles/DocumentosEtapaNavegacion.css",
"~/Styles/Archivos.css",
"~/Styles/Estilos.css",
"~/Styles/filtrosig.css",
"~/Styles/scrollsig.css",
"~/Styles/sig-grid-agrupado.css",
"~/Styles/Convenios.css",
"~/Styles/VisorGis.css",
"~/Styles/LotesEtapa.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 +151,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()));
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,40 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Clientes;
using SIG.Web.AppCode.Models.Common;
namespace SIG.Web.AppCode.Contracts.Clientes
{
public interface IRepositorioPortalCliente
{
DbResult<List<PagoPendienteTramiteCliente>> ListarPagosPendientesTramites(
int cveCliente,
int cveFraccionamiento,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<List<PagoConvenioClienteFila>> ListarPagos(
int cveCliente,
int? cveFraccionamiento,
int? cveFraccionamientoEtapa,
string agrupacion,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<List<ReciboConvenioDisponibleCliente>> ListarRecibosDisponibles(
int cveCliente,
int? cveFraccionamiento,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<int> AgregarPago(
SolicitudPagoConvenioCliente pago,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ArchivoPagoConvenioCliente> ObtenerArchivoPago(
int cveConvenioPago,
int cveCliente,
int cveUsuarioEjecuta,
string nombreDominio);
}
}

View File

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

View File

@@ -0,0 +1,90 @@
using System.Collections.Generic;
using System.IO;
using SIG.Web.AppCode.Models.Clientes;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Fraccionamientos;
using SIG.Web.AppCode.Models.Tramites;
namespace SIG.Web.AppCode.Contracts.Clientes
{
public interface IServicioPortalCliente
{
DbResult<List<ModeloFilaDesarrollos>> ListarDesarrollos(
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloFraccionamiento> ObtenerFraccionamiento(
int cveFraccionamiento,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ResultadoGuardarFraccionamientoConEtapas> GuardarFraccionamientoConEtapa(
ModeloFraccionamiento fraccionamiento,
ModeloEtapaFraccionamiento etapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<int> GuardarFraccionamiento(
ModeloFraccionamiento fraccionamiento,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<List<ModeloEtapaFraccionamiento>> ListarEtapas(
int cveFraccionamiento,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ModeloEtapaFraccionamiento> ObtenerEtapa(
int cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<int> GuardarEtapa(
ModeloEtapaFraccionamiento etapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<List<TramiteClienteListado>> ListarTramites(
int cveFraccionamiento,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<List<TramiteClienteListado>> ListarTramites(
int cveFraccionamiento,
int? cveFraccionamientoEtapa,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<TramiteSolicitudStatusChangeModel> EnviarRevision(
int cveSolicitud,
int cveFraccionamiento,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<List<DocumentoClientePortal>> ListarDocumentos(
FiltroDocumentosCliente filtro,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<List<PagoConvenioClienteFila>> ListarPagos(
FiltroPagosCliente filtro,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<List<ReciboConvenioDisponibleCliente>> ListarRecibosDisponibles(
int? cveFraccionamiento,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<int> RegistrarPago(
SolicitudPagoConvenioCliente pago,
Stream contenido,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<ArchivoPagoConvenioCliente> ObtenerArchivoPago(
int cveConvenioPago,
int cveUsuarioEjecuta,
string nombreDominio);
}
}

View File

@@ -0,0 +1,17 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Convenios;
namespace SIG.Web.AppCode.Contracts.Convenios
{
public interface IRepositorioConvenios
{
DbResult<List<ConvenioListado>> Listar(FiltroConvenios filtro, int usuario, string dominio);
DbResult<ConvenioDetalleCompleto> Obtener(int cveConvenio, int usuario, string dominio);
DbResult<List<ConvenioConceptoCatalogo>> ListarConceptos(int usuario, string dominio);
DbResult<int> Agregar(SolicitudAltaConvenio solicitud, int usuario, string dominio);
DbResult<ConvenioLotesConvenio> ObtenerLotesConvenio(int cveConvenio, int usuario, string dominio);
DbResult<bool> GuardarLotesConvenio(int cveConvenio, int lotesConvenio, int usuario, string dominio);
DbResult<bool> Eliminar(int cveConvenio, int usuario, string dominio);
}
}

View File

@@ -0,0 +1,15 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Convenios;
namespace SIG.Web.AppCode.Contracts.Convenios
{
public interface IServicioConvenios
{
DbResult<List<ConvenioListado>> Listar(FiltroConvenios filtro, int usuario, string dominio);
DbResult<ConvenioDetalleCompleto> Obtener(int cveConvenio, int usuario, string dominio);
DbResult<List<ConvenioConceptoCatalogo>> ListarConceptos(int usuario, string dominio);
DbResult<int> Agregar(SolicitudAltaConvenio solicitud, int usuario, string dominio);
DbResult<bool> Eliminar(int cveConvenio, int usuario, string dominio);
}
}

View File

@@ -0,0 +1,20 @@
using System.IO;
using SIG.Web.AppCode.Models.Clientes;
namespace SIG.Web.AppCode.Contracts.Documentos
{
public interface IAlmacenComprobantesConvenio
{
void Guardar(
SolicitudPagoConvenioCliente pago,
Stream contenido);
string Resolver(
int cveCliente,
string nombreFisico);
void Eliminar(
int cveCliente,
string nombreFisico);
}
}

View File

@@ -8,7 +8,8 @@ namespace SIG.Web.AppCode.Contracts.Documentos
TramiteDocumentoPreparedFile Prepare(
TramiteDocumentoUploadContextModel context,
Stream source,
string previousRelativePath);
string previousRelativePath,
string nombreArchivoOriginal);
void Promote(TramiteDocumentoPreparedFile preparedFile);
void Rollback(TramiteDocumentoPreparedFile preparedFile);

View File

@@ -1,11 +1,42 @@
using System;
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Documentos;
namespace SIG.Web.AppCode.Contracts.Documentos
{
// Los documentos y sus marcas particulares pertenecen a etapa y tipo de documento.
// Los parámetros de trámite en carga se conservan por compatibilidad;
// sólo los listados de requisitos utilizan el trámite como filtro.
public interface ITramiteDocumentoRepository
{
DbResult<List<SolicitudDocumentoConfiguracionModel>> ListarConfiguracionSolicitud(
int cveFraccionamiento,
int cveSolicitud,
int cveUsuarioEjecuta,
string nombreDominio,
int? cveFraccionamientoEtapa = null,
int? cveTipoTramite = 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,
int? cveTipoTramite = null);
DbResult<List<TramiteDocumentoSolicitudModel>> ListForDevelopment(
int developmentId,
int? stageId,
@@ -13,12 +44,21 @@ 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,
int? cveTipoTramite = null);
DbResult<TramiteDocumentoUploadContextModel> GetStageUploadContext(
int stageId,
@@ -38,7 +78,26 @@ 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,
int? cveTipoTramite = null);
DbResult<TramiteDocumentoVencimientoResultModel> ActualizarFechaVencimiento(
int cveFraccionamiento,
int cveDocumentoSolicitud,
DateTime? fechaVencimiento,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<TramiteDocumentoNotaResultModel> ActualizarNota(
int cveFraccionamiento,
int cveDocumentoSolicitud,
string nota,
int cveUsuarioEjecuta,
string nombreDominio);
DbResult<TramiteDocumentoReviewResultModel> Review(
int developmentId,

Some files were not shown because too many files have changed in this diff Show More