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


WITH report_data AS (
    SELECT
        oad.id AS decision_id,
        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,

        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

    WHERE :isShow
      AND oad.accepted IS NOT NULL
),

report_result AS (
    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(
            coalesce((
                SELECT sum(t.value)
                FROM back_office.operation o

                CROSS JOIN LATERAL (
                    SELECT
                        tr.credit_account_id,
                        tr.value
                    FROM back_office.transaction tr
                    WHERE tr.operation_id = o.id
                    OFFSET 0
                ) t

                JOIN back_office.account ca
                    ON ca.id = t.credit_account_id

                WHERE o.ops_assignee_decision_id = r.decision_id
                  AND o.operation_type_id = (
                      SELECT id
                      FROM back_office.operation_type
                      WHERE code = 'CHARGE_FROM_RESERVE'
                  )
                  AND ca.account_type_id = (
                      SELECT id
                      FROM back_office.account_type
                      WHERE mnemonics = 'НВ ПП ОПС'
                  )
                  AND o.approved IS NOT NULL
                  AND o.deleted IS NULL
                  AND o.effective_date <= current_date
            ), 0)

            - coalesce((
                SELECT sum(pr.value)
                FROM back_office.ops_payment_register_decision pr
                WHERE pr.ops_assignee_decision_id = r.decision_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
                  )
            ), 0)

            + coalesce((
                SELECT sum(ret.value)
                FROM back_office.ops_payment_return ret
                JOIN back_office.ops_payment_register_decision pr
                    ON pr.id = ret.ops_payment_register_decision_id
                WHERE pr.ops_assignee_decision_id = r.decision_id
                  AND EXISTS (
                      SELECT 1
                      FROM back_office.operation o
                      WHERE o.ops_payment_return_id = ret.id
                        AND o.operation_type_id = (
                            SELECT id
                            FROM back_office.operation_type
                            WHERE code = 'RETURN'
                        )
                        AND o.approved IS NOT NULL
                        AND o.deleted IS NULL
                        AND o.effective_date <= current_date
                  )
            ), 0),

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

SELECT
    r.rn AS rn,
    r.snils AS snils,
    r.contract_number AS contract_number,
    r.contract_date 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,
    r.date AS date,
    r.payment_value AS payment_value,
    r.payment_val AS payment_val,
    r.balance AS balance,
    r.balance_rs AS balance_rs,
    r.rops AS rops,
    r.reserved AS reserved,
    r.total AS total,
    r.fio_a AS fio_a
FROM report_result r