commit melhorias1
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
CREATE TABLE gl_asset_books(tenant_id bigint NOT NULL,company_id bigint NOT NULL,unit_id bigint NOT NULL,policy text NOT NULL,host_database text NOT NULL,schema_sha256 char(64) NOT NULL,PRIMARY KEY(tenant_id,company_id,unit_id));
|
||||
CREATE FUNCTION gl_asset_guard() RETURNS trigger LANGUAGE plpgsql AS $$
|
||||
DECLARE s jsonb;k text;cost bigint;acc bigint;loss bigint;g gl_correction_results%ROWTYPE;o gl_journals%ROWTYPE;expected text[];
|
||||
BEGIN
|
||||
s:=NEW.snapshot->'source';k:=s->>'effect_type';IF k NOT LIKE 'assets.%' THEN RETURN NEW; END IF;
|
||||
IF NOT EXISTS(SELECT 1 FROM gl_asset_books b WHERE (b.tenant_id,b.company_id,b.unit_id)=(NEW.tenant_id,NEW.company_id,NEW.unit_id) AND b.policy='QA-ASSET-JOURNAL-v1' AND b.host_database=s->>'host_database') OR NEW.snapshot->'rule'->>'policy'<>'QA-ASSET-JOURNAL-v1' OR NEW.snapshot->'rule'->>'effect_type'<>k OR (s->>'tax_minor')::bigint<>0 OR (s->>'amount_minor')::bigint<>NEW.debit_minor THEN RAISE EXCEPTION 'ASSET_SOURCE_OR_RULE' USING ERRCODE='23514';END IF;
|
||||
expected:=CASE k WHEN 'assets.admitted' THEN ARRAY['QA-ACTIVO-CUSTO','QA-ACTIVO-ORIGEM-QA'] WHEN 'assets.depreciation' THEN ARRAY['QA-ACTIVO-GASTO-DEP','QA-ACTIVO-DEP-ACUM'] WHEN 'assets.depreciation.replacement' THEN ARRAY['QA-ACTIVO-GASTO-DEP','QA-ACTIVO-DEP-ACUM'] WHEN 'assets.depreciation.reversal' THEN ARRAY['QA-ACTIVO-DEP-ACUM','QA-ACTIVO-GASTO-DEP'] ELSE NULL END;
|
||||
IF k='assets.writeoff' THEN
|
||||
cost:=(s->>'cost_minor')::bigint;acc:=(s->>'accumulated_minor')::bigint;loss:=(s->>'carrying_minor')::bigint;
|
||||
IF cost<>NEW.debit_minor OR acc<0 OR loss<0 OR acc+loss<>cost THEN RAISE EXCEPTION 'ASSET_WRITEOFF_VALUES' USING ERRCODE='23514';END IF;
|
||||
expected:=CASE WHEN acc=0 THEN ARRAY['QA-ACTIVO-GASTO-ABATE','QA-ACTIVO-CUSTO'] WHEN loss=0 THEN ARRAY['QA-ACTIVO-DEP-ACUM','QA-ACTIVO-CUSTO'] ELSE ARRAY['QA-ACTIVO-DEP-ACUM','QA-ACTIVO-GASTO-ABATE','QA-ACTIVO-CUSTO'] END;
|
||||
END IF;
|
||||
IF expected IS NULL OR jsonb_array_length(NEW.snapshot->'lines')<>cardinality(expected) OR EXISTS(SELECT 1 FROM jsonb_array_elements(NEW.snapshot->'lines') WITH ORDINALITY x(line,n) WHERE x.line->>'account_code'<>expected[x.n]) THEN RAISE EXCEPTION 'ASSET_ACCOUNT_LINES' USING ERRCODE='23514';END IF;
|
||||
IF k IN('assets.depreciation.reversal','assets.depreciation.replacement') THEN
|
||||
SELECT * INTO g FROM gl_correction_results WHERE reverse_journal_id=NEW.id OR replacement_journal_id=NEW.id;
|
||||
SELECT * INTO o FROM gl_journals WHERE id=g.original_journal_id AND (tenant_id,company_id,unit_id)=(NEW.tenant_id,NEW.company_id,NEW.unit_id);
|
||||
IF g.id IS NULL OR o.id IS NULL OR o.snapshot->'source'->>'effect_type'<>'assets.depreciation' OR (s->>'source_id')::bigint<>o.id OR s->>'asset_key'<>o.snapshot->'source'->>'asset_key' OR (k='assets.depreciation.reversal' AND NEW.debit_minor<>o.debit_minor) THEN RAISE EXCEPTION 'ASSET_CORRECTION_PAIR_REQUIRED' USING ERRCODE='23514';END IF;
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END $$;
|
||||
CREATE CONSTRAINT TRIGGER gl_asset_journal_guard AFTER INSERT ON gl_journals DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION gl_asset_guard();
|
||||
CREATE TRIGGER gl_asset_books_immutable BEFORE UPDATE OR DELETE ON gl_asset_books FOR EACH ROW EXECUTE FUNCTION gl_append_only();
|
||||
REVOKE ALL ON TABLE gl_asset_books FROM PUBLIC;
|
||||
REVOKE ALL ON FUNCTION gl_asset_guard() FROM PUBLIC;
|
||||
|
||||
-- ASSET_PAIR_EXTENSION_v1
|
||||
CREATE TABLE gl_asset_extension_versions(version int PRIMARY KEY,source_hash char(64) NOT NULL);
|
||||
CREATE TRIGGER gl_asset_extension_versions_immutable BEFORE UPDATE OR DELETE ON gl_asset_extension_versions FOR EACH ROW EXECUTE FUNCTION gl_append_only();
|
||||
REVOKE ALL ON TABLE gl_asset_extension_versions FROM PUBLIC;
|
||||
CREATE FUNCTION gl_asset_pair_assert(group_id bigint) RETURNS void LANGUAGE plpgsql AS $$
|
||||
DECLARE g gl_corrections%ROWTYPE;r gl_correction_results%ROWTYPE;o gl_journals%ROWTYPE;a gl_journals%ROWTYPE;b gl_journals%ROWTYPE;
|
||||
BEGIN
|
||||
SELECT * INTO STRICT g FROM gl_corrections WHERE id=group_id;
|
||||
SELECT * INTO STRICT r FROM gl_correction_results WHERE correction_id=g.id AND (tenant_id,company_id,unit_id)=(g.tenant_id,g.company_id,g.unit_id);
|
||||
SELECT * INTO STRICT o FROM gl_journals WHERE id=g.original_journal_id AND (tenant_id,company_id,unit_id)=(g.tenant_id,g.company_id,g.unit_id);
|
||||
SELECT * INTO STRICT a FROM gl_journals WHERE id=r.reverse_journal_id AND proposal_id=g.reverse_proposal_id AND (tenant_id,company_id,unit_id)=(g.tenant_id,g.company_id,g.unit_id);
|
||||
SELECT * INTO STRICT b FROM gl_journals WHERE id=r.replacement_journal_id AND proposal_id=g.replacement_proposal_id AND (tenant_id,company_id,unit_id)=(g.tenant_id,g.company_id,g.unit_id);
|
||||
IF r.original_journal_id<>o.id OR r.actor_id<>g.prepared_by OR a.posted_by<>g.prepared_by OR b.posted_by<>g.prepared_by OR o.snapshot->'source'->>'effect_type'<>'assets.depreciation' OR a.snapshot->'source'->>'effect_type'<>'assets.depreciation.reversal' OR b.snapshot->'source'->>'effect_type'<>'assets.depreciation.replacement' OR (a.snapshot->'source'->>'source_id')::bigint<>o.id OR (b.snapshot->'source'->>'source_id')::bigint<>o.id OR a.debit_minor<>o.debit_minor OR a.snapshot->'source'->>'asset_key'<>o.snapshot->'source'->>'asset_key' OR b.snapshot->'source'->>'asset_key'<>o.snapshot->'source'->>'asset_key' OR a.snapshot->'source'->>'replacement_source_revision'<>b.snapshot->'source'->>'replacement_source_revision' THEN RAISE EXCEPTION 'ASSET_CORRECTION_PAIR_REQUIRED' USING ERRCODE='23514';END IF;
|
||||
END $$;
|
||||
REVOKE ALL ON FUNCTION gl_asset_pair_assert(bigint) FROM PUBLIC;
|
||||
Reference in New Issue
Block a user