# Отчёт о работе с ИИ Для разработки использовался OpenAI Codex. Предложения ИИ обсуждались и проверялись запусками. Работа велась по этапам 12 ноября 2026 года. ИИ помогал с планированием, кодом, тестами и документацией. Этот отчёт описывает фактический ход работы. Запросы ниже пересказаны; исходные тексты собраны в [prompts.md](prompts.md). ## 1. План и правила обработки **Задача.** Разобрать требования и выбрать простое решение для CSV → очистка → SQLite → аналитика. **Решение.** Использовать стандартную библиотеку Python, SQLite и pytest. Оставить `main.py` точкой запуска, разделить чтение, очистку, отчёты и загрузку по модулям. Деньги хранить в копейках, а цену разбирать через Decimal. Подробные правила записаны в [плане](implementation_plan.md). До написания кода определили разницу между точными дублями, одинаковыми заказами после нормализации и конфликтами ID. Первоначальное описание одной причины отбраковки уточнили: у записи может быть несколько ошибок полей, но итоговый статус у неё один. ## 2. Генерация исходных данных **Задача.** Создать 1500 синтетических записей с гарантированными примерами ошибок. **Результат.** Генератор использует `Random(42)` и даты с 1 января по 31 марта 2024 года. В набор добавлены пропуски, неверные даты и числа, точный дубль, дубль с другим форматом даты и конфликт ID. Персональных данных нет. **Проверка.** Два запуска дали одинаковый CSV. Первые два теста проверили количество записей и воспроизводимость. Для тестов создано виртуальное окружение; после неудачной попытки установки через настроенный источник pytest установлен из PyPI. ## 3. Чтение и очистка **Задача.** Сохранить исходные значения и номера записей, нормализовать поля и объяснить отбраковку. **Результат.** Читатель проверяет заголовок и структуру CSV. Очистка собирает ошибки независимых полей, проверяет деньги и обрабатывает дубли в два этапа. Конфликты определяются среди валидных записей; ошибочная строка сама по себе не делает корректный заказ конфликтным. **Проверка.** Прошли 32 теста. Проверены даты, обязательные поля, деньги на границе SQLite INTEGER, переполнение выручки, дубли, конфликты и сохранность источника. Каждый исходный номер оказался ровно в одном результате: принятом или отброшенном. ## 4. Дополнительная проверка предложений ИИ **Задача.** Проверить крайние случаи и улучшить тесты без переписывания рабочей логики. **Что изменилось.** Первоначальные тесты генератора проверяли размер и повторяемость файла, но не наличие всех запланированных ошибок. Добавлена такая проверка, а также тесты неверной UTF-8, отказа доступа, многострочных полей, порядка записей и большой суммы с точностью до копейки. Список полей CSV стал общим для генератора и читателя. **Что не стали менять.** Другой ИИ предложил заменить расчёт через `as_integer_ratio()`, переименовать атрибут отбраковки и использовать `.get()` для категории. При разборе текущего кода эти замечания не подтвердились: расчёт точный, атрибуты согласованы, наличие колонки проверяет читатель. Предложения не приняли. **Проверка.** После расширения покрытия прошли 38 тестов. Ошибок существующей логики очистки новые тесты не выявили. Рабочий CSV не изменился. ## 5. Отчёт качества и экспорт **Задача.** Сохранить очищенные заказы, отклонённые записи и статистику. **Результат.** Созданы `clean_orders.csv`, `rejected_rows.csv` и `quality_report.json` в `outputs/`. CSV записываются в UTF-8 с BOM. В отбраковке сохраняются исходные поля и все причины. Итоговая причина — первая по порядку проверок; отдельные счётчики проблем могут пересекаться. **Проверка.** Прошли 40 тестов. Проверены баланс строк, несколько ошибок у записи, обратное чтение исходных значений, повторный экспорт и пустой результат. ## 6. SQLite и полный запуск **Задача.** Объединить обработку в `python main.py` и обеспечить безопасный повторный запуск. **Результат.** Заказы и дневные агрегаты полностью заменяются в одной транзакции. Агрегация выполняется в SQLite. При ошибке загрузки предыдущие данные сохраняются. Отчёты записываются после фиксации базы; при сбое программа сообщает, что база уже обновлена. **Проверка.** Прошли 45 тестов. Интеграционные проверки запускали копию проекта во временной папке: повторная загрузка, совпадение CSV с базой, откат при переполнении суммы, повреждённый вход и набор без принятых заказов. Отдельно проверен сбой экспорта после обновления базы. ## 7. SQL-аналитика **Задача.** Подготовить топ категорий, дневную динамику и поиск аномалий с сохранёнными результатами. **Уточнение по ходу работы.** В раннем плане аномалией считался рост категории более чем вдвое к предыдущему наблюдению. Затем выбрали отклонение более чем на два стандартных отклонения. После обсуждения оставили отдельный расчёт для каждой категории, а динамику — общей по всем категориям. Путь чистого CSV уточнили до `outputs/clean_orders.csv`. **Результат.** Запросы используют календарь с нулевыми днями внутри периода. Аномалии не выдаются для периода короче семи дней и при нулевой дисперсии. Метод не учитывает сезонность и может выделять обычные продажи редкой категории, поэтому результат считается поводом для проверки, а не доказательством ошибки. **Проверка.** Прошёл 51 тест. Проверены сортировка, пропущенные дни, рост и падение, постоянная выручка, короткий период, точная граница 2σ и пустая база. Тесты не изменили рабочую базу. ## 8. Итоговые проверки и комплект сдачи Подготовлены README, база, исходные и очищенные данные, отбраковка, отчёт качества, SQL-запросы и их результаты. В Git исключены окружение, кэши и секреты. Для исходного CSV закреплены окончания строк LF, база отмечена как двоичный файл. Проверка в новом окружении на Python 3.14.4 с SQLite 3.50.4 и pytest 9.2.0 воспроизвела генерацию и запуск с нуля. Все 51 тест прошли. В рабочем окружении повторные запуски дали те же строки таблиц и текстовые отчёты. `integrity_check` вернул `ok`; деньги дополнительно пересчитаны по исходным ценам через Decimal. | Результат | Значение | |---|---:| | Исходных записей | 1500 | | Принято | 1482 | | Отброшено | 18 | | Ошибки значений | 14 | | Точные / нормализованные дубли | 1 / 1 | | Конфликтующие записи | 2 | | Группы «дата + категория» | 438 | | Выручка | 1 687 705 899 копеек | | Строки результатов: топ / динамика / аномалии | 5 / 91 / 18 | Исходный CSV сохранил SHA-256: `c4b9ffd2eb24c6c79b6a3e2436f3bd348ba86696a1aeb9b7e3083af65c799c67`.