Спроектируйте на моделях систему учета доступа в крупной компании.
Разработайте админ. интерфейс для просмотра статистики.
Система должна позволять решать следующие задачи:
- Просмотр за произвольный период времени с разбивкой по дням статистики по кол-ву опоздавших сотрудников и среднему времени опоздания
- Просмотр с разбивкой по дням кол-ва работавших сотрудников и среднюю длительность рабочего дня.
- Просмотр по конкретному сотруднику информации об отработанном времени с разбивкой по дням.
- Код написан на 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-техники.