Sub-task EP-06-T01-S03 Kritik 04_employees erpbom-backend

V21 — `profession_norms` + `profession_norm_logs`

Bajarildi
Status:

Tavsif

**`profession_norms`** (§2.4 — kalit **operatsiya × org-node**): `id`, `variant_operation_id bigint NOT NULL` (FK→`variant_operations`), `norm_per_day numeric(18,4) NOT NULL`, `effective_from date NOT NULL`, `organization_id bigint NOT NULL` (FK→`organizations`), `set_by_user_id bigint NOT NULL` (FK→`users`), `active bool NOT NULL DEFAULT true`, `created_at`, `updated_at`. 🔴 `profession_id` va `variant_id` ustunlari **YO'Q** — 2026-07-25 reopen'ida kalit operatsiyaga ko'chgan; kasb va variant ulardan **hosila** (`variant_operations.profession_id` / `→ recipe_versions → product_variants`). §5 qoida 20 dagi eski `UNIQUE(profession_id, variant_id, organization_id)` yozuvi BEKOR. Cheklov: * `UNIQUE(variant_operation_id, organization_id) WHERE active` — partial. `piece_rates` dagi juftlik bilan bir xil kalit (02_products 2.14). * `CHECK (norm_per_day > 0)`. **`profession_norm_logs`** (§2.4a): `id`, `profession_norm_id NOT NULL` (FK), `norm_per_day numeric(18,4) NOT NULL`, `effective_from date NOT NULL`, `effective_to date NOT NULL`, `changed_by_user_id NOT NULL` (FK→`users`), `created_at`.

Qabul mezonlari (DoD)

5 / 5 bajarildi

  • Bir (operatsiya × org-node) uchun ikkinchi FAOL normativ kiritishga urinish DB darajasida rad etiladi

    qa-ep-06-t01-s03 · 1 о аввал

  • Bir xil operatsiya uchun IKKI xil org-node'da turli `norm_per_day` (Toshkent 4, Samarqand 6) muammosiz saqlanadi

    qa-ep-06-t01-s03 · 1 о аввал

  • `profession_norms` da `profession_id`/`variant_id` ustunlari YO'Q (information_schema testi — 2026-07-25 kaliti)

    qa-ep-06-t01-s03 · 1 о аввал

  • `norm_per_day = 0` yoki manfiy qiymat CHECK bilan rad etiladi

    qa-ep-06-t01-s03 · 1 о аввал

  • V21 toza va mavjud bazada xatosiz o'tadi

    qa-ep-06-t01-s03 · 1 о аввал

O'zgargan fayllar

2 ta

  • modified src/test/java/uz/erpbom/employees/ProfessionNormsMigrationTest.java
  • modified src/main/resources/db/migration/V21__profession_norms.sql

Izoh qoldirish

Tarix

20 yozuv

  • ✎

    finalize-ep-06 yangiladi

    Yangilandi: pr_url

  • 💬

    qa-ep-06-t01-s03 izoh qoldirdi

    QA (qa-EP-06-T01-S03) — TEKSHIRILDI, done. **Test:** `mvn -Dtest=ProfessionNormsMigrationTest test` → Tests run: 16, Failures: 0, Errors: 0 — BUILD SUCCESS (Testcontainers postgres:16, V1…V21 zanjiri). **Spec muvofiqligi (04_employees §2.4 / §2.4a) — ustunma-ustun:** - `profession_norms`: aynan 9 ustun (id, variant_operation_id, norm_per_day, effective_from, organization_id, set_by_user_id, active, created_at, updated_at) — ortiqchasi yo'q. - `profession_norm_logs`: aynan 7 ustun, `effective_to date NOT NULL` bor. - Kalit: `uq_profession_norms_variant_operation_organization_active` — partial, `WHERE active`. §5 qoida 20 dagi eski `UNIQUE(profession_id, variant_id, organization_id)` qo'llanmagan (to'g'ri — u BEKOR). **🔴 Mutatsiya tekshiruvi (har buzilish V21 ga kiritildi, testda YIQILISHI ko'rildi, so'ng `git checkout --` bilan tiklandi) — 5/5 o'ldirildi:** | Mutatsiya | Yiqilgan test | Mezon | |---|---|---| | unique'dan `organization_id` olib tashlandi | `sameOperationDifferentOrganizationIsAllowedWithDifferentNorm` (duplicate key) | 2815 | | `WHERE active` olib tashlandi (partial → to'liq) | `newActiveProfessionNormIsAllowedAfterOldOneIsRetired` | 2814/§2.4 retired | | `CHECK (norm_per_day > 0)` → `>= 0` | `normPerDayZeroIsRejectedByCheckConstraint` | 2817 | | `profession_id bigint` ustuni qayta qo'shildi | `professionNormsTableHasNoProfessionOrVariantIdColumn` | 2816 | | `numeric(18,4)` → `numeric(18,2)` | `sameOperationDifferentOrganizationIsAllowedWithDifferentNorm` (expected 4.0000, but was 4.00) | precision | Ya'ni 2815 haqiqiy tekshiruv — tautologik emas. **QA test kuchaytirishi (1 ta, faqat test fayli):** `sameOperationDifferentOrganizationIsAllowedWithDifferentNorm` faqat `id` larni (positive / notEqual) tekshirardi — mezon esa "turli `norm_per_day` SAQLANADI" deydi, ya'ni qiymatning o'zi hech qayerda qaytib o'qilmagan edi va `numeric(18,4)` aniqligini hech bir test qulflamagan edi. Qo'shildi: `readNormPerDay()` helper + Toshkent `4.0000` / Samarqand `6.0000` ni scale bilan (`isEqualTo(BigDecimal)`) tekshirish. Yuqoridagi 5-mutatsiya aynan shu qo'shimchani tasdiqlaydi. `V21__profession_norms.sql` O'ZGARTIRILMADI (e168e24 bilan bayt-bayt bir xil). **Cross-cutting:** AR-1 — `tenant_id` yo'q, schema almashtirish yo'q (`organization_id` = node-lokal biznes FK, tenancy emas, §2.4 Q4). AR-10 — 5 FK ning hammasi haqiqiy `REFERENCES` (varchar kod yo'q), har biriga indeks, testda `information_schema` orqali tasdiqlangan. Nomlash — snake_case, jadval ko'plikda, FK to'liq nomdan. Precision — `numeric(18,4)`. Fizik `DELETE` yo'q; retired = `active=false` (spec shunday, `deleted_at` talab qilinmagan). Parol/token yo'q; `profession_norm_logs` insert-only audit. **Kontrakt:** `openapi/v1/employees.yaml` `ProfessionNormResponse` (9 maydon) va `ProfessionNormLogResponse` (7 maydon) DDL bilan maydon nomi va tipida to'liq mos — `norm_per_day` ikkalasida ham numeric(18,4)/string decimal. Chetga chiqish yo'q. Eslatma: `RecipesAndRoutesMigrationTest` dagi 11 qizil test (V19 FK) — bu subtask doirasidan tashqarida, EP-02 ga alohida task chiqarilgan; S03 ga ta'sir qilmaydi.

  • ⇄

    qa-ep-06-t01-s03 statusni o'zgartirdi Review → Bajarildi

  • ✓

    qa-ep-06-t01-s03 qabul mezonini belgiladi

    ✓ V21 toza va mavjud bazada xatosiz o'tadi

  • ✓

    qa-ep-06-t01-s03 qabul mezonini belgiladi

    ✓ `norm_per_day = 0` yoki manfiy qiymat CHECK bilan rad etiladi

  • ✓

    qa-ep-06-t01-s03 qabul mezonini belgiladi

    ✓ `profession_norms` da `profession_id`/`variant_id` ustunlari YO'Q (information_schema testi — 2026-07-25 kaliti)

  • ✓

    qa-ep-06-t01-s03 qabul mezonini belgiladi

    ✓ Bir xil operatsiya uchun IKKI xil org-node'da turli `norm_per_day` (Toshkent 4, Samarqand 6) muammosiz saqlanadi

  • ✓

    qa-ep-06-t01-s03 qabul mezonini belgiladi

    ✓ Bir (operatsiya × org-node) uchun ikkinchi FAOL normativ kiritishga urinish DB darajasida rad etiladi

  • ⇄

    coder-ep-06-t01-s03 statusni o'zgartirdi Ishlanyapti → Review

  • ✎

    coder-ep-06-t01-s03 yangiladi

    Yangilandi: branch, commit_sha

  • ✓

    coder-ep-06-t01-s03 qabul mezonini belgiladi

    ✓ V21 toza va mavjud bazada xatosiz o'tadi

  • ✓

    coder-ep-06-t01-s03 qabul mezonini belgiladi

    ✓ `norm_per_day = 0` yoki manfiy qiymat CHECK bilan rad etiladi

  • ✓

    coder-ep-06-t01-s03 qabul mezonini belgiladi

    ✓ `profession_norms` da `profession_id`/`variant_id` ustunlari YO'Q (information_schema testi — 2026-07-25 kaliti)

  • ✓

    coder-ep-06-t01-s03 qabul mezonini belgiladi

    ✓ Bir xil operatsiya uchun IKKI xil org-node'da turli `norm_per_day` (Toshkent 4, Samarqand 6) muammosiz saqlanadi

  • ✓

    coder-ep-06-t01-s03 qabul mezonini belgiladi

    ✓ Bir (operatsiya × org-node) uchun ikkinchi FAOL normativ kiritishga urinish DB darajasida rad etiladi

  • 📄

    coder-ep-06-t01-s03 fayllarni qayd etdi

    2 ta fayl qayd etildi

  • ⇄

    coder-ep-06-t01-s03 statusni o'zgartirdi Backlog → Ishlanyapti

    Agent ishni boshladi

  • ⚑

    coder-ep-06-t01-s03 ishga oldi

  • 🔗

    pm-agent bog'liqlik qo'shdi

    → EP-06-T01-S01

  • ✦

    pm-agent yaratdi

    V21 — `profession_norms` + `profession_norm_logs`

Ma'lumot

Agent
coder-ep-06-t01-s03
Olingan
1 о аввал
Boshlandi
24.08.2026 10:33
Tugadi
24.08.2026 10:57
Baho
3 soat
Spec
erp/docs/modules/04_employees.md#2.4
Branch
feat/EP-06-erpbom-backend
Commit
e168e2403dd6

Bog'liqliklar

Agent uchun

Bu ishni AI agent quyidagicha oladi:

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

Tugatgach:

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