Министерство образования Кузбасса

Государственное профессиональное образовательное учреждение

«Кузнецкий металлургический техникум»

имени Бардина Ивана Павловича

УТВЕРЖДАЮ

Директор ГПОУ КМТ им. Бардина И.П.

_________ Е. А. Арбузова

Приказ № 265-У от «18» мая 2024 г.

РАЗРАБОТКА ИНФОРМАЦИОННОЙ СИСТЕМЫ ДЛЯ УПРАВЛЕНИЯ ОТПУСКАМИ СОТРУДНИКОВ КОМПАНИИ

Дипломный проект

Пояснительная записка

О.09.02.07.01.ИС-21С.ДП

Руководитель проекта ________ Е. Н. Бородина
Разработчик _________ С. С. Сергеев
Нормоконтроль ________ С. В. Соколов

Новокузнецк, 2024

Содержание

Введение 3
1 Общие сведения о предприятии 6
2 Общая часть 10
2.1 Исследование предметной области 10
2.2 Анализ и проектирование предметной области 16
2.3 Реализация информационной системы для управления отпусками 24
3 Охрана труда 40
Заключение 45
Литература 48
Приложение А «Код основного модуля системы» 50
Приложение Б «Структура базы данных системы» 57
Приложение В «Руководство пользователя» 60

Введение

В современных условиях развития бизнеса одним из важнейших факторов успеха становится эффективное управление человеческими ресурсами. Организация процесса планирования и учета отпусков является неотъемлемой частью этого процесса. Традиционные методы ведения учета отпусков, основанные на бумажном документообороте или использовании электронных таблиц, зачастую оказываются неэффективными, трудоемкими и подверженными ошибкам.

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

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

Для достижения поставленной цели необходимо решить следующие задачи:

1. Провести анализ существующих методов и подходов к организации процесса управления отпусками в компаниях;

2. Изучить нормативно-правовую базу, регламентирующую порядок предоставления отпусков сотрудникам;

3. Определить функциональные и нефункциональные требования к разрабатываемой информационной системе;

4. Разработать архитектуру информационной системы;

5. Спроектировать модель данных и интерфейс пользователя;

6. Реализовать информационную систему с использованием выбранных технологий разработки;

7. Провести тестирование и отладку системы;

8. Разработать документацию по использованию системы.

Объектом исследования является процесс управления отпусками сотрудников в компании.

Предметом исследования выступают методы и технологии автоматизации процесса планирования и учета отпусков сотрудников.

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

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

Разработанная информационная система обладает рядом преимуществ по сравнению с существующими решениями, такими как:

1. Интуитивно понятный пользовательский интерфейс, не требующий специального обучения пользователей;

2. Гибкая система настройки ролей и прав доступа;

3. Возможность интеграции с существующими информационными системами компании;

4. Наличие функций аналитики и формирования различных видов отчетности;

5. Многоплатформенность и возможность работы через веб-интерфейс.

Структура пояснительной записки отражает последовательность решения поставленных задач и включает в себя введение, три основных раздела, заключение, список использованной литературы и приложения.

В первом разделе представлены общие сведения о предприятии, для которого разрабатывается информационная система, описаны особенности его организационной структуры и текущие бизнес-процессы, связанные с управлением отпусками.

Второй раздел содержит описание процесса исследования предметной области, включая анализ существующих подходов к решению задачи автоматизации управления отпусками. Также в данном разделе представлены результаты проектирования системы, включая описание архитектуры, модели данных и пользовательского интерфейса, и отражен процесс реализации информационной системы с использованием выбранных технологий.

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

В заключении подведены итоги работы, сформулированы основные выводы и определены перспективы дальнейшего развития разработанной информационной системы.

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

При разработке информационной системы для управления отпусками сотрудников компании использовались современные инструменты и технологии разработки программного обеспечения, включая:

1. Язык программирования JavaScript для разработки клиентской части приложения;

2. Фреймворк React.js для создания интерактивного пользовательского интерфейса;

3. Node.js и Express.js для разработки серверной части приложения;

4. СУБД MySQL для организации хранения данных;

5. Библиотеки и компоненты для визуализации данных и создания отчетов.

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

Важно отметить, что разработанная система не является статичным продуктом, а представляет собой гибкую платформу, которая может быть адаптирована и расширена в соответствии с изменяющимися потребностями бизнеса и развитием технологий.

1 Общие сведения о предприятии

Информационная система для управления отпусками сотрудников разрабатывается для компании ООО «ТехноСофт», которая является средним по размеру предприятием, занимающимся разработкой программного обеспечения для промышленных предприятий. Компания была основана в 2010 году и за время своего существования зарекомендовала себя как надежный партнер в области автоматизации производственных процессов.

На текущий момент в компании работает около 150 сотрудников, включая руководителей, менеджеров проектов, разработчиков, тестировщиков, аналитиков, дизайнеров, специалистов по маркетингу и продажам, а также административный персонал.

Организационная структура компании представлена на рисунке 1.1. Во главе компании стоит генеральный директор, которому подчиняются руководители отделов: технический директор, коммерческий директор, финансовый директор и директор по персоналу.

Организационная структура компании

Рисунок 1.1 – Пример формы ввода данных сотрудника в системе

Основными видами деятельности компании являются:

1. Разработка заказного программного обеспечения для промышленных предприятий;

2. Внедрение и сопровождение собственных программных продуктов;

3. Консультационные услуги в области автоматизации бизнес-процессов;

4. Обучение персонала клиентов работе с внедренными системами.

Компания имеет головной офис в г. Новокузнецке, а также несколько региональных представительств в крупных городах России. Часть сотрудников работает в режиме удаленной работы.

Текущий процесс управления отпусками в компании организован следующим образом:

1. Сотрудник заполняет бумажное заявление на отпуск, согласовывает его с непосредственным руководителем и передает в отдел кадров;

2. Специалист отдела кадров проверяет корректность заполнения заявления, наличие положенных дней отпуска у сотрудника и вносит данные в электронную таблицу Excel, которая выполняет роль реестра отпусков;

3. На основании собранных заявлений формируется график отпусков на год, который утверждается руководством компании;

4. При необходимости изменения сроков отпуска сотрудник оформляет новое заявление, которое проходит тот же путь согласования;

5. Ежемесячно специалист отдела кадров формирует отчеты о предстоящих отпусках для бухгалтерии и руководителей подразделений.

Данный процесс имеет ряд недостатков:

1. Высокая трудоемкость оформления документов и согласования отпусков, особенно для удаленных сотрудников;

2. Возможность ошибок при ручном внесении данных в реестр отпусков;

3. Отсутствие возможности оперативного получения информации о статусе заявления на отпуск;

4. Сложность планирования замещения сотрудников, уходящих в отпуск;

5. Ограниченные возможности для анализа данных и формирования аналитической отчетности.

В связи с ростом числа сотрудников и расширением географии деятельности компании возникла необходимость автоматизации процесса управления отпусками с целью повышения его эффективности и прозрачности.

Руководством компании была поставлена задача разработать информационную систему, которая позволит автоматизировать следующие процессы:

1. Формирование и согласование заявлений на отпуск в электронном виде;

2. Планирование графика отпусков на год;

3. Учет фактически использованных отпусков и оставшихся дней;

4. Информирование руководителей и сотрудников о предстоящих отпусках;

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

Разрабатываемая информационная система должна учитывать специфику деятельности компании, в том числе:

1. Наличие удаленных сотрудников и необходимость обеспечения им доступа к системе;

2. Разные категории отпусков (основной оплачиваемый отпуск, дополнительный отпуск, отпуск без сохранения заработной платы и т.д.);

3. Различные уровни доступа пользователей к функциям системы в зависимости от должности и роли;

4. Необходимость интеграции с существующими информационными системами компании, включая систему учета рабочего времени и систему расчета заработной платы.

Анализ ИТ-инфраструктуры компании показал, что в организации используются следующие технические и программные средства:

1. Серверное оборудование на базе процессоров Intel Xeon с объемом оперативной памяти от 64 ГБ;

2. Операционные системы: серверные – Windows Server 2019, клиентские – Windows 10/11;

3. СУБД Microsoft SQL Server 2019 Enterprise Edition;

4. Виртуализация на базе VMware vSphere;

5. Система электронного документооборота на базе 1С:Документооборот;

6. Система управления проектами Jira;

7. Система учета рабочего времени и расчета заработной платы на базе 1С:Зарплата и управление персоналом.

В результате проведенного анализа существующих процессов управления отпусками и ИТ-инфраструктуры компании были сформулированы следующие требования к разрабатываемой информационной системе:

Функциональные требования:

1. Возможность формирования и подачи заявлений на отпуск в электронном виде;

2. Многоуровневая система согласования заявлений (руководитель подразделения, директор по персоналу, генеральный директор);

3. Автоматический расчет количества положенных дней отпуска с учетом стажа работы;

4. Формирование годового графика отпусков с возможностью его корректировки;

5. Учет различных типов отпусков (ежегодный оплачиваемый, дополнительный, без сохранения заработной платы, учебный, по уходу за ребенком и т.д.);

6. Контроль пересечения отпусков сотрудников одного подразделения;

7. Система уведомлений о приближающихся отпусках, необходимости их согласования и изменении статуса заявлений;

8. Формирование различных видов отчетности (график отпусков по подразделениям, сводный отчет по компании, индивидуальная статистика по сотрудникам и т.д.);

9. Возможность загрузки данных в формате Excel и экспорта отчетов в различных форматах (Excel, PDF, Word);

10. Интеграция с существующими системами компании для синхронизации данных о сотрудниках, отработанном времени и отпусках.

Нефункциональные требования:

1. Доступность системы через веб-интерфейс, с поддержкой различных браузеров (Chrome, Firefox, Edge);

2. Адаптивный дизайн для работы с мобильных устройств;

3. Высокая производительность и масштабируемость;

4. Обеспечение безопасности данных и разграничение доступа в соответствии с ролями пользователей;

5. Простота и интуитивность пользовательского интерфейса;

6. Возможность работы системы 24/7 с минимальными прерываниями на техническое обслуживание.

2 Общая часть

2.1 Исследование предметной области

Предметной областью данного проекта является управление отпусками сотрудников компании, которое регулируется трудовым законодательством Российской Федерации и внутренними нормативными документами организации.

Согласно Трудовому кодексу РФ, существуют следующие виды отпусков:

1. Ежегодный основной оплачиваемый отпуск (не менее 28 календарных дней);

2. Ежегодный дополнительный оплачиваемый отпуск (предоставляется отдельным категориям работников: работникам с ненормированным рабочим днем, работникам, занятым на работах с вредными и/или опасными условиями труда и др.);

3. Отпуск без сохранения заработной платы (предоставляется по семейным обстоятельствам и другим уважительным причинам);

4. Учебный отпуск (предоставляется работникам, совмещающим работу с получением образования);

5. Отпуск по беременности и родам;

6. Отпуск по уходу за ребенком до достижения им возраста трех лет;

7. Иные виды отпусков, предусмотренные законодательством или локальными нормативными актами.

Процесс управления отпусками включает в себя следующие этапы:

1. Планирование отпусков на год;

2. Подача заявления на отпуск сотрудником;

3. Согласование заявления руководителем подразделения;

4. Утверждение заявления отделом кадров;

5. Оформление приказа о предоставлении отпуска;

6. Учет фактически использованных отпусков;

7. Формирование отчетности.

Для автоматизации процесса управления отпусками в настоящее время существует ряд готовых решений, таких как модули в составе ERP-систем (1С:Зарплата и управление персоналом, SAP HR), специализированные HR-системы (БОСС-Кадровик, WebTutor, Talantix) и отдельные программные продукты (BambooHR, Calamari, TimeTac).

Анализ существующих решений показал, что они обладают следующими преимуществами и недостатками:

Преимущества:

1. Наличие готовых шаблонов документов и бизнес-процессов;

2. Соответствие требованиям законодательства;

3. Регулярные обновления с учетом изменений в законодательстве;

4. Наличие технической поддержки.

Недостатки:

1. Высокая стоимость лицензий и внедрения;

2. Избыточная функциональность, которая часто не используется;

3. Сложность настройки под специфические требования компании;

4. Ограниченные возможности интеграции с другими системами;

5. Недостаточная гибкость при изменении бизнес-процессов.

Учитывая специфику деятельности компании ООО «ТехноСофт» и требования к информационной системе, было принято решение о разработке собственного решения, которое бы полностью соответствовало потребностям компании и легко интегрировалось с существующими информационными системами.

Для более детального понимания предметной области был проведен анализ процесса управления отпусками в компании с использованием методологии IDEF0. На рисунке 2.1 представлена контекстная диаграмма процесса управления отпусками.

Диаграмма процесса управления отпусками

Рисунок 2.1 – График отпусков сотрудников в ИС

На основе анализа предметной области были выделены следующие ключевые сущности, которые должны быть представлены в информационной системе:

1. Сотрудник – основные данные о работнике компании (ФИО, должность, подразделение, дата приема на работу и т.д.);

2. Тип отпуска – классификация отпусков (ежегодный оплачиваемый, дополнительный, без сохранения заработной платы и т.д.);

3. Заявление на отпуск – документ, содержащий информацию о запрашиваемом отпуске (тип отпуска, даты начала и окончания, количество дней и т.д.);

4. График отпусков – план отпусков сотрудников на определенный период;

5. Учетная запись пользователя – информация для авторизации в системе и определения прав доступа;

6. Подразделение – структурная единица компании;

7. Должность – позиция сотрудника в компании;

8. Статус заявления – текущее состояние заявления на отпуск (создано, на согласовании, согласовано, отклонено и т.д.);

9. Уведомление – информация, направляемая пользователям системы о событиях, связанных с отпусками.

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

1. Администратор – полный доступ ко всем функциям системы, включая настройку параметров, управление пользователями и ролями;

2. Сотрудник – базовый доступ, включающий возможность подачи заявлений на отпуск, просмотра статуса своих заявлений и общего графика отпусков;

3. Руководитель подразделения – возможность согласования заявлений сотрудников своего подразделения, просмотра графика отпусков подразделения, формирования отчетов по своему подразделению;

4. Специалист отдела кадров – доступ к функциям утверждения заявлений, формирования приказов, внесения изменений в график отпусков, формирования отчетности;

5. Директор по персоналу – доступ к функциям контроля процесса управления отпусками, утверждения сводного графика отпусков, формирования аналитической отчетности;

6. Генеральный директор – доступ к сводной информации и отчетности по отпускам в компании.

На рисунке 2.2 представлена функциональная модель разрабатываемой информационной системы.

Функциональная модель информационной системы

Рисунок 2.2 – Календарь отпусков в ИС

Функциональная модель информационной системы включает следующие основные блоки:

1. Модуль управления учетными записями – обеспечивает функции регистрации, авторизации, управления правами доступа пользователей;

2. Модуль управления справочниками – позволяет администрировать справочники системы (подразделения, должности, типы отпусков и т.д.);

3. Модуль формирования заявлений на отпуск – обеспечивает создание, редактирование и отправку на согласование заявлений на отпуск;

4. Модуль согласования заявлений – реализует процесс многоуровневого согласования заявлений на отпуск;

5. Модуль формирования графика отпусков – позволяет формировать и корректировать график отпусков на год;

6. Модуль учета отпусков – обеспечивает учет фактически использованных отпусков и расчет оставшихся дней;

7. Модуль уведомлений – реализует систему информирования пользователей о событиях, связанных с отпусками;

8. Модуль формирования отчетности – обеспечивает формирование различных видов отчетов по отпускам;

9. Модуль интеграции – обеспечивает взаимодействие с другими информационными системами компании.

Процесс формирования и согласования заявления на отпуск в разрабатываемой информационной системе представлен на рисунке 2.3 в виде диаграммы активности UML.

Диаграмма активности процесса формирования и согласования заявления на отпуск

Рисунок 2.3 – Интерфейс вкладки «Заявки»

Для реализации информационной системы были выбраны следующие технологии и инструменты:

1. Клиентская часть (Frontend):

- JavaScript как основной язык программирования;

- React.js – библиотека для создания пользовательского интерфейса;

- Redux – для управления состоянием приложения;

- Material-UI – библиотека компонентов для создания современного и отзывчивого интерфейса;

- Chart.js – для визуализации данных в виде графиков и диаграмм;

- Axios – для выполнения HTTP-запросов.

2. Серверная часть (Backend):

- Node.js как платформа для выполнения JavaScript-кода на сервере;

- Express.js – фреймворк для создания веб-приложений на Node.js;

- MySQL – система управления базами данных;

- Sequelize – ORM для работы с базой данных;

- Passport.js – для аутентификации пользователей;

- JWT (JSON Web Tokens) – для реализации безопасной авторизации;

- Nodemailer – для отправки электронных уведомлений.

При выборе технологий учитывались следующие факторы:

1. Популярность и стабильность технологий, наличие активного сообщества разработчиков;

2. Возможность создания современного и удобного пользовательского интерфейса;

3. Производительность и масштабируемость;

4. Возможность интеграции с существующими системами компании;

5. Наличие специалистов с опытом работы с выбранными технологиями.

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

В результате анализа предметной области были сформулированы следующие выводы:

1. Процесс управления отпусками является важной частью управления человеческими ресурсами компании и регулируется трудовым законодательством РФ;

2. Существующий в компании ООО «ТехноСофт» процесс управления отпусками имеет ряд недостатков, связанных с его недостаточной автоматизацией;

3. На рынке представлены готовые решения для автоматизации процесса управления отпусками, однако они не полностью соответствуют специфическим требованиям компании;

4. Разработка собственной информационной системы является оптимальным решением для автоматизации процесса управления отпусками в компании;

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

2.2 Анализ и проектирование предметной области

На этапе проектирования информационной системы управления отпусками сотрудников были разработаны модели данных, архитектура системы и пользовательский интерфейс. Проектирование осуществлялось с использованием объектно-ориентированного подхода и методологии Unified Modeling Language (UML).

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

На рисунке 2.4 представлена диаграмма классов, описывающая основные сущности информационной системы и их атрибуты.

Диаграмма классов информационной системы

Рисунок 2.4 – Пример формы для добавления сотрудника

Основными классами системы являются:

1. User (Пользователь) – содержит информацию о пользователе системы, включая учетные данные для авторизации и роль в системе;

2. Employee (Сотрудник) – содержит информацию о сотруднике компании, включая ФИО, должность, подразделение и т.д.;

3. Department (Подразделение) – описывает структурное подразделение компании;

4. Position (Должность) – содержит информацию о должности сотрудника;

5. VacationType (Тип отпуска) – описывает различные типы отпусков;

6. VacationRequest (Заявление на отпуск) – содержит информацию о запрашиваемом отпуске;

7. VacationSchedule (График отпусков) – описывает план отпусков на определенный период;

8. Notification (Уведомление) – содержит информацию об уведомлениях пользователей о событиях в системе.

На основе диаграммы классов была разработана логическая модель базы данных, представленная на рисунке 2.5.

Логическая модель базы данных

Рисунок 2.5 – Таблица сотрудников и их отпусков

Логическая модель базы данных включает следующие основные таблицы:

1. users – содержит информацию о пользователях системы;

2. employees – содержит данные о сотрудниках компании;

3. departments – содержит информацию о подразделениях компании;

4. positions – содержит информацию о должностях;

5. vacation_types – содержит описание типов отпусков;

6. vacation_requests – содержит заявления на отпуск;

7. vacation_request_statuses – содержит информацию о статусах заявлений на отпуск;

8. vacation_schedules – содержит график отпусков;

9. vacation_balances – содержит информацию о доступных днях отпуска для каждого сотрудника;

10. notifications – содержит уведомления для пользователей.

Между таблицами определены связи, отражающие отношения между сущностями предметной области. Например, таблица employees связана с таблицей departments через внешний ключ department_id, что позволяет определить, к какому подразделению относится сотрудник.

Для каждой таблицы определены первичные ключи, внешние ключи и индексы, необходимые для обеспечения целостности данных и оптимизации производительности запросов.

Архитектура информационной системы разработана с использованием шаблона MVC (Model-View-Controller), который обеспечивает разделение данных приложения, пользовательского интерфейса и управляющей логики на три отдельных компонента. Такой подход позволяет обеспечить модульность, расширяемость и поддерживаемость системы.

На рисунке 2.6 представлена общая архитектура информационной системы.

Архитектура информационной системы

Рисунок 2.6 – Календарь отпусков сотрудников

Архитектура информационной системы включает следующие основные компоненты:

1. Клиентская часть (Frontend) – реализует пользовательский интерфейс системы и обеспечивает взаимодействие пользователя с системой. Реализована с использованием React.js и включает компоненты представления, сервисы для взаимодействия с API, хранилище состояния (Redux) и маршрутизатор;

2. Серверная часть (Backend) – реализует бизнес-логику системы и обеспечивает взаимодействие с базой данных. Реализована с использованием Node.js и Express.js и включает контроллеры, сервисы, модели данных и middleware для обработки запросов;

3. База данных – обеспечивает хранение и управление данными системы. Реализована с использованием MySQL;

4. API – обеспечивает взаимодействие между клиентской и серверной частями системы. Реализован в соответствии с принципами REST;

5. Интеграционные сервисы – обеспечивают взаимодействие с внешними системами (система учета рабочего времени, система расчета заработной платы и т.д.).

При проектировании пользовательского интерфейса учитывались следующие принципы:

1. Простота и интуитивность – интерфейс должен быть понятен пользователям без специального обучения;

2. Единообразие – элементы интерфейса должны быть оформлены в едином стиле;

3. Отзывчивость – интерфейс должен корректно отображаться на различных устройствах (компьютер, планшет, смартфон);

4. Информативность – пользователь должен получать достаточную информацию о текущем состоянии системы и результатах своих действий;

5. Доступность – интерфейс должен быть доступен для пользователей с различными потребностями.

Основные экраны пользовательского интерфейса информационной системы включают:

1. Экран авторизации – обеспечивает вход пользователей в систему;

2. Главный экран (дашборд) – предоставляет обзор ключевой информации и доступ к основным функциям системы;

3. Экран управления сотрудниками – обеспечивает возможность просмотра, добавления, редактирования и удаления информации о сотрудниках;

4. Экран формирования заявлений на отпуск – обеспечивает возможность создания и отправки заявлений на отпуск;

5. Экран согласования заявлений – обеспечивает возможность просмотра и согласования заявлений на отпуск;

6. Экран графика отпусков – предоставляет возможность просмотра и редактирования графика отпусков;

7. Экран формирования отчетов – обеспечивает возможность формирования различных видов отчетности;

8. Экран настроек – обеспечивает возможность настройки параметров системы.

Примеры прототипов экранов пользовательского интерфейса представлены на рисунках 2.7 - 2.10.

Прототип экрана авторизации

Рисунок 2.7 – Экран редактирования данных сотрудника

Прототип экрана формирования заявления на отпуск

Рисунок 2.8 – Экран отображения списка сотрудников и их отпусков

Прототип экрана графика отпусков

Рисунок 2.9 – Экран календаря отпусков

Для обеспечения безопасности информационной системы были предусмотрены следующие механизмы:

1. Аутентификация и авторизация пользователей с использованием JWT (JSON Web Tokens);

2. Разграничение прав доступа в соответствии с ролями пользователей;

3. Шифрование паролей пользователей;

4. Шифрование данных, передаваемых между клиентской и серверной частями системы с использованием HTTPS;

5. Защита от основных типов атак (SQL-инъекции, XSS, CSRF и т.д.);

6. Логирование действий пользователей и событий безопасности;

7. Регулярное резервное копирование данных.

Интеграция с существующими информационными системами компании планируется реализовать с использованием следующих механизмов:

1. API для обмена данными с системой учета рабочего времени и системой расчета заработной платы;

2. Импорт/экспорт данных в формате CSV/Excel для обмена данными с системами, не поддерживающими API;

3. Использование общей базы данных с системой электронного документооборота (при наличии такой возможности);

4. Интеграция с корпоративной системой авторизации (Single Sign-On) для обеспечения единого входа в различные системы компании.

Для тестирования информационной системы планируется использовать следующие виды тестирования:

1. Модульное тестирование (Unit Testing) – для проверки корректности работы отдельных компонентов системы;

2. Интеграционное тестирование – для проверки корректности взаимодействия между компонентами системы;

3. Системное тестирование – для проверки соответствия системы требованиям;

4. Тестирование производительности – для проверки работоспособности системы при высоких нагрузках;

5. Тестирование безопасности – для выявления уязвимостей системы;

6. Тестирование пользовательского интерфейса – для проверки удобства использования системы;

7. Приемочное тестирование – для проверки соответствия системы бизнес-требованиям.

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

Планирование процесса разработки информационной системы осуществлялось с использованием методологии Agile, которая предполагает итеративный подход к разработке и активное вовлечение заказчика в процесс создания продукта.

Процесс разработки был разделен на следующие этапы:

1. Анализ требований и проектирование системы;

2. Разработка базы данных;

3. Разработка серверной части (Backend);

4. Разработка клиентской части (Frontend);

5. Интеграция с существующими системами;

6. Тестирование и отладка;

7. Документирование;

8. Развертывание и внедрение.

Для каждого этапа были определены сроки выполнения, ответственные исполнители и необходимые ресурсы. Общий срок разработки информационной системы составил 6 месяцев.

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

В проекте участвовали следующие специалисты:

1. Руководитель проекта – отвечал за общую координацию работ, взаимодействие с заказчиком, распределение ресурсов и контроль сроков выполнения;

2. Бизнес-аналитик – отвечал за сбор и анализ требований, проектирование бизнес-процессов и формирование функциональных спецификаций;

3. Архитектор – отвечал за разработку архитектуры системы, выбор технологий и инструментов разработки;

4. Разработчики Backend – отвечали за создание серверной части системы, реализацию бизнес-логики и взаимодействие с базой данных;

5. Разработчики Frontend – отвечали за создание клиентской части системы, реализацию пользовательского интерфейса и взаимодействие с API;

6. Тестировщики – отвечали за проверку качества продукта, выявление и документирование ошибок;

7. Технические писатели – отвечали за создание пользовательской и технической документации.

Для обеспечения качества разработки были определены следующие критерии и метрики:

1. Соответствие функциональным и нефункциональным требованиям;

2. Отсутствие критических ошибок;

3. Производительность системы при нагрузке (время отклика, количество одновременных пользователей);

4. Удобство использования (по результатам пользовательского тестирования);

5. Полнота и качество документации;

6. Соответствие стандартам и лучшим практикам разработки.

Для контроля качества кода использовались следующие инструменты и практики:

1. Автоматизированные тесты (модульные, интеграционные, end-to-end);

2. Код-ревью – проверка кода другими разработчиками перед его включением в общую кодовую базу;

3. Статический анализ кода с использованием специализированных инструментов (ESLint, SonarQube);

4. Автоматизированная сборка и непрерывная интеграция (CI/CD) с использованием Jenkins;

5. Стандарты оформления кода и документации.

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

2.3 Реализация информационной системы для управления отпусками

Реализация информационной системы для управления отпусками осуществлялась в соответствии с разработанным на этапе проектирования планом и с использованием выбранных технологий и инструментов.

Первым шагом в реализации системы было создание базы данных на основе разработанной логической модели. База данных была реализована с использованием СУБД MySQL. Ниже приведен фрагмент SQL-кода для создания основных таблиц базы данных:

-- Создание таблицы пользователей CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, role ENUM('admin', 'employee', 'manager', 'hr', 'director') NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- Создание таблицы подразделений CREATE TABLE departments ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, manager_id INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (manager_id) REFERENCES users(id) ); -- Создание таблицы должностей CREATE TABLE positions ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- Создание таблицы сотрудников CREATE TABLE employees ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, first_name VARCHAR(50) NOT NULL, last_name VARCHAR(50) NOT NULL, middle_name VARCHAR(50), department_id INT, position_id INT, hire_date DATE NOT NULL, email VARCHAR(100), phone VARCHAR(20), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (department_id) REFERENCES departments(id), FOREIGN KEY (position_id) REFERENCES positions(id) );
-- Создание таблицы типов отпусков CREATE TABLE vacation_types ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, description TEXT, is_paid BOOLEAN DEFAULT TRUE, default_duration INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- Создание таблицы статусов заявлений на отпуск CREATE TABLE vacation_request_statuses ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, description TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- Создание таблицы заявлений на отпуск CREATE TABLE vacation_requests ( id INT PRIMARY KEY AUTO_INCREMENT, employee_id INT NOT NULL, vacation_type_id INT NOT NULL, start_date DATE NOT NULL, end_date DATE NOT NULL, duration INT NOT NULL, status_id INT NOT NULL, description TEXT, created_by INT NOT NULL, approved_by INT, rejected_by INT, rejection_reason TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (employee_id) REFERENCES employees(id), FOREIGN KEY (vacation_type_id) REFERENCES vacation_types(id), FOREIGN KEY (status_id) REFERENCES vacation_request_statuses(id), FOREIGN KEY (created_by) REFERENCES users(id), FOREIGN KEY (approved_by) REFERENCES users(id), FOREIGN KEY (rejected_by) REFERENCES users(id) ); -- Создание таблицы графика отпусков CREATE TABLE vacation_schedules ( id INT PRIMARY KEY AUTO_INCREMENT, year INT NOT NULL, department_id INT, is_approved BOOLEAN DEFAULT FALSE, approved_by INT, approved_at TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (department_id) REFERENCES departments(id), FOREIGN KEY (approved_by) REFERENCES users(id) ); -- Создание таблицы баланса отпускных дней CREATE TABLE vacation_balances ( id INT PRIMARY KEY AUTO_INCREMENT, employee_id INT NOT NULL, year INT NOT NULL, total_days INT NOT NULL, used_days INT DEFAULT 0, remaining_days INT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (employee_id) REFERENCES employees(id) );
-- Создание таблицы уведомлений CREATE TABLE notifications ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, title VARCHAR(100) NOT NULL, message TEXT NOT NULL, is_read BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ); -- Создание индексов для оптимизации запросов CREATE INDEX idx_employees_department ON employees(department_id); CREATE INDEX idx_vacation_requests_employee ON vacation_requests(employee_id); CREATE INDEX idx_vacation_requests_status ON vacation_requests(status_id); CREATE INDEX idx_vacation_balances_employee_year ON vacation_balances(employee_id, year); CREATE INDEX idx_notifications_user ON notifications(user_id, is_read);

После создания базы данных был разработан сервер на основе Node.js и Express.js, обеспечивающий обработку HTTP-запросов от клиентской части и взаимодействие с базой данных. Для облегчения работы с базой данных использовался ORM Sequelize, который предоставляет удобный интерфейс для выполнения операций с базой данных из JavaScript-кода.

Ниже приведен фрагмент кода модели сотрудника, реализованной с использованием Sequelize:

const { Model, DataTypes } = require('sequelize'); const sequelize = require('../config/database'); class Employee extends Model {} Employee.init( { id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true }, userId: { type: DataTypes.INTEGER, allowNull: true, references: { model: 'users', key: 'id' }, field: 'user_id' }, firstName: { type: DataTypes.STRING(50), allowNull: false, field: 'first_name' }, lastName: { type: DataTypes.STRING(50), allowNull: false, field: 'last_name' }, middleName: { type: DataTypes.STRING(50), allowNull: true, field: 'middle_name' }, departmentId: { type: DataTypes.INTEGER, allowNull: true, references: { model: 'departments', key: 'id' }, field: 'department_id' }, positionId: { type: DataTypes.INTEGER, allowNull: true, references: { model: 'positions', key: 'id' }, field: 'position_id' }, hireDate: { type: DataTypes.DATEONLY, allowNull: false, field: 'hire_date' }, email: { type: DataTypes.STRING(100), allowNull: true }, phone: { type: DataTypes.STRING(20), allowNull: true }, createdAt: { type: DataTypes.DATE, defaultValue: DataTypes.NOW, field: 'created_at' }, updatedAt: { type: DataTypes.DATE, defaultValue: DataTypes.NOW, field: 'updated_at' } }, { sequelize, modelName: 'Employee', tableName: 'employees', timestamps: true } ); module.exports = Employee;

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

Для обработки HTTP-запросов были разработаны контроллеры, которые обеспечивают выполнение операций с данными. Ниже приведен фрагмент кода контроллера для управления заявлениями на отпуск:

const VacationRequest = require('../models/VacationRequest'); const Employee = require('../models/Employee'); const VacationType = require('../models/VacationType'); const VacationRequestStatus = require('../models/VacationRequestStatus'); const User = require('../models/User'); const notificationService = require('../services/notificationService'); const { Op } = require('sequelize'); // Получение списка заявлений на отпуск exports.getVacationRequests = async (req, res) => { try { const { status, employee, department, startDate, endDate } = req.query; // Формирование условий для фильтрации const where = {}; if (status) { where.statusId = status; } if (employee) { where.employeeId = employee; } if (startDate || endDate) { where.startDate = {}; if (startDate) { where.startDate[Op.gte] = new Date(startDate); } if (endDate) { where.endDate = {}; where.endDate[Op.lte] = new Date(endDate); } } // Получение заявлений с учетом прав доступа пользователя let vacationRequests; switch (req.user.role) { case 'admin': case 'hr': case 'director': // Администраторы, HR-специалисты и директора видят все заявления vacationRequests = await VacationRequest.findAll({ where, include: [ { model: Employee, include: [ { model: User, attributes: ['username'] } ] }, { model: VacationType }, { model: VacationRequestStatus } ], order: [['createdAt', 'DESC']] }); break; case 'manager': // Руководители подразделений видят заявления сотрудников своих подразделений const managerDepartments = await Department.findAll({ where: { managerId: req.user.id } }); const departmentIds = managerDepartments.map(dept => dept.id); vacationRequests = await VacationRequest.findAll({ where, include: [ { model: Employee, where: { departmentId: { [Op.in]: departmentIds } }, include: [ { model: User, attributes: ['username'] } ] }, { model: VacationType }, { model: VacationRequestStatus } ], order: [['createdAt', 'DESC']] }); break; case 'employee': // Обычные сотрудники видят только свои заявления const employee = await Employee.findOne({ where: { userId: req.user.id } }); if (!employee) { return res.status(404).json({ message: 'Сотрудник не найден' }); } vacationRequests = await VacationRequest.findAll({ where: { ...where, employeeId: employee.id }, include: [ { model: Employee, include: [ { model: User, attributes: ['username'] } ] }, { model: VacationType }, { model: VacationRequestStatus } ], order: [['createdAt', 'DESC']] }); break; default: return res.status(403).json({ message: 'У вас нет доступа к этой функции' }); } return res.json(vacationRequests); } catch (error) { console.error('Error getting vacation requests:', error); return res.status(500).json({ message: 'Произошла ошибка при получении заявлений на отпуск' }); } };
// Создание нового заявления на отпуск exports.createVacationRequest = async (req, res) => { try { const { employeeId, vacationTypeId, startDate, endDate, description } = req.body; // Проверка наличия обязательных полей if (!employeeId || !vacationTypeId || !startDate || !endDate) { return res.status(400).json({ message: 'Все обязательные поля должны быть заполнены' }); } // Проверка доступа const employee = await Employee.findByPk(employeeId); if (!employee) { return res.status(404).json({ message: 'Сотрудник не найден' }); } // Обычные сотрудники могут создавать заявления только для себя if (req.user.role === 'employee') { const userEmployee = await Employee.findOne({ where: { userId: req.user.id } }); if (!userEmployee || userEmployee.id !== parseInt(employeeId)) { return res.status(403).json({ message: 'У вас нет доступа для создания заявления для другого сотрудника' }); } } // Расчет продолжительности отпуска const start = new Date(startDate); const end = new Date(endDate); if (start > end) { return res.status(400).json({ message: 'Дата начала отпуска должна быть раньше даты окончания' }); } const durationMs = end - start; const durationDays = Math.floor(durationMs / (1000 * 60 * 60 * 24)) + 1; // Проверка наличия достаточного количества дней отпуска const vacationType = await VacationType.findByPk(vacationTypeId); if (vacationType.isPaid) { const vacationBalance = await VacationBalance.findOne({ where: { employeeId, year: new Date().getFullYear() } }); if (!vacationBalance) { return res.status(404).json({ message: 'Информация о доступных днях отпуска не найдена' }); } if (vacationBalance.remainingDays < durationDays) { return res.status(400).json({ message: 'Недостаточно дней отпуска' }); } } // Проверка пересечения с другими отпусками const overlappingVacations = await VacationRequest.findAll({ where: { employeeId, statusId: { [Op.in]: [2, 3] // Статусы "На согласовании" и "Согласовано" }, [Op.or]: [ { startDate: { [Op.between]: [startDate, endDate] } }, { endDate: { [Op.between]: [startDate, endDate] } }, { [Op.and]: [ { startDate: { [Op.lte]: startDate } }, { endDate: { [Op.gte]: endDate } } ] } ] } }); if (overlappingVacations.length > 0) { return res.status(400).json({ message: 'Указанный период пересекается с другими отпусками сотрудника' }); } // Создание заявления на отпуск const statusId = 1; // Статус "Создано" const vacationRequest = await VacationRequest.create({ employeeId, vacationTypeId, startDate, endDate, duration: durationDays, statusId, description, createdBy: req.user.id }); // Создание уведомления для руководителя подразделения if (employee.departmentId) { const department = await Department.findByPk(employee.departmentId); if (department && department.managerId) { await notificationService.createNotification( department.managerId, 'Новое заявление на отпуск', `Сотрудник ${employee.lastName} ${employee.firstName} ${employee.middleName || ''} запрашивает отпуск с ${new Date(startDate).toLocaleDateString()} по ${new Date(endDate).toLocaleDateString()}` ); } } return res.status(201).json(vacationRequest); } catch (error) { console.error('Error creating vacation request:', error); return res.status(500).json({ message: 'Произошла ошибка при создании заявления на отпуск' }); } };

Аналогичным образом были реализованы контроллеры для всех сущностей системы, обеспечивающие выполнение операций создания, чтения, обновления и удаления данных (CRUD).

Для маршрутизации HTTP-запросов был разработан маршрутизатор на основе Express.js. Ниже приведен фрагмент кода маршрутизатора для заявлений на отпуск:

const express = require('express'); const router = express.Router(); const vacationRequestController = require('../controllers/vacationRequestController'); const authMiddleware = require('../middleware/auth'); // Маршруты для заявлений на отпуск router.get('/', authMiddleware.authenticate, vacationRequestController.getVacationRequests); router.get('/:id', authMiddleware.authenticate, vacationRequestController.getVacationRequestById); router.post('/', authMiddleware.authenticate, vacationRequestController.createVacationRequest); router.put('/:id', authMiddleware.authenticate, vacationRequestController.updateVacationRequest); router.delete('/:id', authMiddleware.authenticate, vacationRequestController.deleteVacationRequest); router.post('/:id/approve', authMiddleware.authenticate, vacationRequestController.approveVacationRequest); router.post('/:id/reject', authMiddleware.authenticate, vacationRequestController.rejectVacationRequest); module.exports = router;

Для аутентификации и авторизации пользователей был разработан механизм на основе JSON Web Tokens (JWT). Ниже приведен фрагмент кода middleware для аутентификации:

const jwt = require('jsonwebtoken'); const User = require('../models/User'); const config = require('../config/config'); // Middleware для аутентификации exports.authenticate = async (req, res, next) => { try { // Получение токена из заголовка Authorization const authHeader = req.headers.authorization; if (!authHeader) { return res.status(401).json({ message: 'Токен не предоставлен' }); } const token = authHeader.split(' ')[1]; if (!token) { return res.status(401).json({ message: 'Токен не предоставлен' }); } // Верификация токена const decoded = jwt.verify(token, config.jwtSecret); // Получение пользователя из базы данных const user = await User.findByPk(decoded.id); if (!user) { return res.status(401).json({ message: 'Пользователь не найден' }); } // Добавление информации о пользователе в объект запроса req.user = user; next(); } catch (error) { if (error.name === 'TokenExpiredError') { return res.status(401).json({ message: 'Срок действия токена истек' }); } if (error.name === 'JsonWebTokenError') { return res.status(401).json({ message: 'Недействительный токен' }); } console.error('Error in authentication middleware:', error); return res.status(500).json({ message: 'Ошибка сервера' }); } }; // Middleware для проверки роли пользователя exports.authorize = (roles) => { return (req, res, next) => { if (!req.user) { return res.status(401).json({ message: 'Пользователь не аутентифицирован' }); } if (!roles.includes(req.user.role)) { return res.status(403).json({ message: 'У вас нет доступа к этой функции' }); } next(); }; };

Для реализации клиентской части информационной системы был использован фреймворк React.js, который позволяет создавать динамические пользовательские интерфейсы. Ниже приведен фрагмент кода компонента для отображения списка заявлений на отпуск:

import React, { useState, useEffect } from 'react'; import { Link } from 'react-router-dom'; import { Table, Button, Badge, Form, Row, Col } from 'react-bootstrap'; import { toast } from 'react-toastify'; import { format } from 'date-fns'; import { ru } from 'date-fns/locale'; import vacationService from '../services/vacationService'; import employeeService from '../services/employeeService'; import vacationTypeService from '../services/vacationTypeService'; import { useAuth } from '../contexts/AuthContext'; const VacationRequestList = () => { const [vacationRequests, setVacationRequests] = useState([]); const [employees, setEmployees] = useState([]); const [vacationTypes, setVacationTypes] = useState([]); const [statuses, setStatuses] = useState([]); const [loading, setLoading] = useState(true); const [filters, setFilters] = useState({ status: '', employee: '', startDate: '', endDate: '' }); const { user } = useAuth(); useEffect(() => { const fetchData = async () => { try { const [ vacationRequestsResponse, employeesResponse, vacationTypesResponse, statusesResponse ] = await Promise.all([ vacationService.getVacationRequests(filters), employeeService.getEmployees(), vacationTypeService.getVacationTypes(), vacationService.getVacationRequestStatuses() ]); setVacationRequests(vacationRequestsResponse.data); setEmployees(employeesResponse.data); setVacationTypes(vacationTypesResponse.data); setStatuses(statusesResponse.data); setLoading(false); } catch (error) { console.error('Error fetching data:', error); toast.error('Ошибка при загрузке данных'); setLoading(false); } }; fetchData(); }, [filters]); const handleFilterChange = (e) => { const { name, value } = e.target; setFilters({ ...filters, [name]: value }); }; const handleApprove = async (id) => { try { await vacationService.approveVacationRequest(id); // Обновление списка заявлений const response = await vacationService.getVacationRequests(filters); setVacationRequests(response.data); toast.success('Заявление успешно согласовано'); } catch (error) { console.error('Error approving vacation request:', error); toast.error('Ошибка при согласовании заявления'); } }; const handleReject = async (id, reason) => { try { await vacationService.rejectVacationRequest(id, { reason }); // Обновление списка заявлений const response = await vacationService.getVacationRequests(filters); setVacationRequests(response.data); toast.success('Заявление отклонено'); } catch (error) { console.error('Error rejecting vacation request:', error); toast.error('Ошибка при отклонении заявления'); } }; const getStatusBadge = (statusId) => { const status = statuses.find(s => s.id === statusId); if (!status) { return Неизвестно; } let badgeBg; switch (status.name) { case 'Создано': badgeBg = 'secondary'; break; case 'На согласовании': badgeBg = 'warning'; break; case 'Согласовано': badgeBg = 'success'; break; case 'Отклонено': badgeBg = 'danger'; break; default: badgeBg = 'secondary'; } return {status.name}; }; if (loading) { return
Загрузка...
; } return (

Заявления на отпуск

Статус {statuses.map(status => ( ))} Сотрудник {employees.map(employee => ( ))} Дата начала Дата окончания
{vacationRequests.map(request => ( ))}
ID Сотрудник Тип отпуска Дата начала Дата окончания Дней Статус Действия
{request.id} {`${request.Employee.lastName} ${request.Employee.firstName} ${request.Employee.middleName || ''}`} {request.VacationType.name} {format(new Date(request.startDate), 'dd.MM.yyyy', { locale: ru })} {format(new Date(request.endDate), 'dd.MM.yyyy', { locale: ru })} {request.duration} {getStatusBadge(request.statusId)}
{(user.role === 'admin' || user.role === 'hr' || user.role === 'manager') && request.statusId === 2 && ( <> )}
); }; export default VacationRequestList;

Для взаимодействия с API был разработан сервис, обеспечивающий выполнение HTTP-запросов к серверу. Ниже приведен фрагмент кода сервиса для работы с заявлениями на отпуск:

import axios from 'axios'; import { getAuthToken } from '../utils/auth'; import { API_BASE_URL } from '../config'; const API_URL = `${API_BASE_URL}/api/vacation-requests`; // Настройка Axios для отправки токена в заголовке Authorization const getAxiosConfig = () => { const token = getAuthToken(); return { headers: { 'Authorization': `Bearer ${token}` } }; }; // Получение списка заявлений на отпуск с учетом фильтров const getVacationRequests = async (filters = {}) => { const { status, employee, startDate, endDate } = filters; let url = API_URL; const params = []; if (status) { params.push(`status=${status}`); } if (employee) { params.push(`employee=${employee}`); } if (startDate) { params.push(`startDate=${startDate}`); } if (endDate) { params.push(`endDate=${endDate}`); } if (params.length > 0) { url += `?${params.join('&')}`; } return axios.get(url, getAxiosConfig()); }; // Получение заявления на отпуск по ID const getVacationRequestById = async (id) => { return axios.get(`${API_URL}/${id}`, getAxiosConfig()); }; // Создание нового заявления на отпуск const createVacationRequest = async (vacationRequest) => { return axios.post(API_URL, vacationRequest, getAxiosConfig()); }; // Обновление заявления на отпуск const updateVacationRequest = async (id, vacationRequest) => { return axios.put(`${API_URL}/${id}`, vacationRequest, getAxiosConfig()); }; // Удаление заявления на отпуск const deleteVacationRequest = async (id) => { return axios.delete(`${API_URL}/${id}`, getAxiosConfig()); }; // Согласование заявления на отпуск const approveVacationRequest = async (id) => { return axios.post(`${API_URL}/${id}/approve`, {}, getAxiosConfig()); }; // Отклонение заявления на отпуск const rejectVacationRequest = async (id, data) => { return axios.post(`${API_URL}/${id}/reject`, data, getAxiosConfig()); }; // Получение статусов заявлений на отпуск const getVacationRequestStatuses = async () => { return axios.get(`${API_BASE_URL}/api/vacation-request-statuses`, getAxiosConfig()); }; export default { getVacationRequests, getVacationRequestById, createVacationRequest, updateVacationRequest, deleteVacationRequest, approveVacationRequest, rejectVacationRequest, getVacationRequestStatuses };

Для управления состоянием приложения был использован контекст React. Ниже приведен фрагмент кода контекста аутентификации:

import React, { createContext, useState, useContext, useEffect } from 'react'; import authService from '../services/authService'; import { getAuthToken, setAuthToken, removeAuthToken } from '../utils/auth'; const AuthContext = createContext(); export const AuthProvider = ({ children }) => { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // Проверка аутентификации при загрузке приложения useEffect(() => {