kassza 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
+ <!-- Ezt a fájlt a readme/build.mjs generálja a readme/template.md alapján. Ne szerkeszd kézzel: írd át a sablont, és futtasd az npm run readme parancsot. -->
2
+
1
3
  <p align="center">
2
- <img src="https://raw.githubusercontent.com/futozs/kassza/main/assets/logo-wordmark.svg" alt="kassza" width="460">
4
+ <a href="https://kassza-amber.vercel.app"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/hero-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/hero-light.svg" alt="kassza: Számlázz.hu, TypeScriptben. Telepítés: npm i kassza" width="100%"></picture></a>
3
5
  </p>
4
6
 
5
7
  <p align="center">
@@ -8,17 +10,18 @@
8
10
  </p>
9
11
 
10
12
  <p align="center">
11
- <a href="https://kassza-amber.vercel.app/">Weboldal</a> ·
12
- <a href="https://www.npmjs.com/package/kassza">npm</a> ·
13
- <a href="https://github.com/futozs/kassza">GitHub</a>
13
+ <a href="https://www.npmjs.com/package/kassza"><img src="https://img.shields.io/npm/v/kassza?label=npm&style=flat-square&labelColor=1c2620&color=167337" alt="npm verzió"></a>
14
+ <a href="https://www.npmjs.com/package/kassza"><img src="https://img.shields.io/npm/dm/kassza?label=let%C3%B6lt%C3%A9s&style=flat-square&labelColor=1c2620&color=167337" alt="havi letöltés"></a>
15
+ <a href="https://github.com/futozs/kassza/blob/main/package.json"><img src="https://img.shields.io/badge/f%C3%BCgg%C5%91s%C3%A9g-0-167337?style=flat-square&labelColor=1c2620" alt="0 futásidejű függőség"></a>
16
+ <a href="https://github.com/futozs/kassza/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/kassza?label=licenc&style=flat-square&labelColor=1c2620&color=167337" alt="MIT licenc"></a>
14
17
  </p>
15
18
 
16
19
  <p align="center">
17
- <a href="https://www.npmjs.com/package/kassza"><img src="https://img.shields.io/npm/v/kassza?color=14532D&label=npm" alt="npm verzió"></a>
18
- <a href="https://www.npmjs.com/package/kassza"><img src="https://img.shields.io/npm/dm/kassza?color=14532D&label=letöltés" alt="havi letöltés"></a>
19
- <img src="https://img.shields.io/badge/függőség-0-14532D" alt="0 függőség">
20
- <img src="https://img.shields.io/badge/TypeScript-szigorú-14532D" alt="TypeScript">
21
- <img src="https://img.shields.io/npm/l/kassza?color=14532D&label=licenc" alt="MIT licenc">
20
+ <a href="https://kassza-amber.vercel.app"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/nav-web-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/nav-web-light.svg" alt="Weboldal: kassza-amber.vercel.app" width="428"></picture></a>
21
+ <a href="https://kassza-amber.vercel.app/docs"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/nav-docs-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/nav-docs-light.svg" alt="Dokumentáció: 92 oldal, magyarul" width="428"></picture></a>
22
+ <br>
23
+ <a href="https://kassza-amber.vercel.app/sandbox"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/nav-sandbox-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/nav-sandbox-light.svg" alt="Sandbox: 27 futtatható példa" width="428"></picture></a>
24
+ <a href="https://kassza-amber.vercel.app/docs/receptek"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/nav-recipes-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/nav-recipes-light.svg" alt="Receptek: 11 kész integráció" width="428"></picture></a>
22
25
  </p>
23
26
 
24
27
  ```bash
@@ -40,12 +43,26 @@ console.log(szamla.number, szamla.grossTotal)
40
43
 
41
44
  Ennyi. A kerekítést, a magyar dátumot, az XML-t, a session cookie-t és a hibakezelést a kassza intézi, a vevő pedig e-mailben megkapja a számlát.
42
45
 
46
+ <p>
47
+ <a href="https://kassza-amber.vercel.app/docs/alapok/telepites"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-light.svg" alt="Dokumentáció: Telepítés" height="44"></picture></a>
48
+ <a href="https://kassza-amber.vercel.app/sandbox?pelda=szamla"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-light.svg" alt="Futtasd a sandboxban: Számla kiállítása" height="44"></picture></a>
49
+ </p>
50
+
43
51
  ## Miért kassza?
44
52
 
45
53
  <p align="center">
46
- <img src="https://raw.githubusercontent.com/futozs/kassza/main/assets/comparison.svg" alt="Számla Agent műveletek: kassza 11, a többi csomag 2–3" width="720">
54
+ <picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/matrix-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/matrix-light.svg" alt="Számla Agent műveletek: a kassza mind a 11-et tudja, a többi csomag 2 vagy 3 műveletet" width="100%"></picture>
47
55
  </p>
48
56
 
57
+ - **Mind a 11 Agent művelet.** Számla, díjbekérő, nyugta, sztornó, befizetés, PDF és adószám, nem csak a számla kiállítása.
58
+ - **Pontos kerekítés.** A tételek nettó, áfa és bruttó értékét a Számlázz.hu szabályai szerint számolja, mert egy forint eltérés is elég, hogy a számla ne készüljön el.
59
+ - **Nincs dupla számla.** Számlát a kassza soha nem küld újra magától, bizonytalan hiba után pedig a rendelésszámmal visszakeresheted.
60
+ - **Egy hibatípus.** A Számlázz.hu háromféle hibaformátumából egyetlen `SzamlazzError` lesz, magyar üzenettel és javítási tippel.
61
+ - **Serverless és edge.** Node, Bun, Deno, Cloudflare Workers és Vercel Edge alatt is fut, a session cookie közös tárolóban is lehet.
62
+
63
+ <details>
64
+ <summary><b>Részletes összehasonlítás</b> · 6 csomag, 12 szempont</summary>
65
+
49
66
  | | **kassza** | szamlazz.js | @ribbery009/ szamlazz-ts | @halftome/ szamlazz-client | szamlazz.ts | szamlazzhu-client |
50
67
  |---|:---:|:---:|:---:|:---:|:---:|:---:|
51
68
  | Számla, sztornó | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
@@ -63,30 +80,67 @@ Ennyi. A kerekítést, a magyar dátumot, az XML-t, a session cookie-t és a hib
63
80
 
64
81
  <sub>A műveleteket 2026 szeptemberében a publikált csomagok kódjában ellenőriztük (melyik Agent form mezőt küldik). Az Edge oszlopban ❌ az axios, tough-cookie vagy form-data függőség miatt szerepel, ezek nem futnak Workers alatt. A „–” azt jelenti, hogy nem teszteltük.</sub>
65
82
 
83
+ </details>
84
+
85
+ <p>
86
+ <a href="https://kassza-amber.vercel.app/docs/alapok/mi-a-kassza"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-light.svg" alt="Dokumentáció: Mi a kassza?" height="44"></picture></a>
87
+ </p>
88
+
66
89
  ## Tartalom
67
90
 
68
- - [Weboldal, sandbox és receptek](#weboldal-sandbox-és-receptek)
69
- - [Beállítás](#beállítás)
70
- - [Számlák](#számlák)
71
- - [Nyugták](#nyugták)
72
- - [Adószám lekérdezés](#adószám-lekérdezés)
73
- - [Hibakezelés](#hibakezelés)
74
- - [Fizetési értesítés (IPN)](#fizetési-értesítés-ipn)
75
- - [PDF mentése tárhelyre](#pdf-mentése-tárhelyre)
76
- - [Serverless és edge](#serverless-és-edge)
77
- - [Tesztelés](#tesztelés)
78
- - [Validátorok és pénzszámítás](#validátorok-és-pénzszámítás)
79
- - [Haladó beállítások](#haladó-beállítások)
80
- - [AI-val kódolsz?](#ai-val-kódolsz)
91
+ | Kezdés | Műveletek | Kiegészítők |
92
+ | --- | --- | --- |
93
+ | 🌐 [Weboldal, sandbox és receptek](#weboldal-sandbox-és-receptek) | 📄 [Számlák](#számlák) | 🗄️ [PDF mentése tárhelyre](#pdf-mentése-tárhelyre) |
94
+ | ⚙️ [Beállítás](#beállítás) | 🧾 [Nyugták](#nyugták) | ⚡ [Serverless és edge](#serverless-és-edge) |
95
+ | 🚨 [Hibakezelés](#hibakezelés) | 🏛️ [Adószám lekérdezés](#adószám-lekérdezés) | 🧪 [Tesztelés](#tesztelés) |
96
+ | 🎛️ [Haladó beállítások](#haladó-beállítások) | 🔔 [Fizetési értesítés (IPN)](#fizetési-értesítés-ipn) | 🧮 [Validátorok és pénzszámítás](#validátorok-és-pénzszámítás) |
97
+ | 🤖 [AI-val kódolsz?](#ai-val-kódolsz) | | |
81
98
 
82
99
  ## Weboldal, sandbox és receptek
83
100
 
84
- - **Weboldal:** [kassza-amber.vercel.app](https://kassza-amber.vercel.app/)
85
- - **Dokumentáció:** [kassza-amber.vercel.app/docs](https://kassza-amber.vercel.app/docs)
86
- - **Sandbox:** [kassza-amber.vercel.app/sandbox](https://kassza-amber.vercel.app/sandbox) — futtasd a TypeScript példákat böngészőben, Agent kulcs nélkül, szimulált Számlázz.hu válaszokkal és elküldött XML-lel.
87
- - **Receptek:** [kassza-amber.vercel.app/docs/receptek](https://kassza-amber.vercel.app/docs/receptek) — kész minták fizetett rendelésekhez, webhookokhoz, IPN-hez, PDF-tárhelyhez, serverless környezethez és teszteléshez.
88
- - **npm csomag:** [npmjs.com/package/kassza](https://www.npmjs.com/package/kassza)
89
- - **Hivatalos Számlázz.hu Agent dokumentáció:** [docs.szamlazz.hu/hu/agent](https://docs.szamlazz.hu/hu/agent/)
101
+ A teljes magyar dokumentáció, a sandbox és a receptek a **[kassza-amber.vercel.app](https://kassza-amber.vercel.app)** oldalon vannak.
102
+
103
+ <p align="center">
104
+ <a href="https://kassza-amber.vercel.app/sandbox?pelda=szamla"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/showcase-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/showcase-light.svg" alt="A kassza sandbox: futtatható példák, TypeScript kód és a ténylegesen elküldött XML" width="100%"></picture></a>
105
+ </p>
106
+
107
+ - 📖 **[Dokumentáció](https://kassza-amber.vercel.app/docs)**: 92 oldal magyarul. Minden Agent művelethez kérés, válasz és futtatható minta, a beállítások, a szabályok és az összes ismert hibakód.
108
+ - ▶️ **[Sandbox](https://kassza-amber.vercel.app/sandbox)**: 27 példa, amit a böngészőben futtathatsz Agent kulcs nélkül, szimulált Számlázz.hu ellen, a ténylegesen elküldött XML-lel. A saját kódodat linkként meg is oszthatod.
109
+ - 🍳 **[Receptek](https://kassza-amber.vercel.app/docs/receptek)**: 11 teljes, bemásolható integráció webshophoz, Stripe és IPN webhookhoz, díjbekérőhöz, pénztári nyugtához, PDF tárhelyhez, Cloudflare Workershez és tesztekhez.
110
+ - 🤖 **[llms.txt](https://kassza-amber.vercel.app/llms.txt)**: a dokumentáció tartalomjegyzéke AI asszisztenseknek, a teljes szöveg egy fájlban: [llms-full.txt](https://kassza-amber.vercel.app/llms-full.txt).
111
+ - 📦 **[npm csomag](https://www.npmjs.com/package/kassza)** · 🏛️ **[Hivatalos Számlázz.hu Agent dokumentáció](https://docs.szamlazz.hu/hu/agent/)**
112
+
113
+ <details>
114
+ <summary>🍳 <b>Mind a 11 recept</b></summary>
115
+
116
+ - **[Közös kliens](https://kassza-amber.vercel.app/docs/receptek/kozos-kliens)**: Egyetlen szerveroldali kassza kliens alapbeállításokkal, hibanaplózással és közös munkamenettel, amelyet a többi recept importál.
117
+ - **[Fizetett rendelés számlája](https://kassza-amber.vercel.app/docs/receptek/fizetett-rendeles-szamla)**: Idempotens számlázás rendelésszámmal.
118
+ - **[Stripe webhook](https://kassza-amber.vercel.app/docs/receptek/stripe-webhook)**: Számla a Stripe Checkout checkout.session.completed eseményéből.
119
+ - **[Nevezés díjbekérővel](https://kassza-amber.vercel.app/docs/receptek/nevezes-dijbekerovel)**: Versenynevezés vagy rendezvényjelentkezés átutalásos fizetéssel.
120
+ - **[IPN webhook](https://kassza-amber.vercel.app/docs/receptek/ipn-webhook)**: A Számlázz.hu fizetési értesítésének (IPN) fogadása Next.js route handlerben, IP-ellenőrzéssel, a számla állapotának visszaellenőrzésével és idempotens mentéssel.
121
+ - **[Pénztári nyugta](https://kassza-amber.vercel.app/docs/receptek/penztari-nyugta)**: Nyugta egy pénztári eladásról hívásazonosítóval, a dupla nyugta kezelésével és e-mail kiküldéssel, Next.js route handlerben.
122
+ - **[PDF mentése S3-ba vagy R2-be](https://kassza-amber.vercel.app/docs/receptek/pdf-mentes-s3-r2)**: A számla PDF-jének mentése saját Amazon S3 vagy Cloudflare R2 tárhelyre AWS SDK nélkül, stabil kulccsal és rövid ideig érvényes letöltési linkkel.
123
+ - **[Adószám alapú kitöltés](https://kassza-amber.vercel.app/docs/receptek/adoszam-urlap)**: Számlázási űrlap, amely a beírt adószám alapján a NAV adataiból tölti ki a cégnevet és a székhely címét.
124
+ - **[Devizás számla EU-s cégnek](https://kassza-amber.vercel.app/docs/receptek/devizas-eu-szamla)**: Euróban kiállított, angol nyelvű számla másik tagállambeli cégnek, közösségi adószámmal, MNB árfolyammal és angol értesítő e-maillel.
125
+ - **[Cloudflare Workers](https://kassza-amber.vercel.app/docs/receptek/cloudflare-workers)**: Cloudflare Worker, amely a kasszával lekérdezi a számlákat, a munkamenetet KV-ben tartja, a számla PDF-eket pedig R2-ben gyorsítótárazza.
126
+ - **[Egységtesztek](https://kassza-amber.vercel.app/docs/receptek/egysegtesztek)**: Vitest tesztek a receptek kódjához mock klienssel.
127
+
128
+ </details>
129
+
130
+ <details>
131
+ <summary>▶️ <b>Mind a 27 sandbox példa</b></summary>
132
+
133
+ **Számlák:** [Számla kiállítása](https://kassza-amber.vercel.app/sandbox?pelda=szamla) · [Webshop számla bruttó árakkal](https://kassza-amber.vercel.app/sandbox?pelda=szamla-brutto) · [Díjbekérő, majd számla](https://kassza-amber.vercel.app/sandbox?pelda=dijbekero-szamla) · [Előleg- és végszámla](https://kassza-amber.vercel.app/sandbox?pelda=eloleg-vegszamla) · [Helyesbítő számla](https://kassza-amber.vercel.app/sandbox?pelda=helyesbito-szamla) · [Devizás számla EU-s vevőnek](https://kassza-amber.vercel.app/sandbox?pelda=devizas-szamla) · [Számlaelőnézet](https://kassza-amber.vercel.app/sandbox?pelda=elonezet) · [Számla sztornózása](https://kassza-amber.vercel.app/sandbox?pelda=sztorno) · [Befizetések rögzítése](https://kassza-amber.vercel.app/sandbox?pelda=befizetes) · [PDF lekérése utólag](https://kassza-amber.vercel.app/sandbox?pelda=pdf-lekeres) · [Számla adatainak lekérése](https://kassza-amber.vercel.app/sandbox?pelda=szamla-adatai) · [Díjbekérő törlése](https://kassza-amber.vercel.app/sandbox?pelda=dijbekero-torlese)
134
+
135
+ **Nyugták:** [Nyugta kiállítása](https://kassza-amber.vercel.app/sandbox?pelda=nyugta) · [Nyugta sztornózása](https://kassza-amber.vercel.app/sandbox?pelda=nyugta-sztorno) · [Nyugta lekérdezése](https://kassza-amber.vercel.app/sandbox?pelda=nyugta-lekerdezes) · [Nyugta kiküldése e-mailben](https://kassza-amber.vercel.app/sandbox?pelda=nyugta-kikuldes)
136
+
137
+ **NAV:** [Adószám lekérdezése](https://kassza-amber.vercel.app/sandbox?pelda=adoszam)
138
+
139
+ **Hibakezelés:** [Idempotens számlázás hiba után](https://kassza-amber.vercel.app/sandbox?pelda=hibakezeles-idempotens) · [Validációs hibák](https://kassza-amber.vercel.app/sandbox?pelda=hibakezeles-validacio) · [Agent kulcs ellenőrzése](https://kassza-amber.vercel.app/sandbox?pelda=kulcs-ellenorzes) · [Hookok és újrapróbálás](https://kassza-amber.vercel.app/sandbox?pelda=hookok)
140
+
141
+ **Eszközök:** [Közös session több kliens között](https://kassza-amber.vercel.app/sandbox?pelda=munkamenet) · [Mock kliens tesztekhez](https://kassza-amber.vercel.app/sandbox?pelda=mock-kliens) · [Kerekítés és összegzés](https://kassza-amber.vercel.app/sandbox?pelda=kerekites) · [Validátorok](https://kassza-amber.vercel.app/sandbox?pelda=validatorok) · [IPN fizetési értesítés](https://kassza-amber.vercel.app/sandbox?pelda=ipn) · [PDF mentése tárhelyre](https://kassza-amber.vercel.app/sandbox?pelda=pdf-tarhely)
142
+
143
+ </details>
90
144
 
91
145
  ## Beállítás
92
146
 
@@ -102,6 +156,9 @@ import { createKassza } from 'kassza'
102
156
  export const kassza = createKassza()
103
157
  ```
104
158
 
159
+ <details>
160
+ <summary><b>Alapbeállítások és a kulcs ellenőrzése</b> · <code>defaults</code>, <code>verifyCredentials()</code></summary>
161
+
105
162
  Az ismétlődő adatokat elég egyszer megadni:
106
163
 
107
164
  ```ts
@@ -122,9 +179,22 @@ await kassza.verifyCredentials()
122
179
 
123
180
  A `verifyCredentials()` visszatérési értéke `true`, ha a kulcs jó.
124
181
 
182
+ 📖 **Dokumentáció:** [Hitelesítés (Agent kulcs)](https://kassza-amber.vercel.app/docs/alapok/hitelesites) &nbsp;·&nbsp; ▶️ **Sandbox:** [Agent kulcs ellenőrzése](https://kassza-amber.vercel.app/sandbox?pelda=kulcs-ellenorzes)
183
+
184
+ </details>
185
+
186
+ <p>
187
+ <a href="https://kassza-amber.vercel.app/docs/alapok/kliens-beallitasa"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-light.svg" alt="Dokumentáció: Kliens beállítása" height="44"></picture></a>
188
+ <a href="https://kassza-amber.vercel.app/sandbox?pelda=kulcs-ellenorzes"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-light.svg" alt="Futtasd a sandboxban: Agent kulcs ellenőrzése" height="44"></picture></a>
189
+ <a href="https://kassza-amber.vercel.app/docs/receptek/kozos-kliens"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-kozos-kliens-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-kozos-kliens-light.svg" alt="Recept: Közös kliens" height="44"></picture></a>
190
+ </p>
191
+
125
192
  ## Számlák
126
193
 
127
- ### Számla
194
+ Egyetlen metódus, az `invoices.create()` állít ki számlát, díjbekérőt, előleg-, vég- és helyesbítő számlát vagy szállítólevelet. Mellette ott a sztornó, a befizetés, a PDF és a lekérdezés.
195
+
196
+ <details>
197
+ <summary><b>Számla</b> · <code>invoices.create()</code></summary>
128
198
 
129
199
  ```ts
130
200
  const szamla = await kassza.invoices.create({
@@ -154,6 +224,13 @@ szamla.pdf
154
224
  - Az `orderNumber` a saját azonosítód, ezzel később vissza is keresheted a számlát.
155
225
  - A `szamla.pdf` egy `Uint8Array`.
156
226
 
227
+ 📖 **Dokumentáció:** [Számla létrehozás › Kérés](https://kassza-amber.vercel.app/docs/szamla-letrehozas/keres) &nbsp;·&nbsp; ▶️ **Sandbox:** [Számla kiállítása](https://kassza-amber.vercel.app/sandbox?pelda=szamla)
228
+
229
+ </details>
230
+
231
+ <details>
232
+ <summary><b>Nettó vagy bruttó ár, áfakulcsok</b> · <code>netUnitPrice</code>, <code>grossUnitPrice</code>, <code>vat</code></summary>
233
+
157
234
  Az ár megadható nettóban vagy bruttóban, a kerekítés a hivatalos szabályok szerint történik:
158
235
 
159
236
  ```ts
@@ -163,9 +240,14 @@ Az ár megadható nettóban vagy bruttóban, a kerekítés a hivatalos szabályo
163
240
  { name: 'Oktatás', netUnitPrice: 50_000, vat: 'AAM' }
164
241
  ```
165
242
 
166
- A nettó ár a B2B számlákhoz, a bruttó ár a B2C számlákhoz való. Az `'AAM'` alanyi adómentes tételt jelöl.
243
+ A nettó ár a B2B számlákhoz, a bruttó ár a B2C számlákhoz való. Az `'AAM'` alanyi adómentes tételt jelöl, a többi áfakódot a [Áfakulcsok](https://kassza-amber.vercel.app/docs/szamla-letrehozas/beallitasok-es-szabalyok/afakulcsok) oldal sorolja fel.
244
+
245
+ 📖 **Dokumentáció:** [Kerekítés](https://kassza-amber.vercel.app/docs/szamla-letrehozas/beallitasok-es-szabalyok/kerekites) &nbsp;·&nbsp; ▶️ **Sandbox:** [Webshop számla bruttó árakkal](https://kassza-amber.vercel.app/sandbox?pelda=szamla-brutto)
167
246
 
168
- ### Díjbekérő, majd számla
247
+ </details>
248
+
249
+ <details>
250
+ <summary><b>Díjbekérő, majd számla</b> · <code>type: 'proforma'</code></summary>
169
251
 
170
252
  ```ts
171
253
  const dijbekero = await kassza.invoices.create({
@@ -184,13 +266,23 @@ const szamla = await kassza.invoices.create({
184
266
  })
185
267
  ```
186
268
 
187
- ### Díjbekérő törlése
269
+ 📖 **Dokumentáció:** [Bizonylattípusok](https://kassza-amber.vercel.app/docs/szamla-letrehozas/beallitasok-es-szabalyok/bizonylattipusok) &nbsp;·&nbsp; ▶️ **Sandbox:** [Díjbekérő, majd számla](https://kassza-amber.vercel.app/sandbox?pelda=dijbekero-szamla)
270
+
271
+ </details>
272
+
273
+ <details>
274
+ <summary><b>Díjbekérő törlése</b> · <code>invoices.deleteProforma()</code></summary>
188
275
 
189
276
  ```ts
190
277
  await kassza.invoices.deleteProforma({ orderNumber: 'NEV-42' })
191
278
  ```
192
279
 
193
- ### Előleg- és végszámla
280
+ 📖 **Dokumentáció:** [Díjbekérő törlése](https://kassza-amber.vercel.app/docs/dijbekero-torlese) &nbsp;·&nbsp; ▶️ **Sandbox:** [Díjbekérő törlése](https://kassza-amber.vercel.app/sandbox?pelda=dijbekero-torlese)
281
+
282
+ </details>
283
+
284
+ <details>
285
+ <summary><b>Előleg- és végszámla</b> · <code>type: 'advance'</code>, <code>'final'</code></summary>
194
286
 
195
287
  ```ts
196
288
  const eloleg = await kassza.invoices.create({
@@ -212,7 +304,12 @@ await kassza.invoices.create({
212
304
  })
213
305
  ```
214
306
 
215
- ### Helyesbítő számla
307
+ 📖 **Dokumentáció:** [Bizonylattípusok](https://kassza-amber.vercel.app/docs/szamla-letrehozas/beallitasok-es-szabalyok/bizonylattipusok) &nbsp;·&nbsp; ▶️ **Sandbox:** [Előleg- és végszámla](https://kassza-amber.vercel.app/sandbox?pelda=eloleg-vegszamla)
308
+
309
+ </details>
310
+
311
+ <details>
312
+ <summary><b>Helyesbítő számla</b> · <code>type: 'corrective'</code></summary>
216
313
 
217
314
  ```ts
218
315
  await kassza.invoices.create({
@@ -223,13 +320,23 @@ await kassza.invoices.create({
223
320
  })
224
321
  ```
225
322
 
226
- ### Szállítólevél
323
+ 📖 **Dokumentáció:** [Bizonylattípusok](https://kassza-amber.vercel.app/docs/szamla-letrehozas/beallitasok-es-szabalyok/bizonylattipusok) &nbsp;·&nbsp; ▶️ **Sandbox:** [Helyesbítő számla](https://kassza-amber.vercel.app/sandbox?pelda=helyesbito-szamla)
324
+
325
+ </details>
326
+
327
+ <details>
328
+ <summary><b>Szállítólevél</b> · <code>type: 'deliveryNote'</code></summary>
227
329
 
228
330
  ```ts
229
331
  await kassza.invoices.create({ type: 'deliveryNote', buyer, items })
230
332
  ```
231
333
 
232
- ### Devizás számla, külföldi vevő
334
+ 📖 **Dokumentáció:** [Bizonylattípusok](https://kassza-amber.vercel.app/docs/szamla-letrehozas/beallitasok-es-szabalyok/bizonylattipusok)
335
+
336
+ </details>
337
+
338
+ <details>
339
+ <summary><b>Devizás számla, külföldi vevő</b> · <code>currency</code>, <code>language</code></summary>
233
340
 
234
341
  ```ts
235
342
  await kassza.invoices.create({
@@ -248,15 +355,25 @@ await kassza.invoices.create({
248
355
  })
249
356
  ```
250
357
 
251
- Az árfolyam, ha nem adod meg, automatikusan az MNB aktuális árfolyama.
358
+ Az árfolyam, ha nem adod meg, automatikusan az MNB aktuális árfolyama. Kész minta: [Devizás számla EU-s cégnek](https://kassza-amber.vercel.app/docs/receptek/devizas-eu-szamla).
252
359
 
253
- ### Előnézet, számla kiállítása nélkül
360
+ 📖 **Dokumentáció:** [Támogatott devizanemek](https://kassza-amber.vercel.app/docs/szamla-letrehozas/beallitasok-es-szabalyok/penznemek) &nbsp;·&nbsp; ▶️ **Sandbox:** [Devizás számla EU-s vevőnek](https://kassza-amber.vercel.app/sandbox?pelda=devizas-szamla)
361
+
362
+ </details>
363
+
364
+ <details>
365
+ <summary><b>Előnézet, számla kiállítása nélkül</b> · <code>invoices.preview()</code></summary>
254
366
 
255
367
  ```ts
256
368
  const { pdf, grossTotal } = await kassza.invoices.preview({ buyer, items })
257
369
  ```
258
370
 
259
- ### Melléklet az e-mailhez
371
+ 📖 **Dokumentáció:** [Előnézet](https://kassza-amber.vercel.app/docs/szamla-letrehozas/beallitasok-es-szabalyok/elonezet) &nbsp;·&nbsp; ▶️ **Sandbox:** [Számlaelőnézet](https://kassza-amber.vercel.app/sandbox?pelda=elonezet)
372
+
373
+ </details>
374
+
375
+ <details>
376
+ <summary><b>Melléklet az e-mailhez</b> · <code>attachments</code></summary>
260
377
 
261
378
  ```ts
262
379
  await kassza.invoices.create({
@@ -268,13 +385,23 @@ await kassza.invoices.create({
268
385
 
269
386
  Legfeljebb 5 melléklet adható meg, darabonként 2 MB.
270
387
 
271
- ### Sztornó
388
+ 📖 **Dokumentáció:** [Számlaértesítő küldés](https://kassza-amber.vercel.app/docs/szamla-letrehozas/beallitasok-es-szabalyok/ertesito-email)
389
+
390
+ </details>
391
+
392
+ <details>
393
+ <summary><b>Sztornó</b> · <code>invoices.reverse()</code></summary>
272
394
 
273
395
  ```ts
274
396
  const sztorno = await kassza.invoices.reverse('E-WEB-2026-12')
275
397
  ```
276
398
 
277
- ### Befizetés rögzítése
399
+ 📖 **Dokumentáció:** [Számla sztornó](https://kassza-amber.vercel.app/docs/szamla-sztorno) &nbsp;·&nbsp; ▶️ **Sandbox:** [Számla sztornózása](https://kassza-amber.vercel.app/sandbox?pelda=sztorno)
400
+
401
+ </details>
402
+
403
+ <details>
404
+ <summary><b>Befizetés rögzítése</b> · <code>invoices.registerPayment()</code></summary>
278
405
 
279
406
  ```ts
280
407
  await kassza.invoices.registerPayment({ invoiceNumber: 'E-WEB-2026-12', amount: 12_700 })
@@ -292,7 +419,12 @@ await kassza.invoices.clearPayments('E-WEB-2026-12')
292
419
 
293
420
  A `registerPayment` egyetlen befizetést és több részletet is fogad. A `clearPayments` az összes befizetést törli a számláról.
294
421
 
295
- ### PDF letöltése utólag
422
+ 📖 **Dokumentáció:** [Befizetés rögzítése](https://kassza-amber.vercel.app/docs/befizetes-rogzitese) &nbsp;·&nbsp; ▶️ **Sandbox:** [Befizetések rögzítése](https://kassza-amber.vercel.app/sandbox?pelda=befizetes)
423
+
424
+ </details>
425
+
426
+ <details>
427
+ <summary><b>PDF letöltése utólag</b> · <code>invoices.getPdf()</code></summary>
296
428
 
297
429
  ```ts
298
430
  import { writeFile } from 'node:fs/promises'
@@ -303,7 +435,12 @@ await writeFile('szamla.pdf', pdf)
303
435
 
304
436
  Rendelésszám vagy külső azonosító alapján is működik: `getPdf({ orderNumber: 'REND-1001' })`, `getPdf({ externalId: 'a1b2' })`.
305
437
 
306
- ### Számla adatainak lekérése
438
+ 📖 **Dokumentáció:** [Bizonylat lekérése PDF-ben](https://kassza-amber.vercel.app/docs/bizonylat-pdf) &nbsp;·&nbsp; ▶️ **Sandbox:** [PDF lekérése utólag](https://kassza-amber.vercel.app/sandbox?pelda=pdf-lekeres)
439
+
440
+ </details>
441
+
442
+ <details>
443
+ <summary><b>Számla adatainak lekérése</b> · <code>invoices.get()</code>, <code>invoices.find()</code></summary>
307
444
 
308
445
  ```ts
309
446
  const adatok = await kassza.invoices.get({ orderNumber: 'REND-1001' })
@@ -317,9 +454,22 @@ const talan = await kassza.invoices.find({ orderNumber: 'REND-9999' })
317
454
 
318
455
  A `find` `null`-t ad, ha nincs ilyen számla, a `get` ilyenkor hibát dob.
319
456
 
457
+ 📖 **Dokumentáció:** [Számla adatainak lekérése](https://kassza-amber.vercel.app/docs/szamla-adatai) &nbsp;·&nbsp; ▶️ **Sandbox:** [Számla adatainak lekérése](https://kassza-amber.vercel.app/sandbox?pelda=szamla-adatai)
458
+
459
+ </details>
460
+
461
+ <p>
462
+ <a href="https://kassza-amber.vercel.app/docs/szamla-letrehozas"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-light.svg" alt="Dokumentáció: Számla létrehozás" height="44"></picture></a>
463
+ <a href="https://kassza-amber.vercel.app/sandbox?pelda=szamla"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-light.svg" alt="Futtasd a sandboxban: Számla kiállítása" height="44"></picture></a>
464
+ <a href="https://kassza-amber.vercel.app/docs/receptek/fizetett-rendeles-szamla"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-fizetett-rendeles-szamla-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-fizetett-rendeles-szamla-light.svg" alt="Recept: Fizetett rendelés számlája" height="44"></picture></a>
465
+ </p>
466
+
320
467
  ## Nyugták
321
468
 
322
- ### Nyugta
469
+ Nyugta kiállítása, kiküldése e-mailben, lekérdezése és sztornózása, forintos kerekítéssel és a dupla nyugta elleni hívásazonosítóval.
470
+
471
+ <details>
472
+ <summary><b>Nyugta</b> · <code>receipts.create()</code></summary>
323
473
 
324
474
  ```ts
325
475
  const nyugta = await kassza.receipts.create({
@@ -339,27 +489,57 @@ nyugta.pdf
339
489
 
340
490
  A `callId` véd a dupla nyugta ellen.
341
491
 
342
- ### Kiküldés e-mailben
492
+ 📖 **Dokumentáció:** [Nyugta létrehozás](https://kassza-amber.vercel.app/docs/nyugta-letrehozas) &nbsp;·&nbsp; ▶️ **Sandbox:** [Nyugta kiállítása](https://kassza-amber.vercel.app/sandbox?pelda=nyugta)
493
+
494
+ </details>
495
+
496
+ <details>
497
+ <summary><b>Kiküldés e-mailben</b> · <code>receipts.send()</code></summary>
343
498
 
344
499
  ```ts
345
500
  await kassza.receipts.send({ receiptNumber: nyugta.number, emails: 'vevo@ceg.hu' })
346
501
  ```
347
502
 
348
- ### Lekérdezés
503
+ 📖 **Dokumentáció:** [Nyugta kiküldés](https://kassza-amber.vercel.app/docs/nyugta-kikuldes) &nbsp;·&nbsp; ▶️ **Sandbox:** [Nyugta kiküldése e-mailben](https://kassza-amber.vercel.app/sandbox?pelda=nyugta-kikuldes)
504
+
505
+ </details>
506
+
507
+ <details>
508
+ <summary><b>Lekérdezés</b> · <code>receipts.get()</code>, <code>receipts.find()</code></summary>
349
509
 
350
510
  ```ts
351
511
  const ugyanaz = await kassza.receipts.get(nyugta.number)
352
512
  const rendelesbol = await kassza.receipts.find({ orderNumber: 'REND-1001' })
353
513
  ```
354
514
 
355
- ### Sztornó
515
+ 📖 **Dokumentáció:** [Nyugta lekérdezés](https://kassza-amber.vercel.app/docs/nyugta-lekerdezes) &nbsp;·&nbsp; ▶️ **Sandbox:** [Nyugta lekérdezése](https://kassza-amber.vercel.app/sandbox?pelda=nyugta-lekerdezes)
516
+
517
+ </details>
518
+
519
+ <details>
520
+ <summary><b>Sztornó</b> · <code>receipts.reverse()</code></summary>
356
521
 
357
522
  ```ts
358
523
  await kassza.receipts.reverse(nyugta.number)
359
524
  ```
360
525
 
526
+ 📖 **Dokumentáció:** [Nyugta sztornó](https://kassza-amber.vercel.app/docs/nyugta-sztorno) &nbsp;·&nbsp; ▶️ **Sandbox:** [Nyugta sztornózása](https://kassza-amber.vercel.app/sandbox?pelda=nyugta-sztorno)
527
+
528
+ </details>
529
+
530
+ <p>
531
+ <a href="https://kassza-amber.vercel.app/docs/nyugta-letrehozas"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-light.svg" alt="Dokumentáció: Nyugta létrehozás" height="44"></picture></a>
532
+ <a href="https://kassza-amber.vercel.app/sandbox?pelda=nyugta"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-light.svg" alt="Futtasd a sandboxban: Nyugta kiállítása" height="44"></picture></a>
533
+ <a href="https://kassza-amber.vercel.app/docs/receptek/penztari-nyugta"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-penztari-nyugta-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-penztari-nyugta-light.svg" alt="Recept: Pénztári nyugta" height="44"></picture></a>
534
+ </p>
535
+
361
536
  ## Adószám lekérdezés
362
537
 
538
+ Egy adószámból megkapod a cég nevét és székhelyét, így a vevő adatait nem kell kézzel begépelni.
539
+
540
+ <details>
541
+ <summary><b>Cégadatok adószám alapján</b> · <code>taxpayer.query()</code></summary>
542
+
363
543
  ```ts
364
544
  const ceg = await kassza.taxpayer.query('13421739')
365
545
 
@@ -372,10 +552,23 @@ if (ceg.valid) {
372
552
 
373
553
  A cégadatok a NAV-tól jönnek, a cím formázva, például `1031 Budapest, Záhony utca 7.`
374
554
 
555
+ 📖 **Dokumentáció:** [Adószám lekérdezés](https://kassza-amber.vercel.app/docs/adoszam-lekerdezes) &nbsp;·&nbsp; ▶️ **Sandbox:** [Adószám lekérdezése](https://kassza-amber.vercel.app/sandbox?pelda=adoszam)
556
+
557
+ </details>
558
+
559
+ <p>
560
+ <a href="https://kassza-amber.vercel.app/docs/adoszam-lekerdezes"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-light.svg" alt="Dokumentáció: Adószám lekérdezés" height="44"></picture></a>
561
+ <a href="https://kassza-amber.vercel.app/sandbox?pelda=adoszam"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-light.svg" alt="Futtasd a sandboxban: Adószám lekérdezése" height="44"></picture></a>
562
+ <a href="https://kassza-amber.vercel.app/docs/receptek/adoszam-urlap"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-adoszam-urlap-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-adoszam-urlap-light.svg" alt="Recept: Adószám alapú kitöltés" height="44"></picture></a>
563
+ </p>
564
+
375
565
  ## Hibakezelés
376
566
 
377
567
  Minden hiba `SzamlazzError`, magyar üzenettel és javítási tippel.
378
568
 
569
+ <details>
570
+ <summary><b>Duplikált rendelésszám és validációs hiba</b> · <code>isSzamlazzError()</code></summary>
571
+
379
572
  ```ts
380
573
  import { isSzamlazzError } from 'kassza'
381
574
 
@@ -393,6 +586,13 @@ try {
393
586
  - `error.code`: a Számlázz.hu hibakódja, például `57`.
394
587
  - `error.hint`: magyar javítási tipp.
395
588
 
589
+ 📖 **Dokumentáció:** [Hibakezelés, hibakódok](https://kassza-amber.vercel.app/docs/alapok/hibakezeles) &nbsp;·&nbsp; ▶️ **Sandbox:** [Idempotens számlázás hiba után](https://kassza-amber.vercel.app/sandbox?pelda=hibakezeles-idempotens)
590
+
591
+ </details>
592
+
593
+ <details>
594
+ <summary><b>Hibakategóriák</b> · <code>error.category</code></summary>
595
+
396
596
  | `error.category` | Jelentés |
397
597
  |---|---|
398
598
  | `validation` | Hibás adat, a kérés el sem ment, vagy a Számlázz.hu elutasította |
@@ -402,11 +602,24 @@ try {
402
602
  | `auth` / `account` | Rossz kulcs, lejárt előfizetés |
403
603
  | `network` / `timeout` / `maintenance` | Átmeneti hiba |
404
604
 
405
- Újraküldés csak ott történik magától, ahol biztonságos: lekérdezéseknél, hálózati hibánál, legfeljebb 5-ször. **Számlát a kassza soha nem küld újra.** A Számlázz.hu kitiltja azt, aki ciklusban próbálkozik. Bizonytalan hiba után a `find({ orderNumber })` megmondja, elkészült-e a számla.
605
+ 📖 **Dokumentáció:** [Hibakezelés, hibakódok](https://kassza-amber.vercel.app/docs/alapok/hibakezeles) &nbsp;·&nbsp; ▶️ **Sandbox:** [Validációs hibák](https://kassza-amber.vercel.app/sandbox?pelda=hibakezeles-validacio)
606
+
607
+ </details>
608
+
609
+ > **Számlát a kassza soha nem küld újra.** Újraküldés csak ott történik magától, ahol biztonságos: lekérdezéseknél, hálózati hibánál, legfeljebb 5-ször. A Számlázz.hu kitiltja azt, aki ciklusban próbálkozik. Bizonytalan hiba után a `find({ orderNumber })` megmondja, elkészült-e a számla.
610
+
611
+ <p>
612
+ <a href="https://kassza-amber.vercel.app/docs/alapok/hibakezeles"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-light.svg" alt="Dokumentáció: Hibakezelés, hibakódok" height="44"></picture></a>
613
+ <a href="https://kassza-amber.vercel.app/sandbox?pelda=hibakezeles-idempotens"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-light.svg" alt="Futtasd a sandboxban: Idempotens számlázás hiba után" height="44"></picture></a>
614
+ <a href="https://kassza-amber.vercel.app/docs/receptek/fizetett-rendeles-szamla"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-fizetett-rendeles-szamla-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-fizetett-rendeles-szamla-light.svg" alt="Recept: Fizetett rendelés számlája" height="44"></picture></a>
615
+ </p>
406
616
 
407
617
  ## Fizetési értesítés (IPN)
408
618
 
409
- A Számlázz.hu értesít, ha egy számlát kifizettek. Például egy Next.js route handlerben:
619
+ A Számlázz.hu értesít, ha egy számlát kifizettek.
620
+
621
+ <details>
622
+ <summary><b>Next.js route handler</b> · <code>readIpnNotification()</code></summary>
410
623
 
411
624
  ```ts
412
625
  import { ipnOkResponse, readIpnNotification } from 'kassza/ipn'
@@ -420,6 +633,13 @@ export async function POST(request: Request) {
420
633
  }
421
634
  ```
422
635
 
636
+ 📖 **Dokumentáció:** [IPN fizetési értesítés](https://kassza-amber.vercel.app/docs/befizetes-rogzitese/ipn) &nbsp;·&nbsp; ▶️ **Sandbox:** [IPN fizetési értesítés](https://kassza-amber.vercel.app/sandbox?pelda=ipn)
637
+
638
+ </details>
639
+
640
+ <details>
641
+ <summary><b>Csak a Számlázz.hu IP-címeiről</b> · <code>isSzamlazzIp()</code></summary>
642
+
423
643
  Csak a Számlázz.hu IP-címeiről jövő kérést érdemes elfogadni:
424
644
 
425
645
  ```ts
@@ -428,9 +648,22 @@ import { isSzamlazzIp } from 'kassza/ipn'
428
648
  isSzamlazzIp(request.headers.get('x-forwarded-for') ?? '')
429
649
  ```
430
650
 
651
+ 📖 **Dokumentáció:** [IPN fizetési értesítés](https://kassza-amber.vercel.app/docs/befizetes-rogzitese/ipn)
652
+
653
+ </details>
654
+
655
+ <p>
656
+ <a href="https://kassza-amber.vercel.app/docs/befizetes-rogzitese/ipn"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-light.svg" alt="Dokumentáció: IPN fizetési értesítés" height="44"></picture></a>
657
+ <a href="https://kassza-amber.vercel.app/sandbox?pelda=ipn"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-light.svg" alt="Futtasd a sandboxban: IPN fizetési értesítés" height="44"></picture></a>
658
+ <a href="https://kassza-amber.vercel.app/docs/receptek/ipn-webhook"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-ipn-webhook-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-ipn-webhook-light.svg" alt="Recept: IPN webhook" height="44"></picture></a>
659
+ </p>
660
+
431
661
  ## PDF mentése tárhelyre
432
662
 
433
- S3, Cloudflare R2, MinIO vagy Backblaze esetén nem kell az AWS SDK:
663
+ S3, Cloudflare R2, MinIO vagy Backblaze esetén nem kell az AWS SDK.
664
+
665
+ <details>
666
+ <summary><b>S3 és Cloudflare R2</b> · <code>s3FetchStorage()</code>, <code>storePdf()</code></summary>
434
667
 
435
668
  ```ts
436
669
  import { invoicePdfKey, s3FetchStorage, storePdf } from 'kassza/storage'
@@ -451,7 +684,12 @@ fajl.key
451
684
 
452
685
  A kulcs például `szamlak/2026/09/E-WEB-2026-12.pdf` lesz.
453
686
 
454
- Fájlrendszerbe (Node):
687
+ 📖 **Dokumentáció:** [PDF tárhely](https://kassza-amber.vercel.app/docs/kiegeszitok/pdf-tarhely) &nbsp;·&nbsp; ▶️ **Sandbox:** [PDF mentése tárhelyre](https://kassza-amber.vercel.app/sandbox?pelda=pdf-tarhely)
688
+
689
+ </details>
690
+
691
+ <details>
692
+ <summary><b>Fájlrendszer (Node)</b> · <code>fsStorage()</code></summary>
455
693
 
456
694
  ```ts
457
695
  import { fsStorage } from 'kassza/storage/fs'
@@ -459,11 +697,24 @@ import { fsStorage } from 'kassza/storage/fs'
459
697
  const tarhely = fsStorage({ directory: './szamlak' })
460
698
  ```
461
699
 
700
+ 📖 **Dokumentáció:** [PDF tárhely](https://kassza-amber.vercel.app/docs/kiegeszitok/pdf-tarhely)
701
+
702
+ </details>
703
+
462
704
  További adapterek: `s3Storage` (AWS SDK), `r2BindingStorage`, `vercelBlobStorage`, `uploadthingStorage`, `supabaseStorage`, `memoryStorage`.
463
705
 
706
+ <p>
707
+ <a href="https://kassza-amber.vercel.app/docs/kiegeszitok/pdf-tarhely"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-light.svg" alt="Dokumentáció: PDF tárhely" height="44"></picture></a>
708
+ <a href="https://kassza-amber.vercel.app/sandbox?pelda=pdf-tarhely"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-light.svg" alt="Futtasd a sandboxban: PDF mentése tárhelyre" height="44"></picture></a>
709
+ <a href="https://kassza-amber.vercel.app/docs/receptek/pdf-mentes-s3-r2"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-pdf-mentes-s3-r2-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-pdf-mentes-s3-r2-light.svg" alt="Recept: PDF mentése S3-ba vagy R2-be" height="44"></picture></a>
710
+ </p>
711
+
464
712
  ## Serverless és edge
465
713
 
466
- A session cookie újrahasznosítása gyorsítja a hívásokat. Serverless környezetben tedd közös tárolóba:
714
+ A session cookie újrahasznosítása gyorsítja a hívásokat. Serverless környezetben tedd közös tárolóba.
715
+
716
+ <details>
717
+ <summary><b>Upstash Redis</b> · <code>upstashRedisCookieStore()</code></summary>
467
718
 
468
719
  ```ts
469
720
  import { Redis } from '@upstash/redis'
@@ -472,7 +723,12 @@ import { upstashRedisCookieStore } from 'kassza/cookie-stores'
472
723
  const kassza = createKassza({ cookieStore: upstashRedisCookieStore(Redis.fromEnv()) })
473
724
  ```
474
725
 
475
- Cloudflare Workers alatt:
726
+ 📖 **Dokumentáció:** [Munkamenet (session cookie)](https://kassza-amber.vercel.app/docs/alapok/munkamenet) &nbsp;·&nbsp; ▶️ **Sandbox:** [Közös session több kliens között](https://kassza-amber.vercel.app/sandbox?pelda=munkamenet)
727
+
728
+ </details>
729
+
730
+ <details>
731
+ <summary><b>Cloudflare Workers</b> · <code>cloudflareKvCookieStore()</code></summary>
476
732
 
477
733
  ```ts
478
734
  import { cloudflareKvCookieStore } from 'kassza/cookie-stores'
@@ -480,12 +736,25 @@ import { cloudflareKvCookieStore } from 'kassza/cookie-stores'
480
736
  const kassza = createKassza({ agentKey: env.SZAMLAZZ_AGENT_KEY, cookieStore: cloudflareKvCookieStore(env.KASSZA_KV) })
481
737
  ```
482
738
 
739
+ 📖 **Dokumentáció:** [Serverless és edge](https://kassza-amber.vercel.app/docs/kiegeszitok/serverless-es-edge)
740
+
741
+ </details>
742
+
483
743
  Van még `ioredisCookieStore`, `nodeRedisCookieStore` és `customCookieStore` is. Ha a tároló elérhetetlen, a számlázás attól még működik.
484
744
 
745
+ <p>
746
+ <a href="https://kassza-amber.vercel.app/docs/kiegeszitok/serverless-es-edge"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-light.svg" alt="Dokumentáció: Serverless és edge" height="44"></picture></a>
747
+ <a href="https://kassza-amber.vercel.app/sandbox?pelda=munkamenet"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-light.svg" alt="Futtasd a sandboxban: Közös session több kliens között" height="44"></picture></a>
748
+ <a href="https://kassza-amber.vercel.app/docs/receptek/cloudflare-workers"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-cloudflare-workers-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-cloudflare-workers-light.svg" alt="Recept: Cloudflare Workers" height="44"></picture></a>
749
+ </p>
750
+
485
751
  ## Tesztelés
486
752
 
487
753
  A mock kliens valódi API-hívás nélkül működik, de ugyanazt a validációt és kerekítést futtatja, mint az éles kliens.
488
754
 
755
+ <details>
756
+ <summary><b>Vitest példa</b> · <code>createMockKassza()</code></summary>
757
+
489
758
  ```ts
490
759
  import { createMockKassza } from 'kassza/testing'
491
760
 
@@ -506,8 +775,23 @@ test('hálózati hibánál nem számláz kétszer', async () => {
506
775
  })
507
776
  ```
508
777
 
778
+ 📖 **Dokumentáció:** [Tesztelés](https://kassza-amber.vercel.app/docs/kiegeszitok/teszteles) &nbsp;·&nbsp; ▶️ **Sandbox:** [Mock kliens tesztekhez](https://kassza-amber.vercel.app/sandbox?pelda=mock-kliens)
779
+
780
+ </details>
781
+
782
+ <p>
783
+ <a href="https://kassza-amber.vercel.app/docs/kiegeszitok/teszteles"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-light.svg" alt="Dokumentáció: Tesztelés" height="44"></picture></a>
784
+ <a href="https://kassza-amber.vercel.app/sandbox?pelda=mock-kliens"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-light.svg" alt="Futtasd a sandboxban: Mock kliens tesztekhez" height="44"></picture></a>
785
+ <a href="https://kassza-amber.vercel.app/docs/receptek/egysegtesztek"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-egysegtesztek-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-egysegtesztek-light.svg" alt="Recept: Egységtesztek" height="44"></picture></a>
786
+ </p>
787
+
509
788
  ## Validátorok és pénzszámítás
510
789
 
790
+ Magyar adószám, bankszámla, IBAN, EU adószám és cím ellenőrzése űrlapokhoz, és ugyanaz a kerekítés, amit a számlák is használnak.
791
+
792
+ <details>
793
+ <summary><b>Validátorok</b> · <code>kassza/validators</code></summary>
794
+
511
795
  ```ts
512
796
  import {
513
797
  isValidHungarianBankAccount,
@@ -522,6 +806,13 @@ parseHungarianAddress('1031 Budapest, Záhony utca 7.')
522
806
 
523
807
  A `parseHungarianAddress` eredménye `{ zip: '1031', city: 'Budapest', address: 'Záhony utca 7.' }`. Ezen kívül van `isValidHungarianIban`, `isValidHungarianZipCode`, `isValidEuVatNumber` és `isValidEmail` is.
524
808
 
809
+ 📖 **Dokumentáció:** [Validátorok](https://kassza-amber.vercel.app/docs/kiegeszitok/validatorok) &nbsp;·&nbsp; ▶️ **Sandbox:** [Validátorok](https://kassza-amber.vercel.app/sandbox?pelda=validatorok)
810
+
811
+ </details>
812
+
813
+ <details>
814
+ <summary><b>Pénzszámítás</b> · <code>kassza/money</code></summary>
815
+
525
816
  ```ts
526
817
  import { calculateInvoiceItem, calculateReceiptItem } from 'kassza/money'
527
818
 
@@ -531,8 +822,22 @@ calculateReceiptItem({ grossUnitPrice: 1_000, vat: 27 })
531
822
 
532
823
  Az első eredménye `{ netAmount: 1181, vatAmount: 319, grossAmount: 1500, ... }`, a másodiké `{ netAmount: 787.4, vatAmount: 212.6, grossAmount: 1000, ... }`.
533
824
 
825
+ 📖 **Dokumentáció:** [Pénzszámítás](https://kassza-amber.vercel.app/docs/kiegeszitok/penzszamitas) &nbsp;·&nbsp; ▶️ **Sandbox:** [Kerekítés és összegzés](https://kassza-amber.vercel.app/sandbox?pelda=kerekites)
826
+
827
+ </details>
828
+
829
+ <p>
830
+ <a href="https://kassza-amber.vercel.app/docs/kiegeszitok"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-light.svg" alt="Dokumentáció: Kiegészítők" height="44"></picture></a>
831
+ <a href="https://kassza-amber.vercel.app/sandbox?pelda=validatorok"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-light.svg" alt="Futtasd a sandboxban: Validátorok" height="44"></picture></a>
832
+ </p>
833
+
534
834
  ## Haladó beállítások
535
835
 
836
+ Időkorlát, újrapróbálás a lekérdezéseknél, naplózás hookokkal és megszakítás `AbortSignal`-lal.
837
+
838
+ <details>
839
+ <summary><b>Időkorlát, újrapróbálás és hookok</b> · <code>timeoutMs</code>, <code>maxAttempts</code>, <code>hooks</code></summary>
840
+
536
841
  ```ts
537
842
  const kassza = createKassza({
538
843
  timeoutMs: 30_000,
@@ -550,12 +855,28 @@ await kassza.invoices.getPdf('E-WEB-2026-12', { signal: AbortSignal.timeout(5_00
550
855
  - A hookok soha nem kapják meg az Agent kulcsot.
551
856
  - Minden metódus fogad `AbortSignal`-t.
552
857
 
858
+ 📖 **Dokumentáció:** [Hálózat és biztonság](https://kassza-amber.vercel.app/docs/alapok/halozat-es-biztonsag) &nbsp;·&nbsp; ▶️ **Sandbox:** [Hookok és újrapróbálás](https://kassza-amber.vercel.app/sandbox?pelda=hookok)
859
+
860
+ </details>
861
+
862
+ <details>
863
+ <summary><b>Új session kérése</b> · <code>resetSession()</code></summary>
864
+
553
865
  A `resetSession()` új sessiont kér. Hívd meg, ha a Számlázz.hu fiókban megváltoztak a cégadatok:
554
866
 
555
867
  ```ts
556
868
  await kassza.resetSession()
557
869
  ```
558
870
 
871
+ 📖 **Dokumentáció:** [Munkamenet (session cookie)](https://kassza-amber.vercel.app/docs/alapok/munkamenet) &nbsp;·&nbsp; ▶️ **Sandbox:** [Közös session több kliens között](https://kassza-amber.vercel.app/sandbox?pelda=munkamenet)
872
+
873
+ </details>
874
+
875
+ <p>
876
+ <a href="https://kassza-amber.vercel.app/docs/alapok/halozat-es-biztonsag"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-light.svg" alt="Dokumentáció: Hálózat és biztonság" height="44"></picture></a>
877
+ <a href="https://kassza-amber.vercel.app/sandbox?pelda=hookok"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-sandbox-light.svg" alt="Futtasd a sandboxban: Hookok és újrapróbálás" height="44"></picture></a>
878
+ </p>
879
+
559
880
  ## AI-val kódolsz?
560
881
 
561
882
  A csomagban van egy `agents/` mappa. Ebből a Claude Code, a Cursor, a Copilot és a többi asszisztens megtudja, hogyan kell jól használni a kasszát, és mik a buktatók. Szólj rá az AI-ra:
@@ -564,6 +885,16 @@ A csomagban van egy `agents/` mappa. Ebből a Claude Code, a Cursor, a Copilot
564
885
 
565
886
  Claude Code-hoz kész skill is van: másold a `node_modules/kassza/agents/skills/kassza` mappát a projekted `.claude/skills/` mappájába.
566
887
 
888
+ A weboldal is AI-barát: az [llms.txt](https://kassza-amber.vercel.app/llms.txt) a dokumentáció tartalomjegyzéke, az [llms-full.txt](https://kassza-amber.vercel.app/llms-full.txt) a teljes dokumentáció egy fájlban, és minden oldal Markdownként is elérhető, ha az URL végére `.md` kerül.
889
+
890
+ <p>
891
+ <a href="https://kassza-amber.vercel.app/docs/kiegeszitok/ai-asszisztensek"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-docs-light.svg" alt="Dokumentáció: AI asszisztensek" height="44"></picture></a>
892
+ </p>
893
+
567
894
  ---
568
895
 
896
+ <p align="center">
897
+ <a href="https://kassza-amber.vercel.app">Weboldal</a> · <a href="https://kassza-amber.vercel.app/docs">Dokumentáció</a> · <a href="https://kassza-amber.vercel.app/sandbox">Sandbox</a> · <a href="https://kassza-amber.vercel.app/docs/receptek">Receptek</a> · <a href="https://www.npmjs.com/package/kassza">npm</a> · <a href="https://github.com/futozs/kassza/blob/main/CHANGELOG.md">Változásnapló</a>
898
+ </p>
899
+
569
900
  <sub>Nem hivatalos csomag, nem kapcsolódik a KBOSS.hu Kft.-hez (Számlázz.hu). A hivatalos dokumentáció a <a href="https://docs.szamlazz.hu/hu/agent/">docs.szamlazz.hu</a> oldalon érhető el. MIT licenc.</sub>
@@ -1,25 +1,6 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="320" viewBox="0 0 1200 320" role="img" aria-labelledby="title">
2
- <title id="title">kassza</title>
3
- <style>.tag{fill:#6B7280}</style>
4
- <defs>
5
- <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
6
- <stop offset="0" stop-color="#14532D"/>
7
- <stop offset="1" stop-color="#052E16"/>
8
- </linearGradient>
9
- <linearGradient id="paper" x1="0" y1="0" x2="0" y2="1">
10
- <stop offset="0" stop-color="#FFFDF5"/>
11
- <stop offset="1" stop-color="#F3EBD3"/>
12
- </linearGradient>
13
- </defs>
14
- <g transform="translate(24 24) scale(0.53125)">
15
- <rect width="512" height="512" rx="112" fill="url(#bg)"/>
16
- <path d="M146 84H366A20 20 0 0 1 386 104V428l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18V104A20 20 0 0 1 146 84Z" fill="#000" opacity=".22" transform="translate(0 10)"/>
17
- <path d="M146 84H366A20 20 0 0 1 386 104V428l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18V104A20 20 0 0 1 146 84Z" fill="url(#paper)"/>
18
- <path d="M170 136h40v88l76-88h50l-80 90 86 116h-50l-62-86-20 22v64h-40z" fill="#14532D"/>
19
- <rect x="160" y="368" width="120" height="12" rx="6" fill="#14532D" opacity=".28"/>
20
- <rect x="304" y="368" width="48" height="12" rx="6" fill="#F59E0B"/>
21
- </g>
22
- <text x="340" y="196" font-family="ui-rounded, 'SF Pro Rounded', 'Nunito', 'Inter', system-ui, sans-serif" font-size="168" font-weight="800" letter-spacing="-6" fill="url(#bg)">kassza</text>
23
- <rect x="348" y="226" width="96" height="14" rx="7" fill="#F59E0B"/>
24
- <text x="464" y="240" font-family="ui-monospace, 'SF Mono', 'JetBrains Mono', monospace" font-size="30" font-weight="500" class="tag">Számlázz.hu, TypeScriptben</text>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="994" height="312" viewBox="0 0 994 312" role="img" aria-labelledby="title desc">
2
+ <title id="title">kassza</title>
3
+ <desc id="desc">kassza logó: Számlázz.hu, TypeScriptben</desc>
4
+ <defs><linearGradient id="logo-tile" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#14532D"/><stop offset="1" stop-color="#052E16"/></linearGradient><linearGradient id="logo-paper" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#FFFDF5"/><stop offset="1" stop-color="#F3EBD3"/></linearGradient><path id="t0" d="M194 0L36 0L36-700L194-700L194-329Q228-347 253-370Q277-393 294-419Q311-446 322-473Q332-501 339-528L525-528Q514-488 494-450Q473-413 443-380Q413-348 374-322Q334-296 286-279L286-271Q348-281 388-273Q427-266 450-245Q473-225 486-194Q498-163 505-125L528 0L353 0L342-88Q338-120 331-148Q324-176 304-193Q284-211 241-211L194-211"/><path id="t1" d="M175 14Q135 14 99 0Q63-14 40-45Q17-77 17-130Q17-179 36-209Q55-240 87-258Q119-277 157-286Q195-296 232-303Q284-313 310-319Q336-325 346-333Q355-341 355-355Q355-384 334-399Q312-414 277-414Q255-414 233-406Q211-398 197-377Q183-357 184-319L40-329Q38-392 59-433Q80-475 117-498Q153-522 197-532Q240-542 283-542Q362-542 413-512Q464-483 489-427Q513-372 513-293L513-199Q513-166 513-132Q513-99 513-66Q513-33 513 0L373 0Q373-36 373-73Q373-110 373-151L367-151Q363-106 338-68Q312-31 271-8Q229 14 175 14M242-104Q259-104 279-110Q298-117 316-132Q333-147 344-173Q355-200 355-239L355-263L382-266Q374-253 356-245Q337-237 314-232Q291-228 268-223Q244-219 224-211Q204-204 192-191Q179-179 179-157Q179-131 198-117Q216-104 242-104"/><path id="t2" d="M267 14Q214 14 169 4Q123-7 90-30Q56-53 39-91Q21-130 24-185L165-197Q167-164 180-142Q193-121 216-111Q239-101 272-101Q303-101 326-111Q348-122 348-147Q348-160 340-168Q332-177 311-184Q289-192 248-202Q197-215 156-228Q115-241 86-259Q57-277 42-303Q27-330 27-369Q27-424 57-462Q86-501 138-521Q190-542 258-542Q319-542 372-523Q425-504 456-461Q486-418 478-347L340-334Q343-363 332-383Q321-404 300-414Q279-425 249-425Q215-425 197-412Q178-400 178-381Q178-366 190-355Q201-345 226-337Q250-330 289-321Q323-314 360-303Q397-292 429-273Q461-255 481-225Q501-195 501-149Q501-100 474-63Q447-26 395-6Q343 14 267 14"/><path id="t3" d="M463 0L20 0L20-136L271-392L271-398L25-398L25-528L460-528L460-391L209-134L209-130L463-130"/><path id="t4" d="M309 16Q232 16 175-15Q117-46 83-101Q49-157 43-231L151-238Q158-187 179-152Q200-117 234-99Q268-82 313-82Q357-82 387-93Q417-105 433-127Q449-149 449-181Q449-213 434-236Q419-259 380-278Q341-298 266-319Q193-339 147-364Q101-390 80-427Q59-465 59-520Q59-581 88-627Q116-674 170-700Q223-726 298-726Q372-726 425-697Q477-668 508-616Q538-565 545-496L437-490Q432-531 415-562Q397-593 367-610Q337-628 295-628Q236-628 202-600Q167-572 167-525Q167-495 181-474Q195-454 230-438Q265-423 328-405Q413-382 463-351Q513-321 535-280Q557-239 557-181Q557-123 526-78Q495-33 440-8Q384 16 309 16"/><path id="t5" d="M522 0L78 0L78-95L400-447L88-447L88-532L514-532L514-437L191-85L522-85"/><path id="t6" d="M228 12Q178 12 138-6Q98-24 75-57Q51-90 51-134Q51-202 93-240Q134-278 218-294L390-330Q390-392 363-423Q336-454 282-454Q232-454 204-431Q176-408 166-367L60-374Q75-450 133-497Q191-544 282-544Q384-544 438-486Q491-428 491-326L491-116Q491-98 499-90Q507-83 522-83L552-83L552 0Q546 1 533 2Q519 3 506 3Q470 3 445-9Q420-21 408-46Q395-72 393-111L409-111Q403-76 378-48Q353-20 314-4Q275 12 228 12M243-71Q291-71 324-88Q357-105 374-136Q390-167 390-209L390-250L242-220Q194-211 175-192Q156-173 156-142Q156-109 179-90Q202-71 243-71M325-596L239-596L304-730L415-730"/><path id="t7" d="M134 0L36 0L36-532L124-532L128-412L117-415Q127-476 157-510Q186-544 231-544Q279-544 304-510Q328-476 334-409L323-409Q332-473 364-508Q396-544 444-544Q507-544 536-500Q564-457 564-359L564 0L466 0L466-342Q466-406 453-431Q439-456 411-456Q393-456 379-444Q364-432 356-406Q348-381 348-340L348 0L252 0L252-342Q252-404 240-430Q227-456 198-456Q179-456 165-444Q151-432 143-406Q134-381 134-340"/><path id="t8" d="M365-32L264-32L264-559Q264-590 247-607Q229-625 198-625L76-625L76-710L209-710Q286-710 326-670Q365-631 365-554L365-32M544 0L56 0L56-85L544-85"/><path id="t9" d="M368 0L232 0L232-132L368-132"/><path id="ta" d="M194 0L93 0L93-710L194-710L194-416L184-420Q194-463 218-490Q242-518 276-531Q310-544 351-544Q407-544 446-518Q484-493 504-447Q523-402 523-343L523 0L422 0L422-317Q422-389 397-422Q371-456 321-456Q264-456 229-420Q194-384 194-314"/><path id="tb" d="M254 12Q177 12 131-40Q85-93 85-188L85-532L186-532L186-214Q186-142 211-109Q236-76 287-76Q342-76 376-113Q409-150 409-218L409-532L510-532L510 0L415 0L414-139L428-133Q414-64 369-26Q324 12 254 12"/><path id="tc" d="M304 162L236 162L292 0L234 0L234-132L366-132L366-11"/><path id="te" d="M352 0L248 0L248-611L40-611L40-710L560-710L560-611L352-611"/><path id="tf" d="M204 150L129 150L129 65L194 65Q221 65 235 57Q249 48 256 29L273-18L240-18L46-532L154-532L305-113L446-532L554-532L342 60Q326 108 293 129Q260 150 204 150"/><path id="tg" d="M173 150L72 150L72-532L168-532L170-411L158-417Q178-479 224-511Q269-544 331-544Q408-544 457-505Q506-467 530-404Q554-341 554-266Q554-191 530-128Q506-65 457-26Q408 12 331 12Q290 12 255-1Q220-15 196-40Q171-66 160-102L173-116L173 150M312-81Q376-81 412-129Q448-177 448-266Q448-355 412-403Q376-451 312-451Q270-451 239-430Q208-410 191-369Q173-328 173-266Q173-204 190-163Q207-122 239-101Q270-81 312-81"/><path id="th" d="M305 12Q230 12 175-22Q119-56 89-119Q58-182 58-266Q58-350 89-412Q119-474 174-509Q228-544 302-544Q372-544 427-510Q481-477 512-414Q542-352 542-264L542-236L163-236Q168-160 206-120Q243-81 306-81Q353-81 384-103Q415-126 427-162L532-155Q509-79 450-33Q391 12 305 12M164-317L432-317Q427-385 391-418Q355-451 301-451Q245-451 210-417Q174-383 164-317"/><path id="ti" d="M312 12Q238 12 182-22Q125-57 95-119Q64-182 64-266Q64-350 95-412Q125-474 182-509Q238-544 312-544Q373-544 421-521Q469-499 500-456Q531-413 541-353L438-346Q426-397 393-424Q360-451 313-451Q246-451 208-401Q169-352 169-266Q169-180 208-130Q246-81 313-81Q361-81 396-109Q430-138 441-194L544-188Q534-127 502-82Q470-38 422-13Q373 12 312 12"/><path id="tj" d="M486 0L84 0L84-85L265-85L219-39L219-493L265-447L84-447L84-532L299-532L308-384L299-391Q306-462 340-497Q373-532 433-532L546-532L546-444L437-444Q399-444 373-429Q347-415 334-386Q320-358 320-316L320-39L274-85L486-85"/><path id="tk" d="M284 0L76 0L76-85L284-85L284-493L331-447L86-447L86-532L386-532L386-85L564-85L564 0L386 0L284 0M382-609L278-609L278-714L382-714"/><path id="tl" d="M524 0L376 0Q295 0 256-37Q216-75 216-153L216-657L317-657L317-158Q317-121 335-103Q352-85 387-85L524-85L524 0M524-447L48-447L48-532L524-532"/><path id="tm" d="M342 12Q298 12 263-3Q228-18 204-46Q180-74 168-110L181-127L176 0L82 0L82-710L183-710L183-412L173-433Q182-462 205-487Q228-512 264-528Q299-544 342-544Q410-544 460-510Q510-477 537-414Q564-352 564-266Q564-180 537-117Q510-55 460-21Q410 12 342 12M325-81Q388-81 423-130Q458-180 458-266Q458-353 423-402Q388-451 327-451Q282-451 250-429Q218-407 201-366Q183-325 183-266Q183-209 201-167Q218-126 250-103Q281-81 325-81"/><path id="tn" d="M181 0L80 0L80-532L173-532L176-393L165-401Q175-450 201-481Q226-513 263-528Q300-544 342-544Q402-544 441-517Q480-491 500-445Q520-400 520-343L520 0L419 0L419-317Q419-386 393-421Q366-456 313-456Q276-456 247-440Q217-424 199-392Q181-361 181-315"/></defs>
5
+ <g transform="translate(28 28) scale(0.5)"><rect width="512" height="512" rx="112" fill="url(#logo-tile)"/><path d="M146 84H366A20 20 0 0 1 386 104V428l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18V104A20 20 0 0 1 146 84Z" fill="#000" opacity="0.22" transform="translate(0 10)"/><path d="M146 84H366A20 20 0 0 1 386 104V428l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18 l-13 -18 l-13 18V104A20 20 0 0 1 146 84Z" fill="url(#logo-paper)"/><path d="M170 136h40v88l76-88h50l-80 90 86 116h-50l-62-86-20 22v64h-40z" fill="#14532D"/><rect x="160" y="368" width="120" height="12" rx="6" fill="#14532D" opacity="0.28"/><rect x="304" y="368" width="48" height="12" rx="6" fill="#F59E0B"/></g><g transform="translate(327.57 188.27) scale(0.212)" fill="#2d8949"><use href="#t0" x="0"/><use href="#t1" x="516"/><use href="#t2" x="1039"/><use href="#t2" x="1536"/><use href="#t3" x="2033"/><use href="#t1" x="2494"/></g><rect x="335.2" y="250.16" width="84.8" height="15.26" rx="7.63" fill="#F59E0B"/><g transform="translate(438.02 266.71) scale(0.0335)" fill="#787f79"><use href="#t4" x="0"/><use href="#t5" x="609"/><use href="#t6" x="1217"/><use href="#t7" x="1826"/><use href="#t8" x="2434"/><use href="#t6" x="3043"/><use href="#t5" x="3651"/><use href="#t5" x="4260"/><use href="#t9" x="4869"/><use href="#ta" x="5477"/><use href="#tb" x="6086"/><use href="#tc" x="6694"/><use href="#te" x="7911"/><use href="#tf" x="8520"/><use href="#tg" x="9129"/><use href="#th" x="9737"/><use href="#t4" x="10346"/><use href="#ti" x="10954"/><use href="#tj" x="11563"/><use href="#tk" x="12171"/><use href="#tg" x="12780"/><use href="#tl" x="13388"/><use href="#tm" x="13997"/><use href="#th" x="14606"/><use href="#tn" x="15214"/></g>
25
6
  </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kassza",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "author": "futozs",
5
5
  "repository": {
6
6
  "type": "git",
@@ -13,6 +13,7 @@
13
13
  "@biomejs/biome": "^2.5.13",
14
14
  "@types/node": "^26.6.0",
15
15
  "@vitest/coverage-v8": "^5.0.1",
16
+ "opentype.js": "^2.0.0",
16
17
  "publint": "^0.3.24",
17
18
  "tsdown": "^0.23.0",
18
19
  "typescript": "^7.0.2",
@@ -114,7 +115,7 @@
114
115
  "assets",
115
116
  "llms.txt"
116
117
  ],
117
- "homepage": "https://github.com/futozs/kassza#readme",
118
+ "homepage": "https://kassza-amber.vercel.app",
118
119
  "keywords": [
119
120
  "billing",
120
121
  "dijbekero",
@@ -145,7 +146,9 @@
145
146
  "lint": "biome check .",
146
147
  "lint:fix": "biome check --write .",
147
148
  "check:package": "publint --pack npm && attw --pack . --profile node16",
148
- "ci": "npm run lint && npm run typecheck && npm run test:coverage && npm run build && npm run check:package",
149
+ "readme": "node readme/art/index.mjs && node readme/build.mjs",
150
+ "readme:check": "node readme/build.mjs --check",
151
+ "ci": "npm run lint && npm run typecheck && npm run readme:check && npm run test:coverage && npm run build && npm run check:package",
149
152
  "xsd:fetch": "node scripts/fetch-xsd.mjs",
150
153
  "prepublishOnly": "npm run ci",
151
154
  "release": "node scripts/release.mjs",