Загрузка данных
with
contract_status_current AS
( -- Последний (актуальный) статус
SELECT
cs."name" AS name,
sh.code as code,
sh.status_date as date
FROM ourpension.contract_statuses_history sh
INNER JOIN ourpension.contract_statuses cs on cs.code = sh.code
WHERE sh.contract_id = :id
AND CURRENT_TIMESTAMP BETWEEN sh.status_date AND sh.status_end_date
LIMIT 1
),
contract_status_effective AS
( -- Статус введения в действие
SELECT sh.status_date as date
FROM ourpension.contract_statuses_history sh
WHERE sh.contract_id = :id
AND sh.code IN ( 'CA0', 'HA0', 'MA0' )
ORDER BY sh.status_date
LIMIT 1
),
termination as
( -- Прекращение
select
tr.name as reason,
t.date as date
from ourpension.termination_contract tc
join ourpension.termination t on tc.termination_id = t.id
left join ourpension.contract_termination_reason tr on tr.id = t.contract_termination_reason_id
where tc.contract_id = :id
order by t.date desc, t.version desc
limit 1
),
contract_invest as
( -- Инвестиционная стратегия
select
h.begin_date,
s.name as name
from ourpension.invest_strategy_history h
join prod_line.hb_invest_strategy s on h.strategy_id = s.id
where h.contract_id = :id
order by h.begin_date desc
limit 1
),
-- Классификация договора
contract_class as (
SELECT
cch.begin_date,
cc."name" AS class_name
FROM ourpension.contract_class_history cch
JOIN ourpension.contract_classes cc ON cch.class_id = cc.id
WHERE cch.contract_id = :id
ORDER BY cch.begin_date DESC
LIMIT 1
),
-- Продукт - последнее значение
cte_pens_product as (
SELECT
products.id,
products."name"
FROM ourpension.contract_product_history history
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
(
SELECT
pp2.brief,
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
JOIN prod_line.pens_product pens_p ON pens_p.id = cpp.id
JOIN prod_line.pens_product_param_pl pppp ON pppp.pens_product_id = pens_p.id
JOIN prod_line.param_pl pp2 ON pp2.id = pppp.param_pl_id
)
select
c.id as contract_id,
CASE
WHEN c.service_type = 'NPO' AND c.client_type = 0 THEN 'ИПП' -- 0 - Индивидуальный
WHEN c.service_type = 'NPO' AND c.client_type = 1 THEN 'КПП' -- 1 - Корпоративный
WHEN c.service_type = 'PDS' THEN 'ДДС'
ELSE 'Не определен' -- Для ОПС будет - Не определен
END as contract_type, -- Тип договора
uat.activity_rus_type as service_type_rus, -- Вид деятельности
coalesce(e.short_name, concat_ws(' ', i.last_name, i.first_name, i.middle_name)) as investor, -- Вкладчик
status_cur.name as status_name,
CASE WHEN status_cur.code IN ( 'EA0', 'JA0', 'PA0' ) THEN status_cur.date END as annulled_date,
to_json(c.number) as contract_number,
c.date as contract_date, -- Дата заключения
ccls.begin_date as formed_date, -- Дата оформления = Дате классификации (? ve.kaydalov)
ccls.class_name as contract_class_name, -- Классификация договора
status_eff.date as effective_date, -- Дата статуса "Действия" - Вступление в силу
t.date as termination_date, -- Дата прекращения
t.reason as termination_reason, -- Причина прекращения
cinv.name as invest_strategy_name, -- Инвестиционная стратегия
coalesce(fu_sig.name_short, fu_sig.name_in_pfr) as fund_signed_name, -- Заключивший фонд
coalesce(fu_src.name_short, fu_src.name_in_pfr) as fund_source_name, -- Фонд источник
sct.brief AS cfo, -- ЦФО
sct."name" AS sales_channel, -- Канал продаж
e.short_name as employer, -- Работодатель
to_json( CONCAT_WS(' ', ce.number, ' (' || ea.short_name || ')' ) ) as affiliate_program_contract_text, -- Договор КПП
ha.short_name as department_name, -- Холдинг
ag.code as agent_code, -- Код агента
fb.name as fund_branch_name, -- Филиал заключения (подразделение агента)
CONCAT_WS(
' ',
ag.last_name,
CASE
WHEN ag.first_name IS NOT NULL THEN LEFT(ag.first_name, 1) || '.'
ELSE ''
END,
CASE
WHEN ag.middle_name IS NOT NULL THEN LEFT(ag.middle_name, 1) || '.'
ELSE ''
END
) AS agent_name,
case WHEN c.individual_id <> sh.individual_id then true
else false end as is_third, -- В пользу 3 лица
c.family_member as is_family_member, -- Член семьи / близкий родственник
cp.tariff_id as tariff_id, -- ИД тарифа
--=======УСЛОВИЯ ПО ДОГОВОРУ
enums_nsc.enum_value as is_nonstandard_reason_text, --Нестандартный договор Причина
cp.min_actuarial_yield as actuarial_revenue ,-- Актуарная доходность
cp.min_annual_income_period AS mgd_accumulation_period, -- МГД в периоде накопления
cp.min_annual_savings_income AS mgd_payment_period, -- МГД в периоды выплат
to_json( COALESCE( tl.tariff_name, '' ) ) AS tariff, -- Тариф (оборачиваем в to_json, чтобы отсечь мусор в строке из-за миграции)
pp."name" AS product_name, -- Наименование продукта (Продукт)
pp.id AS product_id, -- ИД продукта (Продукт)
replace(dt.name,'.'||dt.extension, '') as death_table_name , -- Таблица Дожития (файл ??)
case c.account_management_form
when 'PERSONAL' then 'Именная'
when 'JOINT' then 'Солидарная'
end as account_management_form_text, -- Форма ведения счетов (Хард Коде потому что это тип такой) TODO -таблицу с наименованиями
c.inheritance_type_code as inheritance_type_code, -- Параметр наследования код
it.name as inheritance_type_text, -- Параметр наследования текст
c.change_inheritance_type_by_sharer as is_change_inheritance_type_by_sharer, -- Разрешено ли Изменение параметров наследования по участнику
--======УСЛОВИЯ ВЗНОСОВ
( SELECT mpf."name"
FROM prod_line.hb_param_pl_multiselect mpf
WHERE mpf.id = cp.payment_frequency
) AS contribution_frequency, -- Периодичность взносов
cp.initial_payment as initial_payment, -- Первоначальный взнос
( SELECT param.param_value
FROM cte_param_pl param
WHERE param.brief = 'СрокОжиданияПервогоВзносаКоличДней'
) AS first_contribution_wait_period , -- Срок ожидания первого взноса
cp.current_payment AS current_contribution, -- Текущий взнос
cp.contribution_ss AS amount_deductions_ss, -- Размер отчислений в СС
cp.contribution_sr AS amount_deductions_sr, -- Размер отчислений в СР
( SELECT vst."label"
FROM ourpension.voc_sharer_types vst
WHERE vst."code" = cp.contribution_account
) AS contribution_account, -- Счет учета взносов
--======УСЛОВИЯ ВЫПЛАТ
cp.indexing_value as indexing_value, -- Величина прироста размера пенсии
( SELECT param.param_value
FROM cte_param_pl param
WHERE param.brief = 'ТипВыплаты'
) AS payment_type, -- Тип выплаты
cp.minimal_payment_amount AS min_payment_amount, -- Минимальный размер выплаты
cp.payment_term as payment_period, -- Срок выплаты
cp.min_payment_term as min_payment_period, -- Минимальный срок выплаты
--======УСЛОВИЯ ВЕСТИНГА
case (SELECT 1
FROM ourpension.sharer_params
WHERE kpp_contract_id = :id
AND is_active_vesting = true
GROUP BY kpp_contract_id) when 1 then true
else false end as vesting_state , -- Состояние вестинга
enums.enum_value AS vesting_way, -- Способ вестинга
case WHEN cp.is_transfer_next_receipts THEN true
ELSE false
END AS is_transfer_next_receipts, -- Передача последующих поступлений ( может и не быть поэтому CASE
cp.date_start_vesting AS date_start_vesting, -- Дата начала вестинга
pl_multi_2."name" AS rigth_to_pension, -- Право на пенсию
pl_multi_3."name" AS account_vesting_type, -- Тип счета вестинга
pl_multi_4."name" AS period_calc_param, -- Параметры расчета срока
pl_multi_1."name" AS period_right_claim -- Период предоставления права требования
from ourpension.contract c
LEFT JOIN ourpension.uv_activity_type uat on uat.client_type = c.client_type AND uat.activity_eng_type = c.service_type
--Нестандартный договор
left join ourpension.enums enums_nsc on enums_nsc.id = c.nonstandard_reason_id
-- Счет для индивидуального договора (для в пользу 3 лица)
left join ourpension.sharer sh on sh.contract_id = c.id and c.client_type = 0
-- Вкладчик
LEFT JOIN ourpension.individual i ON c.individual_id = i.id
LEFT JOIN ourpension.entity e ON e.id = c.entity_id
-- Прекращение
LEFT JOIN termination t on true
-- Продукт - последнее значение
left JOIN cte_pens_product pp on true
-- Текущий статус
LEFT JOIN contract_status_current status_cur on true
-- Данные статуса "Действующий"
LEFT JOIN contract_status_effective status_eff on true
-- Классификация договора
left join contract_class ccls on true
--Инвестиционная стратегия
left join contract_invest cinv on true
-- Заключивший фонд
LEFT JOIN ourpension.fund fu_sig ON fu_sig.id = c.sign_fund_id
-- Фонд источник
LEFT JOIN ourpension.fund fu_src ON fu_src.id = c.fund_id
-- Подразделение заключения(филиал) (? ve.kaydalov агент не может поменять подразделение?)
LEFT JOIN ourpension.agent ag ON ag.id = c.agent_id
LEFT JOIN ourpension.fund_branch fb ON fb.id = ag.fund_branch_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 ourpension.information_source isc on isc.id = c.sale_channel_id
-- Договор КПП вкладчика
LEFT JOIN ourpension.contract ce ON ce.id = c.affiliate_program_contract_id
LEFT JOIN ourpension.entity ea ON ea.id = ce.entity_id
LEFT JOIN ourpension.holding ha ON ha.id = ea.holding_id
-- Доп параметры договора
LEFT JOIN ourpension.contract_params cp ON cp.contract_id = c.id
LEFT JOIN actuary.tariff_list tl ON tl.id = cp.tariff_id
LEFT JOIN prod_line.hb_param_pl_multiselect pl_multi_2 ON pl_multi_2.id = cp.rigth_to_pension_id -- Право на пенсию
LEFT JOIN prod_line.hb_param_pl_multiselect pl_multi_3 ON pl_multi_3.id = cp.account_vesting_type_id -- Тип счета вестинга
LEFT JOIN prod_line.hb_param_pl_multiselect pl_multi_4 ON pl_multi_4.id = cp.time_calc_param_id -- Параметры расчета срока
LEFT JOIN prod_line.hb_param_pl_multiselect pl_multi_1 ON pl_multi_1.id = cp.period_right_requirement_id -- Период предоставления права требования
-- Таблица Дожития хз что это
LEFT JOIN dev.query_datasource_file dt on dt.id=c.death_table_query_datasource_file_id
-- Параметры наследования
left join ourpension.inheritance_type it on c.inheritance_type_code = it.code
-- Способ вестинга
LEFT JOIN ourpension.enums enums ON enums.id = cp.vesting_type
where c.id = :id