Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,39 @@
4. Найденный в соответствии с условием задачи месяц должен выводиться на английском языке в нижнем регистре. Если месяцев несколько, то на вывод они все подаются на английском языке в нижнем регистре в порядке их следования в течение года.

## Автор решения
Проходцев Сергей Олегович

## Описание реализации
1. Импортирует необходимые модули: `defaultdict` из `collections`, `datetime` из `datetime` и `json`.
2. Открывает файл с данными `input.json`.
3. Считывает данные из файла в формате JSON и сохраняет их в переменную `data`.
4. Функция `generate_report(data)` генерирует отчет о расходах за месяц на основе данных из `data`.
- Создает словарь `monthly_expenses`, где ключами являются названия месяцев, а значениями - суммарные расходы за каждый месяц.
- Проходит по каждой записи в `data`.
- Если статус заказа равен "COMPLETED", извлекает дату заказа, получает название месяца и увеличивает суммарные расходы для этого месяца.
- Находит месяц(ы) с наибольшими расходами.
- Возвращает JSON-представление месяц(-ев) с максимальными расходами, отсортированные по порядку в исходном списке.
5. Функция `perform_report()` выполняет отчет:
- Читает данные из файла и сохраняет их в переменную `data`.
- Генерирует отчет вызовом функции `generate_report(data)`.
- Выводит результат отчета на экран.
6. Если скрипт запущен непосредственно (а не импортирован как модуль), вызывает функцию `perform_report()` для выполнения отчета.

Это позволяет пользователю запустить программу и получить отчет о месяцах с наибольшими расходами на основе данных из файла `input.json`.

## Инструкция по сборке и запуску решения
1. Откройте терминал или командную строку.
2. Перейдите в директорию, в которой вы хотите клонировать репозиторий.
3. Введите ниже команду для клонирования репозитория.

```bash
git clone https://github.com/proxod3-first/school2024-test-task1.git
```

4. Более того, необходимо разместить файл `input.json` с данными о заказах в той же директории, в которой находится основной python-скрипт (`report.py`). Если он не найден, то необходимо нужно его составить по соответствующей структуре из ТЗ.
5. Запустите python-скрипт для выполнения процесса составления отчета (ниже приведены команды для его запуска).

```bash
cd src
python report.py
```
38 changes: 38 additions & 0 deletions src/input.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
[
{
"user_id": "3acfb0b7-04bd-4978-be4c-3929372277c1",
"ordered_at": "2023-01-16T13:56:39.492",
"status": "COMPLETED",
"total": "1917.00"
},
{
"user_id": "25b003b9-ab22-4a24-a616-dd0303f983d8",
"ordered_at": "2023-03-05T08:34:21.123",
"status": "COMPLETED",
"total": "13990.00"
},
{
"user_id": "e1470ada-fcbb-4424-8c46-065b6409ca4b",
"ordered_at": "2016-03-16T13:56:39.492",
"status": "COMPLETED",
"total": "215.50"
},
{
"user_id": "081a47a5-b7bf-462c-a11a-68002a179152",
"ordered_at": "2023-12-08T21:36:59.281",
"status": "COMPLETED",
"total": "49499.00"
},
{
"user_id": "0999c6aa-1bac-4ded-9a54-92fff4f34d69",
"ordered_at": "2023-12-14T11:10:29.408",
"status": "CANCELED",
"total": "13650.00"
},
{
"user_id": "0999c6aa-1bac-4ded-9a54-92fff4f34d69",
"ordered_at": "2023-12-14T11:15:31.108",
"status": "COMPLETED",
"total": "14760.00"
}
]
62 changes: 62 additions & 0 deletions src/report.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Импортируем необходимые модули для работы скрипта
from collections import defaultdict
from datetime import datetime
import json


def generate_report(data):
"""Функция для создания отчета о расходах за месяц.

Args:
data (list): список словарей, содержащих записи о расходах.

Returns:
str: строка в формате JSON, представляющая месяц(-ы) с самыми высокими расходами.
"""

# Создаем словарь, где ключами будут названия месяцев, а значениями - суммарные расходы за каждый месяц
monthly_expenses = defaultdict(float)

# Проходимся по каждой записи данных
for record in data:
# Проверяем, является ли заказ завершенным
if record["status"] == "COMPLETED":
# Получаем дату заказа из записи и преобразуем ее в объект datetime
order_date = datetime.fromisoformat(record["ordered_at"])
# Получаем название месяца из даты заказа и приводим его к нижнему регистру
month = order_date.strftime("%B").lower()
# Увеличиваем суммарные расходы за соответствующий месяц
monthly_expenses[month] += float(record["total"])

# Находим максимальный расход из всех суммарных расходов
max_expense = max(monthly_expenses.values())

# Получаем список месяцев, в которых был максимальный расход
max_months = [
month for month, expense in monthly_expenses.items() if expense == max_expense
]

# Возвращаем JSON-строку с месяцем(-ами) с максимальным расходом, отсортированных по порядку следования в году
return json.dumps({"months": sorted(max_months, key=lambda x: max_months.index(x))})


def perform_report():
"""Функция для выполнения процесса формирования отчета.

Считывает данные из входного файла, формирует отчет и выводит результат.
"""

# Открываем файл в формате JSON с данными
with open("./src/input.json", "r") as f:
data = json.load(f)

# Генерируем отчет на основе данных
report = generate_report(data)

# Выводим результат отчета
print(report)


if __name__ == "__main__":
# Выполняем функцию выполнения процесса формирования отчета.
perform_report()