feat: ecosistema FRASA — apps Cotizador, Alta Clientes, Cobranza y Landing

- Cotizador (/quote): 4 propuestas con formulas validadas del Excel, comparador,
  combobox de unidades, vigencia, PDF ANEXO A
- Alta Clientes (/client): wizard 8 pasos, validacion CURP RENAPO, OCR de INE,
  checklist de expediente, firma digital, 5 PDFs legales
- Cobranza (/pay): planes de enganche, mora, vista cobranza del dia, recibos PDF,
  bitacora, dashboard con filtros
- Landing (/): entrada al ecosistema
- Design system StudioBlank (monocromo, acento #1B4332) en las 4 apps
- 123 tests vitest
This commit is contained in:
2026-08-21 22:27:36 +00:00
commit ecd4edac02
147 changed files with 27345 additions and 0 deletions

View File

@@ -0,0 +1,38 @@
import { useEffect, useState } from 'react'
import type { Unidad } from '../types'
import { getUnidades } from '../services/api'
interface UseUnidadesResult {
unidades: Unidad[]
cargando: boolean
error: string | null
}
/** Carga el inventario de unidades (hoy desde seed; mañana desde el API Gateway) */
export function useUnidades(): UseUnidadesResult {
const [unidades, setUnidades] = useState<Unidad[]>([])
const [cargando, setCargando] = useState(true)
const [error, setError] = useState<string | null>(null)
useEffect(() => {
let activo = true
getUnidades()
.then((data) => {
if (activo) {
setUnidades(data)
setCargando(false)
}
})
.catch(() => {
if (activo) {
setError('No se pudo cargar el inventario de unidades.')
setCargando(false)
}
})
return () => {
activo = false
}
}, [])
return { unidades, cargando, error }
}