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

К защите в удалённом формате подготовьте камеру (можно использовать камеру на телефоне) и микрофон. Будут использованы системы Google Meet (https://meet.google.com) и Zoom (https://zoom.us).

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

Проверяемые знания учащихся

  • Уровень знакомства с языком Ruby:
    • Запуск приложения.
    • Описание переменных и методов, их использование.
    • Работа с контейнерами, итераторами.
    • Описание собственных классов.
    • Знание деталей работы стандартных классов: чисел, строк.
    • Знание деталей вызова методов и указания их аргументов.
  • Уровень знакомства с экосистемой языка Ruby:
    • Проверка качества исходного кода с помощью Rubocop.

Требования к выполнению задания

  • Приложение должно реализовать все требования, указанные в задании. Однако к защите допускаются приложения, реализующие только часть задач.
  • К защите не допускается исходный код, который не запускается.
  • Исходный код приложения должен быть проверен с помощью приложения Rubocop с настройками по-умолчанию или с конфигурацией, предложенной на соответствующем занятии. Для каждого нарушения, которое находит Rubocop, должно быть объяснение почему оно не было исправлено. Допускаются аргументы с точки зрения архитектуры приложения, другого рода аргументы не принимаются.
  • Все зависимости приложения должны управляться с помощью Bundler, установка зависимостей с помощью gem запрещена. Исключением является джем bundler.
  • Для разрабатываемого приложения должны быть создан отдельный каталог.
    • В корне каталога должны располагаться конфигурационные файлы: Gemfile, Gemfile.lock.
    • В корне каталога приложения должны находится каталоги bin, lib, в которых должен находиться исходный код приложения. В каталоге bin находится исполняемый файл, в каталоге lib находится описание всех собственных классов и модулей.
  • Весь код приложения должен быть разбит на модули и классы, запрещается использовать файлы с простым набором методов, которые не пренадлежат какому-либо модулю.
  • Необходимо выделить отдельные классы, описывающие предметную область.
  • В одном модуле нельзя совмещать логику обработки предметной области и операции ввода-вывода.
  • Приложение должно корректно обрабатывать неправильный ввод от пользователя.
  • Приложение должно обладать понятным интерфейсом: показывать помощь по использованию, для ввода данных приложение должно показывать приглашение.

Задача

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

  • Уникальный код больничного, состоящий из четырёх блоков по три цифры
  • ФИО нетрудоспособного в формате Фамилия Имя Отчество
  • Пол нетрудоспособного м или ж
  • Период нетрудоспособности в формате ГГГГ-ММ-ДД - ГГГГ-ММ-ДД
  • Натуральный код причины нетрудоспособности
  • Фамилия врача

Скачайте файл polyclinic_log.csv по данной ссылке.

Расшифровка кодов причины нетрудоспособности:

  1. Заболевание
  2. Травма
  3. Карантин
  4. Несчастный случай на производстве или его последствия
  5. Отпуск по беременности и родам
  6. Протезирование в стационаре
  7. Профессиональное заболевание или его обострение
  8. Долечивание в санатории
  9. Уход за больным членом семьи
  10. Иное состояние (отравление, проведение манипуляций и др.)

При запуске приложение должно отображать пользовательское меню:

  1. Случайный пациент
  2. Список врачей
  3. Количество пациентов
  4. Длительность больничного
  5. Максимальный и минимальный больничный
  6. Завершить работу

Если пользователь выбрал пункт № 1, на экран должна быть выведена информация о случайно выбранном пациенте в формате ФИО не <имел|имела> возможности посещать свое рабочее место в период с <дата начала> по <дата окончания> по причине <текстовая расшифровка кода>, код листа нетрудоспособности <код>. Лишние пробелы в ФИО, присутствующие в файле с данными для выравнивания, должны быть удалены.

Если пользователь выбрал пункт № 2, на экран должен быть выведен список врачей из листков нетрудоспособности без повторений, упорядоченный лексикографически.

Если пользователь выбрал пункт № 3, на экран должна быть выведена статистика о количестве пациентов:

  • общее количество пациентов
  • количество пациентов-мужчин
  • количество пациентов-женщин

Если пользователь выбрал пункт № 4, на экран должна быть выведена статистика о длительности больничных:

  • средняя длительность больничного в сутках
  • средняя длительность больничного, завершившегося в 2020 году
  • средняя длительность больничного, завершившегося в 2021 году

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

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