План: переход на 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=Разница. Нужна поблочная детекция шапки.
Блоки работ
- Реестр источников —
sheet_sources.py. ✅ сделано - Headless-ingestion — чтение книги без MCP (для cron):
export?format=xlsx+ Google-creds. Требует решения по auth (см. ниже). Абстракцияfetch_workbook(branch)с 2 бэкендами: локальный файл (сейчас) / headless-URL (cron). - Модель +2 отделения —
bra-alanya,chan-cryptofiatв branches (+миграция, +сидинг). CRYPTOFIAT помечаем как канал (грн-касса, курсовая прибыль). - Импортёр 3 форматов — расширить парсер (usdt_usdt уже есть; +fiat_rate, +usd_diff с поблочной шапкой). Полный backfill всех 5 через MCP-выгрузку сейчас.
- ЗП-политика + лист «Клиенты» — импорт «Финансовая политика компании» (шкала) и «Клиенты» (источники+рефералы) из live вместо хардкода
LEAD_SOURCES. - Daily sync «за вчера» — идемпотентный upsert по
external_key(хеш строки), обновляет вчерашний день.obmenka-sheets-sync.timer(утро) по образцуobmenka-tron-sync. - Дашборд под 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 — утечка финданных по ссылке).