Загрузка данных
WITH target_decisions AS MATERIALIZED (
SELECT d.id
FROM back_office.ops_assignee_decision d
WHERE :isShow
AND d.accepted IS NOT NULL
),
-- Начисления по каждому решению
charged AS (
SELECT
o.ops_assignee_decision_id AS decision_id,
sum(t.value) AS amount
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
JOIN back_office.transaction t
ON t.operation_id = o.id
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 ot.code = 'CHARGE_FROM_RESERVE'
AND cat.mnemonics = 'НВ ПП ОПС'
AND o.approved IS NOT NULL
AND o.deleted IS NULL
AND o.effective_date <= current_date
GROUP BY o.ops_assignee_decision_id
),
-- Реестры с подтверждённой операцией выплаты
paid_registers AS MATERIALIZED (
SELECT DISTINCT
o.ops_payment_register_id AS register_id
FROM back_office.operation o
JOIN back_office.operation_type ot
ON ot.id = o.operation_type_id
WHERE ot.code IN (
'PAYMENT_PP',
'ADDITIONAL_PAYMENT_PP'
)
AND o.ops_payment_register_id IS NOT NULL
AND o.approved IS NOT NULL
AND o.deleted IS NULL
AND o.effective_date <= current_date
),
-- Выплаты по каждому решению
paid AS (
SELECT
pr.ops_assignee_decision_id AS decision_id,
sum(pr.value) AS amount
FROM target_decisions d
JOIN back_office.ops_payment_register_decision pr
ON pr.ops_assignee_decision_id = d.id
JOIN paid_registers p
ON p.register_id = pr.ops_payment_register_id
GROUP BY pr.ops_assignee_decision_id
),
-- Документы с подтверждённой операцией возврата
confirmed_returns AS MATERIALIZED (
SELECT DISTINCT
o.ops_payment_return_id AS return_id
FROM back_office.operation o
JOIN back_office.operation_type ot
ON ot.id = o.operation_type_id
WHERE ot.code = 'RETURN'
AND o.ops_payment_return_id IS NOT NULL
AND o.approved IS NOT NULL
AND o.deleted IS NULL
AND o.effective_date <= current_date
),
-- Возвраты по каждому решению
returned AS (
SELECT
pr.ops_assignee_decision_id AS decision_id,
sum(r.value) AS amount
FROM target_decisions d
JOIN back_office.ops_payment_register_decision pr
ON pr.ops_assignee_decision_id = d.id
JOIN back_office.ops_payment_return r
ON r.ops_payment_register_decision_id = pr.id
JOIN confirmed_returns cr
ON cr.return_id = r.id
GROUP BY pr.ops_assignee_decision_id
),
report_data AS (
SELECT
row_number() OVER (ORDER BY oad.id) AS rn,
im.id AS individual_id,
im.insurance_number AS snils,
c.id AS contract_id,
c.number AS contract_number,
c.date AS contract_date,
f.name_in_pfr,
concat(
im.last_name, ' ',
im.first_name, ' ',
im.middle_name
) AS fio_m,
concat(
ip.last_name, ' ',
ip.first_name, ' ',
ip.middle_name
) AS fio_p,
oad.number AS number,
oad.date AS date,
coalesce(oadp.payment_value, 0) AS payment_value,
coalesce(b.balance, 0) AS balance,
coalesce(bm.balance, 0) AS balance_rs,
coalesce(dr.ops, 0) + coalesce(dr.ops_id, 0) AS rops,
coalesce(ch.amount, 0)
- coalesce(pay.amount, 0)
+ coalesce(ret.amount, 0) AS reserved,
concat(
a.last_name, ' ',
substr(a.first_name, 1, 1), '. ',
substr(a.middle_name, 1, 1) || '.'
) AS fio_a
FROM target_decisions td
JOIN back_office.ops_assignee_decision oad
ON oad.id = td.id
JOIN ourpension.ops_assignee_payment oap
ON oap.id = oad.ops_assignee_payment_id
JOIN ourpension.sharer sh
ON sh.id = oap.sharer_id
JOIN ourpension.contract c
ON c.id = sh.contract_id
LEFT JOIN ourpension.fund f
ON f.id = c.fund_id
JOIN ourpension.individual im
ON im.id = sh.individual_id
JOIN ourpension.individual ip
ON ip.id = oap.assignee_id
LEFT JOIN back_office.ops_assignee_decision_payment oadp
ON oadp.ops_assignee_decision_id = oad.id
JOIN ourpension.agent a
ON a.id = oad.agent_id
LEFT JOIN report.dia_rops dr
ON dr.dia_register_id = :dia_register_id
AND dr.insurance_number = im.insurance_number
LEFT JOIN charged ch
ON ch.decision_id = oad.id
LEFT JOIN paid pay
ON pay.decision_id = oad.id
LEFT JOIN returned ret
ON ret.decision_id = oad.id
LEFT JOIN LATERAL (
SELECT
sum(b.total_credit) - sum(b.total_debit) AS balance
FROM back_office.account acc
JOIN back_office.balance b
ON b.account_id = acc.id
WHERE current_date BETWEEN b.start_date AND b.end_date
AND acc.owner_sharer_id = sh.id
) b ON true
LEFT JOIN LATERAL (
SELECT
sum(b.total_credit) - sum(b.total_debit) AS balance
FROM back_office.account acc
JOIN back_office.account_type act
ON act.id = acc.account_type_id
JOIN back_office.account_type_group g
ON g.id = act.account_type_group_id
JOIN back_office.balance b
ON b.account_id = acc.id
WHERE current_date BETWEEN b.start_date AND b.end_date
AND g.mnemonics = 'Р(С)'
AND acc.owner_sharer_id = sh.id
) bm ON true
)
SELECT
r.rn AS rn,
concat(
'<a target="_blank" href="view?viewCode=Client_list&id=',
r.individual_id, '">',
r.snils, '</a>'
) AS snils,
concat(
'<a target="_blank" href="view?viewCode=7HPZX8vF&id=',
r.contract_id, '">',
r.contract_number, '</a>'
) AS contract_number,
to_char(r.contract_date, 'DD.MM.YYYY') AS contract_date,
r.name_in_pfr AS name_in_pfr,
r.fio_m AS fio_m,
r.fio_p AS fio_p,
r.number AS number,
to_char(r.date, 'DD.MM.YYYY') AS date,
trim(to_char(
r.payment_value,
'99 999 999 999 999 990D99'
)) AS payment_value,
trim(to_char(
r.payment_value,
'99 999 999 999 999 990D99'
)) AS payment_val,
trim(to_char(
r.balance,
'99 999 999 999 999 990D99'
)) AS balance,
trim(to_char(
r.balance_rs,
'99 999 999 999 999 990D99'
)) AS balance_rs,
trim(to_char(
r.rops,
'99 999 999 999 999 990D99'
)) AS rops,
trim(to_char(
r.reserved,
'99 999 999 999 999 990D99'
)) AS reserved,
trim(to_char(
r.balance + r.balance_rs + r.rops - r.payment_value,
'99 999 999 999 999 990D99'
)) AS total,
r.fio_a AS fio_a
FROM report_data r