import { prisma } from '../config/database.js'; export async function createTenantSchema(schemaName: string): Promise { await prisma.$executeRawUnsafe(`CREATE SCHEMA IF NOT EXISTS "${schemaName}"`); await prisma.$executeRawUnsafe(` CREATE TABLE IF NOT EXISTS "${schemaName}"."cfdis" ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), uuid_fiscal VARCHAR(36) UNIQUE NOT NULL, tipo VARCHAR(20) NOT NULL, serie VARCHAR(25), folio VARCHAR(40), fecha_emision TIMESTAMP NOT NULL, fecha_timbrado TIMESTAMP NOT NULL, rfc_emisor VARCHAR(13) NOT NULL, nombre_emisor VARCHAR(300) NOT NULL, rfc_receptor VARCHAR(13) NOT NULL, nombre_receptor VARCHAR(300) NOT NULL, subtotal DECIMAL(18,2) NOT NULL, descuento DECIMAL(18,2) DEFAULT 0, iva DECIMAL(18,2) DEFAULT 0, isr_retenido DECIMAL(18,2) DEFAULT 0, iva_retenido DECIMAL(18,2) DEFAULT 0, total DECIMAL(18,2) NOT NULL, moneda VARCHAR(3) DEFAULT 'MXN', tipo_cambio DECIMAL(10,4) DEFAULT 1, metodo_pago VARCHAR(3), forma_pago VARCHAR(2), uso_cfdi VARCHAR(4), estado VARCHAR(20) DEFAULT 'vigente', xml_url TEXT, pdf_url TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) `); await prisma.$executeRawUnsafe(` CREATE TABLE IF NOT EXISTS "${schemaName}"."iva_mensual" ( id SERIAL PRIMARY KEY, año INTEGER NOT NULL, mes INTEGER NOT NULL, iva_trasladado DECIMAL(18,2) NOT NULL, iva_acreditable DECIMAL(18,2) NOT NULL, iva_retenido DECIMAL(18,2) DEFAULT 0, resultado DECIMAL(18,2) NOT NULL, acumulado DECIMAL(18,2) NOT NULL, estado VARCHAR(20) DEFAULT 'pendiente', fecha_declaracion TIMESTAMP, UNIQUE(año, mes) ) `); await prisma.$executeRawUnsafe(` CREATE TABLE IF NOT EXISTS "${schemaName}"."isr_mensual" ( id SERIAL PRIMARY KEY, año INTEGER NOT NULL, mes INTEGER NOT NULL, ingresos_acumulados DECIMAL(18,2) NOT NULL, deducciones DECIMAL(18,2) NOT NULL, base_gravable DECIMAL(18,2) NOT NULL, isr_causado DECIMAL(18,2) NOT NULL, isr_retenido DECIMAL(18,2) NOT NULL, isr_a_pagar DECIMAL(18,2) NOT NULL, estado VARCHAR(20) DEFAULT 'pendiente', fecha_declaracion TIMESTAMP, UNIQUE(año, mes) ) `); await prisma.$executeRawUnsafe(` CREATE TABLE IF NOT EXISTS "${schemaName}"."alertas" ( id SERIAL PRIMARY KEY, tipo VARCHAR(50) NOT NULL, titulo VARCHAR(200) NOT NULL, mensaje TEXT NOT NULL, prioridad VARCHAR(20) DEFAULT 'media', fecha_vencimiento TIMESTAMP, leida BOOLEAN DEFAULT FALSE, resuelta BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) `); await prisma.$executeRawUnsafe(` CREATE TABLE IF NOT EXISTS "${schemaName}"."calendario_fiscal" ( id SERIAL PRIMARY KEY, titulo VARCHAR(200) NOT NULL, descripcion TEXT, tipo VARCHAR(50) NOT NULL, fecha_limite TIMESTAMP NOT NULL, recurrencia VARCHAR(20) DEFAULT 'unica', completado BOOLEAN DEFAULT FALSE, notas TEXT ) `); } export async function setTenantSchema(schemaName: string): Promise { await prisma.$executeRawUnsafe(`SET search_path TO "${schemaName}"`); } export async function deleteTenantSchema(schemaName: string): Promise { await prisma.$executeRawUnsafe(`DROP SCHEMA IF EXISTS "${schemaName}" CASCADE`); }