fix(auditoria completa): bloqueos de Mi Dia, cobranza (saldos y fechas), captura (departamento y rol), contactos (privacidad), cotizador (QR) y validaciones de API

This commit is contained in:
2026-09-21 07:18:39 +00:00
parent 75956a709f
commit 5e9b2ac456
16 changed files with 259 additions and 71 deletions

View File

@@ -79,7 +79,6 @@ export default function KanbanView<T extends { id: string; nombre: string; estad
</div>
{item.telefono && <p className="mt-1 text-xs text-[#94A3B8]">{item.telefono}</p>}
{item.unidadCodigo && <p className="mt-0.5 text-xs text-[#94A3B8]">{item.unidadCodigo}</p>}
{item.pendienteSync && <span className="mt-1 inline-block rounded-full bg-amber-50 px-1.5 py-0.5 text-[10px] text-amber-700 dark:bg-amber-900/30 dark:text-amber-400">⏳ sync</span>}
</>
)}
</div>

View File

@@ -1038,8 +1038,11 @@ export default function MiDiaPage({ accionesSesion }: { accionesSesion: Acciones
setAviso(null)
try {
await cambiarEtapaOportunidad(op.id, 'Cotizador')
await cargar() // refleja la etapa nueva sin recargar la página
} catch {
toast.error('No se pudo actualizar la etapa; el cotizador se abrirá de todos modos.')
} finally {
setEnviando(false) // sin esto la página quedaba bloqueada hasta recargar
}
window.open(urlCotizadorParaOportunidad(op), '_blank')
}
@@ -1128,7 +1131,20 @@ export default function MiDiaPage({ accionesSesion }: { accionesSesion: Acciones
const enEscrituracion = resumen
? (resumen.todosApartados || resumen.misApartados).filter((a) => {
const e = (a.estado ?? '').toUpperCase()
return e.includes('FIRMA') || e.includes('VENTA') || e.includes('SEGUIMIENTO') || e.includes('INTEGRACION') || e.includes('X AUTORIZAR') || e.includes('AUTORIZADO') || e.includes('X ESCRITURAR')
return (
e.includes('FIRMA') ||
e.includes('VENTA') ||
e.includes('SEGUIMIENTO') ||
e.includes('INTEGRACION') ||
e.includes('X AUTORIZAR') ||
e.includes('AUTORIZADO') ||
e.includes('X ESCRITURAR') ||
// Estados finales: sin ellos el registro desaparecía de Mi Día al
// marcarlo como Escriturado o Titulado
e.includes('ESCRITURADO') ||
e.includes('TITULADO') ||
e.includes('CANCO')
)
})
: []
const escrituracionFiltrados = aplicarFiltros(enEscrituracion, filtrosPorTab.escrituracion, {