organizations + organization_settings — org-node daraxti (R17)
Tavsif
Texnik ko'rsatma
Agent uchun
Qabul mezonlari (DoD)
4 / 4 bajarildi
-
Ikkinchi root org (`parent_id IS NULL`) yaratish urinishi DB darajasida rad etiladi — AC10
qa-ep-09-t01-s01 · 2 о аввал
-
Child'ning child'ini yaratish urinishi rad etiladi (2 qavat cheklovi)
qa-ep-09-t01-s01 · 2 о аввал
-
`organization_settings.key` unikal; bir kalit ikki qator bo'lolmaydi
qa-ep-09-t01-s01 · 2 о аввал
-
Ikkala jadvalda ham `organization_id` va `tenant_id` ustuni yo'q — AC11
qa-ep-09-t01-s01 · 2 о аввал
O'zgargan fayllar
2 ta
-
modified
src/test/java/uz/erpbom/auth/OrganizationsMigrationTest.java -
modified
src/main/resources/db/migration/V2__organizations_and_organization_settings.sql
Izoh qoldirish
Tarix
20 yozuv
-
✎
team-lead-ep-09 yangiladi
Yangilandi: pr_url
-
✎
team-lead-ep-09 yangiladi
Yangilandi: estimate_hours
-
⇄
qa-ep-09-t01-s01 statusni o'zgartirdi Review → Bajarildi
-
💬
qa-ep-09-t01-s01 izoh qoldirdi
QA PASS. Spec 09_auth.md #2.3a/#2.3f va parent EP-09-T01 umumiy qoidalar bilan solishtirildi. Moslik: organizations (id/name/parent_id/active/created_at/updated_at, tenant_id/organization_id yo'q), organization_settings (id/key UNIQUE/value/updated_at; updated_by_user_id ataylab yo'q - EP-09-T01-S03 tavsifida 'S01 dagi organization_settings.updated_by_user_id FK si shu subtaskdan keyin ulanadi' deb tasdiqlangan, taxmin emas). R17 - qisman UNIQUE INDEX uq_organizations_single_root ON organizations ((true)) WHERE parent_id IS NULL - task tavsifidagi misolga so'zma-so'z mos. 2-qavat cheklovi - BEFORE INSERT/UPDATE OF parent_id trigger (organizations_enforce_max_depth) - CHECK boshqa qatorga murojaat qila olmagani uchun trigger to'g'ri tanlov. Nomlash (fk_/uq_/idx_/chk_ prefikslari, jadval ko'plikda) postgresql skill bilan mos. Test: flock ostida mvn -Dtest=OrganizationsMigrationTest test - 7/7 yashil, real PostgreSQL 16 Testcontainers, H2 yo'q. Mutatsiya tekshiruvi (2 ta, keyin git checkout bilan tiklandi): (1) trigger shartini IF FALSE THEN qildim - grandChildIsRejectedByDepthTrigger qizil bo'ldi ('Expecting code to raise a throwable'); (2) UNIQUE INDEX'ni oddiy INDEX'ga tushirdim - secondRootOrganizationIsRejectedByUniqueIndex qizil bo'ldi. Ikkalasi ham haqiqiy himoyani ushlaydi, tautologik emas. Cross-cutting: @Transactional N/A (sof migratsiya, entity/service yo'q). AR-1/R18 tasdiqlandi (test + migratsiya). Katalog FK/outbox/precision/audit-parol - N/A bu subtaskda. Soft-delete - organizations.active spec #2.3a bo'yicha ataylab deleted_at o'rniga (permission_groups bilan bir xil uslub); organization_settings uchun spec #2.3f field ro'yxatida soft-delete umuman yo'q - kod mos. Hamma 4 mezon (634-637) tasdiqlandi. Status -> done.
-
✓
qa-ep-09-t01-s01 qabul mezonini belgiladi
✓ Ikkala jadvalda ham `organization_id` va `tenant_id` ustuni yo'q — AC11
-
✓
qa-ep-09-t01-s01 qabul mezonini belgiladi
✓ `organization_settings.key` unikal; bir kalit ikki qator bo'lolmaydi
-
✓
qa-ep-09-t01-s01 qabul mezonini belgiladi
✓ Child'ning child'ini yaratish urinishi rad etiladi (2 qavat cheklovi)
-
✓
qa-ep-09-t01-s01 qabul mezonini belgiladi
✓ Ikkinchi root org (`parent_id IS NULL`) yaratish urinishi DB darajasida rad etiladi — AC10
-
⇄
coder-ep-09-t01-s01 statusni o'zgartirdi Ishlanyapti → Review
-
✎
coder-ep-09-t01-s01 yangiladi
Yangilandi: technical_notes
-
✎
coder-ep-09-t01-s01 yangiladi
Yangilandi: branch, commit_sha
-
💬
coder-ep-09-t01-s01 izoh qoldirdi
V2__organizations_and_organization_settings.sql qo'shildi. 1) `organizations`: self-FK `parent_id` (fk_organizations_parent) + idx; R17 (aynan bitta root) — qisman UNIQUE INDEX `uq_organizations_single_root ON organizations ((true)) WHERE parent_id IS NULL`. Qat'iy 2-qavat cheklovi CHECK bilan ifodalab bo'lmagani uchun (boshqa qatorga murojaat kerak) — BEFORE INSERT/UPDATE OF parent_id TRIGGER (`organizations_enforce_max_depth` / `trg_organizations_enforce_max_depth`) tanlandi: bu subtask hali entity/service qatlamisiz (faqat migratsiya), invariant DB darajasida ham himoyalangan bo'lishi va to'g'ridan-to'g'ri SQL test bilan tekshirilishi kerak edi (AC635). Qo'shimcha gigiena: `chk_organizations_no_self_parent` (parent_id <> id) — spec so'zma-so'z talab qilmagan, lekin standart himoya, hech narsani buzmaydi. 2) `organization_settings`: id/key(UNIQUE)/value/updated_at yaratildi. `updated_by_user_id` (FK->users) BU MIGRATSIYADA YO'Q — `users` jadvali hali mavjud emas (EP-09-T01-S03 yaratadi). Buni ikkala task tavsifi ham kutgan edi (S01: "S03 dan keyin qo'shiladi"; S03: "S01 dagi organization_settings.updated_by_user_id FK'si shu subtaskdan keyin ulanadi ... yoki S01 ni ALTER bilan to'ldiradi"). Men shu ikkinchi variantni tanladim: S03 ALTER TABLE ADD COLUMN bilan ustunni + FK + NOT NULL qo'shadi (jadval hali bo'sh, seed yo'q — xavfsiz). Test: src/test/java/uz/erpbom/auth/OrganizationsMigrationTest.java (Testcontainers, PostgreSQL 16) — flyway V2 qo'llanishi, ikkala jadvalda organization_id/tenant_id yo'qligi (AC637), bitta root/ikkinchi root rad etilishi (AC634), child/grandchild trigger (AC635), key UNIQUE (AC636). `mvn -Dtest=OrganizationsMigrationTest test` — 7/7 yashil, qulf ostida (/var/tmp/erpbom-db.lock). Mavjud ErpbomBackendApplicationTests ham V2 bilan yashil qoldi.
-
✓
coder-ep-09-t01-s01 qabul mezonini belgiladi
✓ Ikkala jadvalda ham `organization_id` va `tenant_id` ustuni yo'q — AC11
-
✓
coder-ep-09-t01-s01 qabul mezonini belgiladi
✓ `organization_settings.key` unikal; bir kalit ikki qator bo'lolmaydi
-
✓
coder-ep-09-t01-s01 qabul mezonini belgiladi
✓ Child'ning child'ini yaratish urinishi rad etiladi (2 qavat cheklovi)
-
✓
coder-ep-09-t01-s01 qabul mezonini belgiladi
✓ Ikkinchi root org (`parent_id IS NULL`) yaratish urinishi DB darajasida rad etiladi — AC10
-
📄
coder-ep-09-t01-s01 fayllarni qayd etdi
2 ta fayl qayd etildi
-
⇄
coder-ep-09-t01-s01 statusni o'zgartirdi Backlog → Ishlanyapti
Agent ishni boshladi
-
⚑
coder-ep-09-t01-s01 ishga oldi
-
✦
pm-agent yaratdi
organizations + organization_settings — org-node daraxti (R17)
Ma'lumot
- Agent
- coder-ep-09-t01-s01
- Olingan
- 2 о аввал
- Boshlandi
- 17.08.2026 19:50
- Tugadi
- 17.08.2026 20:05
- Baho
- 4 soat
- Spec
- erp/docs/modules/09_auth.md#2.3a
- Branch
- feat/EP-09-erpbom-backend
- Commit
- 822694f39cd3
Bog'liqliklar
Bundan oldin tugashi kerak
Yo'q — bu ish mustaqil.
Agent uchun
Bu ishni AI agent quyidagicha oladi:
curl -s -X POST https://pmboard.ferp.uz/api/items/EP-09-T01-S01/claim \ -H "X-Agent: backend-dev-1"
Tugatgach:
curl -s -X POST https://pmboard.ferp.uz/api/items/EP-09-T01-S01/status \
-H "X-Agent: backend-dev-1" \
-H "Content-Type: application/json" \
-d '{"status":"review","note":"..."}'