Yetkazish haqi majburiyati + `delivery_fee` xarajati (64c)
Tavsif
Texnik ko'rsatma
Agent uchun
Qabul mezonlari (DoD)
3 / 3 bajarildi
-
Yetkazish bajarilganda ledger majburiyati VA `delivery_fee` xarajat qatori birga tug'iladi
qa-ep-12-t03-s02 · 1 о аввал
-
Avansdan taqsimlash xarajat qatorini takrorlamaydi
coder-ep-12-t03-s02 · 1 о аввал
-
08 AC44: xarajat qatorining `organization_id` = `orders.organization_id`, `amount` = `orders.delivery_fee_amount`; buyurtma bekor qilinsa hech qanday yozuv yo'q
coder-ep-12-t03-s02 · 1 о аввал
O'zgargan fayllar
8 ta
-
modified
src/test/java/uz/erpbom/orders/controller/OrderMarkDeliveredManualDeliveryFeeControllerTest.java -
modified
src/test/java/uz/erpbom/orders/controller/OrderMarkDeliveredManualControllerTest.java -
modified
src/main/java/uz/erpbom/orders/service/OrderService.java -
modified
src/main/java/uz/erpbom/orders/service/NoopDeliveryFeeAccrualPort.java -
modified
src/main/java/uz/erpbom/orders/service/DeliveryFeeAccrualPortFallbackConfig.java -
modified
src/main/java/uz/erpbom/orders/service/DeliveryFeeAccrualPort.java -
modified
src/main/java/uz/erpbom/orders/service/DeliveryFeeAccrualCommand.java -
modified
src/main/java/uz/erpbom/finance/service/FinanceDeliveryFeeAccrualAdapter.java
Izoh qoldirish
Tarix
33 yozuv
-
✎
finalize-ep-12 yangiladi
Yangilandi: pr_url
-
⇄
qa-ep-12-t03-s02 statusni o'zgartirdi Review → Bajarildi
-
💬
qa-ep-12-t03-s02 izoh qoldirdi
QA (qa-EP-12-T03-S02) — QAYTA TEKSHIRUV (commit 2d3dc74), TOR DOIRADA. Ikkala qaytarish sababi YOPILDI → done. === DEFEKT 1 (flaky) — YOPILDI === OrderMarkDeliveredManualDeliveryFeeControllerTest.java:369,377 — `static final AtomicInteger ACTIVE_PERIOD_YEAR_SEQUENCE = new AtomicInteger(9700)` + `getAndIncrement()`. `System.nanoTime()`/`Random`/joriy vaqtga tayanish `accounting_periods` yo'lidan BUTUNLAY yo'qoldi (grep bilan tekshirildi: qolgan nanoTime faqat telefon/nom suffikslarida, 349/477/801 — bu bargning nuqsoni emas). Har chaqiruv monoton va noyob yil beradi → to'qnashuv strukturaviy jihatdan imkonsiz. O'ZIM KETMA-KET 2 MARTA YURGIZDIM (bloklovchi, flock ostida, izolyatsiyalangan worktree /tmp/qa2-EP-12-T03-S02, HEAD 2d3dc74, har safar `rm -rf target/surefire-reports`): 1-yurish: Tests run: 5, Failures: 0, Errors: 0 (50.22 s) 2-yurish: Tests run: 5, Failures: 0, Errors: 0 (53.15 s) Ordering xavfi ham yo'q: `deactivateAllPeriods()` faqat yarim holat testi boshida, qolgan har test o'z `insertActivePeriod()` ini chaqiradi. === DEFEKT 2 (mezon 5334, «bitta tranzaksiyada») — YOPILDI === Yangi test `markDeliveredManualWithoutActivePeriodRollsBackLedgerEntryTooNoPartialState` (253-311) TAUTOLOGIK EMAS — exception TURINI emas, DB ni o'qiydi: * `readOrderStatus(orderId)` = 'delivering' (holat o'tishi ham qaytgan); * `countDeliveryFeeAccrualLedgerEntries(orderId)` = 0 (SELECT count(*) FROM ledger_entries WHERE source_type='delivery_fee_accrual' AND source_ref_id=?); * `countDeliveryFeeExpenseEntriesByOrganization(f.organizationId())` = 0 — MUSTAQIL manbadan (expense_categories JOIN, source_ref_id ga tayanmasdan, chunki ledger qatori umuman yo'q); * javob 500/INTERNAL_ERROR. ATOMIKLIK MUTANTLARI (izolyatsiyalangan worktree, javap bilan bytecode tasdiqlangan, har biri o'z yurishida): * MUTANT-D (HAL QILUVCHI, haqiqiy yarim holat): `FinanceDeliveryFeeAccrualAdapter` da aktiv davr yo'q bo'lsa `IllegalStateException` o'rniga JIM `return` — ledger qatori COMMIT bo'lib qoladi, xarajat qatori yo'q, buyurtma `delivered`. javap: `Optional.isEmpty` bytecode'da (offset 102). NATIJA: O'LDI — Tests run: 5, Failures: 1, AYNAN yangi test yiqildi (`expected: 500 INTERNAL_SERVER_ERROR but was: 200 OK`), qolgan 4 test yashil qoldi. Ya'ni test HAQIQATAN yarim holatni ushlaydi va kill'ning yagona egasi — o'sha test. * MUTANT-A (`OrderService:1944-1949` da port chaqiruvi `try/catch (RuntimeException)` ga o'raldi — xato yutildi): TIRIK QOLDI, LEKIN BU EKVIVALENT MUTANT, TEST ZAIFLIGI EMAS — dalil log'dan: `org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only` (mutant yurishida bor, baseline'da yo'q — baseline'da `IllegalStateException: Aktiv amaliyot oyi topilmadi`). Sabab: `FinanceDeliveryFeeAccrualAdapter:86 @Transactional` mavjud tranzaksiyaga QO'SHILADI, undan RuntimeException chiqqanda Spring tranzaksiyani rollback-only deb belgilaydi → chaqiruvchi xatoni yutsa ham commit paytida 500 va TO'LIQ rollback. Ya'ni kuzatiladigan xatti-harakat o'zgarmadi, yarim holat tug'ilmadi. Bu — mudofaa chuqurligi (ijobiy topilma). * MUTANT-B (`LedgerEntryService.record` → `@Transactional(REQUIRES_NEW)`): O'LDI, lekin NOANIQ sabab bilan (Tests run: 5, Failures: 3 — happy-path testlari `expected: 200 OK but was: 500`, ya'ni tashqi tranzaksiya suspend bo'lgach qulf/FK kutuvi). Yarim holatni ko'rsatmaydi; xulosa MUTANT-D ga tayandi. Xulosa: bitta ulanish/bitta tranzaksiya arxitekturasida "ledger qoladi, buyurtma qaytadi" holati faqat sun'iy ravishda erishiladi; kuzatiladigan kontraktni (500 + `delivering` + 0 + 0) yangi test qat'iy qotirib qo'ydi va realistik regressiyani (MUTANT-D) ushlaydi. === DIFF REVIZYASI (cdf17fb..2d3dc74, +108/−6, FAQAT test fayli) === O'chirilgan 6 qator: 5 tasi javadoc, 1 tasi `int year = 9600 + (int)(System.nanoTime() % 300);`. HECH BIR assertion o'chirilmagan/bo'shashtirilmagan; `@Disabled`/`@Ignore`/`assumeTrue`/`assumptionThat` YO'Q (grep bilan tasdiqlandi); test soni 4 → 5 (kuchaygan). Main/produksiya kodi TEGILMAGAN. === HOLAT === Mutantlar tozalandi: worktree o'chirildi, `git grep -n MUTANT HEAD` BO'SH, asosiy daraxt `git status` toza, HEAD = 2d3dc74. Oldingi tekshiruvdagi natijalar KUCHDA: 5335/5336 o'tgan, 6/6 mutant o'lgan, Noop fallback defekt emas, naqsh 64b bilan izchil. Mezon 5334 → is_met=true. Barg → done.
-
✓
qa-ep-12-t03-s02 qabul mezonini belgiladi
✓ Yetkazish bajarilganda ledger majburiyati VA `delivery_fee` xarajat qatori birga tug'iladi
-
⇄
coder-ep-12-t03-s02 statusni o'zgartirdi Ishlanyapti → Review
-
✓
coder-ep-12-t03-s02 qabul mezonini belgiladi
✓ Yetkazish bajarilganda ledger majburiyati VA `delivery_fee` xarajat qatori birga tug'iladi
-
✎
coder-ep-12-t03-s02 yangiladi
Yangilandi: commit_sha
-
📄
coder-ep-12-t03-s02 fayllarni qayd etdi
1 ta fayl qayd etildi
-
⚑
coder-ep-12-t03-s02 ishga oldi
-
💬
qa-ep-12-t03-s02 izoh qoldirdi
QA (qa-EP-12-T03-S02) — QAYTARILDI. Kod mantiqan TO'G'RI va mutatsiyaga chidamli, lekin ikkita test-darajasidagi nuqson bor. === 1. FLAKY BASELINE (bloklovchi) === src/test/java/uz/erpbom/orders/controller/OrderMarkDeliveredManualDeliveryFeeControllerTest.java:307 int year = 9600 + (int) (System.nanoTime() % 300); insertActivePeriod() shu klassda 3 marta chaqiriladi (111, 163, 197-satrlar) va uchalasi BITTA Testcontainers konteynerida. 300 lik diapazondan 3 tortish -> to'qnashuv ~1%; MENING BIRINCHI o'lchovimda ro'y berdi: markDeliveredManualDerivesAmountAndOrganizationFromOrderNotConstants:111->insertActivePeriod:309 PSQLException: duplicate key value violates unique constraint "uq_accounting_periods_period_year_period_month" Detail: Key (period_year, period_month)=(9762, 1) already exists. Ya'ni AC5334/AC5336 ning YAGONA hosila (amount/organization_id) testi tasodifan yiqiladi. Ikkinchi yurishda yashil bo'ldi — reproduksiya tasodifiy, sabab deterministik. Naqsh: OrderAssignDriverControllerTest.java:786 — 9200 + nanoTime % 900 va faqat BITTA chaqiruv. TUZATISH: har chaqiruvda KAFOLATLANGAN unikal yil (statik AtomicInteger hisoblagich) yoki mavjud aktiv davrni qayta ishlatish. nanoTime%N ni qoldirmang. === 2. AC5334 ning "BITTA TRANZAKSIYADA" talabi TESTLANMAGAN (mezon 5334 -> is_met=false) === Struktura to'g'ri: OrderService.java:1834 @Transactional markDeliveredManual + FinanceDeliveryFeeAccrualAdapter.java:86 @Transactional (REQUIRED, chaqiruvchi tranzaksiyasiga qo'shiladi). LEKIN spec'ning "ikkalasi bitta tranzaksiyada" (08 qoida 64c, 06 §8.5 4-band (c)) talabi — ikkinchi yozuv yiqilganda birinchisi qaytishi — HECH BIR test bilan isbotlanmagan; hozirgi 7 testning hech biri yarim holatni tekshirmaydi. Injektsiya nuqtasi kodning O'ZIDA tayyor: FinanceDeliveryFeeAccrualAdapter.java:112-116 aktiv davr bo'lmasa IllegalStateException tashlaydi (ledger qatori YOZILGANDAN KEYIN). KERAKLI TEST: insertActivePeriod() CHAQIRILMASDAN ko'cha shafyorli (external_driver_id + delivery_fee_amount) delivering buyurtmani POST /orders/{id}/mark-delivered-manual qilish va assert qilish: (a) javob 5xx; (b) SELECT count(*) FROM ledger_entries WHERE source_type='delivery_fee_accrual' AND source_ref_id=<orderId> = 0; (c) SELECT count(*) FROM expense_entries WHERE source_type='ledger_entries' AND source_ref_id=... = 0; (d) orders.status hamon 'delivering' (butun tranzaksiya qaytdi, yarim holat yo'q). === 3. Kichik (majburiy emas, lekin AC44 matnida bor) === ledger qatorining counterparty_account_id = AYNAN o'sha shafyor varaqasi ekani to'g'ridan-to'g'ri assert qilinmagan; bilvosita qamrov bor (externalDriverAccountId helper, 399-407, CAPTURE#17 testida). Bitta assert qo'shilsa yopiladi. === NIMA O'TDI (qayta ishlash SHART EMAS) === * Noop fallback DEFEKT EMAS. NoopDeliveryFeeAccrualPort @Component EMAS; u faqat DeliveryFeeAccrualPortFallbackConfig:24-28 dagi @Bean @ConditionalOnMissingBean(DeliveryFeeAccrualPort.class) orqali tug'iladi. FinanceDeliveryFeeAccrualAdapter:68 — oddiy @Component, profil/property sharti YO'Q; @ComponentScan bean ta'riflari @Bean shartlaridan OLDIN ro'yxatdan o'tadi (deterministik). EMPIRIK tasdiq: testlar portni mock QILMAYDI, DB dan haqiqiy ledger_entries/expense_entries qatorlarini o'qiydi, va adapter ichiga kiritilgan mutantlar testlarni yiqitadi -> wire'langan bean AYNAN haqiqiy adapter. * Naqsh chetga chiqmagan: 64b (PickingWageExpensePort + FinancePickingWageExpenseAdapter) bilan AYNI port/adapter naqshi; 64a (PayrollRunService:860) modul ichida bo'lgani uchun portsiz — izchil. * MUTATSIYA (izolyatsiyalangan git worktree, javap bilan bytecode tasdiqlangan): 6/6 O'LDI — (1) amount -> konstanta 100000.00; (2) organization_id -> 1L; (3) .negate() olib tashlandi (javap: negate=0); (4) expense_entries yozuvi o'chirildi (ikkala klassda ham o'ldi); (5) `external_driver_id != null` sharti olib tashlandi; (6) source_ref_id = ledgerId+1000 (javap: ladd=1). Tirik qolgan mutant YO'Q. * Fixture xilma-xilligi ROST: orgA != orgB (alohida insertChildOrganization), summalar 187500 / 62300 / 150000 / 95000 / 45000 — haqiqatan farqli. * 5335 (CAPTURE#17) OK: expense_entries ga yozadigan 12 ta joyning birortasi ham PaymentService/to'lov oqimida emas (grep: PaymentService da ExpenseEntry umuman yo'q); idempotentlik AYNAN mavjud partial unique (V42:161 uq_expense_entries_source_type_source_ref_id_active) + findFirstBySourceTypeAndSourceRefIdOrderByIdDesc — yangi mexanizm yaratilmagan. * 5336 ning "bekor qilinsa yozuv yo'q" DA'VOSI TASDIQLANDI: OrderService.cancel:1146 faqat created..picked dan ishlaydi, delivering da 409 INVALID_STATUS_TRANSITION (test 234-satr buni DB darajasida ham tekshiradi), 64c esa FAQAT markDelivered:1944 dan chaqiriladi. Qo'shimcha kod haqiqatan shart emas. * Cross-cutting: migratsiya qo'shilmagan (V42/V38/V49 va R__ seed yetarli), tenant_id yo'q, tashqi broker yo'q, log'da sir yo'q. === TEST YURISHI (bloklovchi, flock qulfi ostida, worktree /tmp/qa-EP-12-T03-S02, HEAD cdf17fb) === mvn -Dtest=OrderMarkDeliveredManualDeliveryFeeControllerTest,OrderMarkDeliveredManualControllerTest test OrderMarkDeliveredManualControllerTest ............ Tests run: 3, Failures: 0, Errors: 0 (53.01 s) OrderMarkDeliveredManualDeliveryFeeControllerTest . Tests run: 4, Failures: 0, Errors: 0 (16.80 s) Jami 7 test yashil (1-chi yurishda 1 ta flake — yuqoridagi 1-band). Mutantlar tozalandi: `git grep -n MUTANT HEAD` bo'sh, worktree o'chirildi, asosiy daraxt `git status` toza.
-
⇄
qa-ep-12-t03-s02 statusni o'zgartirdi Review → Ishlanyapti
-
✓
qa-ep-12-t03-s02 qabul mezonini belgiladi
✗ Yetkazish bajarilganda ledger majburiyati VA `delivery_fee` xarajat qatori birga tug'iladi
-
⇄
coder-ep-12-t03-s02 statusni o'zgartirdi Ishlanyapti → Review
-
✎
coder-ep-12-t03-s02 yangiladi
Yangilandi: branch, commit_sha
-
✓
coder-ep-12-t03-s02 qabul mezonini belgiladi
✓ 08 AC44: xarajat qatorining `organization_id` = `orders.organization_id`, `amount` = `orders.delivery_fee_amount`; buyurtma bekor qilinsa hech qanday yozuv yo'q
-
✓
coder-ep-12-t03-s02 qabul mezonini belgiladi
✓ Avansdan taqsimlash xarajat qatorini takrorlamaydi
-
✓
coder-ep-12-t03-s02 qabul mezonini belgiladi
✓ Yetkazish bajarilganda ledger majburiyati VA `delivery_fee` xarajat qatori birga tug'iladi
-
📄
coder-ep-12-t03-s02 fayllarni qayd etdi
8 ta fayl qayd etildi
-
⇄
coder-ep-12-t03-s02 statusni o'zgartirdi Backlog → Ishlanyapti
Agent ishni boshladi
-
⚑
coder-ep-12-t03-s02 ishga oldi
-
⚐
worker-ep-12-t03 bo'shatdi
-
🔗
pm-agent bog'liqlik qo'shdi
→ EP-12-T03-S04
-
✎
pm-agent yangiladi
Yangilandi: estimate_hours
-
⇄
pm-agent statusni o'zgartirdi Bloklangan → Backlog
Blok yechildi (2026-09-08): 08 Q67-Q70 = A — 64c producer'i to'liq aniqlandi (trigger = delivered + orders.external_driver_id; summa = orders.delivery_fee_amount; filial = orders.organization_id; bekor qilinsa yozuv yo'q). Poydevor bargi EP-12-T03-S04 (orders 2 maydon + validatsiya) qo'shildi — S02 shunga depends_on.
-
🔗
pm-agent bog'liqlik qo'shdi
→ EP-12-T03-S04
-
✎
pm-agent yangiladi
Yangilandi: description, technical_notes, estimate_hours
-
💬
unknown-agent izoh qoldirdi
SPEC TO'LIQ YOPILDI (2026-09-08) — 06_orders Q17 = A javob oldi, biznes bo'shlig'i qolmadi. delivered ni OFISDAGI XODIM belgilaydi; YANGI RULE/MEXANIZM YO'Q — mavjud order.mark_delivered_manual (08 Q5) ishlatiladi, faqat maqomi o'zgardi (ko'cha shafyorida yagona va odatiy yo'l). order.confirm_delivery bu buyurtmada qo'llanmaydi; GPS NULL, 5 km nazorati va shubhali-tasdiq bayrog'i yo'q, audit-log bor. 64c accrual aynan shu lahzada. Spec: 08 qoida 64c + §2.15 + AC42-AC44; 06 §2.1/§3/R6/R19/§7/§8.5/§10/AC21/AC22. 09_auth katalogi 140. QOLGAN ISH (spec emas): kontrakt tuzatish rejimi (external-drivers CRUD + orders ning external_driver_id/delivery_fee_amount maydonlari) -> YAML qayta import -> ready.
-
💬
unknown-agent izoh qoldirdi
SPEC QISMAN YOPILDI (2026-09-08, 08_finance Q67-Q70 = A). Uchala bo'g'in bor: (1) biriktirish — orders.external_driver_id + CHECK (o'z shafyori YOKI ko'cha shafyori); (2) summa — orders.delivery_fee_amount, biriktirishda qo'lda, external_driver_id to'lganda majburiy >0 (tarif jadvali YO'Q); (3) filial — orders.organization_id. Trigger: accrual FAQAT delivered da, bekor qilinsa majburiyat yo'q. Yozildi: 08 qoida 64c + §2.15 + AC43/AC44, 06 §2.1/R6/R19/AC21 (06_orders REOPEN). BLOKLANGANICHA QOLADI — 06_orders Q17 javobsiz: ko'cha shafyorining mobil ilovasi yo'q, buyurtmani delivered ga KIM o'tkazadi (+ 5 km GPS qo'llanadimi) aniqlanmagan; accrual aynan shu lahzaga bog'langani uchun taxmin qilinmadi.
-
⇄
worker-ep-12-t03 statusni o'zgartirdi Ishlanyapti → Bloklangan
Spec bo'shlig'i (qoida 64c ning PRODUCER'i yo'q — uch qismli, mustaqil tekshiruv bilan tasdiqlangan). (1) BIRIKTIRISH: ko'cha shafyorini buyurtmaga (yoki boshqa hujjatga) biriktiradigan maydon/jadval HECH QAYERDA yo'q — V32__orders.sql:110,145 da faqat driver_employee_id (FK->employees, R19a professions.is_driver=true, aks holda 409 DRIVER_NOT_ELIGIBLE); external_drivers (V41) jadvalining orders ga FK'si yo'q; 06_orders.md da external driver tushunchasi umuman yo'q. Tizim 'yetkazishni AYNAN ko'cha shafyori bajardi' ni bilolmaydi. (2) SUMMA: yetkazish haqi summasining manbai aniqlanmagan — picking'da picking_rates tarif jadvali bor (06_orders.md:194), yetkazishda ekvivalenti YO'Q; 08_finance.md:854 faqat prosa ('Yetkazish haqi buyurtmaga biriktiriladi'), maydon/tarif/formula ko'rsatilmagan. (3) FILIAL: expense_entries.organization_id NOT NULL (V42:61), lekin ledger_entries va counterparty_accounts da organization_id ATAYLAB yo'q (V38:82-98, 08_finance.md:153 tenant-umumiy qarori) — 64c xarajat qatorining filialini ledger qatoridan aniqlab bo'lmaydi. Kontraktda ham yo'l yo'q: avtomatik source_type'lar HTTP orqali yozilmaydi (finance.yaml:970-995 — faqat manual_adjustment). Repo bo'ylab delivery_fee_accrual producer'i yo'q (LedgerEntryService:52 konstantasi faqat validatsiya ro'yxatlarida). BU S01 (external_drivers CRUD) EMAS — S01 bitsa ham uchala bo'shliq qoladi. erp/ CLAUDE.md §5 sikli yopishi kerak (Q59/Q15 precedenti).
-
⇄
worker-ep-12-t03 statusni o'zgartirdi Backlog → Ishlanyapti
Agent ishni boshladi
-
⚑
worker-ep-12-t03 ishga oldi
-
✎
team-lead-pm yangiladi
Yangilandi: estimate_hours
-
✦
pm-agent yaratdi
Yetkazish haqi majburiyati + `delivery_fee` xarajati (64c)
Ma'lumot
- Agent
- coder-ep-12-t03-s02
- Olingan
- 1 о аввал
- Boshlandi
- 08.09.2026 04:21
- Tugadi
- 09.09.2026 05:55
- Baho
- 5 soat
- Spec
- erp/docs/modules/08_finance.md#5
- Branch
- feat/EP-12-erpbom-backend
- Commit
- 2d3dc7481950
Bog'liqliklar
Bundan oldin tugashi kerak
Agent uchun
Bu ishni AI agent quyidagicha oladi:
curl -s -X POST https://pmboard.ferp.uz/api/items/EP-12-T03-S02/claim \ -H "X-Agent: backend-dev-1"
Tugatgach:
curl -s -X POST https://pmboard.ferp.uz/api/items/EP-12-T03-S02/status \
-H "X-Agent: backend-dev-1" \
-H "Content-Type: application/json" \
-d '{"status":"review","note":"..."}'