info_recruits
Y
Normal
N
1000
100
-
2024/08/15 14:02:51.713
-
2024/08/15 14:02:51.713
251
232
201
90
58
14
N
90
58
14
N
Segoe UI
9
394
960
16
acquired_citizenship
address_actual
address_place_stay
city_birth
date_info_actual
date_loss_info_actual
died_date
dispensary_registration_code
email
end_date_place_stay
end_date_residence
inn
is_in_prison
medic
medical_requirements
region_birth
residence
right_deferment
snils
source_info_actual
start_date_place_stay
start_date_residence
took_break
type_place_stay
163
Select values 4
Table output
N
Table input(info_recruits)
Select values 4
Y
Select values 4
Insert / update
Y
Insert / update
InsertUpdate
Y
1
none
10000
ervu-dashboard
=
recruit_id
recruit_id
ervu_dashboard
recruit_id
recruit_id
N
age
age
Y
birth_date
birth_date
Y
birth_place
birth_place
Y
contract_service
contract_service
Y
deferment_liberation
deferment_liberation
Y
disability_group
disability_group
Y
driver_license
driver_license
Y
education
education
Y
employment
employment
Y
first_name
first_name
Y
full_name
full_name
Y
gender
gender
Y
is_registered
is_registered
Y
is_wanted
is_wanted
Y
issue_date
issue_date
Y
last_name
last_name
Y
marital_status
marital_status
Y
middle_name
middle_name
Y
mobilization
mobilization
Y
number_children
number_children
Y
number_children_18_old
number_children_18_old
Y
passport_number
passport_number
Y
passport_series
passport_series
Y
phone
phone
Y
reason_registration
reason_registration
Y
recruitment_id
recruitment_id
Y
sports_category
sports_category
Y
tractor_license
tractor_license
Y
update_date
update_date
Y
urgent_service
urgent_service
Y
N
688
208
Select values 4
SelectValues
Y
1
none
N
issue_date
issue_date
Date
-2
-2
yyyy-MM-dd
false
false
448
208
Table input(info_recruits)
TableInput
Y
1
none
ervu_person_registry
N
0
WITH
base_recruit_data AS (
SELECT
distinct
r.system_pgs_status,
r.full_name,
r.last_name,
r.first_name,
r.middle_name,
r.gender,
ri.info->'svedFL'->'svedBS'->'snils'->'aktSNILS'->>'snils' AS snils,
ri.info->'svedFL'->'svedBS'->'inn'->'aktINN'->>'inn' AS inn,
r.birth_date,
EXTRACT(YEAR FROM AGE(r.birth_date)) AS age,
r.birth_place,
r.phone,
r.email,
ri.recruit_id,
ri.info,
r.vu_current_info,
r.military_registration_date AS date_registration,
r.vu_unset_date AS date_deregistration,
ri.info->'svedFL'->'svedSemPolozh'->>'semPolozhNaim' AS marital_status,
ri.info->'svedFL'->'pasportRF'->'aktPasportRF'->>'nomDok' AS passport_number,
ri.info->'svedFL'->'pasportRF'->'aktPasportRF'->>'serDok' AS passport_series,
ri.info->'svedFL'->'svedVoin'->'voin'->>'dataReg' AS issue_date,
r.system_update_date AS update_date,
CASE
WHEN r.vu_current_info->>'recruitmentCommercialInfo' = 'true' THEN 'CONVICT'
ELSE 'NOTCONVICT'
END AS convicts,
COALESCE(r.current_recruitment_id, r.target_recruitment_id) AS recruitment_id,
CASE
WHEN jsonb_typeof(ri.info->'svedFL'->'svedPND'->'svedUchetDisp'->'svedUchet') = 'array' THEN
EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedFL'->'svedPND'->'svedUchetDisp'->'svedUchet') AS uchet_pnd
WHERE uchet_pnd->>'dataSnyatUchet' <= current_date::text
)
ELSE
false
END AS uchet_pnd,
CASE
WHEN ddd.hidden IS false then ddd.hidden
ELSE true END AS deferment_liberation,-- когда hidden ис фолс отсрочка есть, когда тру или нулл - нет
CASE
WHEN
-- Условия для "true" (спортивная категория)
ri.info->'svedFL'->'svedSport' ? 'sport' -- Проверяем, что ключ 'sport' существует
AND jsonb_typeof(ri.info->'svedFL'->'svedSport'->'sport') = 'array' -- Проверяем, что 'sport' это массив
AND jsonb_array_length(ri.info->'svedFL'->'svedSport'->'sport') > 0 -- И массив не пустой
AND EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedFL'->'svedSport'->'sport') AS sport_elem
WHERE
(
-- Проверяем, что 'sportRazr' существует и срок действия актуален
jsonb_typeof(sport_elem->'sportRazr') = 'object'
AND sport_elem->'sportRazr'->>'dataDeistvSportRazr' IS NOT NULL
AND TO_DATE(sport_elem->'sportRazr'->>'dataDeistvSportRazr', 'YYYY-MM-DD') > CURRENT_DATE
)
OR (
-- Проверяем, что 'sportZvan' существует и не пусто
sport_elem->>'sportZvan' IS NOT NULL
AND sport_elem->>'sportZvan' <> ''
)
OR (
-- Проверяем, что 'sportRazr' существует и срок действия истек
jsonb_typeof(sport_elem->'sportRazr') = 'object'
AND sport_elem->'sportRazr'->>'dataDeistvSportRazr' IS NOT NULL
AND TO_DATE(sport_elem->'sportRazr'->>'dataDeistvSportRazr', 'YYYY-MM-DD') <= CURRENT_DATE
)
)
AND ri.info->'svedFL'->'svedSport'->>'prOtsSvedSport' IS NULL
THEN true
WHEN
-- Условия для "false" (не является спортивной категорией)
(
ri.info->'svedFL'->'svedSport'->'sport' IS NULL -- Если 'sport' = NULL
OR (
ri.info->'svedSport' ? 'sport' -- Проверяем, что ключ 'sport' существует
AND jsonb_typeof(ri.info->'svedFL'->'svedSport'->'sport') = 'array' -- Поле 'sport' должно быть массивом
AND jsonb_array_length(ri.info->'svedFL'->'svedSport'->'sport') > 0 -- И массив не пустой
)
)
AND EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedFL'->'svedSport'->'sport') AS sport_elem
WHERE
(
-- Проверяем 'sportZvan' и если оно не существует или пусто
sport_elem->>'sportZvan' IS NULL OR sport_elem->>'sportZvan' = ''
)
OR (
-- Проверяем 'sportRazr' и срок действия истек
jsonb_typeof(sport_elem->'sportRazr') = 'object'
AND sport_elem->'sportRazr'->>'dataDeistvSportRazr' IS NOT NULL
AND TO_DATE(sport_elem->'sportRazr'->>'dataDeistvSportRazr', 'YYYY-MM-DD') > CURRENT_DATE
-- И 'sportZvan' также не должно существовать или быть пустым
AND (sport_elem->>'sportZvan' IS NULL OR sport_elem->>'sportZvan' = '')
)
)
AND ri.info->'svedFL'->'svedSport'->>'prOtsSvedSport' IS NULL
THEN false
WHEN
-- Условия для "null" (нет информации)
ri.info->'svedSport'->>'prOtsSvedSport' = '1'
OR ri.info->'svedSport' IS NULL -- Проверяем, что 'svedSport' отсутствует
THEN null
ELSE null -- Неопределенное значение для всех других случаев
END AS sports_category,
mrr.value AS reason_registration,
CASE
WHEN ri.info->'svedFL'->'svedInvalid'->'invalid'->>'gruppa' IS NOT NULL
AND ri.info->'svedFL'->'svedInvalid'->>'prOtsSvedInvalid' IS NULL
AND (ri.info->'svedFL'->'sportRazr'->>'dataSnyat' IS NULL
OR TO_DATE(ri.info->'svedFL'->'sportRazr'->>'dataSnyat', 'YYYY-MM-DD') <= CURRENT_DATE)
THEN ri.info->'svedFL'->'svedInvalid'->'invalid'->>'gruppa'
WHEN ri.info->'svedFL'->'svedInvalid'->>'prOtsSvedInvalid' = '1' THEN 'Нет информации об инвалидности'
ELSE 'Нет информации об инвалидности'
END AS disability_group,
CASE
WHEN ri.info->'svedFL'->'svedUdostTraktMash'->>'udostTraktMash' IS NOT NULL
AND TO_DATE(ri.info->'svedFL'->'svedUdostTraktMash'->'udostTraktMash'->'aktUTM'->>'dataOkonchUTM', 'YYYY-MM-DD') > CURRENT_DATE
THEN true
WHEN ri.info->'svedFL'->'svedUdostTraktMash'->>'udostTraktMash' IS NOT NULL
AND TO_DATE(ri.info->'svedFL'->'svedUdostTraktMash'->'udostTraktMash'->'aktUTM'->>'dataOkonchUTM', 'YYYY-MM-DD') <= CURRENT_DATE
THEN false
WHEN ri.info->'svedFL'->'svedUdostTraktMash'->>'prOtsSvedUTM' = '1' THEN null
ELSE null
END AS tractor_license,
CASE
WHEN
jsonb_typeof(ri.info->'svedFL'->'svedUgolovPresl'->'faktyUgolovPresl') = 'array' -- проверяем, что 'faktyUgolovPresl' это массив
AND jsonb_array_length(ri.info->'svedFL'->'svedUgolovPresl'->'faktyUgolovPresl') > 0 -- массив не пустой
AND EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedFL'->'svedUgolovPresl'->'faktyUgolovPresl') AS criminal_prosecution
WHERE
criminal_prosecution->>'dataPrekrashh' IS NULL -- дата прекращения отсутствует
)
AND ri.info->'svedFL'->'svedUgolovPresl'->>'prOtsSvedUgolovPresl' IS NULL
THEN true
WHEN
jsonb_typeof(ri.info->'svedFL'->'svedUgolovPresl'->'faktyUgolovPresl') = 'array' -- проверяем, что 'faktyUgolovPresl' это массив
AND jsonb_array_length(ri.info->'svedFL'->'svedUgolovPresl'->'faktyUgolovPresl') > 0 -- массив не пустой
AND EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedFL'->'svedUgolovPresl'->'faktyUgolovPresl') AS criminal_prosecution
WHERE
criminal_prosecution->>'dataPrekrashh' IS NOT NULL -- дата прекращения не отсутствует
)
AND ri.info->'svedFL'->'svedUgolovPresl'->>'prOtsSvedUgolovPresl' IS NULL
THEN false
WHEN
ri.info->'svedFL'->'svedUgolovPresl'->>'prOtsSvedUgolovPresl' = '1'
THEN NULL
ELSE NULL
END AS criminal_prosecution,
COALESCE(
CASE
WHEN (
jsonb_typeof(info->'svedFL'->'svedVUZ'->'vuz') = 'array'
AND EXISTS (
SELECT 1
FROM jsonb_array_elements(info->'svedFL'->'svedVUZ'->'vuz') AS vuz
WHERE vuz->>'kodStatus' IN ('1', '2', '4')
)
) OR (
jsonb_typeof(info->'svedFL'->'svedKolledzh'->'kolledzh') = 'array'
AND EXISTS (
SELECT 1
FROM jsonb_array_elements(info->'svedFL'->'svedKolledzh'->'kolledzh') AS kolledzh
WHERE kolledzh->>'kodStatus' IN ('1', '2', '4')
)
) THEN 'Обучается'
ELSE NULL
END ||
CASE
WHEN jsonb_typeof(info->'svedFL'->'svedTrud'->'trudDeyat') = 'array'
AND EXISTS (
SELECT 1
FROM jsonb_array_elements(info->'svedFL'->'svedTrud'->'trudDeyat') AS trud
WHERE trud->>'prAktMestRab' = '1'
) THEN
CASE
WHEN (
jsonb_typeof(info->'svedFL'->'svedVUZ'->'vuz') = 'array'
AND EXISTS (
SELECT 1
FROM jsonb_array_elements(info->'svedFL'->'svedVUZ'->'vuz') AS vuz
WHERE vuz->>'kodStatus' IN ('1', '2', '4')
)
) OR (
jsonb_typeof(info->'svedFL'->'svedKolledzh'->'kolledzh') = 'array'
AND EXISTS (
SELECT 1
FROM jsonb_array_elements(info->'svedFL'->'svedKolledzh'->'kolledzh') AS kolledzh
WHERE kolledzh->>'kodStatus' IN ('1', '2', '4')
)
) THEN ', Работает'
ELSE 'Работает'
END
ELSE NULL
END,
CASE
WHEN
info->'svedFL'->'svedVUZ'->>'prOtsSvedVUZ' = '1' -- Отсутствие сведений о вузе
AND info->'svedFL'->'svedKolledzh'->>'prOtsSvedKolledzh' = '1' -- Отсутствие сведений о колледже
AND info->'svedFL'->'svedTrud'->>'prOtsSvedTrud' = '1' -- Отсутствие сведений о работе
THEN 'Нет информации'
ELSE 'Нет информации'
END
) AS employment_status,
CASE
WHEN (EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedFL'->'svedRObr'->'robr') AS education
WHERE jsonb_typeof(ri.info->'svedFL'->'svedRObr'->'robr') = 'array'
AND education->>'kodUrObr' IN ('1', '2', '3', '4', '5'))
OR EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedFL'->'svedInObr'->'inObr') AS education
WHERE jsonb_typeof(ri.info->'svedFL'->'svedInObr'->'inObr') = 'array'
AND education->>'kodUrObr' IN ('1', '2', '3', '4', '5')
)) THEN 'Высшее'
WHEN (EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedFL'->'svedRObr'->'robr') AS education
WHERE jsonb_typeof(ri.info->'svedFL'->'svedRObr'->'robr') = 'array'
AND education->>'kodUrObr' = '10')
OR EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedFL'->'svedInObr'->'inObr') AS education
WHERE jsonb_typeof(ri.info->'svedFL'->'svedInObr'->'inObr') = 'array'
AND education->>'kodUrObr' = '10'
)) THEN 'Среднее профессиональное'
WHEN (EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedFL'->'svedRObr'->'robr') AS education
WHERE jsonb_typeof(ri.info->'svedFL'->'svedRObr'->'robr') = 'array'
AND education->>'kodUrObr' IN ('7', '9'))
OR EXISTS (
SELECT 1
FROM jsonb_array_elements(ri.info->'svedFL'->'svedInObr'->'inObr') AS education
WHERE jsonb_typeof(ri.info->'svedFL'->'svedInObr'->'inObr') = 'array'
AND education->>'kodUrObr' IN ('7', '9')
)) THEN 'Общее'
WHEN ((ri.info->'svedFL'->'svedRObr'->>'prOtsRObr' = '1' OR ri.info->'svedFL'->'svedInObr'->>'prOtsInObr' = '1')) THEN 'Нет данных'
ELSE 'Не указано' -- Добавлено условие по умолчанию
END AS education,
(
SELECT COUNT(*)
FROM jsonb_array_elements(ri.info->'svedFL'->'svedDeti'->'rebenok') AS childs
WHERE jsonb_typeof(ri.info->'svedFL'->'svedDeti'->'rebenok') = 'array'
AND age(make_date(NULLIF(childs->'svedFLBS'->'dataRozhdDok'->>'god', '')::int,
NULLIF(childs->'svedFLBS'->'dataRozhdDok'->>'mesyacz','')::int,
NULLIF(childs->'svedFLBS'->'dataRozhdDok'->>'den','')::int)) < make_interval(years => 18)
) AS number_children
FROM public.recruits AS r
JOIN public.recruits_info AS ri ON ri.recruit_id = r.id AND r.system_update_date >= '${UP_D}'
LEFT JOIN public.decision_deferment_dto ddd ON ddd.recruit_id = r.id and ddd.hidden is false
JOIN public.military_registration_reason AS mrr ON r.registration_reasons::jsonb @> to_jsonb(mrr.code::text)
--JOIN public.recruits_history rh on rh.recruit_id=r.id
--WHERE r.system_update_date >= '${UP_D}'
),
adresses as (
SELECT
r.id as recruit_id,
MAX(CASE WHEN addr->>'type' = 'actualAddress' THEN addr->>'reg' END) AS actualAddress,
MAX(CASE WHEN addr->>'type' = 'actualAddress' THEN addr->>'regDateStart' END) AS actualAddress_regDateStart,
MAX(CASE WHEN addr->>'type' = 'actualAddress' THEN addr->>'regDateEnd' END) AS actualAddress_regDateEnd,
MAX(CASE WHEN addr->>'type' = 'residenceAddress' THEN addr->>'reg' END) AS residenceAddress,
MAX(CASE WHEN addr->>'type' = 'residenceAddress' THEN addr->>'regDateStart' END) AS residenceAddress_regDateStart,
MAX(CASE WHEN addr->>'type' = 'residenceAddress' THEN addr->>'regDateEnd' END) AS residenceAddress_regDateEnd,
MAX(CASE WHEN addr->>'type' = 'residenceAddress' THEN addr->>'kodTipReg' END) AS residenceAddress_kodTipReg
FROM
public.recruits AS r
LEFT JOIN
LATERAL jsonb_array_elements(r.addresses) AS addr ON true AND r.system_update_date >= '${UP_D}'
--WHERE r.system_update_date >= '${UP_D}'
GROUP BY
r.id
),
extracted_children AS (
SELECT
ri.recruit_id,
jsonb_array_elements_text(ri.info->'svedFL'->'svedDeti'->'rebenok') AS child
FROM base_recruit_data ri
WHERE
jsonb_typeof(ri.info->'svedFL'->'svedDeti'->'rebenok') = 'array'
),
children_birth_dates AS (
SELECT
recruit_id,
(child::jsonb->'svedFLBS'->'dataRozhdDok'->>'den')::int AS day,
(child::jsonb->'svedFLBS'->'dataRozhdDok'->>'mesyacz')::int AS month,
(child::jsonb->'svedFLBS'->'dataRozhdDok'->>'god')::int AS year
FROM extracted_children
),
children_count AS (
SELECT
recruit_id,
COUNT(*) AS children_under_16
FROM
children_birth_dates
WHERE
AGE(make_date(year, month, day)) < interval '16 years'
GROUP BY
recruit_id
),
driver_license AS (
SELECT
ri.recruit_id,
COALESCE(
string_agg(sved_vodit->>'naimKatTS', ', '),
'Нет информации'
) AS driver_license
FROM base_recruit_data ri
LEFT JOIN LATERAL
jsonb_array_elements(ri.info->'svedFL'->'svedVoditUdost'->'voditUdost'->'svedKat') AS sved_vodit
ON true
GROUP BY ri.recruit_id
)
SELECT
r.full_name,
r.last_name,
r.first_name,
r.middle_name,
r.gender,
r.snils,
r.inn,
r.birth_date,
r.age,
r.birth_place,
r.phone,
r.email,
r.deferment_liberation,
CASE
WHEN (EXTRACT(YEAR FROM AGE(NOW(), r.birth_date)) BETWEEN 30 AND 50 AND r.gender = 'MALE') -- мужчины от 30 до 50 лет
OR (EXTRACT(YEAR FROM AGE(NOW(), r.birth_date)) BETWEEN 30 AND 45 AND r.gender = 'FEMALE') -- женщины от 30 до 45 лет
AND COALESCE(cc.children_under_16, 0) < 5
THEN true
ELSE false
END AS mobilization,
CASE
WHEN EXTRACT(YEAR FROM AGE(NOW(), r.birth_date)) BETWEEN 18 AND 30
AND r.gender = 'MALE'
AND r.deferment_liberation IS true -- нет отсрочки и нет освобождения от службы
THEN true
ELSE false
END AS urgent_service,
CASE
WHEN EXTRACT(YEAR FROM AGE(NOW(), r.birth_date)) BETWEEN 18 AND 50
AND r.gender = 'MALE'
AND (r.info->'svedFL'->'svedPND'->>'prOtsSvedPND' = '1'
OR uchet_pnd IS false)
AND r.info->'svedFL'->'svedUchetVICH'->>'prOtsSvedUchetVICH' = '1' -- признак отсутствия сведений о заболевании ВИЧ
THEN true
ELSE false
END AS contract_service,
CASE
WHEN r.vu_current_info ->> 'isMilitaryRegistered' = 'true' THEN 'Состоит на воинском учете'
WHEN r.vu_current_info ->> 'isMilitaryRegistered' = 'false' THEN 'Не состоит на воинском учете'
ELSE 'Нет информации'
END AS is_registered,
r.education,
r.marital_status,
r.number_children,
(SELECT COUNT(*)
FROM jsonb_array_elements(r.info->'svedFL'->'svedDeti'->'rebenok') AS childs
WHERE jsonb_typeof(r.info->'svedFL'->'svedDeti'->'rebenok') = 'array'
AND age(make_date(NULLIF(childs->'svedFLBS'->'dataRozhdDok'->>'god', '')::int,
NULLIF(childs->'svedFLBS'->'dataRozhdDok'->>'mesyacz','')::int,
NULLIF(childs->'svedFLBS'->'dataRozhdDok'->>'den','')::int)) >= make_interval(years => 18)
) AS number_children_18_old,
r.passport_number,
r.passport_series,
r.issue_date,
r.recruit_id, -- ID рекрута
r.recruitment_id,
r.reason_registration, -- причина постановки на учет char
r.date_registration, -- дата постановки на учет date
r.date_deregistration, -- дата снятия с учета date
r.sports_category, -- наличие спортивной категории bool
dl.driver_license, -- категории водительских удостоверений char
r.disability_group, -- группа инвалидности char
r.tractor_license, -- наличие удостоверения тракториста bool
r.criminal_prosecution AS is_wanted, -- наличие уголовного преследования bool
r.employment_status AS employment, -- занятость char
r.update_date,
adr.actualAddress as residence,
adr.actualAddress_regDateStart as start_date_residence,
adr.actualAddress_regDateEnd as end_date_residence,
adr.residenceAddress as address_place_stay,
adr.residenceAddress_regDateStart as start_date_place_stay,
adr.residenceAddress_regDateEnd as end_date_place_stay,
case when adr.residenceAddress_kodTipReg='1' then 'В жилом помещении, не являющимся местом жительства физического лица'
when adr.residenceAddress_kodTipReg='2' then 'В учреждении уголовно-исполнительной системы'
else null end as type_place_stay,
r.system_pgs_status
FROM base_recruit_data r
LEFT JOIN children_count cc ON r.recruit_id = cc.recruit_id -- Присоединение для получения количества детей
JOIN driver_license dl ON dl.recruit_id = r.recruit_id
join adresses adr ON r.recruit_id=adr.recruit_id
Y
208
208
Table output
TableOutput
Y
1
none
1000
ervu-dashboard
N
N
N
N
Y
N
ervu_dashboard
N
N
Y
N
Y
656
64