**Руководителю — фраза для планёрки:** «В июне расхождения есть у 24 из 120 магазинов, то есть у 20%; в сводке три магазина, попавшие в обе рассылки, посчитаны дважды».

**Директору №14:** «Оба письма соответствуют данным: у магазина №14 расхождение по продажам −4,90 ₽, по возвратам +1,68 ₽; это два вида расхождений одного магазина, поэтому в сводке сети ваш магазин учитывается один раз». Направление разницы в файлах не определено, поэтому знаки сами по себе не означают недостачу или излишек.

**Аналитику:** проверены только `roster.json`, `mailings.json` и `june.jsonl`. В реестре и данных — одни и те же 120 уникальных магазинов за июнь 2025 года. Списки рассылок точно совпадают со списками магазинов с ненулевыми расхождениями.

- По продажам — 18 магазинов, по возвратам — 9.
- В обоих списках — №14, №42 и №72.
- Уникальных магазинов с расхождениями: **18 + 9 − 3 = 24**.
- Доля: **24 / 120 × 100 = 20%**. Без расхождений — 96 магазинов.
- Число 27 — сумма размеров двух списков; 22,5% арифметически соответствует этой сумме, но завышает долю магазинов на 2,5 процентного пункта.

Расчёт можно повторить, запустив Python из этой папки:

```python
import json

with open("roster.json") as f:
    roster = json.load(f)
with open("mailings.json") as f:
    mailings = json.load(f)
with open("june.jsonl") as f:
    rows = [json.loads(line) for line in f if line.strip()]

base = set(roster["store_ids"])
ids = [r["store_id"] for r in rows]
assert len(ids) == len(set(ids)) == len(base) == 120
assert set(ids) == base
assert all(r["month"] == roster["month"] == mailings["month"]
           for r in rows)

sales = {r["store_id"] for r in rows
         if r["sales_delta_kopecks"] != 0}
returns = {r["store_id"] for r in rows
           if r["returns_delta_kopecks"] != 0}

assert sales == set(mailings["sales"])
assert returns == set(mailings["returns"])

print("Оба списка:", sorted(sales & returns))
print("Магазинов:", len(sales | returns))
print("Доля, %:", len(sales | returns) / len(base) * 100)
```
