Kasb biriktirish / olib qo'yish (`employee_professions`)
Tavsif
Qabul mezonlari (DoD)
4 / 4 bajarildi
-
Nofaol biriktirishni qayta faollashtirish yangi qator YARATMAYDI (qator soni o'zgarmaydi, `active` va `assigned_at` yangilanadi)
qa-ep-06-t03-s02 · 1 о аввал
-
Oxirgi faol kasbni olib qo'yishga urinish 409 qaytaradi
qa-ep-06-t03-s02 · 1 о аввал
-
Olib qo'yilgan kasb bo'yicha eski `wage_entries` qatorlari o'zgarmaydi
qa-ep-06-t03-s02 · 1 о аввал
-
Nofaol (`active=false`) kasbni hodimga biriktirishga urinish rad etiladi
qa-ep-06-t03-s02 · 1 о аввал
O'zgargan fayllar
5 ta
-
modified
src/test/java/uz/erpbom/employees/service/EmployeeProfessionServiceTest.java -
modified
src/main/java/uz/erpbom/employees/repository/EmployeeProfessionRepository.java -
modified
src/main/java/uz/erpbom/employees/service/EmployeeProfessionService.java -
modified
src/main/java/uz/erpbom/employees/dto/EmployeeProfessionAssignRequest.java -
modified
src/main/java/uz/erpbom/employees/controller/EmployeeProfessionController.java
Izoh qoldirish
Tarix
24 yozuv
-
✎
finalize-ep-06 yangiladi
Yangilandi: pr_url
-
⇄
qa-ep-06-t03-s02 statusni o'zgartirdi Review → Bajarildi
QA qayta tekshiruv (qa-EP-06-T03-S02, 2026-08-24) — DRIFT YOPILDI, barg `done`. 1) KONTRAKTGA MOSLIK (aynan solishtirildi, openapi/v1/employees.yaml): * xato KODI: `SALARY_REQUIRED` — EmployeeProfessionService.java:49 (CODE_SALARY_REQUIRED) = kontrakt :2418 va :2435 misoli. Aynan mos, "yaqin lekin boshqacha" emas. * HTTP statusi: BusinessConflictException -> GlobalExceptionHandler.java:96-98 respond(HttpStatus.CONFLICT) = 409. Kontrakt POST 409 -> $ref ProfessionAssignConflict (:2412-2419). Mos. * javob SHAKLI: ErrorResponse (code, message, request_id) — `fields` @JsonInclude(NON_NULL) sabab 409 da UMUMAN chiqmaydi; kontrakt common.yaml ErrorResponse required [code, message, request_id] va salary_required misolida `fields` yo'q. Mos. * message matni ham kontrakt misoli bilan bir xil: "Oylik kasb biriktirish uchun avval maosh belgilanishi shart" (:2436). * Dublikat yozilmagan: EmployeeSalaryRepository.findByEmployeeId (S01) qayta ishlatilgan; EmployeeService dagi variant so'rov tanasidagi salary'ni, bu yerdagisi DB qatorini tekshiradi (turli manba — dublikat emas). 2) GATE HADDAN TASHQARI QATTIQ EMAS (mustaqil isbot): * ijobiy tarmoq testi BOR — assigningMonthlyProfessionWithExistingSalarySucceeds (Test:239-263): maosh 3500000.00 bo'lgan hodimga `monthly` kasb muvaffaqiyatli biriktiriladi (active=true, wage_type=monthly, 1 qator). * bundan tashqari AC2848/2849/2850/2851 testlarining HAMMASI `piece_rate` kasb + maoshsiz hodim bilan ishlaydi va yashil qolmoqda -> gate `piece_rate` yo'lini bloklamayotgani amalda tasdiqlangan (shart: wage_type == "monthly" && salary yo'q — EmployeeProfessionService.java:130-136). 3) MUSTAQIL MUTATSIYA (M5): EmployeeProfessionService.java:74 dagi `requireSalaryIfMonthlyProfession(employeeId, profession);` chaqiruvi olib tashlandi -> target/classes/.../EmployeeProfessionService.class O'CHIRILDI -> qayta kompilyatsiya -> javap TASDIQLADI: `assign` ichida chaqiruv 0 ta, ammo private metod klassda hali bor (o'lik kod) => klass haqiqatan mutatsiyalangan manbadan qayta kompilyatsiya qilingan, eski .class emas -> TEST YIQILDI: assigningMonthlyProfessionWithoutCurrentSalaryIsRejectedWithSalaryRequired (Test:232 "Expecting code to raise a throwable"), Tests run: 7, Failures: 1 -> `git checkout --` bilan TIKLANDI, javap'da chaqiruv qaytdi (1 ta). 4) REGRESSIYA: flock ... mvn -Dtest=EmployeeProfessionServiceTest test -> Tests run: 7, Failures: 0, Errors: 0, BUILD SUCCESS (tiklashdan keyin). AC2848-2851 qayta tekshirilmadi (oldingi turda mutatsiya bilan tasdiqlangan, o'zgarmagan). Kod QA tomonidan o'zgartirilmadi — bargning fayllari HEAD (509251e) bilan bir xil; docs/ va openapi/ ga tegilmadi.
-
✎
coder-ep-06-t03-s02 yangiladi
Yangilandi: commit_sha
-
⇄
coder-ep-06-t03-s02 statusni o'zgartirdi Ishlanyapti → Review
-
⇄
coder-ep-06-t03-s02 statusni o'zgartirdi Tayyor → Ishlanyapti
-
📄
coder-ep-06-t03-s02 fayllarni qayd etdi
2 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-06-t03-s02 statusni o'zgartirdi Review → Ishlanyapti
QA (qa-EP-06-T03-S02) — 4 mezon MUSTAQIL tasdiqlandi (mutatsiya bilan), LEKIN kontrakt drifti uchun QAYTARILDI. TEST: flock ... mvn -Dtest=EmployeeProfessionServiceTest test -> Tests run: 5, Failures: 0, Errors: 0 (baseline yashil, BUILD SUCCESS). MUTATSIYA TEKSHIRUVI (har biri: manba buzildi -> target/classes/.../EmployeeProfessionService.class O'CHIRILDI -> qayta kompilyatsiya -> javap bilan bytecode'da mutatsiya TASDIQLANDI -> test yiqildi -> git checkout -- <fayl> bilan TIKLANDI): AC2848 — assign() dan findFirstByEmployeeIdAndProfessionIdOrderByIdDesc olib tashlandi (javap: assign ichida faqat newAssignment chaqiruvi qoldi) -> KILLED: Test:122 "expected: 3L but was: 5L" (test qator id sini solishtiradi, faqat "xato chiqmadi" emas). AC2849 — activeCount <= 1 -> <= 0 (javap: lconst_1 -> lconst_0) -> KILLED: Test:146 "Expecting code to raise a throwable". AC2850 — unassign() ga "UPDATE wage_entries SET amount = 0 WHERE employee_id=? AND profession_id=?" qo'shildi (javap: ldc "UPDATE wage_entries ...", Query.executeUpdate) -> KILLED: Test:179 "expected: 18000.00 but was: 0.00". Demak test HAQIQIY wage_entries qatorini yaratadi (qty 12.0000 x rate 1500.00 = amount 18000.00) va MAZMUNINI solishtiradi — bo'sh jadvalda "0 == 0" EMAS. AC2851 — PROFESSION_INACTIVE gate'i olib tashlandi (javap: assign ichida Profession.getActive chaqiruvi 0 ta; tiklangach yana 1 ta) -> KILLED: Test:201 "Expecting code to raise a throwable". Tiklashdan keyin baseline qayta yashil (5/5). QAYTARISH SABABI — KONTRAKT DRIFTI (muzlatilgan openapi/v1/employees.yaml): * employees.yaml assignEmployeeProfession description (~791-793) VA components/responses/ProfessionAssignConflict (2412-2419, misol 2433-2437) — POST 409 aynan shu $ref'ga tayanadi — `409 SALARY_REQUIRED` ni NORMATIV qilib belgilaydi: `monthly` kasb biriktirilayotganda hodimda joriy maosh (employee_salaries) bo'lmasa 409. * src/main/java/uz/erpbom/employees/service/EmployeeProfessionService.java:69-92 (assign) `profession.getWageType()` ni UMUMAN o'qimaydi va employee_salaries ga qaramaydi -> monthly kasb maoshsiz hodimga 201 bilan biriktirilib ketadi. POST endpoint AYNAN shu bargda yozilgan, demak kontraktga muvofiqligi shu bargning javobgarligi. * Bu spec bo'shlig'i EMAS va bog'liqlik ham to'siq emas: qoida 9 mantiqi EmployeeService.java:222-228 (requireSalaryIfMonthlyProfessionPresent) da ALLAQACHON bor, EmployeeSalaryRepository.findByEmployeeId (S01) ham mavjud. Kerak: assign() ichida "monthly" + maosh qatori yo'q -> BusinessConflictException("SALARY_REQUIRED"), + shu holat uchun test. * Eslatma (defekt EMAS): GET /employees/{id}/professions (listEmployeeProfessions) bu bargda yo'q — u EP-06-T03-S04 (EmployeeController) zonasi, to'g'ri qoldirilgan. CROSS-CUTTING (o'tdi): @Transactional ikkala metodda; hard-delete yo'q (unassign -> active=false, tarix saqlanadi); employee o'qishda deleted_at IS NULL; tenant_id/schema almashtirish mexanikasi qo'shilmagan (AR-1); yo'l/metod/maydon nomlari va 201/204/404/409 kodlari kontrakt bilan mos (SNAKE_CASE naming strategiyasi); permission profession.assign (org_node) seed'da bor; parol/token log'ga yozilmaydi. Kod QA tomonidan O'ZGARTIRILMADI — barcha mutatsiyalar tiklandi (git status: bu bargning 5 fayli HEAD bilan bir xil). docs/ va openapi/ ga tegilmadi.
-
✓
qa-ep-06-t03-s02 qabul mezonini belgiladi
✓ Nofaol (`active=false`) kasbni hodimga biriktirishga urinish rad etiladi
-
✓
qa-ep-06-t03-s02 qabul mezonini belgiladi
✓ Olib qo'yilgan kasb bo'yicha eski `wage_entries` qatorlari o'zgarmaydi
-
✓
qa-ep-06-t03-s02 qabul mezonini belgiladi
✓ Oxirgi faol kasbni olib qo'yishga urinish 409 qaytaradi
-
✓
qa-ep-06-t03-s02 qabul mezonini belgiladi
✓ Nofaol biriktirishni qayta faollashtirish yangi qator YARATMAYDI (qator soni o'zgarmaydi, `active` va `assigned_at` yangilanadi)
-
⇄
coder-ep-06-t03-s02 statusni o'zgartirdi Ishlanyapti → Review
-
✎
coder-ep-06-t03-s02 yangiladi
Yangilandi: branch, commit_sha
-
✓
coder-ep-06-t03-s02 qabul mezonini belgiladi
✓ Nofaol (`active=false`) kasbni hodimga biriktirishga urinish rad etiladi
-
✓
coder-ep-06-t03-s02 qabul mezonini belgiladi
✓ Olib qo'yilgan kasb bo'yicha eski `wage_entries` qatorlari o'zgarmaydi
-
✓
coder-ep-06-t03-s02 qabul mezonini belgiladi
✓ Oxirgi faol kasbni olib qo'yishga urinish 409 qaytaradi
-
✓
coder-ep-06-t03-s02 qabul mezonini belgiladi
✓ Nofaol biriktirishni qayta faollashtirish yangi qator YARATMAYDI (qator soni o'zgarmaydi, `active` va `assigned_at` yangilanadi)
-
📄
coder-ep-06-t03-s02 fayllarni qayd etdi
5 ta fayl qayd etildi
-
⇄
coder-ep-06-t03-s02 statusni o'zgartirdi Backlog → Ishlanyapti
Agent ishni boshladi
-
⚑
coder-ep-06-t03-s02 ishga oldi
-
🔗
pm-agent bog'liqlik qo'shdi
→ EP-06-T03-S01
-
✦
pm-agent yaratdi
Kasb biriktirish / olib qo'yish (`employee_professions`)
Ma'lumot
- Agent
- —
- Olingan
- —
- Boshlandi
- 24.08.2026 14:52
- Tugadi
- 24.08.2026 16:28
- Baho
- 3 soat
- Spec
- erp/docs/modules/04_employees.md#2.3
- Branch
- feat/EP-06-erpbom-backend
- Commit
- 509251e69ca9
Bog'liqliklar
Agent uchun
Bu ishni AI agent quyidagicha oladi:
curl -s -X POST https://pmboard.ferp.uz/api/items/EP-06-T03-S02/claim \ -H "X-Agent: backend-dev-1"
Tugatgach:
curl -s -X POST https://pmboard.ferp.uz/api/items/EP-06-T03-S02/status \
-H "X-Agent: backend-dev-1" \
-H "Content-Type: application/json" \
-d '{"status":"review","note":"..."}'