Как мы автоматизировали проверку электронных больничных листов

Привет, Хабр! Меня зовут Ольга Овсянникова, Старший программист-консультант на проектах для «Фикс Прайс», и сегодня я расскажу, как мы значительно повысили эффективность обработки электронных больничных листов через автоматизацию этого процесса.

Чем нас не устраивал существовавший процесс

Мы постоянно открываем новые магазины, увеличивается количество сотрудников. Соответственно, растет число больничных листов, и обрабатывать их вручную становится всё менее эффективно. Мы посчитали, что обработка 1 больничного листа занимала у специалиста кадровой службы порядка 20–30 минут работы! И поняли, что этот процесс нужно кратно ускорять. Забегая вперед — в результате проведенной автоматизации в процессе обработки 90% больничных листов сотрудники не участвуют совсем, а в ручном режиме рассматриваются только исключительные случаи. Всего же мы обрабатываем порядка 1500 больничных листов ежемесячно.

Как мы стали обрабатывать данные

Вся схема состоит из нескольких этапов:

  • Загрузка сведений об уведомлениях со стороны Социального Фонда России (СФР) во внутреннюю базу данных Fix Price.

  • Формирование неявки.

  • Формирование электронного листа нетрудоспособности (ЭЛН).

  • Формирование больничного листа (БЛ).

  • Отправка сведений в СФР для обеспечения расчета и оплаты БЛ со стороны государства.

Хочу обратить внимание, что этот процесс автоматизирован: система сама проверяет и ставит больничные листы на учет в бухгалтерию для отправки соответствующих денежных сумм сотрудникам.

Самое интересное здесь — это то, как реализован прием и проверка данных из СФР. И здесь замечу, что серийная версия БОСС-Кадровика предоставляет возможность обратиться к сервисам СФР за получением данных о больничных листах. Однако для нас оказалось неудобным, что все операции должны инициироваться

пользователем из интерфейса БОСС-Кадровика. Поэтому, для облегчения работы пользователей и минимизации участия сотрудников в проверке и оплате больничных листов  было принято решение автоматизировать процессы, которые выполняются в ручном режиме. И нам удалось добиться полной автоматизации этих процессов. А о технической реализации я сейчас расскажу.

Как это работает

Серийная версия БОСС-Кадровика не умеет запускать отдельные наборы процедур и функций в фоновом режиме. Поэтому мы организовали выделенный сервер для фонового запуска сессии БОСС-Кадровика и завели отдельного технического пользователя с ограниченными правами для работы с фоновым режимом. Затем установили сертификаты организации (сотрудника, имеющего право подписи от имени организации), а также сертификаты ФСС для ЭЛН.

На терминальном сервере под техническим пользователем создали задание в планировщике заданий Windows. Оно открывается из меню Пуск — Управление компьютером. В планировщике заданий создано задание Загрузка уведомлений об изменениях ЭЛН. Задание запускает файл cmd, расположенный в директории на рабочем столе. Cmd-файл boss_start_boss_tech_load_SEDO имеет следующий вид:

a42203a0f2f2c7c8aaf6e85cb00f801b.jpeg

Была разработана х-процедура, которая позволяет запускать серийный/пользовательский функционал в фоновом режиме, а по результатам делает почтовую рассылку и закрывает модуль.

Здесь приведу код

if suserid = 'ХХХХХХХХ\хххххххх'
or suserid = 'ХХХХХХХХ\хххххххх'
or suserid = 'ХХХХХХХХ\хххххххх'
then
{
    if suserid = 'ХХХХХХХХ\хххххххх'
    or suserid = 'ХХХХХХХХ\хххххххх'
    then {Local @@id_firm = ХХХХ -- Автозагрузка только БП
    if suserid = 'ХХХХХХХХ\хххххххх'
    then {Local @@id_firm = хххх -- Автозагрузка БП Казахстан
    --Загрузка уведомлений об изменениях ЭЛН
    execute user_sedo_111_load;
    --Загрузка информации о жизненных событиях
    execute user_sedo_109_load;
    --Запрос сведений о заработной плате
    execute user_sedo_320_load;
    --Извещения ПВСО
    execute user_sedo_10_load;
    --Загрузка запросов недостающих сведений
    execute user_sedo_100_load;
    --Рассылка на почту о результатах
    exec [dbo].[user_send_mail_load_SEDO] @@id_firm;
    Let _usr_task_kill := 'taskkill /f /im rpexec.exe';
    ERROROFF;
    system _usr_task_kill, wait;
    ERRORON;
};

После загрузки ЭЛН из ФСС или автозагрузки ЭЛН из ФСС необходимо проверить пересечение поступившего ЭЛН с неявками. Для этого берется период ЭЛН и в журнале неявок БОСС-Кадровика проверяются все неявки сотрудника на пересечение с периодом ЭЛН. Система выясняет, есть ли за этот период отпуска, командировки, прочие неявки. В зависимости от типа неявки и типа ЭЛН производятся дальнейшие действия с ЭЛН.

Если есть пересечения с неявками или сотрудник уволен то в ЭЛН устанавливается статус:

  • Любые прочие неявки, кроме НН (неявки по невыясненным причинам) — Автоотказ.

  • Командировки — Автоотказ.

  • Отпуск по беременности и родам, либо по уходу за ребенком до 1,5 или 3 лет — Отказ. Декрет.

  • Сотрудник уволен — Отказ. Уволен.

Если есть по данному ЭЛН выполняется запрос недостающих сведений, то у него устанавливается флаг Отказ в выплате:

876052d718f4119d84fa8f8bec29f51b.png

Затем производится почтовая рассылка получателям различных подразделений компании.

Также перед автосозданием больничного листа производится ряд проверок:

  • наличие БЛ по данному ЭЛН (он уже существует);

  • в выбранном ЭЛН указан № предыдущего ЭЛН, а он отсутствует;

  • ЭЛН не закрыт (с кодом состояния 010, 020, 040, 050);

  • не удалось определить тип БЛ по коду из ЭЛН;

  • не удалось найти родственника, если БЛ по уходу за больным ребенком/членом семьи.

Если ЭЛН не проходит проверки, то БЛ не создается, производится рассылка по почте с причиной отказа в создании БЛ. Если ЭЛН прошел все проверки, то производится создание БЛ, при этом в базе автоматически выполняются действия:

  • Создание БЛ в неявках сотрудника.

  • Повторная проверка наличия пересекающихся неявок (прочих неявок, командировок, отпусков).

  • Статус ЭЛН меняется на статус Создан БЛ.

  • Оформляется табель БОСС-Кадровика на период БЛ. Если табель или часть табеля, входящего в период БЛ закрыта, то табель открывается, оформляется и закрывается снова.

  • Производится почтовая рассылка по статусам.

Если производилось продление отпуска по причине БЛ, также производится рассылка с информацией о продлении отпуска.

Теперь покажу наглядно реализацию разработки:

adbcec98f0b1b6a30f42a0de3f16a04f.pngc7055d1f977ea7c3613266c363199a4d.png743f427b9586f709b7d6c5e2c4d500a4.png

И теперь о том, как выполняются автоматизированные проверки. Всего выполняется проверка по 22 пунктам:

  1. Проверка БЛ с типом «По временной нетрудоспособности» и «Травма» (в том числе несчастный случай на производстве) по списку вхождения в модуль.

  2. Проверка полей «с даты» и «по дату» на совпадение с полем «Освобождение от работы» в ЛН.

  3. Проверка дат оплаты БЛ.

  4. Проверка периодов страховых стажей сотрудника на пресечение.

  5. Записи в истории трудовой деятельности соответствуют периодам страхового стажа сотрудника.

  6. Процент оплаты соответствует страховому стажу на момент проверки.

  7. Условия исчисления должно быть пустым.

  8. Акт формы Н-1.

  9. Проверка даты выдачи.

  10. Обязательная галочка «Первичный» (Не дубликат), не должно быть флага «Дубликат».

  11. Причина нетрудоспособности 01 для типа больничных «По временной нетрудоспособности» и 02 для типа больничных «Травма».

  12. ЛН ч.1 не заполнено.

  13. В ЛН ч.2 отметки о нарушении режима не заполнены.

  14. Не заполнено Бюро МСЭ.

  15. Проверка даты «Приступить к работе с» по ряду условий.

  16. Проверка должности врача на содержание в тексте слов «ПЕДИА / фельд / стом» (регистр букв любой). Если должность врача содержит «фельд» или «стом», то в ЛН с даты по дату должно стоять не более 10 дней в сумме за все периоды (10 дней допустимо). Если 11 и более, то ошибка.

  17. В ЛН ч.3 ФИО врача не должно быть пустым.

  18. Если в ЛН ч.3 «с даты» верхней строки «по дату» самой последней строки более 15 дней (16 и больше), то в последней из заполненных строк должна быть заполнена строка «ПРЕД ВК» и ФИО.

  19. Проверка полей «Находился в стационаре по» и «Период с даты». Например, если «Период с даты» равно 21.11.2023, то дата выдачи может быть как 21.11.2023, так и 20.11.2023.

  20. У работника/физ. лица нет характеристики расчета.

  21. Работник не находится в подразделении «Отсутствующие».

Например, так выглядит проверка заполнения полей Бюро МСЭ:

4c2463e50e34c152f9207b51eb79ed6e.pngТакже приведу часть кода хранимой процедуры SQL по проверкам БЛ в части проверок по стажу

Процент оплаты по стажу:

IF @code_ill <> 37 begin
    IF @out_date < @FromD begin
        set @bl_proc = 60
    end
    else begin
        -- Стаж
        declare @stag_yy_ int = 0;
        SELECT
        @stag_yy_ = dbo.pr_fn_calc_staj_tot(ISNULL((SELECT TOP 1 id_tot FROM
vpr_wk_total WHERE sname = 'ст_Страховой'),0), @auto_card, @FromD,'Y')
        IF @stag_yy_ < 5 begin set @bl_proc = 60 end
        IF @stag_yy_ >= 5 begin set @bl_proc = 80 end
        IF @stag_yy_ >= 8 begin set @bl_proc = 100 end
    end
    if @percent <> @bl_proc
    begin
        set @txt_err = @txt_err + ' ' +'Процент оплаты БЛ не соотвествует стажу.'
        set @bit_err = 1
    end
end
else begin --@code_ill = 37 --HRS-4032
    IF @out_date < @FromD
    begin
        set @txt_err = @txt_err + ' ' +'БЛ по уходу после увольнения не оплачивается.'
        set @bit_err = 1
    end
    else begin
        if @percent <> 100
        begin
            set @txt_err = @txt_err + ' ' +'Процент оплаты БЛ по уходу до 7 лет не равен
100%.'
            set @bit_err = 1
        end
    end
end

Проверки стажа:

declare @stag_TD int = 0,
        @stag_strah int = 0;
--Количество дней стажа из истории трудовой деятельности
select @stag_TD = sum (dd)
from (
    --история трудовой деятельности
    select
    date_start,date_finish, DATEDIFF(day,date_start,date_finish)+1 as dd
    --pr_wk_his.*
    from pr_wk_his
    left join card on card.auto_card = pr_wk_his.auto_card
    where
    id_pfr_vidwork = 1
    and card.auto_card = @auto_card
    union all
    --приемы и увольнения по основному месту работы
    select
    in_date,
    out_date,
    DATEDIFF(day,in_date, (case when out_date='2099-01-01' then @FromD else out_date
end))+1 --на дату начала БЛ
    from people
    left join card on card.auto_card = people.auto_card
    left join pr_current on pr_current.pid=people.pid and @FromD between date_trans
and date_depart
    left join structs on structs.struct_code = pr_current.code_struct_name
    left join setup on setup.id_firm = people.id_firm
    where
    people.sovm <>2
    and card.auto_card = @auto_card
) a
--Количестово дней страхового стажа из стажей сотрудника
select @stag_strah = sum (dd)
from (
    select
    PR_WK_TOTALS_I.date_b,
    PR_WK_TOTALS_I.date_e,
    DATEDIFF(day,date_b,(case when date_e='2099-01-01' then @FromD else date_e end))+1 as dd --на дату начала БЛ
    from PR_WK_TOTALS_I
    left join card on card.auto_card = PR_WK_TOTALS_I.auto_card
    where card.auto_card = @auto_card
    and vpr_wk_total_id_tot = 8 --страховой
) a
if @stag_TD <> @stag_strah
begin
    set @txt_err = @txt_err + ' ' +' Количество дней стажа из истории трудовой деятельности не соответствует страховому стажу'
    set @bit_err = 1
end

Проверка на пересечение страхового стажа:

if exists (
        SELECT top 1 1
    FROM PR_WK_TOTALS_I I1
    join pr_wk_totals_i I2 (nolock) on I1.id_tot_i<>I2.id_tot_i and I1.auto_card =
I2.auto_card and I1.vpr_wk_total_id_tot = I2.vpr_wk_total_id_tot
    where
    I1.vpr_wk_total_id_tot = 8
    AND (I1.date_e >= I2.date_b and I1.date_b <= I2.date_e)
    and I1.auto_card = @auto_card
) begin
    set @txt_err = @txt_err + ' ' +'Периоды страхового стажа пересекаются'
    set @bit_err = 1
end

Для отслеживания статуса автоматической обработки БЛ создан интерфейс для сотрудников кадровой службы и бухгалтерии:

434e461038ee6392cf83be7423b5c71b.png

Проверки разделены на 2 группы: предварительные и в момент принятия к расчету БЛ. 

  • Если БЛ не прошел хотя бы одну предварительную проверку, текст сообщения представляется в логе проверки БЛ, а работа с БЛ останавливается. Производится оповещение ответственных пользователей.

  • Если предварительные проверки прошли без ошибок, запускаются проверки ошибок принятия к расчету БЛ.

  • Если не было выявлено ни одной ошибки, то БЛ переводится в состояние «к расчету в текущем месяце», формируются начисления и суммы попадают в ближайший расчет заработной платы.

Что немаловажно, разработка также позволила нам сократить время оплаты БЛ со стороны государства.

Обычно, при закрытии БЛ в лечебном учреждении, данные о БЛ поступают в СФР, и процедуры в недрах СФР «понимают», что недостает данных для корректного расчета сумм БЛ и СФР. Обычно не это уходит один день, и работодателю направляется уведомление о недостающих сведениях. При этом у этого уведомления есть срок исполнения (3 дня), в рамках которого необходимо подготовить и отправить недостающие сведения в СФР.

Если работодатель просмотрел, забыл, промедлил с отправкой недостающих сведений, оплата со стороны СФР задерживается на соответствующий срок.

Внедрение нашего процесса позволяет нам превентивно, сразу после поступления информации о том, что БЛ закрыт, формировать информацию о недостающих сведениях и осуществлять отправку с СФР. 

Это позволило нам сократить время оплаты БЛ со стороны государства до 24 часов, что качественно отражается на лояльности наших сотрудников и сокращает количество вопросов с их стороны.

Заключение

Если раньше сотрудники бухгалтерии и кадровой службы тратили на один БЛ до 1 часа (включая переписку по почте между сотрудниками отделов и руководителями), то сейчас они проверяют руками только отдельные случаи БЛ, проверки которых алгоритмически сложны или БЛ представляет собой уникальный случай. Но вручную проверяются уже менее 10% от всех БЛ в компании.

© Habrahabr.ru