Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5.3 KiB
Перенос магазина МойСклад → ALL MARKET (с историей) — прогресс
Решение владельца 09.10: перенести ВСЁ из МойСклада с историей, перейти на ALL MARKET. Фискализации нет и в МойСкладе (не блокер), маркировка не используется.
Источник: аккаунт МойСклад, орг «FOOD MARKET» (id bb8f74d4-5eb6-11ef-0a80-106e00048af9).
Токен — ~/.food-market-secrets/moysklad.env (ТОЛЬКО ЧТЕНИЕ; в МойСклад ничего не писать).
Опыт API — ~/.fm-watchdog/ms-api-lessons.txt; код-образцы — ~/ref/fm-server-moysklad, ~/ref/sklad.
Существующий импортёр (справочники) — src/food-market.infrastructure/Integrations/MoySklad/.
Легенда: [x] готово · [~] частично · [ ] не начато.
План и статус
- Инвентаризация источника →
docs/migration-source-inventory.md(скриптscripts/migration/ms_inventory.py). Орг «FOOD MARKET», ~31k товаров, 627 контрагентов, ~110k документов, 7558 строк остатков; gap-анализ + цели сверки. - [~] Мигратор — работает на реальных данных.
- Справочники: товары 30 944, контрагенты 628 (+externalId), группы 53;
идемпотентность по
MoySkladExternalId. - Документный мигратор (сервер, фон, идемпотентный, резюмируемый) — архитектура
проверена на ПРИЁМКАХ:
MoySkladDocumentImportService+StreamDocumentsAsync(хронология order=moment,asc, expand позиций, 429/повторы, таймаут 130с),Phase41externalId на всех документах/справочниках. Приёмки переносятся ~10/с с движениями остатков; moment МСК→UTC, суммы из тиынов, поставщик по externalId, товары по externalId, агрегация позиций по товару, SaveChanges по документу. Починены 3 бага: sum как decimal («900000.0»), тяжёлый expand, дубль stocks при батче. - Остальные типы (retaildemand/loss/enter/inventory/supplier_returns/shifts/деньги) — по ТОМУ ЖЕ проверенному шаблону (следующая итерация).
- uom/склад/точка/сотрудники как отдельные справочники с externalId (пока товары на дефолтных ед.; склад — единственный склад орг).
- Справочники: товары 30 944, контрагенты 628 (+externalId), группы 53;
идемпотентность по
- Новая орг на стенде «FOOD MARKET» (простой режим), admin
foodmarket-migr@food-market.local. Демо/«Магазин у дома» не тронуты. Токен МойСклада задан в настройках орг. - Сверка →
docs/migration-reconciliation.md(цели собраны в source-inventory; после переноса документов). - Дельта-досинхронизация (updated>= МСК + удалённые).
- Производительность/надёжность (резюмируемый курсор документов).
- Runbook «день перехода» + откат.
Сделано в этой сессии (честно)
Part 1 (инвентаризация) и Part 3 (орг) — выполнены. Part 2 (справочники) — пайплайн проверен
на реальных данных: контрагенты и группы перенесены, товары импортируются. Parts 4–7
спроектированы (migration-design.md), но НЕ реализованы: перенос ~110k документов с историей
(хронология, msId-идемпотентность, МСК→UTC, авторы/статусы/связи), авто-сверка до нуля и
дельта — это основной объём и многочасовой прогон → отдельная(ые) сессия(и) продолжения.
Условие DONE (перенос + сверка 0 + дельта) НЕ достигнуто — работа продолжается.
Ключевые факты API (из ms-api-lessons + проверки)
- База
https://api.moysklad.ru/api/remap/1.2,Authorization: Bearer,Accept-Encoding: gzipобязателен. - Время moment/фильтров — МОСКОВСКОЕ (UTC+3), формат
yyyy-MM-dd HH:mm:ss. - Суммы — в ТИЫНАХ (÷100). Лимит 45 запросов/3с; таймаут ≥120с; expand только при limit≤100.
report/stock/allНЕ отдаёт нулевые остатки; номера документов повторяются по годам — ключ только id.
Что НЕ трогаем
Прод, shared-postgres, global.json, gateway nginx, sklad. В МойСклад — только чтение.