Загрузка данных
1)
with b (id, balance) as (
select
a.owner_contract_id,
sum(b.total_credit - b.total_debit)
from back_office.account a
join back_office.account_type at on a.account_type_id = at.id
and at.mnemonics in ('СПС', 'СПС ИД')
join back_office.balance b on a.id = b.account_id
and current_date between b.start_date and b.end_date
where a.owner_contract_id = :id
group by a.owner_contract_id
),
termination as (
select
tr.name as termination_reason,
t.date as termination_date,
row_number() over (partition by tc.contract_id order by t.date, t.version desc) as num
from ourpension.termination_contract tc
join ourpension.termination t
left join ourpension.contract_termination_reason tr
on tr.id = t.contract_termination_reason_id
on tc.termination_id = t.id
where tc.contract_id = :id
),
s as(
select
his.strategy_name,
c."service_type",
c.close_date,
c.effective_date,
c.client_type,
c.account_management_form,
case c.account_management_form
when 'PERSONAL' then 'Именная'
when 'JOINT' then 'Солидарная'
end as account_management_form_text,
coalesce(b.balance, 0) as curr_state,
case
when c.client_type = 0 and c.service_type = 'NPO' then 'НПО индивидуальный'
when c.service_type = 'NPO' then 'НПО корпоративный'
else 'ОПС'
end as client_type_text,
r.name as close_reason,
c.invest_type,
c.death_table_query_datasource_file_id,
c.pension_rule_id,
c.periodicity_payment_id,
c.periodicity_payout_id,
replace(dt.name,'.'||dt.extension, '') as death_table_name,
payment.name as periodicity_payment, payout.name as periodicity_payout,
'Пенсионные правила редакции № '||pr.edition_number||' от '
||to_char(pr.date_reg, 'dd.MM.yyyy') as pension_rule,
pr.edition_number,
c.min_year_income,
c.min_tariff_rate,
c.k1,
c.inheritance_type_code, it.name as inheritance_type_text,
c.change_inheritance_type_by_sharer,
case c.change_inheritance_type_by_sharer
when true then 'Разрешено'
when false then 'Запрещено'
end as change_inheritance_type_by_sharer_text,
c.postaccrual_income_action,
c.pension_deposit_value,
trim(to_char(c.pension_deposit_value, '99 999 999 999 999 990D99')) as pension_deposit_value_formatted,
c.entity_id,
c.individual_id as contract_individual_id,
sh.individual_id as sharer_individual_id,
cp.min_annual_income_period,
cp.min_annual_savings_income,
t.termination_date,
t.termination_reason,
e.enum_value as nonstandard_reason,
c.nonstandard_reason_id,
urd.id as uorls_document_id,
urd.file_name as uorls_document_file,
lf.id AS contract_template_id,
lf.code AS contract_template_code
from ourpension.contract c
left join b on b.id = c.id
left join ourpension.contract_params cp on cp.contract_id = c.id
LEFT JOIN ourpension.landscape_form lf ON lf.id = cp.form_id
left join ourpension.contract_close_reason r on c.contract_close_reason_id = r.id
left join dev.query_datasource_file dt on dt.id=c.death_table_query_datasource_file_id
left join ourpension.periodicity payment on payment.id = c.periodicity_payment_id
left join ourpension.periodicity payout on payout.id = c.periodicity_payout_id
left join ourpension.pension_rule pr on pr.id = c.pension_rule_id
left join ourpension.inheritance_type it on c.inheritance_type_code = it.code
left join ourpension.sharer sh on sh.contract_id = c.id and c.client_type = 0
left join termination t on t.num =1
left join ourpension.enums e on c.nonstandard_reason_id = e.id
left join ourpension.enums_name en on e.enums_name_id = en.id and en.enum_name = 'ПричиныНестандарта'
left join lateral (
select
h.begin_date,
s."name" as strategy_name
from ourpension.invest_strategy_history h
inner join prod_line.hb_invest_strategy s on h.strategy_id = s.id
where h.contract_id = c.id
order by h.begin_date desc
limit 1
) his on true
left join lateral (
select urd.id
,urd.file_name
from back_office.changed_snils cs
left join report.uorls_register_document urd on
cs.uorls_register_document_id = urd.id
where cs.contract_id = c.id
order by cs.change_date desc
limit 1
) urd on true
LEFT JOIN LATERAL (
SELECT
pl_schemas.index_scheme as scheme_number,
history.pens_scheme_id as scheme_id
FROM ourpension.contract_scheme_history history
INNER JOIN prod_line.pens_scheme pl_schemas
ON pl_schemas.id = history.pens_scheme_id
WHERE history.contract_id = c.id
AND CURRENT_TIMESTAMP BETWEEN history.begin_date AND COALESCE( history.end_date, 'infinity' )
LIMIT 1
) ls
ON true
where c.id = :id
)
SELECT
s.account_management_form,
s.account_management_form_text,
s.change_inheritance_type_by_sharer_text,
s.client_type,
s.client_type_text,
s.close_date,
s.close_reason,
s.contract_individual_id,
trim(to_char(s.curr_state, '99 999 999 999 999 990D99')) as curr_state,
s.death_table_name,
s.death_table_query_datasource_file_id,
s.edition_number,
s.effective_date,
s.entity_id,
s.inheritance_type_code,
s.inheritance_type_text,
s.invest_type,
s.k1,
s.min_annual_income_period as mgd_accumulation,
s.min_annual_savings_income as mgd_payments,
s.min_tariff_rate,
trim(to_char(s.min_tariff_rate, '99 999 999 999 999 990D99')) as min_tariff_rate_formatted,
s.min_year_income,
s.nonstandard_reason,
s.nonstandard_reason_id,
s.postaccrual_income_action,
s.pension_deposit_value,
s.pension_deposit_value_formatted,
s.pension_rule,
s.pension_rule_id,
s.periodicity_payment,
s.periodicity_payment_id,
s.periodicity_payout,
s.periodicity_payout_id,
s.contract_template_id,
s.contract_template_code,
case s.postaccrual_income_action
when 'ONE_TIME_PAYMENT' then 'Дополнительная разовая выплата пенсии в размере ИД'
when 'RECALCULATION' then 'Перерасчет размера выплачиваемой негосударственной пенсии'
end as postaccrual_income_action_text,
s."service_type",
s.sharer_individual_id,
s.strategy_name,
s.termination_date,
s.termination_reason,
s.uorls_document_id,
s.uorls_document_file,
s1.*
FROM s
CROSS JOIN ourpension.get_contract_fields_main(:id) s1
LIMIT 1
2)
WITH cte_pens_product AS MATERIALIZED
( -- Продукт - последнее значение
SELECT
products.id,
products."name",
products.pens_scheme_accum_stage_id as scheme_id
FROM ourpension.contract_product_history history
INNER JOIN prod_line.pens_product products
ON products.id = history.pens_product_id
WHERE history.contract_id = :id
AND CURRENT_TIMESTAMP BETWEEN
history.begin_date AND COALESCE( history.end_date, 'infinity' )
LIMIT 1
), cte_param_pl AS MATERIALIZED
( -- Параметры из продуктовой линейки
SELECT
pp2.brief,
pppp.value_int,
pppp.value_decimal,
prod_line.get_value_link_param
( CAST( pp2.id AS integer ),
CAST( pppp.value_ref AS integer )
) as param_value
FROM cte_pens_product cpp
INNER JOIN prod_line.pens_product pens_p
ON pens_p.id = cpp.id
INNER JOIN prod_line.pens_product_param_pl pppp
ON pppp.pens_product_id = pens_p.id
INNER JOIN prod_line.param_pl pp2
ON pp2.id = pppp.param_pl_id
)
SELECT
c.id, -- ИД договора
( SELECT param.param_value
FROM cte_param_pl param
WHERE param.brief = 'ФормаДоговора'
) AS contract_form, -- Форма договора
sct."name" AS sales_channel, -- Канал продаж
sct.brief AS cfo, -- ЦФО
e.short_name AS employer, -- Работодатель
pp."name" AS product_name, -- Наименование продукта
pp.id AS product_id, -- ИД продукта
(
SELECT hp.name
FROM prod_line.pens_product_param_pl p_i
JOIN prod_line.param_pl def_i
ON def_i.id = p_i.param_pl_id
JOIN prod_line.table_param_pl_invest_profile ip
ON ip.pens_product_param_pl_id = p_i.id
JOIN prod_line.hb_invest_profile hp
ON hp.id = ip.hb_invest_profile_id
WHERE p_i.pens_product_id = pp.id
AND def_i.brief = 'ИнвестПрофиль'
AND (
ip.validity_period_from IS NULL
OR CURRENT_DATE >= ip.validity_period_from
)
AND (
ip.validity_period_to IS NULL
OR CURRENT_DATE <= ip.validity_period_to
)
ORDER BY ip.validity_period_from DESC NULLS LAST
LIMIT 1
) AS invest_profile_name,
(
SELECT hp.id
FROM prod_line.pens_product_param_pl p_i
JOIN prod_line.param_pl def_i
ON def_i.id = p_i.param_pl_id
JOIN prod_line.table_param_pl_invest_profile ip
ON ip.pens_product_param_pl_id = p_i.id
JOIN prod_line.hb_invest_profile hp
ON hp.id = ip.hb_invest_profile_id
WHERE p_i.pens_product_id = pp.id
AND def_i.brief = 'ИнвестПрофиль'
AND (
ip.validity_period_from IS NULL
OR CURRENT_DATE >= ip.validity_period_from
)
AND (
ip.validity_period_to IS NULL
OR CURRENT_DATE <= ip.validity_period_to
)
ORDER BY ip.validity_period_from DESC NULLS LAST
LIMIT 1
) AS invest_profile_id,
tv.amount_type, -- Тип суммы
tv.month_since_open AS transfer_term_in_months, -- Срок перевода в месяцах с момента открытия ПС
pr.edition_number AS pension_rules_edition, -- Редакция пенсионных правил
pr.id as pension_rule_id,
/*(
SELECT param.param_value
FROM cte_param_pl param
WHERE param.brief = 'ПериодГарантВосполнения'
) AS guarantee_replenishment_period,*/
(
SELECT w.warranty_period
FROM prod_line.pens_product_param_pl p_w
JOIN prod_line.param_pl def_w
ON def_w.id = p_w.param_pl_id
JOIN prod_line.table_param_pl_warrant_period w
ON w.pens_product_param_pl_id = p_w.id
JOIN prod_line.table_param_pl_invest_profile ip
ON ip.hb_invest_profile_id = w.hb_invest_profileid
JOIN prod_line.pens_product_param_pl p_i
ON p_i.id = ip.pens_product_param_pl_id
AND p_i.pens_product_id = p_w.pens_product_id
JOIN prod_line.param_pl def_i
ON def_i.id = p_i.param_pl_id
WHERE p_w.pens_product_id = pp.id
AND def_w.brief = 'ПериодГарантВосполнения'
AND def_i.brief = 'ИнвестПрофиль'
AND (
w.year_conclusion_from IS NULL
OR CAST(EXTRACT(YEAR FROM c.date) AS integer) >= w.year_conclusion_from
)
AND (
w.year_conclusion_to IS NULL
OR CAST(EXTRACT(YEAR FROM c.date) AS integer) <= w.year_conclusion_to
)
AND (
w.validity_period_from IS NULL
OR CURRENT_DATE >= w.validity_period_from
)
AND (
w.validity_period_to IS NULL
OR CURRENT_DATE <= w.validity_period_to
)
AND (
ip.validity_period_from IS NULL
OR CURRENT_DATE >= ip.validity_period_from
)
AND (
ip.validity_period_to IS NULL
OR CURRENT_DATE <= ip.validity_period_to
)
ORDER BY w.validity_period_from DESC NULLS LAST
LIMIT 1
) AS guarantee_replenishment_period,
to_json( COALESCE( tl.tariff_name, '' ) ) AS tariff, -- Тариф (оборачиваем в to_json, чтобы отсечь мусор в строке из-за миграции)
cp.tariff_id, -- ID тарифа
cp.min_annual_income_period AS mgd_accumulation_period, -- МГД в периоде накопления
cp.min_annual_savings_income AS mgd_payment_period, -- МГД в периоды выплат
COALESCE(
cp.first_payment_delay,
(
SELECT param.value_int
FROM cte_param_pl param
WHERE param.brief = 'СрокОжиданияПервогоВзносаКоличДней'
)
) AS first_contribution_wait_period, -- Срок ожидания первого взноса
--cp.current_payment AS current_contribution,
COALESCE(
cp.current_payment,
(
SELECT param.value_decimal
FROM cte_param_pl param
WHERE param.brief = 'МинРазмерРегулВзносаС'
LIMIT 1
)
) AS current_contribution, -- Текущий взнос
/*( SELECT mpf."name"
FROM prod_line.hb_param_pl_multiselect mpf
WHERE mpf.id = cp.payment_frequency
) AS contribution_frequency, */
(
SELECT mpf."name"
FROM prod_line.pens_product_param_pl ppp_freq
JOIN prod_line.param_pl p_freq
ON p_freq.id = ppp_freq.param_pl_id
JOIN prod_line.pens_product_param_pl_hb_param_pl_multiselect ppm_freq
ON ppm_freq.pens_product_param_pl_id = ppp_freq.id
JOIN prod_line.hb_param_pl_multiselect mpf
ON mpf.id = ppm_freq.hb_param_pl_multiselect_id
WHERE ppp_freq.pens_product_id = pp.id
AND p_freq.brief = 'ПериодичностьВзносов'
AND mpf."name" <> 'Не установлено'
LIMIT 1
) AS contribution_frequency, -- Периодичность взносов
cp.contribution_ss AS ss_deduction_rate, -- Размер отчислений в СС
cp.contribution_sr AS sr_deduction_rate, -- Размер отчислений в СР
( SELECT vst."label"
FROM ourpension.voc_sharer_types vst
WHERE vst."code" = cp.contribution_account
) AS contribution_account, -- Счет учета взносов
(
SELECT vst.label
FROM ourpension.voc_sharer_types vst
WHERE vst.code = cp.payment_source_code
AND vst.is_payment_source = true
) AS payment_source,
/* ( SELECT param.param_value
FROM cte_param_pl param
WHERE param.brief = 'ТипВыплаты'
) AS payment_type, */
(
SELECT ms.name
FROM prod_line.pens_product_param_pl p_term
JOIN prod_line.param_pl def_term
ON def_term.id = p_term.param_pl_id
JOIN prod_line.table_param_pl_payment_term pt
ON pt.pens_product_param_pl_id = p_term.id
LEFT JOIN prod_line.hb_param_pl_multiselect ms
ON ms.id = pt.payment_type_pl_multiselect_id
WHERE p_term.pens_product_id = pp.id
AND def_term.brief = 'СрокВыплаты'
AND pt.payment_type_pl_multiselect_id IS NOT NULL
AND (
pt.app_date_from IS NULL
OR c.date >= pt.app_date_from
)
AND (
pt.app_date_to IS NULL
OR c.date <= pt.app_date_to
)
ORDER BY pt.app_date_from DESC NULLS LAST, pt.id DESC
LIMIT 1
) AS payment_type, -- Тип выплаты
(
SELECT pt.payment_type_pl_multiselect_id
FROM prod_line.pens_product_param_pl p_term
JOIN prod_line.param_pl def_term
ON def_term.id = p_term.param_pl_id
JOIN prod_line.table_param_pl_payment_term pt
ON pt.pens_product_param_pl_id = p_term.id
WHERE p_term.pens_product_id = pp.id
AND def_term.brief = 'СрокВыплаты'
AND pt.payment_type_pl_multiselect_id IS NOT NULL
AND (
pt.app_date_from IS NULL
OR c.date >= pt.app_date_from
)
AND (
pt.app_date_to IS NULL
OR c.date <= pt.app_date_to
)
ORDER BY pt.app_date_from DESC NULLS LAST, pt.id DESC
LIMIT 1
) AS payment_type_id,
(
SELECT pt.max_term_to
FROM prod_line.pens_product_param_pl p_term
JOIN prod_line.param_pl def_term
ON def_term.id = p_term.param_pl_id
JOIN prod_line.table_param_pl_payment_term pt
ON pt.pens_product_param_pl_id = p_term.id
WHERE p_term.pens_product_id = pp.id
AND def_term.brief = 'СрокВыплаты'
AND pt.max_term_to IS NOT NULL
AND (
pt.app_date_from IS NULL
OR c.date >= pt.app_date_from
)
AND (
pt.app_date_to IS NULL
OR c.date <= pt.app_date_to
)
ORDER BY pt.app_date_from DESC NULLS LAST, pt.id DESC
LIMIT 1
) AS max_payment_term, --Максимальный срок
--cp.minimal_payment_amount AS min_payment_amount,
COALESCE(
cp.minimal_payment_amount,
(
SELECT mp.min_pension_from
FROM prod_line.pens_product_param_pl p_min
JOIN prod_line.param_pl def_min
ON def_min.id = p_min.param_pl_id
JOIN prod_line.table_param_pl_minimum_pension mp
ON mp.pens_product_param_pl_id = p_min.id
WHERE p_min.pens_product_id = pp.id
AND def_min.brief = 'МинРазмерПенсии'
AND mp.min_pension_from IS NOT NULL
ORDER BY mp.id DESC
LIMIT 1
)
) AS min_payment_amount, -- Минимальный размер выплаты
--cp.payment_term,
COALESCE(
cp.payment_term,
(
SELECT pt.max_term_to
FROM prod_line.pens_product_param_pl p_term
JOIN prod_line.param_pl def_term
ON def_term.id = p_term.param_pl_id
JOIN prod_line.table_param_pl_payment_term pt
ON pt.pens_product_param_pl_id = p_term.id
WHERE p_term.pens_product_id = pp.id
AND def_term.brief = 'СрокВыплаты'
AND pt.max_term_to IS NOT NULL
AND (
pt.app_date_from IS NULL
OR c.date >= pt.app_date_from
)
AND (
pt.app_date_to IS NULL
OR c.date <= pt.app_date_to
)
ORDER BY pt.app_date_from DESC NULLS LAST, pt.id DESC
LIMIT 1
)
) AS payment_term, -- Срок выплаты
cp.min_payment_term, -- Минимальный срок выплаты
( SELECT param.param_value
FROM cte_param_pl param
WHERE param.brief = 'ПоэтапныйВестингПарамРасчетаСрока'
) AS term_calculation_parametr, -- Параметр расчета срока
( SELECT param.param_value
FROM cte_param_pl param
WHERE param.brief = 'ПериодПредостПравТреб'
) AS choice_right_provision_parameter, -- Период предоставления права требования
cp.initial_payment, -- Первоначальный взнос
cp.min_actuarial_yield,
cp.indexing_value, -- Величина прироста размера пенсии
pp.scheme_id, -- Пенсионная схема (ИД)
ps.brief as scheme_number -- Пенсионная схема (название)
FROM ourpension.contract c
--LEFT JOIN ourpension.pension_rule pr ON pr.id = c.pension_rule_id
LEFT JOIN ourpension.contract_params cp ON cp.contract_id = c.id
LEFT JOIN ourpension.contract affiliate_c
ON affiliate_c.id = c.affiliate_program_contract_id
LEFT JOIN ourpension.entity e ON e.id = affiliate_c.entity_id
-- LEFT JOIN ourpension.entity e ON e.id = c.entity_id
LEFT JOIN ourpension.fund f ON f.id = c.fund_id
LEFT JOIN actuary.tariff_list tl ON tl.id = cp.tariff_id
LEFT JOIN ourpension.sale_channel sc ON sc.id = c.sale_channel_id
LEFT JOIN prod_line.sale_channel_type sct ON sct.id = sc.type_sale_channel_id
left JOIN cte_pens_product pp on true -- кросс на лефт для ОПС, чтобы возвращала ид, без него не отображается отказ СФР (модель uOKQnzZO)
LEFT JOIN prod_line.pens_scheme ps
ON ps.id = pp.scheme_id
--LEFT JOIN ourpension.pension_rule pr ON pr.id = ps.pension_rule_id
LEFT JOIN LATERAL (
SELECT
h.pension_rule_id
FROM ourpension.npo_contract_pension_rules_history h
WHERE h.contract_id = c.id
AND h.period <= c.date
ORDER BY
h.period DESC,
h.version DESC
LIMIT 1
) prh ON true
LEFT JOIN ourpension.pension_rule pr
ON pr.id = COALESCE(prh.pension_rule_id, c.pension_rule_id)
LEFT JOIN prod_line.table_vesting tv ON tv.product_id = pp.id
WHERE c.id = :id