# Rebrand de planes despacho (2026-04-26)

Reestructura del catálogo de planes de Horux Despachos: nuevos precios, nuevos
límites, nuevos planes para empresas individuales y unificación de la regla de
overage por contribuyente extra.

## 1. Catálogo nuevo

| Plan (codename) | Display | Precio anual MXN | RFCs | CFDIs/contrib. | Timbres/mes | Servidor backup | Features extra |
|---|---|---|---|---|---|---|---|
| `mi_empresa` | Mi Empresa | $6,960 (= $580/mes × 12) | 1 | 1,000,000 | 50 | No | — |
| `mi_empresa_plus` | Mi Empresa + | $10,800 (= $900/mes × 12) | 1 | 1,000,000 | 50 | No | API + Lolita IA |
| `business_control` | Business Control | $25,850 IVA inc. | 100 | 1,000,000 | 0 | Sí | API |
| `business_cloud` | **Enterprise** (display) | $43,000 IVA inc. | 100 | 3,000,000 | 0 | Sí | API |

- **`business_cloud` mantiene el codename interno** por backward compat con
  suscripciones vigentes; solo cambia el `name` display a "Enterprise".
- Todos los planes despacho se cobran **anual** vía MP preapproval. El monto
  mensual ($580/$900) es solo descripción comercial — el cobro es uno por año.

## 2. Overage por contribuyente extra

- Antes: solo `business_cloud`, incluía 3 RFCs base, $45/mes a partir del 4°.
- Ahora: aplica a **`business_control` y `business_cloud`**, ambos incluyen
  100 RFCs base, $45/mes a partir del 101°.
- Mi Empresa / Mi Empresa+ tienen **límite duro de 1 RFC** (no permiten overage).

Implementación:
- `addon.service.ts` — constante renombrada `BUSINESS_CLOUD_INCLUDED_RFCS = 3`
  → `DESPACHO_INCLUDED_RFCS = 100`. La función `adjustBusinessCloudOverage` se
  renombró a `adjustDespachoOverage` y ahora valida con
  `permiteOverage(plan)` (helper en `@horux/shared`) en vez de comparar
  literal contra `'business_cloud'`.
- `contribuyente.controller.ts` — actualizado import y dos callsites (`create`
  y `deactivate`).
- `seed.ts` — `nombre` del catálogo `contribuyente_extra_business_cloud` ahora
  es genérico: "Contribuyente adicional (RFC extra)". El codename se mantiene
  para no migrar `subscription_addons` existentes.

## 3. Validación de planes en backend

- `subscription.controller.ts` — `VALID_PLANS` extendido con `mi_empresa` y
  `mi_empresa_plus`. `DESPACHO_ONLY_ANNUAL` también los incluye (catálogo solo
  expone tarifa anual; pedir `monthly` regresa 400 antes de llegar al servicio).
- `subscription.service.ts` — type alias `Plan` extendido con los dos nuevos
  literales para que `scheduleChange`, `subscribe`, `initiateUpgrade` y
  `applyPendingChanges` los acepten como destinos válidos.
- `getPlanPrice(plan, frequency)` lee `DESPACHO_PLAN_PRICES[plan]` (catálogo
  estático en `@horux/shared`) — mi_empresa y mi_empresa_plus ya estaban ahí
  desde el cambio del catálogo (ver `packages/shared/src/constants/despacho-plans.ts`).

## 4. UI (estado previo a esta sesión, ya implementado)

- `/configuracion/planes-despacho` muestra 4 cards en grid lg:grid-cols-4.
- Business Control marcado como "Más popular".
- Cada Card usa `flex flex-col` + `mt-auto` en el botón para alinear botones
  al margen inferior aunque las listas de features tengan distinto largo.
- Solo se listan features incluidas (eliminadas las filas "Sin..." para no
  ensuciar la vista con negaciones).
- Botón único "Contratar" (sin la variante "(terminar prueba)").

## 5. Migraciones / deploy

No requiere migración de schema. El enum Prisma `Plan` ya incluyó
`mi_empresa` y `mi_empresa_plus` en migración `20260426073942_add_mi_empresa_plan`.
El catálogo de addon se actualiza vía `pnpm db:seed` (upsert por codename).

## 6. Pendientes (decisión del owner)

- **Mi Empresa monthly vs annual billing**: hoy se cobra anual. Si se quiere
  preapproval mensual, hay que separar `mi_empresa` del set
  `DESPACHO_ONLY_ANNUAL` y agregar precio mensual al catálogo.
- **Mi Empresa overage**: actualmente bloqueado en 1 RFC. Si se quiere permitir
  +RFC con cobro automático, agregar `mi_empresa` a `permiteOverage()` y
  definir un threshold/precio independiente.
- **Enterprise timbres**: el plan no incluye timbres. Si en algún momento se
  quiere paquete fijo incluido, agregar `timbresIncluidosMes` > 0 en
  `DESPACHO_PLANS.business_cloud`.
- **`getMyPlan` en `despacho.controller.ts`** sigue mapeando solo a
  `business_control`/`business_cloud` por `dbMode`. Si se extiende a tenants
  Mi Empresa, hay que revisar esa lógica (hoy reporta `business_cloud` para
  cualquier tenant MANAGED no-trial).
