`work.rework` — rad etilgan ishni ayni `work_id` bilan qayta topshirish (R11)
Tavsif
Qabul mezonlari (DoD)
4 / 4 bajarildi
-
`@RequirePermission("work.rework")` (submit rule'i bilan almashtirilmaydi)
qa-ep-07-t03-s04 · 1 о аввал
-
`is_brak=true` (terminal brak) work'ni qayta topshirishga urinish RAD etiladi (AC15)
qa-ep-07-t03-s04 · 1 о аввал
-
Rework'dan keyin ham `works` qatori bitta (test: `count = 1`), `UNIQUE(work_id)` buzilmaydi
qa-ep-07-t03-s04 · 1 о аввал
-
Rework marta soniga tavan qo'yilmagan (3 marta ketma-ket rework testi o'tadi)
qa-ep-07-t03-s04 · 1 о аввал
O'zgargan fayllar
3 ta
-
modified
src/test/java/uz/erpbom/tasks/controller/WorkReworkIntegrationTest.java -
modified
src/main/java/uz/erpbom/tasks/controller/WorkController.java -
modified
src/main/java/uz/erpbom/tasks/service/WorkService.java
Izoh qoldirish
Tarix
18 yozuv
-
✎
finalize-ep-07 yangiladi
Yangilandi: pr_url
-
⇄
qa-ep-07-t03-s04 statusni o'zgartirdi Review → Bajarildi
-
💬
qa-ep-07-t03-s04 izoh qoldirdi
QA (qa-EP-07-T03-S04) — f1964dd tekshirildi, hamma 4 mezon YOPILDI. Testlar (flock ostida, foreground, clean YO'Q): - WorkReworkIntegrationTest: Tests run 6, Failures 0, Errors 0 — BUILD SUCCESS - Regressiya WorkClaimIntegrationTest: Tests run 14, Failures 0 — BUILD SUCCESS AC3227 — WorkController.java:73 da HAQIQIY annotatsiya @RequirePermission("work.rework") (javadoc emas, kod qatori); submit (satr 58) alohida work.submit bilan qolgan, almashtirilmagan. Rule katalogda bor: R__permissions_and_currencies_seed.sql:88 ('work.rework', '07_tasks', ... 'org_node'). Xulq isboti: reworkWithSubmitPermissionOnlyIsForbidden — faqat work.submit berilgan user 403 oladi. Egalik: reworkOfAnotherEmployeesWorkIsForbidden — begona hodim 403 (WorkService.java:301 OwnershipDeniedException, action work.rework). AC3228 — WorkService.java:308-310: rejected + is_brak=true -> 409 BRAK_NOT_REWORKABLE; satr 305-307: rejected bo'lmasa 409 INVALID_STATUS_TRANSITION. Kodlar kontrakt (openapi/v1/tasks.yaml WorkReworkConflict, satr 1198+) bilan AYNAN mos. AC3229 — reworkWork YANGI works qatori yaratmaydi: ayni managed entity ustida setProductionDate/setSubmittedAt/setStatus + save (WorkService.java:314-317). Test DB darajasida isbotlaydi: SELECT COUNT(*) FROM works WHERE task_id = ? = 1 (satr 178-180) VA javobdagi work.id == workId (satr 166). AC3230 — reworkHasNoLimitOnRetryCount: 3 marta ketma-ket rework (orasida DB'da rejected'ga qaytarilib) 200 qaytaradi, oxirida works qatori baribir 1. Tavan/TTL kodi yo'q (Q12). Kontrakt qo'shimchalari (mezonlarda yo'q, tekshirildi — hammasi to'g'ri): - production_date qayta qayd etiladi (test now()-1 kun bilan tekshiradi, javobda mos keladi); - estimated_wage.is_estimate = true (EstimatedWageResponse har doim TRUE); - wage_entries ga QATOR YOZILMAYDI — DB darajasida tasdiqlandi: SELECT COUNT(*) FROM wage_entries WHERE work_id = ? = 0; - work.submitted outbox qatori ayni tranzaksiyada (ProductionOutboxRepository.enqueueIfAbsent, ON CONFLICT (dedup_key) WHERE status IN ('pending','processing') DO NOTHING), dedup_key formati V28 talabiga qat'iy mos: work.submitted:work:{id} — test pendingOutboxRow bilan DB'dan tekshiradi. MUTATSIYA TEKSHIRUVI (3/3 ushlandi, har biri teskari tahrir bilan tiklandi; git checkout/reset/stash ISHLATILMADI): (i) is_brak sharti o'chirildi -> reworkOfTerminalBrakIsRejectedWithBrakNotReworkable YIQILDI (200 + status=submitted qaytdi); (ii) rework yangi works qatori yaratadigan qilindi (yangi Work entity + save) -> reworkTransitionsRejectedToSubmittedWithoutNewWorkRow:166 (work.id != workId) VA reworkHasNoLimitOnRetryCount:211 (count != 1) YIQILDI — ya'ni AC3229 assert'lari haqiqiy tishga ega; (iii) rejected holat sharti yumshatildi -> reworkOfNonRejectedWorkIsRejectedWithInvalidStatusTransition YIQILDI (claimed work 200 bilan submitted bo'ldi). Tiklashdan keyin: reworkWork mintaqasi HEAD bilan bayt-bayt bir xil (diff bo'sh), qayta yugurtirildi — 6/6 yashil. Cross-cutting: @Transactional bor (yozuv, readOnly emas); tenant_id/schema mexanikasi qo'shilmagan (AR-1); tashqi broker/kesh yo'q, outbox biznes yozuv bilan bir tranzaksiyada (AR-3/AR-4); qty numeric(18,4) / pul numeric(18,2) scale estimateWage'da saqlangan; fizik DELETE yo'q; log'da token/parol yo'q. Eslatmalar (defekt EMAS, qaytarishga sabab emas): 1. f1964dd submitWork/enqueueWorkSubmittedEvent/estimateWage ni ham olib kelgan (S03 hududi) — S03 keyinroq 08e4410 bilan faqat DTO+testni qo'shdi. Dublikat mantiq YO'Q: rework submit bilan AYNI uch yordamchini qayta ishlatadi, production_date/outbox semantikasi ikkala yo'lda bir xil. 2. Spec §4.2 rework maqsadi 'claimed|submitted' deb yozilgan, kontrakt esa faqat 'rejected -> submitted' beradi; kod muzlatilgan kontraktga amal qilgan — to'g'ri. 3. INVALID_STATUS_TRANSITION uchun testda faqat 'claimed' kesimi bor (submitted/confirmed/void yo'q). Kod bitta shart (!"rejected".equals(status)) bo'lgani va mutatsiya (iii) uni ushlagani uchun qamrov yetarli deb qabul qilindi. 4. Tekshiruv paytida qo'shni QA agenti WorkService.java:258 (submitWork outbox chaqiruvi) ga MUTANT-QA-S03 belgili vaqtinchalik mutatsiya qo'ygan edi — bu S03 ishi, tegilmadi; rework yo'liga ta'siri yo'q. Verdikt: done.
-
✓
qa-ep-07-t03-s04 qabul mezonini belgiladi
✓ Rework marta soniga tavan qo'yilmagan (3 marta ketma-ket rework testi o'tadi)
-
✓
qa-ep-07-t03-s04 qabul mezonini belgiladi
✓ Rework'dan keyin ham `works` qatori bitta (test: `count = 1`), `UNIQUE(work_id)` buzilmaydi
-
✓
qa-ep-07-t03-s04 qabul mezonini belgiladi
✓ `is_brak=true` (terminal brak) work'ni qayta topshirishga urinish RAD etiladi (AC15)
-
✓
qa-ep-07-t03-s04 qabul mezonini belgiladi
✓ `@RequirePermission("work.rework")` (submit rule'i bilan almashtirilmaydi)
-
⇄
coder-ep-07-t03-s04 statusni o'zgartirdi Ishlanyapti → Review
-
✎
coder-ep-07-t03-s04 yangiladi
Yangilandi: branch, commit_sha
-
💬
coder-ep-07-t03-s04 izoh qoldirdi
POST /api/v1/works/{id}/rework qo'shildi (rejected -> submitted, ayni work_id, R11/UC6-a). WorkService#reworkWork submitWork bilan bir xil naqsh: resolveActingEmployee/estimateWage/enqueueWorkSubmittedEvent qayta ishlatildi (dublikat yo'q). Tekshiruv tartibi: 404 -> egalik 403 -> status!=rejected -> 409 INVALID_STATUS_TRANSITION -> is_brak=true -> 409 BRAK_NOT_REWORKABLE. work.rework rule R__permissions_and_currencies_seed.sql da allaqachon mavjud edi (yangi seed shart emas). WorkReworkIntegrationTest (6 test, yashil): ruxsat (work.submit yetarli emas), egalik, terminal brak, invalid transition, happy path (works qatori bitta + outbox + wage_entries=0), 3 marta ketma-ket rework (review yo'li bu bargda yo'qligi uchun rejected holatga DB darajasida qaytarib simulyatsiya qilindi). WorkSubmitIntegrationTest/WorkClaimIntegrationTest/WorkClaimGatingIntegrationTest/TaskGatingServiceTest hammasi yashil qoldi (regressiya yo'q).
-
✓
coder-ep-07-t03-s04 qabul mezonini belgiladi
✓ Rework marta soniga tavan qo'yilmagan (3 marta ketma-ket rework testi o'tadi)
-
✓
coder-ep-07-t03-s04 qabul mezonini belgiladi
✓ Rework'dan keyin ham `works` qatori bitta (test: `count = 1`), `UNIQUE(work_id)` buzilmaydi
-
✓
coder-ep-07-t03-s04 qabul mezonini belgiladi
✓ `is_brak=true` (terminal brak) work'ni qayta topshirishga urinish RAD etiladi (AC15)
-
✓
coder-ep-07-t03-s04 qabul mezonini belgiladi
✓ `@RequirePermission("work.rework")` (submit rule'i bilan almashtirilmaydi)
-
📄
coder-ep-07-t03-s04 fayllarni qayd etdi
3 ta fayl qayd etildi
-
⇄
coder-ep-07-t03-s04 statusni o'zgartirdi Backlog → Ishlanyapti
Agent ishni boshladi
-
⚑
coder-ep-07-t03-s04 ishga oldi
-
✦
pm-agent yaratdi
`work.rework` — rad etilgan ishni ayni `work_id` bilan qayta topshirish (R11)
Ma'lumot
- Agent
- coder-ep-07-t03-s04
- Olingan
- 1 о аввал
- Boshlandi
- 25.08.2026 14:17
- Tugadi
- 25.08.2026 14:46
- Baho
- 3 soat
- Spec
- erp/docs/modules/07_tasks.md#7
- Branch
- feat/EP-07-erpbom-backend
- Commit
- f1964dd9d239
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-07-T03-S04/claim \ -H "X-Agent: backend-dev-1"
Tugatgach:
curl -s -X POST https://pmboard.ferp.uz/api/items/EP-07-T03-S04/status \
-H "X-Agent: backend-dev-1" \
-H "Content-Type: application/json" \
-d '{"status":"review","note":"..."}'