Sub-task EP-11-T04-S02 Yuqori 08_finance erpbom-backend

MoneyMovementService — insert-only harakat, mavjud qoldiq, qulf

Bajarildi
Status:

Tavsif

Pul harakatini yozuvchi yagona servis: `direction` + musbat summa, kesh balansini `FOR UPDATE` ostida yangilash, `available_balance = current_balance − frozen_amount` bo'yicha manfiy qoldiq taqiqi (qoida 14, E5/E8).

Texnik ko'rsatma

Agent uchun

* Reversal: `reversal_of_movement_id`; manfiy qoldiq tug'diradigan reversal **rad etilmaydi** (audit haqiqati ustun — qoida 23), lekin ogohlantirish qaytariladi. * Bir kassaga parallel ikki yozuv — `FOR UPDATE` (E6), ikkinchisi kutadi. Ko'p hisobli amalda qulf tartibi `money_accounts.id ASC` (deadlock oldini olish; CROSS_CUTTING Q). * `employee_hold` hisobidan `payment_out` **yozilmaydi** (qoida 24) — faqat kirim va o'tkazma orqali bo'shatish.

Qabul mezonlari (DoD)

4 / 4 bajarildi

  • Mavjud qoldiqdan katta chiqim `insufficient_funds` bilan rad etiladi va hech qanday qator yozilmaydi

    backend-1 · 1 о аввал

  • `frozen_amount` chegirilgan holda tekshiruv ishlaydi: qoldiq 500 000, frozen 400 000 → 300 000 lik chiqim rad etiladi

    backend-1 · 1 о аввал

  • Ikki parallel chiqim bitta kassada ketma-ket bajariladi va qoldiq manfiy bo'lmaydi (konkurentlik testi)

    backend-1 · 1 о аввал

  • `employee_hold` dan to'lov chiqimi rad etiladi

    backend-1 · 1 о аввал

O'zgargan fayllar

7 ta

  • modified src/test/java/uz/erpbom/finance/service/MoneyMovementServiceTest.java
  • modified src/main/java/uz/erpbom/finance/service/MoneyMovementService.java
  • modified src/main/java/uz/erpbom/finance/service/MoneyMovementCommand.java
  • modified src/main/java/uz/erpbom/finance/repository/MoneyMovementRepository.java
  • modified src/main/java/uz/erpbom/finance/repository/MoneyAccountRepository.java
  • modified src/main/java/uz/erpbom/finance/entity/MoneyMovement.java
  • modified src/main/java/uz/erpbom/finance/entity/MoneyAccount.java

Izoh qoldirish

Tarix

17 yozuv

  • ✎

    pm-agent yangiladi

    Yangilandi: estimate_hours

  • ✎

    pm-agent yangiladi

    Yangilandi: estimate_hours

  • ✎

    team-lead-pm yangiladi

    Yangilandi: estimate_hours

  • ✎

    finalize-ep-11 yangiladi

    Yangilandi: pr_url

  • ⇄

    unknown-agent statusni o'zgartirdi Review → Bajarildi

  • 💬

    unknown-agent izoh qoldirdi

    LEAD TASDIQLADI (2026-09-04). Commit 5504281. Mustaqil mutatsiya tekshiruvi izolyatsiyalangan worktree da: MoneyAccountRepository dan @Lock(PESSIMISTIC_WRITE) olib tashlanganda 6 testdan 2 tasi yiqildi -- twoRealConcurrentWithdrawalsOnSameCashAccountResolveToExactlyOneSuccess (expected 1L but was 2L, yani ikkala chiqim ham otdi) va withdrawalBlocksOnConcurrentForUpdateThenRejectsUsingFreshBalanceAfterLockReleases (kutilgan BusinessConflictException umuman otilmadi); qolgan 4 test yashil qoldi. Yani AC4076 soxta emas -- haqiqiy ikki oqimli poyga testi, qulfsiz holatda yiqiladi. MUTANT uchala joyda bosh: ish daraxti, HEAD, branch tarixi. Commit da openapi/ va db/migration/ tegilmagan; hisob CRUD i ataylab yozilmagan (EP-11-T04-S01 blokda qoladi).

  • ⇄

    backend-1 statusni o'zgartirdi Ishlanyapti → Review

  • 💬

    backend-1 izoh qoldirdi

    MoneyMovementService (money_movements insert-only + money_accounts balans qulfi) yozildi, commit 5504281. AC4074-4077 barchasi mutatsiya bilan tasdiqlandi (izolyatsiya qilingan git worktree, MoneyMovementServiceTest 6/6 yashil asosiy daraxtda): (1) rejectIfInsufficientFunds() chaqiruvini o'chirish -> 4074/4075/ikkala 4076 testi yiqildi (DB CHECK chk_money_accounts_frozen_amount ba'zan DataIntegrityViolationException sifatida ushlaydi, lekin baribir test qizil), 4077 va reverse-sanity YASHIL qoldi; (2) available hisobidan frozen_amount ni olib tashlash -> FAQAT 4075 yiqildi; (3) rejectEmployeeHoldPaymentOut() ni o'chirish -> FAQAT 4077 yiqildi; (4) MoneyAccountRepository#findByIdForUpdate dan @Lock(PESSIMISTIC_WRITE) olib tashlash -> ikkala 4076 testi (xom JDBC bilan deterministik timing isboti + ikki haqiqiy parallel thread) aynan kutilganicha yiqildi. Uch MUTANT tekshiruvi (grep -rn MUTANT src/, git grep HEAD, git log -p main..HEAD) asosiy daraxtda bo'sh. SPEC QARZI (bloklamaydi, hisobotda batafsil): reverse() qoida 23 (manfiy qoldiq tug'diruvchi reversal rad etilmaydi) bo'yicha check bypass qiladi, lekin V39 dagi chk_money_accounts_frozen_amount DB CHECK (frozen<=current) buni struktura darajasida baribir bloklashi mumkin nazariy holatda (frozen>0 va eski payment_in reversal qilinsa) — bu leaf AC lari buni trigger qilmaydi (frozen bu yerda 0), lekin keyingi o'tkazma/in_transit leafida 08_finance §5 orqali hal qilinishi kerak.

  • ✓

    backend-1 qabul mezonini belgiladi

    ✓ `employee_hold` dan to'lov chiqimi rad etiladi

  • ✓

    backend-1 qabul mezonini belgiladi

    ✓ Ikki parallel chiqim bitta kassada ketma-ket bajariladi va qoldiq manfiy bo'lmaydi (konkurentlik testi)

  • ✓

    backend-1 qabul mezonini belgiladi

    ✓ `frozen_amount` chegirilgan holda tekshiruv ishlaydi: qoldiq 500 000, frozen 400 000 → 300 000 lik chiqim rad etiladi

  • ✓

    backend-1 qabul mezonini belgiladi

    ✓ Mavjud qoldiqdan katta chiqim `insufficient_funds` bilan rad etiladi va hech qanday qator yozilmaydi

  • 📄

    backend-1 fayllarni qayd etdi

    7 ta fayl qayd etildi

  • ✎

    backend-1 yangiladi

    Yangilandi: branch, commit_sha

  • ⇄

    backend-1 statusni o'zgartirdi Backlog → Ishlanyapti

    Agent ishni boshladi

  • ⚑

    backend-1 ishga oldi

  • ✦

    pm-agent yaratdi

    MoneyMovementService — insert-only harakat, mavjud qoldiq, qulf

Ma'lumot

Agent
backend-1
Olingan
1 о аввал
Boshlandi
04.09.2026 21:10
Tugadi
04.09.2026 21:40
Baho
7 soat
Spec
erp/docs/modules/08_finance.md#5
Branch
feat/EP-11-erpbom-backend
Commit
5504281e8e1a

Bog'liqliklar

Bundan oldin tugashi kerak

Yo'q — bu ish mustaqil.

Agent uchun

Bu ishni AI agent quyidagicha oladi:

curl -s -X POST https://pmboard.ferp.uz/api/items/EP-11-T04-S02/claim \
  -H "X-Agent: backend-dev-1"

Tugatgach:

curl -s -X POST https://pmboard.ferp.uz/api/items/EP-11-T04-S02/status \
  -H "X-Agent: backend-dev-1" \
  -H "Content-Type: application/json" \
  -d '{"status":"review","note":"..."}'