Files
HoruxDespachos/docs/plans/2026-04-26-rebrand-planes-despacho.md
2026-04-27 22:09:36 -06:00

83 lines
4.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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).