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,32 @@
import { describe, it, expect } from 'vitest'
import { MODULOS } from './modulos'
describe('MODULOS', () => {
it('expone los 3 módulos del ecosistema', () => {
expect(MODULOS).toHaveLength(3)
expect(MODULOS.map((m) => m.id)).toEqual(['cotizador', 'alta-clientes', 'cobranza'])
})
it('cada módulo tiene nombre, descripción y URL de preview válida', () => {
for (const modulo of MODULOS) {
expect(modulo.nombre.length).toBeGreaterThan(0)
expect(modulo.descripcion.length).toBeGreaterThan(0)
expect(() => new URL(modulo.url)).not.toThrow()
expect(new URL(modulo.url).protocol).toBe('http:')
}
})
it('apunta a los puertos y prefijos de preview correctos', () => {
const urls = Object.fromEntries(MODULOS.map((m) => [m.id, m.url]))
expect(urls['cotizador']).toBe('http://192.168.10.123:3001/quote/')
expect(urls['alta-clientes']).toBe('http://192.168.10.123:3002/client/')
expect(urls['cobranza']).toBe('http://192.168.10.123:3003/pay/')
})
it('no hay ids ni URLs duplicadas', () => {
const ids = MODULOS.map((m) => m.id)
const urls = MODULOS.map((m) => m.url)
expect(new Set(ids).size).toBe(MODULOS.length)
expect(new Set(urls).size).toBe(MODULOS.length)
})
})