Skip to content

unitymind/time-control

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Прототип системы учеты доступа в крупной компании

Постановка задачи

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

Разработайте админ. интерфейс для просмотра статистики.

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

Система должна позволять решать следующие задачи:

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

Требования по реализации

  • Код написан на RoR 3
  • Проект должен содержать в себе тестовые данные в виде миграции, seeds или отдельной rake task
  • Интерфейс любой, но разумный
  • Покрытие кода тестами
  • Большим плюсом будет визуализация данных.

Сбор данных и их структура

Дабы выглядеть немного реалистично, нужны не вымышленные ФИО сотрудников. В этом качестве использованы ФИО депутатов госдумы РФ всех созывов. Источник - Wikipedia.

Ну и созданы отделы компании.

Сгенерированные данные

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

Системы контроля, обычно, основаны на контактных магнитных картах и записывают данные в форме: сотрудник, время, тип события (вошел в здание, или вышел из него).

Для каждого сотрудника сгенерированы данные за два месяца. Началом рабочего дня считается: 8:00. В течение дня сотрудник может выходить и возвращаться по несколько раз. Иногда сотрудник не приходит на работу вовсе (помимо выходных).

Получили модель TimeEvent

Результирующие данные за день (а эти данные неизменны после создания) агрегируются в другой модели: TimesheetByDa. Это позволяет ускорить последующие выборки.

Подход к тестированию

Увы, в данном проекте тестами покрыты формально только модели. Также используется форкнутый и модифицированный gem 'rspec-rails-matchers'.

lib/utils/cached_url, lib/utils/parser и ReportController - тестами не покрыты, но неплохо отлажены "по-старинке".

Алгоритм генерации отчета

Для отчетов общего характера используются выборки из TimesheetByDay с группировкой по полю 'day' (то есть дате без времени) в заданном временом интервале. Если задано ограничение в виде отдела - то выбираем только те записи, которые относятся к сотрудником данного отдела.

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

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

Реализация пользовательского интерфейса

jQuery Autocomplete, jQuery Datatable. Автокомплит по имени сотрудника также контекстно зависит от текущего выбранного отдела.

Вообщем, такой же подход, как в Cheap-Taxi.

Недочеты

  • Не все покрыто тестами
  • Нет обработки ошибок соединения при autocomplete
  • Поскольку это админский интерфейс, то должна быть авторизация.

Немного технических деталей

Парсер и генерация данных сгруппированы в rake-задачах:

rake db:init
	Init database from a scratch. Load schema, populate departments, employees and generate (randomly) timesheet data

rake db:populate:all
	Populate departments, employees and generate (randomly) timesheet data

rake db:populate:departments
	Populate permanent departments

rake db:populate:employees
	Populate employees

rake db:populate:timesheets
	Generate (randomly) timesheet data

Генерация данных занимает ощутимое время. И это момент для оптимизации. Тем не менее, стартовые тестовые данные сгенерировать удалось ;)

Что дальше?

Вполне разумно допилить до продакшен качества, оттачивая RoR-техники.

About

Прототип системы учеты доступа в крупной компании

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published