4.4 KiB
4.4 KiB
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_cloudmantiene el codename interno por backward compat con suscripciones vigentes; solo cambia elnamedisplay 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_controlybusiness_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 renombradaBUSINESS_CLOUD_INCLUDED_RFCS = 3→DESPACHO_INCLUDED_RFCS = 100. La funciónadjustBusinessCloudOveragese renombró aadjustDespachoOveragey ahora valida conpermiteOverage(plan)(helper en@horux/shared) en vez de comparar literal contra'business_cloud'.contribuyente.controller.ts— actualizado import y dos callsites (createydeactivate).seed.ts—nombredel catálogocontribuyente_extra_business_cloudahora es genérico: "Contribuyente adicional (RFC extra)". El codename se mantiene para no migrarsubscription_addonsexistentes.
3. Validación de planes en backend
subscription.controller.ts—VALID_PLANSextendido conmi_empresaymi_empresa_plus.DESPACHO_ONLY_ANNUALtambién los incluye (catálogo solo expone tarifa anual; pedirmonthlyregresa 400 antes de llegar al servicio).subscription.service.ts— type aliasPlanextendido con los dos nuevos literales para quescheduleChange,subscribe,initiateUpgradeyapplyPendingChangeslos acepten como destinos válidos.getPlanPrice(plan, frequency)leeDESPACHO_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 (verpackages/shared/src/constants/despacho-plans.ts).
4. UI (estado previo a esta sesión, ya implementado)
/configuracion/planes-despachomuestra 4 cards en grid lg:grid-cols-4.- Business Control marcado como "Más popular".
- Cada Card usa
flex flex-col+mt-autoen 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_empresadel setDESPACHO_ONLY_ANNUALy 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_empresaapermiteOverage()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 enDESPACHO_PLANS.business_cloud. getMyPlanendespacho.controller.tssigue mapeando solo abusiness_control/business_cloudpordbMode. Si se extiende a tenants Mi Empresa, hay que revisar esa lógica (hoy reportabusiness_cloudpara cualquier tenant MANAGED no-trial).