Sub-task EP-02-T01-S01 Kritik 02_products erpbom-backend

Lug'atlar — kategoriya/brend/atribut/units/sektor/narx turlari + bootstrap seed

Bajarildi
Status:

Tavsif

`product_categories` (self-FK `parent_id`, qat'iy 2 daraja — CHECK yoki trigger: ota tugunning `parent_id` NULL bo'lishi shart), `brands`, `attributes`, `attribute_values`, `units`, `sectors`, `price_types` (`days`, `active`). Barchasi tenant-umumiy — `organization_id` ustuni YO'Q. Unique kalitlar (qoida 28, funksional indeks): `product_categories`: `UNIQUE(parent_id, lower(btrim(name))) NULLS NOT DISTINCT`; `brands`/`attributes`/`units`/`sectors`/ `price_types`: `UNIQUE(lower(btrim(name)))`; `attribute_values`: `UNIQUE(attribute_id, lower(btrim(value)))`; `price_types` qo'shimcha `UNIQUE(days)`. Flyway `R__seed_dictionaries.sql` (idempotent, `ON CONFLICT DO NOTHING`): `units` (kvm/kg/dona/sm/m), `sectors` (A/B/C), `brands` ("Umumiy").

Qabul mezonlari (DoD)

4 / 4 bajarildi

  • `product_categories` da daraja-3 tugun yaratishga urinish DB darajasida rad etiladi (CHECK/trigger testi)

    qa-ep-02-t01-s01 · 1 о аввал

  • Har jadvalda `"kg"`/`"Kg"`/`" kg "` ikkinchi marta kiritilsa unique violation (funksional indeks testi)

    qa-ep-02-t01-s01 · 1 о аввал

  • `R__seed_dictionaries` migratsiyasi 2 marta qo'llanganda ham xato bermaydi (idempotent) va dublikat qatordan qaytmaydi

    qa-ep-02-t01-s01 · 1 о аввал

  • `price_types` da bir xil `days` ikki xil nom bilan kiritilsa ham rad etiladi (`UNIQUE(days)`)

    qa-ep-02-t01-s01 · 1 о аввал

O'zgargan fayllar

3 ta

  • modified src/test/java/uz/erpbom/products/ProductDictionariesMigrationTest.java
  • modified src/main/resources/db/migration/R__product_dictionaries_seed.sql
  • modified src/main/resources/db/migration/V8__product_dictionaries.sql

Izoh qoldirish

Tarix

18 yozuv

  • ✎

    finalize-ep-02 yangiladi

    Yangilandi: commit_sha

  • ⇄

    qa-ep-02-t01-s01 statusni o'zgartirdi Review → Bajarildi

  • 💬

    qa-ep-02-t01-s01 izoh qoldirdi

    QA tasdiqlandi. Spec (#2.1/2.2/2.6/2.7/2.10/2.11/2.12c, qoida 28) va migratsiya (V8__product_dictionaries.sql, R__product_dictionaries_seed.sql) qator-qator solishtirildi: 7 jadval, funksional unique indekslar (lower(btrim(...))) mos, product_categories 2-daraja trigger V2 organizations naqshiga bir xil, price_types UNIQUE(days)+CHECK(days>0) bor. ID turi (bigint identity) openapi/v1/products.yaml boshidagi muhandislik qaroriga mos; ProductCategoryResponse/BrandResponse/.../PriceTypeResponse maydon nomi/tur/majburiylik migratsiya bilan bir xil. Cross-cutting 8ta: (1) N/A — bu subtask entity/service qatlamisiz (faqat migratsiya); (2) tenant_id/organization_id yo‘q — testda tasdiqlangan; (3) FK haqiqiy (attribute_id, parent_id) — varchar-kod yo‘q; (4) N/A — asinxron ish yo‘q; (5) snake_case/ko‘plik/FK to‘liq nomdan — mos; (6) N/A — qty/narx ustuni yo‘q; (7) bu 5 lug‘atda active/deleted_at spec bo‘yicha ATAYLAB yo‘q (qoida 28 izohi), DELETE ham yo‘q — mos; (8) N/A. flock ostida `mvn -Dtest=ProductDictionariesMigrationTest test`: 17/17 yashil. Mutatsiya tekshiruvi: uq_price_types_days indeksini vaqtincha olib tashlab priceTypeWithDuplicateDaysButDifferentNameIsRejected testini yurgizdim — test kutilganidek qulab tushdi ("Expecting code to raise a throwable"), keyin git checkout bilan tikladim — test yolg‘onni chindan ushlaydi. Barcha 4 acceptance criteria (987-990) tasdiqlandi.

  • ✓

    qa-ep-02-t01-s01 qabul mezonini belgiladi

    ✓ `price_types` da bir xil `days` ikki xil nom bilan kiritilsa ham rad etiladi (`UNIQUE(days)`)

  • ✓

    qa-ep-02-t01-s01 qabul mezonini belgiladi

    ✓ `R__seed_dictionaries` migratsiyasi 2 marta qo'llanganda ham xato bermaydi (idempotent) va dublikat qatordan qaytmaydi

  • ✓

    qa-ep-02-t01-s01 qabul mezonini belgiladi

    ✓ Har jadvalda `"kg"`/`"Kg"`/`" kg "` ikkinchi marta kiritilsa unique violation (funksional indeks testi)

  • ✓

    qa-ep-02-t01-s01 qabul mezonini belgiladi

    ✓ `product_categories` da daraja-3 tugun yaratishga urinish DB darajasida rad etiladi (CHECK/trigger testi)

  • ⇄

    coder-ep-02-t01-s01 statusni o'zgartirdi Ishlanyapti → Review

  • ⇄

    coder-ep-02-t01-s01 statusni o'zgartirdi Backlog → Ishlanyapti

    Agent ishni boshladi

  • ⚑

    coder-ep-02-t01-s01 ishga oldi

  • ✎

    coder-ep-02-t01-s01 yangiladi

    Yangilandi: branch, commit_sha

  • ✓

    coder-ep-02-t01-s01 qabul mezonini belgiladi

    ✓ `price_types` da bir xil `days` ikki xil nom bilan kiritilsa ham rad etiladi (`UNIQUE(days)`)

  • ✓

    coder-ep-02-t01-s01 qabul mezonini belgiladi

    ✓ `R__seed_dictionaries` migratsiyasi 2 marta qo'llanganda ham xato bermaydi (idempotent) va dublikat qatordan qaytmaydi

  • ✓

    coder-ep-02-t01-s01 qabul mezonini belgiladi

    ✓ Har jadvalda `"kg"`/`"Kg"`/`" kg "` ikkinchi marta kiritilsa unique violation (funksional indeks testi)

  • ✓

    coder-ep-02-t01-s01 qabul mezonini belgiladi

    ✓ `product_categories` da daraja-3 tugun yaratishga urinish DB darajasida rad etiladi (CHECK/trigger testi)

  • 📄

    coder-ep-02-t01-s01 fayllarni qayd etdi

    3 ta fayl qayd etildi

  • ✎

    pm-agent yangiladi

    Yangilandi: estimate_hours

  • ✦

    pm-agent yaratdi

    Lug'atlar — kategoriya/brend/atribut/units/sektor/narx turlari + bootstrap seed

Ma'lumot

Agent
coder-ep-02-t01-s01
Olingan
1 о аввал
Boshlandi
18.08.2026 18:25
Tugadi
18.08.2026 18:33
Baho
6 soat
Spec
erp/docs/modules/02_products.md#2.1
Branch
feat/EP-02-erpbom-backend
Commit
4b90a3e35337

Bog'liqliklar

Agent uchun

Bu ishni AI agent quyidagicha oladi:

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

Tugatgach:

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