Jak vzniká QR kód na faktuře: od řetězce k matici
QR kód není obrázek, ale matice modulů s chybovou korekcí. Jak se do něj vejde platba i účetní data, proč mívá faktura verzi kolem dvanácté a jak ho vytisknout.
Na faktuře je QR kód nejvíc technická věc z celého listu — a jediná, kterou nikdo nečte očima. Tenhle text je o tom, co se s údaji děje mezi okamžikem, kdy je napíšete, a čtverečkem na papíře.
Co v kódu stojí za obsah, rozebírá QR platba na faktuře a formát řetězce heslo SPAYD. Tady jde o cestu z toho řetězce do matice.
Kód je mřížka, ne obrázek
QR kód je čtvercová mřížka černých a bílých modulů. Nejmenší (verze 1) má 21 × 21 modulů, největší (verze 40) 177 × 177; každá další verze přidá čtyři moduly na stranu. Norma je ISO/IEC 18004 a je veřejná v tom smyslu, že se podle ní dá kodér napsat.
Část mřížky nenese data: tři hledáčky v rozích, podle kterých čtečka najde kód a jeho natočení, tenké časovací řady mezi nimi, srovnávací značky u vyšších verzí a dva proužky s formátovou informací — v nich je zapsaná úroveň korekce a číslo použité masky. Teprve zbytek plochy je na data.
Kolem celého kódu musí zůstat tichá zóna široká čtyři moduly. Bez ní ho část čteček nenajde, i když je jinak v pořádku — a je to nejčastější důvod, proč kód „nefunguje“ jen na jednom dokladu.
Kolik se toho do kódu vejde
Data se kódují v jednom ze čtyř režimů; pro fakturu stačí bajtový, protože řetězec platby je ASCII (diakritika se z něj odstraňuje). Číselný režim by čísla zhustil, ale musel by se přepínat uprostřed řetězce — u tiché chyby na faktuře je to špatný obchod.
K datům se přidávají opravné bajty (Reed–Solomonův kód). Úrovně jsou čtyři a liší se tím, jakou část kódu smíte zničit, než přestane být čitelný:
| Úroveň | Obnoví přibližně | K čemu |
|---|---|---|
| L | 7 % | obrazovka, čistý sken |
| M | 15 % | tisk na papír — používá ji i tenhle nástroj |
| Q | 25 % | provoz, kde se kód ušpiní |
| H | 30 % | štítky, kód pod fólií |
Verze se pak volí jako nejmenší, do které se data při dané úrovni vejdou. Samotná platební část faktury je krátká a vystačí si s verzí kolem páté. Jakmile se přidají účetní data v klíči X-INV, řetězec vyroste na zhruba dvě stě sedmdesát znaků a kód povyskočí na verzi 12, tedy 65 × 65 modulů. To je cena za to, že účetní na druhé straně nic nepřepisuje — a je to dobrá cena, protože se platí jednou při tisku.
Maska a proč jich je osm
Kdyby se bity vysypaly do mřížky tak, jak vyjdou, vznikaly by v kódu velké jednolité plochy nebo vzory podobné hledáčkům — a čtečka by zakolísala. Norma proto předepisuje osm masek: přes datovou část se přeloží pravidelný vzor, který vybrané moduly převrátí.
Kodér zkusí všech osm, každou oboduje podle pravidel normy (souvislé pruhy, čtverce 2 × 2, vzor připomínající hledáček, nepoměr černé a bílé) a nechá tu s nejnižším skóre. Číslo masky pak zapíše do formátové informace, aby čtečka věděla, čím to odmaskovat. Nejde tedy o volbu vzhledu — dva kódy s týmž obsahem můžou vypadat jinak a oba být správně.
Aby to čtečka přečetla z papíru
Faktura se tiskne a skenuje z papíru, takže rozhoduje fyzická velikost modulu, ne rozlišení souboru:
- Vektor, ne rastr. SVG je ostré v jakémkoli DPI; rastrový obrázek roztažený na papíře dá roztřepené hrany a korekce se spotřebuje na chyby, které nemusely vzniknout.
- Modul aspoň půl milimetru. Menší kód sice čtečka někdy přečte, ale telefon v ruce nad papírem už ne.
- Nic do středu. Logo uprostřed kódu ukusuje z téže rezervy, která má krýt pomačkání a špatný tisk. Na dokladu, který jde poštou, ji nemá smysl utrácet za ozdobu.
- Černá na bílé. Obrácený kontrast ani barevný podklad nejsou v normě zakázané, ale sníží spolehlivost čtení tam, kde ji nejvíc potřebujete.
Co se stane po naskenování
Bankovní aplikace přečte platební část a předvyplní příkaz: účet, částku, variabilní symbol, splatnost. Účetní část je pro ni neznámý klíč a ignoruje ji.
Účetní program (Pohoda, Money, iDoklad) přečte i ji a založí přijatý doklad — s číslem faktury, DIČ obou stran, datem vystavení, DUZP a rekapitulací daně po sazbách. Zůstane doplnit zaúčtování a středisko, protože ty z faktury nevyčte nikdo. Podrobněji QR Faktura.
Jeden důsledek stojí za zapamatování: kód se musí generovat z týchž dat, která se tisknou. Kdyby se doklad po vygenerování ručně upravil, čtečka by načetla starou částku — a to je jediná chyba na faktuře, kterou nikdo neuvidí, dokud nepřijde platba v jiné výši.