Задание «Список задач»

Задание «Список задач» #

Задание № 1 #

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

Данные #

Элемент списка: задача.

Название поля Описание поля Тип поля
Id Уникальный идентификатор UUID
Title Название задачи Текст
RegistrationDateTime Регистрация в системе Дата и время в формате ISO
StartDateTime Начало задачи Дата и время в формате ISO
EndDateTime Плановое окончание задачи Дата и время в формате ISO
Может быть null
Importance Приоритет задачи Из списка: очень низкий, низкий, обычный, высокий, очень высокий, критический
Urgency Срочность задачи Логическое значение true/false
Percentage Процент выполнения Целое число от 0 до 100
Description Описание Текст

Пример описания задачи в формате JSON:

{
    "Id": "ec247f48-f86c-45c8-ab2f-7510e4640052",
    "Title": "Задача",
    "RegistrationDateTime": "2024-01-02T00:00:00.0",
    "StartDateTime": "2024-01-02T00:00:00.0",
    "EndDateTime": "2024-01-06T00:00:00.0",
    "Importance": "очень низкий",
    "Urgency": false,
    "Percentage": 0,
    "Description": "Описание задачи"
}

Приложение должно считывать список задач из CSV-файла (разделитель – запятая).
Пример данных:

Id,Title,RegistrationDateTime,StartDateTime,EndDateTime,Importance,Urgency,Percentage,Description
8b2a4482-35c8-411e-aab9-6ce490b3bea1,Задача № 1,2024-01-01T00:00:00.0,2024-01-01T00:00:00.0,,очень низкий,false,100,задача
ec247f48-f86c-45c8-ab2f-7510e4640052,Задача № 2,2024-01-02T00:00:00.0,2024-01-02T00:00:00.0,2024-01-06T00:00:00.0,очень низкий,false,0,задача
b0d29fa9-cfd4-41e2-9753-f9b5f40e9811,Задача № 3,2024-01-03T00:00:00.0,2024-01-03T00:00:00.0,2024-01-04T00:00:00.0,критический,true,90,задача
a89723c3-0bfe-41b1-b7b9-db67a8c4708a,Задача № 4,2024-01-04T00:00:00.0,2024-01-04T00:00:00.0,,очень низкий,false,0,задача
5bdb77b9-3a66-4217-b6fe-2eaaf9e54200,Задача № 5,2024-01-05T00:00:00.0,2024-01-05T00:00:00.0,,высокий,false,70,задача
2aeaf2b4-ad18-4686-a69c-9d9baa34fe69,Задача № 6,2024-01-06T00:00:00.0,2024-01-06T00:00:00.0,,очень низкий,true,5,задача

Имя файла с исходными данными должно передаваться приложению с ключом --tasks-file

... --tasks-file="../data/file.csv"
... --tasks-file="C:\Users\AM\data\app-3968942893870838401.csv"

Задание #

В зависимости от аргументов вызова приложение должно выполнять следующие команды:

1. list – получить список задач. #

Выходные данные: список всех задач в формате JSON, упорядоченный по возрастанию даты и времени регистрации и id. Список может быть пустым.

Информация о задаче должна содержать только идентификатор, название и поле IsClosed:

  • true – задача закрыта (процент выполнения 100%)
  • false – задача ещё не закрыта (процент выполнения не 100%)
{
    "tasks": [ 
        {
            "Id": "8b2a4482-35c8-411e-aab9-6ce490b3bea1",
            "Title": "Задача № 1",
            "IsClosed": true
        }, {
            "Id": "ec247f48-f86c-45c8-ab2f-7510e4640052",
            "Title": "Задача № 2",
            "IsClosed": false
        }
    ]
}
{
  "tasks": []
}

2. show-task – получить один элемент списка по идентификатору. #

--id=ID – обязательный параметр. Корректное значение: идентификатор существующей в списке задачи.

Выходные данные: полная информация о задаче в формате JSON.

show --task-id=ec247f48-f86c-45c8-ab2f-7510e4640052
{
    "task-id": "ec247f48-f86c-45c8-ab2f-7510e4640052",
    "task": {
        "Id": "ec247f48-f86c-45c8-ab2f-7510e4640052",
        "Title": "Задача № 2",
        "RegistrationDateTime": "2024-01-02T00:00:00.0",
        "StartDateTime": "2024-01-02T00:00:00.0",
        "EndDateTime": "2024-01-06T00:00:00.0",
        "Importance": "очень низкий",
        "Urgency": false,
        "Percentage": 0,
        "Description": "задача",
        "IsClosed": false
    }
}
{
    "task-id": "a89723c3-0bfe-41b1-b7b9-db67a8c4708a",
    "task": {
        "Id": "a89723c3-0bfe-41b1-b7b9-db67a8c4708a",
        "Title": "Задача № 4",
        "RegistrationDateTime": "2024-01-04T00:00:00.0",
        "StartDateTime": "2024-01-04T00:00:00.0",
        "EndDateTime": null,
        "Importance": "очень низкий",
        "Urgency": false,
        "Percentage": 100,
        "Description": "задача",
        "IsClosed": true
    }
}

3. list-eisenhower – получить список задач для блока Матрицы Эйзенхауэра. #

--important=[true/false] – необязательный параметр важности, где:

  • true – задачи с приоритетом «высокий», «очень высокий», «критический»
  • false – задачи с приоритетом «очень низкий», «низкий», «обычный»

--urgent=[true/false] – необязательный параметр срочности.

Обязательно должен быть передан хотя бы один из параметров.

Выходные данные: список задач в формате JSON соответствующего уровня важности и срочности, упорядоченный по возрастанию даты регистрации и id. Список может быть пустым.

Информация о задаче содержит только идентификатор, название, приоритет, срочность и процент выполнения.

list-eisenhower --important=true
list-eisenhower --important=false --urgent=true
list-eisenhower --urgent=true
{
    "important": true,
    "urgent": false,
    "tasks": [
        {
            "Id": "5bdb77b9-3a66-4217-b6fe-2eaaf9e54200",
            "Title": "Задача № 5",
            "Importance": "высокий",
            "Urgency": false,
            "Percentage": 70
        }
    ]
}
{
    "important": true,
    "tasks": [
        {
            "Id": "b0d29fa9-cfd4-41e2-9753-f9b5f40e9811",
            "Title": "Задача № 3",
            "Importance": "критический",
            "Urgency": true,
            "Percentage": 90
        }, {
            "Id": "5bdb77b9-3a66-4217-b6fe-2eaaf9e54200",
            "Title": "Задача № 5",
            "Importance": "высокий",
            "Urgency": false,
            "Percentage": 70
        }
    ]
}

4. list-time – получить список задач, актуальных на момент времени. #

--time – обязательный параметр даты и времени в формате ISO

Выходные данные: список задач, для которых дата и время начала меньше переданных и процент выполнения меньше 100%. Список упорядочен по убыванию важности, убыванию срочности, возрастанию даты регистрации и id. Список может быть пустым.

Информация о задаче содержит только идентификатор, название, приоритет, срочность и процент выполнения.

list-time --time=2024-01-01T00:00:00.0
{
    "time": "2024-01-01T00:00:00.0",
    "tasks": [
        {
            "Id": "b0d29fa9-cfd4-41e2-9753-f9b5f40e9811",
            "Title": "Задача № 3",
            "Importance": "критический",
            "Urgency": true,
            "Percentage": 90
        }, {
            "Id": "5bdb77b9-3a66-4217-b6fe-2eaaf9e54200",
            "Title": "Задача № 5",
            "Importance": "высокий",
            "Urgency": false,
            "Percentage": 70
        }
    ]
}

5. statistic – получить статистическую информацию о списке задач по дням недели. #

--by-date=[registration/start/end] – обязательный параметр типа отображаемой статистики.

Возможные значения:

  • registration – статистика по дате регистрации
  • start – статистика по дате начала задачи
  • end – статистика по дате окончания задачи

Выходные данные: статистика количества задач по дням недели переданного типа даты в формате JSON. Значение null сопоставляется дню недели «Не заполнено». Список упорядочен по дню недели, «Не заполнено» (при наличии) в конце.

В выдаче должны присутствовать только те дни недели, которые есть в списке данных.

statistic --by-date=registration
statistic --by-date=start
statistic --by-date=end
{
  "statisticByRegistrationDateTime": [
    { "Понедельник": 1 }, 
    { "Среда": 3 }
  ]
}
{
   "statisticByStartDateTime": [
    { "Вторник": 5 }, 
    { "Воскресенье": 3 }
   ]
 }
{
   "statisticByEndDateTime": [
    { "Понедельник": 1 }, 
    { "Не заполнено": 9 }
   ]
 }

Выходные данные #

При корректных входных данных приложение должно завершать работу с кодом возврата 0 и возвращать данные в формате JSON.

При некорректных входных данных приложение должно завершать работу с ненулевым кодом возврата и возвращать сообщение об ошибке. Некорректными данными считаются:

  • отсутствие аргумента команды или некорректная команда.
  • отсутствие обязательного параметра команды, его некорректное значение или несоответствие значения указанному типу данных.
  • отсутствие аргумента --tasks-file или его некорректное значение.

Приложение всегда должно завершать работу корректно. Падение приложения или отображение стека вызовов недопустимо.

© A. M. Васильев, 2024, CC BY-SA 4.0, andrey@crafted.su