Внедрение отпусков в систему управления персоналом

Я работаю над системой управления сотрудниками, в которой сотрудники могут

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

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

но я ничего не мог понять. Мои вопросы в основном.

  • Как лучше поступить в случае отсутствия работника? Учитывая тот факт, что именно в этот день сотрудник не зарегистрируется.

  • Как добавить/указать выходные/праздничные дни в отчетах? Поскольку изменение государственных/обычных праздников в будущем может повлиять на наши отчеты за предыдущие месяцы.

Я был бы очень признателен за помощь здесь! Спасибо


person Aimal Khan    schedule 25.07.2016    source источник
comment
1. вам понадобится календарный стол. Он содержит все возможные даты (прошлое и будущее). 2. Во-первых, что вы хотите делать, если сотрудник отсутствует? потом думаешь как с этим бороться   -  person Squirrel    schedule 25.07.2016
comment
@squirrel Спасибо за ваш комментарий. Что именно вы рекомендуете делать с календарной таблицей? Во-вторых, я на самом деле не уверен, что делать, когда сотрудник отсутствует. Именно поэтому я здесь в первую очередь.   -  person Aimal Khan    schedule 25.07.2016
comment
Что вы рекомендуете делать с календарной таблицей? - заполнить ее информацией о любом дне - будь то праздник или что-то другое. Единственная цель таблицы calendar — использовать ее в качестве календаря в вашей программе.   -  person Ivan Starostin    schedule 25.07.2016
comment
@ivanStarostin а что, если конкретная дата праздника изменится? Это повлияет на драгоценные отчеты. Нет?   -  person Aimal Khan    schedule 25.07.2016
comment
Что ты имеешь в виду? 2016-07-25 - holiday, 2017-07-25 - not holiday кто на кого влияет? Год спустя кто-то скажет знаете, мне не понравилась эта вечеринка, допустим, это был не праздник?..   -  person Ivan Starostin    schedule 25.07.2016
comment
@Squirreli Я согласен с таблицей календаря, но не согласен со всеми возможными датами, ему нужны все активные даты, поэтому, поскольку хронометраж происходит только ежедневно, требуются даты между первым хронометражем и сегодняшним днем, отсутствие должно быть записано на ежедневно, поэтому вам нужны все дни между датой начала и датой окончания, но никоим образом вам не нужна каждая дата когда-либо   -  person MikeT    schedule 25.07.2016
comment
Таблица календаря @MikeT на 10 лет будет иметь 3652 строки. Почему нет?   -  person Ivan Starostin    schedule 25.07.2016
comment
@IvanStarostin, потому что тогда вы создаете точку отказа, для исправления которой требуется вмешательство человека, я признаю, что большинство систем редко служат 10 лет, но на прежней работе была база данных сотрудников и клиентов, созданная в 1980-х годах, которые все еще использовались , оба из которых постоянно падали, потому что никто не удосужился принять во внимание, что система может прослужить им в компании дольше.   -  person MikeT    schedule 25.07.2016
comment
@MikeT Я говорю, что даже в таблице за 10 лет будет такой незначительный объем данных. В чем проблема держать там весь прошедший год? Текущий весь год? Чтобы исправить что, потребуется вмешательство человека? И какая разница с таблицей active dates в этом случае?   -  person Ivan Starostin    schedule 25.07.2016
comment
@IvanStarostin, и я согласен с тем, что это не значительный объем данных, я говорю, что предварительное заполнение сроком службы системы ограничивает срок службы системы, потому что через 10 лет система выйдет из строя, если кто-то не забудет перейти наверх составить таблицу дат, лучше установить автоматизированную систему, которая будет автоматически пополнять таблицу по мере необходимости либо по требованию, либо в заранее определенные периоды, скажем, раз в месяц, пополняя таблицу до 13 месяцев в будущем, если 12 месяцев - это максимальное будущее использование. это устраняет человеческий фактор и обеспечивает более надежную систему   -  person MikeT    schedule 25.07.2016
comment
@MikeT Я не думаю, что кто-то (ни Белка, ни я) не собирался заполнять календарную таблицу с 1900-01-01 по 3000-12-31.   -  person Ivan Starostin    schedule 25.07.2016


Ответы (3)


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

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

я бы не предложил использовать таблицу дат для отслеживания праздников, вместо этого просто включите их как отсутствие типа «Праздничный день», вы можете отметить выходные (или какой это день недели) в таблице дат, но не используйте это чтобы сказать, работал ли человек или не работал в тот день, вместо этого используйте таблицу workPattern, в которой указано, что сотрудник типа factory worker работает 4 часа в понедельник, 6 часов во вторник. это даст вам ожидаемое рабочее время сотрудников и дни, в которые они должны работать в течение недели, не заставляя каждого сотрудника следовать одному и тому же рабочему графику.

eg

select d.Date, a.*
from absence as a
join dates as d on d.Date between a.StartDate and a.EndDate

это даст вам каждую дату отсутствия человека, что позволит вам очень легко сравнить разные периоды отсутствия вместе

большинство систем найма редко позволяют сотрудникам работать более чем на год вперед, поэтому я бы предложил иметь ежемесячное задание, которое запускается и заполняет таблицу дат всеми датами между (Today + 12 months) и (Today + 13 months), вы также можете удалить старые даты но перед этим убедитесь, что нет обстоятельств, при которых вам нужно будет запрашивать данные. т.е. все до минимальной даты вашего отъезда было заархивировано.

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

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

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

person MikeT    schedule 25.07.2016

Я писал комментарий, но это зашло слишком далеко, и я решил написать ответ.

Как добавить/указать выходные/праздничные дни в отчетах?

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

Как лучше поступить в случае отсутствия работника?

Бьюсь об заклад, будет какая-то таблица со строками вроде:

EmployeeID  InOut   Date                
1           In      2016-07-24 07:00:01.000
1           Out     2016-07-24 18:00:09.908
etc

Итак, если Сотрудник отсутствует - в определенную дату не будет строк.

person gofr1    schedule 25.07.2016
comment
Спасибо за ваш комментарий @gofr1. Это действительно полезно, дало мне пару точек зрения для размышлений. - person Aimal Khan; 25.07.2016
comment
я бы только не согласился с таким образом, если сотрудник отсутствует - не будет строк в конкретную дату, когда вы забываете о ночной смене, когда кто-то работает в один день и уходит на следующий, вам нужно просто проверить вход или выход, а не оба - person MikeT; 25.07.2016

Как лучше поступить в случае отсутствия работника? Учитывая тот факт, что именно в этот день сотрудник не зарегистрируется.

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

Теперь, когда данные о посещаемости обрабатываются, они будут проверять даты. Если в этом файле кода будет присутствовать какая-либо дата, она будет отмечена как выходной.

Как добавить конкретный праздник в отчеты?

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

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

person Awais Mahmood    schedule 25.07.2016
comment
Я бы не рекомендовал это как вашу дублирующую функциональность, OP не может использовать этот механизм для хранения болезни или праздников для пользователя, просто записывайте праздники так же, как и любое другое отсутствие. - person MikeT; 25.07.2016
comment
Будет еще одна таблица для управления отпусками, изначально для всех отсутствующих сотрудников помечается отсутствующий. В процессе, если сотрудник взял отпуск, статус посещаемости будет изменен на отпуск. И кроме того, будет еще одно поле, которое будет задавать тип отпуска. - person Awais Mahmood; 25.07.2016
comment
это моя точка зрения, если вам нужна другая таблица, чтобы делать то же самое, то вы не следуете KIS, нормализация также требует, чтобы данные хранились в как можно меньшем количестве мест с минимальным дублированием - person MikeT; 03.08.2016