UNPKG

@accounter/server

Version:
104 lines (97 loc) 4.14 kB
export default { name: '2026-02-22T19-00-00.fix-overlapping-parallel-function-updates.sql', run: ({ sql }) => sql ` create or replace function accounter_schema.insert_poalim_foreign_transaction_handler() returns trigger language plpgsql as $$ DECLARE merged_id UUID; account_id_var UUID; owner_id_var UUID; charge_id_var UUID = NULL; is_conversion BOOLEAN = false; is_fee BOOLEAN = false; BEGIN -- Create merged raw transactions record: INSERT INTO accounter_schema.transactions_raw_list (poalim_foreign_id) VALUES (NEW.id) RETURNING id INTO merged_id; -- get account and owner IDs SELECT INTO account_id_var, owner_id_var id, owner FROM accounter_schema.financial_accounts WHERE account_number = NEW.account_number::TEXT; -- handle conversions IF (new.activity_type_code in (884, 957, 1058)) THEN is_conversion = true; -- check if matching charge exists: SELECT t.charge_id INTO charge_id_var FROM (SELECT currency, id, reference_number, reference_catenated_number, value_date, event_amount FROM accounter_schema.poalim_foreign_account_transactions WHERE activity_type_code IN (884, 957, 1058) UNION SELECT 'ILS', id, reference_number, reference_catenated_number, value_date, event_amount FROM accounter_schema.poalim_ils_account_transactions WHERE text_code IN (22, 23)) AS s LEFT JOIN accounter_schema.transactions_raw_list tr ON COALESCE(tr.poalim_ils_id, tr.poalim_foreign_id) = s.id LEFT JOIN accounter_schema.transactions t ON tr.id = t.source_id WHERE t.charge_id IS NOT NULL AND s.reference_number = NEW.reference_number AND s.reference_catenated_number = NEW.reference_catenated_number AND s.value_date = NEW.value_date; END IF; -- if no match, create new charge IF (charge_id_var IS NULL) THEN INSERT INTO accounter_schema.charges (owner_id, type) VALUES (owner_id_var, CASE WHEN is_conversion IS TRUE THEN 'CONVERSION'::accounter_schema.charge_type END) RETURNING id INTO charge_id_var; END IF; -- check if new record is fee IF ((new.activity_type_code = 1279 AND new.event_amount BETWEEN 0 AND 30) OR (new.activity_type_code = 884 AND new.original_system_id = 390)) THEN is_fee = true; END IF; -- create new transaction INSERT INTO accounter_schema.transactions (account_id, charge_id, source_id, source_description, currency, event_date, debit_date, amount, current_balance, is_fee, source_reference, source_origin, currency_rate, counter_account, origin_key, owner_id) VALUES (account_id_var, charge_id_var, merged_id, concat_ws(' ', new.activity_description, new.event_details, new.account_name ), new.currency, new.executing_date::text::date, new.value_date::text::date, (CASE WHEN new.event_activity_type_code = 2 THEN (new.event_amount * -1) ELSE new.event_amount END ), new.current_balance, is_fee, new.reference_number::text, 'POALIM', NEW.currency_rate, CASE WHEN new.contra_account_number <> 0 THEN concat( new.contra_bank_number, '-', new.contra_branch_number, '-', new.contra_account_number) ELSE NULL::text END, NEW.id, owner_id_var); RETURN NEW; END; $$; `, }; //# sourceMappingURL=2026-02-22T19-00-00.fix-overlapping-parallel-function-updates.js.map