--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;