kassza 0.12.0 → 0.13.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 +283 -18
- package/agents/README.md +20 -5
- package/agents/api.md +165 -2
- package/agents/pitfalls.md +16 -3
- package/agents/recipes.md +215 -45
- package/agents/skills/kassza/SKILL.md +11 -8
- package/dist/cli.cjs +552 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +552 -0
- package/dist/client-6MkeuFqD.d.ts +268 -0
- package/dist/client-B5FryKxJ.d.cts +268 -0
- package/dist/{client-CsmGIFRS.cjs → client-C-PdfL_P.cjs} +235 -597
- package/dist/{client-CL3fuH6A.js → client-CfaS1-Jx.js} +35 -403
- package/dist/context-BxQlIlug.d.ts +425 -0
- package/dist/context-DXNbTPwz.d.cts +425 -0
- package/dist/{create-once-CqdYmQD8.js → create-once-Cz621l8r.js} +3 -3
- package/dist/{create-once-D0pwuenl.cjs → create-once-DgMtKKcG.cjs} +8 -2
- package/dist/{crypto-B8lERvR1.cjs → crypto-Dpn4FHQ6.cjs} +9 -0
- package/dist/{crypto-DK_osBVy.js → crypto-usDg8L2K.js} +4 -1
- package/dist/data-link/index.cjs +232 -0
- package/dist/data-link/index.d.cts +79 -0
- package/dist/data-link/index.d.ts +79 -0
- package/dist/data-link/index.js +224 -0
- package/dist/delegation/index.cjs +34 -33
- package/dist/delegation/index.d.cts +2 -1
- package/dist/delegation/index.d.ts +2 -1
- package/dist/delegation/index.js +3 -2
- package/dist/get-Byc9T5WO.d.cts +151 -0
- package/dist/get-Byc9T5WO.d.ts +151 -0
- package/dist/get-Csm2n0rZ.cjs +445 -0
- package/dist/get-DT3JEgQ6.js +380 -0
- package/dist/index.cjs +3 -3
- package/dist/index.d.cts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +3 -3
- package/dist/{issue-BsyYdrIG.cjs → issue-AGRohSm7.cjs} +48 -665
- package/dist/{issue-C6Fcjvln.js → issue-DtSLpVdJ.js} +5 -502
- package/dist/mcp/index.cjs +10 -0
- package/dist/mcp/index.d.cts +71 -0
- package/dist/mcp/index.d.ts +71 -0
- package/dist/mcp/index.js +2 -0
- package/dist/money/index.cjs +1 -1
- package/dist/money/index.js +1 -1
- package/dist/{money-DrhGkWHW.cjs → money-BxytJW6f.cjs} +25 -9
- package/dist/{money-DAA7OwiO.js → money-t7uy1n91.js} +25 -9
- package/dist/nav/index.cjs +1046 -0
- package/dist/nav/index.d.cts +247 -0
- package/dist/nav/index.d.ts +247 -0
- package/dist/nav/index.js +1012 -0
- package/dist/nav-BEwcX7-N.cjs +203 -0
- package/dist/nav-CK1WgYo7.js +156 -0
- package/dist/parse-BJj-aqKy.cjs +380 -0
- package/dist/parse-C608ehqM.js +291 -0
- package/dist/payments/barion.cjs +1 -1
- package/dist/payments/barion.d.cts +2 -2
- package/dist/payments/barion.d.ts +2 -2
- package/dist/payments/barion.js +1 -1
- package/dist/payments/index.cjs +2 -2
- package/dist/payments/index.d.cts +3 -3
- package/dist/payments/index.d.ts +3 -3
- package/dist/payments/index.js +2 -2
- package/dist/payments/paypal.cjs +1 -1
- package/dist/payments/paypal.d.cts +2 -2
- package/dist/payments/paypal.d.ts +2 -2
- package/dist/payments/paypal.js +1 -1
- package/dist/payments/revolut.cjs +2 -2
- package/dist/payments/revolut.d.cts +2 -2
- package/dist/payments/revolut.d.ts +2 -2
- package/dist/payments/revolut.js +2 -2
- package/dist/payments/simplepay.cjs +2 -2
- package/dist/payments/simplepay.d.cts +2 -2
- package/dist/payments/simplepay.d.ts +2 -2
- package/dist/payments/simplepay.js +2 -2
- package/dist/payments/stripe.cjs +2 -2
- package/dist/payments/stripe.d.cts +2 -2
- package/dist/payments/stripe.d.ts +2 -2
- package/dist/payments/stripe.js +2 -2
- package/dist/reports/index.cjs +11 -164
- package/dist/reports/index.js +1 -154
- package/dist/request-body-CH6ZGOrq.cjs +34 -0
- package/dist/request-body-uZHMRlQr.js +29 -0
- package/dist/serialize-BXOww1Uq.cjs +286 -0
- package/dist/serialize-DSE_o9RK.js +215 -0
- package/dist/server-C6PoNkdD.cjs +1557 -0
- package/dist/server-Cd8HB661.js +1504 -0
- package/dist/testing/index.cjs +1476 -3
- package/dist/testing/index.d.cts +194 -2
- package/dist/testing/index.d.ts +194 -2
- package/dist/testing/index.js +1477 -6
- package/dist/{types-COf1LAD-.d.cts → types-BVeR7KyU.d.cts} +1 -1
- package/dist/{types-COf1LAD-.d.ts → types-BVeR7KyU.d.ts} +1 -1
- package/dist/{webhook-C76bV-4R.cjs → webhook-81giRMdQ.cjs} +3 -25
- package/dist/{webhook-q2OzNwd7.d.ts → webhook-CpCMHhn2.d.ts} +1 -1
- package/dist/{webhook-CfaDgcL0.d.cts → webhook-CpMJuP6c.d.cts} +1 -1
- package/dist/{webhook-D4lvtex1.js → webhook-CrEGohbg.js} +3 -25
- package/llms.txt +4 -4
- package/package.json +43 -1
- package/dist/client-CickRRFr.d.ts +0 -838
- package/dist/client-DvWZoX_E.d.cts +0 -838
package/README.md
CHANGED
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
|
|
19
19
|
<p align="center">
|
|
20
20
|
<a href="https://kasszajs.hu"><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: kasszajs.hu" width="428"></picture></a>
|
|
21
|
-
<a href="https://kasszajs.hu/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ó:
|
|
21
|
+
<a href="https://kasszajs.hu/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ó: 113 oldal, magyarul" width="428"></picture></a>
|
|
22
22
|
<br>
|
|
23
|
-
<a href="https://kasszajs.hu/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:
|
|
23
|
+
<a href="https://kasszajs.hu/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: 28 futtatható példa" width="428"></picture></a>
|
|
24
24
|
<a href="https://kasszajs.hu/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>
|
|
25
25
|
</p>
|
|
26
26
|
|
|
@@ -56,7 +56,9 @@ Ennyi. A kerekítést, a magyar dátumot, az XML-t, a session cookie-t és a hib
|
|
|
56
56
|
|
|
57
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
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
|
|
59
|
+
- **Nincs dupla számla.** Számlát a kassza soha nem küld újra magától. A `createOnce()` kiállítás előtt megkeresi a bizonylatot, bizonytalan hiba után pedig visszakeresi.
|
|
60
|
+
- **Fizetésből bizonylat.** Stripe, SimplePay, Barion, Revolut és PayPal webhookból pontosan egyszer nyugta vagy számla, visszatérítéskor sztornó.
|
|
61
|
+
- **NAV nyugta-adatszolgáltatás.** Napi összesítő és egyeztetés a 2026. szeptember 1-jétől kötelező adatszolgáltatáshoz.
|
|
60
62
|
- **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
63
|
- **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
64
|
|
|
@@ -88,13 +90,13 @@ Ennyi. A kerekítést, a magyar dátumot, az XML-t, a session cookie-t és a hib
|
|
|
88
90
|
|
|
89
91
|
## Tartalom
|
|
90
92
|
|
|
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) | | |
|
|
93
|
+
| Kezdés | Műveletek | Integrációk | Kiegészítők |
|
|
94
|
+
| --- | --- | --- | --- |
|
|
95
|
+
| 🌐 [Weboldal, sandbox és receptek](#weboldal-sandbox-és-receptek) | 📄 [Számlák](#számlák) | 💳 [Fizetésből bizonylat](#fizetésből-bizonylat) | 🗄️ [PDF mentése tárhelyre](#pdf-mentése-tárhelyre) |
|
|
96
|
+
| ⚙️ [Beállítás](#beállítás) | 🧾 [Nyugták](#nyugták) | 📊 [NAV nyugta-adatszolgáltatás](#nav-nyugta-adatszolgáltatás) | ⚡ [Serverless és edge](#serverless-és-edge) |
|
|
97
|
+
| 🚨 [Hibakezelés](#hibakezelés) | 🏛️ [Adószám lekérdezés](#adószám-lekérdezés) | 🤝 [Megbízotti számlázás](#megbízotti-számlázás) | 🧪 [Tesztelés](#tesztelés) |
|
|
98
|
+
| 🎛️ [Haladó beállítások](#haladó-beállítások) | 🔔 [Fizetési értesítés (IPN)](#fizetési-értesítés-ipn) | 🔗 [Pénzügyi adatkapcsolat](#pénzügyi-adatkapcsolat) | 🧮 [Validátorok és pénzszámítás](#validátorok-és-pénzszámítás) |
|
|
99
|
+
| 🤖 [AI-val kódolsz?](#ai-val-kódolsz) | | | 💻 [Parancssor és MCP szerver](#parancssor-és-mcp-szerver) |
|
|
98
100
|
|
|
99
101
|
## Weboldal, sandbox és receptek
|
|
100
102
|
|
|
@@ -104,8 +106,8 @@ A teljes magyar dokumentáció, a sandbox és a receptek a **[kasszajs.hu](https
|
|
|
104
106
|
<a href="https://kasszajs.hu/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
107
|
</p>
|
|
106
108
|
|
|
107
|
-
- 📖 **[Dokumentáció](https://kasszajs.hu/docs)**:
|
|
108
|
-
- ▶️ **[Sandbox](https://kasszajs.hu/sandbox)**:
|
|
109
|
+
- 📖 **[Dokumentáció](https://kasszajs.hu/docs)**: 113 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.
|
|
110
|
+
- ▶️ **[Sandbox](https://kasszajs.hu/sandbox)**: 28 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
111
|
- 🍳 **[Receptek](https://kasszajs.hu/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
112
|
- 🤖 **[llms.txt](https://kasszajs.hu/llms.txt)**: a dokumentáció tartalomjegyzéke AI asszisztenseknek, a teljes szöveg egy fájlban: [llms-full.txt](https://kasszajs.hu/llms-full.txt).
|
|
111
113
|
- 📦 **[npm csomag](https://www.npmjs.com/package/kassza)** · 🏛️ **[Hivatalos Számlázz.hu Agent dokumentáció](https://docs.szamlazz.hu/hu/agent/)**
|
|
@@ -118,7 +120,7 @@ A teljes magyar dokumentáció, a sandbox és a receptek a **[kasszajs.hu](https
|
|
|
118
120
|
- **[Stripe webhook](https://kasszajs.hu/docs/receptek/stripe-webhook)**: Számla a Stripe Checkout checkout.session.completed eseményéből.
|
|
119
121
|
- **[Nevezés díjbekérővel](https://kasszajs.hu/docs/receptek/nevezes-dijbekerovel)**: Versenynevezés vagy rendezvényjelentkezés átutalásos fizetéssel.
|
|
120
122
|
- **[IPN webhook](https://kasszajs.hu/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://kasszajs.hu/docs/receptek/penztari-nyugta)**: Nyugta egy
|
|
123
|
+
- **[Pénztári nyugta](https://kasszajs.hu/docs/receptek/penztari-nyugta)**: Nyugta egy food truck pénztárprogramjából a receipts.createOnce metódussal, a dupla nyugta kezelésével és e-mail kiküldéssel, Next.js route handlerben.
|
|
122
124
|
- **[PDF mentése S3-ba vagy R2-be](https://kasszajs.hu/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
125
|
- **[Adószám alapú kitöltés](https://kasszajs.hu/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
126
|
- **[Devizás számla EU-s cégnek](https://kasszajs.hu/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.
|
|
@@ -128,11 +130,11 @@ A teljes magyar dokumentáció, a sandbox és a receptek a **[kasszajs.hu](https
|
|
|
128
130
|
</details>
|
|
129
131
|
|
|
130
132
|
<details>
|
|
131
|
-
<summary>▶️ <b>Mind a
|
|
133
|
+
<summary>▶️ <b>Mind a 28 sandbox példa</b></summary>
|
|
132
134
|
|
|
133
135
|
**Számlák:** [Számla kiállítása](https://kasszajs.hu/sandbox?pelda=szamla) · [Webshop számla bruttó árakkal](https://kasszajs.hu/sandbox?pelda=szamla-brutto) · [Díjbekérő, majd számla](https://kasszajs.hu/sandbox?pelda=dijbekero-szamla) · [Előleg- és végszámla](https://kasszajs.hu/sandbox?pelda=eloleg-vegszamla) · [Helyesbítő számla](https://kasszajs.hu/sandbox?pelda=helyesbito-szamla) · [Devizás számla EU-s vevőnek](https://kasszajs.hu/sandbox?pelda=devizas-szamla) · [Számlaelőnézet](https://kasszajs.hu/sandbox?pelda=elonezet) · [Számla sztornózása](https://kasszajs.hu/sandbox?pelda=sztorno) · [Befizetések rögzítése](https://kasszajs.hu/sandbox?pelda=befizetes) · [PDF lekérése utólag](https://kasszajs.hu/sandbox?pelda=pdf-lekeres) · [Számla adatainak lekérése](https://kasszajs.hu/sandbox?pelda=szamla-adatai) · [Díjbekérő törlése](https://kasszajs.hu/sandbox?pelda=dijbekero-torlese)
|
|
134
136
|
|
|
135
|
-
**Nyugták:** [Nyugta kiállítása](https://kasszajs.hu/sandbox?pelda=nyugta) · [Nyugta sztornózása](https://kasszajs.hu/sandbox?pelda=nyugta-sztorno) · [Nyugta lekérdezése](https://kasszajs.hu/sandbox?pelda=nyugta-lekerdezes) · [Nyugta kiküldése e-mailben](https://kasszajs.hu/sandbox?pelda=nyugta-kikuldes)
|
|
137
|
+
**Nyugták:** [Nyugta kiállítása](https://kasszajs.hu/sandbox?pelda=nyugta) · [Pénztári nyugta, dupla gombnyomás](https://kasszajs.hu/sandbox?pelda=penztari-nyugta) · [Nyugta sztornózása](https://kasszajs.hu/sandbox?pelda=nyugta-sztorno) · [Nyugta lekérdezése](https://kasszajs.hu/sandbox?pelda=nyugta-lekerdezes) · [Nyugta kiküldése e-mailben](https://kasszajs.hu/sandbox?pelda=nyugta-kikuldes)
|
|
136
138
|
|
|
137
139
|
**NAV:** [Adószám lekérdezése](https://kasszajs.hu/sandbox?pelda=adoszam)
|
|
138
140
|
|
|
@@ -207,7 +209,7 @@ const szamla = await kassza.invoices.create({
|
|
|
207
209
|
city: 'Budapest',
|
|
208
210
|
address: 'Fő utca 1.',
|
|
209
211
|
email: 'vevo@ceg.hu',
|
|
210
|
-
taxNumber: '
|
|
212
|
+
taxNumber: '12345676-2-42',
|
|
211
213
|
},
|
|
212
214
|
items: [
|
|
213
215
|
{ name: 'Póló', quantity: 2, grossUnitPrice: 5_990, vat: 27 },
|
|
@@ -466,7 +468,7 @@ A `find` `null`-t ad, ha nincs ilyen számla, a `get` ilyenkor hibát dob.
|
|
|
466
468
|
|
|
467
469
|
## Nyugták
|
|
468
470
|
|
|
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.
|
|
471
|
+
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. A Számla Agent nyugtája számítógéppel előállított nyugta, online pénztárgépet nem pótol: csak nem pénztárgép-köteles tevékenységhez adható, például webshopban vagy food truckban. Részletek: [Nyugta vagy számla?](https://kasszajs.hu/docs/alapok/nyugta-vagy-szamla).
|
|
470
472
|
|
|
471
473
|
<details>
|
|
472
474
|
<summary><b>Nyugta</b> · <code>receipts.create()</code></summary>
|
|
@@ -527,6 +529,33 @@ await kassza.receipts.reverse(nyugta.number)
|
|
|
527
529
|
|
|
528
530
|
</details>
|
|
529
531
|
|
|
532
|
+
<details>
|
|
533
|
+
<summary><b>Nyugta vagy számla?</b> · <code>chooseDocument()</code>, <code>receipts.convertToInvoice()</code></summary>
|
|
534
|
+
|
|
535
|
+
```ts
|
|
536
|
+
import { chooseDocument } from 'kassza'
|
|
537
|
+
|
|
538
|
+
const dontes = chooseDocument({ grossTotal: 18_990, invoiceRequested: false })
|
|
539
|
+
|
|
540
|
+
dontes.type
|
|
541
|
+
dontes.reasons
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
Nyugta csak akkor adható, ha a vevő nem adóalany és nem jogi személy, az összeg 900 000 Ft alatti, a teljesítésig kifizetik, és a vevő nem kér számlát. Ha a vevő utólag kér számlát, a `convertToInvoice()` sztornózza a nyugtát, és számlát állít ki helyette, pontosan egyszer:
|
|
545
|
+
|
|
546
|
+
```ts
|
|
547
|
+
const atalakitas = await kassza.receipts.convertToInvoice({
|
|
548
|
+
receiptNumber: nyugta.number,
|
|
549
|
+
buyer: { name: 'Példa Kft.', zip: '1111', city: 'Budapest', address: 'Fő utca 1.', taxNumber: '12345676-2-42' },
|
|
550
|
+
})
|
|
551
|
+
|
|
552
|
+
atalakitas.invoice.number
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
📖 **Dokumentáció:** [Nyugta vagy számla?](https://kasszajs.hu/docs/alapok/nyugta-vagy-szamla)
|
|
556
|
+
|
|
557
|
+
</details>
|
|
558
|
+
|
|
530
559
|
<p>
|
|
531
560
|
<a href="https://kasszajs.hu/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
561
|
<a href="https://kasszajs.hu/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>
|
|
@@ -601,12 +630,32 @@ try {
|
|
|
601
630
|
| `not_found` | Nincs ilyen bizonylat |
|
|
602
631
|
| `auth` / `account` | Rossz kulcs, lejárt előfizetés |
|
|
603
632
|
| `network` / `timeout` / `maintenance` | Átmeneti hiba |
|
|
633
|
+
| `rate_limit` | A tesztfiókban túl sok bizonylat készült rövid idő alatt (167) |
|
|
634
|
+
| `attempt_limit` | Ezt a kérést már ötször sikertelenül küldték el, ezért a kassza el sem küldi |
|
|
604
635
|
|
|
605
636
|
📖 **Dokumentáció:** [Hibakezelés, hibakódok](https://kasszajs.hu/docs/alapok/hibakezeles) · ▶️ **Sandbox:** [Validációs hibák](https://kasszajs.hu/sandbox?pelda=hibakezeles-validacio)
|
|
606
637
|
|
|
607
638
|
</details>
|
|
608
639
|
|
|
609
|
-
>
|
|
640
|
+
<details>
|
|
641
|
+
<summary><b>Pontosan egyszer</b> · <code>invoices.createOnce()</code>, <code>receipts.createOnce()</code></summary>
|
|
642
|
+
|
|
643
|
+
```ts
|
|
644
|
+
const { number, created } = await kassza.invoices.createOnce({
|
|
645
|
+
orderNumber: 'REND-1001',
|
|
646
|
+
paid: true,
|
|
647
|
+
buyer,
|
|
648
|
+
items,
|
|
649
|
+
})
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
Kiállítás előtt megkeresi a számlát, hálózati hiba, időtúllépés vagy 56-os hiba után pedig visszakeresi. Ha a webhook kétszer fut le, a második hívás `created: false` eredménnyel a meglévő számlát adja. Ha ugyanazt a kérést több szerver is küldheti, az `attemptLedger` opció a folyamatok között is betartja az öt próbálkozásos korlátot.
|
|
653
|
+
|
|
654
|
+
📖 **Dokumentáció:** [Pontosan egyszer](https://kasszajs.hu/docs/alapok/pontosan-egyszer) · ▶️ **Sandbox:** [Pénztári nyugta, dupla gombnyomás](https://kasszajs.hu/sandbox?pelda=penztari-nyugta)
|
|
655
|
+
|
|
656
|
+
</details>
|
|
657
|
+
|
|
658
|
+
> **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, a `createOnce()` pedig ezt el is végzi helyetted.
|
|
610
659
|
|
|
611
660
|
<p>
|
|
612
661
|
<a href="https://kasszajs.hu/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>
|
|
@@ -660,6 +709,137 @@ Az `x-forwarded-for` fejlécből a **jobb szélső** címet vizsgálja, vagyis a
|
|
|
660
709
|
<a href="https://kasszajs.hu/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>
|
|
661
710
|
</p>
|
|
662
711
|
|
|
712
|
+
## Fizetésből bizonylat
|
|
713
|
+
|
|
714
|
+
Stripe, SimplePay, Barion, Revolut vagy PayPal fizetésből nyugta vagy számla, a szolgáltató SDK-ja nélkül. A webhookkezelő ellenőrzi az aláírást, az `issueForPayment()` pedig eldönti, hogy nyugta vagy számla jár, és pontosan egyszer kiállítja.
|
|
715
|
+
|
|
716
|
+
<details>
|
|
717
|
+
<summary><b>Stripe webhook</b> · <code>stripeWebhook()</code>, <code>issueForPayment()</code></summary>
|
|
718
|
+
|
|
719
|
+
```ts
|
|
720
|
+
import { stripeWebhook } from 'kassza/payments/stripe'
|
|
721
|
+
|
|
722
|
+
export const POST = stripeWebhook({
|
|
723
|
+
secret: process.env.STRIPE_WEBHOOK_SECRET!,
|
|
724
|
+
apiKey: process.env.STRIPE_SECRET_KEY,
|
|
725
|
+
onPayment: (payment) => kassza.issueForPayment(payment, { vat: 27 }),
|
|
726
|
+
})
|
|
727
|
+
```
|
|
728
|
+
|
|
729
|
+
- Az újraküldött webhook nem állít ki második bizonylatot.
|
|
730
|
+
- Teljes visszatérítéskor a kassza sztornózza a bizonylatot.
|
|
731
|
+
- Ugyanígy működik a `simplePayWebhook`, a `barionWebhook`, a `revolutWebhook` és a `payPalWebhook`.
|
|
732
|
+
|
|
733
|
+
📖 **Dokumentáció:** [Fizetésből bizonylat](https://kasszajs.hu/docs/fizetesek)
|
|
734
|
+
|
|
735
|
+
</details>
|
|
736
|
+
|
|
737
|
+
<p>
|
|
738
|
+
<a href="https://kasszajs.hu/docs/fizetesek"><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ó: Fizetésből bizonylat" height="44"></picture></a>
|
|
739
|
+
<a href="https://kasszajs.hu/docs/receptek/stripe-webhook"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-stripe-webhook-dark.svg"><img src="https://raw.githubusercontent.com/futozs/kassza/main/readme/assets/button-recipe-stripe-webhook-light.svg" alt="Recept: Stripe webhook" height="44"></picture></a>
|
|
740
|
+
</p>
|
|
741
|
+
|
|
742
|
+
## NAV nyugta-adatszolgáltatás
|
|
743
|
+
|
|
744
|
+
2026. szeptember 1-jétől a számítógéppel előállított nyugtákról is napi összesítőt kell küldeni a NAV-nak. A Számlázz.hu a nála kiállított nyugtákat a NAV összekötés után maga jelenti, a kassza abban segít, hogy ellenőrizd: minden napod megérkezett.
|
|
745
|
+
|
|
746
|
+
<details>
|
|
747
|
+
<summary><b>Napi összesítő és egyeztetés</b> · <code>navDailyReports()</code>, <code>reconcileNavReports()</code></summary>
|
|
748
|
+
|
|
749
|
+
```ts
|
|
750
|
+
import { createNavReceiptClient, reconcileNavReports } from 'kassza/nav'
|
|
751
|
+
import { navDailyReports } from 'kassza/reports'
|
|
752
|
+
|
|
753
|
+
const nav = createNavReceiptClient({
|
|
754
|
+
environment: 'production',
|
|
755
|
+
login: process.env.NAV_LOGIN!,
|
|
756
|
+
password: process.env.NAV_PASSWORD!,
|
|
757
|
+
signatureKey: process.env.NAV_SIGNATURE_KEY!,
|
|
758
|
+
taxNumber: process.env.NAV_TAX_NUMBER!,
|
|
759
|
+
})
|
|
760
|
+
|
|
761
|
+
const helyi = navDailyReports(nyugtak)
|
|
762
|
+
const nalNav = await nav.listAllReports({ from: '2026-09-01', to: '2026-09-30' })
|
|
763
|
+
const { missing, mismatched } = reconcileNavReports(helyi, nalNav)
|
|
764
|
+
```
|
|
765
|
+
|
|
766
|
+
A NAV kliens alapból csak olvas: a Számlázz.hu által jelentett nyugtákat ne küldd be te is, mert az kettős adatszolgáltatás. Beküldeni csak a kézi tartalék nyugtatömb összesítőjét kell (`paperReceiptReport()`).
|
|
767
|
+
|
|
768
|
+
📖 **Dokumentáció:** [NAV nyugta-adatszolgáltatás](https://kasszajs.hu/docs/nav-nyugta)
|
|
769
|
+
|
|
770
|
+
</details>
|
|
771
|
+
|
|
772
|
+
<p>
|
|
773
|
+
<a href="https://kasszajs.hu/docs/nav-nyugta"><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ó: NAV nyugta-adatszolgáltatás" height="44"></picture></a>
|
|
774
|
+
</p>
|
|
775
|
+
|
|
776
|
+
## Megbízotti számlázás
|
|
777
|
+
|
|
778
|
+
Platformoknak, amelyek sok cég nevében állítanak ki bizonylatot, a cégek saját Számlázz.hu fiókjában.
|
|
779
|
+
|
|
780
|
+
<details>
|
|
781
|
+
<summary><b>Csatlakozás és kliens megbízónként</b> · <code>connectPrincipal()</code>, <code>createKasszaPool()</code></summary>
|
|
782
|
+
|
|
783
|
+
```ts
|
|
784
|
+
import { connectPrincipal, createKasszaPool } from 'kassza/delegation'
|
|
785
|
+
|
|
786
|
+
const { status } = await connectPrincipal({
|
|
787
|
+
principal: {
|
|
788
|
+
name: 'Példa Kft.',
|
|
789
|
+
taxNumber: '12345676-2-42',
|
|
790
|
+
invoicePrefix: 'PLDA',
|
|
791
|
+
zip: '1111',
|
|
792
|
+
city: 'Budapest',
|
|
793
|
+
address: 'Fő utca 1.',
|
|
794
|
+
email: 'penzugy@pelda.hu',
|
|
795
|
+
},
|
|
796
|
+
user: { email: 'kassza+pelda@platform.hu', password: process.env.DELEGATE_PASSWORD!, firstName: 'Platform' },
|
|
797
|
+
})
|
|
798
|
+
|
|
799
|
+
const pool = createKasszaPool({ resolve: (megbizoId) => megbizoAdatai(megbizoId) })
|
|
800
|
+
const kliens = await pool.get('pelda')
|
|
801
|
+
await kliens.invoices.createOnce({ orderNumber: 'FOGLALAS-881', buyer, items })
|
|
802
|
+
```
|
|
803
|
+
|
|
804
|
+
A megbízó e-mailt kap, és a fiók birtokba vétele vagy a csatlakozási kérelem elfogadása után lehet a nevében kiállítani.
|
|
805
|
+
|
|
806
|
+
📖 **Dokumentáció:** [Megbízotti számlázás](https://kasszajs.hu/docs/megbizott-szamlazas)
|
|
807
|
+
|
|
808
|
+
</details>
|
|
809
|
+
|
|
810
|
+
<p>
|
|
811
|
+
<a href="https://kasszajs.hu/docs/megbizott-szamlazas"><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ó: Megbízotti számlázás" height="44"></picture></a>
|
|
812
|
+
</p>
|
|
813
|
+
|
|
814
|
+
## Pénzügyi adatkapcsolat
|
|
815
|
+
|
|
816
|
+
Könyvelő- és ERP-rendszereknek: a Számlázz.hu átküldi a kiállított és befogadott számlákat, a banki tranzakciókat és a nyugtákat.
|
|
817
|
+
|
|
818
|
+
<details>
|
|
819
|
+
<summary><b>Fogadó végpont</b> · <code>dataLinkHandler()</code></summary>
|
|
820
|
+
|
|
821
|
+
```ts
|
|
822
|
+
import { dataLinkHandler } from 'kassza/data-link'
|
|
823
|
+
|
|
824
|
+
export const POST = dataLinkHandler({
|
|
825
|
+
verifyKey: async (kulcs) => (await ugyfelKulcsai()).includes(kulcs),
|
|
826
|
+
onPush: async (push) => {
|
|
827
|
+
const iktatoszam = await bizonylatMentese(push)
|
|
828
|
+
return { registrationNumber: iktatoszam }
|
|
829
|
+
},
|
|
830
|
+
})
|
|
831
|
+
```
|
|
832
|
+
|
|
833
|
+
A kulcs ellenőrzése kötelező, mert az üzeneteknek nincs aláírása. A Számlázz.hu által elvárt válasz XML-t a kezelő készíti el.
|
|
834
|
+
|
|
835
|
+
📖 **Dokumentáció:** [Pénzügyi adatkapcsolat](https://kasszajs.hu/docs/adatkapcsolat)
|
|
836
|
+
|
|
837
|
+
</details>
|
|
838
|
+
|
|
839
|
+
<p>
|
|
840
|
+
<a href="https://kasszajs.hu/docs/adatkapcsolat"><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ó: Pénzügyi adatkapcsolat" height="44"></picture></a>
|
|
841
|
+
</p>
|
|
842
|
+
|
|
663
843
|
## PDF mentése tárhelyre
|
|
664
844
|
|
|
665
845
|
S3, Cloudflare R2, MinIO vagy Backblaze esetén nem kell az AWS SDK.
|
|
@@ -781,6 +961,28 @@ test('hálózati hibánál nem számláz kétszer', async () => {
|
|
|
781
961
|
|
|
782
962
|
</details>
|
|
783
963
|
|
|
964
|
+
<details>
|
|
965
|
+
<summary><b>Hamis Számla Agent</b> · <code>createFakeAgentFetch()</code></summary>
|
|
966
|
+
|
|
967
|
+
```ts
|
|
968
|
+
import { createFakeAgentFetch } from 'kassza/testing'
|
|
969
|
+
|
|
970
|
+
const agent = createFakeAgentFetch()
|
|
971
|
+
const kassza = createKassza({ agentKey: 'teszt-kulcs', fetch: agent.fetch, retryDelayMs: 0 })
|
|
972
|
+
|
|
973
|
+
agent.fail('ghostSuccess', { action: 'createInvoice' })
|
|
974
|
+
const eredmeny = await kassza.invoices.createOnce({ orderNumber: 'WEB-1', buyer, items })
|
|
975
|
+
|
|
976
|
+
eredmeny.created
|
|
977
|
+
agent.invoices.size
|
|
978
|
+
```
|
|
979
|
+
|
|
980
|
+
A valódi kliens fut, csak a Számlázz.hu helyett egy memóriában futó hamis Agent válaszol. Elveszett választ, karbantartást, részleges sikert és a Számlázz.hu hibakódjait is szimulálja.
|
|
981
|
+
|
|
982
|
+
📖 **Dokumentáció:** [Hamis Számla Agent](https://kasszajs.hu/docs/kiegeszitok/hamis-agent)
|
|
983
|
+
|
|
984
|
+
</details>
|
|
985
|
+
|
|
784
986
|
<p>
|
|
785
987
|
<a href="https://kasszajs.hu/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>
|
|
786
988
|
<a href="https://kasszajs.hu/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>
|
|
@@ -874,11 +1076,74 @@ await kassza.resetSession()
|
|
|
874
1076
|
|
|
875
1077
|
</details>
|
|
876
1078
|
|
|
1079
|
+
<details>
|
|
1080
|
+
<summary><b>Bizonylat-események és karbantartási szünet</b> · <code>onDocument</code>, <code>maintenanceCooldownMs</code></summary>
|
|
1081
|
+
|
|
1082
|
+
```ts
|
|
1083
|
+
const kassza = createKassza({
|
|
1084
|
+
maintenanceCooldownMs: 60_000,
|
|
1085
|
+
hooks: {
|
|
1086
|
+
onDocument: async (esemeny) => {
|
|
1087
|
+
await auditNaplo(esemeny.kind, esemeny.action, esemeny.number)
|
|
1088
|
+
},
|
|
1089
|
+
},
|
|
1090
|
+
})
|
|
1091
|
+
```
|
|
1092
|
+
|
|
1093
|
+
- Az `onDocument` minden kiállított és sztornózott bizonylat, valamint rögzített befizetés után lefut. Ha hibát dob, a bizonylat attól még elkészült.
|
|
1094
|
+
- A `maintenanceCooldownMs` karbantartási hiba után ennyi ideig nem küld kérést, hanem azonnal `maintenance` hibát ad, így átválthatsz tartalék folyamatra.
|
|
1095
|
+
|
|
1096
|
+
📖 **Dokumentáció:** [Pontosan egyszer](https://kasszajs.hu/docs/alapok/pontosan-egyszer)
|
|
1097
|
+
|
|
1098
|
+
</details>
|
|
1099
|
+
|
|
877
1100
|
<p>
|
|
878
1101
|
<a href="https://kasszajs.hu/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>
|
|
879
1102
|
<a href="https://kasszajs.hu/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>
|
|
880
1103
|
</p>
|
|
881
1104
|
|
|
1105
|
+
## Parancssor és MCP szerver
|
|
1106
|
+
|
|
1107
|
+
<details>
|
|
1108
|
+
<summary><b>Parancssor</b> · <code>npx kassza</code></summary>
|
|
1109
|
+
|
|
1110
|
+
```bash
|
|
1111
|
+
npx kassza doctor
|
|
1112
|
+
npx kassza xml preview szamla.json
|
|
1113
|
+
npx kassza invoice get --order REND-1001
|
|
1114
|
+
```
|
|
1115
|
+
|
|
1116
|
+
A `doctor` ellenőrzi a Node.js-t, az Agent kulcsot, a gép óráját és a munkamenetet. Az `xml preview` kiírja a küldendő XML-t az Agent kulcs nélkül, így supportjegyhez is csatolható.
|
|
1117
|
+
|
|
1118
|
+
📖 **Dokumentáció:** [Parancssor](https://kasszajs.hu/docs/kiegeszitok/parancssor)
|
|
1119
|
+
|
|
1120
|
+
</details>
|
|
1121
|
+
|
|
1122
|
+
<details>
|
|
1123
|
+
<summary><b>MCP szerver</b> · <code>npx kassza mcp</code></summary>
|
|
1124
|
+
|
|
1125
|
+
```json
|
|
1126
|
+
{
|
|
1127
|
+
"mcpServers": {
|
|
1128
|
+
"kassza": {
|
|
1129
|
+
"command": "npx",
|
|
1130
|
+
"args": ["-y", "kassza", "mcp"],
|
|
1131
|
+
"env": { "SZAMLAZZ_AGENT_KEY": "..." }
|
|
1132
|
+
}
|
|
1133
|
+
}
|
|
1134
|
+
}
|
|
1135
|
+
```
|
|
1136
|
+
|
|
1137
|
+
Claude, Cursor és más MCP kliensek számára. Alapból csak olvas. Az `--allow-write` kapcsolóval kiállíthat és sztornózhat is, de minden íráshoz kell a megfelelő előnézeti eszköz megerősítő kódja.
|
|
1138
|
+
|
|
1139
|
+
📖 **Dokumentáció:** [MCP szerver](https://kasszajs.hu/docs/kiegeszitok/mcp-szerver)
|
|
1140
|
+
|
|
1141
|
+
</details>
|
|
1142
|
+
|
|
1143
|
+
<p>
|
|
1144
|
+
<a href="https://kasszajs.hu/docs/kiegeszitok/parancssor"><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ó: Parancssor" height="44"></picture></a>
|
|
1145
|
+
</p>
|
|
1146
|
+
|
|
882
1147
|
## AI-val kódolsz?
|
|
883
1148
|
|
|
884
1149
|
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:
|
package/agents/README.md
CHANGED
|
@@ -6,23 +6,32 @@
|
|
|
6
6
|
- Receipts (nyugta): create, reverse, get, send by email.
|
|
7
7
|
- Taxpayer lookup from the NAV database.
|
|
8
8
|
|
|
9
|
+
It also links delegated (principal) accounts through the Agent (`connectPrincipal` in `kassza/delegation`), and ships these modules:
|
|
10
|
+
|
|
11
|
+
- `kassza/payments`: Stripe, SimplePay, Barion, Revolut and PayPal webhooks that issue a receipt or invoice exactly once, and reverse it on refund.
|
|
12
|
+
- `kassza/reports` and `kassza/nav`: the NAV daily receipt report (mandatory since 2026-09-01), reconciliation with NAV, and a NAV receipt interface client.
|
|
13
|
+
- `kassza/delegation`: invoicing on behalf of many companies, each in its own Számlázz.hu account.
|
|
14
|
+
- `kassza/data-link`: a receiver for the Számlázz.hu financial data link (pushed invoices, bank transactions and receipts).
|
|
15
|
+
- `kassza/testing`: a mock client and a fake Számla Agent `fetch` for integration tests.
|
|
16
|
+
- `kassza/mcp` and the `kassza` CLI (`npx kassza doctor`, `npx kassza mcp`).
|
|
17
|
+
|
|
9
18
|
It runs on Node 22+, Bun, Deno, Cloudflare Workers and Vercel Edge.
|
|
10
19
|
|
|
11
20
|
## Read in this order
|
|
12
21
|
|
|
13
22
|
1. [pitfalls.md](./pitfalls.md): hard rules. Follow them or you will create duplicate or invalid tax documents.
|
|
14
23
|
2. [api.md](./api.md): every method, input and output.
|
|
15
|
-
3. [recipes.md](./recipes.md): webhooks,
|
|
24
|
+
3. [recipes.md](./recipes.md): webhooks, exactly-once invoicing, receipts, IPN, PDF storage, serverless, tests, payment providers, NAV reports, delegated invoicing, data link.
|
|
16
25
|
|
|
17
26
|
A ready-made Claude Code skill is in [skills/kassza/SKILL.md](./skills/kassza/SKILL.md). Copy the `skills/kassza` folder into `.claude/skills/` in the user's project.
|
|
18
27
|
|
|
19
28
|
## The five things to get right
|
|
20
29
|
|
|
21
30
|
1. Create the client once, on the server only: `createKassza()`. It reads `SZAMLAZZ_AGENT_KEY`.
|
|
22
|
-
2. Always set `orderNumber` on invoices and `callId` on receipts, derived from the order ID.
|
|
31
|
+
2. Always set `orderNumber` on invoices and receipts (and `callId` on receipts), derived from the order ID.
|
|
23
32
|
3. Give prices as `netUnitPrice` or `grossUnitPrice` plus `vat`, and never compute net, VAT or gross yourself.
|
|
24
|
-
4. Never retry `create` in a loop.
|
|
25
|
-
5. In tests, use `createMockKassza()` from `kassza/testing` instead of the real API.
|
|
33
|
+
4. Never retry `create` in a loop. Prefer `invoices.createOnce()` and `receipts.createOnce()`: they look the document up, create it, and look it up again after an uncertain failure. With plain `create`, after a `network`, `timeout`, `partial_success` or `duplicate` error, call `invoices.find({ orderNumber })`.
|
|
34
|
+
5. In tests, use `createMockKassza()` or `createFakeAgentFetch()` from `kassza/testing` instead of the real API.
|
|
26
35
|
|
|
27
36
|
## Minimal example
|
|
28
37
|
|
|
@@ -31,13 +40,15 @@ import { createKassza } from 'kassza'
|
|
|
31
40
|
|
|
32
41
|
const kassza = createKassza()
|
|
33
42
|
|
|
34
|
-
const
|
|
43
|
+
const { number, created } = await kassza.invoices.createOnce({
|
|
35
44
|
orderNumber: 'ORDER-1001',
|
|
36
45
|
buyer: { name: 'Vevő Kft.', zip: '1111', city: 'Budapest', address: 'Fő utca 1.', email: 'vevo@example.hu' },
|
|
37
46
|
items: [{ name: 'Termék', quantity: 2, grossUnitPrice: 12_700, vat: 27 }],
|
|
38
47
|
})
|
|
39
48
|
```
|
|
40
49
|
|
|
50
|
+
`created` is `false` when an earlier call (a redelivered webhook, a retried job) already issued the invoice.
|
|
51
|
+
|
|
41
52
|
## Vocabulary
|
|
42
53
|
|
|
43
54
|
| Hungarian | kassza |
|
|
@@ -57,3 +68,7 @@ const invoice = await kassza.invoices.create({
|
|
|
57
68
|
| áfakulcs | vat |
|
|
58
69
|
| nettó / bruttó egységár | netUnitPrice / grossUnitPrice |
|
|
59
70
|
| Agent kulcs | agentKey |
|
|
71
|
+
| megbízó / megbízott | principal / delegate |
|
|
72
|
+
| pénztárgép-köteles | cashRegisterRequired |
|
|
73
|
+
| napi összesítő (NAV) | navDailyReports |
|
|
74
|
+
| pénzügyi adatkapcsolat | data link |
|