kassza 0.4.0 → 0.5.1

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,18 +1,27 @@
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">
6
8
  <b>Számlázz.hu, TypeScriptben, egyszerűbben.</b><br>
7
- Számla, díjbekérő, nyugta, sztornó, befizetés, PDF, adószám. Mind a 11 Agent művelet, 0 függőség.
9
+ Nem hivatalos TypeScript wrapper a Számlázz.hu Számla Agenthez. Mind a 11 Agent művelet, 0 függőség, nulla runtime kompromisszum.
8
10
  </p>
9
11
 
10
12
  <p align="center">
11
- <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>
12
- <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>
13
- <img src="https://img.shields.io/badge/függőség-0-14532D" alt="0 függőség">
14
- <img src="https://img.shields.io/badge/TypeScript-szigorú-14532D" alt="TypeScript">
15
- <img src="https://img.shields.io/npm/l/kassza?color=14532D&label=licenc" alt="MIT licenc">
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>
17
+ </p>
18
+
19
+ <p align="center">
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>
16
25
  </p>
17
26
 
18
27
  ```bash
@@ -34,12 +43,26 @@ console.log(szamla.number, szamla.grossTotal)
34
43
 
35
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.
36
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
+
37
51
  ## Miért kassza?
38
52
 
39
53
  <p align="center">
40
- <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>
41
55
  </p>
42
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
+
43
66
  | | **kassza** | szamlazz.js | @ribbery009/ szamlazz-ts | @halftome/ szamlazz-client | szamlazz.ts | szamlazzhu-client |
44
67
  |---|:---:|:---:|:---:|:---:|:---:|:---:|
45
68
  | Számla, sztornó | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
@@ -57,20 +80,67 @@ Ennyi. A kerekítést, a magyar dátumot, az XML-t, a session cookie-t és a hib
57
80
 
58
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>
59
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
+
60
89
  ## Tartalom
61
90
 
62
- - [Beállítás](#beállítás)
63
- - [Számlák](#számlák)
64
- - [Nyugták](#nyugták)
65
- - [Adószám lekérdezés](#adószám-lekérdezés)
66
- - [Hibakezelés](#hibakezelés)
67
- - [Fizetési értesítés (IPN)](#fizetési-értesítés-ipn)
68
- - [PDF mentése tárhelyre](#pdf-mentése-tárhelyre)
69
- - [Serverless és edge](#serverless-és-edge)
70
- - [Tesztelés](#tesztelés)
71
- - [Validátorok és pénzszámítás](#validátorok-és-pénzszámítás)
72
- - [Haladó beállítások](#haladó-beállítások)
73
- - [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) | | |
98
+
99
+ ## Weboldal, sandbox és receptek
100
+
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>
74
144
 
75
145
  ## Beállítás
76
146
 
@@ -86,6 +156,9 @@ import { createKassza } from 'kassza'
86
156
  export const kassza = createKassza()
87
157
  ```
88
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
+
89
162
  Az ismétlődő adatokat elég egyszer megadni:
90
163
 
91
164
  ```ts
@@ -106,9 +179,22 @@ await kassza.verifyCredentials()
106
179
 
107
180
  A `verifyCredentials()` visszatérési értéke `true`, ha a kulcs jó.
108
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
+
109
192
  ## Számlák
110
193
 
111
- ### 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>
112
198
 
113
199
  ```ts
114
200
  const szamla = await kassza.invoices.create({
@@ -138,6 +224,13 @@ szamla.pdf
138
224
  - Az `orderNumber` a saját azonosítód, ezzel később vissza is keresheted a számlát.
139
225
  - A `szamla.pdf` egy `Uint8Array`.
140
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
+
141
234
  Az ár megadható nettóban vagy bruttóban, a kerekítés a hivatalos szabályok szerint történik:
142
235
 
143
236
  ```ts
@@ -147,9 +240,14 @@ Az ár megadható nettóban vagy bruttóban, a kerekítés a hivatalos szabályo
147
240
  { name: 'Oktatás', netUnitPrice: 50_000, vat: 'AAM' }
148
241
  ```
149
242
 
150
- 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)
246
+
247
+ </details>
151
248
 
152
- ### Díjbekérő, majd számla
249
+ <details>
250
+ <summary><b>Díjbekérő, majd számla</b> · <code>type: 'proforma'</code></summary>
153
251
 
154
252
  ```ts
155
253
  const dijbekero = await kassza.invoices.create({
@@ -168,13 +266,23 @@ const szamla = await kassza.invoices.create({
168
266
  })
169
267
  ```
170
268
 
171
- ### 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>
172
275
 
173
276
  ```ts
174
277
  await kassza.invoices.deleteProforma({ orderNumber: 'NEV-42' })
175
278
  ```
176
279
 
177
- ### 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>
178
286
 
179
287
  ```ts
180
288
  const eloleg = await kassza.invoices.create({
@@ -196,7 +304,12 @@ await kassza.invoices.create({
196
304
  })
197
305
  ```
198
306
 
199
- ### 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>
200
313
 
201
314
  ```ts
202
315
  await kassza.invoices.create({
@@ -207,13 +320,23 @@ await kassza.invoices.create({
207
320
  })
208
321
  ```
209
322
 
210
- ### 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>
211
329
 
212
330
  ```ts
213
331
  await kassza.invoices.create({ type: 'deliveryNote', buyer, items })
214
332
  ```
215
333
 
216
- ### 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>
217
340
 
218
341
  ```ts
219
342
  await kassza.invoices.create({
@@ -232,15 +355,25 @@ await kassza.invoices.create({
232
355
  })
233
356
  ```
234
357
 
235
- 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).
359
+
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)
236
361
 
237
- ### Előnézet, számla kiállítása nélkül
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>
238
366
 
239
367
  ```ts
240
368
  const { pdf, grossTotal } = await kassza.invoices.preview({ buyer, items })
241
369
  ```
242
370
 
243
- ### 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>
244
377
 
245
378
  ```ts
246
379
  await kassza.invoices.create({
@@ -252,13 +385,23 @@ await kassza.invoices.create({
252
385
 
253
386
  Legfeljebb 5 melléklet adható meg, darabonként 2 MB.
254
387
 
255
- ### 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>
256
394
 
257
395
  ```ts
258
396
  const sztorno = await kassza.invoices.reverse('E-WEB-2026-12')
259
397
  ```
260
398
 
261
- ### 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>
262
405
 
263
406
  ```ts
264
407
  await kassza.invoices.registerPayment({ invoiceNumber: 'E-WEB-2026-12', amount: 12_700 })
@@ -276,7 +419,12 @@ await kassza.invoices.clearPayments('E-WEB-2026-12')
276
419
 
277
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.
278
421
 
279
- ### 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>
280
428
 
281
429
  ```ts
282
430
  import { writeFile } from 'node:fs/promises'
@@ -287,7 +435,12 @@ await writeFile('szamla.pdf', pdf)
287
435
 
288
436
  Rendelésszám vagy külső azonosító alapján is működik: `getPdf({ orderNumber: 'REND-1001' })`, `getPdf({ externalId: 'a1b2' })`.
289
437
 
290
- ### 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>
291
444
 
292
445
  ```ts
293
446
  const adatok = await kassza.invoices.get({ orderNumber: 'REND-1001' })
@@ -301,9 +454,22 @@ const talan = await kassza.invoices.find({ orderNumber: 'REND-9999' })
301
454
 
302
455
  A `find` `null`-t ad, ha nincs ilyen számla, a `get` ilyenkor hibát dob.
303
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
+
304
467
  ## Nyugták
305
468
 
306
- ### 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>
307
473
 
308
474
  ```ts
309
475
  const nyugta = await kassza.receipts.create({
@@ -323,27 +489,57 @@ nyugta.pdf
323
489
 
324
490
  A `callId` véd a dupla nyugta ellen.
325
491
 
326
- ### 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>
327
498
 
328
499
  ```ts
329
500
  await kassza.receipts.send({ receiptNumber: nyugta.number, emails: 'vevo@ceg.hu' })
330
501
  ```
331
502
 
332
- ### 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>
333
509
 
334
510
  ```ts
335
511
  const ugyanaz = await kassza.receipts.get(nyugta.number)
336
512
  const rendelesbol = await kassza.receipts.find({ orderNumber: 'REND-1001' })
337
513
  ```
338
514
 
339
- ### 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>
340
521
 
341
522
  ```ts
342
523
  await kassza.receipts.reverse(nyugta.number)
343
524
  ```
344
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
+
345
536
  ## Adószám lekérdezés
346
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
+
347
543
  ```ts
348
544
  const ceg = await kassza.taxpayer.query('13421739')
349
545
 
@@ -356,10 +552,23 @@ if (ceg.valid) {
356
552
 
357
553
  A cégadatok a NAV-tól jönnek, a cím formázva, például `1031 Budapest, Záhony utca 7.`
358
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
+
359
565
  ## Hibakezelés
360
566
 
361
567
  Minden hiba `SzamlazzError`, magyar üzenettel és javítási tippel.
362
568
 
569
+ <details>
570
+ <summary><b>Duplikált rendelésszám és validációs hiba</b> · <code>isSzamlazzError()</code></summary>
571
+
363
572
  ```ts
364
573
  import { isSzamlazzError } from 'kassza'
365
574
 
@@ -377,6 +586,13 @@ try {
377
586
  - `error.code`: a Számlázz.hu hibakódja, például `57`.
378
587
  - `error.hint`: magyar javítási tipp.
379
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
+
380
596
  | `error.category` | Jelentés |
381
597
  |---|---|
382
598
  | `validation` | Hibás adat, a kérés el sem ment, vagy a Számlázz.hu elutasította |
@@ -386,11 +602,24 @@ try {
386
602
  | `auth` / `account` | Rossz kulcs, lejárt előfizetés |
387
603
  | `network` / `timeout` / `maintenance` | Átmeneti hiba |
388
604
 
389
- Ú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>
390
616
 
391
617
  ## Fizetési értesítés (IPN)
392
618
 
393
- 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>
394
623
 
395
624
  ```ts
396
625
  import { ipnOkResponse, readIpnNotification } from 'kassza/ipn'
@@ -404,6 +633,13 @@ export async function POST(request: Request) {
404
633
  }
405
634
  ```
406
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
+
407
643
  Csak a Számlázz.hu IP-címeiről jövő kérést érdemes elfogadni:
408
644
 
409
645
  ```ts
@@ -412,9 +648,22 @@ import { isSzamlazzIp } from 'kassza/ipn'
412
648
  isSzamlazzIp(request.headers.get('x-forwarded-for') ?? '')
413
649
  ```
414
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
+
415
661
  ## PDF mentése tárhelyre
416
662
 
417
- 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>
418
667
 
419
668
  ```ts
420
669
  import { invoicePdfKey, s3FetchStorage, storePdf } from 'kassza/storage'
@@ -435,7 +684,12 @@ fajl.key
435
684
 
436
685
  A kulcs például `szamlak/2026/09/E-WEB-2026-12.pdf` lesz.
437
686
 
438
- 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>
439
693
 
440
694
  ```ts
441
695
  import { fsStorage } from 'kassza/storage/fs'
@@ -443,11 +697,24 @@ import { fsStorage } from 'kassza/storage/fs'
443
697
  const tarhely = fsStorage({ directory: './szamlak' })
444
698
  ```
445
699
 
700
+ 📖 **Dokumentáció:** [PDF tárhely](https://kassza-amber.vercel.app/docs/kiegeszitok/pdf-tarhely)
701
+
702
+ </details>
703
+
446
704
  További adapterek: `s3Storage` (AWS SDK), `r2BindingStorage`, `vercelBlobStorage`, `uploadthingStorage`, `supabaseStorage`, `memoryStorage`.
447
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
+
448
712
  ## Serverless és edge
449
713
 
450
- 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>
451
718
 
452
719
  ```ts
453
720
  import { Redis } from '@upstash/redis'
@@ -456,7 +723,12 @@ import { upstashRedisCookieStore } from 'kassza/cookie-stores'
456
723
  const kassza = createKassza({ cookieStore: upstashRedisCookieStore(Redis.fromEnv()) })
457
724
  ```
458
725
 
459
- 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>
460
732
 
461
733
  ```ts
462
734
  import { cloudflareKvCookieStore } from 'kassza/cookie-stores'
@@ -464,12 +736,25 @@ import { cloudflareKvCookieStore } from 'kassza/cookie-stores'
464
736
  const kassza = createKassza({ agentKey: env.SZAMLAZZ_AGENT_KEY, cookieStore: cloudflareKvCookieStore(env.KASSZA_KV) })
465
737
  ```
466
738
 
739
+ 📖 **Dokumentáció:** [Serverless és edge](https://kassza-amber.vercel.app/docs/kiegeszitok/serverless-es-edge)
740
+
741
+ </details>
742
+
467
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.
468
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
+
469
751
  ## Tesztelés
470
752
 
471
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.
472
754
 
755
+ <details>
756
+ <summary><b>Vitest példa</b> · <code>createMockKassza()</code></summary>
757
+
473
758
  ```ts
474
759
  import { createMockKassza } from 'kassza/testing'
475
760
 
@@ -490,8 +775,23 @@ test('hálózati hibánál nem számláz kétszer', async () => {
490
775
  })
491
776
  ```
492
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
+
493
788
  ## Validátorok és pénzszámítás
494
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
+
495
795
  ```ts
496
796
  import {
497
797
  isValidHungarianBankAccount,
@@ -506,6 +806,13 @@ parseHungarianAddress('1031 Budapest, Záhony utca 7.')
506
806
 
507
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.
508
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
+
509
816
  ```ts
510
817
  import { calculateInvoiceItem, calculateReceiptItem } from 'kassza/money'
511
818
 
@@ -515,8 +822,22 @@ calculateReceiptItem({ grossUnitPrice: 1_000, vat: 27 })
515
822
 
516
823
  Az első eredménye `{ netAmount: 1181, vatAmount: 319, grossAmount: 1500, ... }`, a másodiké `{ netAmount: 787.4, vatAmount: 212.6, grossAmount: 1000, ... }`.
517
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
+
518
834
  ## Haladó beállítások
519
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
+
520
841
  ```ts
521
842
  const kassza = createKassza({
522
843
  timeoutMs: 30_000,
@@ -534,12 +855,28 @@ await kassza.invoices.getPdf('E-WEB-2026-12', { signal: AbortSignal.timeout(5_00
534
855
  - A hookok soha nem kapják meg az Agent kulcsot.
535
856
  - Minden metódus fogad `AbortSignal`-t.
536
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
+
537
865
  A `resetSession()` új sessiont kér. Hívd meg, ha a Számlázz.hu fiókban megváltoztak a cégadatok:
538
866
 
539
867
  ```ts
540
868
  await kassza.resetSession()
541
869
  ```
542
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
+
543
880
  ## AI-val kódolsz?
544
881
 
545
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:
@@ -548,6 +885,16 @@ A csomagban van egy `agents/` mappa. Ebből a Claude Code, a Cursor, a Copilot
548
885
 
549
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.
550
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
+
551
894
  ---
552
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
+
553
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.4.0",
3
+ "version": "0.5.1",
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",