commit melhorias sgf

This commit is contained in:
2026-11-11 09:00:17 +02:00
parent 0b05a1192c
commit 1d11a5e57b
736 changed files with 40746 additions and 210 deletions
+25
View File
@@ -0,0 +1,25 @@
CREATE TABLE fx_versions(id bigserial PRIMARY KEY,tenant_id bigint NOT NULL,company_id bigint NOT NULL,unit_id bigint NOT NULL,process_key uuid NOT NULL,kind text NOT NULL CHECK(kind IN('assessment','form')),version bigint NOT NULL CHECK(version>0),previous_id bigint UNIQUE REFERENCES fx_versions(id),action text NOT NULL CHECK(action IN('prepare','review')),state text NOT NULL CHECK(state IN('prepared','reviewed','refused')),prepared_by bigint NOT NULL REFERENCES users(id),actor_id bigint NOT NULL REFERENCES users(id),data jsonb NOT NULL,dependencies jsonb NOT NULL,reason text NOT NULL CHECK(length(reason)>=10),created_at timestamptz NOT NULL DEFAULT now(),UNIQUE(tenant_id,company_id,unit_id,process_key,kind,version),FOREIGN KEY(tenant_id,company_id,unit_id) REFERENCES units(tenant_id,company_id,id));
CREATE TABLE fx_commands(id bigserial PRIMARY KEY,tenant_id bigint NOT NULL,company_id bigint NOT NULL,unit_id bigint NOT NULL,actor_id bigint NOT NULL REFERENCES users(id),command_key uuid NOT NULL,request_hash char(64) NOT NULL,result jsonb NOT NULL,created_at timestamptz NOT NULL DEFAULT now(),UNIQUE(tenant_id,company_id,unit_id,actor_id,command_key));
CREATE FUNCTION sgf_fx_guard() RETURNS trigger LANGUAGE plpgsql AS $$
DECLARE p fx_versions;latest bigint;prefix text;
BEGIN
PERFORM sgf_wo_environment();PERFORM 1 FROM companies WHERE tenant_id=NEW.tenant_id AND id=NEW.company_id FOR UPDATE;
prefix:=CASE NEW.kind WHEN 'assessment' THEN 'fiscal_assessments.' ELSE 'fiscal_forms.' END;
IF NOT EXISTS(SELECT 1 FROM permission_grants WHERE user_id=NEW.actor_id AND tenant_id=NEW.tenant_id AND company_id=NEW.company_id AND unit_id=NEW.unit_id AND permission=prefix||NEW.action) THEN RAISE EXCEPTION 'SGF_FX_ACCESS'; END IF;
IF NOT EXISTS(SELECT 1 FROM company_memberships WHERE user_id=NEW.actor_id AND tenant_id=NEW.tenant_id AND company_id=NEW.company_id) THEN RAISE EXCEPTION 'SGF_FX_MEMBER'; END IF;
SELECT coalesce(max(version),0) INTO latest FROM fx_versions WHERE (tenant_id,company_id,unit_id,process_key,kind)=(NEW.tenant_id,NEW.company_id,NEW.unit_id,NEW.process_key,NEW.kind);
IF NEW.version<>latest+1 THEN RAISE EXCEPTION 'SGF_FX_STALE'; END IF;
IF latest=0 THEN IF NEW.previous_id IS NOT NULL OR NEW.action<>'prepare' THEN RAISE EXCEPTION 'SGF_FX_FIRST'; END IF;
ELSE SELECT * INTO p FROM fx_versions WHERE (tenant_id,company_id,unit_id,process_key,kind,version)=(NEW.tenant_id,NEW.company_id,NEW.unit_id,NEW.process_key,NEW.kind,latest);
IF NEW.previous_id IS DISTINCT FROM p.id THEN RAISE EXCEPTION 'SGF_FX_PARENT'; END IF; END IF;
IF NEW.action='review' THEN IF p.state<>'prepared' OR NEW.prepared_by<>p.prepared_by OR NEW.actor_id=p.prepared_by OR NEW.state NOT IN('reviewed','refused') OR NEW.data IS DISTINCT FROM p.data OR NEW.dependencies IS DISTINCT FROM p.dependencies THEN RAISE EXCEPTION 'SGF_FX_REVIEW'; END IF;
ELSE IF NEW.prepared_by<>NEW.actor_id OR NEW.state<>'prepared' THEN RAISE EXCEPTION 'SGF_FX_PREPARE'; END IF; END IF;
RETURN NEW;
END; $$;
CREATE TRIGGER fx_guard BEFORE INSERT ON fx_versions FOR EACH ROW EXECUTE FUNCTION sgf_fx_guard();
CREATE TRIGGER fx_versions_immutable BEFORE UPDATE OR DELETE ON fx_versions FOR EACH ROW EXECUTE FUNCTION sgf_append_only_audit();
CREATE TRIGGER fx_commands_immutable BEFORE UPDATE OR DELETE ON fx_commands FOR EACH ROW EXECUTE FUNCTION sgf_append_only_audit();
CREATE TRIGGER fx_commands_test BEFORE INSERT ON fx_commands FOR EACH ROW EXECUTE FUNCTION sgf_wo_test_only();
REVOKE ALL ON fx_versions,fx_commands FROM PUBLIC;
REVOKE ALL ON SEQUENCE fx_versions_id_seq,fx_commands_id_seq FROM PUBLIC;
REVOKE ALL ON FUNCTION sgf_fx_guard() FROM PUBLIC;