Загрузка данных
-- ПРОВЕРКА 1. Смотрим что создастся в unv_registry (без INSERT)
SELECT
'УНВ-' || CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS varchar)
|| '-' || CAST(CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - n AS varchar) AS registry_number,
CURRENT_DATE AS registry_date,
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS 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 = CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - n
AND r.status <> 'DELETED'
);
-- ПРОВЕРКА 2. Смотрим что попадёт в unv_registry_item (без INSERT)
WITH
newly_created AS (
SELECT id, tax_period_year
FROM report.unv_registry
WHERE status = 'FORMED'
AND tax_period_year IN (
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 1,
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 2,
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 3
)
AND id NOT IN (SELECT DISTINCT registry_id FROM report.unv_registry_item)
),
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,
CAST(EXTRACT(YEAR FROM io.date) AS int) AS contribution_year,
SUM(t.value) AS contributions_amount
FROM back_office.incoming_order io
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
WHERE at.mnemonics = 'ИПС_ФЛ'
AND io.payment_return = false
AND CAST(EXTRACT(YEAR FROM io.date) AS int) IN (
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 1,
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 2,
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 3
)
AND io.contract_id IS NOT NULL
GROUP BY
io.contract_id,
io.individual_id,
CAST(EXTRACT(YEAR FROM io.date) AS int)
),
pds_contributions AS (
SELECT
io.contract_id,
io.individual_id,
CAST(EXTRACT(YEAR FROM io.date) AS int) AS contribution_year,
SUM(t.value) AS contributions_amount
FROM back_office.incoming_order io
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
WHERE at.mnemonics = 'ПДС СВ'
AND io.payment_return = false
AND CAST(EXTRACT(YEAR FROM io.date) AS int) IN (
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 1,
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 2,
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 3
)
AND io.contract_id IS NOT NULL
GROUP BY
io.contract_id,
io.individual_id,
CAST(EXTRACT(YEAR FROM io.date) AS 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)
UNION ALL
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);
-- ШАГ 1. Создаём 3 реестра
INSERT INTO report.unv_registry (
registry_number,
registry_date,
tax_period_year,
status
)
SELECT
'УНВ-' || CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS varchar)
|| '-' || CAST(CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - n AS varchar),
CURRENT_DATE,
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - n,
'FORMED'
FROM (VALUES (1), (2), (3)) AS t(n)
WHERE NOT EXISTS (
SELECT 1
FROM report.unv_registry r
WHERE r.tax_period_year = CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS 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 tax_period_year IN (
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 1,
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 2,
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 3
)
AND id NOT IN (SELECT DISTINCT registry_id FROM report.unv_registry_item)
),
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,
CAST(EXTRACT(YEAR FROM io.date) AS int) AS contribution_year,
SUM(t.value) AS contributions_amount
FROM back_office.incoming_order io
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
WHERE at.mnemonics = 'ИПС_ФЛ'
AND io.payment_return = false
AND CAST(EXTRACT(YEAR FROM io.date) AS int) IN (
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 1,
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 2,
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 3
)
AND io.contract_id IS NOT NULL
GROUP BY
io.contract_id,
io.individual_id,
CAST(EXTRACT(YEAR FROM io.date) AS int)
),
pds_contributions AS (
SELECT
io.contract_id,
io.individual_id,
CAST(EXTRACT(YEAR FROM io.date) AS int) AS contribution_year,
SUM(t.value) AS contributions_amount
FROM back_office.incoming_order io
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
WHERE at.mnemonics = 'ПДС СВ'
AND io.payment_return = false
AND CAST(EXTRACT(YEAR FROM io.date) AS int) IN (
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 1,
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 2,
CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS int) - 3
)
AND io.contract_id IS NOT NULL
GROUP BY
io.contract_id,
io.individual_id,
CAST(EXTRACT(YEAR FROM io.date) AS int)
),
npo_result AS (
SELECT
nc.id AS registry_id,
ind.id AS client_id,
ind.insurance_number AS snils,
c.id AS contract_id,
'NPO'::varchar 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)
),
pds_result AS (
SELECT
nc.id AS registry_id,
ind.id AS client_id,
ind.insurance_number AS snils,
c.id AS contract_id,
'PDS'::varchar 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)
)
SELECT * FROM npo_result
UNION ALL
SELECT * FROM pds_result;