## 🟦 TEAM-1 | Movements **Эндпоинт:** `POST /api/movements/write-off` (ADMIN only) ### Request ```json { "itemId": 1, "quantity": 10 } ``` ### Response `200` ```json { "itemId": 1, "movementId": 102, "type": "WRITE_OFF", "quantity": 10, "stockAfter": 63, "createdAt": "2026-05-28T11:30:00" } ``` ### Что сделать - `@Transactional`: проверить остаток (см. #9) → `stock.quantity -= quantity` → `INSERT INTO stock_movements` - `user_id` из `SecurityContext` - 404 если товар не найден > ⚠️ Kafka `LowStockAlertEvent` — задача KAFKA-1 (TEAM-2). Здесь без Kafka. ### Acceptance criteria - [ ] `stock.quantity` уменьшился на N - [ ] Запись в `stock_movements` с `type=WRITE_OFF` - [ ] Списание > остатка → 422 (логика в #9) - [ ] USER токен → 403
🟦 TEAM-1 | Movements
Эндпоинт:
POST /api/movements/write-off(ADMIN only)Request
{ "itemId": 1, "quantity": 10 }Response
200{ "itemId": 1, "movementId": 102, "type": "WRITE_OFF", "quantity": 10, "stockAfter": 63, "createdAt": "2026-05-28T11:30:00" }Что сделать
@Transactional: проверить остаток (см. Валидация остатков #9) →stock.quantity -= quantity→INSERT INTO stock_movementsuser_idизSecurityContextAcceptance criteria
stock.quantityуменьшился на Nstock_movementsсtype=WRITE_OFF