mirror of
https://origin.cursor.com/mrdevmx/panels.git
synced 2026-10-09 18:03:18 +00:00
- Sirve documentos con Content-Type real e inline por defecto (query disposition) - DocumentPreviewDialog reconstruye blob con MIME correcto para PDF/imagen - RPC y DELETE para eliminar documentos del expediente; botón en UI - Permiso IAM documents.delete; store archiva todas las versiones previas del tipo - Limpia FileUpload tras subir; is_current robusto en listas vigente/histórico Co-authored-by: alberto.martinez <alberto.martinez@mrdev.mx>
63 lines
2.2 KiB
PL/PgSQL
63 lines
2.2 KiB
PL/PgSQL
--liquibase formatted sql
|
|
-- PANELS · core · eliminar documento de expediente (trabajador)
|
|
|
|
--changeset panel:core-040a-fn-worker-document-delete splitStatements:false
|
|
CREATE OR REPLACE FUNCTION core.fn_worker_document_delete(payload jsonb)
|
|
RETURNS jsonb
|
|
LANGUAGE plpgsql
|
|
SECURITY INVOKER
|
|
SET search_path = core
|
|
AS $$
|
|
DECLARE
|
|
v_worker_id bigint := NULLIF(payload->>'worker_id', '')::bigint;
|
|
v_doc_id bigint := NULLIF(payload->>'doc_id', '')::bigint;
|
|
v_doc documents%ROWTYPE;
|
|
v_next_id bigint;
|
|
BEGIN
|
|
IF v_worker_id IS NULL OR v_doc_id IS NULL THEN
|
|
RETURN core.rpc_err(
|
|
'VALIDATION',
|
|
'fn_worker_document_delete: worker_id y doc_id son obligatorios',
|
|
jsonb_build_object('fn', 'fn_worker_document_delete', 'worker_id', v_worker_id, 'doc_id', v_doc_id)
|
|
);
|
|
END IF;
|
|
SELECT * INTO v_doc FROM documents WHERE id = v_doc_id AND worker_id = v_worker_id;
|
|
IF NOT FOUND THEN
|
|
RETURN core.rpc_err(
|
|
'NOT_FOUND',
|
|
format('fn_worker_document_delete: documento id=%s no encontrado para trabajador %s', v_doc_id, v_worker_id),
|
|
jsonb_build_object('fn', 'fn_worker_document_delete', 'doc_id', v_doc_id, 'worker_id', v_worker_id)
|
|
);
|
|
END IF;
|
|
|
|
DELETE FROM documents WHERE id = v_doc_id AND worker_id = v_worker_id;
|
|
|
|
IF v_doc.is_current THEN
|
|
SELECT id INTO v_next_id
|
|
FROM documents
|
|
WHERE worker_id = v_worker_id
|
|
AND type_code = v_doc.type_code
|
|
ORDER BY uploaded_at DESC, id DESC
|
|
LIMIT 1;
|
|
IF v_next_id IS NOT NULL THEN
|
|
UPDATE documents SET is_current = true WHERE id = v_next_id;
|
|
END IF;
|
|
END IF;
|
|
|
|
RETURN core.rpc_ok(
|
|
jsonb_build_object(
|
|
'deleted_id', v_doc_id,
|
|
'worker_id', v_worker_id,
|
|
'type_code', v_doc.type_code,
|
|
'storage_name', v_doc.storage_name
|
|
),
|
|
format('Documento id=%s eliminado del expediente del trabajador %s', v_doc_id, v_worker_id),
|
|
jsonb_build_object('fn', 'fn_worker_document_delete', 'doc_id', v_doc_id, 'worker_id', v_worker_id)
|
|
);
|
|
EXCEPTION WHEN OTHERS THEN
|
|
RETURN core.rpc_from_exception('fn_worker_document_delete', SQLSTATE, SQLERRM);
|
|
END;
|
|
$$;
|
|
|
|
--changeset panel:core-040b-fn-worker-document-delete-grant endDelimiter:; splitStatements:true
|
|
GRANT EXECUTE ON FUNCTION core.fn_worker_document_delete(jsonb) TO panels_core_app;
|