Загрузка данных


-- Оптимизированная версия с объединением дубликатов и упрощением логики

--------------------- NPO

WITH filtered_sharers AS (
    SELECT 
        s.id AS id,
        ps.name as pensionName,
        cc.name
    FROM ourpension.sharer s 
    JOIN ourpension.contract c ON c.id = s.contract_id 
    JOIN ourpension.pension_scheme ps ON ps.id = s.scheme_id 
    JOIN ourpension.sharer_class_history sch ON sch.sharer_id = s.id AND sch.end_date IS NULL
    JOIN ourpension.contract_classes cc ON cc.id = sch.class_id 
    WHERE c.service_type = 'NPO'
),

relevant_accounts AS (
    SELECT 
        a.id as account_id,
        fs.pensionName,
        fs.name as iv_name
    FROM filtered_sharers fs
    JOIN back_office.account a ON a.owner_sharer_id = fs.id
    JOIN back_office.account_type at ON a.account_type_id = at.id 
    JOIN back_office.account_type_group atg ON at.account_type_group_id = atg.id
    WHERE atg.mnemonics != 'ВЗ'
),

combined_eps AS (
    SELECT 
        ra.pensionName,
        ra.iv_name,
        e.code,
        SUM(t.value) AS sum_oper
    FROM relevant_accounts ra
    JOIN back_office."transaction" t ON t.credit_account_id = ra.account_id
    JOIN back_office.operation o ON o.id = t.operation_id 
    JOIN back_office.eps_transaction_source s ON o.id = s.operation_id
    JOIN back_office.eps_transaction et ON et.eps_transaction_source_id = s.id
    JOIN ourpension.eps e ON e.id = et.eps_id 
    WHERE o.effective_date BETWEEN '2026-01-01' AND '2026-06-01'
      AND e.code IN (
          '172053', '172155', '172156', '172157', '172158',  -- qualification codes
          '172091', '172149', '172150', '172151', '172152'   -- distribution codes
      )
    GROUP BY ra.pensionName, ra.iv_name, e.code
),

balance_data AS (
    SELECT 
        ra.pensionName,
        ra.iv_name,
        SUM(CASE WHEN '2026-05-01' BETWEEN b.start_date AND b.end_date THEN b.total_credit - b.total_debit END) AS balance_begin_sum,
        SUM(CASE WHEN '2026-06-01' BETWEEN b.start_date AND b.end_date THEN b.total_credit - b.total_debit END) AS balance_end_sum
    FROM relevant_accounts ra
    JOIN back_office.balance b ON ra.account_id = b.account_id
    GROUP BY ra.pensionName, ra.iv_name
),

operation_summary_direct AS (
    SELECT 
        ra.pensionName,
        ra.iv_name,
        SUM(CASE WHEN ot.code = 'DEPOSIT_ENROLLMENT' THEN t.value END) AS deposit_enrollment,
        SUM(CASE WHEN ot.code = 'NPO_PENSION_CONTRIB_RETURN' THEN t.value END) AS npo_pension_contrib_return,
        SUM(CASE WHEN ot.code = 'PAYMENT_PENSION' THEN t.value END) AS payment_pension,
        SUM(CASE WHEN ot.code IN ('PAYMENT_TERMINATED', 'NPO_NDFL_REDEMPTION') THEN t.value END) AS payment_terminated,
        SUM(CASE WHEN ot.code IN ('PAYMENT_INHERITED', 'NPO_NDFL_SUCCESSOR') THEN t.value END) AS succesor_sum,
        SUM(CASE WHEN ot.code IN (
            'NPO_RETURN_NDFL_NONSTATE_PENSION', 'NPO_RETURN_REDEMPTION_SUM', 'NPO_RETURN_NDFL_REDEMPTION',
            'NPO_RETURN_SUCCESSOR_PAYMENT', 'NPO_RETURN_NDFL_SUCCESSOR', 'NPO_RETURN_HEIRS_PAYMENT', 'NPO_RETURN_NDFL_HEIRS'
        ) THEN t.value END) AS npo_returns,
        SUM(CASE WHEN ot.code = 'TRANSFER_TO_INSURED_FUND_RESERVE' THEN t.value END) AS transfer_to_insured_fund_reserve,
        SUM(CASE WHEN ot.code = 'TRANSFER_TO_INSURED_FUND_RESERVE' THEN t.value END) AS transfer_to_insured_fund_reserve_rppo,
        SUM(CASE WHEN ot.code = 'TRANSFER_FROM_INSURED_FUND_RESERVE' THEN t.value END) AS transfer_from_insured_fund_reserve,
        SUM(CASE WHEN ot.code = 'NPO_TARGET_CONTRIBUTIONS' THEN t.value END) AS npo_target_contributions,
        SUM(CASE WHEN ot.code = 'TRANSFER_TO_INSURED_FUND_RESERVE_OPS' THEN t.value END) AS transfer_to_insured_fund_reserve_ops,
        SUM(CASE WHEN ot.code = 'PENSION_INVESTMENT_REVENUE_ENROLLMENT_PR' THEN t.value END) AS pension_investment_revenue_enrollment_pr
    FROM relevant_accounts ra
    JOIN back_office."transaction" t ON t.credit_account_id = ra.account_id
    JOIN back_office.operation o ON o.id = t.operation_id 
    JOIN back_office.operation_type ot ON o.operation_type_id = ot.id
    WHERE o.effective_date BETWEEN '2026-05-01' AND '2026-06-01'
      AND ot.code IN (
          'DEPOSIT_ENROLLMENT', 'NPO_PENSION_CONTRIB_RETURN', 'PAYMENT_PENSION', 'PAYMENT_TERMINATED',
          'NPO_NDFL_REDEMPTION', 'NPO_NDFL_SUCCESSOR', 'PAYMENT_INHERITED', 'NPO_NDFL_HEIRS', 'NPO_RETURN_NDFL_NONSTATE_PENSION',
          'NPO_RETURN_REDEMPTION_SUM', 'NPO_RETURN_NDFL_REDEMPTION', 'NPO_RETURN_SUCCESSOR_PAYMENT',
          'NPO_RETURN_NDFL_SUCCESSOR', 'NPO_RETURN_HEIRS_PAYMENT', 'NPO_RETURN_NDFL_HEIRS',
          'TRANSFER_TO_INSURED_FUND_RESERVE', 'TRANSFER_FROM_INSURED_FUND_RESERVE',
          'NPO_TARGET_CONTRIBUTIONS', 'TRANSFER_TO_INSURED_FUND_RESERVE_OPS',
          'PENSION_INVESTMENT_REVENUE_ENROLLMENT_PR'
      )
    GROUP BY ra.pensionName, ra.iv_name
),

total_by_iv_name AS (
    SELECT 
        iv_name,
        'Итого' AS pensionName,
        SUM(balance_begin_sum) AS balance_begin_sum,
        SUM(deposit_enrollment) AS deposit_enrollment,
        SUM(npo_pension_contrib_return) AS npo_pension_contrib_return,
        SUM(payment_pension) AS payment_pension,
        SUM(payment_terminated) AS payment_terminated,
        SUM(succesor_sum) AS succesor_sum,
        SUM(npo_returns) AS npo_returns,
        SUM(total) AS total,
        SUM(transfer_to_insured_fund_reserve) AS transfer_to_insured_fund_reserve,
        SUM(transfer_from_insured_fund_reserve) AS transfer_from_insured_fund_reserve,
        SUM(npo_target_contributions) AS npo_target_contributions,
        SUM(transfer_to_insured_fund_reserve_ops) AS transfer_to_insured_fund_reserve_ops,
        SUM(pension_investment_revenue_enrollment_pr) AS pension_investment_revenue_enrollment_pr,
        SUM(balance_end_sum) AS balance_end_sum
    FROM (
        SELECT 
            bb.iv_name,
            bb.balance_begin_sum,
            COALESCE(osd.deposit_enrollment, 0) AS deposit_enrollment,
            COALESCE(osd.npo_pension_contrib_return, 0) AS npo_pension_contrib_return,
            COALESCE(osd.payment_pension, 0) AS payment_pension,
            COALESCE(osd.payment_terminated, 0) AS payment_terminated,
            COALESCE(osd.succesor_sum, 0) AS succesor_sum,
            COALESCE(osd.npo_returns, 0) AS npo_returns,
            COALESCE(osd.payment_pension, 0) + COALESCE(osd.payment_terminated, 0) + COALESCE(osd.succesor_sum, 0) - COALESCE(osd.npo_returns, 0) AS total,
            COALESCE(osd.transfer_to_insured_fund_reserve, 0) AS transfer_to_insured_fund_reserve,
            COALESCE(osd.transfer_from_insured_fund_reserve, 0) AS transfer_from_insured_fund_reserve,
            COALESCE(osd.npo_target_contributions, 0) AS npo_target_contributions,
            COALESCE(osd.transfer_to_insured_fund_reserve_ops, 0) AS transfer_to_insured_fund_reserve_ops,
            COALESCE(osd.pension_investment_revenue_enrollment_pr, 0) AS pension_investment_revenue_enrollment_pr,
            be.balance_end_sum
        FROM balance_data bb
        LEFT JOIN operation_summary_direct osd ON osd.pensionName = bb.pensionName AND osd.iv_name = bb.iv_name
        LEFT JOIN balance_data be ON be.pensionName = bb.pensionName AND be.iv_name = bb.iv_name
    ) subquery
    GROUP BY iv_name
)

SELECT 
    bb.pensionName,
    bb.iv_name,
    bb.balance_begin_sum,
    COALESCE(osd.deposit_enrollment, 0) AS deposit_enrollment,
    COALESCE(osd.npo_pension_contrib_return, 0) AS npo_pension_contrib_return,
    COALESCE(osd.payment_pension, 0) AS payment_pension,
    COALESCE(osd.payment_terminated, 0) AS payment_terminated,
    COALESCE(osd.succesor_sum, 0) AS succesor_sum,
    COALESCE(osd.npo_returns, 0) AS npo_returns,
    COALESCE(osd.payment_pension, 0) + COALESCE(osd.payment_terminated, 0) + COALESCE(osd.succesor_sum, 0) - COALESCE(osd.npo_returns, 0) AS total,
    COALESCE(osd.transfer_to_insured_fund_reserve, 0) AS transfer_to_insured_fund_reserve,
    COALESCE(osd.transfer_from_insured_fund_reserve, 0) AS transfer_from_insured_fund_reserve,
    COALESCE(osd.npo_target_contributions, 0) AS npo_target_contributions,
    COALESCE(osd.transfer_to_insured_fund_reserve_ops, 0) AS transfer_to_insured_fund_reserve_ops,
    COALESCE(osd.pension_investment_revenue_enrollment_pr, 0) AS pension_investment_revenue_enrollment_pr,
    be.balance_end_sum
FROM balance_data bb
LEFT JOIN operation_summary_direct osd ON osd.pensionName = bb.pensionName AND osd.iv_name = bb.iv_name
LEFT JOIN balance_data be ON be.pensionName = bb.pensionName AND be.iv_name = bb.iv_name
WHERE bb.iv_name IN ('Инвестиционный', 'Страховой')

UNION ALL

SELECT * FROM total_by_iv_name
WHERE iv_name IN ('Инвестиционный', 'Страховой');

--------------------- NPO
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------- PDS
WITH filtered_sharers AS (
    SELECT 
        s.id AS id,
        ps.name as pensionName,
        cc.name
    FROM ourpension.sharer s 
    JOIN ourpension.contract c ON c.id = s.contract_id 
    JOIN ourpension.pension_scheme ps ON ps.id = s.scheme_id 
    JOIN ourpension.sharer_class_history sch ON sch.sharer_id = s.id AND sch.end_date IS NULL
    JOIN ourpension.contract_classes cc ON cc.id = sch.class_id 
    WHERE c.service_type = 'PDS'
),

relevant_accounts AS (
    SELECT 
        a.id as account_id,
        fs.pensionName,
        fs.name as iv_name
    FROM filtered_sharers fs
    JOIN back_office.account a ON a.owner_sharer_id = fs.id
    JOIN back_office.account_type at ON a.account_type_id = at.id 
    JOIN back_office.account_type_group atg ON at.account_type_group_id = atg.id
    WHERE atg.mnemonics != 'ВЗ'
),
balance_data AS (
    SELECT 
        ra.pensionName,
        ra.iv_name,
        SUM(CASE WHEN '2026-05-01' BETWEEN b.start_date AND b.end_date THEN b.total_credit - b.total_debit END) AS balance_begin_sum,
        SUM(CASE WHEN '2026-06-01' BETWEEN b.start_date AND b.end_date THEN b.total_credit - b.total_debit END) AS balance_end_sum
    FROM relevant_accounts ra
    JOIN back_office.balance b ON ra.account_id = b.account_id
    GROUP BY ra.pensionName, ra.iv_name
),

operation_summary_direct AS (
    SELECT 
        ra.pensionName,
        ra.iv_name,
        SUM(CASE WHEN ot.code = 'PDS_OPS_ENROLLMENT_PDS' THEN t.value END) AS pds_enrollment,
        SUM(CASE WHEN ot.code = 'DS_DEPOSIT_ENROLLMENT' THEN t.value END) AS pds_deposit_enrollment,
        SUM(CASE WHEN ot.code = 'PDS_DEPOSIT_ENROLLMENT_FOR_EMPLOYER' THEN t.value END) AS pds_deposit_enrollment_for_employer,
        SUM(CASE WHEN ot.code IN ('PDS_GOS_ENROLLMENT') THEN t.value END) AS pds_gos_enrollment,
        SUM(CASE WHEN ot.code IN ('PDS_SAVINGS_CONTRIB_RETURN') THEN t.value END) AS pds_savings_contrib_return,
        SUM(CASE WHEN ot.code IN (
            'PDS_EV_PAYMENT', 'PDS_NDFL_LUMP_SUM_PAYMENT'
        ) THEN t.value END) AS pds_ev_payment,
       SUM(CASE WHEN ot.code IN ('PDS_REDEMPTION_PAYMENT', 'PDS_NDFL_REDEMPTION_PAYMENT') THEN t.value END) AS pds_redemption_payment,
        SUM(CASE WHEN ot.code IN ('PDS_SUCCESSOR_PAYMENT', 'PDS_NDFL_SUCCESSOR_PAYMENT') THEN t.value END) AS pds_successor_payment,
        SUM(CASE WHEN ot.code IN ('PDS_PENSION_PAYMENT', 'PDS_NDFL_PENSION_PAYMENT') THEN t.value END) AS pds_pension_payment,
        SUM(CASE WHEN ot.code = 'PDS_REDEMPTION_PAYMENT_TO_NP' THEN t.value END) AS pds_redemption_payment_to_np,
        SUM(CASE WHEN ot.code IN (
            'PDS_RETURN_PAYMENT', 'PDS_RETURN_LUMP_SUM_PAYMENT', 'PDS_RETURN_NDFL_LUMP_SUM',
            'PDS_RETURN_PERIODIC_PAYMENT', 'PDS_RETURN_NDFL_PERIODIC', 'PDS_RETURN_NDFL_REDEMPTION_LOSS',
            'PDS_RETURN_REDEMPTION_LIFELONG', 'PDS_RETURN_SUCCESSOR_PAYMENT', 'PDS_RETURN_NDFL_SUCCESSOR',
            'PDS_RETURN_REDEMPTION_SUM', 'PDS_RETURN_NDFL_REDEMPTION'
        ) THEN t.value END) AS pds_returns,
        SUM(CASE WHEN ot.code = 'TRANSFER_TO_INSURED_FUND_RESERVE' THEN t.value END) AS transfer_to_insured_fund_reserve,
        SUM(CASE WHEN ot.code = 'PDS_TRANSFER_FROM_INSURED_FUND_RESERVE' THEN t.value END) AS transfer_from_insured_fund_reserve,
        SUM(CASE WHEN ot.code = 'PDS_PENSION_INVESTMENT_REVENUE_ENROLLMENT' THEN t.value END) AS financial_result
        
    FROM relevant_accounts ra
    JOIN back_office."transaction" t ON t.credit_account_id = ra.account_id
    JOIN back_office.operation o ON o.id = t.operation_id 
    JOIN back_office.operation_type ot ON o.operation_type_id = ot.id
    WHERE o.effective_date BETWEEN '2026-05-01' AND '2026-06-01'
      AND ot.code IN (
          'PDS_OPS_ENROLLMENT_PDS', 'DS_DEPOSIT_ENROLLMENT', 'PDS_DEPOSIT_ENROLLMENT_FOR_EMPLOYER', 
          'PDS_GOS_ENROLLMENT', 'PDS_SAVINGS_CONTRIB_RETURN', 'PDS_EV_PAYMENT', 'PDS_NDFL_LUMP_SUM_PAYMENT', 
          'PDS_REDEMPTION_PAYMENT', 'PDS_NDFL_REDEMPTION_PAYMENT', 'PDS_SUCCESSOR_PAYMENT', 
          'PDS_NDFL_SUCCESSOR_PAYMENT', 'PDS_PENSION_PAYMENT', 'PDS_NDFL_PENSION_PAYMENT', 
          'PDS_REDEMPTION_PAYMENT_TO_NP', 'PDS_RETURN_PAYMENT', 'PDS_RETURN_LUMP_SUM_PAYMENT', 
          'PDS_RETURN_NDFL_LUMP_SUM', 'PDS_RETURN_PERIODIC_PAYMENT', 'PDS_RETURN_NDFL_PERIODIC', 
          'PDS_RETURN_NDFL_REDEMPTION_LOSS', 'PDS_RETURN_REDEMPTION_LIFELONG', 'PDS_RETURN_SUCCESSOR_PAYMENT', 
          'PDS_RETURN_NDFL_SUCCESSOR', 'PDS_RETURN_REDEMPTION_SUM', 'PDS_RETURN_NDFL_REDEMPTION', 
          'TRANSFER_TO_INSURED_FUND_RESERVE', 'PDS_TRANSFER_FROM_INSURED_FUND_RESERVE', 
          'PDS_PENSION_INVESTMENT_REVENUE_ENROLLMENT'
      )
    GROUP BY ra.pensionName, ra.iv_name
),

total_by_iv_name AS (
    SELECT 
        iv_name,
        'Итого' AS pensionName,
        SUM(balance_begin_sum) AS balance_begin_sum,
        SUM(pds_enrollment) AS pds_enrollment,
        SUM(pds_deposit_enrollment) AS pds_deposit_enrollment,
        SUM(pds_deposit_enrollment_for_employer) AS pds_deposit_enrollment_for_employer,
        SUM(pds_gos_enrollment) AS pds_gos_enrollment,
        SUM(pds_savings_contrib_return) AS pds_savings_contrib_return,
        SUM(pds_ev_payment) AS pds_ev_payment,
        SUM(pds_redemption_payment) AS pds_redemption_payment,
        SUM(pds_successor_payment) AS pds_successor_payment,
        SUM(pds_pension_payment) AS pds_pension_payment,
        SUM(pds_redemption_payment_to_np) AS pds_redemption_payment_to_np,
        SUM(pds_returns) AS pds_returns,
        SUM(transfer_to_insured_fund_reserve) AS transfer_to_insured_fund_reserve,
        SUM(transfer_from_insured_fund_reserve) AS transfer_from_insured_fund_reserve,
        SUM(financial_result) AS financial_result,
        SUM(balance_end_sum) AS balance_end_sum
    FROM (
        SELECT 
            bb.iv_name,
            bb.balance_begin_sum,
            COALESCE(osd.pds_enrollment, 0) AS pds_enrollment,
            COALESCE(osd.pds_deposit_enrollment, 0) AS pds_deposit_enrollment,
            COALESCE(osd.pds_deposit_enrollment_for_employer, 0) AS pds_deposit_enrollment_for_employer,
            COALESCE(osd.pds_gos_enrollment, 0) AS pds_gos_enrollment,
            COALESCE(osd.pds_savings_contrib_return, 0) AS pds_savings_contrib_return,
            COALESCE(osd.pds_ev_payment, 0) AS pds_ev_payment,
            COALESCE(osd.pds_redemption_payment, 0) AS pds_redemption_payment,
            COALESCE(osd.pds_successor_payment, 0) AS pds_successor_payment,
            COALESCE(osd.pds_pension_payment, 0) AS pds_pension_payment,
            COALESCE(osd.pds_redemption_payment_to_np, 0) AS pds_redemption_payment_to_np,
            COALESCE(osd.pds_returns, 0) AS pds_returns,
            COALESCE(osd.transfer_to_insured_fund_reserve, 0) AS transfer_to_insured_fund_reserve,
            COALESCE(osd.transfer_from_insured_fund_reserve, 0) AS transfer_from_insured_fund_reserve,
            COALESCE(osd.financial_result, 0) AS financial_result,
            be.balance_end_sum
        FROM balance_data bb
        LEFT JOIN operation_summary_direct osd 
            ON osd.pensionName = bb.pensionName AND osd.iv_name = bb.iv_name
        LEFT JOIN balance_data be 
            ON be.pensionName = bb.pensionName AND be.iv_name = bb.iv_name
    ) subquery
    GROUP BY iv_name
),

final_output AS (
    SELECT 
        bb.pensionName,
        bb.iv_name,
        bb.balance_begin_sum,
        COALESCE(osd.pds_enrollment, 0) AS pds_enrollment,
        COALESCE(osd.pds_deposit_enrollment, 0) AS pds_deposit_enrollment,
        COALESCE(osd.pds_deposit_enrollment_for_employer, 0) AS pds_deposit_enrollment_for_employer,
        COALESCE(osd.pds_gos_enrollment, 0) AS pds_gos_enrollment,
        COALESCE(osd.pds_savings_contrib_return, 0) AS pds_savings_contrib_return,
        COALESCE(osd.pds_ev_payment, 0) AS pds_ev_payment,
        COALESCE(osd.pds_redemption_payment, 0) AS pds_redemption_payment,
        COALESCE(osd.pds_successor_payment, 0) AS pds_successor_payment,
        COALESCE(osd.pds_pension_payment, 0) AS pds_pension_payment,
        COALESCE(osd.pds_redemption_payment_to_np, 0) AS pds_redemption_payment_to_np,
        COALESCE(osd.pds_returns, 0) AS pds_returns,
        COALESCE(osd.transfer_to_insured_fund_reserve, 0) AS transfer_to_insured_fund_reserve,
        COALESCE(osd.transfer_from_insured_fund_reserve, 0) AS transfer_from_insured_fund_reserve,
        COALESCE(osd.financial_result, 0) AS financial_result,
        be.balance_end_sum
    FROM balance_data bb
    LEFT JOIN operation_summary_direct osd 
        ON osd.pensionName = bb.pensionName AND osd.iv_name = bb.iv_name
    LEFT JOIN balance_data be 
        ON be.pensionName = bb.pensionName AND be.iv_name = bb.iv_name
    WHERE bb.iv_name IN ('Инвестиционный', 'Страховой')
)

SELECT * FROM final_output
UNION ALL
SELECT * FROM total_by_iv_name
WHERE iv_name IN ('Инвестиционный', 'Страховой');

--------------------- PDS