Qoldiq, partiya, harakat kartochkasi va in-transit qiymat (`stock.view`)
Tavsif
Qabul mezonlari (DoD)
5 / 5 bajarildi
-
Qoldiq ro'yxatidagi qiymat ustuni `SUM(stock_batches.remaining_cost)` ga aniq teng (qty × unit_cost emas — qoida 42)
qa-ep-04-t03-s03 · 1 о аввал
-
Harakat kartochkasi FIFO chiqimda bir operatsiya uchun N qator (har qatlam) ko'rsatadi va sana oralig'i filtri to'g'ri ishlaydi
qa-ep-04-t03-s03 · 1 о аввал
-
In-transit qiymat faqat `in_transit` transferlarning qatlamlarini sanaydi; `received` bo'lgach 0 ga tushadi va qabul ombor qoldig'ida paydo bo'ladi
qa-ep-04-t03-s03 · 1 о аввал
-
Oxirgi kirim narxi lookup'i faqat `confirmed` fakturalardan o'qiydi (`draft`/`pending_supplier`/`cancelled` hisobga olinmaydi); kirim bo'lmasa `null` qaytadi
qa-ep-04-t03-s03 · 1 о аввал
-
Barcha o'qish yo'llari `stock.view` rule'i bilan himoyalangan
qa-ep-04-t03-s03 · 1 о аввал
O'zgargan fayllar
19 ta
-
modified
src/test/java/uz/erpbom/warehouse/controller/StockControllerIntegrationTest.javaQA fix: AC2447 va AC2448 mutant o.ldirildi - remaining_cost/qty*unit_cost divergent fixture, date_to yuqori chegara + boundary test -
modified
src/main/java/uz/erpbom/products/service/ProductVariantService.javasearchIds()/summarize() qoshildi (additive) - cross-module, warehouse moduli uchun (modul chegarasi) -
modified
src/main/java/uz/erpbom/products/repository/ProductVariantRepository.javafindIdsByNameOrCodeContaining() qoshildi (additive) - q qidiruvi uchun -
added
src/main/java/uz/erpbom/products/dto/VariantSummary.java -
added
src/main/java/uz/erpbom/warehouse/dto/LastPurchasePriceResponse.java -
added
src/main/java/uz/erpbom/warehouse/dto/InTransitItemResponse.java -
added
src/main/java/uz/erpbom/warehouse/dto/StockMovementResponse.java -
added
src/main/java/uz/erpbom/warehouse/dto/StockBatchResponse.java -
added
src/main/java/uz/erpbom/warehouse/dto/StockResponse.java -
modified
src/main/java/uz/erpbom/warehouse/repository/StockMovementRepository.javasearch() metodi qoshildi (additive) - /stock/movements uchun; Instant param uchun hasDateFrom/hasDateTo boolean bayroq (pgjdbc type-inference fix) -
modified
src/main/java/uz/erpbom/warehouse/repository/StockBatchRepository.javasearch() metodi qoshildi (additive) - /stock/batches uchun -
added
src/main/java/uz/erpbom/warehouse/repository/LastPurchasePriceRepository.java -
added
src/main/java/uz/erpbom/warehouse/repository/InTransitRow.java -
added
src/main/java/uz/erpbom/warehouse/repository/InTransitQueryRepository.java -
added
src/main/java/uz/erpbom/warehouse/repository/StockRow.java -
added
src/main/java/uz/erpbom/warehouse/repository/StockQueryRepository.java -
added
src/main/java/uz/erpbom/warehouse/service/StockService.java -
added
src/main/java/uz/erpbom/warehouse/controller/LastPurchasePriceController.java -
added
src/main/java/uz/erpbom/warehouse/controller/StockController.java
Izoh qoldirish
Tarix
32 yozuv
-
✎
finalize-ep-04 yangiladi
Yangilandi: commit_sha, pr_url
-
⇄
qa-ep-04-t03-s03 statusni o'zgartirdi Review → Bajarildi
-
💬
qa-ep-04-t03-s03 izoh qoldirdi
QA qayta tekshiruv (qa-EP-04-T03-S03), commit bc5e1cb — HAMMASI O'TDI, `done`. Doira: faqat oldingi ikki defekt + AC2449/2450/2451 ga tasodifiy zaiflashuv tekshiruvi. Ishlab chiqarish kodi bu commit'da TEGILMAGAN (faqat StockControllerIntegrationTest.java o'zgargan) — shuning uchun avval tasdiqlangan kod topilmalari kuchda qoladi. === MUTATSIYA QAYTA QO'YILDI: 2/2 O'LDIRILDI === 1. AC2447 mutanti — StockQueryRepository.java:73 ni `ROUND(SUM(b.qty_remaining * b.unit_cost), 2)` ga o'zgartirdim → test YIQILDI: `expected: "583.33" but was: "610.00"` (StockControllerIntegrationTest.java:174). Fixture endi haqiqatan diskriminatsiya qiladi: batch1 da `remaining_cost=333.33`, `qty_remaining × unit_cost = 6.0000 × 60.0000 = 360.00` — ikki formula ikki xil son beradi (583.33 vs 610.00). Qoida 42 ning yaxlitlash qoldig'i holati endi qamrab olingan. MUTANT O'LDIRILDI. 2. AC2448 mutanti — StockMovementRepository.java:58 va :70 dagi `date_to` shartini `OR 1=1` bilan neytrallashtirdim → IKKALA test ham YIQILDI: - movementsDateToUpperBoundIsInclusiveOfWholeDayNotJustMidnight (yangi, :371): "dateTo dan keyingi kun boshi — EKSKLYUZIV" — 222 chiqib qoldi; - movementsPreserveFifoGrainAndFilterByDateRange — yangi `tooNew` (source_ref 777) qatori sababi bilan. Yuqori chegara endi IKKI tomondan qoplangan: `dateTo` kunining oxirgi soniyasi (23:59:59 UTC) INKLYUZIV, keyingi kun boshi EKSKLYUZIV — kontraktdagi "o'sha kun oxirigacha, inklyuziv" semantikasi aynan shu. MUTANT O'LDIRILDI. FIFO grain (N qator) da'vosi endi haqiqiy assert bilan qoplangan: `containsExactlyInAnyOrder(555L, 555L)` — bitta operatsiya (bir xil `source_ref_id`) ikkita alohida qatlam qatori beradi; ilgari bu faqat `total_items = N` va har qator uchun `isEqualTo(555L)` edi, endi qatorlar SONI + AYNIYATI birga tekshiriladi. === AC2449/2450/2451 — ZAIFLASHMAGAN === `git show bc5e1cb` diff'i faqat uchta joyga tegadi: (a) AC2447 fixture'idagi `remaining_cost` argumenti 360.00→333.33 va kutilgan qiymat 610.00→583.33; (b) movements testiga `tooNew` qatori + assert kuchaytirilishi; (c) yangi chegaraviy test qo'shilishi. `insertStockBatch`/`insertStockMovement` helper imzolari, in-transit testi (AC2449), last-purchase-price testi (AC2450) va `allEndpointsRejectRequestsWithoutStockViewPermission` (AC2451) — diff'da faqat kontekst sifatida, bitta qator ham o'zgarmagan. Fixture o'zgarishi ular ishlatadigan ma'lumotga tegmaydi (har test o'z ombor/variantini yaratadi, `@BeforeEach` da TRUNCATE bor). Zaiflashuv YO'Q. === TESTLAR === `mvn -Dtest=StockControllerIntegrationTest test` → **13/13 yashil** (12 + yangi chegaraviy test), mutatsiyalar qaytarilgandan keyin. === REPO HOLATI === Ikkala mutatsiya ham FAQAT qo'lda (perl -pi in-place, checkout/stash/reset ISHLATILMADI) qaytarildi. `git status --short` da mening barcha fayllarim (StockQueryRepository, StockMovementRepository, StockController, InTransitQueryRepository, LastPurchasePriceRepository, StockControllerIntegrationTest) TOZA. Qolgan yozuvlar meniki EMAS: team lead'ning staged `openapi/v1/warehouse.yaml` i va EP-04-T04 worker'ining hozirgi ishi (`PurchaseReceiptService.java`, `PurchaseReceiptStateMachineTest.java`, `SupplierLedgerPort`/`NoopSupplierLedgerPort`/`SupplierPayableCommand`, `PurchaseReceiptConfirmedPostingTest.java`). Barcha 5 mezon mustaqil tasdiqlandi (5 mutantdan 5 tasi o'ldirildi) → `done`.
-
✓
qa-ep-04-t03-s03 qabul mezonini belgiladi
✓ Harakat kartochkasi FIFO chiqimda bir operatsiya uchun N qator (har qatlam) ko'rsatadi va sana oralig'i filtri to'g'ri ishlaydi
-
✓
qa-ep-04-t03-s03 qabul mezonini belgiladi
✓ Qoldiq ro'yxatidagi qiymat ustuni `SUM(stock_batches.remaining_cost)` ga aniq teng (qty × unit_cost emas — qoida 42)
-
⇄
unknown-agent statusni o'zgartirdi Ishlanyapti → Review
-
⇄
unknown-agent statusni o'zgartirdi Tayyor → Ishlanyapti
-
✓
unknown-agent qabul mezonini belgiladi
✓ Harakat kartochkasi FIFO chiqimda bir operatsiya uchun N qator (har qatlam) ko'rsatadi va sana oralig'i filtri to'g'ri ishlaydi
-
✓
unknown-agent qabul mezonini belgiladi
✓ Qoldiq ro'yxatidagi qiymat ustuni `SUM(stock_batches.remaining_cost)` ga aniq teng (qty × unit_cost emas — qoida 42)
-
📄
unknown-agent fayllarni qayd etdi
1 ta fayl qayd etildi
-
✎
unknown-agent yangiladi
Yangilandi: commit_sha
-
⇄
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-04-t03-s03 izoh qoldirdi
QA (qa-EP-04-T03-S03) — QAYTARILDI. Ishlab chiqarish kodi to'g'ri, TEST yetarli emas: mutatsiya tekshiruvida 2 mutant TIRIK QOLDI (5 dan 3 tasi o'ldirildi). Baza: `mvn -Dtest=StockControllerIntegrationTest test` → 12/12 yashil (mustaqil tasdiqlandi). Products regressiyasi: ProductVariantControllerIntegrationTest 23/23 + ProductVariantOrchestrationIntegrationTest 11/11 yashil; products o'zgarishlari sof additiv (yangi `VariantSummary`, `findIdsByNameOrCodeContaining`, `searchIds`/`summarize`) — mavjud xatti-harakat o'zgarmagan. === AC2447 → is_met:false (TEST DEFEKTI) === Kod TO'G'RI: StockQueryRepository.java:73 — `(SELECT SUM(b.remaining_cost) FROM stock_batches b ...)`. Lekin test buni ISBOTLAMAYDI. Mutatsiya: 73-qatorni `ROUND(SUM(b.qty_remaining * b.unit_cost), 2)` ga o'zgartirdim (aynan qoida 42 taqiqlagan formula) → StockControllerIntegrationTest 2/2 YASHIL qoldi, mutant TIRIK. Sabab — fixture: StockControllerIntegrationTest.java:151-156 da har ikkala partiyada `remaining_cost` AYNAN `qty_remaining × unit_cost` ga teng: batch1: qty_remaining 6.0000 × unit_cost 60.0000 = 360.00 = remaining_cost batch2: qty_remaining 5.0000 × unit_cost 50.0000 = 250.00 = remaining_cost Ikkala formula ham 610.00 beradi. 154-qatordagi izoh ("turli unit_cost, shuning uchun qty*unit_cost yig'indisi remaining_cost yig'indisidan FARQ QILADI") — NOTO'G'RI. Butun test klassida `stock_value` bo'yicha yagona assertion — 167-qator. Kutilgan: fixture qoida 42 dagi yaxlitlash qoldig'i holatini aks ettirsin, ya'ni `total_cost / qty_in` aniq bo'linmasin va FIFO chiqimdan keyin `remaining_cost != round(qty_remaining × unit_cost, 2)` bo'lsin. Doc misoli: `qty_in=21, total_cost=654000.00 → unit_cost=31142.8571`; 10 dona chiqimdan keyin `qty_remaining=11`, `remaining_cost` (proporsional ajratish natijasi) ≠ `11 × 31142.8571 = 342571.43`. Shunda `ROUND(SUM(qty*unit_cost),2)` mutanti albatta yiqiladi. === AC2448 → is_met:false (yarim qamrov) === FIFO grain qismi (bir operatsiya → N qator) ISBOTLANGAN — StockControllerIntegrationTest.java:299-317, yashil. Sana oralig'ining YUQORI chegarasi (`date_to`) umuman tekshirilmagan. Mutatsiya: StockMovementRepository.java:58 va :70 dagi `AND (:hasDateTo = false OR m.createdAt < :dateToExclusive)` ga `OR 1=1` qo'shdim (ya'ni `date_to` filtri butunlay o'chdi) → movementsPreserveFifoGrainAndFilterByDateRange 1/1 YASHIL, mutant TIRIK. Sabab: testdagi 3 ta harakat -3d, -3d, -30d da; `date_from=-10d` allaqachon -30d ni kesib tashlaydi, `date_to=-2d` dan KEYIN hech qanday qator yo'q. Ya'ni assertion faqat `date_from` ni tekshiradi. Kutilgan: (a) `date_to` dan keyingi (mas. bugungi) harakat qo'shilsin va u natijaga KIRMASIN; (b) kontraktdagi inklyuzivlik chegarasi tekshirilsin — aynan `date_to` kunining kech soatida (mas. 23:30 UTC) yaratilgan qator natijaga KIRSIN (StockService.java:170 `dateTo.plusDays(1)` mantiqi shuni va'da qiladi). === O'TGAN MEZONLAR (mutant o'ldirildi) === AC2449 ✓ — InTransitQueryRepository.java:97 `wt.status = 'in_transit'`. Mutatsiya `IN ('in_transit','received')` → test yiqildi ("received bo'lgach ro'yxatdan tushib qoladi", 346-qator). `transfer_out` + `SUM(sm.total_cost)` — kontrakt `value` ta'rifiga mos (qoida 42). AC2450 ✓ — LastPurchasePriceRepository.java:51 `AND pr.status = 'confirmed'`; `ORDER BY pr.document_date DESC, prl.id DESC LIMIT 1`. Mutatsiya (filtrni olib tashlash) → test yiqildi (expected 10000.00, was 999.00). Kirim yo'q → `has_purchase=false`, `unit_cost=null` (404 emas) — kontraktga mos. `disputed` holati ham to'g'ri chetlanadi. AC2451 ✓ — 5 ta o'qish yo'lining hammasida `@RequirePermission("stock.view")`: StockController.java:37, 51, 64, 81 va LastPurchasePriceController.java:39. Mutatsiya (StockController.java:37 ni olib tashlash) → test yiqildi (expected 403, was 200). === KONTRAKT MOSLIGI (defekt topilmadi) === `min_qty` LEFT JOIN — StockQueryRepository.java:53-56; `is_low` (good + min_qty>0 + qty_on_hand<min_qty) — StockService.java:239-242; `only_low` — StockQueryRepository.java:119-122; `only_low` + `condition` birga → 400 VALIDATION_ERROR (StockService.java:103). `variant_name`/`variant_code` — `ProductVariantService.summarize` orqali BATCH (N+1 yo'q), modul chegarasi hurmat qilingan (repository'ga to'g'ridan-to'g'ri tegilmagan) — ADR qatlam qoidasiga mos. `q` — `/stock`, `/stock/batches`, `/stock/movements` da bor (`/in-transit` da kontraktda ham yo'q). Maydon nomlari/tiplari/sahifalash shakli `warehouse.yaml` bilan mos. === CROSS-CUTTING (o'tdi) === 5 ta servis metodi ham `@Transactional(readOnly = true)`; `tenant_id` yo'q (AR-1); yangi migratsiya yo'q; yozish yo'li yo'q (sof proyeksiya, qoida 5/8/14); fizik DELETE yo'q; log'da token/parol yo'q. === ESLATMA (EP-04-T03-S02 uchun, bu barg defekti EMAS) === `warehouse_variant_settings` uchun JPA entity yo'qligi va raw SQL LEFT JOIN — hozircha ziddiyat bermaydi: DB'da `min_qty numeric(18,4) NOT NULL DEFAULT 0`, `deleted_at` ustuni YO'Q, shuning uchun "qator yo'q → null → is_low=false" va "qator bor, min_qty=0 → is_low=false" semantikasi bir xil natija beradi. YAGONA xavf: S02 shu jadvalga `deleted_at` yoki `is_active` qo'shsa — StockQueryRepository.java:53-56 dagi JOIN o'chirilgan sozlamani ham o'qiydi. S02 da shu ikki joy birga ko'rib chiqilsin. === INFRA eslatmasi === Parallel worker (EP-04-T04) bilan `target/` ustida poyga bor: bir marta `mvn` mening test yugurishim paytida `target/classes` ni tozalab yubordi va eskirgan klasslardan 2 ta soxta yiqilish berdi. Qayta yurgizishda 12/12 yashil. Mening o'zgarishlarim to'liq qo'lda qaytarildi — `git status --short` da faqat team lead'ning staged `openapi/v1/warehouse.yaml` i qoldi.
-
⇄
qa-ep-04-t03-s03 statusni o'zgartirdi Review → Ishlanyapti
-
✓
qa-ep-04-t03-s03 qabul mezonini belgiladi
✗ Harakat kartochkasi FIFO chiqimda bir operatsiya uchun N qator (har qatlam) ko'rsatadi va sana oralig'i filtri to'g'ri ishlaydi
-
✓
qa-ep-04-t03-s03 qabul mezonini belgiladi
✗ Qoldiq ro'yxatidagi qiymat ustuni `SUM(stock_batches.remaining_cost)` ga aniq teng (qty × unit_cost emas — qoida 42)
-
✓
qa-ep-04-t03-s03 qabul mezonini belgiladi
✓ Barcha o'qish yo'llari `stock.view` rule'i bilan himoyalangan
-
✓
qa-ep-04-t03-s03 qabul mezonini belgiladi
✓ Oxirgi kirim narxi lookup'i faqat `confirmed` fakturalardan o'qiydi (`draft`/`pending_supplier`/`cancelled` hisobga olinmaydi); kirim bo'lmasa `null` qaytadi
-
✓
qa-ep-04-t03-s03 qabul mezonini belgiladi
✓ In-transit qiymat faqat `in_transit` transferlarning qatlamlarini sanaydi; `received` bo'lgach 0 ga tushadi va qabul ombor qoldig'ida paydo bo'ladi
-
⇄
unknown-agent statusni o'zgartirdi Ishlanyapti → Review
-
✓
unknown-agent qabul mezonini belgiladi
✓ Barcha o'qish yo'llari `stock.view` rule'i bilan himoyalangan
-
✓
unknown-agent qabul mezonini belgiladi
✓ Oxirgi kirim narxi lookup'i faqat `confirmed` fakturalardan o'qiydi (`draft`/`pending_supplier`/`cancelled` hisobga olinmaydi); kirim bo'lmasa `null` qaytadi
-
✓
unknown-agent qabul mezonini belgiladi
✓ In-transit qiymat faqat `in_transit` transferlarning qatlamlarini sanaydi; `received` bo'lgach 0 ga tushadi va qabul ombor qoldig'ida paydo bo'ladi
-
✓
unknown-agent qabul mezonini belgiladi
✓ Harakat kartochkasi FIFO chiqimda bir operatsiya uchun N qator (har qatlam) ko'rsatadi va sana oralig'i filtri to'g'ri ishlaydi
-
✓
unknown-agent qabul mezonini belgiladi
✓ Qoldiq ro'yxatidagi qiymat ustuni `SUM(stock_batches.remaining_cost)` ga aniq teng (qty × unit_cost emas — qoida 42)
-
✎
unknown-agent yangiladi
Yangilandi: branch, commit_sha
-
📄
unknown-agent fayllarni qayd etdi
19 ta fayl qayd etildi
-
⇄
coder-ep-04-t03-s03 statusni o'zgartirdi Backlog → Ishlanyapti
Agent ishni boshladi
-
⚑
coder-ep-04-t03-s03 ishga oldi
-
🔗
pm-agent bog'liqlik qo'shdi
→ EP-04-T03-S01
-
✦
pm-agent yaratdi
Qoldiq, partiya, harakat kartochkasi va in-transit qiymat (`stock.view`)
Ma'lumot
- Agent
- —
- Olingan
- —
- Boshlandi
- 20.08.2026 18:50
- Tugadi
- 20.08.2026 20:16
- Baho
- 5 soat
- Spec
- erp/docs/modules/03_warehouse.md#11
- Branch
- feat/EP-04-erpbom-backend
- Commit
- b6685d9b9b72
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-04-T03-S03/claim \ -H "X-Agent: backend-dev-1"
Tugatgach:
curl -s -X POST https://pmboard.ferp.uz/api/items/EP-04-T03-S03/status \
-H "X-Agent: backend-dev-1" \
-H "Content-Type: application/json" \
-d '{"status":"review","note":"..."}'