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


WITH 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 back_office.ops_assignee_decision oad

    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 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

    -- Начисления по решению
    LEFT JOIN LATERAL (
        SELECT sum(t.value) AS amount
        FROM back_office.operation o
        JOIN back_office.transaction t
            ON t.operation_id = o.id
        JOIN back_office.account ca
            ON ca.id = t.credit_account_id
        WHERE o.ops_assignee_decision_id = oad.id
          AND o.operation_type_id = 4
          AND ca.account_type_id = 62
          AND o.approved IS NOT NULL
          AND o.deleted IS NULL
          AND o.effective_date <= current_date
    ) ch ON true

    -- Обычные и дополнительные выплаты
    LEFT JOIN LATERAL (
        SELECT sum(pr.value) AS amount
        FROM back_office.ops_payment_register_decision pr
        WHERE pr.ops_assignee_decision_id = oad.id
          AND EXISTS (
              SELECT 1
              FROM back_office.operation o
              JOIN back_office.operation_type ot
                  ON ot.id = o.operation_type_id
              WHERE o.ops_payment_register_id =
                    pr.ops_payment_register_id
                AND ot.code IN (
                    'PAYMENT_PP',
                    'ADDITIONAL_PAYMENT_PP'
                )
                AND o.approved IS NOT NULL
                AND o.deleted IS NULL
                AND o.effective_date <= current_date
          )
    ) pay ON true

    -- Возвраты выплат
    LEFT JOIN LATERAL (
        SELECT sum(r.value) AS amount
        FROM back_office.ops_payment_return r
        JOIN back_office.ops_payment_register_decision pr
            ON pr.id = r.ops_payment_register_decision_id
        WHERE pr.ops_assignee_decision_id = oad.id
          AND EXISTS (
              SELECT 1
              FROM back_office.operation o
              WHERE o.ops_payment_return_id = r.id
                AND o.operation_type_id = 17
                AND o.approved IS NOT NULL
                AND o.deleted IS NULL
                AND o.effective_date <= current_date
          )
    ) ret ON true

    WHERE :isShow
      AND oad.accepted IS NOT NULL
      -- Временное ограничение для проверки
      AND oad.id IN (6880, 439205, 444915)
)
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