SellTask

Кабинет селлера: остатки Ozon и Wildberries, склад, аналитика.

Слева — все артикулы с остатком на последнюю дату stock_daily или с продажами FBO в окне выгрузки. Продажи — штуки (сумма quantity в fbo_postings). «Дни» = остаток FBO всего ÷ (продажи за выбранный период ÷ число дней); если продаж не было — «—». Колонка Заказ — план поставки по кластеру (в localStorage по магазину). Кнопка Выгрузить файл над кластером — Excel (.xlsx): шапка «Артикул; Наименование (необязательно); Количество», далее строки с заполненным заказом для этого кластера; имя файла = название кластера (для загрузки SheetJS нужен доступ к CDN). В шапке: название кластера над пятью столбцами; шапка закреплена при прокрутке вниз. Клик по подписи столбца — сортировка (↑/↓). Новый магазин: в списке магазинов пункт + Добавить магазин… — форма с Ozon Client-Id, Api-Key и slug; запись в shops.json и shop_credentials.json. После сохранения автоматически запускается первая выгрузка в фоне; при необходимости — кнопка «Выгрузить с Ozon».

Матрица: GET /api/matrix?shop_id=… · один артикул: /api/report?shop_id=…&offer_id=… · фоновая выгрузка: POST /api/shops/sync (JSON: { "shop_id": "slug" }).

Новый магазин Ozon

Контур marketplace-saas (отдельно от Telegram-бота). Идентификатор задаёт путь /opt/marketplace-saas/data/shops/id/ozon.db. Ключи — в shop_credentials.json (права 600). Выгрузки — воркеры SaaS, не Jarvise.

Новый магазин Wildberries

Один токен WB: матрица, аналитика, реклама (для рекламы — права Promotion в личном кабинете WB).