chore: catálogo obligaciones, cierre automático, fixes SAT y facturación

- Catálogo de obligaciones fiscales expandido a 30 entradas con campo requierePago.
- Soporte de frecuencia cuatrimestral en obligaciones y declaraciones.
- Automatización de cierre de obligaciones fiscales desde Documentos › Declaraciones.
- Nuevas tablas obligacion_evidencias, obligacion_periodos estados y declaracion_obligaciones.
- Nuevo servicio obligacion-evidencias.service.ts y endpoints REST.
- Refactor de declaraciones.service.ts para vincular obligaciones y crear evidencias.
- Notificaciones por email para evidencias de obligaciones.
- Adjuntar PDFs en correo de declaración subida.
- Fix drill-down de CFDIs: carga completa al visualizar.
- Fix sincronización SAT: tipos P/N, UUID case-insensitive, no reutilizar requestId.
- Fix suscripciones pending en /configuracion/planes-despacho.
- Fix sugerencias de Clave Producto SAT: importar catálogo y robustecer autocomplete.
- Quitar toggle manual de completado en Configuración › Obligaciones fiscales › Tareas.
- Scripts de soporte para Demo Ventas y utilerías (change-user-email, resend-welcome, import-clave-prod-serv).
- Documentación de cambios en docs/CAMBIOS-2026-05-04.md.
This commit is contained in:
Horux Dev
2026-06-22 04:53:59 +00:00
parent b217342a96
commit 7df27ce66d
39 changed files with 2791 additions and 191 deletions

View File

@@ -0,0 +1,7 @@
-- Extender periodicidad para soportar declaraciones cuatrimestrales (ej. SISUB)
ALTER TABLE declaraciones_provisionales
DROP CONSTRAINT IF EXISTS declaraciones_provisionales_periodicidad_check;
ALTER TABLE declaraciones_provisionales
ADD CONSTRAINT declaraciones_provisionales_periodicidad_check
CHECK (periodicidad IN ('mensual', 'bimestral', 'trimestral', 'cuatrimestral', 'semestral', 'anual'));

View File

@@ -0,0 +1,25 @@
-- Evidencias de cumplimiento para obligaciones fiscales.
-- Permite subir cualquier documento (declaración, pago, acuse, complemento)
-- vinculado a una obligación y periodo específicos.
CREATE TABLE IF NOT EXISTS obligacion_evidencias (
id serial PRIMARY KEY,
obligacion_id uuid NOT NULL REFERENCES obligaciones_contribuyente(id) ON DELETE CASCADE,
periodo varchar(7) NOT NULL, -- "2026-04"
contribuyente_id uuid NOT NULL REFERENCES contribuyentes(entidad_id) ON DELETE CASCADE,
tipo_documento varchar(30) NOT NULL CHECK (tipo_documento IN (
'declaracion', 'pago', 'acuse', 'complemento'
)),
archivo bytea NOT NULL,
archivo_filename varchar(255) NOT NULL,
archivo_mime varchar(100) DEFAULT 'application/pdf',
notas text,
subido_por uuid, -- UUID del usuario en horux360 (sin FK local)
subido_por_email varchar(255),
created_at timestamptz DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_obligacion_evidencias_obligacion_periodo
ON obligacion_evidencias (obligacion_id, periodo);
CREATE INDEX IF NOT EXISTS idx_obligacion_evidencias_contribuyente
ON obligacion_evidencias (contribuyente_id);

View File

@@ -0,0 +1,16 @@
-- Estados de declaración y pago por separado para obligaciones que requieren ambos.
ALTER TABLE obligacion_periodos
ADD COLUMN IF NOT EXISTS declaracion_presentada boolean DEFAULT false,
ADD COLUMN IF NOT EXISTS pago_presentado boolean DEFAULT false;
-- Backfill: periodos ya completados se consideran con declaración y pago presentados.
UPDATE obligacion_periodos
SET declaracion_presentada = true,
pago_presentado = true
WHERE completada = true
AND (declaracion_presentada IS NULL OR pago_presentado IS NULL);
-- Asegurar que declaracion_presentada y pago_presentado no sean NULL.
ALTER TABLE obligacion_periodos
ALTER COLUMN declaracion_presentada SET NOT NULL,
ALTER COLUMN pago_presentado SET NOT NULL;

View File

@@ -0,0 +1,12 @@
-- Relación entre declaraciones provisionales y obligaciones fiscales.
-- Permite saber exactamente qué obligaciones cierra una declaración
-- y aplicar el comprobante de pago a las mismas obligaciones.
CREATE TABLE IF NOT EXISTS declaracion_obligaciones (
declaracion_id INT NOT NULL REFERENCES declaraciones_provisionales(id) ON DELETE CASCADE,
obligacion_id UUID NOT NULL REFERENCES obligaciones_contribuyente(id) ON DELETE CASCADE,
created_at TIMESTAMPTZ DEFAULT NOW(),
PRIMARY KEY (declaracion_id, obligacion_id)
);
CREATE INDEX IF NOT EXISTS idx_declaracion_obligaciones_obligacion
ON declaracion_obligaciones (obligacion_id);