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 citizen
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 citizen
N Y N Y 656 64