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

Отчёт по продажам

Сведите строки продаж по товарам и каналам, отдельно учитывая возвраты и валовую выручку.

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

CSV и правила отчёта

Напишите CLI-анализатор CSV-файла продаж. Обязательные заголовки: date, order_id, product, channel, quantity, unit_price, status. Заголовки могут идти в любом порядке, но не могут дублироваться. Используйте запятую как разделитель и стандартное CSV-экранирование двойными кавычками. Дата имеет формат YYYY-MM-DD, идентификаторы и названия непусты, quantity — положительное целое до 1 000 000, unit_price — сумма в RUB с точностью до копейки и неотрицательным значением. status принимает paid или refunded; channel — произвольное непустое значение.

Каждая строка является одной строкой позиции заказа. Вычислите валовую сумму позиции как quantity, умноженное на unit_price. Для paid включите сумму и количество в продажи. Для refunded включите стоимость и количество только в отдельную сумму возвратов; возврат не вычитается из валовых продаж. Формируйте агрегаты по месяцу, товару и каналу, показывая количество оплаченных единиц, валовую сумму и сумму возвращённых позиций. Не объединяйте одинаковые order_id: в файле может быть несколько строк одного заказа. Значения сумм храните в целых копейках. Не применяйте налоги, скидки или курсы валют.

Невалидные строки выводятся в диагностике с физическим номером и причиной, пропускаются и вызывают ненулевой итоговый статус после публикации частичного корректного отчёта. Ошибка чтения, неверные заголовки или невалидная CSV-структура файла фатальны и запрещают вывод агрегаций. Отчёт сортируется по месяцу по возрастанию, затем по товару и каналу лексикографически. Путь к входу обязателен; stdout содержит результат, stderr — диагностики. Файл не меняется. Документируйте точные определения показателей, покрывайте агрегацию, возвраты, CSV-кавычки и сортировку тестами.

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

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

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

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

Сдайте Go CLI, README с точной семантикой оплаченных и возвращённых строк, примером CSV и автономные тесты. Каждая группа должна содержать месяц, товар, канал, число оплаченных единиц, валовую сумму и сумму возвратов. Частичные данные при ошибках отдельных строк остаются полезны, но итоговый код сообщает о проблемах.

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

  • README описывает CSV-reader отдельно от правил продаж; тестируются готовые записи.
  • две оплаченные единицы по 125,50 дают 251,00 валовых продаж;
  • возврат трёх единиц по 10,00 отражается как 30,00 возвратов без уменьшения валовых продаж;
  • одинаковые ID заказа в двух строках учитываются как две позиции;
  • количество 0 и отрицательная цена диагностируются;
  • CSV-товар с запятой в кавычках читается целиком. Группы имеют детерминированный порядок. Некорректный заголовок или сломанная кавычка блокируют публикацию отчёта.

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

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

Строка paid с quantity 2 и unit_price 125.50 даёт 2 оплаченные единицы и 251.00 валовой суммы. Строка refunded с quantity 3 и unit_price 10.00 даёт 30.00 возвратов и не уменьшает показатель валовых продаж.