kassza 0.12.0 → 0.14.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.en.md +48 -0
- package/README.md +427 -32
- package/agents/README.md +26 -6
- package/agents/api.md +218 -3
- package/agents/pitfalls.md +27 -3
- package/agents/recipes.md +280 -51
- package/agents/skills/kassza/SKILL.md +14 -8
- package/agents/skills/migrate-from-szamlazz-js/SKILL.md +39 -0
- package/dist/batch/index.cjs +346 -0
- package/dist/batch/index.d.cts +91 -0
- package/dist/batch/index.d.ts +91 -0
- package/dist/batch/index.js +339 -0
- package/dist/cli.cjs +643 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +643 -0
- package/dist/client-CLFvJCVW.cjs +1452 -0
- package/dist/{client-CL3fuH6A.js → client-Cvf-hTz_.js} +306 -515
- package/dist/client-DeWWQ-RZ.d.ts +341 -0
- package/dist/client-SVZu25MB.d.cts +341 -0
- package/dist/context-CFNKzStE.d.cts +449 -0
- package/dist/context-kb33TgzE.d.ts +449 -0
- package/dist/cookie-stores/index.cjs +21 -150
- package/dist/cookie-stores/index.d.cts +4 -63
- package/dist/cookie-stores/index.d.ts +4 -63
- package/dist/cookie-stores/index.js +3 -144
- package/dist/create-CflXrPip.js +204 -0
- package/dist/create-CvUvLUaT.cjs +257 -0
- package/dist/{create-once-D0pwuenl.cjs → create-once-9yxR_Er_.cjs} +291 -33
- package/dist/create-once-Bh6fOWkW.d.cts +20 -0
- package/dist/{create-once-CqdYmQD8.js → create-once-Ca2gMk1h.js} +250 -34
- package/dist/create-once-VKp0tVow.d.ts +20 -0
- 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 +29 -0
- package/dist/data-link/index.d.ts +29 -0
- package/dist/data-link/index.js +224 -0
- package/dist/delegation/index.cjs +35 -34
- package/dist/delegation/index.d.cts +2 -1
- package/dist/delegation/index.d.ts +2 -1
- package/dist/delegation/index.js +4 -3
- package/dist/{errors-DLrb0g64.js → errors-DtN4g5Z9.js} +9 -1
- package/dist/{errors-DxeuTslP.cjs → errors-EE96_6D_.cjs} +20 -0
- package/dist/get-BdMTseh4.cjs +271 -0
- package/dist/get-Byc9T5WO.d.cts +151 -0
- package/dist/get-Byc9T5WO.d.ts +151 -0
- package/dist/get-CZEShCcj.js +260 -0
- package/dist/index-BhUPY_EH.d.cts +109 -0
- package/dist/index-BqGgQ4t3.d.ts +109 -0
- package/dist/{index-CYAGCdKJ.d.cts → index-C-7yWV7L.d.cts} +24 -1
- package/dist/{index-CYAGCdKJ.d.ts → index-C-7yWV7L.d.ts} +24 -1
- package/dist/index.cjs +19 -5
- package/dist/index.d.cts +11 -19
- package/dist/index.d.ts +11 -19
- package/dist/index.js +6 -6
- package/dist/ipn/index.cjs +26 -5
- package/dist/ipn/index.d.cts +12 -1
- package/dist/ipn/index.d.ts +12 -1
- package/dist/ipn/index.js +26 -6
- package/dist/issue-Bin4tKD_.cjs +988 -0
- package/dist/issue-DMA1Nbr1.js +905 -0
- package/dist/journal/index.cjs +454 -0
- package/dist/journal/index.d.cts +18 -0
- package/dist/journal/index.d.ts +18 -0
- package/dist/journal/index.js +445 -0
- package/dist/journal-DvI81Kt7.d.cts +114 -0
- package/dist/journal-Y9qrIB8G.d.ts +114 -0
- 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 +2 -1
- package/dist/money/index.d.cts +2 -2
- package/dist/money/index.d.ts +2 -2
- package/dist/money/index.js +2 -2
- package/dist/{money-DAA7OwiO.js → money-Cw457SD6.js} +120 -12
- package/dist/{money-DrhGkWHW.cjs → money-K9j0wPit.cjs} +124 -10
- 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-BNbc8U0R.cjs +203 -0
- package/dist/nav-BcCerwWS.js +156 -0
- package/dist/node/index.cjs +124 -0
- package/dist/node/index.d.cts +35 -0
- package/dist/node/index.d.ts +35 -0
- package/dist/node/index.js +120 -0
- package/dist/observe/index.cjs +311 -0
- package/dist/observe/index.d.cts +53 -0
- package/dist/observe/index.d.ts +53 -0
- package/dist/observe/index.js +303 -0
- package/dist/once-BN_3B5OF.cjs +103 -0
- package/dist/once-CqqZxsXG.js +74 -0
- package/dist/parse-Cr7yQ3_z.js +291 -0
- package/dist/parse-DOA2XQ3e.cjs +380 -0
- package/dist/payments/barion.cjs +26 -2
- package/dist/payments/barion.d.cts +2 -2
- package/dist/payments/barion.d.ts +2 -2
- package/dist/payments/barion.js +26 -2
- package/dist/payments/index.cjs +7 -2
- package/dist/payments/index.d.cts +4 -4
- package/dist/payments/index.d.ts +4 -4
- package/dist/payments/index.js +3 -3
- package/dist/payments/paypal.cjs +16 -2
- package/dist/payments/paypal.d.cts +2 -2
- package/dist/payments/paypal.d.ts +2 -2
- package/dist/payments/paypal.js +16 -2
- package/dist/payments/revolut.cjs +17 -3
- package/dist/payments/revolut.d.cts +2 -2
- package/dist/payments/revolut.d.ts +2 -2
- package/dist/payments/revolut.js +17 -3
- package/dist/payments/simplepay.cjs +37 -5
- package/dist/payments/simplepay.d.cts +2 -2
- package/dist/payments/simplepay.d.ts +2 -2
- package/dist/payments/simplepay.js +37 -5
- package/dist/payments/stripe.cjs +20 -3
- package/dist/payments/stripe.d.cts +2 -2
- package/dist/payments/stripe.d.ts +2 -2
- package/dist/payments/stripe.js +20 -3
- package/dist/push-BXj0Sf0Z.d.ts +52 -0
- package/dist/push-D4nNbCNV.d.cts +52 -0
- package/dist/reference-B5TATqb5.js +124 -0
- package/dist/reference-BIdYMK0t.cjs +183 -0
- package/dist/reports/index.cjs +11 -164
- package/dist/reports/index.d.cts +1 -1
- package/dist/reports/index.d.ts +1 -1
- 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-B2eFh3D-.js +219 -0
- package/dist/serialize-CquIsxA-.cjs +290 -0
- package/dist/server-BrJUbXs7.js +1505 -0
- package/dist/server-Dw9j8Mnd.cjs +1558 -0
- package/dist/session-Ckl5eJhV.d.ts +7 -0
- package/dist/{session-CKOuE6Jc.cjs → session-DeM5vjvC.cjs} +69 -13
- package/dist/{session-rMKaJcmq.js → session-SaEEXu2N.js} +58 -14
- package/dist/session-YbChChx7.d.cts +7 -0
- package/dist/storage/fs.cjs +1 -1
- package/dist/storage/fs.js +1 -1
- package/dist/storage/index.cjs +1 -1
- package/dist/storage/index.js +1 -1
- package/dist/store-C1rHd9DB.d.cts +19 -0
- package/dist/store-C1rHd9DB.d.ts +19 -0
- package/dist/stores/index.cjs +24 -0
- package/dist/stores/index.d.cts +4 -0
- package/dist/stores/index.d.ts +4 -0
- package/dist/stores/index.js +3 -0
- package/dist/stores-BNrS0dWl.cjs +506 -0
- package/dist/stores-DhjGBrl_.js +441 -0
- package/dist/testing/index.cjs +1500 -15
- package/dist/testing/index.d.cts +198 -3
- package/dist/testing/index.d.ts +198 -3
- package/dist/testing/index.js +1498 -15
- package/dist/{types-COf1LAD-.d.ts → types-B1A8mUIE.d.cts} +14 -2
- package/dist/{types-COf1LAD-.d.cts → types-ByAEvGsZ.d.ts} +14 -2
- package/dist/{types-k--zHf4l.d.ts → types-D1zDOH_F.d.ts} +1 -1
- package/dist/{types-DH8QoNZK.d.cts → types-lnKkQdot.d.cts} +1 -1
- package/dist/warnings-B3DXnveC.d.cts +31 -0
- package/dist/warnings-B3DXnveC.d.ts +31 -0
- package/dist/warnings-DeIw5RFj.cjs +20 -0
- package/dist/warnings-DwTl5J-2.js +15 -0
- package/dist/{webhook-D4lvtex1.js → webhook-CQVShAfI.js} +47 -26
- package/dist/{webhook-C76bV-4R.cjs → webhook-Ckj-_hPD.cjs} +70 -25
- package/dist/webhook-CmdhGiH5.d.cts +11 -0
- package/dist/webhook-D6lEejob.d.ts +11 -0
- package/llms.txt +6 -5
- package/package.json +134 -4
- package/dist/client-CickRRFr.d.ts +0 -838
- package/dist/client-CsmGIFRS.cjs +0 -1637
- package/dist/client-DvWZoX_E.d.cts +0 -838
- package/dist/issue-BsyYdrIG.cjs +0 -1531
- package/dist/issue-C6Fcjvln.js +0 -1274
- package/dist/session-Dm_45x8K.d.cts +0 -11
- package/dist/session-Dm_45x8K.d.ts +0 -11
- package/dist/webhook-CfaDgcL0.d.cts +0 -6
- package/dist/webhook-q2OzNwd7.d.ts +0 -6
package/README.md
CHANGED
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
8
|
<b>Számlázz.hu, TypeScriptben, egyszerűbben.</b><br>
|
|
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
|
|
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.<br>
|
|
10
|
+
<sub><a href="https://github.com/futozs/kassza/blob/main/README.en.md">English overview</a></sub>
|
|
10
11
|
</p>
|
|
11
12
|
|
|
12
13
|
<p align="center">
|
|
@@ -14,14 +15,16 @@
|
|
|
14
15
|
<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=28313d&color=c2501a" alt="havi letöltés"></a>
|
|
15
16
|
<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-c2501a?style=flat-square&labelColor=28313d" alt="0 futásidejű függőség"></a>
|
|
16
17
|
<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=28313d&color=c2501a" alt="MIT licenc"></a>
|
|
17
|
-
</p>
|
|
18
|
-
|
|
19
|
-
<p align="center">
|
|
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ó: 92 oldal, magyarul" width="428"></picture></a>
|
|
22
18
|
<br>
|
|
23
|
-
<a href="https://
|
|
24
|
-
<a href="https://
|
|
19
|
+
<a href="https://github.com/futozs/kassza/actions/workflows/ci.yml?query=branch%3Amain"><img src="https://img.shields.io/github/actions/workflow/status/futozs/kassza/ci.yml?branch=main&label=CI&style=flat-square&labelColor=28313d" alt="CI állapota"></a>
|
|
20
|
+
<a href="https://github.com/futozs/kassza/actions/workflows/full-check.yml?query=branch%3Amain"><img src="https://img.shields.io/github/actions/workflow/status/futozs/kassza/full-check.yml?branch=main&label=heti%20teljes%20teszt&style=flat-square&labelColor=28313d" alt="Heti teljes ellenőrzés: CI, XSD, változásfigyelő, élő e2e"></a>
|
|
21
|
+
<a href="https://github.com/futozs/kassza/actions/workflows/release.yml?query=branch%3Amain"><img src="https://img.shields.io/github/actions/workflow/status/futozs/kassza/release.yml?branch=main&label=kiad%C3%A1s&style=flat-square&labelColor=28313d" alt="Kiadás állapota"></a>
|
|
22
|
+
<a href="https://scorecard.dev/viewer/?uri=github.com/futozs/kassza"><img src="https://img.shields.io/ossf-scorecard/github.com/futozs/kassza?label=OpenSSF%20Scorecard&style=flat-square&labelColor=28313d" alt="OpenSSF Scorecard pontszám"></a>
|
|
23
|
+
<br>
|
|
24
|
+
<a href="https://github.com/futozs/kassza/actions/workflows/badges.yml"><img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffutozs%2Fkassza%2Fbadges%2Fcoverage-lines.json&style=flat-square&labelColor=28313d" alt="Sor-lefedettség"></a>
|
|
25
|
+
<a href="https://github.com/futozs/kassza/actions/workflows/badges.yml"><img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffutozs%2Fkassza%2Fbadges%2Fcoverage-branches.json&style=flat-square&labelColor=28313d" alt="Ág-lefedettség"></a>
|
|
26
|
+
<a href="https://github.com/futozs/kassza/actions/workflows/badges.yml"><img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffutozs%2Fkassza%2Fbadges%2Fcoverage-functions.json&style=flat-square&labelColor=28313d" alt="Függvény-lefedettség"></a>
|
|
27
|
+
<a href="https://github.com/futozs/kassza/actions/workflows/badges.yml"><img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffutozs%2Fkassza%2Fbadges%2Fcoverage-statements.json&style=flat-square&labelColor=28313d" alt="Utasítás-lefedettség"></a>
|
|
25
28
|
</p>
|
|
26
29
|
|
|
27
30
|
```bash
|
|
@@ -56,7 +59,9 @@ Ennyi. A kerekítést, a magyar dátumot, az XML-t, a session cookie-t és a hib
|
|
|
56
59
|
|
|
57
60
|
- **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
61
|
- **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
|
|
62
|
+
- **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.
|
|
63
|
+
- **Fizetésből bizonylat.** Stripe, SimplePay, Barion, Revolut és PayPal webhookból pontosan egyszer nyugta vagy számla, visszatérítéskor sztornó.
|
|
64
|
+
- **NAV nyugta-adatszolgáltatás.** Napi összesítő és egyeztetés a 2026. szeptember 1-jétől kötelező adatszolgáltatáshoz.
|
|
60
65
|
- **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
66
|
- **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
67
|
|
|
@@ -88,13 +93,14 @@ Ennyi. A kerekítést, a magyar dátumot, az XML-t, a session cookie-t és a hib
|
|
|
88
93
|
|
|
89
94
|
## Tartalom
|
|
90
95
|
|
|
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) | | |
|
|
96
|
+
| Kezdés | Műveletek | Integrációk | Kiegészítők |
|
|
97
|
+
| --- | --- | --- | --- |
|
|
98
|
+
| 🌐 [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) |
|
|
99
|
+
| ⚙️ [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) |
|
|
100
|
+
| 🚨 [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) |
|
|
101
|
+
| 🎛️ [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) |
|
|
102
|
+
| 🤖 [AI-val kódolsz?](#ai-val-kódolsz) | 🔁 [Tömeges számlázás](#tömeges-és-ismétlődő-számlázás) | 🟩 [Node.js és Express](#nodejs-és-express) | 💻 [Parancssor és MCP szerver](#parancssor-és-mcp-szerver) |
|
|
103
|
+
| | | 📒 [Bizonylatnapló](#bizonylatnapló) | 📈 [Megfigyelhetőség](#megfigyelhetőség) |
|
|
98
104
|
|
|
99
105
|
## Weboldal, sandbox és receptek
|
|
100
106
|
|
|
@@ -104,8 +110,8 @@ A teljes magyar dokumentáció, a sandbox és a receptek a **[kasszajs.hu](https
|
|
|
104
110
|
<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
111
|
</p>
|
|
106
112
|
|
|
107
|
-
- 📖 **[Dokumentáció](https://kasszajs.hu/docs)**:
|
|
108
|
-
- ▶️ **[Sandbox](https://kasszajs.hu/sandbox)**:
|
|
113
|
+
- 📖 **[Dokumentáció](https://kasszajs.hu/docs)**: 188 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.
|
|
114
|
+
- ▶️ **[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
115
|
- 🍳 **[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
116
|
- 🤖 **[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
117
|
- 📦 **[npm csomag](https://www.npmjs.com/package/kassza)** · 🏛️ **[Hivatalos Számlázz.hu Agent dokumentáció](https://docs.szamlazz.hu/hu/agent/)**
|
|
@@ -118,7 +124,7 @@ A teljes magyar dokumentáció, a sandbox és a receptek a **[kasszajs.hu](https
|
|
|
118
124
|
- **[Stripe webhook](https://kasszajs.hu/docs/receptek/stripe-webhook)**: Számla a Stripe Checkout checkout.session.completed eseményéből.
|
|
119
125
|
- **[Nevezés díjbekérővel](https://kasszajs.hu/docs/receptek/nevezes-dijbekerovel)**: Versenynevezés vagy rendezvényjelentkezés átutalásos fizetéssel.
|
|
120
126
|
- **[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
|
|
127
|
+
- **[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
128
|
- **[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
129
|
- **[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
130
|
- **[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 +134,11 @@ A teljes magyar dokumentáció, a sandbox és a receptek a **[kasszajs.hu](https
|
|
|
128
134
|
</details>
|
|
129
135
|
|
|
130
136
|
<details>
|
|
131
|
-
<summary>▶️ <b>Mind a
|
|
137
|
+
<summary>▶️ <b>Mind a 28 sandbox példa</b></summary>
|
|
132
138
|
|
|
133
139
|
**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
140
|
|
|
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)
|
|
141
|
+
**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
142
|
|
|
137
143
|
**NAV:** [Adószám lekérdezése](https://kasszajs.hu/sandbox?pelda=adoszam)
|
|
138
144
|
|
|
@@ -207,7 +213,7 @@ const szamla = await kassza.invoices.create({
|
|
|
207
213
|
city: 'Budapest',
|
|
208
214
|
address: 'Fő utca 1.',
|
|
209
215
|
email: 'vevo@ceg.hu',
|
|
210
|
-
taxNumber: '
|
|
216
|
+
taxNumber: '12345676-2-42',
|
|
211
217
|
},
|
|
212
218
|
items: [
|
|
213
219
|
{ name: 'Póló', quantity: 2, grossUnitPrice: 5_990, vat: 27 },
|
|
@@ -419,6 +425,8 @@ await kassza.invoices.clearPayments('E-WEB-2026-12')
|
|
|
419
425
|
|
|
420
426
|
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.
|
|
421
427
|
|
|
428
|
+
Ha ugyanaz a befizetés több helyről is érkezhet (banki értesítés, webhook), a `registerPaymentOnce({ invoiceNumber, key, amount })` egy stabil kulccsal pontosan egyszer rögzíti: a kulcsot jelölőként a befizetés leírásába teszi, és rögzítés előtt megkeresi.
|
|
429
|
+
|
|
422
430
|
📖 **Dokumentáció:** [Befizetés rögzítése](https://kasszajs.hu/docs/befizetes-rogzitese) · ▶️ **Sandbox:** [Befizetések rögzítése](https://kasszajs.hu/sandbox?pelda=befizetes)
|
|
423
431
|
|
|
424
432
|
</details>
|
|
@@ -466,7 +474,7 @@ A `find` `null`-t ad, ha nincs ilyen számla, a `get` ilyenkor hibát dob.
|
|
|
466
474
|
|
|
467
475
|
## Nyugták
|
|
468
476
|
|
|
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.
|
|
477
|
+
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
478
|
|
|
471
479
|
<details>
|
|
472
480
|
<summary><b>Nyugta</b> · <code>receipts.create()</code></summary>
|
|
@@ -527,6 +535,33 @@ await kassza.receipts.reverse(nyugta.number)
|
|
|
527
535
|
|
|
528
536
|
</details>
|
|
529
537
|
|
|
538
|
+
<details>
|
|
539
|
+
<summary><b>Nyugta vagy számla?</b> · <code>chooseDocument()</code>, <code>receipts.convertToInvoice()</code></summary>
|
|
540
|
+
|
|
541
|
+
```ts
|
|
542
|
+
import { chooseDocument } from 'kassza'
|
|
543
|
+
|
|
544
|
+
const dontes = chooseDocument({ grossTotal: 18_990, invoiceRequested: false })
|
|
545
|
+
|
|
546
|
+
dontes.type
|
|
547
|
+
dontes.reasons
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
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:
|
|
551
|
+
|
|
552
|
+
```ts
|
|
553
|
+
const atalakitas = await kassza.receipts.convertToInvoice({
|
|
554
|
+
receiptNumber: nyugta.number,
|
|
555
|
+
buyer: { name: 'Példa Kft.', zip: '1111', city: 'Budapest', address: 'Fő utca 1.', taxNumber: '12345676-2-42' },
|
|
556
|
+
})
|
|
557
|
+
|
|
558
|
+
atalakitas.invoice.number
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
📖 **Dokumentáció:** [Nyugta vagy számla?](https://kasszajs.hu/docs/alapok/nyugta-vagy-szamla)
|
|
562
|
+
|
|
563
|
+
</details>
|
|
564
|
+
|
|
530
565
|
<p>
|
|
531
566
|
<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
567
|
<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>
|
|
@@ -550,7 +585,7 @@ if (ceg.valid) {
|
|
|
550
585
|
}
|
|
551
586
|
```
|
|
552
587
|
|
|
553
|
-
A cégadatok a NAV-tól jönnek, a cím formázva, például `1031 Budapest, Záhony utca 7.`
|
|
588
|
+
A cégadatok a NAV-tól jönnek, a cím formázva, például `1031 Budapest, Záhony utca 7.` Űrlapokhoz a `taxpayerCache: { store }` beállítás közös tárolóban megjegyzi az eredményt, így ugyanaz az adószám csak egyszer megy ki.
|
|
554
589
|
|
|
555
590
|
📖 **Dokumentáció:** [Adószám lekérdezés](https://kasszajs.hu/docs/adoszam-lekerdezes) · ▶️ **Sandbox:** [Adószám lekérdezése](https://kasszajs.hu/sandbox?pelda=adoszam)
|
|
556
591
|
|
|
@@ -601,12 +636,45 @@ try {
|
|
|
601
636
|
| `not_found` | Nincs ilyen bizonylat |
|
|
602
637
|
| `auth` / `account` | Rossz kulcs, lejárt előfizetés |
|
|
603
638
|
| `network` / `timeout` / `maintenance` | Átmeneti hiba |
|
|
639
|
+
| `rate_limit` | A tesztfiókban túl sok bizonylat készült rövid idő alatt (167) |
|
|
640
|
+
| `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 |
|
|
641
|
+
| `in_progress` | Egy másik folyamat éppen ugyanezt a bizonylatot állítja ki (a `createOnce` zárja) |
|
|
642
|
+
| `store_unavailable` | Egy kötelezőnek beállított tároló (zár, napló) nem érhető el, a kérés el sem ment |
|
|
643
|
+
|
|
644
|
+
Minden ismert hibakódnak saját oldala van; a hiba `docsUrl` mezője oda mutat, így a naplóból egy kattintás.
|
|
604
645
|
|
|
605
646
|
📖 **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
647
|
|
|
607
648
|
</details>
|
|
608
649
|
|
|
609
|
-
>
|
|
650
|
+
<details>
|
|
651
|
+
<summary><b>Pontosan egyszer</b> · <code>invoices.createOnce()</code>, <code>receipts.createOnce()</code></summary>
|
|
652
|
+
|
|
653
|
+
```ts
|
|
654
|
+
const { number, created } = await kassza.invoices.createOnce({
|
|
655
|
+
orderNumber: 'REND-1001',
|
|
656
|
+
paid: true,
|
|
657
|
+
buyer,
|
|
658
|
+
items,
|
|
659
|
+
})
|
|
660
|
+
```
|
|
661
|
+
|
|
662
|
+
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. Az egyszerre érkező, azonos rendelésre szóló hívásokat a kassza összevonja; több szerver vagy serverless példány között a `createOnceLock` közös tároló zárja véd a dupla számla ellen:
|
|
663
|
+
|
|
664
|
+
```ts
|
|
665
|
+
import { upstashRedisStore } from 'kassza/stores'
|
|
666
|
+
|
|
667
|
+
const store = upstashRedisStore(Redis.fromEnv())
|
|
668
|
+
const kassza = createKassza({ cookieStore: store, attemptLedger: store, createOnceLock: store })
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
Az `attemptLedger` a folyamatok között is betartja az öt próbálkozásos korlátot, atomikus számlálóval.
|
|
672
|
+
|
|
673
|
+
📖 **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)
|
|
674
|
+
|
|
675
|
+
</details>
|
|
676
|
+
|
|
677
|
+
> **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
678
|
|
|
611
679
|
<p>
|
|
612
680
|
<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 +728,168 @@ Az `x-forwarded-for` fejlécből a **jobb szélső** címet vizsgálja, vagyis a
|
|
|
660
728
|
<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
729
|
</p>
|
|
662
730
|
|
|
731
|
+
## Fizetésből bizonylat
|
|
732
|
+
|
|
733
|
+
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.
|
|
734
|
+
|
|
735
|
+
<details>
|
|
736
|
+
<summary><b>Stripe webhook</b> · <code>stripeWebhook()</code>, <code>issueForPayment()</code></summary>
|
|
737
|
+
|
|
738
|
+
```ts
|
|
739
|
+
import { stripeWebhook } from 'kassza/payments/stripe'
|
|
740
|
+
|
|
741
|
+
export const POST = stripeWebhook({
|
|
742
|
+
secret: process.env.STRIPE_WEBHOOK_SECRET!,
|
|
743
|
+
apiKey: process.env.STRIPE_SECRET_KEY,
|
|
744
|
+
onPayment: (payment) => kassza.issueForPayment(payment, { vat: 27 }),
|
|
745
|
+
})
|
|
746
|
+
```
|
|
747
|
+
|
|
748
|
+
- Az újraküldött webhook nem állít ki második bizonylatot; a `dedupe: store` opcióval a már feldolgozott eseményt a Számla Agent hívása nélkül nyugtázza.
|
|
749
|
+
- Teljes visszatérítéskor a kassza sztornózza a bizonylatot.
|
|
750
|
+
- Részleges visszatérítéskor számlánál visszatérítésenként egy helyesbítő számlát állít ki, a visszatérített összeget tételenként pontosan szétosztva; több áfakulcsnál és nyugtánál javaslatot ad.
|
|
751
|
+
- Ugyanígy működik a `simplePayWebhook`, a `barionWebhook`, a `revolutWebhook` és a `payPalWebhook`.
|
|
752
|
+
|
|
753
|
+
📖 **Dokumentáció:** [Fizetésből bizonylat](https://kasszajs.hu/docs/fizetesek)
|
|
754
|
+
|
|
755
|
+
</details>
|
|
756
|
+
|
|
757
|
+
<p>
|
|
758
|
+
<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>
|
|
759
|
+
<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>
|
|
760
|
+
</p>
|
|
761
|
+
|
|
762
|
+
## NAV nyugta-adatszolgáltatás
|
|
763
|
+
|
|
764
|
+
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.
|
|
765
|
+
|
|
766
|
+
<details>
|
|
767
|
+
<summary><b>Napi összesítő és egyeztetés</b> · <code>navDailyReports()</code>, <code>reconcileNavReports()</code></summary>
|
|
768
|
+
|
|
769
|
+
```ts
|
|
770
|
+
import { createNavReceiptClient, reconcileNavReports } from 'kassza/nav'
|
|
771
|
+
import { navDailyReports } from 'kassza/reports'
|
|
772
|
+
|
|
773
|
+
const nav = createNavReceiptClient({
|
|
774
|
+
environment: 'production',
|
|
775
|
+
login: process.env.NAV_LOGIN!,
|
|
776
|
+
password: process.env.NAV_PASSWORD!,
|
|
777
|
+
signatureKey: process.env.NAV_SIGNATURE_KEY!,
|
|
778
|
+
taxNumber: process.env.NAV_TAX_NUMBER!,
|
|
779
|
+
})
|
|
780
|
+
|
|
781
|
+
const helyi = navDailyReports(nyugtak)
|
|
782
|
+
const nalNav = await nav.listAllReports({ from: '2026-09-01', to: '2026-09-30' })
|
|
783
|
+
const { missing, mismatched } = reconcileNavReports(helyi, nalNav)
|
|
784
|
+
```
|
|
785
|
+
|
|
786
|
+
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()`).
|
|
787
|
+
|
|
788
|
+
📖 **Dokumentáció:** [NAV nyugta-adatszolgáltatás](https://kasszajs.hu/docs/nav-nyugta)
|
|
789
|
+
|
|
790
|
+
</details>
|
|
791
|
+
|
|
792
|
+
<p>
|
|
793
|
+
<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>
|
|
794
|
+
</p>
|
|
795
|
+
|
|
796
|
+
## Bizonylatnapló
|
|
797
|
+
|
|
798
|
+
A NAV napi összesítő és a napi zárás a saját nyilvántartásodból számol, mert a Számla Agent nem listáz nyugtákat dátum szerint. A `kassza/journal` ezt a nyilvántartást adja.
|
|
799
|
+
|
|
800
|
+
<details>
|
|
801
|
+
<summary><b>Napló a NAV összesítőhöz</b> · <code>createJournal()</code>, <code>kvJournal()</code></summary>
|
|
802
|
+
|
|
803
|
+
```ts
|
|
804
|
+
import { createJournal, kvJournal } from 'kassza/journal'
|
|
805
|
+
import { navDailyReports } from 'kassza/reports'
|
|
806
|
+
|
|
807
|
+
const journal = createJournal(kvJournal(store))
|
|
808
|
+
const kassza = createKassza({
|
|
809
|
+
hooks: { onDocument: (event) => journal.record(event), onDocumentError: 'throw' },
|
|
810
|
+
})
|
|
811
|
+
|
|
812
|
+
const jelentesek = navDailyReports(await journal.receipts({ from: '2026-10-01', to: '2026-10-31' }))
|
|
813
|
+
```
|
|
814
|
+
|
|
815
|
+
- A `trackReceipt()` és a `trackInvoice()` a kiállítás előtt befejezetlen tételt rögzít; ha a folyamat közben leáll, a `settle()` később visszakeresi és lezárja.
|
|
816
|
+
- A `reconcile()` az adatkapcsolat napi nyugtaarchívumával egyeztet, és pótolja a hiányzó tételeket.
|
|
817
|
+
|
|
818
|
+
📖 **Dokumentáció:** [Bizonylatnapló](https://kasszajs.hu/docs/kiegeszitok/bizonylatnaplo)
|
|
819
|
+
|
|
820
|
+
</details>
|
|
821
|
+
|
|
822
|
+
<p>
|
|
823
|
+
<a href="https://kasszajs.hu/docs/nav-nyugta/hatarido"><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 teendő december 31. előtt?" height="44"></picture></a>
|
|
824
|
+
</p>
|
|
825
|
+
|
|
826
|
+
## Megbízotti számlázás
|
|
827
|
+
|
|
828
|
+
Platformoknak, amelyek sok cég nevében állítanak ki bizonylatot, a cégek saját Számlázz.hu fiókjában.
|
|
829
|
+
|
|
830
|
+
<details>
|
|
831
|
+
<summary><b>Csatlakozás és kliens megbízónként</b> · <code>connectPrincipal()</code>, <code>createKasszaPool()</code></summary>
|
|
832
|
+
|
|
833
|
+
```ts
|
|
834
|
+
import { connectPrincipal, createKasszaPool } from 'kassza/delegation'
|
|
835
|
+
|
|
836
|
+
const { status } = await connectPrincipal({
|
|
837
|
+
principal: {
|
|
838
|
+
name: 'Példa Kft.',
|
|
839
|
+
taxNumber: '12345676-2-42',
|
|
840
|
+
invoicePrefix: 'PLDA',
|
|
841
|
+
zip: '1111',
|
|
842
|
+
city: 'Budapest',
|
|
843
|
+
address: 'Fő utca 1.',
|
|
844
|
+
email: 'penzugy@pelda.hu',
|
|
845
|
+
},
|
|
846
|
+
user: { email: 'kassza+pelda@platform.hu', password: process.env.DELEGATE_PASSWORD!, firstName: 'Platform' },
|
|
847
|
+
})
|
|
848
|
+
|
|
849
|
+
const pool = createKasszaPool({ resolve: (megbizoId) => megbizoAdatai(megbizoId) })
|
|
850
|
+
const kliens = await pool.get('pelda')
|
|
851
|
+
await kliens.invoices.createOnce({ orderNumber: 'FOGLALAS-881', buyer, items })
|
|
852
|
+
```
|
|
853
|
+
|
|
854
|
+
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.
|
|
855
|
+
|
|
856
|
+
📖 **Dokumentáció:** [Megbízotti számlázás](https://kasszajs.hu/docs/megbizott-szamlazas)
|
|
857
|
+
|
|
858
|
+
</details>
|
|
859
|
+
|
|
860
|
+
<p>
|
|
861
|
+
<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>
|
|
862
|
+
</p>
|
|
863
|
+
|
|
864
|
+
## Pénzügyi adatkapcsolat
|
|
865
|
+
|
|
866
|
+
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.
|
|
867
|
+
|
|
868
|
+
<details>
|
|
869
|
+
<summary><b>Fogadó végpont</b> · <code>dataLinkHandler()</code></summary>
|
|
870
|
+
|
|
871
|
+
```ts
|
|
872
|
+
import { dataLinkHandler } from 'kassza/data-link'
|
|
873
|
+
|
|
874
|
+
export const POST = dataLinkHandler({
|
|
875
|
+
verifyKey: async (kulcs) => (await ugyfelKulcsai()).includes(kulcs),
|
|
876
|
+
onPush: async (push) => {
|
|
877
|
+
const iktatoszam = await bizonylatMentese(push)
|
|
878
|
+
return { registrationNumber: iktatoszam }
|
|
879
|
+
},
|
|
880
|
+
})
|
|
881
|
+
```
|
|
882
|
+
|
|
883
|
+
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.
|
|
884
|
+
|
|
885
|
+
📖 **Dokumentáció:** [Pénzügyi adatkapcsolat](https://kasszajs.hu/docs/adatkapcsolat)
|
|
886
|
+
|
|
887
|
+
</details>
|
|
888
|
+
|
|
889
|
+
<p>
|
|
890
|
+
<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>
|
|
891
|
+
</p>
|
|
892
|
+
|
|
663
893
|
## PDF mentése tárhelyre
|
|
664
894
|
|
|
665
895
|
S3, Cloudflare R2, MinIO vagy Backblaze esetén nem kell az AWS SDK.
|
|
@@ -716,13 +946,13 @@ További adapterek: `s3Storage` (AWS SDK), `r2BindingStorage`, `vercelBlobStorag
|
|
|
716
946
|
A session cookie újrahasznosítása gyorsítja a hívásokat. Serverless környezetben tedd közös tárolóba.
|
|
717
947
|
|
|
718
948
|
<details>
|
|
719
|
-
<summary><b>Upstash Redis</b> · <code>
|
|
949
|
+
<summary><b>Upstash Redis</b> · <code>upstashRedisStore()</code></summary>
|
|
720
950
|
|
|
721
951
|
```ts
|
|
722
952
|
import { Redis } from '@upstash/redis'
|
|
723
|
-
import {
|
|
953
|
+
import { upstashRedisStore } from 'kassza/stores'
|
|
724
954
|
|
|
725
|
-
const kassza = createKassza({ cookieStore:
|
|
955
|
+
const kassza = createKassza({ cookieStore: upstashRedisStore(Redis.fromEnv()) })
|
|
726
956
|
```
|
|
727
957
|
|
|
728
958
|
📖 **Dokumentáció:** [Munkamenet (session cookie)](https://kasszajs.hu/docs/alapok/munkamenet) · ▶️ **Sandbox:** [Közös session több kliens között](https://kasszajs.hu/sandbox?pelda=munkamenet)
|
|
@@ -730,19 +960,23 @@ const kassza = createKassza({ cookieStore: upstashRedisCookieStore(Redis.fromEnv
|
|
|
730
960
|
</details>
|
|
731
961
|
|
|
732
962
|
<details>
|
|
733
|
-
<summary><b>Cloudflare Workers</b> · <code>
|
|
963
|
+
<summary><b>Cloudflare Workers</b> · <code>cloudflareKvStore()</code>, <code>durableObjectStore()</code></summary>
|
|
734
964
|
|
|
735
965
|
```ts
|
|
736
|
-
import {
|
|
966
|
+
import { cloudflareKvStore } from 'kassza/stores'
|
|
737
967
|
|
|
738
|
-
const kassza = createKassza({ agentKey: env.SZAMLAZZ_AGENT_KEY, cookieStore:
|
|
968
|
+
const kassza = createKassza({ agentKey: env.SZAMLAZZ_AGENT_KEY, cookieStore: cloudflareKvStore(env.KASSZA_KV) })
|
|
739
969
|
```
|
|
740
970
|
|
|
971
|
+
A KV munkamenetnek jó, de nincs benne atomikus írás: a `createOnce` zárjához és a naplóhoz Workers alatt a `durableObjectStore()` kell.
|
|
972
|
+
|
|
741
973
|
📖 **Dokumentáció:** [Serverless és edge](https://kasszajs.hu/docs/kiegeszitok/serverless-es-edge)
|
|
742
974
|
|
|
743
975
|
</details>
|
|
744
976
|
|
|
745
|
-
Van még `
|
|
977
|
+
Van még `ioredisStore`, `nodeRedisStore` és `customStore` is (a régi `kassza/cookie-stores` nevek is működnek). A `diagnoseStore(store)` megmondja, mire alkalmas egy tároló. Ha a tároló elérhetetlen, a számlázás attól még működik.
|
|
978
|
+
|
|
979
|
+
A csomag minden futtatókörnyezetben ugyanazt adja: a CI a buildelt csomagot Node.js, Bun, Deno és Cloudflare workerd alatt is lefuttatja.
|
|
746
980
|
|
|
747
981
|
<p>
|
|
748
982
|
<a href="https://kasszajs.hu/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>
|
|
@@ -781,6 +1015,28 @@ test('hálózati hibánál nem számláz kétszer', async () => {
|
|
|
781
1015
|
|
|
782
1016
|
</details>
|
|
783
1017
|
|
|
1018
|
+
<details>
|
|
1019
|
+
<summary><b>Hamis Számla Agent</b> · <code>createFakeAgentFetch()</code></summary>
|
|
1020
|
+
|
|
1021
|
+
```ts
|
|
1022
|
+
import { createFakeAgentFetch } from 'kassza/testing'
|
|
1023
|
+
|
|
1024
|
+
const agent = createFakeAgentFetch()
|
|
1025
|
+
const kassza = createKassza({ agentKey: 'teszt-kulcs', fetch: agent.fetch, retryDelayMs: 0 })
|
|
1026
|
+
|
|
1027
|
+
agent.fail('ghostSuccess', { action: 'createInvoice' })
|
|
1028
|
+
const eredmeny = await kassza.invoices.createOnce({ orderNumber: 'WEB-1', buyer, items })
|
|
1029
|
+
|
|
1030
|
+
eredmeny.created
|
|
1031
|
+
agent.invoices.size
|
|
1032
|
+
```
|
|
1033
|
+
|
|
1034
|
+
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.
|
|
1035
|
+
|
|
1036
|
+
📖 **Dokumentáció:** [Hamis Számla Agent](https://kasszajs.hu/docs/kiegeszitok/hamis-agent)
|
|
1037
|
+
|
|
1038
|
+
</details>
|
|
1039
|
+
|
|
784
1040
|
<p>
|
|
785
1041
|
<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
1042
|
<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 +1130,142 @@ await kassza.resetSession()
|
|
|
874
1130
|
|
|
875
1131
|
</details>
|
|
876
1132
|
|
|
1133
|
+
<details>
|
|
1134
|
+
<summary><b>Bizonylat-események és karbantartási szünet</b> · <code>onDocument</code>, <code>maintenanceCooldownMs</code></summary>
|
|
1135
|
+
|
|
1136
|
+
```ts
|
|
1137
|
+
const kassza = createKassza({
|
|
1138
|
+
maintenanceCooldownMs: 60_000,
|
|
1139
|
+
hooks: {
|
|
1140
|
+
onDocument: async (esemeny) => {
|
|
1141
|
+
await auditNaplo(esemeny.kind, esemeny.action, esemeny.number)
|
|
1142
|
+
},
|
|
1143
|
+
},
|
|
1144
|
+
})
|
|
1145
|
+
```
|
|
1146
|
+
|
|
1147
|
+
- 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; az `onDocumentError: 'throw'` beállítással ilyenkor `DocumentHookError` jön, benne a bizonylattal.
|
|
1148
|
+
- Az `onWarning` megkapja a korábban csendben elnyelt hibákat (tároló, hook, zár).
|
|
1149
|
+
- 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.
|
|
1150
|
+
|
|
1151
|
+
📖 **Dokumentáció:** [Pontosan egyszer](https://kasszajs.hu/docs/alapok/pontosan-egyszer)
|
|
1152
|
+
|
|
1153
|
+
</details>
|
|
1154
|
+
|
|
877
1155
|
<p>
|
|
878
1156
|
<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
1157
|
<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
1158
|
</p>
|
|
881
1159
|
|
|
1160
|
+
## Megfigyelhetőség
|
|
1161
|
+
|
|
1162
|
+
A kassza nem küld haza semmit. A saját rendszeredben a `kassza/observe` ad strukturált naplót, OpenTelemetry-kompatibilis tracinget és Prometheus metrikákat, függőség nélkül és titokmentesen.
|
|
1163
|
+
|
|
1164
|
+
<details>
|
|
1165
|
+
<summary><b>Napló, tracing, metrikák</b> · <code>observe()</code>, <code>createMetricsRegistry()</code></summary>
|
|
1166
|
+
|
|
1167
|
+
```ts
|
|
1168
|
+
import { combineHooks, createMetricsRegistry, observe } from 'kassza/observe'
|
|
1169
|
+
|
|
1170
|
+
const metrics = createMetricsRegistry()
|
|
1171
|
+
const kassza = createKassza({ hooks: combineHooks(observe({ logger: console, metrics }), sajatHookok) })
|
|
1172
|
+
|
|
1173
|
+
metrics.renderPrometheus()
|
|
1174
|
+
```
|
|
1175
|
+
|
|
1176
|
+
📖 **Dokumentáció:** [Megfigyelhetőség](https://kasszajs.hu/docs/kiegeszitok/megfigyelhetoseg)
|
|
1177
|
+
|
|
1178
|
+
</details>
|
|
1179
|
+
|
|
1180
|
+
## Tömeges és ismétlődő számlázás
|
|
1181
|
+
|
|
1182
|
+
Havidíj, tagdíj, bérleti díj: a `kassza/batch` idempotens kulcsokkal, sebességkorláttal és próbafuttatással állítja ki a bizonylatokat, és a Számlázz.hu korlátjánál megáll.
|
|
1183
|
+
|
|
1184
|
+
<details>
|
|
1185
|
+
<summary><b>Havi számlázás</b> · <code>runBatch()</code>, <code>billingPeriodAt()</code></summary>
|
|
1186
|
+
|
|
1187
|
+
```ts
|
|
1188
|
+
import { billingPeriodAt, runBatch } from 'kassza/batch'
|
|
1189
|
+
|
|
1190
|
+
const idoszak = billingPeriodAt({ interval: 'month', anchor: '2026-01-31' }, new Date())
|
|
1191
|
+
const eredmeny = await runBatch(kassza, {
|
|
1192
|
+
items: elofizetesek.map((elofizetes) => ({
|
|
1193
|
+
key: `SUB-${elofizetes.id}-${idoszak.start}`,
|
|
1194
|
+
document: () => ({ kind: 'invoice', input: szamlaElofizetesbol(elofizetes, idoszak) }),
|
|
1195
|
+
})),
|
|
1196
|
+
dryRun: false,
|
|
1197
|
+
})
|
|
1198
|
+
```
|
|
1199
|
+
|
|
1200
|
+
Egy megszakadt futás újraindítva nem állít ki duplát. A hónap végi kezdőnapot csúszás nélkül kezeli.
|
|
1201
|
+
|
|
1202
|
+
📖 **Dokumentáció:** [Tömeges és ismétlődő számlázás](https://kasszajs.hu/docs/kiegeszitok/tomeges-szamlazas)
|
|
1203
|
+
|
|
1204
|
+
</details>
|
|
1205
|
+
|
|
1206
|
+
## Node.js és Express
|
|
1207
|
+
|
|
1208
|
+
A webhook-kezelők Web-szabványos `(Request) => Response` függvények. Express, NestJS és Fastify alá a `kassza/node` köti be őket, a nyers törzs (aláírás!) megőrzésével.
|
|
1209
|
+
|
|
1210
|
+
<details>
|
|
1211
|
+
<summary><b>Express</b> · <code>toNodeHandler()</code></summary>
|
|
1212
|
+
|
|
1213
|
+
```ts
|
|
1214
|
+
import { toNodeHandler } from 'kassza/node'
|
|
1215
|
+
import { stripeWebhook } from 'kassza/payments/stripe'
|
|
1216
|
+
|
|
1217
|
+
app.post('/webhooks/stripe', toNodeHandler(stripeWebhook({ secret, onPayment })))
|
|
1218
|
+
app.use(express.json())
|
|
1219
|
+
```
|
|
1220
|
+
|
|
1221
|
+
A webhook útvonal az `express.json()` elé kerüljön; ha egy middleware már feldolgozta a törzset, a kassza érthető hibát ad.
|
|
1222
|
+
|
|
1223
|
+
📖 **Dokumentáció:** [Node.js, Express, NestJS](https://kasszajs.hu/docs/kiegeszitok/node-express)
|
|
1224
|
+
|
|
1225
|
+
</details>
|
|
1226
|
+
|
|
1227
|
+
## Parancssor és MCP szerver
|
|
1228
|
+
|
|
1229
|
+
<details>
|
|
1230
|
+
<summary><b>Parancssor</b> · <code>npx kassza</code></summary>
|
|
1231
|
+
|
|
1232
|
+
```bash
|
|
1233
|
+
npx kassza doctor
|
|
1234
|
+
npx kassza xml preview szamla.json
|
|
1235
|
+
npx kassza invoice get --order REND-1001
|
|
1236
|
+
```
|
|
1237
|
+
|
|
1238
|
+
A `doctor` ellenőrzi a Node.js-t, az Agent kulcsot, a gép óráját és a munkamenetet; a `--capabilities` az e-számla engedélyt, a `--report` titokmentes Markdown jelentést ad hibajegyhez. Az `xml preview` kiírja a küldendő XML-t az Agent kulcs nélkül, így supportjegyhez is csatolható.
|
|
1239
|
+
|
|
1240
|
+
📖 **Dokumentáció:** [Parancssor](https://kasszajs.hu/docs/kiegeszitok/parancssor)
|
|
1241
|
+
|
|
1242
|
+
</details>
|
|
1243
|
+
|
|
1244
|
+
<details>
|
|
1245
|
+
<summary><b>MCP szerver</b> · <code>npx kassza mcp</code></summary>
|
|
1246
|
+
|
|
1247
|
+
```json
|
|
1248
|
+
{
|
|
1249
|
+
"mcpServers": {
|
|
1250
|
+
"kassza": {
|
|
1251
|
+
"command": "npx",
|
|
1252
|
+
"args": ["-y", "kassza", "mcp"],
|
|
1253
|
+
"env": { "SZAMLAZZ_AGENT_KEY": "..." }
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1257
|
+
```
|
|
1258
|
+
|
|
1259
|
+
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.
|
|
1260
|
+
|
|
1261
|
+
📖 **Dokumentáció:** [MCP szerver](https://kasszajs.hu/docs/kiegeszitok/mcp-szerver)
|
|
1262
|
+
|
|
1263
|
+
</details>
|
|
1264
|
+
|
|
1265
|
+
<p>
|
|
1266
|
+
<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>
|
|
1267
|
+
</p>
|
|
1268
|
+
|
|
882
1269
|
## AI-val kódolsz?
|
|
883
1270
|
|
|
884
1271
|
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:
|
|
@@ -893,6 +1280,14 @@ A weboldal is AI-barát: az [llms.txt](https://kasszajs.hu/llms.txt) a dokument
|
|
|
893
1280
|
<a href="https://kasszajs.hu/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>
|
|
894
1281
|
</p>
|
|
895
1282
|
|
|
1283
|
+
## Ki használja?
|
|
1284
|
+
|
|
1285
|
+
A kassza nem küld semmilyen használati adatot, ezért csak az derül ki, ki használja, aki maga jelzi. Ha éles vagy kísérleti projektben használod, [írd meg egy issue-ban](https://github.com/futozs/kassza/issues/new?template=used-by.yml), és felkerülsz ide.
|
|
1286
|
+
|
|
1287
|
+
| Projekt | Mire használja |
|
|
1288
|
+
| --- | --- |
|
|
1289
|
+
| _Légy te az első._ | |
|
|
1290
|
+
|
|
896
1291
|
---
|
|
897
1292
|
|
|
898
1293
|
<p align="center">
|