83 lines
4.4 KiB
Markdown
83 lines
4.4 KiB
Markdown
# 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).
|