← Все проекты уровня 4
Уровень 4 · Отчёты из CSVВариант A

Отчёт по расходам

Преобразуйте CSV-реестр затрат в проверяемые итоги по категориям и месяцам.

Техническое задание

CSV и агрегация

Создайте пакетный CLI-отчётчик расходов. Команда принимает путь к входному CSV и --from/--to как необязательные включительные даты YYYY-MM-DD. Разделитель — запятая, кавычки и экранирование соответствуют стандартному CSV с двойными кавычками. Первая строка обязана содержать заголовки date, category, description, amount, currency; порядок заголовков может быть любым, но каждый должен встретиться ровно один раз. Дата — календарная дата, категория и валюта — непустые строки, сумма — десятичное число с максимум двумя знаками после запятой. Разрешены расходы от 0,00 до 1 000 000 000,00 включительно. Валюта должна быть RUB; чужие валюты отклоняются, конвертации нет.

Проверьте каждую строку и диагностируйте ошибочные записи по физическому номеру CSV-строки, включая причину. Невалидная строка пропускается, корректные записи продолжают учитываться. Неправильный заголовок или повреждённая CSV-цитата являются фатальной ошибкой и не дают частичный отчёт. Фильтр дат применяется к корректным строкам до агрегации. Вычислите общую сумму и сумму по паре месяц YYYY-MM и категория. Выведите количество записей для каждой группы. Отчёт сортируется по месяцу по возрастанию, затем по категории в лексикографическом порядке; общие итоги сортируются по категории. Разбирайте суммы в целые копейки и суммируйте целыми числами, не float, чтобы итог был точным.

CLI должен явно печатать итоги и диагностики, сохраняя разделение stdout и stderr. Если хотя бы одна строка невалидна, успешные группы всё равно печатаются, но код завершения становится ненулевым; фатальная ошибка структуры файла отчёт не печатает. Чтение только; вход не перезаписывается. README фиксирует правила, ограничения и коды выхода; тесты покрывают кавычки, границы дат, суммы и сортировку без сети.

Структура программы

В internal/expenses вынесите проверку записи, фильтр дат и денежную агрегацию в копейках. Отдельная CSV-часть читает заголовок и строки, превращая их в данные и диагностики; она не считает итоги. main.go связывает reader с агрегацией и печатает отчёт. Тесты правил принимают уже разобранные записи, без CLI и файлового ввода.

Критерии готовности

Ожидаемый результат

Результат включает модуль Go с командой, README со схемой CSV и понятным разделением ошибок строк и ошибок всего файла, а также офлайн-тесты агрегатора. В отчёте должны быть суммы и количество записей в каждой месячной категории, общие итоги и список диагностик с номерами строк.

Критерии приёмки:

  • README описывает границу CSV-reader и агрегатора; агрегатор тестируется на записях.
  • две строки одной категории в месяце дают корректную сумму и количество 2;
  • CSV-описание с запятой внутри кавычек остаётся одной записью;
  • дата на границе --from включается;
  • суммы 0,10 и 0,20 дают ровно 0,30;
  • группы всегда сортируются месяцем и категорией. Строка с неизвестной валютой диагностируется, исключается из суммы и вызывает ненулевой итоговый код при сохранении корректного отчёта. Повторный заголовок, неверные кавычки и неверная схема останавливают отчёт.

Для ориентира

Примеры входа и результата

CSV: 2026-04-02,Еда,Обед,450.25,RUB и 2026-04-03,Еда,Кофе,120.00,RUB. Итог категории за 2026-04: 570,25 ₽, 2 записи. CSV-описание «Продукты, рынок» в кавычках остаётся одним полем; дата до --from не входит в агрегаты.