feat: mejoras SAT, auth, web y migración

SAT:
- Cron diario 6-10 AM con grupos de tenants (~20% por hora).
- Retries fijos de daily sync a 9 AM y 4 PM CDMX.
- Filtrado de contribuyentes con FIEL vigente en cron.
- Timeout de 5 min en cliente HTTP del SAT.
- Manejo defensivo de 404, EmptyResult (5004) y solicitudes agotadas.
- Fechas formateadas en zona horaria America/Mexico_City.
- Patch a @nodecfdi/sat-ws-descarga-masiva para evitar getResponse crash.
- Sweep de jobs stale con thresholds ajustados.

Auth/Web:
- Primer pago de suscripción define periodo activo en webhook.
- Rate limit de login: 25 intentos / 15 min.
- Recuperación de contraseña: 24h de validez.
- Soporte viewingTenantId en contribuyentes.
- Timeout y estado de carga al crear organización en Facturapi.
- Filtros por cliente y cartera en Mis Asignados.
- Orden alfabético en selector de contribuyente.

DB:
- Migración 057: unique index de declaraciones incluye impuestos.
This commit is contained in:
Horux Dev
2026-08-02 20:06:51 +00:00
parent dfc0183c12
commit 284c7620a9
14 changed files with 409 additions and 45 deletions

View File

@@ -48,6 +48,11 @@ export function ContribuyenteSelector() {
const selected = contribuyentes.find((c) => c.id === selectedContribuyenteId);
// Orden alfabético por nombre (locale español, sin distinguir acentos/mayúsculas)
const contribuyentesOrdenados = [...contribuyentes].sort((a, b) =>
a.nombre.localeCompare(b.nombre, 'es', { sensitivity: 'base', numeric: true })
);
return (
<div className="contribuyente-selector relative">
<button
@@ -91,7 +96,7 @@ export function ContribuyenteSelector() {
)}
{/* Lista de contribuyentes */}
{contribuyentes.map((c) => (
{contribuyentesOrdenados.map((c) => (
<button
key={c.id}
onClick={() => { setSelectedContribuyente(c.id, c.rfc, c.nombre); setOpen(false); }}