Epic EP-07 Kritik 07_tasks erpbom-backend backend

07_tasks — Ishlab chiqarish tasklari (marshrut, brom, tasdiq, WIP tannarx, brak zanjiri)

Bajarildi
100% 37/37
Status:

Tavsif

Ishlab chiqarish yadrosi: yarim tayyor (`semi_finished`, Tovar1) mahsulotni **operatsiya marshruti** bo'yicha yasash. Uchta entiti — `production_runs` (bitta talab uchun sikl, WIP tannarx yig'masi), `tasks` (**1 task = 1 variant × operatsiya**) va `works` (hodimning brom qilgan ish bo'lagi, 04 accrual manbai). 🔴 Modulning o'zagi — **atomik tasdiq oqimi** (R8/Q10=A): nazoratchi `submitted` work'ni tasdiqlaganda BITTA DB tranzaksiyasida (1) 03 material FIFO `production_out` (`claimed_qty` uchun), (2) 04 ishbay accrual (`confirmed_qty` uchun), (3) sikl WIP tannarxi (material **+ mehnat**, 🔁 Q11) yoki oxirgi operatsiyada `production_in` bajariladi. Yarim natija bo'lmaydi — biror qadam yiqilsa BUTUN tranzaksiya rollback. Ikkinchi o'zak — **qisman tasdiq va brak** (Q4/Q14/Q23/Q24): 4 brom → 3 soz + 1 brak bo'lsa, ish haqi 3 donaga, material 4 donaga sarflanadi, brak qiymati tannarxga KIRMAYDI (xarajat, F7) va brak miqdori `qty_claimed` dan qaytarilib qayta brom qilinadi; keyingi operatsiyadagi brak esa BARCHA transitive predecessor tasklarni **avtomatik qayta ochadi** (R28). Uchinchi o'zak — **gating** (R20/Q20=A): operatsiya-task predecessor operatsiyalarning ayni sikldagi taski `completed` bo'lmaguncha brom qilinmaydi. Bu SAQLANADIGAN holat EMAS — brom paytidagi hosila tekshiruv (`tasks` ga yangi status QO'SHILMAYDI). Backend'da to'liq data-model + REST API + tasdiq dvigateli + outbox; web'da ishlab chiqarish sikllari, nazoratchi navbati va xarajat tafsiloti ekrani; mobil ilovada *Hodim* rolining task/brom/topshirish oqimi va nazoratchi review'i.

Texnik ko'rsatma

Agent uchun

Majburiy o'qish: erp/docs/modules/07_tasks.md (to'liq), erp/docs/00_CROSS_CUTTING.md (A valyuta, B precision, F outbox, H soft-delete, J node-lokal, K nomlash, L RBAC, O UI izoh, P scoping, Q qulflash), .claude/skills/coding/java-spring-coder/SKILL.md (backend), .claude/skills/coding/vuejs-coder/SKILL.md (web), .claude/skills/coding/flutter-coder/SKILL.md (mobil), .claude/skills/coding/postgresql/SKILL.md, .claude/skills/coding/swagger/SKILL.md (T00 uchun). 🔴 SCOPING (§3 "Tenant doirasi", CROSS_CUTTING P): * `tasks` va `production_runs` — **node-lokal**: `organization_id` FK BOR va OLIB TASHLANMAYDI (R17 shunga tayanadi). * `works` da `organization_id` YO'Q — `task_id` orqali meros oladi (denormalizatsiya ATAYLAB kiritilmagan). * `tenant_id` ustuni HECH QAYERDA qo'shilmaydi (AR-1). * Marshrut/resept o'qishlari (`variant_operations`, `variant_operation_predecessors`, `recipe_lines`, `recipe_versions`, `product_variants`) — **tenant-umumiy**: so'rovlarda org-shart YOZILMAYDI. Aksincha `piece_rates`, `profession_norms`, `warehouses` o'qishlarida `organization_id = tasks.organization_id` sharti MAJBURIY. 🔴 ENUM naqshi: native ENUM EMAS — `varchar(N) NOT NULL DEFAULT ...` + `CHECK (col IN (...))` (V12/V17/V19 bilan bir xil, postgresql skill §6). 🔴 PRECISION (CROSS_CUTTING B): miqdor — `numeric(18,4)`; pul/tannarx — `numeric(18,2)`. Wire formatda pul/miqdor — **string decimal** (mavjud kontrakt qoidasi). 🔴 QULFLASH (CROSS_CUTTING Q, §11): barcha qulflar TRANZAKSIYA DOIRASIDA. Brom: `SELECT ... FOR UPDATE` `tasks` qatoriga (over-claim poygasi). Tasdiq: `tasks` + `production_runs` qulflanadi; sikl darajasida kerak bo'lsa `pg_advisory_xact_lock(production_run_id)`. `LISTEN/NOTIFY` v1 da ISHLATILMAYDI. 🔴 TARTIB MUHIM (R8/F5): accrual (04) → WIP yangilanishi (07). Teskari tartibda `labor_cost_snapshot` bo'sh/eski qiymat bilan yoziladi. `WageAccrualPort` javadoc'i buni alohida ta'kidlaydi. 🔴 MATERIAL BIR MARTA (R13): `production_out` faqat PIROVARD natijada — `confirmed` yoki TERMINAL brak (`rejected` + `is_brak=true`) da, miqdor = **`claimed_qty`** (brak dona materiali ham sarflangan). `claimed`/`submitted`/rework-uchun-`rejected` da ombor O'ZGARMAYDI. 🔴 SoD (R24): `works.employee_id` ga bog'langan hodimning user'i `reviewed_by_user_id` bo'la OLMAYDI — o'z ishini o'zi tasdiqlash taqiqlanadi (`403`/`409`, AC16). 🔴 EGALIK RAD ETISHI: EP-04-T12 markaziy handleri (`OwnershipDeniedException` → `auth_logs` ga sinxron `deny`) SHU EPICDA HAM ishlatiladi — qo'lda `auditService.log(...)` yozilmaydi.

Qabul mezonlari (DoD)

0 / 22 bajarildi

  • Migratsiyalar V24..V28 toza bazada va V23 gacha to'ldirilgan bazada xatosiz o'tadi

  • AC1: buyurtma/qo'lda talab bo'yicha `production_runs` + marshrutdagi HAR operatsiya uchun `status=new` task yaratiladi va `recipe_version` snapshot bog'lanadi

  • AC2: hodim faqat `active` statusi, `active` kasbi, predecessor operatsiya `completed` va shu kasbda band-task yo'qligida brom qila oladi; bitta brom `<= norm_per_day`; over-claim bloklanadi

  • AC3: `submitted -> confirmed` da AYNAN BITTA `wage_entries` yoziladi (`UNIQUE(work_id)`), `qty = confirmed_qty`; `rejected`/`void` da hech narsa yozilmaydi

  • AC4: `production_in` faqat OXIRGI operatsiya yakunida, BIR MARTA, target = `semi_finished` ombor; oraliq operatsiyalar omborga hech narsa qo'shmaydi

  • AC5: partiya `unit_cost` = material FIFO + ishbay mehnat (`wip_cost / required_qty`); 200 000 material + 50 000 ishbay -> 250 000; `Sum(works.labor_cost_snapshot)` = shu sikl bo'yicha `Sum(wage_entries.amount)`; oylikbay mehnat QO'SHILMAYDI

  • AC6: material yetmasa `confirmed` bloklanadi, butun operatsiya rollback, `stock` o'zgarmaydi, task yopilmaydi; manfiy qoldiq yo'q

  • AC7: rework ayni `work_id` ustida davom etadi; pirovard `confirmed` da faqat BITTA accrual bo'ladi

  • AC9: `confirmed` da ombor va accrual BIRGA bo'ladi — qisman xatoda ikkisi ham bekor (integratsiya testi 03/04 xatosini simulyatsiya qiladi)

  • AC11: band-task gate KASB kesimida — ikki ishbay kasbli hodim har kasbda bittadan parallel work ushlay oladi, bitta kasbda ikkitasini emas

  • AC14: qisman tasdiq (4 brom -> 3 soz, 1 brak): accrual 3 donaga, `qty_confirmed += 3`, `qty_claimed -= 1`, material 4 donaga sarflanadi, brak qiymati tannarxga kirmaydi

  • AC15/AC8: brak dona qayta ishlanmaydi (rework taklif qilinmaydi) va brak/rad da izoh bo'sh bo'lolmaydi; rad/brak hodim tarixida ko'rinadi

  • AC16: nazoratchi o'z work'ini tasdiqlay olmaydi (SoD)

  • AC18: operatsiya `k` da brak chiqqanda BARCHA transitive predecessor tasklar brak miqdoriga qayta ochiladi (`qty_confirmed -= b`, `completed -> in_progress`) va `k` predecessorlar qayta `completed` bo'lguncha brom qilinmaydi; `required_qty` o'zgarmaydi

  • AC19: brak yo'qotishi = shu operatsiya materiali + yig'ilgan WIP ulushi (material + oldingi operatsiyalar mehnati); soz donalar `unit_cost` i brakdan oshmaydi; brak donaga shu operatsiya ishbayi to'lanmaydi

  • AC12: hodim deaktiv bo'lganda faol work `void` bo'lib qty pulga qaytadi; task muzlab qolmaydi

  • AC17: UC9 ekrani partiya bo'yicha operatsiya kesimida material + ishbay + brak yo'qotishini ko'rsatadi; material + ishbay yig'indisi partiyaning `stock_batches.unit_cost` iga TENG, brak yo'qotishi undan tashqarida alohida qator

  • AC20: `task_type='picking'` qatorda `production_run_id`/`variant_operation_id`/`product_variant_id`/`recipe_version_id`/`required_qty`/`profession_id` NULL va `order_id` NOT NULL — DB CHECK darajasida (oqimning o'zi 06_orders epicida)

  • AC21: avto ochilgan `production_runs`/`tasks` qatorlarida `created_by_user_id` NOT NULL va `system` useriga ishora qiladi; UI muallifni "Tizim" deb ko'rsatadi

  • AC10: `task.available`, `work.submitted`, `work.rejected`, `work.confirmed` hodisalari `production_outbox` ga biznes yozuv bilan BIR tranzaksiyada tushadi va worker ularni `FOR UPDATE SKIP LOCKED` bilan oladi

  • 8.1 ishlangan misol (20 ta Stol, 6 operatsiya, 2 tarmoq) integratsiya testi sifatida takrorlanadi: `unit_cost = 123 000`

  • Kontrakt<->kod drift toza (EP-05 gate): `openapi/v1/tasks.yaml` dagi har operatsiya kodda bor

Ichki ishlar

10 ta

Izoh qoldirish

Tarix

9 yozuv

  • ⇄

    system statusni o'zgartirdi Ishlanyapti → Bajarildi

    Bolalardan avtomatik hisoblandi

  • 💬

    unknown-agent izoh qoldirdi

    [lead] SESSIYA YAKUNI 2026-08-26 — EP-07: 33/37 (89%). YOPILGAN: T01, T02, T04 (5/5 barg), T05-S01/S02/S03. Branch feat/EP-07-erpbom-backend, 17 commit. Testlar: uz.erpbom.tasks.** 246/246, uz.erpbom.employees.** 252/252, 0 failure/0 error (lead o'zi o'lchagan). QOLGAN 4 BARG: - EP-07-T05-S04 — ProductionOutboxWorker + notification (R3/R30). Boshlashdan oldin shu itemning izohlarini o'qish SHART: (a) V28 dedup indeksi `processing` ni ham qamraydi -> worker qatorni olgach kelgan order.recheck sassiz tushib qoladi; (b) V24 da `origin='order' -> order_id NOT NULL` CHECK yo'q; (c) arxiv variant gate faqat qo'lda sikl ochishda ishlaydi, buyurtmadan/outbox avto yo'l qoplanmagan. - EP-07-T06-S01/S02/S03 — o'qish yo'llari (UC9 xarajat tafsiloti, nazoratchi navbati, hodim /me). HOLAT: ish daraxti toza, mutant qoldig'i yo'q, ortiqcha worktree yo'q. `openapi/v1/tasks.yaml` hamon indeksda `A` holatida va HECH QACHON commit qilinmagan — Faza D da tekshirilsin. `stash@{0}` qoldi (mazmuni HEAD da bor, xavfsizlik nusxasi). KONTRAKT QARZI (T00 izohida): `409 SOURCE_WAREHOUSE_MISSING` va `409 STOCK_BUSY` (voidWork'dan) muzlatilgan yaml'da hujjatlanmagan. BOSHQA ITEMLARDA OCHIQ KUZATUV: EP-07-T03 — claimWork dagi R5 gate qulfsiz (parallel ikki claim o'tishi mumkin). EP-07-T05-S02 — R28 zanjirida nazariy deadlock (409 STOCK_BUSY bilan chiqadi, ma'lumot buzilmaydi). JARAYON: bu sessiyada topilgan 4 tizimli nuqson erp/.claude ga qoida sifatida kiritildi (commit 46718d0) — bitta repo bitta yozuvchi, kontrakt commit bilan muzlatiladi, kutish uchun navbat yopilmaydi, QA mutatsiyasi izolyatsiyalangan worktree'da.

  • 💬

    team-lead-pm izoh qoldirdi

    📋 SESSIYA YAKUNI — 2026-08-25 (team-lead-pm). Keyingi sessiya shu izohdan davom etadi. === HOLAT: 23/37 barg done (62%) === done: T00 kontrakt · T03 brom/topshirish/rework · T07 web sikllar · T08 web nazoratchi navbati · T09 mobil Hodim qisman: T01 (5/6) · T02 (3/4) boshlanmagan: T04 · T05 · T06 === KEYINGI SESSIYA BIRINCHI UCH ISHI === 1) EP-07-T01-S04 (`in_progress`) — 🔴 REGRESSIYA, Faza D dan OLDIN yopilishi shart. V27 FK ikki mavjud 04_employees testini yiqitdi (EmployeeProfessionServiceTest#unassigningProfession..., WageAccrualServiceTest). Migratsiya TO'G'RI — faqat test fixture'i tuzatiladi (avval `works` qatori, keyin `wage_entries`). Tashxis o'sha itemning izohida. 2) EP-07-T02-S02 (`ready`) — kontrakt tuzatilgan, AC3202 endi haqiqiy: ProductionRunCreationService ga arxiv variant tekshiruvi -> 409 VARIANT_ARCHIVED. Qolgan 4 mezon QA tasdiqlagan. 3) T04 -> T05 -> T06 to'lqini (T04 bog'liqligi: T03 done, ya'ni ochiq). === FOYDALANUVCHI QARORLARI (kod shularga tayanadi) === A) R30 outbox dedup: kalit={event_type}:{entity}:{id}, UNIQUE faqat pending/processing oynasida, ON CONFLICT DO NOTHING. (T01-S05 izohi; T05-S04 mezon 3326) B) AC3309 (mobil gating): gating ochilmagan tasklar hodim ro'yxatida KO'RINMAYDI — spec UC3 to'g'ri, AC bekor qilindi. C) R15 arxiv variant: sikl OCHISHDA ham to'siladi (409 VARIANT_ARCHIVED), production_in gate'i o'z joyida. === OCHIQ SAVOL (keyingi sessiyaning birinchi savoli) === 🔴 C qarori faqat QO'LDA sikl ochishni qoplaydi. Buyurtmadan AVTO oqim (outbox/@Scheduled, 06_orders chaqiradi) HTTP yo'liga ega emas -> arxiv variantga buyurtma tushsa WIP tuzog'i QAYTADI. Spec R15 avto oqim haqida jim; 06_orders arxiv variantni sotuvda bloklaydimi — TEKSHIRILMAGAN. T04/T05 dan oldin hal qilinsin. === DOC QARZI (erp/docs READ-ONLY — §5 sikli bilan yopiladi) === 07_tasks §5 R30 matni hali eski ({entity}:{id}); 07_tasks R15 matni hali faqat production_in deydi. Ikkalasi ham kodda boshqacha. === REPO HOLATI (push YO'Q, main tegilmagan) === erpbom-backend feat/EP-07-erpbom-backend @62f27ad · erpbom-web feat/EP-07-erpbom-web @603d747 · erpbom-mobile feat/EP-07-erpbom-mobile @5c7a9e3 ⚠️ backend'da `openapi/v1/tasks.yaml` STAGED lekin commit qilinmagan — bu muzlatish holati, YO'QOTILMASIN (Faza D yakunlovchisi commit qiladi). ⚠️ Uchala EP-07 branch'i ham EP-06 branch'idan kesilgan (EP-06 PR'lari hali merge emas) -> EP-07 PR'lari EP-06 commitlarini olib keladi, agar EP-06 avval merge bo'lmasa. === TEXNIK QARZ / KUZATUVLAR (ish ochilmagan) === • erpbom-web da OpenAPI kodgen pipeline'i yo'q — wire tiplar qo'lda (T07 mezon 3329 qamrovidan chiqarildi). • T08-S01: work.review gate testi faqat salbiy yo'nalishda — mutatsiyaga chidamsiz (izoh o'sha itemda). • T03-S02: EMPLOYEE_NOT_ELIGIBLE va INVALID_STATUS_TRANSITION yo'llari testsiz. • ProductionRunService.toResponse() — ro'yxatda N+1; soft-o'chirilgan variantli bitta sikl butun ro'yxatni 404 qiladi (T06 e'tiboriga). • product_variants.code: V9 char(6) vs entity uzunliksiz String -> to'liq @SpringBootTest schema-validate yiqiladi (02_products merosi). • Board claim'ni ~1 soatdan keyin stale deb bo'shatadi — uzoq barglarda holat yolg'on ko'rinadi. • Mock :4010 setsid bilan detached ishlayapti (fon-task o'chganda tushmaydi).

  • ⇄

    system statusni o'zgartirdi Backlog → Ishlanyapti

    Bolalardan avtomatik hisoblandi

  • 🔗

    pm-agent bog'liqlik qo'shdi

    → EP-06

  • 🔗

    pm-agent bog'liqlik qo'shdi

    → EP-04

  • 🔗

    pm-agent bog'liqlik qo'shdi

    → EP-02

  • 🔗

    pm-agent bog'liqlik qo'shdi

    → EP-09

  • ✦

    pm-agent yaratdi

    07_tasks — Ishlab chiqarish tasklari (marshrut, brom, tasdiq, WIP tannarx, brak zanjiri)

Ma'lumot

Agent
—
Olingan
—
Boshlandi
25.08.2026 08:53
Tugadi
26.08.2026 18:00
Baho
126 soat
Spec
erp/docs/modules/07_tasks.md
Branch
—
Commit
—

Bog'liqliklar

Agent uchun

Bu ishni AI agent quyidagicha oladi:

curl -s -X POST https://pmboard.ferp.uz/api/items/EP-07/claim \
  -H "X-Agent: backend-dev-1"

Tugatgach:

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