diff --git a/apps/api/src/services/fiel.service.ts b/apps/api/src/services/fiel.service.ts index b16c35f..f2cdfab 100644 --- a/apps/api/src/services/fiel.service.ts +++ b/apps/api/src/services/fiel.service.ts @@ -1,10 +1,11 @@ import { Credential } from '@nodecfdi/credentials/node'; import { writeFile, mkdir } from 'fs/promises'; import { join } from 'path'; -import { prisma } from '../config/database.js'; +import { prisma, tenantDb } from '../config/database.js'; import { env } from '../config/env.js'; import { encryptFielCredentials, encrypt, decryptFielCredentials } from './sat/sat-crypto.service.js'; import { emailService } from './email/email.service.js'; +import { isDespachoTenant } from '@horux/shared'; import type { FielStatus } from '@horux/shared'; /** @@ -305,9 +306,42 @@ export async function getDecryptedFiel(tenantId: string): Promise<{ } /** - * Verifica si un tenant tiene FIEL configurada y válida + * Verifica si un tenant tiene FIEL configurada y válida. + * Para despachos, verifica si hay al menos un contribuyente con FIEL activa. + * Para legacy (Horux 360), verifica la FIEL a nivel de tenant. */ export async function hasFielConfigured(tenantId: string): Promise { + // 1. Intentar FIEL a nivel de tenant (modo legacy Horux 360) const status = await getFielStatus(tenantId); - return status.configured && !status.isExpired; + if (status.configured && !status.isExpired) { + return true; + } + + // 2. Para despachos, verificar FIEL por contribuyente + const tenant = await prisma.tenant.findUnique({ + where: { id: tenantId }, + select: { rfc: true, databaseName: true }, + }); + if (!tenant?.databaseName) { + return false; + } + + const isDespacho = isDespachoTenant(tenant.rfc); + if (!isDespacho) { + return false; + } + + try { + const pool = await tenantDb.getPool(tenantId, tenant.databaseName); + const { rows } = await pool.query(` + SELECT 1 + FROM fiel_contribuyente + WHERE is_active = true AND valid_until > NOW() + LIMIT 1 + `); + return rows.length > 0; + } catch (err: any) { + console.error(`[hasFielConfigured] Error consultando FIEL de contribuyentes para tenant ${tenantId}:`, err.message); + return false; + } }