Загрузка данных
-- Шаг 1. Создаём 3 реестра за N-1, N-2, N-3
-- с проверкой на дубли (если реестр за год уже есть — пропускаем)
INSERT INTO report.unv_registry (
registry_number,
registry_date,
tax_period_year,
status
)
SELECT
'УНВ-' || EXTRACT(YEAR FROM CURRENT_DATE)::text
|| '-' || (EXTRACT(YEAR FROM CURRENT_DATE)::int - n)::text AS registry_number,
CURRENT_DATE AS registry_date,
(EXTRACT(YEAR FROM CURRENT_DATE)::int - n) AS tax_period_year,
'FORMED' AS status
FROM (VALUES (1), (2), (3)) AS t(n)
WHERE NOT EXISTS (
-- Блокируем если реестр за этот год уже есть
SELECT 1
FROM report.unv_registry r
WHERE r.tax_period_year = (EXTRACT(YEAR FROM CURRENT_DATE)::int - n)
AND r.status <> 'DELETED'
);
-- Шаг 2. Вставляем строки реестра по договорам НПО
INSERT INTO report.unv_registry_item (
registry_id,
client_id,
snils,
contract_id,
contract_type,
tax_period_year,
contributions_amount
)
WITH
newly_created AS (
-- Берём только что созданные реестры
SELECT id, tax_period_year
FROM report.unv_registry
WHERE status = 'FORMED'
AND registry_date = CURRENT_DATE
AND tax_period_year IN (
EXTRACT(YEAR FROM CURRENT_DATE)::int - 1,
EXTRACT(YEAR FROM CURRENT_DATE)::int - 2,
EXTRACT(YEAR FROM CURRENT_DATE)::int - 3
)
),
dead_individuals AS (
SELECT DISTINCT individual_id
FROM ourpension.application_death_info
WHERE accepted IS NOT NULL
AND individual_id IS NOT NULL
),
npo_contributions AS (
SELECT
io.contract_id,
io.individual_id,
EXTRACT(YEAR FROM io.date)::int AS contribution_year,
SUM(io.value) AS contributions_amount
FROM back_office.incoming_order io
WHERE io.order_payment_type_id = 18
AND io.payment_return = false
AND EXTRACT(YEAR FROM io.date) IN (
EXTRACT(YEAR FROM CURRENT_DATE)::int - 1,
EXTRACT(YEAR FROM CURRENT_DATE)::int - 2,
EXTRACT(YEAR FROM CURRENT_DATE)::int - 3
)
AND io.contract_id IS NOT NULL
GROUP BY io.contract_id, io.individual_id, EXTRACT(YEAR FROM io.date)::int
)
SELECT
nc.id AS registry_id,
ind.id AS client_id,
ind.insurance_number AS snils,
c.id AS contract_id,
'NPO' AS contract_type,
npo.contribution_year AS tax_period_year,
npo.contributions_amount
FROM npo_contributions npo
JOIN newly_created nc ON nc.tax_period_year = npo.contribution_year
JOIN ourpension.contract c ON c.id = npo.contract_id
JOIN ourpension.individual ind ON ind.id = npo.individual_id
WHERE c.service_type = 'NPO'
AND ind.insurance_number IS NOT NULL
AND ind.insurance_number <> ''
AND ind.id NOT IN (SELECT individual_id FROM dead_individuals)
-- Исключаем договоры которые уже есть в реестре за этот год
AND NOT EXISTS (
SELECT 1
FROM report.unv_registry_item ri
JOIN report.unv_registry r ON r.id = ri.registry_id
WHERE ri.contract_id = npo.contract_id
AND ri.tax_period_year = npo.contribution_year
AND r.status <> 'DELETED'
);
-- Шаг 3. Вставляем строки реестра по договорам ПДС
INSERT INTO report.unv_registry_item (
registry_id,
client_id,
snils,
contract_id,
contract_type,
tax_period_year,
contributions_amount
)
WITH
newly_created AS (
SELECT id, tax_period_year
FROM report.unv_registry
WHERE status = 'FORMED'
AND registry_date = CURRENT_DATE
AND tax_period_year IN (
EXTRACT(YEAR FROM CURRENT_DATE)::int - 1,
EXTRACT(YEAR FROM CURRENT_DATE)::int - 2,
EXTRACT(YEAR FROM CURRENT_DATE)::int - 3
)
),
dead_individuals AS (
SELECT DISTINCT individual_id
FROM ourpension.application_death_info
WHERE accepted IS NOT NULL
AND individual_id IS NOT NULL
),
pds_contributions AS (
SELECT
io.contract_id,
io.individual_id,
EXTRACT(YEAR FROM io.date)::int AS contribution_year,
SUM(io.value) AS contributions_amount
FROM back_office.incoming_order io
WHERE io.order_payment_type_id = 40
AND io.payment_return = false
AND EXTRACT(YEAR FROM io.date) IN (
EXTRACT(YEAR FROM CURRENT_DATE)::int - 1,
EXTRACT(YEAR FROM CURRENT_DATE)::int - 2,
EXTRACT(YEAR FROM CURRENT_DATE)::int - 3
)
AND io.contract_id IS NOT NULL
GROUP BY io.contract_id, io.individual_id, EXTRACT(YEAR FROM io.date)::int
)
SELECT
nc.id AS registry_id,
ind.id AS client_id,
ind.insurance_number AS snils,
c.id AS contract_id,
'PDS' AS contract_type,
pds.contribution_year AS tax_period_year,
pds.contributions_amount
FROM pds_contributions pds
JOIN newly_created nc ON nc.tax_period_year = pds.contribution_year
JOIN ourpension.contract c ON c.id = pds.contract_id
JOIN ourpension.individual ind ON ind.id = pds.individual_id
WHERE c.service_type = 'PDS'
AND ind.insurance_number IS NOT NULL
AND ind.insurance_number <> ''
AND ind.id NOT IN (SELECT individual_id FROM dead_individuals)
AND NOT EXISTS (
SELECT 1
FROM report.unv_registry_item ri
JOIN report.unv_registry r ON r.id = ri.registry_id
WHERE ri.contract_id = pds.contract_id
AND ri.tax_period_year = pds.contribution_year
AND r.status <> 'DELETED'
);