← User guide

Fiscal Receipt Capture (bločky / účtenky)

Captures cash-register receipts from a QR code, a photograph or an expense upload, checks that their figures add up, and turns them into a draft vendor receipt or an employee expense with the VAT split by rate.

Version19.0.1.1.0
EditionCommunity and Enterprise
LicenceAGPL-3
Requiresaccount, mail, l10n_cssk_core
Extended byl10n_cssk_receipt_capture_ai (delivered separately), l10n_cssk_receipt_capture_expense, l10n_sk_ekasa_receipt

What it is for

Fuel, meals, small purchases: a business collects many till receipts (bločky in Slovakia, účtenky in Czechia), and each has to be booked with its VAT split by rate. This module is the common frame for that. It holds the captured receipt — seller, date, total, items and the per-rate VAT recap — and turns it into Odoo documents, while separate capture providers supply the data:

Provider Module Reads
eKasa lookup l10n_sk_ekasa_receipt the QR code of a Slovak receipt; the seller's registered receipt, items and all, is fetched from the Finančná správa service
AI reader l10n_cssk_receipt_capture_ai (delivered separately) the photograph, with a language model — for Czech and foreign receipts, and Slovak ones whose code cannot be read (see AI reader)

A receipt that reads cleanly becomes a draft vendor receipt (Odoo's Purchase Receipt) or, with l10n_cssk_receipt_capture_expense, an employee expense (see Expenses). A receipt whose figures do not add up is parked for review, never rounded into place.

The VAT recap is kept as its own table because it is the only trustworthy source and a receipt may carry three rates (a Slovak restaurant bill: food, soft drinks, alcohol). Item quantities are kept on the receipt but posted as quantity 1 at the line total, since a unit price rounded to cents would not foot (31.17 l of fuel for 57.85 € is not 1.86 € × 31.17).

What is sent, when, and by whom

Where What Provider
Finančná správa (eKasa) the QR code text, or identifiers printed on the receipt eKasa lookup
your model provider, or Data Dance's extraction service through the broker the photograph or PDF of the receipt AI reader
the public company registers the seller's IČO, to confirm its name AI reader

A reading starts when:

Providers are tried in their order, code readers first: with the eKasa lookup enabled, a Slovak receipt with a readable QR code never reaches the model. Every attempt is logged on the receipt (Attempts) with its outcome, duration and, for the AI reader, tokens and cost.

Setting it up

Accounting → Configuration → Settings, block Fiscal Receipt Capture (labels in English; the module has no Czech or Slovak catalogue yet):

Setting Purpose
Receipt Journal purchase journal for vendor receipts; empty uses the first one
Default Expense Account account of every line; required before a vendor receipt can be created
Document Detail One line per VAT rate (default — posts exactly the base the seller reported) or One line per receipt item
Auto-create Seller currently has no effect: sellers are created with the Create Seller button
Receipts: AI Model Chain with the AI reader, see below

The purchase tax for each VAT rate is taken from the VAT-rate mapping of account_invoice_ai_extract (delivered separately) when installed, else the company's default purchase tax or a domestic purchase tax of that rate. A mapping that points a rate at a tax of another rate is refused.

Accounting → Configuration → Accounting → Capture Providers (managers) lists the providers with their order, countries and an Active switch.

To read QR codes off photographs, the server needs the Python package zxing-cpp; without it the receipt says so and the camera scan still works.

Working with receipts

Accounting → Vendors → Fiscal Receipts:

States: New → Captured (everything adds up), Needs Review (a check failed; the reason is shown), Error (the source refused or nothing could read it; the reason is shown) → Posted once a document exists.

Checks before a receipt counts as captured:

A receipt already captured with the same receipt identifier is refused as a duplicate. Accept Anyway moves a parked receipt to Captured on your responsibility; the reported discrepancy is kept in the chatter.

The seller is matched by VAT number, then IČO, then tax number — never by name. Create Seller creates a partner from the receipt's name, VAT number and IČO. The premises where the receipt was issued are kept as a note and do not reach the partner.

VAT that may not be deducted. When the total exceeds the limit above (400 EUR for a seller with a Slovak VAT number, 10 000 Kč for a Czech one; by the company's country when the receipt shows no VAT number), the receipt says so and its VAT is booked as part of the cost. Tick Full invoice held when you have a full invoice for the purchase. A vendor receipt from such a receipt cannot be posted with VAT on it.

Create Vendor Receipt creates a draft Purchase Receipt dated with the receipt, referenced by the receipt identifier, with one line per VAT rate or per item (quantity 1, net amount, the default expense account), and a copy of the photograph. It is refused when a rate has no purchase tax, when the mapped tax is price-included, or when the document's total or VAT — in total or per rate — differs from the receipt. Review and post it as usual.

AI reader

l10n_cssk_receipt_capture_ai (delivered separately) reads a photographed or scanned receipt (an image, or a PDF) with a language model, through the same connection as AI invoice extraction (delivered separately). It is the only reader for Czech receipts, which carry no code that can be looked up.

Every reading is a paid call; see what is sent for who can start one.

Expenses

l10n_cssk_receipt_capture_expense connects receipts with Odoo's Expenses app (Community):

Limitations