# 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).