create or replace function doc_counters( mailbox_id_in text, profile_id_in text, structure_id_in text ) RETURNS json AS $$ DECLARE owner_reaction integer; DECLARE partner_reaction integer; DECLARE invoice_v1 text := 'ceaed8e2-b141-415d-8d5d-172584acc413'; DECLARE invoice_v2 text := '5dc512c3-bc0b-419f-9254-0fc00e2569ef'; DECLARE result_record counters_row; DECLARE result_json json; DECLARE visibility_zone integer; BEGIN visibility_zone := profile_to_structures_visibility_zone from oauth_m24.profiles_to_structure where profile_id = profile_id_in and structure_id = structure_id_in; IF (visibility_zone = 1) THEN owner_reaction := count(*) FROM main_documents_grid where transaction_operation IN ('RecievedBySeller', 'ReceivedByRecipient', 'ReceivedByConfidant', 'ReceivedByAgent') AND transaction_owner_mailbox_id = mailbox_id_in AND departament_id = structure_id_in AND ((created_at > CURRENT_TIMESTAMP - INTERVAL '10 DAY' AND (transaction_operation = 'ReceivedByRecipient' OR transaction_operation = 'ReceivedByAgent') AND (doctype_id <> invoice_v1 AND doctype_id <> invoice_v2)) OR (doctype_id <> invoice_v1 AND doctype_id <> invoice_v2)); partner_reaction := count(*) FROM main_documents_grid where transaction_operation IN ('SentToConfidant', 'SentByOwner', 'PendingBuyerAction') AND transaction_owner_mailbox_id = mailbox_id_in AND departament_id = structure_id_in AND ((created_at > CURRENT_TIMESTAMP - INTERVAL '10 DAY' AND (transaction_operation = 'SentByOwner') AND (doctype_id = invoice_v1 OR doctype_id = invoice_v2)) OR (doctype_id <> invoice_v1 AND doctype_id <> invoice_v2)); ELSE owner_reaction := count(*) FROM main_documents_grid where transaction_operation IN ('RecievedBySeller', 'ReceivedByRecipient', 'ReceivedByConfidant', 'ReceivedByAgent') AND transaction_owner_mailbox_id = mailbox_id_in AND (departament_id IN (WITH RECURSIVE strs AS ( SELECT * FROM oauth_m24.structures WHERE parent_structure_id = structure_id_in UNION SELECT t.* FROM oauth_m24.structures t JOIN strs rt ON rt.structure_id = t.parent_structure_id ) SELECT structure_id FROM strs) OR departament_id = structure_id_in) AND ((created_at > CURRENT_TIMESTAMP - INTERVAL '10 DAY' AND (transaction_operation = 'ReceivedByRecipient' OR transaction_operation = 'ReceivedByAgent') AND (doctype_id <> invoice_v1 AND doctype_id <> invoice_v2)) OR (doctype_id <> invoice_v1 AND doctype_id <> invoice_v2)); partner_reaction := count(*) FROM main_documents_grid where transaction_operation IN ('SentToConfidant', 'SentByOwner', 'PendingBuyerAction') AND transaction_owner_mailbox_id = mailbox_id_in AND (departament_id IN (WITH RECURSIVE strs AS ( SELECT * FROM oauth_m24.structures WHERE parent_structure_id = structure_id_in UNION SELECT t.* FROM oauth_m24.structures t JOIN strs rt ON rt.structure_id = t.parent_structure_id ) SELECT structure_id FROM strs) OR departament_id = structure_id_in) AND ((created_at > CURRENT_TIMESTAMP - INTERVAL '10 DAY' AND (transaction_operation = 'SentByOwner') AND (doctype_id = invoice_v1 OR doctype_id = invoice_v2)) OR (doctype_id <> invoice_v1 AND doctype_id <> invoice_v2)); END IF; result_record.requiring_reaction := owner_reaction; result_record.requiring_partner_reaction := partner_reaction; result_json := to_json(result_record); return result_json; END $$ LANGUAGE plpgsql;