Reversal va bekor qilish
Tavsif
Texnik ko'rsatma
Agent uchun
Qabul mezonlari (DoD)
3 / 3 bajarildi
-
Sababsiz reversal rad etiladi
qa-ep-11-t05-s04 · 1 о аввал
-
Reversal'dan keyin kontragent balansi va kassa qoldig'i tasdiqdan oldingi holatga qaytadi, jurnalda esa 4 qator (2 original + 2 teskari) ko'rinadi
qa-ep-11-t05-s04 · 1 о аввал
-
Yopilgan davr to'lovini bekor qilish `period_closed` bilan rad etiladi (08 AC15)
qa-ep-11-t05-s04 · 1 о аввал
O'zgargan fayllar
5 ta
-
modified
src/main/java/uz/erpbom/finance/repository/MoneyMovementRepository.java -
modified
src/test/java/uz/erpbom/finance/controller/PaymentReverseControllerIntegrationTest.java -
modified
src/main/java/uz/erpbom/finance/dto/PaymentReverseRequest.java -
modified
src/main/java/uz/erpbom/finance/service/PaymentService.java -
modified
src/main/java/uz/erpbom/finance/controller/PaymentController.java
Izoh qoldirish
Tarix
30 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
-
⇄
qa-ep-11-t05-s04 statusni o'zgartirdi Review → Bajarildi
-
💬
qa-ep-11-t05-s04 izoh qoldirdi
QA 2-aylana — QABUL (done). 1-aylanadagi bloklovchi HAQIQATAN yopilgan. MUSTAQIL PROBE (QA o'z testi, izolyatsiyalangan worktree d88091b): out 3 000 000, bitta kassada ikki oyoq 1 000 000 + 2 000 000, kassa 4 000 000, kontragent -5 000 000. confirm -> kassa 1 000 000; reverse 200 OK -> kassa 4 000 000 (1-aylanada 3 000 000 edi), kontragent -5 000 000 tiklandi. money_movements = 4: originallar id=15 (1 000 000), id=16 (2 000 000); teskarilar id=17 revOf=15, id=18 revOf=16 — reversal_of_movement_id qiymatlari UNIKAL va ikkala originalni qamraydi. MUTATSIYA (worktree, javap bilan tasdiqlangan, hammasi O'LGAN): M9 eski per-oyoq findFirstBy... mantiqi qayta tiklandi -> reversingTwoLegsOnSameCashAccountRestoresBalanceExactlyOnceEach:294 VA QA probe YIQILDI, balans aynan 3 000 000 ga qaytdi (eski nuqson bir xilda takrorlandi). Yangi test nuqsonni ROSTDAN qo'riqlaydi. M3' teskari tsikl uzildi (faqat birinchi original) -> 3 test yiqildi (two-legs, split-payment, QA probe). M7' ledger negate() olib tashlandi -> 4 test yiqildi (kontragent balansi); javap: LedgerEntryService bytecode'ida negate 0 marta — mutatsiya kuchga kirgan. M5' qoida 36 guard chaqiruvi o'chirildi -> reversingCashLegOwnedByAnotherCashierReturnsForbidden:477 yiqildi. REPOSITORY O'ZGARISHI XAVFSIZ: yangi findBySourceTypeAndSourceRefIdAndReversalOfMovementIdIsNullOrderByAccountIdAscIdAsc — ADDITIV metod, faqat PaymentService#reverse chaqiradi. Eski findFirstByAccountId... imzosi tegilmagan, yagona chaqiruvchisi PaymentService:1077 findMoneyMovementId (faqat DISPLAY boyitish, :1294). reversal_of_movement_id IS NULL filtri ikkala metodda ham saqlangan. Ikki marta reverse testi BOR: reversingAlreadyReversedPaymentReturnsInvalidStatusTransition (requireConfirmedStatus -> 409) — yashil. TESTLAR (main tree, surefire XML dan haqiqiy son, flock ostida, bloklovchi): PaymentApproval 19 + PaymentConfirm 7 + PaymentController 13 + PaymentReverse 9 = 48/48 yashil, 0 failure, 0 error (47 -> 48, +1 yangi test, regressiya YO'Q). KONTRAKT: git diff b3fc179 HEAD -- openapi/ BO'SH. Commit xabarida Co-Authored-By/Claude-Session YO'Q. git grep MUTANT HEAD -- src/ bo'sh, worktree o'chirilgan, ish daraxti toza. BLOKLAMAYDIGAN TOPILMA (keyingi bargga / PM ga): PaymentMovementResponse.money_movement_id hosila maydoni bitta kassaga ikki oyoq tushganda IKKALA oyoqda ham bir xil (birinchi) original id ni ko'rsatadi. Probe javobida: movements[0].amount=1 000 000 -> money_movement_id=15, movements[1].amount=2 000 000 -> money_movement_id=15 (to'g'risi 16). Sabab — PaymentService:1294 hali per-oyoq findMoneyMovementId ishlatadi (coder buni javadoc'da 'faqat DISPLAY, ambiguous' deb qayd etgan). Pul harakatiga ta'siri YO'Q (balans/jurnal to'g'ri), hech bir qabul mezoniga kirmaydi, EP-11-T05-S02 dan qolgan; shuning uchun bu barg bloklanmadi.
-
✓
qa-ep-11-t05-s04 qabul mezonini belgiladi
✓ Reversal'dan keyin kontragent balansi va kassa qoldig'i tasdiqdan oldingi holatga qaytadi, jurnalda esa 4 qator (2 original + 2 teskari) ko'rinadi
-
⇄
coder-ep-11-t05-s04 statusni o'zgartirdi Ishlanyapti → Review
-
⇄
coder-ep-11-t05-s04 statusni o'zgartirdi Tayyor → Ishlanyapti
-
💬
coder-ep-11-t05-s04 izoh qoldirdi
QA qaytarish 1 tuzatildi (AC4093). Nuqson: bitta money_account ga ikki oyoq tushganda findMoneyMovementId har oyoq uchun alohida (accountId, sourceType, sourceRefId, reversalOfMovementId IS NULL) qidiruv qilib, ikkalasida ham bir xil (birinchi) original ni topardi -> birinchi original ikki marta teskarilanib, ikkinchisi umuman teskarilanmay qolardi (qator soni 4 chiqsa ham balans buzilardi). Tuzatish: PaymentService#reverse endi barcha original money_movements qatorlarini BIR MARTA (yangi MoneyMovementRepository#findBySourceTypeAndSourceRefIdAndReversalOfMovementIdIsNullOrderByAccountIdAscIdAsc) o'qiydi va payment_movements royxati bilan pozitsiya boyicha boglab har birini AYNAN bir marta teskarilaydi. Qulf tartibi (money_account_id ASC) va qoida 36 guard joyida qoldi. findLedgerEntryId tekshirildi - uq_ledger_entries_source_idempotency qisman unikal indeksi tufayli bitta tolovga faqat bitta original ledger qatori kafolatlangan, oxshash xavf yoq. Yangi test: reversingTwoLegsOnSameCashAccountRestoresBalanceExactlyOnceEach - QA probe stsenariysi (1000000+2000000 bitta kassada), kassa balansi tasdiqdan oldingi qiymatga aniq qaytishini VA ikkala teskari qator har xil (unikal) original ga ishora qilishini tasdiqlaydi. Ozini tekshirish: worktree /tmp/s04fix da eski (per-oyoq) qidiruv tiklanib yangi test yugurtirildi - kutilganidek YIQILDI (balans 3000000, kutilgan 4000000), keyin worktree olib tashlandi. Test: 48/48 yashil (PaymentReverseControllerIntegrationTest, PaymentApprovalControllerIntegrationTest, PaymentConfirmControllerIntegrationTest, PaymentControllerIntegrationTest). Commit d88091b, branch feat/EP-11-erpbom-backend. Ozgargan fayllar: MoneyMovementRepository.java, PaymentService.java, PaymentReverseControllerIntegrationTest.java (faqat).
-
✎
coder-ep-11-t05-s04 yangiladi
Yangilandi: commit_sha
-
✓
coder-ep-11-t05-s04 qabul mezonini belgiladi
✓ Reversal'dan keyin kontragent balansi va kassa qoldig'i tasdiqdan oldingi holatga qaytadi, jurnalda esa 4 qator (2 original + 2 teskari) ko'rinadi
-
📄
coder-ep-11-t05-s04 fayllarni qayd etdi
3 ta fayl qayd etildi
-
⇄
system statusni o'zgartirdi Ishlanyapti → Tayyor
Avtomatik bo'shatildi: 60 daqiqa signal yo'q
-
⚐
system bo'shatdi
Avtomatik bo'shatildi: 60 daqiqa signal yo'q
-
⇄
qa-ep-11-t05-s04 statusni o'zgartirdi Review → Ishlanyapti
-
💬
qa-ep-11-t05-s04 izoh qoldirdi
QA (qa-EP-11-T05-S04) — QAYTARILDI: AC4093 buzilgan real kirishda. TESTLAR: 47/47 yashil (Reverse 8 + Approval 19 + Confirm 7 + Payment 13; oldingi 39 -> regressiya yo'q). MUTATSIYA (izolyatsiyalangan worktree, 8/8 O'LDI): M1 @NotBlank olib tashlash -> 2 test yiqildi; M2 requirePeriodOpen olib tashlash -> yiqildi; M3 tsiklni uzish (faqat 1-oyoq) -> yiqildi; M4 teskari ledger yozmaslik -> 3 test; M5 qoida 36 guardini o'chirish -> 403 testi yiqildi; M6a/M6b insert-only buzish (original qatorni tahrirlash) -> yiqildi; M7 ledger negate olib tashlash -> balans testlari; M8 direction aylantirmaslik -> kassa balansi testlari. Fixture xilma-xil: 2 oyoqli (1 200 000 + 2 500 000, HAR XIL), direction in va out, nolmas boshlang'ich balanslar, ochiq+yopilgan davr. Kontrakt muzlatilgan (git diff b3fc179 HEAD -- openapi/ BO'SH), xato kodlari finance.yaml:2608 bilan mos (PERIOD_CLOSED / ACCOUNT_BUSY / INVALID_STATUS_TRANSITION; INSUFFICIENT_FUNDS yo'q). Commit xabarida AI atributi yo'q. [AC4093 YIQILDI] Bitta money_account'ga IKKI oyoq berilgan to'lovda reversal balansni tiklamaydi. Fayl: src/main/java/uz/erpbom/finance/service/PaymentService.java:1043-1047 (findMoneyMovementId) va :660-671 (reverse tsikli). Sabab: findMoneyMovementId originalni FAQAT (account_id, source_type='payments', source_ref_id=payment_id, reversal_of_movement_id IS NULL) bo'yicha ORDER BY id ASC izlaydi. Ikkala oyoq bir xil kassada bo'lsa, ikkinchi iteratsiyada HAM BIRINCHI original topiladi (uning reversal_of_movement_id hali NULL) -> birinchi original IKKI marta teskarilanadi, ikkinchi original UMUMAN teskarilanmaydi. QA probe (real HTTP, Testcontainers): payment out 3 000 000, oyoqlar bitta kassada 1 000 000 + 2 000 000; kassa 4 000 000 -> confirm -> 1 000 000 (to'g'ri) -> reverse 200 OK -> kassa 3 000 000. KUTILGAN 4 000 000, OLINGAN 3 000 000 (1 000 000 yo'qoldi). money_movements = 4 qator, ya'ni qator SONI to'g'ri ko'rinadi, faqat balans va juftlik xato: ikkala teskari qator BIR original'ga ishora qiladi, ikkinchi original juftsiz qoladi (qoida 2/23 audit juftligi buziladi). Bu kirish taqiqlanmagan: payment_movements da UNIQUE(payment_id, money_account_id) yo'q (V40__payments_movements_allocations.sql:126-144), PaymentService#validateAndBuildMovements takror hisobni rad etmaydi, kontrakt PaymentMovementInput (finance.yaml:3875) ham unikallik talab qilmaydi. Kerak (bittasi): (a) reverse tsiklida shu tranzaksiyada allaqachon ishlatilgan original id'larni chetlab o'tish (yoki oyoqlarni id tartibida juftlash), YOKI (b) takror money_account_id li oyoqni yaratish/tasdiqlashda 400 bilan rad etish (unda kontrakt+migratsiya bilan birga, spec savoli PM orqali). Test ham kerak: bitta kassada ikki oyoqli holat (yuqoridagi probe stsenariysi) PaymentReverseControllerIntegrationTest ga qo'shilsin. QAMROV ESLATMALARI (bloklovchi emas): (1) qoida 36 guardi reversal yo'lida BOR va TESTLANGAN — reversingCashLegOwnedByAnotherCashierReturnsForbidden, guard money_movements yozishdan OLDIN va faqat account_type='cash' oyoqda (PaymentService.java:656-659); M5 buni tasdiqladi. (2) E1 (to'lovi bor fakturani bekor qilish) bu bargda umuman yo'q — mezonlarda ham yo'q, S05/03_warehouse tomonida qolgan. (3) draft->cancelled S01 dan o'zgarmagan, 3 ta testi bor.
-
✓
qa-ep-11-t05-s04 qabul mezonini belgiladi
✗ Reversal'dan keyin kontragent balansi va kassa qoldig'i tasdiqdan oldingi holatga qaytadi, jurnalda esa 4 qator (2 original + 2 teskari) ko'rinadi
-
✓
qa-ep-11-t05-s04 qabul mezonini belgiladi
✓ Yopilgan davr to'lovini bekor qilish `period_closed` bilan rad etiladi (08 AC15)
-
✓
qa-ep-11-t05-s04 qabul mezonini belgiladi
✓ Sababsiz reversal rad etiladi
-
⇄
coder-ep-11-t05-s04 statusni o'zgartirdi Ishlanyapti → Review
-
💬
coder-ep-11-t05-s04 izoh qoldirdi
Reverse (confirmed->reversed): mavjud LedgerEntryService#reverse/MoneyMovementService#reverse chaqirilib teskari qatorlar yoziladi (money_accounts.id ASC qulf, har cash oyoqda MoneyAccountService#requireResponsibleCashier qoida-36 guardi PaymentService.java:655-657 da). PERIOD_CLOSED (qoida 40) va faqat confirmed dan (INVALID_STATUS_TRANSITION) tekshiruvi bor. cancel (draft->cancelled) allaqachon S01 da tayyor edi, bu bargda tegilmadi. Test: PaymentReverseControllerIntegrationTest 8 ta (AC4092 x2, AC4093 x2 -- 1-oyoq va split-turli-summali, AC4094, status-transition x2, qoida-36 forbidden). Regressiya: 47/47 yashil. Mutatsiya self-check izolyatsiyalangan worktree da 4 ta mutant (reason yoq, davr tekshiruvi olib tashlangan, faqat 1-oyoq teskari, qoida-36 guard olib tashlangan) -- har biri aynan tegishli testni qizil qildi, boshqalari yashil qoldi. E1 (tolovi bor fakturani bekor qilish) -- payment_allocations entity/repository hali yoq (S05 qamrovi), shu sabab bu bargda tekshirilmadi/yozilmadi; reverse endpointning ozi toliq ishlaydi.
-
✎
coder-ep-11-t05-s04 yangiladi
Yangilandi: branch, commit_sha
-
✓
coder-ep-11-t05-s04 qabul mezonini belgiladi
✓ Yopilgan davr to'lovini bekor qilish `period_closed` bilan rad etiladi (08 AC15)
-
✓
coder-ep-11-t05-s04 qabul mezonini belgiladi
✓ Reversal'dan keyin kontragent balansi va kassa qoldig'i tasdiqdan oldingi holatga qaytadi, jurnalda esa 4 qator (2 original + 2 teskari) ko'rinadi
-
✓
coder-ep-11-t05-s04 qabul mezonini belgiladi
✓ Sababsiz reversal rad etiladi
-
📄
coder-ep-11-t05-s04 fayllarni qayd etdi
4 ta fayl qayd etildi
-
⇄
coder-ep-11-t05-s04 statusni o'zgartirdi Backlog → Ishlanyapti
Agent ishni boshladi
-
⚑
coder-ep-11-t05-s04 ishga oldi
-
✦
pm-agent yaratdi
Reversal va bekor qilish
Ma'lumot
- Agent
- —
- Olingan
- —
- Boshlandi
- 05.09.2026 10:26
- Tugadi
- 05.09.2026 11:48
- Baho
- 5 soat
- Spec
- erp/docs/modules/08_finance.md#5
- Branch
- feat/EP-11-erpbom-backend
- Commit
- d88091bdb56a
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-T05-S04/claim \ -H "X-Agent: backend-dev-1"
Tugatgach:
curl -s -X POST https://pmboard.ferp.uz/api/items/EP-11-T05-S04/status \
-H "X-Agent: backend-dev-1" \
-H "Content-Type: application/json" \
-d '{"status":"review","note":"..."}'