Загрузка данных
WITH ev_operations AS (
/* ============================================================
ФАКТИЧЕСКИЕ ОПЕРАЦИИ ЕВ В ВЫБРАННОМ ПЕРИОДЕ
35 - Единовременная выплата
37 - Дополнительная выплата ЕВ
112 - Единовременная выплата
173 - Дополнительная единовременная выплата
============================================================ */
SELECT o.id
FROM back_office.operation o
WHERE o.operation_type_id IN (35, 37, 112, 173)
AND o.effective_date >= CAST(:start_date AS date)
AND o.effective_date < CAST(:end_date AS date) + INTERVAL '1 day'
),
ev_payment_sharers AS (
/* ============================================================
Определяем sharer, по счетам которых была фактическая
операция ЕВ в выбранном периоде
============================================================ */
/* Дебет */
SELECT da.owner_sharer_id AS sharer_id
FROM ev_operations eo
JOIN back_office.transaction t
ON t.operation_id = eo.id
JOIN back_office.account da
ON da.id = t.debit_account_id
LEFT JOIN back_office.account ca
ON ca.id = t.credit_account_id
WHERE da.owner_sharer_id IS NOT NULL
AND da.owner_sharer_id <> COALESCE(ca.owner_sharer_id, -1)
UNION
/* Кредит */
SELECT ca.owner_sharer_id AS sharer_id
FROM ev_operations eo
JOIN back_office.transaction t
ON t.operation_id = eo.id
JOIN back_office.account ca
ON ca.id = t.credit_account_id
WHERE ca.owner_sharer_id IS NOT NULL
),
ev AS (
/* ============================================================
1. СТАРАЯ ЛОГИКА
Исторические заявления, где ЕВ = ops_payment_type_code '01'
============================================================ */
SELECT
opaa.id,
opaa.appeal_date,
CASE
WHEN opaa.accepted IS NOT NULL
THEN 'Да'
ELSE 'Нет'
END AS accepted,
opaa.number AS reg_numb,
dpt.short_name,
upper(
i.last_name || ' ' ||
i.first_name || ' ' ||
i.middle_name
) AS fio_zl,
i.insurance_number AS i_zl,
c.number AS contract_numb,
pt.name AS payment_way,
a.address_text,
aibd.personal_account,
aibd.bic,
br.bank_name,
br.corraccount,
br.place || ' ' || br.address AS bank_addres,
aibd.accepted AS br_date
FROM ourpension.ops_pension_assignment_application opaa
/* В отчет попадут только те sharer,
по которым была фактическая ЕВ в выбранном периоде */
JOIN ev_payment_sharers eps
ON eps.sharer_id = opaa.sharer_id
LEFT JOIN ourpension.payment_type pt
ON opaa.payment_way = pt.code
JOIN ourpension.sharer s
ON s.id = opaa.sharer_id
JOIN ourpension.contract c
ON c.id = s.contract_id
JOIN ourpension.individual i
ON i.id = c.individual_id
JOIN ourpension.address a
ON i.registration_address_id = a.id
JOIN ourpension.decision_payment_type dpt
ON opaa.decision_payment_type_code = dpt.code
LEFT JOIN ourpension.application_individual_bank_detail aibd
ON opaa.bank_detail_id = aibd.id
LEFT JOIN ourpension.bankru br
ON aibd.bic = br.bic
WHERE opaa.ops_payment_type_code = '01'
/*
ВАЖНО:
старого условия
opaa.appeal_date BETWEEN :start_date AND :end_date
здесь больше НЕТ.
Период определяется фактической выплатой.
*/
AND aibd.accepted = COALESCE(:br_date, aibd.accepted)
UNION ALL
/* ============================================================
2. НОВАЯ ЛОГИКА
Современные ЕВ / ЕВО определяем по РЕШЕНИЮ
============================================================ */
SELECT
opaa.id,
opaa.appeal_date,
CASE
WHEN opaa.accepted IS NOT NULL
THEN 'Да'
ELSE 'Нет'
END AS accepted,
opaa.number AS reg_numb,
dpt.short_name,
upper(
i.last_name || ' ' ||
i.first_name || ' ' ||
i.middle_name
) AS fio_zl,
i.insurance_number AS i_zl,
c.number AS contract_numb,
pt.name AS payment_way,
a.address_text,
aibd.personal_account,
aibd.bic,
br.bank_name,
br.corraccount,
br.place || ' ' || br.address AS bank_addres,
aibd.accepted AS br_date
FROM back_office.ops_payment_decision opd
JOIN ourpension.ops_pension_assignment_application opaa
ON opaa.id = opd.ops_pension_assignment_application_id
/* В отчет попадут только те sharer,
по которым была фактическая ЕВ в выбранном периоде */
JOIN ev_payment_sharers eps
ON eps.sharer_id = opaa.sharer_id
LEFT JOIN ourpension.payment_type pt
ON opaa.payment_way = pt.code
JOIN ourpension.sharer s
ON s.id = opaa.sharer_id
JOIN ourpension.contract c
ON c.id = s.contract_id
JOIN ourpension.individual i
ON i.id = c.individual_id
JOIN ourpension.address a
ON i.registration_address_id = a.id
/* Для современной модели тип выплаты берем из решения */
JOIN ourpension.decision_payment_type dpt
ON opd.decision_payment_type_code = dpt.code
LEFT JOIN ourpension.application_individual_bank_detail aibd
ON opaa.bank_detail_id = aibd.id
LEFT JOIN ourpension.bankru br
ON aibd.bic = br.bic
WHERE opd.decision_payment_type_code IN ('01', '16')
/* Только принятые решения */
AND opd.accepted IS NOT NULL
/* Не берем отмененные / удаленные решения */
AND opd.rejected IS NULL
AND opd.canceled IS NULL
/*
ВАЖНО:
старого условия
opd.date BETWEEN :start_date AND :end_date
здесь больше НЕТ.
Период определяется фактической выплатой.
*/
AND aibd.accepted = COALESCE(:br_date, aibd.accepted)
)
SELECT
ev.id AS id,
to_char(ev.appeal_date, 'DD.MM.YYYY') AS appeal_date,
ev.accepted AS accepted,
ev.reg_numb AS reg_numb,
ev.short_name AS short_name,
ev.fio_zl AS fio_zl,
ev.i_zl AS i_zl,
ev.contract_numb AS contract_numb,
ev.payment_way AS payment_way,
ev.address_text AS address_text,
ev.personal_account AS personal_account,
ev.bic AS bic,
ev.bank_name AS bank_name,
ev.corraccount AS corraccount,
ev.bank_addres AS bank_addres,
to_char(ev.br_date, 'DD.MM.YYYY') AS br_date
FROM ev;