fix: personalización logo/color por contribuyente en vez de tenant

- Agrega getCustomizationContribuyente, uploadLogoContribuyente,
  updateColorContribuyente en contribuyente-facturapi.service.ts
- Agrega controllers per-contribuyente en facturacion.controller.ts
- Agrega rutas GET/POST/PUT /contribuyentes/:id/facturapi/customization|logo|color
- Modifica CustomizationSection para recibir contribuyenteId, usar endpoints
  per-contribuyente, y corrige useState mal aplicado a useEffect
- Backend y frontend buildeados y deployados
This commit is contained in:
Horux Dev
2026-05-22 18:20:09 +00:00
parent 46846200da
commit 5ba31b7291
5 changed files with 138 additions and 16 deletions

View File

@@ -8,6 +8,9 @@ import {
downloadPdfContribuyente,
downloadXmlContribuyente,
sendInvoiceByEmailContribuyente,
getCustomizationContribuyente,
uploadLogoContribuyente,
updateColorContribuyente,
} from '../services/contribuyente-facturapi.service.js';
import { parseXml } from '../services/sat/sat-parser.service.js';
import * as tenantsService from '../services/tenants.service.js';
@@ -466,6 +469,38 @@ export async function updateColor(req: Request, res: Response, next: NextFunctio
} catch (error) { next(error); }
}
// ── Personalización per-contribuyente ──
export async function getCustomizationContribuyenteCtrl(req: Request, res: Response, next: NextFunction) {
try {
const contribuyenteId = String(req.params.id);
const data = await getCustomizationContribuyente(req.tenantPool!, contribuyenteId);
res.json(data || {});
} catch (error) { next(error); }
}
export async function uploadLogoContribuyenteCtrl(req: Request, res: Response, next: NextFunction) {
try {
const contribuyenteId = String(req.params.id);
const { logo } = req.body;
if (!logo) return res.status(400).json({ message: 'Logo es requerido (base64)' });
const result = await uploadLogoContribuyente(req.tenantPool!, contribuyenteId, logo);
if (!result.success) return res.status(400).json({ message: result.message });
res.json(result);
} catch (error) { next(error); }
}
export async function updateColorContribuyenteCtrl(req: Request, res: Response, next: NextFunction) {
try {
const contribuyenteId = String(req.params.id);
const { color } = req.body;
if (!color) return res.status(400).json({ message: 'Color es requerido' });
const result = await updateColorContribuyente(req.tenantPool!, contribuyenteId, color);
if (!result.success) return res.status(400).json({ message: result.message });
res.json(result);
} catch (error) { next(error); }
}
// ── Datos fiscales del tenant ──
// Schema Zod para preferencias de auto-facturación