# DigiPOS — priprema za sertifikaciju ESIR-a (V-PFR sandbox PU)

Ovaj dokument opisuje kako se DigiPOS povezuje sa **razvojnim (sandbox) okruženjem
Poreske uprave** radi ručnog testiranja i pribavljanja dokaza za odobrenje ESIR-a.
Model PFR-a: **V-PFR — digitalni sertifikat** (bez pametne kartice; autentikacija
klijentskim PFX sertifikatom + PAC zaglavlje).

> **Tajni podaci ne idu u git.** Fascikla `cert/` i `config.json` su u `.gitignore`.
> JID, lozinku PFX-a i PAK čuvati odvojeno (originalni imejl PU).

---

## 1. Podaci iz PU (sandbox razvojni sertifikat)

Iz imejla PU (`tap.sandbox.suf.purs.gov.rs`) dobijaju se tri fajla i tri podatka:

| Fajl | Uloga | Kopiran u projekat kao |
|------|-------|------------------------|
| `<JID>-DeveloperAuthenticationCertificate.pfx` | klijentski (mutual-TLS) sertifikat ESIR-a | `cert/vpfr-sandbox.pfx` |
| `Sandbox SUF RCA.cer` | koren CA (za proveru potpisa računa) | `cert/sandbox-rca.cer` |
| `Sandbox SUF Issuing CA 1.cer` | izdavalac CA | `cert/sandbox-ica.cer` |

| Podatak | Vrednost (sandbox) | Gde se koristi |
|---------|--------------------|----------------|
| **ЈИД (JID)** | `3LAMY8QM` | `uid` u odgovoru `/status`; deo broja računa |
| **Лозинка (PFX)** | *(iz imejla)* | `lpfr_cert_pass` |
| **ПАК (PAK/PAC)** | *(iz imejla)* | `lpfr_pin` → šalje se kao `PAC` zaglavlje |

> **Napomena o serveru:** TLS sertifikat sandbox servera izdaje **Let's Encrypt** (javni CA),
> pa se server verifikuje preko sistemskog CA — CA bundle iz PU **nije** potreban za TLS.
> RCA/ICA služe za proveru **potpisa fiskalnog računa**, ne za TLS.

---

## 2. Podešavanje DigiPOS-a

U **Admin → Podešavanja** (ili direktno u tabeli `pos_settings`):

| Ključ | Vrednost za sandbox |
|-------|---------------------|
| `vpfr_url` | `https://vsdc.sandbox.suf.purs.gov.rs/api/v3/` (prioritet nad L-PFR) |
| `lpfr_url` | `DEMO` ili lokalni L-PFR (zanemaruje se dok je vpfr_url + cert popunjen) |
| `lpfr_cert` | `cert/vpfr-sandbox.pfx` |
| `lpfr_cert_pass` | *(lozinka PFX-a)* |
| `lpfr_pin` | *(PAK — ide kao `PAC` zaglavlje)* |
| `lpfr_ca` | *(prazno — sistemski CA)* |

Kad su `vpfr_url` i `lpfr_cert` popunjeni, `lib/lpfr.js` bira **V-PFR**:
učitava PFX, verifikuje server i dodaje `PAC` zaglavlje na svaki zahtev.
Inače koristi `lpfr_url` kao L-PFR (`POST /pin`) ili DEMO.

---

## 3. Provera veze (bez baze)

Lozinka PFX-a i ПАК se čitaju **isključivo iz env-a** — nemaju podrazumevanu vrednost
u kodu, pa skripta bez njih staje sa jasnom porukom (namerno: hardkodovan default bi
prvi put kad se skripta pusti na **pravom** sertifikatu tiho poslao pogrešnu tajnu,
a sama tajna bi zauvek ostala u istoriji gita).

```bash
export VPFR_CERT_PASS=...   # lozinka PFX-a (iz imejla PU)
export VPFR_PAC=...         # ПАК (iz imejla PU)
node scripts/vpfr-test.js            # /status + verifyPin
node scripts/vpfr-test.js --invoice  # + pošalje jedan test Promet/Prodaja račun
```

PowerShell: `$env:VPFR_CERT_PASS = '...'` pa `$env:VPFR_PAC = '...'`.
Opciono: `VPFR_URL` i `VPFR_CERT` (podrazumevano sandbox PU; nisu tajne).
Očekivani rezultat:

```
[status] uid=3LAMY8QM  sdcDateTime=...
[status] aktuelne stope (group 8): F=11%(ECAL), N=0%, P=0.5%, E=6%, T=2%, A=10%(VAT), B=0%, Ж=19%(VAT), C=0%
[verifyPin] -> 0100 OK
[invoice] OK  invoiceNumber: 3LAMY8QM-XXXXXXXX-1  invoiceCounter: 1/1ПП  ...
```

**Potvrđeno 2026-07-14:** `/status` → HTTP 200, `verifyPin` → `0100`, test račun
potpisan (`invoiceNumber 3LAMY8QM-…`, važeći `verificationUrl`).

---

## 4. Poreske oznake u sandbox-u (bitno za test scenarije)

Sandbox aktuelna grupa (`currentTaxRates`, groupId 8) **ne koristi** iste oznake kao
produkcija/DEMO (Ђ/Е/Г). Oznake koje V-PFR vraća:

Oznake i stope **nisu fiksne u ESIR-u** — čitaju se iz `/status` odgovora V-PFR-a
(`currentTaxRates.taxCategories[].taxRates[]`). DigiPOS ih nigde ne izmišlja:
u kodu (`lib/db.js`) nema podrazumevanih oznaka, a mapiranje se puni tek kad se
pozove **Šifarnik poreskih stopa** (Admin → *Preuzmi stope sa PFR-a*).

> **Pravilo 12-П1/П6:** ESIR mora da **preuzme** stope od L/V-PFR i **nikad** ne
> koristi nijednu drugu. U DigiPOS-u:
> - `GET /api/lpfr/tax-rates` čita `currentTaxRates` sa PFR-a (nema hardkodovanih oznaka);
> - `POST /api/lpfr/tax-rates` upisuje vezu *ERP šifra → PFR oznaka*, i **odbija** svaku
>   oznaku koje nema u tekućem PFR odgovoru;
> - Admin ekran (*Šifarnik poreskih stopa*) prikazuje oznake/stope sa PFR-a i nudi ih
>   kao jedini izbor (padajuća lista) za svaku ERP šifru poreza.
>
> Sandbox trenutno (groupId 8) vraća, npr., `Ж`=19% i `A`=10% (VAT), `B`=0%, `E`=6%
> (STT), `F`=11% (ECAL)… — ali merodavan je uvek **živi** odgovor `/status`.

---

## 5. Generisanje dosijea kroz sandbox (svi tipovi računa)

```bash
node scripts/vpfr-sertifikacija.js          # JSON + tekst isečaka
node scripts/vpfr-sertifikacija.js --pdf    # + PDF preko „Microsoft Print to PDF" (GDI, QR GIF sa PFR-a)
```

Skripta:
1. čita `/status` i **iz odgovora** uzima raspoložive poreske oznake (bez hardkodovanja);
2. šalje ceo niz tipova/vrsta (promet prodaja/refundacija, kopija, predračun, obuka,
   avans АП/АР, konačni ПП по авансу, virman, identifikacija kupca, GTIN) — lančajući
   referentne brojeve iz stvarnih PFR odgovora;
3. upisuje za svaki scenario `req`/`res` JSON + tekst isečka u `docs/sertifikacija-sandbox/izlaz/`
   i `PREGLED.md`;
4. sa `--pdf`: traži `verificationQRCode` od PFR-a i štampa kroz **Microsoft Print to PDF**
   (`lib/driverprint` + `scripts/gdiprint.ps1 -OutFile`) → `docs/sertifikacija-sandbox/pdf/`.

**Potvrđeno 2026-07-15:** svih **23 scenarija** (П1–П15 упитника 17) potpisano na sandbox V-PFR,
bez ijedne greške; PDF isečci sa QR (Print to PDF) snimljeni u `pdf/`.
Detalji: [`PREGLED.md`](sertifikacija-sandbox/PREGLED.md).

Set sada obuhvata i **varijante sa identifikacijom kupca** (`buyerId` = `10:112233445`, КУПАЦ ДОО)
za svaki tip dokumenta — `15-PR-kupac` … `23-AR-kupac` — uključujući **предрачун-рефундацију**
(`19-RR-kupac`) i **обука-рефундацију** (`21-OR-kupac`), kojih ranije uopšte nije bilo.
Svaka je ulančana na stvaran referentni broj iz prethodnog PFR odgovora.

Ti izlazi (potpisani računi + QR) zamenjuju DEMO primere u `docs/ESIR-DOSIJE-PU.md` (deo 17).

> **Uzgredni nalaz za DigiLPFR:** V-PFR je vratio sva slova brojača — ПП, ПР, КП, КР, РП, **РР**,
> ОП, **ОР**, АП, АР. Poklapaju se 10/10 sa `JournalLocalization.SrCyrlRs` u `D:\lpfr`
> (`CounterExtension` = InvoiceTypeLetter + TransactionTypeLetter). `РР` i `ОР` su bili otvoreno
> pitanje jer se najređe javljaju — sada su potvrđeni od strane PFR-a, bez kartice.

## 6. Sledeći koraci (dopuna za PU dosije)

1. ~~Pokrenuti generisanje (deo 5)~~ — urađeno 2026-07-14 (API + PDF).
2. ~~Ubaciti sandbox primere u dosije~~ — `docs/ESIR-DOSIJE-PU.md` deo 0 (ček-lista) + deo 17 (mapa na упитник) + `npm run docs:dosije`.
3. ~~Scenariji **sa `buyerId`** + предрачун-реф. + обука-реф.~~ — urađeno 2026-07-15 (deo 17 popunjen, nema više „допунити“).
4. **Pre predaje:** popuniti detalje aplikanta u dosijeu (deo 1: kontakt osoba, obveznik/dobavljač); opciono papirni termalni isečci.
5. Regenerisati ODT/PDF dosije: `npm run docs:dosije`.
6. Predaja na TAP / razvojni portal uz упитник Самопроцена.

---

*С.О.К. доо Краљево · DigiPOS · priprema za odobrenje ESIR-a (V-PFR sandbox)*
