feat(mejoras): 25 mejoras UX en todos los módulos + purga Monday

Backend: mi-dia siempre local, vocabulario canónico, AplicacionPago con usuario
Mi día: modal español real, cita desde modal, score falso eliminado
Cotizador: barra sticky, persistencia local con folio
Alta Clientes: redirect eliminado, foto conectada, asesor desde sesión, refs dinámicas
Cobranza: contrato Mora arreglado, link a Plan, abono próximo pago, WhatsApp
Landing: contactos locales, ModalContacto eliminado, ModoTrabajo eliminado
Dashboards: MiTablero unificado, funnel con descartados, drill-down, rango fechas
Chat FRASA: corpus 5 desarrollos, 6 herramientas, historial conversaciones

69 archivos, 7 apps construidas
This commit is contained in:
2026-09-11 06:52:37 +00:00
parent 075d47c304
commit 64b01246d6
69 changed files with 1600 additions and 1133 deletions

View File

@@ -1,5 +1,5 @@
import { useCallback, useEffect, useState } from 'react'
import { getContactoDetalle, type DetalleContacto } from '../services/api'
import { getContactoDetalle, type DatosContacto, type DetalleContacto } from '../services/api'
const formatoFecha = (iso: string): string =>
iso
@@ -47,7 +47,7 @@ export default function PerfilContactoCompleto({ contactoId, nombre, onCerrar }:
return () => window.removeEventListener('keydown', alTeclear)
}, [onCerrar])
const c = detalle?.contacto ?? {}
const c: Partial<DatosContacto> = detalle?.contacto ?? {}
const prop = detalle?.propiedad ?? null
const hist = detalle?.historial ?? []
const rels = detalle?.relaciones ?? { leads: [], oportunidades: [], apartados: [] }
@@ -64,7 +64,7 @@ export default function PerfilContactoCompleto({ contactoId, nombre, onCerrar }:
<div className="flex items-center justify-between border-b border-[#E5E7EB] dark:border-[#334155] pb-4">
<div>
<p className="text-xs font-semibold uppercase tracking-wider text-[#64748B] dark:text-[#94A3B8]">Perfil del contacto</p>
<h2 className="mt-1 text-lg font-semibold text-[#111827] dark:text-[#E2E8F0]">{c['nombre'] ?? nombre}</h2>
<h2 className="mt-1 text-lg font-semibold text-[#111827] dark:text-[#E2E8F0]">{c.nombre ?? nombre}</h2>
</div>
<button
type="button"
@@ -83,15 +83,15 @@ export default function PerfilContactoCompleto({ contactoId, nombre, onCerrar }:
<div className="mt-5 space-y-5">
{/* Datos personales */}
<Section titulo="Datos personales">
<Field label="Email" value={c['Email']} />
<Field label="Teléfono" value={c['Teléfono']} />
<Field label="Estado" value={c['Estado']} />
<Field label="CURP" value={c['CURP']} />
<Field label="RFC" value={c['RFC']} />
<Field label="Estado civil" value={c['Estado Civil']} />
<Field label="Fecha nacimiento" value={c['Fecha Nacimiento']} />
<Field label="Actividad económica" value={c['Actividad Economica']} />
<Field label="Dirección" value={c['Dirección']} />
<Field label="Email" value={c.email} />
<Field label="Teléfono" value={c.telefono} />
<Field label="Estado" value={c.estado} />
<Field label="CURP" value={c.curp} />
<Field label="RFC" value={c.rfc} />
<Field label="Estado civil" value={c.estadoCivil} />
<Field label="Fecha nacimiento" value={c.fechaNacimiento} />
<Field label="Actividad económica" value={c.actividadEconomica} />
<Field label="Dirección" value={c.direccion} />
</Section>
{/* Propiedad */}