# HR Product Health Review — 2026-07-11 (MC #105260)

# MC #105260 — Bilko HR Product Health Review — SINTEZA za CEO
Datum: 2026-07-11 | Reviewers: bilko-racunovodstvo-hr (lead) + bilko-porez-fiskalizacija-hr | John verifikacija spornih nalaza live probama

## Executive verdikt
**Jezgro je zdravo. Ljuska nije spremna za prodaju bez 5 fixeva.**
- Knjigovodstveno jezgro: dvojno knjiženje RADI (John live probe: e2e org, jun P&L 3750 EUR, debit/credit konta ispravna), RRiF kontni plan, NUMERIC(19,4), KIR/KPR ispravni, PDV matematika tačna, OIB checksum ispravan, bilanca invarijanta drži.
- Porezni verdikt (bilko-porez-fiskalizacija-hr): **"NE smije se prodavati HR firmama bez ograde"** — uslovi za DA dolje.

## Nalazi — konsolidovano i rangirano

### CRITICAL (zakonski rizik / blokira prodaju)
1. **PDV filing period hardkodiran kvartalno** (PluginHR.getFilingDeadlines) — mjesečni obveznici (iznad praga, čl.85 ZPDV) dobili bi POGREŠAN ROK → rizik kazne klijentu. [porez #1]
2. **Nema server-side whitelist PDV stope** — taxRate prima bilo šta, tiho truje PDV izvještaj. [porez #2]

### HIGH
3. **Demo-seed zaobilazi knjiženje** → demo/trial org ima fakture bez GL zapisa → P&L=0 → svaki trial korisnik zaključi da je proizvod pokvaren. (John reklasifikovao s P0: runtime je ispravan, seed je bug.) [rač #1 + John probe]
4. **Dashboard bez period parametra** (ReportService.kt:31, hardkodiran tekući mjesec) — CEO-ov trigger nalaz; uneseni stariji račun "nestane" s glavnog ekrana. [rač + CEO]
5. **B2G eRačun ne postoji** (obaveza za javni sektor od 2019) — ili implementirati ili eksplicitni disclaimer "bez javnog sektora". [porez #3]
6. **Generic 404 vraća "Invoice not found" (BILKO-INV-001) za SVE rute** — zbunjuje korisnike i mobile tim. [rač #2]

### MEDIUM
7. Expense kategorije freetext umjesto RRiF konta (accountId nullable, ne popunjava se uvijek). [rač #3]
8. buyerOib se ne preuzima automatski s kupca + einvoiceReadiness se ne prekalkuliše poslije create. [porez live]
9. Retention period kontradikcija: kod tvrdi 11 god (NN 78/2015), dokument kaže UNVERIFIED — pravno raščistiti. [porez]
10. HrEInvoiceServiceTest: 20 padova (test-šema drift o.deleted_at) + PluginHRTest 3 UBL pada = LAŽNI ALARM (osirotjeli test mrtve grane; produkcijski UBL put ispravan) — test dug čisti CI signal. [porez bonus]

### META (proces)
11. **USER-STORIES.md je Srbija-scoped** — HR tržište NEMA formalne story-je (samo 2 placeholder ćelije). Review rađen na kod+API. HR story backlog treba napisati. [porez metod]
12. Agent-dizajn bez product review-a (MTD odluka) — persona-review gate prije shipa user-facing feature-a (ide u #105241 proces lekcije).

## Minimum za "smije se prodavati" (B2B SMB, bez javnog sektora)
1. Fix #1 mjesečno/kvartalno razlikovanje
2. Fix #2 PDV rate whitelist {25,13,5,0}
3. Fix #3 demo-seed kroz servisni sloj (trial kredibilitet)
4. HrEInvoiceServiceTest šema fix (da issue/submit tok bude CI-dokaziv)
5. Eksplicitan B2G disclaimer + retention pravna potvrda

## Skorovi
- Računovodstvo: PASS 8 / GAP 5 / FAIL 2 (15 testabilnih; 3 van read-only opsega)
- Porez: 9 verdikt stavki (tabela u porez fajlu); HR formalne stories ne postoje

Puni izvještaji: racunovodstvo-hr-review.md (131 l.) + porez-fiskalizacija-hr-review.md (173 l.)

## Fix status — 2026-07-12

**Talas 1 + 2a (CRITICAL/HIGH nalazi iz reviewa) — MERGED na `azdo/main`, potvrđeno `git merge-base --is-ancestor <sha> azdo/main` 2026-08-08.**

| MC # | Nalaz | PR | Commit | Verdikt | Evidence |
|---|---|---|---|---|---|
| #105271 | CRITICAL-1 PDV filing period (mjesečno/kvartalno) | PR 97 | `b7e04fef` | **PARTIAL** — setting + oba perioda testirana OK, ali `PluginHR.getFilingDeadlines()` bez callera van testova na živoj ruti → wiring gap (vidi #105317 ispod) | `~/system/evidence/105271/verdict-105271.json` |
| #105272 | CRITICAL-2 PDV rate whitelist {25,13,5,0} | PR 97 | `b7e04fef` | **PASS** | `~/system/evidence/105272/verdict-105272.json` |
| #105273 | HIGH-3 Demo-seed kroz servisni sloj (GL backfill) | PR 98 | `2f644346` | **PASS** — live P&L probe 6500 EUR; usput otkrio BUG-C i BUG-D (out-of-scope, praćeno posebno) | `~/system/evidence/105273/verdict-105273.json` |
| #105261 | CI gap — blokirajući Kotlin compile gate u PR validaciji | PR 99 | `a48cb045` | **PASS** (statička YAML verifikacija gate_kotlin_compile) | `~/system/evidence/105261/verdict-105261.json` |
| #105269 | HR eRačun rabat — `cac:AllowanceCharge` u UBL | PR 101 | `a0af66eb` | **PASS** — 39/39 testova; DB+UBL emisija gotova, UI wiring ostaje (vidi #105309 ispod) | `~/system/evidence/105269/verdict-105269.json` |

**Napomena o mapiranju:** peti commit naveden uz PR listu u naslovu ovog taska (`d42817fa`) NIJE #105269 nego **#105278** (HIGH-7 HR story backlog — `USER-STORIES-HR.md`, 707 linija/21 stories, PASS, merge `d42817fa`, `~/system/evidence/105278/verdict-105278.json`). #105269 je isporučen kroz `a0af66eb` (PR 101). Ispravljeno ovdje da se izbjegne identifier-mismatch greška.

### Follow-up status (ažurirano 2026-08-08)

Originalni tekst ovog taska (kreiran 2026-07-12) je #105317 i #105284 zvao "otvoreni follow-upi" — stanje se od tada promijenilo, oba su danas merge-ovana:

| MC # | Šta | Status danas | Verdikt/Evidence |
|---|---|---|---|
| #105317 | Wiring gap iz #105271 — `ComplianceCalendarService` na živoj ruti `/compliance/deadlines` sad čita org `pdv_filing_period` umjesto hardkodiranog monthly | **DONE, MERGED** na `azdo/main` (`85855216`) | Peer verify PASS (26+28+9 testova, 0 fail) + statutarna validacija PARTIAL-bez-blokera (novi follow-up #105377 za GA pitanja). `~/system/evidence/105317/verdict-105317-ready.json` |
| #105284 | BUG-C iz #105273 — deterministički account lookup (V97 migracija dala LIKE-prefiks sudare 10%/12%/6%) | **DONE, MERGED** na `azdo/main` (`20c6b6fa`) | Peer verify PASS, repro dokazan 4/8→8/8 + regresije 46/46+31/31+5/5 (novi follow-up #105375 za ASC fallback granu). `~/system/evidence/105284/verdict-105284-ready.json` |
| #105309 | eRačun rabat DTO/UI wiring iz #105269 — invoice create/edit API i web UI još nemaju discount polje | **I DALJE OTVOREN** — status in_progress, re-opened na backlog/L (stale-task-escalator 2026-08-08, nema owner aktivnosti) | Nema evidence dir — rad nije počeo |
| #105285 | BUG-D iz #105273 — BA_FED plugin revenue-konto 4000 vs hardkodirani `LIKE '6%'` u InvoiceService | **I DALJE OTVOREN** — status paused, backlog/L | Nema evidence dir — rad nije počeo |

**Napomena:** i #105317 i #105284 su u svom "ready" izvještaju (2026-07-12) imali napomenu "push/PR pending keychain unlock" — to je od tada razriješeno; oba commita (`85855216`, `20c6b6fa`) su danas potvrđeno na `azdo/main` (git log 2026-08-08: `azdo/main` HEAD = `c7245a16`, 2026-08-07).

Parent review: MC #105260. Ovaj docs task: MC #105318.