План: переход на 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/<branch>.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 — утечка финданных по ссылке).