@accounter/server
Version:
Accounter GraphQL server
104 lines (97 loc) • 4.14 kB
JavaScript
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