food-market/deploy/migrate-inventory-to-docs.sh
nns 0d44cdabaf feat(inventory): модель МойСклада — инвентаризация не двигает остатки
Замечание владельца: инвентаризация стояла «Проведено» без оприходования/списания.
Переделано по МойСкладу (docs/inventory-moysklad-reference.md):

- InventoryStatus Draft→Completed (было Posted; значение 1 то же). Инвентаризация
  остатки НЕ двигает: endpoint complete замораживает строки без движений.
- create-enter (излишки diff>0) / create-loss (недостача diff<0) — создают черновики
  Оприходования/Списания со строками разницы + ссылка InventoryDocId. Повторно нельзя (409).
- Кнопки «Применить результаты» НЕТ (поправка Mac-Claude — не одобрено владельцем).
- unpost («вернуть в черновик») отменяет проведение и удаляет связанные документы.
- post/unpost — временная совместимость для мобильного «FM Склад» (post = завершить +
  создать и провести оба документа); помечено в docs/mobile-api.md.
- Enter/Loss: поле InventoryDocId (+ миграция Phase38) + в DTO «на основании инвентаризации №…».
- InventoryResult (application) — чистая разбивка diff→излишки/недостача (unit-тесты:
  разница/сумма/только посчитанные строки/округление).
- InventoryMigrationController (dry-run/apply): старые Posted+InventoryAdjustment →
  связанные проведённые документы переметкой движений (не задваивает), с проверкой
  неизменности остатков. Скрипт deploy/migrate-inventory-to-docs.sh (backup + запуск).
- Демо-сидеры: инвентаризации теперь Completed без прямых движений.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 20:34:05 +05:00

52 lines
2.7 KiB
Bash
Executable file
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# Миграция старой модели инвентаризации (Posted + InventoryAdjustment-движения)
# в модель МойСклада: связанные ПРОВЕДЁННЫЕ Оприходование/Списание. Движения не
# задваиваются (переметка), остатки остаются неизменными (проверяется в отчёте).
#
# ПОРЯДОК: 1) backup БД 2) dry-run (отчёт) 3) --apply (реально, под каждую орг).
#
# Запуск (стенд):
# TOKEN=<admin-token-организации> BASE=https://test.admin.food-market.kz \
# bash deploy/migrate-inventory-to-docs.sh # dry-run
# ... same ... --apply # применить
#
# Backup стенд-БД (на prod-vm, где живёт food-market-stage-postgres):
# docker exec food-market-stage-postgres pg_dump -U food_market food_market \
# | gzip > ~/stage-backup-inventory-$(date +%Y%m%d-%H%M%S).sql.gz
set -euo pipefail
BASE="${BASE:-https://test.admin.food-market.kz}"
APPLY=0
[[ "${1:-}" == "--apply" ]] && APPLY=1
if [[ -z "${TOKEN:-}" ]]; then
echo "✗ Нужен TOKEN (admin-токен организации). Миграция выполняется под текущую орг." >&2
echo " Для нескольких организаций — запустить с токеном каждой." >&2
exit 1
fi
if [[ "$APPLY" -eq 1 ]]; then
echo "⚠ ПЕРЕД --apply сделайте backup стенд-БД (см. шапку скрипта)."
echo " Миграция переметит движения inventory → enter/loss и создаст проведённые документы."
echo " Остатки по товарам остаются прежними (проверяется stockUnchanged в отчёте)."
fi
URL="$BASE/api/admin/inventory-migration/run?apply=$([[ $APPLY -eq 1 ]] && echo true || echo false)"
echo "→ POST $URL"
resp=$(curl -sk -m 60 -X POST "$URL" -H "Authorization: Bearer $TOKEN" -H "Content-Length: 0")
echo "$resp" | python3 -m json.tool 2>/dev/null || echo "$resp"
# Короткий итог
echo "$resp" | python3 - <<'PY' 2>/dev/null || true
import sys, json
try:
d = json.load(sys.stdin)
except Exception:
sys.exit(0)
print(f"\nИтог: applied={d.get('applied')} candidates={d.get('candidates')} "
f"migrated={d.get('migrated')} stockUnchanged={d.get('stockUnchanged')} "
f"stockDiffRows={d.get('stockDiffRows')}")
if d.get('applied') and not d.get('stockUnchanged'):
print("✗ ВНИМАНИЕ: остатки изменились — проверьте вручную и восстановите из backup!")
PY