# KPI Updater — ежедневное обновление CSV из Impala Скрипт запускается на рабочем компьютере с доступом к корпоративной сети (VPN): выгружает свежие KPI из Impala, перезаписывает `../drb_iliyas_kpi_2026.csv` и пушит его в ветку `pages`. Сайт ([Gitea Pages]) при открытии делает `fetch('drb_iliyas_kpi_2026.csv')`, поэтому из внешней сети видны свежие данные. ``` updater/ ├─ update_kpi.py # основной скрипт ├─ requirements.txt # зависимости (impyla и пр.) ├─ config.example.yaml # шаблон конфига -> скопировать в config.yaml ├─ run_update.bat # обёртка для Планировщика задач └─ update.log # лог (создаётся при запуске, в git не коммитится) ``` --- ## 1. Установка (один раз) > ⚠️ **Версия Python.** `impyla`/`thrift`/`thrift-sasl` стабильно ставятся на > **Python 3.10–3.12**. На системном Python 3.14 колёс может не быть и сборка > упадёт. Установите отдельный Python 3.12 и создавайте venv именно им. В папке `updater/`: ```bat REM создать виртуальное окружение (укажите путь к python 3.12, если нужно) python -m venv venv venv\Scripts\activate pip install -r requirements.txt ``` Создать конфиг и заполнить логин/пароль Impala + git-токен: ```bat copy config.example.yaml config.yaml notepad config.yaml ``` `config.yaml` уже в `.gitignore` — он **не попадёт в git**. --- ## 2. Аутентификация для пуша Пуш по расписанию должен идти без ручного ввода пароля. Два варианта: **A. Токен (рекомендуется).** В Gitea: *Settings → Applications → Generate New Token*, право `write:repository`. Вставьте его в `config.yaml` → `git.token`. Скрипт использует токен только в команде пуша, в git-конфиг он не сохраняется, а в логах маскируется. **B. Git Credential Manager.** Оставьте `git.token` пустым и один раз выполните вручную `git push origin pages`, сохранив логин/пароль в системном хранилище Windows. --- ## 3. Проверка вручную Подключитесь к VPN, затем: ```bat cd /d "путь\к\kpi-dashboard\updater" run_update.bat ``` Ожидаемо: в `update.log` появятся строки подключения, число строк, и при изменении данных — коммит и `Пуш выполнен успешно`. Если данные не менялись — `Данные не изменились`, коммита не будет. --- ## 4. Расписание (раз в сутки) Создать задачу в Планировщике Windows (ежедневно в 12:00). **Важно:** не использовать `schtasks /TR "..."` — из-за пробела в пути («Project 1») команда теряет кавычки и сохраняет действие разорванным (`...\Project`), задача падает с `0x80070002` («файл не найден») и НЕ запускается. Создавайте через PowerShell-командлеты (корректно обрабатывают пробелы). Выполнить **в PowerShell**, поправив путь: ```powershell $bat = "C:\Users\1\Desktop\QC\Vibecode\Project 1\kpi-dashboard\updater\run_update.bat" $wd = Split-Path $bat $action = New-ScheduledTaskAction -Execute $bat -WorkingDirectory $wd $trigger = New-ScheduledTaskTrigger -Daily -At 12:00 $settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -ExecutionTimeLimit (New-TimeSpan -Hours 1) Register-ScheduledTask -TaskName "KPI Dashboard Update" -Action $action -Trigger $trigger -Settings $settings -RunLevel Limited -Force ``` Проверить / запустить вручную / посмотреть действие / удалить: ```powershell schtasks /Query /TN "KPI Dashboard Update" /V /FO LIST # Last Result: 0 = успех schtasks /Run /TN "KPI Dashboard Update" schtasks /Query /TN "KPI Dashboard Update" /XML | Select-String Command,WorkingDirectory schtasks /Delete /TN "KPI Dashboard Update" /F ``` > **Условия успешного запуска:** > - ПК включён (с `-StartWhenAvailable` задача догонит пропущенный запуск). > - Поднят **VPN** — иначе ошибка подключения, данные останутся прежними. > - Файл `drb_iliyas_kpi_2026.csv` **НЕ открыт в Excel** — Excel блокирует его на > запись, и KPI-апдейтер падает с `[Errno 13] Permission denied` (код задачи `1`). > Метрики МП при этом обновятся. На следующий день, если файл закрыт, всё > догонится автоматически. --- ## Логика скрипта (кратко) 1. Читает `config.yaml`. 2. Применяет SSL monkey-patch (старые cipher suites сервера, см. `../Impala_connection.md`). 3. Подключается к `host`, при ошибке — к `fallback_host`. 4. Выполняет SQL (зашит в `update_kpi.py`, константа `SQL_QUERY`). 5. Формирует CSV **в точном формате исходника**: разделитель `;`, строки в кавычках, точка как десятичный разделитель, CRLF, сортировка по убыванию `report_period_id`, затем `entry_date`. 6. Если содержимое не изменилось — выходит без коммита. 7. Иначе: `git add` только CSV → commit → `fetch + rebase + push` в `pages` (с авто-rebase и повтором, т.к. веб-приложение тоже пушит `ai-cache.json`). Пустой результат запроса (0 строк) НЕ перезаписывает CSV — защита от стирания данных. [Gitea Pages]: https://git.vibe42.kz/kyrykbaev/kpi-dashboard/src/branch/pages