Fiscalization Test Console

Build, sign, and (optionally) submit Citizen / POS coupons using the local api.php endpoint.

Coupon types: when to use Citizen vs. POS
Citizen Coupon
A simplified, summary version of the receipt. Its serialized and signed data is what gets embedded in the QR code printed on the physical receipt. The Citizen Mobile App scans that QR code and submits this same data to /citizen/coupon so ATK can verify the receipt is authentic. This project's sendQrCode() call mimics that mobile app for testing.
POS Coupon
The full, detailed receipt (line items, payments, tax breakdown) as generated by the POS/till system itself. The POS system signs and submits this directly to ATK via /pos/coupon at the time of sale. Its totals and tax groups must exactly match the corresponding Citizen Coupon, or the receipt is marked FAILED VERIFICATION.

In practice, at the cash register: the moment a cashier finalizes a sale, the till software builds and submits the POS Coupon to ATK in the background — the customer never sees this step. At the same moment, that same sale's summarized data (Citizen Coupon) is encoded into the QR code printed at the bottom of the paper receipt. Days or weeks later, the customer can open the ATK Citizen Mobile App and scan that QR code to confirm the purchase was properly fiscalized (and, in Kosovo, to enter it into ATK's fiscal receipt lottery). So: POS Coupon = sent automatically by the store at checkout; Citizen Coupon = what the shopper's phone actually scans afterwards.

Tax rates reference (taxRate field)
Code VAT % Description
A 0% Exempt from VAT
C 0% Zero-rated VAT
D 8% Reduced VAT rate
E 18% Standard VAT rate

Used on both CouponItem.taxRate (per line item) and TaxGroup.taxRate (aggregated totals per rate). The sum of all TaxGroup.totalForTax/totalTax entries must reconcile with the coupon's total, totalTax, and totalNoTax fields.

Result

No request sent yet.