Sub-task EP-11-T01-S02 Kritik 08_finance erpbom-backend

V39 — money_accounts + money_movements

Bajarildi
Status:

Tavsif

Pul saqlash joyi (§2.4) va pul harakati jurnali (§2.5).

Texnik ko'rsatma

Agent uchun

* `account_type`: `cash|bank|employee_hold`. `organization_id` **NULLABLE** va ma'nosi diskriminatordan: ``` CHECK ( (account_type = 'bank' AND organization_id IS NULL) OR (account_type IN ('cash','employee_hold') AND organization_id IS NOT NULL) ) ``` * Qo'shimcha CHECK lar: `bank` → `account_number NOT NULL`; `employee_hold` → `holder_employee_id NOT NULL`; `cash` → `responsible_employee_id NOT NULL`; `frozen_amount >= 0 AND frozen_amount <= current_balance`. * `UNIQUE(organization_id, name)` **va** qo'shimcha `UNIQUE (name) WHERE organization_id IS NULL` — Postgres'da `NULL ≠ NULL` bo'lgani uchun ikkinchisi shart (§2.4). * `money_movements`: `direction` (`in|out`) + **musbat** `amount`; `movement_type` (`payment_in|payment_out|transfer|conversion|expense|adjustment`); `transfer_group_id uuid`; `exchange_rate_snapshot` faqat `conversion` da; `reversal_of_movement_id` self-FK. * Indekslar: `(account_id, entry_date)`, `(transfer_group_id)`, `(source_type, source_ref_id)`.

Qabul mezonlari (DoD)

3 / 3 bajarildi

  • `bank` qatorini `organization_id` bilan yozishga urinish CHECK bilan rad etiladi; `cash` ni `organization_id` siz yozish ham rad etiladi

    qa-ep-11-t01-s02 · 1 о аввал

  • `frozen_amount > current_balance` yozib bo'lmaydi

    qa-ep-11-t01-s02 · 1 о аввал

  • Ikkita `bank` hisobini bir xil nom bilan yozib bo'lmaydi (partial unique `WHERE organization_id IS NULL` ishlaydi)

    qa-ep-11-t01-s02 · 1 о аввал

O'zgargan fayllar

2 ta

  • modified src/test/java/uz/erpbom/finance/MoneyAccountsAndMoneyMovementsMigrationTest.java
  • modified src/main/resources/db/migration/V39__money_accounts_and_money_movements.sql

Izoh qoldirish

Tarix

27 yozuv

  • ✎

    pm-agent yangiladi

    Yangilandi: estimate_hours

  • ✎

    pm-agent yangiladi

    Yangilandi: estimate_hours

  • ✎

    team-lead-pm yangiladi

    Yangilandi: estimate_hours

  • ✎

    finalize-ep-11 yangiladi

    Yangilandi: pr_url

  • ⇄

    qa-ep-11-t01-s02 statusni o'zgartirdi Ishlanyapti → Bajarildi

  • 💬

    qa-ep-11-t01-s02 izoh qoldirdi

    QA (mustaqil tekshiruv, izolyatsiyalangan worktree). Mutatsiya: 6 mutant money_accounts (A scope-CHECK bo'shatildi, B frozen-CHECK bo'shatildi, C partial WHERE olib tashlandi, D uq(org,name)+currency_code, E uq(org,name)+account_type, F uq(name)+currency_code) — HAMMASI O'LDI. Oldingi QA qo'shgan 3 test bekorchi EMAS: D/E/F mutantlarini AYNAN o'sha uchtasi ushladi. money_movements tomonida 4 mutant sinaldi: G (exchange_rate biconditional -> bir tomonlama) mavjud test bilan o'ldi; H/I/J TIRIK qoldi -> qamrov bo'shlig'i: movement_type='expense', source_type='expense_entries'/'cash_counts' hech qayerda ishlatilmagan va §2.5 talab qilgan 3 indeks (account_id,entry_date), (transfer_group_id), (source_type,source_ref_id) uchun biror da'vo tekshirilmagan (ikkalasini o'chirganda suite yashil qolardi). 3 ta test qo'shildi (expenseMovementWithExpenseEntriesSourceIsAccepted, adjustmentMovementWithCashCountsSourceIsAccepted, moneyMovementsHasIndexesRequiredBySpec) — H/I/J endi o'ladi. 51/51 yashil, V39 asl holida (diff bo'sh). Test fayli asosiy daraxtga ko'chirildi, commit qilinmadi.

  • ✓

    qa-ep-11-t01-s02 qabul mezonini belgiladi

    ✓ Ikkita `bank` hisobini bir xil nom bilan yozib bo'lmaydi (partial unique `WHERE organization_id IS NULL` ishlaydi)

  • ✓

    qa-ep-11-t01-s02 qabul mezonini belgiladi

    ✓ `frozen_amount > current_balance` yozib bo'lmaydi

  • ✓

    qa-ep-11-t01-s02 qabul mezonini belgiladi

    ✓ `bank` qatorini `organization_id` bilan yozishga urinish CHECK bilan rad etiladi; `cash` ni `organization_id` siz yozish ham rad etiladi

  • ⇄

    worker-ep-11-t01 statusni o'zgartirdi Tayyor → Ishlanyapti

  • ⇄

    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-11-t01-s02 statusni o'zgartirdi Review → Ishlanyapti

  • 💬

    qa-ep-11-t01-s02 izoh qoldirdi

    QA (qa-EP-11-T01-S02) — QAYTARILDI. Baseline: 45/45 yashil (Testcontainers PG16, izolyatsiyalangan worktree, 2ed9c34). MUTATSIYA TEKSHIRUVI (har mutant target/classes/db/migration da tasdiqlandi): - A scope CHECK olib tashlandi -> 3 test qizil (O'LDI) - B cash/employee_hold uchun organization_id majburiyligi olib tashlandi -> 2 test qizil (O'LDI) - C1 frozen CHECK olib tashlandi -> 2 test qizil; C2 `<=` -> `<` -> frozenAmountEqualToCurrentBalanceIsAccepted qizil (O'LDI, chegara qoplangan) - D partial `WHERE organization_id IS NULL` olib tashlandi -> 2 test qizil (O'LDI) - E1 partial unique butunlay olib tashlandi -> twoBankAccountsWithSameNameAreRejected qizil (O'LDI) - E2 kompozit kalitdan organization_id olib tashlandi -> twoCashAccountsInDifferentOrganizationsWithSameNameAreAccepted qizil (O'LDI) - E3 KALIT KENGAYTIRILDI +currency_code (ikkala indeksga) -> 45/45 YASHIL, MUTANT TIRIK - E4 KALIT KENGAYTIRILDI +account_type (ikkala indeksga) -> 45/45 YASHIL, MUTANT TIRIK - F1 amount>0 -> >=0 -> zeroAmountIsRejected qizil; F2 account FK olib tashlandi -> 2 test qizil; F3 exchange_rate bikondisionali bir tomonlama qilindi -> conversionWithoutExchangeRateSnapshotIsRejected qizil; F4 direction CHECK olib tashlandi -> invalidDirectionIsRejected qizil (hammasi O'LDI) AC 4033 BAJARILMAGAN — unikal kalitning USTUN TO'PLAMI qotirilmagan (S01 dagi nuqsonning aynan o'zi, fixture xilma-xilligi yo'qligi sababli). Fayl: src/test/java/uz/erpbom/finance/MoneyAccountsAndMoneyMovementsMigrationTest.java - helper'lar valyutani qotirib yozgan: insertBankAccount (737-q), insertBankAccountWithBalances (757-q), insertCashAccount (775-q), insertEmployeeHoldAccount (792-q) — hammasida `'UZS'`. Butun to'plamda amaldagi yagona valyuta = UZS (boshqa yagona qiymat — FK testidagi yaroqsiz 'XYZ', 401-q). - Bir xil (organization_id, name) juftini ikki xil account_type bilan sinaydigan test ham yo'q. => Kutilgan: §2.4 kaliti AYNAN `UNIQUE(organization_id, name)` va `UNIQUE(name) WHERE organization_id IS NULL`. Olingan: kalitga currency_code yoki account_type qo'shib kengaytirsa ham 45 testdan birortasi sezmaydi (E3/E4 tirik). TUZATISH (aynan shu 3 test + helper): 1. insertBankAccount / insertCashAccount / insertEmployeeHoldAccount ga `currencyCode` parametri qo'shilsin (seed'da USD/EUR/RUB bor — R__permissions_and_currencies_seed.sql:178-181). 2. Yangi test: bitta org'da bir xil `name`, currency_code UZS vs USD ikkita `cash` -> uq_money_accounts_organization_id_name bilan RAD etilsin (§2.4 Q17: kassir ikki valyutada ishlasa nomlari ham farq qilishi shart). 3. Yangi test: ikkita `bank` (organization_id NULL), bir xil `name`, UZS vs USD -> uq_money_accounts_name bilan RAD etilsin. 4. Yangi test: bitta org'da bir xil `name`, biri `cash` biri `employee_hold` -> RAD etilsin (kalitda account_type YO'Q). Shu uch test qo'shilgach E3/E4 mutantlari o'ladi va 4033 yopiladi. Migratsiyaning O'ZI to'g'ri — SQL o'zgartirilmasin, faqat test kuchaytirilsin. O'TGAN TEKSHIRUVLAR (qayta qilinmasin): AC 4031 va 4032 mutatsiya bilan tasdiqlandi; kontraktga moslik ✓ (MoneyAccountResponse maydonlari va MoneyAccountType enum migratsiya bilan mos, kontrakt o'zgartirilmadi); tenant_id yo'q ✓ (AR-1); currencies/organizations/employees/users ga oddiy FK ✓ (AR-10); pul ustunlari numeric(18,2) ✓; `exchange_rate_snapshot numeric(18,6)` — V15 `exchange_rates.rate numeric(18,6)` bilan IZCHIL ✓ (coder qarori qabul qilinadi); CROSS_CUTTING J (737/740-q) node-lokal + nullable istisnosi bilan mos ✓; §2.5 indekslari to'liq ✓. ESLATMA (bloker emas, S02 doirasidan tashqari): chk_money_accounts_type_specific_fields `bank_name`/`bank_code` ni cheklamaydi — §2.4 ularni ham "Faqat bank" deydi, hozir `cash` qatorida `bank_name` to'ldirilishi mumkin. technical_notes bu ikkisini talab qilmagan; PM qarori kerak (spec bo'shlig'i yoki keyingi bargda tuzatish).

  • ✓

    qa-ep-11-t01-s02 qabul mezonini belgiladi

    ✗ Ikkita `bank` hisobini bir xil nom bilan yozib bo'lmaydi (partial unique `WHERE organization_id IS NULL` ishlaydi)

  • ✓

    qa-ep-11-t01-s02 qabul mezonini belgiladi

    ✓ `frozen_amount > current_balance` yozib bo'lmaydi

  • ✓

    qa-ep-11-t01-s02 qabul mezonini belgiladi

    ✓ `bank` qatorini `organization_id` bilan yozishga urinish CHECK bilan rad etiladi; `cash` ni `organization_id` siz yozish ham rad etiladi

  • ⇄

    coder-ep-11-t01-s02 statusni o'zgartirdi Ishlanyapti → Review

  • 💬

    coder-ep-11-t01-s02 izoh qoldirdi

    V39 migratsiya + MoneyAccountsAndMoneyMovementsMigrationTest (45/45 yashil). money_accounts scope CHECK (bank=tenant/cash+employee_hold=org-node), type-specific-field CHECK, frozen_amount<=current_balance, partial unique(name) WHERE organization_id IS NULL + UNIQUE(organization_id,name). money_movements: direction/amount/movement_type/source_type CHECK, exchange_rate_snapshot faqat conversion da, self-FK reversal. exchange_rate_snapshot uchun numeric(18,6) tanlandi (spec aniq shkala bermagan, exchange_rates.rate V15 bilan izchil).

  • ✎

    coder-ep-11-t01-s02 yangiladi

    Yangilandi: branch, commit_sha

  • ✓

    coder-ep-11-t01-s02 qabul mezonini belgiladi

    ✓ Ikkita `bank` hisobini bir xil nom bilan yozib bo'lmaydi (partial unique `WHERE organization_id IS NULL` ishlaydi)

  • ✓

    coder-ep-11-t01-s02 qabul mezonini belgiladi

    ✓ `frozen_amount > current_balance` yozib bo'lmaydi

  • ✓

    coder-ep-11-t01-s02 qabul mezonini belgiladi

    ✓ `bank` qatorini `organization_id` bilan yozishga urinish CHECK bilan rad etiladi; `cash` ni `organization_id` siz yozish ham rad etiladi

  • 📄

    coder-ep-11-t01-s02 fayllarni qayd etdi

    2 ta fayl qayd etildi

  • ⇄

    coder-ep-11-t01-s02 statusni o'zgartirdi Backlog → Ishlanyapti

    Agent ishni boshladi

  • ⚑

    coder-ep-11-t01-s02 ishga oldi

  • ✦

    pm-agent yaratdi

    V39 — money_accounts + money_movements

Ma'lumot

Agent
—
Olingan
—
Boshlandi
04.09.2026 05:58
Tugadi
04.09.2026 09:34
Baho
5 soat
Spec
erp/docs/modules/08_finance.md#2.4
Branch
feat/EP-11-erpbom-backend
Commit
2ed9c3497086

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-11-T01-S02/claim \
  -H "X-Agent: backend-dev-1"

Tugatgach:

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