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 и файлового ввода.