# План: переход на 5 живых Google-источников + ежеутренний sync **Дата:** 2026-06-01 **Контекст:** пользователь дал 5 живых Google-Sheets (первоисточники; статичные xlsx были их снимками) и потребовал рекуррентную статистику — каждое утро обновлять данные за вчера в БД. ## Источники (реестр в `app/jobs/sheet_sources.py`) | branch_code | Таблица | kind | Статус | |---|---|---|---| | bra-liman | Coin Change Liman | usdt_usdt | есть | | bra-lara | Coin Change Lara | usdt_usdt | есть | | bra-cryptodom | Crypto Dom | usd_diff + usdt_usdt (смешанный) | есть | | bra-alanya | Alanya Coinchange | usdt_usdt | 🆕 завести | | chan-cryptofiat | CRYPTOFIAT | fiat_rate | 🆕 завести | + «Сводная таблица месяц» — каноничные net/расходы/ЗП. ## Форматы строки сделки - **usdt_usdt** — `Дата|Имя клиента|Валюта|Сумма(give)|%|Валюта|Сумма(get)|Прибыль|Статус|Реферал`. Прибыль = give−get. - **fiat_rate** (CRYPTOFIAT) — `Дата|Заявки|Валюта|Сумма USDT|Курс(прод)|Сумма грн|Вход(курс)|Прибыль USDT|Статус`. give=USDT, profit=колонка «Прибыль» (уже в USDT), дата разрежена (forward-fill). - **usd_diff** (CryptoDom 2022–2023) — блочный по дням: строка-заголовок дня → строка-шапка `№|Клиент|Вход|Валюта|Сумма|Курс|Сумма USD|%|Валюта|Сумма|Статус|Разница` → строки сделок. give=Сумма USD, profit=Разница. Нужна поблочная детекция шапки. ## Блоки работ 1. **Реестр источников** — `sheet_sources.py`. ✅ сделано 2. **Headless-ingestion** — чтение книги без MCP (для cron): `export?format=xlsx` + Google-creds. **Требует решения по auth (см. ниже).** Абстракция `fetch_workbook(branch)` с 2 бэкендами: локальный файл (сейчас) / headless-URL (cron). 3. **Модель +2 отделения** — `bra-alanya`, `chan-cryptofiat` в branches (+миграция, +сидинг). CRYPTOFIAT помечаем как канал (грн-касса, курсовая прибыль). 4. **Импортёр 3 форматов** — расширить парсер (usdt_usdt уже есть; +fiat_rate, +usd_diff с поблочной шапкой). Полный backfill всех 5 через MCP-выгрузку сейчас. 5. **ЗП-политика + лист «Клиенты»** — импорт «Финансовая политика компании» (шкала) и «Клиенты» (источники+рефералы) из live вместо хардкода `LEAD_SOURCES`. 6. **Daily sync «за вчера»** — идемпотентный upsert по `external_key` (хеш строки), обновляет вчерашний день. `obmenka-sheets-sync.timer` (утро) по образцу `obmenka-tron-sync`. 7. **Дашборд под 5 отделений** — /analytics: 5 отделений, курсовой грн-канал, май 2026 по всем. Сверка со «Сводной». ## Auth для headless-cron — РЕШЕНО: вариант D (MCP через `claude -p`) MCP claude.ai привязан к claude.ai-аккаунту (токен `~/.claude/.credentials.json`, авто-рефреш), а НЕ к интерактивной сессии. Проверено: `claude -p "...get_file_metadata..." --allowedTools mcp__claude_ai_Google_Drive__* --permission-mode acceptEdits` headless работает (вернул «Alanya Coinchange», exit 0). **Механизм автосинка:** 1. `obmenka-sheets-sync.service` (systemd --user, утренний timer) → 2. headless `claude -p` скачивает 5 листов (`download_file_content` exportMimeType=xlsx → base64 → decode в `/home/user/.claude/obmenka-sheets/.xlsx`) — LLM только тянет байты; 3. детерминированный `python -m app.jobs.import_sheets --mode=daily` парсит и идемпотентно апсёртит вчерашний день (вся финлогика — обычный код). Преимущество: 0 действий пользователя (auth уже есть), без GCP/SA/publish. Риск: разлогин claude.ai на сервере → чинится повторным подключением коннектора. Отвергнуто: A (service-account — возня с GCP), B (OAuth-token — протухает), C (publish — утечка финданных по ссылке).