fix(clientes): crear tenant como despacho desde admin global

Antes, createTenant() solo seteaba nombre, rfc, plan y databaseName.
Ahora registra tenants completos como despachos:

- dbMode: 'MANAGED'
- verticalProfile: CONTABLE | JURIDICO | ARQUITECTURA
- trialEndsAt: +30 días para plan trial
- codigoPostal: opcional (se llena automáticamente de la CSF al subir FIEL)

Frontend:
- Selector de Tipo de Despacho en /clientes
- C.P. omitido del formulario (viene de CSF -> sincronizarDatosFiscales)
- Tipos Tenant y CreateTenantData actualizados

Backend:
- getAllTenants y getTenantById retornan verticalProfile y codigoPostal

Refs: docs/sessions/2026-05-04-fix-clientes-crea-despacho.md
This commit is contained in:
Horux Dev
2026-05-17 06:11:29 +00:00
parent 44d7c796c9
commit e8aaf9ff15
5 changed files with 175 additions and 3 deletions

View File

@@ -15,6 +15,8 @@ export async function getAllTenants() {
plan: true,
databaseName: true,
createdAt: true,
verticalProfile: true,
codigoPostal: true,
_count: {
select: { memberships: { where: { active: true } } as any }
},
@@ -43,6 +45,8 @@ export async function getTenantById(id: string) {
plan: true,
databaseName: true,
createdAt: true,
verticalProfile: true,
codigoPostal: true,
}
});
}
@@ -57,6 +61,8 @@ export async function createTenant(data: {
/** Solo plan custom: primera fecha de pago (deadline para que el cliente
* complete su primer cobro). Se persiste como Subscription.currentPeriodEnd. */
firstPaymentDueAt?: string | null;
verticalProfile?: 'CONTABLE' | 'JURIDICO' | 'ARQUITECTURA';
codigoPostal?: string;
}) {
const plan = data.plan || 'trial';
@@ -70,12 +76,18 @@ export async function createTenant(data: {
}).catch(err => console.error('[METABASE] Register failed:', err));
// 2. Create tenant record
const isTrial = plan === 'trial';
const tenant = await prisma.tenant.create({
data: {
nombre: data.nombre,
rfc: data.rfc.toUpperCase(),
plan,
databaseName,
dbMode: 'MANAGED',
verticalProfile: data.verticalProfile || 'CONTABLE',
codigoPostal: data.codigoPostal || undefined,
trialEndsAt: isTrial ? new Date(Date.now() + 30 * 24 * 60 * 60 * 1000) : undefined,
}
});