diff --git a/apps/api/src/controllers/despacho.controller.ts b/apps/api/src/controllers/despacho.controller.ts index 8c9aa9b..0e2c804 100644 --- a/apps/api/src/controllers/despacho.controller.ts +++ b/apps/api/src/controllers/despacho.controller.ts @@ -10,7 +10,8 @@ const signupSchema = z.object({ regimenFiscal: z.string().optional(), codigoPostal: z.string().regex(/^\d{5}$/, 'Código postal inválido').optional(), verticalProfile: z.enum(['CONTABLE', 'JURIDICO', 'ARQUITECTURA']), - plan: z.enum(['trial', 'business_control', 'business_cloud']).optional().default('trial'), + plan: z.enum(['trial', 'business_control', 'business_cloud', 'mi_empresa', 'mi_empresa_plus']).optional().default('trial'), + frequency: z.enum(['monthly', 'annual']).optional().default('annual'), }), owner: z.object({ nombre: z.string().min(2, 'Nombre del owner requerido'), diff --git a/apps/api/src/services/despacho.service.ts b/apps/api/src/services/despacho.service.ts index ecf1321..d13c565 100644 --- a/apps/api/src/services/despacho.service.ts +++ b/apps/api/src/services/despacho.service.ts @@ -23,7 +23,7 @@ export async function signupDespacho(data: DespachoSignupRequest) { data: { nombre: despacho.nombre, rfc: tenantSlug.toUpperCase(), - plan: 'enterprise', + plan: (despacho.plan === 'trial' ? 'enterprise' : despacho.plan) as any, databaseName: databaseName, cfdiLimit: -1, usersLimit: -1, @@ -103,7 +103,7 @@ export async function signupDespacho(data: DespachoSignupRequest) { const result2 = await subscriptionService.subscribe({ tenantId: result.tenant.id, plan: data.despacho.plan as any, - frequency: 'annual', + frequency: data.despacho.frequency ?? 'annual', payerEmail: owner.email, }); paymentUrl = result2.paymentUrl; diff --git a/apps/web/app/(auth)/register-despacho/page.tsx b/apps/web/app/(auth)/register-despacho/page.tsx index 28bccac..0b7c4f8 100644 --- a/apps/web/app/(auth)/register-despacho/page.tsx +++ b/apps/web/app/(auth)/register-despacho/page.tsx @@ -6,10 +6,11 @@ import Link from 'next/link'; import { Button, Input, Label, Card, CardContent, CardHeader, CardTitle, cn } from '@horux/shared-ui'; import { useAuthStore } from '@/stores/auth-store'; import { apiClient } from '@/lib/api/client'; -import { CheckCircle2, Server, Cloud, ArrowLeft, Clock } from 'lucide-react'; +import { CheckCircle2, Server, Cloud, ArrowLeft, Clock, Zap } from 'lucide-react'; type VerticalProfile = 'CONTABLE' | 'JURIDICO' | 'ARQUITECTURA'; -type PlanType = 'trial' | 'business_control' | 'business_cloud'; +type PlanType = 'trial' | 'business_control' | 'business_cloud' | 'mi_empresa' | 'mi_empresa_plus'; +type Frequency = 'monthly' | 'annual'; export default function RegisterDespachoPage() { const router = useRouter(); @@ -17,6 +18,8 @@ export default function RegisterDespachoPage() { const [step, setStep] = useState(1); const [verticalProfile, setVerticalProfile] = useState(null); const [selectedPlan, setSelectedPlan] = useState(null); + const [meFreq, setMeFreq] = useState('monthly'); + const [mePlusFreq, setMePlusFreq] = useState('monthly'); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const [form, setForm] = useState({ @@ -38,11 +41,16 @@ export default function RegisterDespachoPage() { setLoading(true); setError(''); try { + const frequency: Frequency | undefined = + selectedPlan === 'mi_empresa' ? meFreq : + selectedPlan === 'mi_empresa_plus' ? mePlusFreq : + undefined; const { data } = await apiClient.post('/despachos/signup', { despacho: { nombre: form.despachoNombre, verticalProfile, plan: selectedPlan, + frequency, }, owner: { nombre: form.ownerNombre, @@ -168,10 +176,10 @@ export default function RegisterDespachoPage() { 3

Elige tu plan

-

Todos los planes incluyen las mismas funcionalidades.

+

Mi Empresa para individuales, Business para despachos.

-
+
{/* Trial Gratuito */} + {/* Mi Empresa */} + setSelectedPlan('mi_empresa')} + > + +
+ +
+ Mi Empresa +

Para una sola empresa

+
+ +
+ + +
+
+
${meFreq === 'monthly' ? '580' : '5,800'}
+

{meFreq === 'monthly' ? 'por mes (IVA incluido)' : 'por año (IVA incluido)'}

+ {meFreq === 'monthly' &&

o $5,800/año (ahorras 17%)

} +
+
+
1 RFC
+
3 usuarios
+
Hasta 1,000,000 CFDIs
+
Base de datos en la nube
+
Dashboard, CFDI, IVA/ISR, alertas
+
50 timbres/mes incluidos
+
+
+
+ + {/* Mi Empresa + */} + setSelectedPlan('mi_empresa_plus')} + > +
+ Más popular +
+ +
+ +
+ Mi Empresa + +

Con API y Lolita IA

+
+ +
+ + +
+
+
${mePlusFreq === 'monthly' ? '900' : '9,000'}
+

{mePlusFreq === 'monthly' ? 'por mes (IVA incluido)' : 'por año (IVA incluido)'}

+ {mePlusFreq === 'monthly' &&

o $9,000/año (ahorras 17%)

} +
+
+
1 RFC
+
3 usuarios
+
Hasta 1,000,000 CFDIs
+
Base de datos en la nube
+
Dashboard, CFDI, IVA/ISR, alertas
+
50 timbres/mes incluidos
+
API REST incluida
+
Lolita IA agente fiscal
+
+
+
+ {/* Business Control */}
-
$21,000
-

primer año (IVA incluido)

-

$15,000/año a partir del 2do año

+
$25,850
+

por año (IVA incluido)

+

+ $45/mes por cada RFC adicional sobre 100

-
Base de datos en tu servidor
-
RFCs ilimitados
+
Hasta 100 RFCs
Usuarios ilimitados
+
Hasta 1,000,000 CFDIs por contribuyente
+
Servidor local con backup
Control total de tus datos
-
Requiere Docker en tu servidor
+
Dashboard, CFDI, IVA/ISR, alertas, calendario
+
Reportes, conciliación, documentos, facturación, API
- {/* Business Cloud */} + {/* Enterprise (business_cloud) */} setSelectedPlan('business_cloud')} > -
- Más popular -
- Business Cloud -

Nosotros lo operamos por ti

+ Enterprise +

Despachos grandes con alto volumen

-
$15,000
-

por año (fijo)

-

+ $45/mes por cada RFC gestionado

+
$43,000
+

por año (IVA incluido)

+

+ $45/mes por cada RFC adicional sobre 100

-
Base de datos en la nube (Horux)
-
Sin infraestructura propia
+
Hasta 100 RFCs
Usuarios ilimitados
-
Backups automáticos
+
Hasta 3,000,000 CFDIs por contribuyente
+
Servidor local con backup
+
Backups automáticos en la nube
+
Dashboard, CFDI, IVA/ISR, alertas, calendario
+
Reportes, conciliación, documentos, facturación, API
Soporte prioritario
diff --git a/packages/shared/src/types/despacho.ts b/packages/shared/src/types/despacho.ts index 6198d96..190fe2b 100644 --- a/packages/shared/src/types/despacho.ts +++ b/packages/shared/src/types/despacho.ts @@ -13,7 +13,7 @@ export interface DespachoInfo { plan: string; } -export type DespachoSignupPlan = 'trial' | 'business_control' | 'business_cloud'; +export type DespachoSignupPlan = 'trial' | 'business_control' | 'business_cloud' | 'mi_empresa' | 'mi_empresa_plus'; export interface DespachoSignupRequest { despacho: { @@ -23,6 +23,7 @@ export interface DespachoSignupRequest { codigoPostal?: string; verticalProfile: VerticalProfile; plan?: DespachoSignupPlan; + frequency?: 'monthly' | 'annual'; }; owner: { nombre: string;