Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 8

Мне кажется, было бы лучше, если бы вы просто оставили ссылку на репу с проектом - даже при потребности в подобном функционале это все копипастить - ад, не говоря уж о том, чтобы это просто пролистать

Мне тоже кажется что в таком виде это не может быть полезно вообще никому. Как правило мне интересен график работы сотрудников, в рамках проекта где есть управление этими самыми сотрудниками. То есть, это как некая дополнительная часть к моим сотрудникам.

Если же мы ставим цель наполнить и распечатать, то мне нужен либо какой то плагин к системе которая уже развернута (СMS, CRM и т.п.), либо какой то докер образ который я смогу быстро запустить. А еще лучше, чтобы это уже было где то развернуто, и мне оставалось только заполнить.

Согласен. Код точно спрятать под каты, либо показывать только куски в которых описана идея того или иного блока: посылка -> результат. Что не нужно хорошо знать PHP или JS чтобы понять суть. Блок-схемы или какую-то инфографику, тогда статья внезапно станет общеобразовательной.

Стоит задаваться вопросом в конце статьи: а что я узнал (нового), что получил?

Тема интересная для планирования работы сотрудников в более-менее внятной конторе.

Но

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

  • зато увидел ненужные здесь портянки кода. Разве гитхаб уже заблокировали?

Итого — вполне ожидаемое итого.

Первый раз здесь писал, на будущее учту

Привет. Всё прекрасно описано и пусть не говорят что комуто не нравится что код вы выложили тут а не на git. Единственное что было бы это указать параметры базы данных. Я конечно по коду посмотрю что и где запрашивается и постараюсь воссоздать БД но структуру я бы добавил чтобы позлить ещё какое-то количество читателей.
Молодец что создал такоё проект.

CREATE DATABASE IF NOT EXISTS `schedule_db` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE `schedule_db`;

CREATE TABLE IF NOT EXISTS `employees` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fullname` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `employee_status` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `employee_id` int(11) NOT NULL,
  `start_date` date NOT NULL,
  `end_date` date NOT NULL,
  `status_type` enum('vacation','sick_leave') NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `created_by` int(11) DEFAULT NULL COMMENT 'ID пользователя, установившего статус',
  PRIMARY KEY (`id`),
  KEY `date_range` (`start_date`,`end_date`),
  KEY `employee_dates` (`employee_id`,`start_date`,`end_date`),
  CONSTRAINT `employee_status_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `employees` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

DELIMITER $$
CREATE TRIGGER IF NOT EXISTS `check_status_overlap` BEFORE INSERT ON `employee_status` FOR EACH ROW BEGIN
  IF EXISTS (
    SELECT 1 FROM employee_status 
    WHERE employee_id = NEW.employee_id
    AND NEW.start_date <= end_date 
    AND NEW.end_date >= start_date
  ) THEN
    SIGNAL SQLSTATE '45000' 
    SET MESSAGE_TEXT = 'Новый статус пересекается с существующим периодом';
  END IF;
END$$
DELIMITER ;

CREATE TABLE IF NOT EXISTS `shifts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `employee_id` int(11) NOT NULL,
  `shift_date` date NOT NULL,
  `shift_type` enum('day','night','off') NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `employee_date` (`employee_id`,`shift_date`),
  CONSTRAINT `shifts_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `employees` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации