SELECT
contract_type,
COUNT(*) AS cnt_contracts,
COUNT(DISTINCT client_id) AS cnt_clients,
SUM(contributions_amount) AS total_amount,
MIN(contributions_amount) AS min_amount,
MAX(contributions_amount) AS max_amount
FROM (
WITH
npo_contributions AS (
SELECT
io.contract_id,
io.individual_id,
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) = 2024
AND io.contract_id IS NOT NULL
GROUP BY io.contract_id, io.individual_id
),
pds_contributions AS (
SELECT
io.contract_id,
io.individual_id,
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) = 2024
AND io.contract_id IS NOT NULL
GROUP BY io.contract_id, io.individual_id
),
dead_individuals AS (
SELECT DISTINCT individual_id
FROM ourpension.application_death_info
WHERE accepted IS NOT NULL
AND individual_id IS NOT NULL
)
SELECT
c.id AS contract_id,
'NPO' AS contract_type,
ind.id AS client_id,
ind.insurance_number AS snils,
npo.contributions_amount
FROM npo_contributions npo
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
c.id AS contract_id,
'PDS' AS contract_type,
ind.id AS client_id,
ind.insurance_number AS snils,
pds.contributions_amount
FROM pds_contributions pds
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)
) q
GROUP BY contract_type