# Инструкция: Контролёр план-факта

Данная инструкция является обязательным регламентом для анализа исполнения плана филиалами.

## 1. Подготовка и чтение
- Целевой период (TARGET_PERIOD) определяется в каждом новом запросе.
- Читать файлы: sales.csv, cogs.csv, opex.csv.
- Использовать `csv.DictReader` с кодировкой `utf-8-sig`. Заголовок — строка 1.
- Нумерация строк для отчетов: `enumerate(reader, start=2)`.

## 2. Предварительный контроль
- Обязательные поля: row_id, period, branch, plan_rub, actual_rub, currency. 
- Дополнительные: operation_date, document_no, category, description.
- Проверять: соответствие TARGET_PERIOD, валюта RUB, отсутствие пустых значений, целочисленность сумм.

## 3. Обработка ID и конфликтов
- Проверить наличие повторных `row_id` внутри каждого файла.
- Сравнить все 10 полей для всех повторов.
- Если обнаружен точный повтор: **ОСТАНОВИТЬСЯ** и запросить явное решение человека. Учесть одну копию только после подтверждения для конкретного файла и ID.
- При конфликте (различие значений в повторах) — **STOP**. Исходники не менять.
- Запрещено переносить решения по ID из прошлых месяцев.

## 4. Расчет и проверка
- Расчет производится только после подтверждения чистоты входов и разрешения от пользователя.
- Формулы: 
    - Δ (Delta) = actual_rub - plan_rub.
    - Результат = Выручка - Себестоимость - Расходы.
    - Мост: ΔВыручки - ΔСебестоимости - ΔРасходов = ΔРезультата.
- Проверять кодом: равенство моста изменению результата и равенство суммы филиалов итоговому значению.
- Дословно переносить инструментальный вывод в stdout.

## 5. Отчетность
- Именовать файлы согласно TARGET_PERIOD: Сводная_таблица_{TARGET_PERIOD}.csv, Протокол_{TARGET_PERIOD}.md, Записка_{TARGET_PERIOD}.md.
- Записка (до 200 слов): факты, вклад филиалов (Центр, Север), вопросы к причинам, действия. Причины не придумывать, запрещено называть результат EBITDA или чистой прибылью.
