Загрузка данных
CREATE OR REPLACE FUNCTION ourpension.get_contract_fields_main(v_contract_id integer)
RETURNS TABLE(id integer, number json, date text, investor character varying, fund_name character varying, fund_name_short character varying, service_type_rus text, invest_type_text text, contract_life_cicle character varying, sale_channel_id integer, sale_channel_text character varying, comment text, action_date text, agent_code character varying, agent_name text, previous_insurer_name character varying, new_insurer_name character varying, annulled_date text, create_date text, fund_branch_name character varying, contract_class_name character varying, name_in_pfr character varying, contract_type text, affiliate_program_contract_id integer, affiliate_program_contract_text text, family_member boolean, department_type character varying)
LANGUAGE plpgsql
AS $function$
BEGIN
-- Функция выводит поля Общей информации по договору. Выделено для облегчения запроса в модели Карточки договора.
-- Создано: 01.2026 dv.pakhomov
-- Изменения:
-- 24.03.2026 dv.pakhomov Убрал задвоение записей из-за неправильного подключения ourpension.contract_class_history
-- 24.04.2026 dv.pakhomov Получение названий фондов из справочника ourpension.fund
RETURN query
WITH s AS(
SELECT
c.id,
CASE
WHEN c.service_type = 'NPO' AND c.individual_id IS NOT NULL THEN 'ИПП'
WHEN c.service_type = 'NPO' AND c.entity_id IS NOT NULL THEN 'КПП'
WHEN c.service_type = 'PDS' THEN 'ДДС'
ELSE ''
END as contract_type,
to_json(c.number) as number,
c.date,
coalesce(e.short_name, i.last_name || ' ' || i.first_name || ' ' || i.middle_name) as investor,
coalesce(uat.activity_rus_type, 'ОПС') as service_type_rus,
case c.invest_type
when 1 then 'Инвестиционный'
when 2 then 'Страховой'
end as invest_type_text,
c.sale_channel_id,
c.comment,
ha.short_name as department_type,
ag.code as agent_code,
coalesce(ag.last_name,'') || ' ' || left(coalesce(ag.first_name, ''), 1) || '.' || coalesce(left(ag.middle_name, 1) || '.', '') as agent_name,
pi.previous_insurer_pfr_name previous_insurer_name,
ni.new_insurer_pfr_name new_insurer_name,
cch.begin_date as create_date,
fb.name as fund_branch_name,
cch.class_name,
c.affiliate_program_contract_id,
to_json( CONCAT( ce.number, ' (', ea.short_name, ')' ) )::text as affiliate_program_contract_text,
fsg.name_full as fund_name,
fsg.name_short as fund_name_short,
fsr.name_in_pfr as name_in_pfr,
c.family_member
FROM ourpension.contract c
LEFT JOIN ourpension.individual i ON c.individual_id = i.id
LEFT JOIN ourpension.fund fsg ON fsg.id = c.sign_fund_id -- Заключивший фонд
LEFT JOIN ourpension.fund fsr ON fsr.id = c.fund_id -- Фонд-источник
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.uv_activity_type uat ON c.client_type = uat.client_type AND c.service_type = uat.activity_eng_type
LEFT JOIN ourpension.ops_get_contract_new_insurer(c.id) ni ON c.service_type = 'OPS'
LEFT JOIN ourpension.ops_get_contract_previous_insurer(c.id) pi ON c.service_type = 'OPS'
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 LATERAL
(
SELECT
cch1.begin_date,
cc1."name" AS class_name
FROM ourpension.contract_class_history cch1
INNER JOIN ourpension.contract_classes cc1 ON cch1.class_id = cc1.id
WHERE cch1.contract_id = c.id
ORDER BY cch1.begin_date DESC
LIMIT 1
) cch ON true
LEFT JOIN ourpension.entity e ON e.id = c.entity_id
WHERE c.id = v_contract_id
),
cte_statuses_l AS
( -- Последний (актуальный) статус
SELECT
cs1."name" AS status_name,
CASE WHEN sh1.code IN ( 'EA0', 'JA0', 'PA0' ) THEN sh1.status_date END as annulled_date
FROM ourpension.contract_statuses_history sh1
INNER JOIN ourpension.contract_statuses cs1 on cs1.code = sh1.code
WHERE sh1.contract_id = v_contract_id
AND CURRENT_TIMESTAMP BETWEEN
sh1.status_date AND COALESCE( sh1.status_end_date, 'infinity' )
LIMIT 1
),
cte_statuses_a AS
( -- Статус введения в действие
SELECT sh.status_date
FROM ourpension.contract_statuses_history sh
WHERE sh.contract_id = v_contract_id
AND sh.code IN ( 'CA0', 'HA0', 'MA0' )
ORDER BY sh.status_date
LIMIT 1
)
SELECT
s.id,
s.number,
to_char(s.date, 'dd.MM.yyyy') as "date",
s.investor,
s.fund_name,
s.fund_name_short,
s.service_type_rus,
s.invest_type_text,
csl.status_name as contract_life_cicle,
s.sale_channel_id,
sc.name as sale_channel_text,
s.comment,
to_char(csa.status_date, 'dd.MM.yyyy') as action_date,
s.agent_code,
s.agent_name,
s.previous_insurer_name,
s.new_insurer_name,
to_char(csl.annulled_date, 'dd.MM.yyyy') as annulled_date,
to_char(s.create_date, 'dd.MM.yyyy') as create_date,
s.fund_branch_name,
s.class_name as contract_class_name,
s.name_in_pfr,
s.contract_type,
s.affiliate_program_contract_id,
s.affiliate_program_contract_text,
s.family_member,
s.department_type
FROM s
INNER JOIN cte_statuses_l csl ON true
LEFT JOIN ourpension.information_source sc on sc.id = s.sale_channel_id
LEFT JOIN cte_statuses_a csa ON true;
END;
$function$