Sub-task EP-10-T03-S03 Yuqori 06_orders erpbom-backend

Narx farqi va POST /orders/{id}/reprice (R16)

Bajarildi
Status:

Tavsif

Qabul ekranida joriy narx bilan snapshot farqi ko'rsatiladi; admin ixtiyoriy ravishda yangi narxga o'tkazadi.

Texnik ko'rsatma

Agent uchun

* (a) `unit_price` `created` da qotadi; (b) qabulda tizim joriy narx bilan SOLISHTIRADI va farqni qaytaradi (bloklamaydi) — default "eski narx bilan qabul"; (c) `order.reprice` -> yangi narx, `repriced_at`, `repriced_by_user_id` va mijozga notification (log-stub); (d) `received` dan KEYIN narx hech qachon o'zgarmaydi.

Qabul mezonlari (DoD)

3 / 3 bajarildi

  • Qabul javobida qator kesimida narx farqi (eski/yangi) qaytadi va bu qabulni bloklamaydi

    qa-ep-10-t03-s03 · 1 о аввал

  • `order.reprice` dan keyin `repriced_at` to'ladi va `total_amount` qayta hisoblanadi (AC8)

    qa-ep-10-t03-s03 · 1 о аввал

  • `received` dan keyingi holatlarda reprice rad etiladi

    qa-ep-10-t03-s03 · 1 о аввал

O'zgargan fayllar

5 ta

  • modified src/test/java/uz/erpbom/orders/controller/OrderRepriceControllerTest.java
  • modified src/main/java/uz/erpbom/orders/dto/OrderPriceDiffResponse.java
  • modified src/main/java/uz/erpbom/orders/dto/OrderPriceDiffLine.java
  • modified src/main/java/uz/erpbom/orders/service/OrderService.java
  • modified src/main/java/uz/erpbom/orders/controller/OrderController.java

Izoh qoldirish

Tarix

22 yozuv

  • ✎

    finalize-ep-10 yangiladi

    Yangilandi: commit_sha, pr_url

  • ⇄

    qa-ep-10-t03-s03 statusni o'zgartirdi Review → Bajarildi

  • 💬

    qa-ep-10-t03-s03 izoh qoldirdi

    QA (qa-EP-10-T03-S03) — QAYTA TEKSHIRUV: d7a895c ✅ DONE. Tuzatish faqat test faylida (OrderRepriceControllerTest.java, +28/-14); `git diff da7a...d7a895c -- src/main/java/` BO'SH — OrderService.java o'zgarmagan, ya'ni oldingi turdagi 5 mutant (M1 total yig'indisi, M2 repriced_at, M3 holat gate'i, M4 price-diff snapshot narx, M6 outbox) uchun chiqarilgan "o'ldi" xulosasi kuchda qoladi. 1) Bazaviy yurgizish (izolyatsiyalangan worktree /tmp/qa-EP-10-T03-S03b @ d7a895c, real PG16, flock ostida, bloklovchi): OrderRepriceControllerTest 11/11, OrderReceiveControllerTest 10/10, OrderReceiveCreditGateControllerTest 12/12 — 33 test, 0 failure, 0 skipped. 2) 🔴 Avval TIRIK QOLGAN mutant qayta yurgizildi — OrderService.java:606-607 dan `line.getQty().multiply(...)` olib tashlandi. ENDI O'LDI, uchala price-diff testi bilan birdaniga: - priceDiffReportsPerLineOldAndCurrentPriceWithoutMutatingOrder: kutildi 4600500.00, chiqdi 1950333.33 - priceDiffWithNoChangedLinesReportsHasDifferenceFalse: kutildi 180000.00, chiqdi 45000.00 - priceDiffWithMissingActivePriceReturnsNullCurrentPriceAndChangedFalse (snapshot fallback yo'li): kutildi 37500.00, chiqdi 15000.00 Ya'ni qty ko'paytmasi endi asosiy yo'lda ham, fallback yo'lida ham qo'riqlangan. 3) Qo'shimcha mutant (yaxlitlash qamrovi haqiqiyligini tekshirish uchun): price-diff'da HALF_UP -> DOWN. O'LDI — kutildi 4600500.00, chiqdi 4600499.99. Ya'ni 1.5 × 333.33 = 499.995 -> 500.00 chegarasi haqiqiy raqam bilan qotirilgan, dekorativ emas. 4) Testlar haqiqiyligi (tautologiya tekshiruvi): kutilgan qiymatlar test ichida qayta hisoblanmagan, hammasi qo'lda yozilgan literal ("4600500.00", "180000.00", "37500.00") va qty ga chinakam bog'liq — yuqoridagi mutant natijalari buni tasdiqlaydi. Fixture xilma-xilligi saqlangan va kengaygan: qty 2.0000/3.0000/1.5000/4.0000/2.5000; narx oshgan (1200000->1250000), o'zgarmagan (700000), kamaygan (1000.00->333.33); snapshot total 4501500.00 va current total 4600500.00 mustaqil raqamlar. 5) @Disabled / assumeTrue / izohga olingan assertion — YO'Q. `grep -rn MUTANT src/` bo'sh, `.orig` fayl qolmadi, worktree o'chirildi, asosiy daraxtda `git status` toza. Regressiya: S01/S02 (receive + limit/overdue gate) 22 test yashil. MEZONLAR: AC3683 ✅ · AC3684 ✅ · AC3685 ✅ — hammasi bajarildi.

  • ✓

    qa-ep-10-t03-s03 qabul mezonini belgiladi

    ✓ Qabul javobida qator kesimida narx farqi (eski/yangi) qaytadi va bu qabulni bloklamaydi

  • ✎

    coder-ep-10-t03-s03 yangiladi

    Yangilandi: commit_sha

  • ⇄

    coder-ep-10-t03-s03 statusni o'zgartirdi Ishlanyapti → Review

  • 📄

    coder-ep-10-t03-s03 fayllarni qayd etdi

    1 ta fayl qayd etildi

  • ⇄

    qa-ep-10-t03-s03 statusni o'zgartirdi Review → Ishlanyapti

  • 💬

    qa-ep-10-t03-s03 izoh qoldirdi

    QA (qa-EP-10-T03-S03) — QAYTARILDI. Kod TO'G'RI, kamchilik faqat TEST QAMROVIDA (AC3683). Test natijasi (izolyatsiyalangan worktree, da8cb6b, real PG16): OrderRepriceControllerTest 11/11, OrderReceiveControllerTest 10/10, OrderReceiveCreditGateControllerTest 12/12 — 33 test, 0 failure, 0 skipped. @Disabled/assumeTrue/izohga olingan assertion YO'Q. MUTATSIYA TEKSHIRUVI (5 mutant, javap bilan bytecode tasdiqlangan): - M1 total_amount yig'indisini bitta qator bilan chekla -> O'LDI (1450500.00 kutildi, 500.00 chiqdi) - M2 order.setRepricedAt(now) olib tashlandi -> O'LDI - M3 holat gate'i olib tashlandi (received'dan keyingiga ruxsat) -> O'LDI (7 holat loop'i) - M4 price-diff'da joriy narx o'rniga snapshot narx -> O'LDI - M6 order.repriced outbox qatori yozilmaydi -> O'LDI - M5 price-diff'da current_total_amount dan qty ko'paytmasi olib tashlandi -> 🔴 TIRIK QOLDI (11 testdan hech biri yiqilmadi) NUQSON (AC3683): Fayl: src/main/java/uz/erpbom/orders/service/OrderService.java:606-607 currentTotalAmount = currentTotalAmount.add(line.getQty().multiply(effectiveCurrentPrice).setScale(2, HALF_UP)); Kontrakt (openapi/v1/orders.yaml, OrderPriceDiffResponse.current_total_amount) bu maydonga ANIQ formula beradi: "Σ qty × current_unit_price". Kod to'g'ri, LEKIN qty ko'paytmasi bitta ham test bilan qo'riqlanmagan: `line.getQty().multiply(...)` ni butunlay olib tashlab `effectiveCurrentPrice` ni qo'shsam ham 11 test yashil qoladi. Sabab — FIXTURE BIR XILLIGI: price-diff'ning uchala testida ham qty = 1.0000: OrderRepriceControllerTest.java:131, :132 (AC3683 asosiy test) OrderRepriceControllerTest.java:167 (has_difference=false) OrderRepriceControllerTest.java:183 (aktiv narx yo'q) qty=1 da `qty × narx` va `narx` farq qilmaydi, shu sabab butun ko'paytma+yaxlitlash shoxobchasi yashiringan. Bu admin qabul dialogida ko'radigan PUL raqami (R16b qarori shunga tayanadi). KUTILGAN TUZATISH (faqat test, main kodga tegilmaydi): 1) OrderRepriceControllerTest.java:131-132 fixture'ida qty ni xilma-xil qil, mas.: - changed qator: qty 3.0000, snapshot 1200000.00, joriy 1250000.00 - unchanged qator: qty 1.5000, narx 700000.00 va :140/:142 kutilgan qiymatlarni yangila: total_amount = 4650000.00, current_total_amount = 4800000.00. 2) Kamida bitta price-diff qatorida YAXLITLASH chegarasi qamralsin (reprice testidagi 1.5 × 333.33 = 499.995 -> 500.00 naqshi kabi) — CROSS_CUTTING yaxlitlash qoidasi price-diff yo'lida hozir umuman tekshirilmagan. 3) :183 (aktiv narx yo'q -> snapshot fallback) testida ham qty != 1 bo'lsin, aks holda fallback yo'lida ham ko'paytma qo'riqlanmaydi. Tuzatgandan keyin M5 ni qayta yurgizib o'lganini tasdiqlang. O'TGAN MEZONLAR: - AC3684 ✓ — 3 qator (narx oshgan/kamaygan/o'zgarmagan), qty 2.0000/1.0000/1.5000, yaxlitlash 1.5 × 333.33 = 499.995 -> 500.00; total_amount 1450500.00 DB'da ham tasdiqlangan; repriced_at + repriced_by_user_id to'ladi; order.repriced outbox qatori ayni tranzaksiyada (dedup_key `order.repriced:order:{id}`, status pending); SELLING_PRICE_MISSING'da hech bir qator yangilanmaydi va outbox ham yozilmaydi (atomiklik). - AC3685 ✓ — in_progress/ready_to_deliver/picking/picked/delivering/delivered/cancelled -> 409 INVALID_STATUS_TRANSITION, order butunlay o'zgarmaydi; created va received'da RUXSAT va holat O'ZGARMAYDI (kontrakt repriceOrder tavsifi bo'yicha to'g'ri). KONTRAKT MUVOFIQLIGI (defekt EMAS, tasdiqlandi): - SELLING_PRICE_MISSING 409 — kontrakt OrderRepriceConflict ro'yxatida BOR, o'ylab topilmagan. - `received`da reprice ruxsati — kontrakt repriceOrder tavsifida ochiq yozilgan. - price-diff ALOHIDA read-only endpoint, /receive javobi OrderDetailResponse — kontrakt shakli, AC matnidagi "qabul javobida" emas. - price-diff'da aktiv narx yo'q -> current_unit_price=null, changed=false — kontrakt so'zma-so'z. current_total_amount uchun snapshot fallback kontraktda ta'riflanmagan chekka holat (kod javodocida izohlangan) — bu qaror qabul qilinadi, lekin (3) bandi bo'yicha test bilan qotirilsin. - receive narxga UMUMAN tegmaydi (OrderService.receive ichida sellingPrice/unitPrice/totalAmount yo'q) — "qabulni bloklamaydi" strukturaviy jihatdan ta'minlangan. CROSS-CUTTING: priceDiff @Transactional(readOnly=true) ✓, reprice @Transactional + findByIdForUpdate ✓, outbox ayni tranzaksiyada (INSERT ... ON CONFLICT, tashqi broker yo'q) ✓, tenant_id/schema almashtirish yo'q ✓, order.reprice huquqi R__ seed'da + huquqsiz 403 test bilan ✓, yangi migratsiya yo'q (V32/V34 ustunlari mavjud) ✓, log'da token/parol yo'q ✓. Regressiya: S01/S02 (receive, credit/overdue gate) 22 test yashil. Worktree /tmp/qa-EP-10-T03-S03 o'chirildi; asosiy daraxtda MUTANT/.orig qolmadi, git status toza.

  • ✓

    qa-ep-10-t03-s03 qabul mezonini belgiladi

    ✗ Qabul javobida qator kesimida narx farqi (eski/yangi) qaytadi va bu qabulni bloklamaydi

  • ✓

    qa-ep-10-t03-s03 qabul mezonini belgiladi

    ✓ `received` dan keyingi holatlarda reprice rad etiladi

  • ✓

    qa-ep-10-t03-s03 qabul mezonini belgiladi

    ✓ `order.reprice` dan keyin `repriced_at` to'ladi va `total_amount` qayta hisoblanadi (AC8)

  • ⇄

    coder-ep-10-t03-s03 statusni o'zgartirdi Ishlanyapti → Review

  • 💬

    coder-ep-10-t03-s03 izoh qoldirdi

    Kontrakt hakam sifatida bajarildi (parent task promptida ko'rsatilganidek): AC3683 matni "qabul javobida qator kesimida narx farqi qaytadi" deydi, lekin muzlatilgan kontrakt (openapi/v1/orders.yaml) POST /receive javobini OrderDetailResponse deb belgilagan va unda narx-farqi maydonlari (eski/yangi/changed) YO'Q. Kontrakt buning o'rniga ALOHIDA read-only GET /api/v1/orders/{id}/price-diff (order.receive huquqi, OrderPriceDiffResponse/OrderPriceDiffLine) beradi. Shu sabab AC3683 aynan shu endpoint bilan qamrab olindi (OrderRepriceControllerTest#priceDiff* testlari); /receive javobiga narx-farqi maydoni QO'SHILMADI (muzlatilgan kontraktni buzmaslik uchun). AC3685: kontrakt reprice-ni FAQAT created YOKI received holatida ruxsat beradi (received ning O'ZIDA ruxsat, undan KEYINGI holatlar 409) — shunga mos amalga oshirildi. Migratsiya kerak bo'lmadi: repriced_at/repriced_by_user_id ustunlari (V32), order.repriced outbox event_type (V34) va order.reprice permission (R__ seed) allaqachon mavjud edi.

  • ✎

    coder-ep-10-t03-s03 yangiladi

    Yangilandi: branch, commit_sha

  • ✓

    coder-ep-10-t03-s03 qabul mezonini belgiladi

    ✓ `received` dan keyingi holatlarda reprice rad etiladi

  • ✓

    coder-ep-10-t03-s03 qabul mezonini belgiladi

    ✓ `order.reprice` dan keyin `repriced_at` to'ladi va `total_amount` qayta hisoblanadi (AC8)

  • ✓

    coder-ep-10-t03-s03 qabul mezonini belgiladi

    ✓ Qabul javobida qator kesimida narx farqi (eski/yangi) qaytadi va bu qabulni bloklamaydi

  • 📄

    coder-ep-10-t03-s03 fayllarni qayd etdi

    5 ta fayl qayd etildi

  • ⇄

    coder-ep-10-t03-s03 statusni o'zgartirdi Backlog → Ishlanyapti

    Agent ishni boshladi

  • ⚑

    coder-ep-10-t03-s03 ishga oldi

  • ✦

    pm-agent yaratdi

    Narx farqi va POST /orders/{id}/reprice (R16)

Ma'lumot

Agent
coder-ep-10-t03-s03
Olingan
1 о аввал
Boshlandi
01.09.2026 17:07
Tugadi
01.09.2026 18:08
Baho
5 soat
Spec
erp/docs/modules/06_orders.md#5
Branch
feat/EP-10-erpbom-backend
Commit
b6a7516c9f5d

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-10-T03-S03/claim \
  -H "X-Agent: backend-dev-1"

Tugatgach:

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