Sub-task EP-11-T06-S02 Yuqori 08_finance erpbom-backend

Valyuta konvertatsiyasi (F6)

Bajarildi
Status:

Tavsif

`transfer_type=conversion`: valyutalar har xil, `exchange_rate` majburiy va **qo'lda** kiritiladi; `amount_to` kursdan hisoblanadi va tuzatilishi mumkin.

Texnik ko'rsatma

Agent uchun

* `amount_to = amount_from / exchange_rate` (asosiy → chet el) yoki `× exchange_rate` (chet el → asosiy) — F6. * `exchange_rate_snapshot` faqat `conversion` harakatlarida yoziladi; **kurs farqi xarajati YOZILMAYDI** (qoida 8). * `internal` da esa `amount_to = amount_from` va valyutalar bir xil bo'lishi shart (qoida 38).

Qabul mezonlari (DoD)

3 / 3 bajarildi

  • UZS kassadan 1 200 000 chiqib, kurs 12 000 bilan USD kassaga 100 $ kiradi (08 AC9)

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

  • `internal` o'tkazmada har xil valyutali hisoblar tanlansa rad etiladi

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

  • Konvertatsiyadan keyin hech qanday xarajat/daromad qatori tug'ilmaydi

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

O'zgargan fayllar

1 ta

  • modified src/test/java/uz/erpbom/finance/service/MoneyTransferServiceTest.java

Izoh qoldirish

Tarix

18 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-t06-s02 statusni o'zgartirdi Review → Bajarildi

  • 💬

    qa-ep-11-t06-s02 izoh qoldirdi

    QA (qa-EP-11-T06-S02) — commit 8ae7013, izolyatsiyalangan worktree (git worktree add /tmp/qa-EP-11-T06-S02 8ae7013), asosiy daraxtga tegilmadi. REGRESSIYA (o'zim yurgizdim, bloklovchi): MoneyTransferServiceTest 46 + MoneyTransferControllerIntegrationTest 12 = 58, Failures 0 / Errors 0. Da'vo tasdiqlandi. MEZONLAR: * AC4105 — receiveConversionWritesDifferentAmountsWithExchangeRateSnapshotOnBothLegs (MoneyTransferServiceTest.java:727) aynan 1 200 000 UZS / kurs 12 000 / 100.00 USD bilan: out=1 200 000.00, in=100.00, exchange_rate_snapshot=12000.000000 IKKALA oyoqda. Yangi teskari yo'nalish testi (satr 801) qoldiqlarni ham tekshiradi (400.00 USD / 1 250 000 UZS, kurs 12 500 — fixture kursi ataylab boshqa). * AC4106 — createRejectsInternalWithDifferentCurrencies (satr 210) + kontrakt mosligi: GlobalExceptionHandler.java:91-94 ValidationException -> 400 + ex.getCode(); kod VALIDATION_ERROR ekani MoneyTransferControllerIntegrationTest.java:168-177 da HTTP darajasida isbotlangan. * AC4107 — receiveConversionDoesNotCreateExpenseOrLedgerEntries (satr 768) expense_entries VA ledger_entries qatorlari sonini receive'dan oldin/keyin solishtiradi (shunchaki 'xato bermadi' emas). MUTATSIYA — 7 mutant, 7/7 O'LDIRILDI (har biri alohida yurgizildi, javap bilan bytecode tasdiqlandi): 1. internal valyuta tekshiruvi olib tashlandi (if(false)) -> javap: ValidationException throw bloki bytecode'dan yo'qoldi; FAQAT createRejectsInternalWithDifferentCurrencies yiqildi (AC4106 aniq qoplangan). 2. exchange_rate_snapshot doim null -> 5 test (chk_money_movements_exchange_rate_snapshot DB CHECK + assertion). 3. amount_to ga QAT'IY F6 tengligi majburlandi (spec buzilishi) -> FAQAT receiveConversionKeepsManuallyAdjustedAmountToWithoutRecomputing yiqildi => bu test haqiqiy, yolg'on ijobiy emas. 4. in-oyoq summasi amount_to o'rniga amount_from -> 4 test. 5. exchange_rate_snapshot faqat out-oyoqda -> 5 test. 6. ikki oyoqqa turli transfer_group_id (javap: randomUUID chaqiruvi 1 -> 2) -> 2 test. 7. movement_type doim 'transfer' (javap: shox konstantaga yig'ildi) -> 5 test. HALOLLIK TEKSHIRUVI (coder da'volari): * USD->EUR: R__permissions_and_currencies_seed.sql:179-184 — USD is_base=false, EUR is_base=false, ya'ni fixture haqiqatan IKKALA tomoni asosiy bo'lmagan holat. Spec §6 F6 va qoida 38, kontrakt MoneyTransferType (finance.yaml:2947) faqat 'valyutalar har xil' deydi — bir tomoni asosiy bo'lishi TALAB QILINMAYDI. Da'vo rost. * Qo'lda tuzatish: test faqat 200/muvaffaqiyat emas — response.amount_to=99.50, money_movements in-oyoq qatori=99.50 VA to_account qoldig'i=99.50 (DB darajasi) tekshiriladi; ustiga M3 mutanti aynan shu testni o'ldirdi. * F6 formulasi backendda hisoblanmasligi kontraktga mos: MoneyTransferCreateRequest da amount_to required (finance.yaml:4360-4386) — klient beradi, qoida 38 'qo'lda tuzatilishi mumkin'. Nuqson emas. CROSS-CUTTING: @Transactional bor; tenant_id/schema yo'q; precision numeric(18,2)/(18,6) V41 ga mos; nomlash snake_case; outbox qatori enqueueRejectedEvent orqali biznes yozuv bilan bir tranzaksiyada; xarajat/daromad qatori DB CHECK bilan ham yopilgan (chk_expense_entries_source_type V42:122-134 va chk_ledger_entries_source_type V38:155-160 ro'yxatida 'money_transfers' YO'Q). MUTANT QOLDIRILMADI: git grep MUTANT HEAD -- src/ bo'sh, ishchi daraxtda MUTANT yo'q, openapi/ o'zgarmagan, worktree o'chirilgan. BLOKLAMAYDIGAN 2 KUZATUV (keyingi barg / spec qarzi uchun, bu bargni to'smaydi): A1. exchange_rate musbatligi hech qayerda tekshirilmaydi — MoneyTransferService.java:530-585 faqat null-likni ko'radi, V41 CHECK ro'yxatida ham (amount_from>0, amount_to>0, exchange_rate NULL-juftligi) musbatlik yo'q. Ya'ni conversion'ni exchange_rate=0 yoki manfiy bilan yaratish mumkin va shu qiymat exchange_rate_snapshot'ga tushadi. Spec (§2.11, qoida 38) va kontrakt bu haqda JIM — shuning uchun mezon buzilishi emas, spec qarzi sifatida qayd etaman. A2. AC4107 testi qatorlarni create/send/approve'dan KEYIN sanaydi — nazariy jihatdan oldingi qadamlarda tug'ilgan qator sezilmasdi. Amalda DB CHECK'lari (yuqorida) buni imkonsiz qiladi, shuning uchun kichik kuzatuv. XULOSA: 3/3 mezon bajarilgan, 58/58 yashil, 7/7 mutant o'ldirilgan -> done.

  • ✓

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

    ✓ Konvertatsiyadan keyin hech qanday xarajat/daromad qatori tug'ilmaydi

  • ✓

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

    ✓ `internal` o'tkazmada har xil valyutali hisoblar tanlansa rad etiladi

  • ✓

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

    ✓ UZS kassadan 1 200 000 chiqib, kurs 12 000 bilan USD kassaga 100 $ kiradi (08 AC9)

  • ⇄

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

  • ✎

    coder-ep-11-t06-s02 yangiladi

    Yangilandi: branch, commit_sha

  • ✓

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

    ✓ Konvertatsiyadan keyin hech qanday xarajat/daromad qatori tug'ilmaydi

  • ✓

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

    ✓ `internal` o'tkazmada har xil valyutali hisoblar tanlansa rad etiladi

  • ✓

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

    ✓ UZS kassadan 1 200 000 chiqib, kurs 12 000 bilan USD kassaga 100 $ kiradi (08 AC9)

  • 📄

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

    1 ta fayl qayd etildi

  • ⇄

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

    Agent ishni boshladi

  • ⚑

    coder-ep-11-t06-s02 ishga oldi

  • ✦

    pm-agent yaratdi

    Valyuta konvertatsiyasi (F6)

Ma'lumot

Agent
coder-ep-11-t06-s02
Olingan
1 о аввал
Boshlandi
05.09.2026 19:28
Tugadi
05.09.2026 20:18
Baho
6 soat
Spec
erp/docs/modules/08_finance.md#6
Branch
feat/EP-11-erpbom-backend
Commit
8ae7013ab07d

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

Tugatgach:

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