Epic EP-13 Yuqori 10_notifications erpbom-backend backend

10_notifications — Xabarnoma (outbox worker, FCM push, in-app inbox, sozlama)

Bajarildi
100% 30/30
Status:

Tavsif

Tizimdagi biznes hodisalarini (buyurtma, task, ish haqi, faktura, xarajat, xavfsizlik) tegishli auditoriyaga yetkazadigan modul: **hodisa → shablon → kanal → qurilma/ekran**. Modul **hodisa manbai emas** — hodisalarni boshqa modullar tug'diradi (ular uchun `NotificationPort` seam'lari allaqachon qo'yilgan); bu epic **katalog, yetkazish va jurnal** qatlamini quradi va mavjud stub portlarni haqiqiy implementatsiyaga almashtiradi. **Uch qatlam:** 1. **Yozuv (qoida 1):** `notifications` + `notification_outbox` qatorlari biznes yozuv bilan **ayni tranzaksiyada** yoziladi. FCM ga tranzaksiya ichida hech qachon murojaat qilinmaydi — "arvoh xabar" ham, "xabar yo'qoldi" ham bo'lmaydi. 2. **Turtki (qoida 32–36):** `@Scheduled` worker (`fixedDelay` 1 s, maks 3 s) outbox'ni so'raydi, lease bilan oladi (`FOR UPDATE SKIP LOCKED`), FCM HTTP v1 ga yuboradi, retry/circuit breaker'ni boshqaradi. Broker YO'Q (ADR-001 AR-3). 3. **Ko'rinish:** ERP web va mobil ilovada in-app inbox (qo'ng'iroqcha + o'qilmagan hisoblagich), mobilda esa qo'shimcha **push** (data-only, matnni ilova chizadi). **Xabarnoma best-effort:** yuborilmasligi biznes amalini hech qachon bekor qilmaydi; haqiqat manbai — tegishli modulning o'z jurnali.

Texnik ko'rsatma

Agent uchun

* Jadvallar (§2): `notifications` (in-app, 3 oy, oylik partition), `notification_outbox` (yuborish ishi, 3 oy, oylik partition), `push_tokens` (qurilma registri, muddatsiz), `notification_preferences` (tenant sukuti + user override). * Holat mashinasi (§4): `pending → sending → sent | failed | dead`; `delivered` **ATAYLAB YO'Q** (FCM tilxat bermaydi), `read` esa outbox holati emas — `notifications.is_read` atributi. * Formulalar: F1 retry (1·2·4·8·16 s ± 15% jitter, 5 urinish), F2 sozlama ustuvorligi (user → tenant → kod sukuti `true`), F3 dedupe kaliti (5 daqiqa oynasi, DB'da), F4 o'qilmagan hisoblagichi, F5 admin nusxasining qabul qiluvchilari. * `severity = 'security'` — sozlama **umuman o'qilmaydi** (qoida 12) va bloklangan foydalanuvchi ham oladi (qoida 6). * SLA (qoida 38): `COMMIT` → FCM ga topshirish **p95 < 3 s**. * Katalog ≈ **44 hodisa** (§10 (v) ning 43 tasi + `auth.ip_locked_admin`; `app.update_available` chiqarilgan — yuqoridagi bosh izohga qara).

Qabul mezonlari (DoD)

0 / 8 bajarildi

  • Biznes amal rollback bo'lsa `notifications`/`notification_outbox` qatorlari ham yo'q; COMMIT bo'lsa xabar albatta navbatda (AC8)

  • Ilova (worker) o'chib turgan davrda ham hech bir qator yo'qolmaydi — qayta ishga tushgach yetkaziladi (AC13, E19)

  • Bitta qator FCM ga bir marta ketadi — parallel worker/thread da ham (AC14, E13)

  • Chiqish yoki rol almashtirilgach eski foydalanuvchining `push_tokens` yozuvi yo'q va unga yuborilgan push shu qurilmaga bormaydi (AC4 — AVTOMATIK)

  • Qulflangan ekrandagi push matnida summa, ism va hujjat raqami yo'q (AC3)

  • `severity='security'` xabar sozlamadan qat'i nazar keladi va UI'da o'chirish tugmasi ko'rsatilmaydi (AC6)

  • Bir kunlik ma'lumotda p95(`sent_at - created_at`) < 3 sekund (AC16)

  • Yangi rule yaratilmagan — huquq katalogi 140 da qolgan

Ichki ishlar

9 ta

Izoh qoldirish

Tarix

15 yozuv

  • 💬

    team-lead-pm izoh qoldirdi

    PR'lar ochildi (2026-09-13): backend #15 https://github.com/AbdullayevDilshodbek/erpbom-backend/pull/15 · web #14 https://github.com/AbdullayevDilshodbek/erpbom-web/pull/14 · mobil #12 https://github.com/AbdullayevDilshodbek/erpbom-mobile/pull/12. Merge — foydalanuvchi qarori.

  • ✎

    unknown-agent yangiladi

    Yangilandi: pr_url

  • 💬

    team-lead-pm izoh qoldirdi

    EP-13 YOPILDI (30/30) — yakunlash tekshiruvi natijasi va IKKI QARZ (push oldidan emas, keyingi epicda hal qilinsin): (1) NotificationOutboxMonitorScriptSmokeTest.java:84 da yangi Assumptions.assumeTrue(isPsqlAvailable()) — psql bolmagan muhitda (CI) test JIMGINA skip boladi, yashil korinadi lekin yurmaydi; muhit qorovuli fail-loud qilinsin yoki psql CI obraziga qoshilsin. (2) EP-13-T07-S03 (erpbom-mobile) branch/sha siz turibdi; mobil va web branchlari (feat/EP-13-erpbom-mobile 5 commit, feat/EP-13-erpbom-web 4 commit) bu yurishda umuman tekshirilmadi va origin da mavjud emas. Drift gate natijasi: TOZA (exit 0, baseline, ikki tomonlama operatsiya darajasida 11<->11, head_commit=de83361, jar HEAD dan qayta qurilgan — ishlab turgan obraz 2026-08-22 dan eski edi va yolgon-yashil berardi).

  • ✎

    finalize-ep-13 yangiladi

    Yangilandi: branch, commit_sha

  • ⇄

    system statusni o'zgartirdi Ishlanyapti → Bajarildi

    Bolalardan avtomatik hisoblandi

  • ⇄

    system statusni o'zgartirdi Backlog → Ishlanyapti

    Bolalardan avtomatik hisoblandi

  • 🔗

    pm-agent bog'liqlik qo'shdi

    → EP-12

  • 🔗

    pm-agent bog'liqlik qo'shdi

    → EP-11

  • 🔗

    pm-agent bog'liqlik qo'shdi

    → EP-10

  • 🔗

    pm-agent bog'liqlik qo'shdi

    → EP-09

  • 🔗

    pm-agent bog'liqlik qo'shdi

    → EP-07

  • 🔗

    pm-agent bog'liqlik qo'shdi

    → EP-06

  • 🔗

    pm-agent bog'liqlik qo'shdi

    → EP-04

  • 🔗

    pm-agent bog'liqlik qo'shdi

    → EP-03

  • ✦

    pm-agent yaratdi

    10_notifications — Xabarnoma (outbox worker, FCM push, in-app inbox, sozlama)

Ma'lumot

Agent
—
Olingan
—
Boshlandi
09.09.2026 12:22
Tugadi
11.09.2026 11:21
Baho
172 soat
Spec
erp/docs/modules/10_notifications.md
Branch
feat/EP-13-erpbom-backend
Commit
de833619a34e

Bog'liqliklar

Agent uchun

Bu ishni AI agent quyidagicha oladi:

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

Tugatgach:

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