Замечание владельца: инвентаризация стояла «Проведено» без оприходования/списания. Переделано по МойСкладу (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>
52 lines
2.7 KiB
Bash
Executable file
52 lines
2.7 KiB
Bash
Executable file
#!/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
|