-- Сначала отбираем операции начисления
charge_operations AS MATERIALIZED (
SELECT
o.id AS operation_id,
o.ops_assignee_decision_id AS decision_id
FROM target_decisions d
JOIN back_office.operation o
ON o.ops_assignee_decision_id = d.id
JOIN back_office.operation_type ot
ON ot.id = o.operation_type_id
WHERE ot.code = 'CHARGE_FROM_RESERVE'
AND o.approved IS NOT NULL
AND o.deleted IS NULL
AND o.effective_date <= current_date
),
-- Получаем проводки отдельно для каждой отобранной операции
charged AS (
SELECT
co.decision_id,
sum(t.value) AS amount
FROM charge_operations co
CROSS JOIN LATERAL (
SELECT
tr.credit_account_id,
tr.value
FROM back_office.transaction tr
WHERE tr.operation_id = co.operation_id
OFFSET 0
) t
JOIN back_office.account ca
ON ca.id = t.credit_account_id
JOIN back_office.account_type cat
ON cat.id = ca.account_type_id
WHERE cat.mnemonics = 'НВ ПП ОПС'
GROUP BY co.decision_id
),