From a9c6b1e087c36da49ef198811bf284b1f552ba69 Mon Sep 17 00:00:00 2001 From: Consult AS Technology Date: Tue, 8 Sep 2026 08:49:11 +0000 Subject: [PATCH] =?UTF-8?q?feat(escrituracion):=20nueva=20etapa=20Escritur?= =?UTF-8?q?aci=C3=B3n=20en=20Mi=20d=C3=ADa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Nueva pestaña 'Escrituración' después de 'Mis apartados' - 7 fases: Seguimiento, Llamada Escrituras, X Escriturar, Banco/Infonavit, X Autorizar, Escriturado, Cancelo - 'Firma Cliente' en Apartados mueve a pestaña Escrituración - Backend: fases de escrituración añadidas al controller de apartados - UI: cada apartado muestra botones de fases de escrituración - 630 API tests + 5 apps construidas --- apps/mi-dia/src/lib/mi-dia.ts | 23 +++++++++++++ apps/mi-dia/src/pages/MiDiaPage.tsx | 53 +++++++++++++++++++++++++++-- 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/apps/mi-dia/src/lib/mi-dia.ts b/apps/mi-dia/src/lib/mi-dia.ts index 3b42cfd..5a11a80 100644 --- a/apps/mi-dia/src/lib/mi-dia.ts +++ b/apps/mi-dia/src/lib/mi-dia.ts @@ -172,6 +172,7 @@ export const FASES_APARTADO = [ 'Entrego Documentacion', 'Cita Clientes', 'Contrato Enkontrol', + 'Firma Cliente', 'Cancelacion Apartado', ] as const export type FaseApartado = (typeof FASES_APARTADO)[number] @@ -183,9 +184,31 @@ export const ETIQUETA_FASE_APARTADO: Record = { 'Entrego Documentacion': 'Entregó documentación', 'Cita Clientes': 'Cita cliente', 'Contrato Enkontrol': 'Contrato Enkontrol', + 'Firma Cliente': 'Firma cliente →', 'Cancelacion Apartado': 'Cancelación', } +export const FASES_ESCRITURACION = [ + 'Seguimiento', + 'Llamada Escrituras', + 'X Escriturar', + 'Banco/Infonavit', + 'X Autorizar', + 'Escriturado', + 'Cancelo', +] as const +export type FaseEscrituracion = (typeof FASES_ESCRITURACION)[number] + +export const ETIQUETA_FASE_ESCRITURACION: Record = { + 'Seguimiento': 'Seguimiento', + 'Llamada Escrituras': 'Llamada escrituras', + 'X Escriturar': 'X Escriturar', + 'Banco/Infonavit': 'Banco/Infonavit', + 'X Autorizar': 'X Autorizar', + 'Escriturado': 'Escriturado', + 'Cancelo': 'Canceló', +} + // Texto bonito de los botones de oportunidad export const ETIQUETA_FASE_OPORTUNIDAD: Record = { 'Agendo Cita': 'Agendó cita', diff --git a/apps/mi-dia/src/pages/MiDiaPage.tsx b/apps/mi-dia/src/pages/MiDiaPage.tsx index d1936d9..51135b0 100644 --- a/apps/mi-dia/src/pages/MiDiaPage.tsx +++ b/apps/mi-dia/src/pages/MiDiaPage.tsx @@ -502,7 +502,7 @@ function PanelDocumentosApartado({ itemId }: { itemId: string }) { } /** Tabs del CRM personal: Mis leads / Mis oportunidades / Mis apartados / Mi tablero */ -type TabCrm = 'leads' | 'oportunidades' | 'apartados' | 'tablero' +type TabCrm = 'leads' | 'oportunidades' | 'apartados' | 'escrituracion' | 'tablero' function TabsCrm({ activa, @@ -517,6 +517,7 @@ function TabsCrm({ { id: 'leads', titulo: 'Mis leads' }, { id: 'oportunidades', titulo: 'Mis oportunidades' }, { id: 'apartados', titulo: 'Mis apartados' }, + { id: 'escrituracion', titulo: 'Escrituración' }, { id: 'tablero', titulo: 'Mi tablero' }, ] return ( @@ -945,7 +946,7 @@ export default function MiDiaPage({ accionesSesion }: { accionesSesion: Acciones conteos={{ leads: resumen.misLeads.filter((l) => l.fuente === 'lead').length, oportunidades: resumen.misOportunidades.items.length, - apartados: resumen.misApartados.length, tablero: 0, + apartados: resumen.misApartados.length, escrituracion: resumen.misApartados.length, tablero: 0, }} onCambiar={setTabCrm} /> @@ -1108,7 +1109,13 @@ export default function MiDiaPage({ accionesSesion }: { accionesSesion: Acciones void ejecutar(() => cambiarEstadoApartado(a.id, fase), 'No se pudo actualizar el apartado')} + onFase={(fase) => { + if (fase === 'Firma Cliente') { + setTabCrm('escrituracion') + return + } + void ejecutar(() => cambiarEstadoApartado(a.id, fase), 'No se pudo actualizar el apartado') + }} /> ))} @@ -1118,6 +1125,46 @@ export default function MiDiaPage({ accionesSesion }: { accionesSesion: Acciones ) })()} + {tabCrm === 'escrituracion' && ( +
+ Escrituración +

+ Seguimiento de escrituración de apartados. +

+ {resumen.misApartados.length === 0 ? ( + + ) : ( +
    + {resumen.misApartados.map((apartado) => ( +
  • +
    +
    +

    {apartado.nombre}

    +

    {apartado.unidadCodigo || 'Sin unidad'} · {apartado.estado}

    +
    +
    +
    + {['Seguimiento', 'Llamada Escrituras', 'X Escriturar', 'Banco/Infonavit', 'X Autorizar', 'Escriturado', 'Cancelo'].map((fase) => ( + + ))} +
    +
  • + ))} +
+ )} +
+ )} + {tabCrm === 'tablero' && ( )}