Files
HoruxDespachos/README.md
2026-04-27 22:09:36 -06:00

4.2 KiB

Horux Despachos

Plataforma SaaS para despachos profesionales mexicanos. Gestión fiscal multi-RFC con roles jerárquicos (Owner/Supervisor/Auxiliar/Cliente), carteras de contribuyentes, y arquitectura BYO-DB.

Autor: Carlos e Ivan (Horux 360)


Qué es

Horux Despachos permite a despachos contables gestionar múltiples contribuyentes (RFCs) desde una sola cuenta. Cada contribuyente tiene su propia FIEL, CSD, y organización Facturapi. Los supervisores organizan contribuyentes en carteras y delegan trabajo a auxiliares.

Arquitectura

Monorepo (pnpm + Turborepo)
├── apps/api       → Express + TypeScript (puerto 4000)
├── apps/web       → Next.js 14 + App Router (puerto 3000)
└── packages/
    ├── core       → Auth (JWT), email transport, crypto (AES-256-GCM)
    ├── shared     → Tipos, constantes, interfaces compartidas
    ├── shared-ui  → Componentes UI (Button, Card, Dialog, selectors, hooks)
    └── vertical-contable → (scaffold) Lógica fiscal compartida

Funcionalidades implementadas

Gestión de despachos

  • Signup multi-paso (formulario → vertical → plan)
  • Onboarding wizard (6 pasos)
  • Planes: Trial (30 días), Business Control (BYO-DB), Business Cloud (Managed)

Contribuyentes (RFCs)

  • CRUD de contribuyentes por despacho
  • FIEL per contribuyente (almacenada en BD tenant, cifrada AES-256-GCM)
  • Facturapi org per contribuyente (CSD independiente)
  • Emisión de CFDI con contribuyente_id

Roles y autorización

  • Owner: acceso total, actúa como supervisor implícito
  • Supervisor: titular de RFCs, crea carteras, gestiona auxiliares
  • Auxiliar: accede solo a RFCs en carteras asignadas
  • Cliente: visor externo read-only de sus RFCs
  • getEntidadesVisibles(): cascada de permisos automática

Carteras

  • CRUD completo (crear, editar, eliminar)
  • Asignar/remover contribuyentes
  • Asignar/remover auxiliares
  • Cascada: si supervisor pierde RFC → auxiliares pierden acceso

Pricing

  • Catálogo de planes (Business Control $21,000/año, Business Cloud $15,000/año + $45/RFC/mes)
  • Add-ons recurrentes con multi-preapproval MercadoPago
  • Paquetes de timbres one-shot

Connector BYO-DB

  • Provisioning de tunnel (Cloudflare Tunnel ready)
  • Heartbeat cada 30s con status en UI
  • getPool() refactorizado para decrypt de conexiones BYO

Admin global

  • Dashboard cross-despacho (métricas, lista despachos, actividad)
  • Impersonación con motivo obligatorio + audit log
  • Audit log expuesto al owner del despacho

Métricas pre-calculadas

  • Hot/cold: año actual on-the-fly, años pasados pre-calculados
  • Invalidación dirigida por cambios retroactivos en CFDIs
  • Tablas: metricas_mensuales, acumuladas_anuales, contraparte, invalidaciones

Stack técnico

Capa Tecnología
Frontend Next.js 14, React 18, Tailwind, shadcn/ui, Zustand, React Query
Backend Node.js 20+, Express 4, TypeScript 5, Prisma 5.22
BD Central PostgreSQL 16 (Prisma ORM)
BD Tenant PostgreSQL 16 (pg Pool + SQL raw + 17 migraciones numeradas)
Auth JWT (15min) + refresh (7d) + bcrypt + magic link ready
Pagos MercadoPago (preapproval + webhooks)
Email Nodemailer + SMTP
Facturación Facturapi (cuenta maestra broker)

Setup local

# Requisitos: Node 20+, pnpm 9+, PostgreSQL 16+
pnpm install
cd apps/api && npx prisma generate
cd apps/api && npx prisma migrate deploy
cd apps/api && pnpm db:seed
pnpm dev  # API :4000 + Web :3000

Estructura de BD

BD Central (Prisma)

Tenant, User, TenantMembership, Rol, Subscription, SubscriptionAddon, Payment, PlanCatalogo, PlanAddonCatalogo, FielCredential, ConnectorHeartbeat, AuditLog, TimbreSuscripcion, TimbrePaquete, catálogos SAT.

BD Tenant (SQL migrations 001-017)

001-005: Schema base (rfcs, cfdis, conciliaciones, alertas, opiniones, declaraciones, constancias) 006: tenant_migrations tracking 007-009: Core (entidades_gestionadas, carteras, cliente_accesos) 010-013: Vertical contable (contribuyentes, fiel_contribuyente, facturapi_orgs, cfdi contribuyente_id) 014-017: Métricas (mensuales, acumuladas, contraparte, invalidaciones)

Autor

Carlos e Ivan (Horux 360)