Загрузка данных
WITH params AS (
SELECT
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS integer) - 1
AS target_year
),
target_registry AS (
SELECT r.id
FROM report.smev_register r
CROSS JOIN params p
WHERE r.smev_register_type_code = 'УНВ'
AND r."year" = p.target_year
AND r.sample_status IS DISTINCT FROM 'Удалён'
ORDER BY r.id DESC
LIMIT 1
),
annual_contracts AS (
SELECT
s.client_id,
s.contract_id
FROM report.unv_annual_setting s
CROSS JOIN params p
WHERE s.annual_deduction_flag = 1
/* Автоматическое включение начинается со следующего периода */
AND s.selected_tax_period < p.target_year
),
contributions AS (
SELECT
ac.client_id,
ac.contract_id,
ind.insurance_number AS snils,
c.service_type AS contract_type,
c.date AS contract_date,
SUM(t.value) AS contributions_amount
FROM annual_contracts ac
JOIN back_office.incoming_order io
ON io.individual_id = ac.client_id
AND io.contract_id = ac.contract_id
JOIN back_office.incoming_order_operation ioo
ON ioo.incoming_order_id = io.id
JOIN back_office.operation o
ON o.id = ioo.operation_id
JOIN back_office."transaction" t
ON t.operation_id = ioo.operation_id
JOIN back_office.account a
ON a.id = t.credit_account_id
JOIN back_office.account_type at
ON at.id = a.account_type_id
JOIN ourpension.contract c
ON c.id = ac.contract_id
JOIN ourpension.individual ind
ON ind.id = ac.client_id
CROSS JOIN params p
WHERE io.payment_return IS NOT TRUE
/* Взносы учитываются по дате операции */
AND CAST(EXTRACT(YEAR FROM o.operation_date) AS integer) =
p.target_year
/* Только личные взносы по нужным мнемоникам */
AND (
(c.service_type = 'NPO' AND at.mnemonics = 'ИПС_ФЛ')
OR
(c.service_type = 'PDS' AND at.mnemonics = 'ПДС СВ')
)
/* Личный договор либо ПДС в пользу близкого родственника */
AND (
c.individual_id = ac.client_id
OR (
c.service_type = 'PDS'
AND c.family_member IS TRUE
)
)
/* Наличие СНИЛС */
AND NULLIF(TRIM(ind.insurance_number), '') IS NOT NULL
/* Отсутствие активного принятого факта смерти */
AND NOT EXISTS (
SELECT 1
FROM ourpension.application_death_info adi
WHERE adi.individual_id = ind.id
AND adi.accepted IS NOT NULL
AND adi.canceled IS NULL
)
GROUP BY
ac.client_id,
ac.contract_id,
ind.insurance_number,
c.service_type,
c.date
HAVING SUM(t.value) > 0
)
INSERT INTO report.unv_registry_item (
registry_id,
client_id,
snils,
contract_id,
contract_type,
tax_period_year,
contributions_amount,
preliminary_deduction_amount,
annual_deduction_flag,
status,
send_count
)
SELECT
tr.id,
contr.client_id,
contr.snils,
contr.contract_id,
contr.contract_type,
CAST(p.target_year AS smallint),
contr.contributions_amount,
/* Предварительный вычет: 13% с установленными ограничениями */
CASE
WHEN contr.contract_type = 'NPO'
AND contr.contract_date < DATE '2025-01-01'
THEN LEAST(
ROUND(contr.contributions_amount * 13 / 100, 2),
CAST(19500 AS numeric)
)
ELSE LEAST(
ROUND(contr.contributions_amount * 13 / 100, 2),
CAST(52000 AS numeric)
)
END,
1,
'Сформирован',
0
FROM target_registry tr
CROSS JOIN contributions contr
CROSS JOIN params p
WHERE NOT EXISTS (
SELECT 1
FROM report.unv_registry_item existing_item
WHERE existing_item.registry_id = tr.id
AND existing_item.client_id = contr.client_id
AND existing_item.contract_id = contr.contract_id
AND existing_item.tax_period_year =
CAST(p.target_year AS smallint)
);