kassza 0.1.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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/agents/README.md +59 -0
  4. package/agents/api.md +206 -0
  5. package/agents/pitfalls.md +52 -0
  6. package/agents/recipes.md +217 -0
  7. package/agents/skills/kassza/SKILL.md +29 -0
  8. package/assets/logo-wordmark.svg +25 -0
  9. package/assets/logo.svg +19 -0
  10. package/dist/binary-B89HM03_.cjs +63 -0
  11. package/dist/binary-D0M9U2MD.js +34 -0
  12. package/dist/client-B9kbKKBf.d.cts +748 -0
  13. package/dist/client-zv4enyq7.d.ts +748 -0
  14. package/dist/cookie-stores/index.cjs +153 -0
  15. package/dist/cookie-stores/index.d.cts +63 -0
  16. package/dist/cookie-stores/index.d.ts +63 -0
  17. package/dist/cookie-stores/index.js +144 -0
  18. package/dist/create-BZd6CUO7.cjs +1160 -0
  19. package/dist/create-DDZaNlOz.js +939 -0
  20. package/dist/dates-D2XebOIg.js +34 -0
  21. package/dist/dates-DtHzwNU6.d.cts +7 -0
  22. package/dist/dates-DtHzwNU6.d.ts +7 -0
  23. package/dist/dates-PPxH0n5H.cjs +57 -0
  24. package/dist/errors-B0QJhUW1.cjs +302 -0
  25. package/dist/errors-DapdV5DK.js +273 -0
  26. package/dist/index-CYAGCdKJ.d.cts +56 -0
  27. package/dist/index-CYAGCdKJ.d.ts +56 -0
  28. package/dist/index.cjs +1406 -0
  29. package/dist/index.d.cts +8 -0
  30. package/dist/index.d.ts +8 -0
  31. package/dist/index.js +1394 -0
  32. package/dist/ipn/index.cjs +108 -0
  33. package/dist/ipn/index.d.cts +32 -0
  34. package/dist/ipn/index.d.ts +32 -0
  35. package/dist/ipn/index.js +101 -0
  36. package/dist/money/index.cjs +15 -0
  37. package/dist/money/index.d.cts +2 -0
  38. package/dist/money/index.d.ts +2 -0
  39. package/dist/money/index.js +2 -0
  40. package/dist/money-C9j7nBNP.js +258 -0
  41. package/dist/money-DkiGukAw.cjs +335 -0
  42. package/dist/session-CRGOuz-R.cjs +100 -0
  43. package/dist/session-Dm_45x8K.d.cts +11 -0
  44. package/dist/session-Dm_45x8K.d.ts +11 -0
  45. package/dist/session-OJMLGufT.js +77 -0
  46. package/dist/shared-CrxlxI8n.cjs +207 -0
  47. package/dist/shared-D6DLa4b7.js +100 -0
  48. package/dist/storage/fs.cjs +88 -0
  49. package/dist/storage/fs.d.cts +13 -0
  50. package/dist/storage/fs.d.ts +13 -0
  51. package/dist/storage/fs.js +87 -0
  52. package/dist/storage/index.cjs +643 -0
  53. package/dist/storage/index.d.cts +288 -0
  54. package/dist/storage/index.d.ts +288 -0
  55. package/dist/storage/index.js +619 -0
  56. package/dist/testing/index.cjs +409 -0
  57. package/dist/testing/index.d.cts +35 -0
  58. package/dist/testing/index.d.ts +35 -0
  59. package/dist/testing/index.js +407 -0
  60. package/dist/types-DVRgwcqg.d.cts +26 -0
  61. package/dist/types-DVRgwcqg.d.ts +26 -0
  62. package/dist/validators/index.cjs +296 -0
  63. package/dist/validators/index.d.cts +51 -0
  64. package/dist/validators/index.d.ts +51 -0
  65. package/dist/validators/index.js +278 -0
  66. package/llms.txt +16 -0
  67. package/package.json +151 -0
@@ -0,0 +1,34 @@
1
+ //#region src/core/dates.ts
2
+ const budapestDateFormatter = new Intl.DateTimeFormat("en-CA", {
3
+ timeZone: "Europe/Budapest",
4
+ year: "numeric",
5
+ month: "2-digit",
6
+ day: "2-digit"
7
+ });
8
+ function toBudapestDate(date) {
9
+ if (Number.isNaN(date.getTime())) throw new RangeError("Érvénytelen dátum");
10
+ const parts = budapestDateFormatter.formatToParts(date);
11
+ const get = (type) => parts.find((part) => part.type === type)?.value ?? "";
12
+ return `${get("year")}-${get("month")}-${get("day")}`;
13
+ }
14
+ const DAY_IN_MS = 864e5;
15
+ function addBudapestDays(date, days) {
16
+ if (!Number.isInteger(days)) throw new RangeError(`A napok számának egésznek kell lennie, kapott: ${days}`);
17
+ const [year, month, day] = toBudapestDate(date).split("-").map(Number);
18
+ const noonUtc = Date.UTC(year, month - 1, day, 12);
19
+ return new Date(noonUtc + days * DAY_IN_MS).toISOString().slice(0, 10);
20
+ }
21
+ const ISO_DATE = /^(\d{4})-(\d{2})-(\d{2})$/;
22
+ function toAgentDate(input) {
23
+ if (input instanceof Date) return toBudapestDate(input);
24
+ const match = ISO_DATE.exec(input.trim());
25
+ if (!match) throw new RangeError(`A dátumot YYYY-MM-DD formában vagy Date objektumként add meg, kapott: ${input}`);
26
+ const [, year, month, day] = match;
27
+ if (new Date(Date.UTC(Number(year), Number(month) - 1, Number(day))).toISOString().slice(0, 10) !== match[0]) throw new RangeError(`Nem létező naptári dátum: ${input}`);
28
+ return match[0];
29
+ }
30
+ function todayInBudapest(now = /* @__PURE__ */ new Date()) {
31
+ return toBudapestDate(now);
32
+ }
33
+ //#endregion
34
+ export { todayInBudapest as i, toAgentDate as n, toBudapestDate as r, addBudapestDays as t };
@@ -0,0 +1,7 @@
1
+ //#region src/core/dates.d.ts
2
+ declare function toBudapestDate(date: Date): string;
3
+ declare function addBudapestDays(date: Date, days: number): string;
4
+ type DateInput = Date | string;
5
+ declare function todayInBudapest(now?: Date): string;
6
+ //#endregion
7
+ export { todayInBudapest as i, addBudapestDays as n, toBudapestDate as r, DateInput as t };
@@ -0,0 +1,7 @@
1
+ //#region src/core/dates.d.ts
2
+ declare function toBudapestDate(date: Date): string;
3
+ declare function addBudapestDays(date: Date, days: number): string;
4
+ type DateInput = Date | string;
5
+ declare function todayInBudapest(now?: Date): string;
6
+ //#endregion
7
+ export { todayInBudapest as i, addBudapestDays as n, toBudapestDate as r, DateInput as t };
@@ -0,0 +1,57 @@
1
+ //#region src/core/dates.ts
2
+ const budapestDateFormatter = new Intl.DateTimeFormat("en-CA", {
3
+ timeZone: "Europe/Budapest",
4
+ year: "numeric",
5
+ month: "2-digit",
6
+ day: "2-digit"
7
+ });
8
+ function toBudapestDate(date) {
9
+ if (Number.isNaN(date.getTime())) throw new RangeError("Érvénytelen dátum");
10
+ const parts = budapestDateFormatter.formatToParts(date);
11
+ const get = (type) => parts.find((part) => part.type === type)?.value ?? "";
12
+ return `${get("year")}-${get("month")}-${get("day")}`;
13
+ }
14
+ const DAY_IN_MS = 864e5;
15
+ function addBudapestDays(date, days) {
16
+ if (!Number.isInteger(days)) throw new RangeError(`A napok számának egésznek kell lennie, kapott: ${days}`);
17
+ const [year, month, day] = toBudapestDate(date).split("-").map(Number);
18
+ const noonUtc = Date.UTC(year, month - 1, day, 12);
19
+ return new Date(noonUtc + days * DAY_IN_MS).toISOString().slice(0, 10);
20
+ }
21
+ const ISO_DATE = /^(\d{4})-(\d{2})-(\d{2})$/;
22
+ function toAgentDate(input) {
23
+ if (input instanceof Date) return toBudapestDate(input);
24
+ const match = ISO_DATE.exec(input.trim());
25
+ if (!match) throw new RangeError(`A dátumot YYYY-MM-DD formában vagy Date objektumként add meg, kapott: ${input}`);
26
+ const [, year, month, day] = match;
27
+ if (new Date(Date.UTC(Number(year), Number(month) - 1, Number(day))).toISOString().slice(0, 10) !== match[0]) throw new RangeError(`Nem létező naptári dátum: ${input}`);
28
+ return match[0];
29
+ }
30
+ function todayInBudapest(now = /* @__PURE__ */ new Date()) {
31
+ return toBudapestDate(now);
32
+ }
33
+ //#endregion
34
+ Object.defineProperty(exports, "addBudapestDays", {
35
+ enumerable: true,
36
+ get: function() {
37
+ return addBudapestDays;
38
+ }
39
+ });
40
+ Object.defineProperty(exports, "toAgentDate", {
41
+ enumerable: true,
42
+ get: function() {
43
+ return toAgentDate;
44
+ }
45
+ });
46
+ Object.defineProperty(exports, "toBudapestDate", {
47
+ enumerable: true,
48
+ get: function() {
49
+ return toBudapestDate;
50
+ }
51
+ });
52
+ Object.defineProperty(exports, "todayInBudapest", {
53
+ enumerable: true,
54
+ get: function() {
55
+ return todayInBudapest;
56
+ }
57
+ });
@@ -0,0 +1,302 @@
1
+ //#region src/core/errors.ts
2
+ const SIMPLE_ITEMS_HINT = "Az egyszerűsített számlakép (simpleItems) szabályait lásd a docs utazásszervezőknek szóló oldalán.";
3
+ const ITEM_AMOUNT_HINT = "Használd a tételeknél a netUnitPrice vagy grossUnitPrice mezőt, és hagyd, hogy a csomag számolja ki az összegeket.";
4
+ const RECEIPT_AMOUNT_HINT = "Forintos nyugtán a bruttó egész szám, a nettó és az áfa legfeljebb 2 tizedes, és a nettó + áfa pontosan a bruttó.";
5
+ const AGENT_ERROR_CODES = {
6
+ 1: {
7
+ message: "Rendszerkarbantartás, kérem próbálja meg pár perc múlva.",
8
+ category: "maintenance",
9
+ hint: "A Számlázz.hu oldalán van karbantartás, néhány perc múlva próbáld újra."
10
+ },
11
+ 3: {
12
+ message: "Sikertelen bejelentkezés.",
13
+ category: "auth",
14
+ hint: "Ellenőrizd az Agent kulcsot. Csak kisbetűs kulcsot fogad el a rendszer."
15
+ },
16
+ 7: {
17
+ message: "Hiányzó adat: ismeretlen számlaszám, rendelésszám vagy külső azonosító.",
18
+ category: "not_found"
19
+ },
20
+ 49: {
21
+ message: "A tanúsítvány használatához jelszó szükséges.",
22
+ category: "account",
23
+ hint: "Az e-számla tanúsítványához tartozó jelszót a Számlázz.hu felületén kell beállítani."
24
+ },
25
+ 52: {
26
+ message: "Az áfakulcs nem értelmezhető.",
27
+ category: "validation",
28
+ hint: "Használd a VatRate típusban felsorolt áfakulcsok egyikét."
29
+ },
30
+ 53: {
31
+ message: "Hiányzó XML fájl.",
32
+ category: "validation",
33
+ hint: "Az XML-t fájlként kell elküldeni multipart/form-data kérésben."
34
+ },
35
+ 54: {
36
+ message: "E-számla készítés nincs engedélyezve.",
37
+ category: "account",
38
+ hint: "Az előfizetési csomag nem tartalmazza az e-számlát, vagy nincs tanúsítvány. Próbáld eInvoice: false beállítással."
39
+ },
40
+ 55: {
41
+ message: "E-számla aláírása sikertelen.",
42
+ category: "account",
43
+ hint: "A tanúsítvány lejárt, vagy az időbélyeg szerver nem érhető el."
44
+ },
45
+ 56: {
46
+ message: "A bizonylat elkészült, de az értesítő e-mail kiküldése sikertelen.",
47
+ category: "partial_success",
48
+ hint: "NE állítsd ki újra a bizonylatot. Kérdezd le rendelésszám vagy külső azonosító alapján, és küldd ki az e-mailt később."
49
+ },
50
+ 57: {
51
+ message: "XML beolvasási hiba.",
52
+ category: "validation",
53
+ hint: "A küldött XML nem felel meg az XSD-nek. A részleteket a hibaüzenet tartalmazza."
54
+ },
55
+ 71: {
56
+ message: "Már létező rendelésszám.",
57
+ category: "duplicate",
58
+ hint: "A fiókban be van kapcsolva a rendelésszám ismétlődés tiltása. Ez a bizonylat valószínűleg már elkészült."
59
+ },
60
+ 135: {
61
+ message: "Számla Agent futtatásához lépj ki a Számlázz.hu rendszerből a böngészőben.",
62
+ category: "auth"
63
+ },
64
+ 136: {
65
+ message: "Bejelentkezési hiba, lépj be a Számlázz.hu rendszerébe böngészőn keresztül.",
66
+ category: "account",
67
+ hint: "Lejárt előfizetés vagy rendezetlen díj. Ellenőrizd a Szolgáltatáscsomagom menüpontot."
68
+ },
69
+ 152: {
70
+ message: "Már létező rendelésszám.",
71
+ category: "duplicate",
72
+ hint: "A fiókban be van kapcsolva a rendelésszám ismétlődés tiltása. Ez a bizonylat valószínűleg már elkészült."
73
+ },
74
+ 164: {
75
+ message: "A funkciót csak egyetlen fiókhoz hozzáférő felhasználó használhatja.",
76
+ category: "auth",
77
+ hint: "Használj Agent kulcsot felhasználónév és jelszó helyett."
78
+ },
79
+ 202: {
80
+ message: "A megadott számlaszám előtag nem megfelelő.",
81
+ category: "validation",
82
+ hint: "Csak a Beállítások / Előtagok menüpontban rögzített előtag használható."
83
+ },
84
+ 250: {
85
+ message: "A meghatalmazás nincs elfogadva.",
86
+ category: "account",
87
+ hint: "A könyvelői vagy aggregátor meghatalmazást a Számlázz.hu felületén kell elfogadni."
88
+ },
89
+ 259: {
90
+ message: "A tétel nettó értéke nem megfelelő.",
91
+ category: "validation",
92
+ hint: ITEM_AMOUNT_HINT
93
+ },
94
+ 260: {
95
+ message: "A tétel áfa értéke nem megfelelő.",
96
+ category: "validation",
97
+ hint: ITEM_AMOUNT_HINT
98
+ },
99
+ 261: {
100
+ message: "A tétel bruttó értéke nem megfelelő.",
101
+ category: "validation",
102
+ hint: ITEM_AMOUNT_HINT
103
+ },
104
+ 262: {
105
+ message: "A tétel nettó értéke nem megfelelő.",
106
+ category: "validation",
107
+ hint: ITEM_AMOUNT_HINT
108
+ },
109
+ 263: {
110
+ message: "A tétel áfa értéke nem megfelelő.",
111
+ category: "validation",
112
+ hint: ITEM_AMOUNT_HINT
113
+ },
114
+ 264: {
115
+ message: "A tétel bruttó értéke nem megfelelő.",
116
+ category: "validation",
117
+ hint: ITEM_AMOUNT_HINT
118
+ },
119
+ 335: {
120
+ message: "A hivatkozott díjbekérő nem található.",
121
+ category: "not_found"
122
+ },
123
+ 336: {
124
+ message: "A nyugta előtag már számlákhoz használatban van.",
125
+ category: "validation",
126
+ hint: "Nyugtához olyan előtag kell, amit számlán még nem használtál."
127
+ },
128
+ 337: {
129
+ message: "A nyugta előtag formátuma hibás.",
130
+ category: "validation",
131
+ hint: "Az előtag csak nagybetűt és számot tartalmazhat."
132
+ },
133
+ 338: {
134
+ message: "A hívásazonosító már létezik.",
135
+ category: "duplicate",
136
+ hint: "Ezzel a callId-val már készült nyugta, kérdezd le a meglévőt."
137
+ },
138
+ 339: {
139
+ message: "A nyugtaszám nem létezik.",
140
+ category: "not_found"
141
+ },
142
+ 340: {
143
+ message: "A kifizetett összeg eltér a bruttó végösszegtől.",
144
+ category: "validation"
145
+ },
146
+ 352: {
147
+ message: "A számla kelte csak a mai nap lehet.",
148
+ category: "validation",
149
+ hint: "A dátumot magyar idő (Europe/Budapest) szerint kell megadni, nem UTC szerint."
150
+ },
151
+ 363: {
152
+ message: "A tétel bruttó értékének egész számnak kell lennie.",
153
+ category: "validation",
154
+ hint: RECEIPT_AMOUNT_HINT
155
+ },
156
+ 364: {
157
+ message: "A tétel nettó értéke maximum 2 tizedes jegyet tartalmazhat.",
158
+ category: "validation",
159
+ hint: RECEIPT_AMOUNT_HINT
160
+ },
161
+ 365: {
162
+ message: "A tétel áfa értéke maximum 2 tizedes jegyet tartalmazhat.",
163
+ category: "validation",
164
+ hint: RECEIPT_AMOUNT_HINT
165
+ },
166
+ 395: {
167
+ message: "Érvénytelen áfakulcs.",
168
+ category: "validation",
169
+ hint: "Használd a VatRate típusban felsorolt áfakulcsok egyikét."
170
+ },
171
+ 396: {
172
+ message: "A megadott dátum túl korai.",
173
+ category: "validation",
174
+ hint: "A kelte és a teljesítés dátuma nem lehet a lezárt időszakban."
175
+ },
176
+ 537: {
177
+ message: "Egy tételhez legfeljebb 400 adattörlő kód adható.",
178
+ category: "validation"
179
+ },
180
+ 538: {
181
+ message: "Adattörlő kód demo- és tesztfiókban nem használható.",
182
+ category: "account"
183
+ },
184
+ 539: {
185
+ message: "Nincs bekapcsolva az adattörlő kód használata.",
186
+ category: "account",
187
+ hint: "A számlázási beállításokban kapcsold be az adattörlő kódot."
188
+ },
189
+ 551: {
190
+ message: "Egyszerűsített számlakép OSS vagy nem magyar adószám mellett nem használható.",
191
+ category: "validation",
192
+ hint: SIMPLE_ITEMS_HINT
193
+ },
194
+ 552: {
195
+ message: "Egyszerűsített számlaképen legfeljebb két tétel adható meg.",
196
+ category: "validation",
197
+ hint: SIMPLE_ITEMS_HINT
198
+ },
199
+ 553: {
200
+ message: "Egyszerűsített számlakép esetén érvénytelen adókulcs.",
201
+ category: "validation",
202
+ hint: SIMPLE_ITEMS_HINT
203
+ },
204
+ 554: {
205
+ message: "Egyszerűsített számlaképű számla nem helyesbíthető.",
206
+ category: "validation",
207
+ hint: SIMPLE_ITEMS_HINT
208
+ },
209
+ 555: {
210
+ message: "Egyszerűsített számlaképen a tételek áfakulcsai nem különbözhetnek.",
211
+ category: "validation",
212
+ hint: SIMPLE_ITEMS_HINT
213
+ },
214
+ 556: {
215
+ message: "Egyszerűsített számlakép szállítólevélen és helyesbítő számlán nem használható.",
216
+ category: "validation",
217
+ hint: SIMPLE_ITEMS_HINT
218
+ }
219
+ };
220
+ const RETRYABLE_CATEGORIES = /* @__PURE__ */ new Set([
221
+ "maintenance",
222
+ "network",
223
+ "timeout"
224
+ ]);
225
+ var SzamlazzError = class extends Error {
226
+ name = "SzamlazzError";
227
+ code;
228
+ category;
229
+ retryable;
230
+ hint;
231
+ action;
232
+ httpStatus;
233
+ rawResponse;
234
+ constructor(message, options) {
235
+ super(message, options.cause === void 0 ? void 0 : { cause: options.cause });
236
+ this.code = options.code;
237
+ this.category = options.category;
238
+ this.retryable = RETRYABLE_CATEGORIES.has(options.category);
239
+ this.hint = options.hint;
240
+ this.action = options.action;
241
+ this.httpStatus = options.httpStatus;
242
+ this.rawResponse = options.rawResponse;
243
+ }
244
+ get isDuplicate() {
245
+ return this.category === "duplicate";
246
+ }
247
+ get isNotFound() {
248
+ return this.category === "not_found";
249
+ }
250
+ };
251
+ function isSzamlazzError(error) {
252
+ return error instanceof SzamlazzError;
253
+ }
254
+ function createAgentError(input) {
255
+ const info = input.code === void 0 ? void 0 : AGENT_ERROR_CODES[input.code];
256
+ const message = input.message?.trim() || info?.message || "Ismeretlen hiba a Számlázz.hu válaszában.";
257
+ return new SzamlazzError(`${input.code === void 0 ? "" : `[${input.code}] `}${message}`, {
258
+ category: info?.category ?? "unknown",
259
+ code: input.code,
260
+ hint: info?.hint,
261
+ action: input.action,
262
+ httpStatus: input.httpStatus,
263
+ rawResponse: input.rawResponse
264
+ });
265
+ }
266
+ function parseErrorCode(value) {
267
+ if (value === null || value === void 0) return void 0;
268
+ const trimmed = value.trim();
269
+ if (!/^-?\d+$/.test(trimmed)) return void 0;
270
+ return Number(trimmed);
271
+ }
272
+ //#endregion
273
+ Object.defineProperty(exports, "AGENT_ERROR_CODES", {
274
+ enumerable: true,
275
+ get: function() {
276
+ return AGENT_ERROR_CODES;
277
+ }
278
+ });
279
+ Object.defineProperty(exports, "SzamlazzError", {
280
+ enumerable: true,
281
+ get: function() {
282
+ return SzamlazzError;
283
+ }
284
+ });
285
+ Object.defineProperty(exports, "createAgentError", {
286
+ enumerable: true,
287
+ get: function() {
288
+ return createAgentError;
289
+ }
290
+ });
291
+ Object.defineProperty(exports, "isSzamlazzError", {
292
+ enumerable: true,
293
+ get: function() {
294
+ return isSzamlazzError;
295
+ }
296
+ });
297
+ Object.defineProperty(exports, "parseErrorCode", {
298
+ enumerable: true,
299
+ get: function() {
300
+ return parseErrorCode;
301
+ }
302
+ });
@@ -0,0 +1,273 @@
1
+ //#region src/core/errors.ts
2
+ const SIMPLE_ITEMS_HINT = "Az egyszerűsített számlakép (simpleItems) szabályait lásd a docs utazásszervezőknek szóló oldalán.";
3
+ const ITEM_AMOUNT_HINT = "Használd a tételeknél a netUnitPrice vagy grossUnitPrice mezőt, és hagyd, hogy a csomag számolja ki az összegeket.";
4
+ const RECEIPT_AMOUNT_HINT = "Forintos nyugtán a bruttó egész szám, a nettó és az áfa legfeljebb 2 tizedes, és a nettó + áfa pontosan a bruttó.";
5
+ const AGENT_ERROR_CODES = {
6
+ 1: {
7
+ message: "Rendszerkarbantartás, kérem próbálja meg pár perc múlva.",
8
+ category: "maintenance",
9
+ hint: "A Számlázz.hu oldalán van karbantartás, néhány perc múlva próbáld újra."
10
+ },
11
+ 3: {
12
+ message: "Sikertelen bejelentkezés.",
13
+ category: "auth",
14
+ hint: "Ellenőrizd az Agent kulcsot. Csak kisbetűs kulcsot fogad el a rendszer."
15
+ },
16
+ 7: {
17
+ message: "Hiányzó adat: ismeretlen számlaszám, rendelésszám vagy külső azonosító.",
18
+ category: "not_found"
19
+ },
20
+ 49: {
21
+ message: "A tanúsítvány használatához jelszó szükséges.",
22
+ category: "account",
23
+ hint: "Az e-számla tanúsítványához tartozó jelszót a Számlázz.hu felületén kell beállítani."
24
+ },
25
+ 52: {
26
+ message: "Az áfakulcs nem értelmezhető.",
27
+ category: "validation",
28
+ hint: "Használd a VatRate típusban felsorolt áfakulcsok egyikét."
29
+ },
30
+ 53: {
31
+ message: "Hiányzó XML fájl.",
32
+ category: "validation",
33
+ hint: "Az XML-t fájlként kell elküldeni multipart/form-data kérésben."
34
+ },
35
+ 54: {
36
+ message: "E-számla készítés nincs engedélyezve.",
37
+ category: "account",
38
+ hint: "Az előfizetési csomag nem tartalmazza az e-számlát, vagy nincs tanúsítvány. Próbáld eInvoice: false beállítással."
39
+ },
40
+ 55: {
41
+ message: "E-számla aláírása sikertelen.",
42
+ category: "account",
43
+ hint: "A tanúsítvány lejárt, vagy az időbélyeg szerver nem érhető el."
44
+ },
45
+ 56: {
46
+ message: "A bizonylat elkészült, de az értesítő e-mail kiküldése sikertelen.",
47
+ category: "partial_success",
48
+ hint: "NE állítsd ki újra a bizonylatot. Kérdezd le rendelésszám vagy külső azonosító alapján, és küldd ki az e-mailt később."
49
+ },
50
+ 57: {
51
+ message: "XML beolvasási hiba.",
52
+ category: "validation",
53
+ hint: "A küldött XML nem felel meg az XSD-nek. A részleteket a hibaüzenet tartalmazza."
54
+ },
55
+ 71: {
56
+ message: "Már létező rendelésszám.",
57
+ category: "duplicate",
58
+ hint: "A fiókban be van kapcsolva a rendelésszám ismétlődés tiltása. Ez a bizonylat valószínűleg már elkészült."
59
+ },
60
+ 135: {
61
+ message: "Számla Agent futtatásához lépj ki a Számlázz.hu rendszerből a böngészőben.",
62
+ category: "auth"
63
+ },
64
+ 136: {
65
+ message: "Bejelentkezési hiba, lépj be a Számlázz.hu rendszerébe böngészőn keresztül.",
66
+ category: "account",
67
+ hint: "Lejárt előfizetés vagy rendezetlen díj. Ellenőrizd a Szolgáltatáscsomagom menüpontot."
68
+ },
69
+ 152: {
70
+ message: "Már létező rendelésszám.",
71
+ category: "duplicate",
72
+ hint: "A fiókban be van kapcsolva a rendelésszám ismétlődés tiltása. Ez a bizonylat valószínűleg már elkészült."
73
+ },
74
+ 164: {
75
+ message: "A funkciót csak egyetlen fiókhoz hozzáférő felhasználó használhatja.",
76
+ category: "auth",
77
+ hint: "Használj Agent kulcsot felhasználónév és jelszó helyett."
78
+ },
79
+ 202: {
80
+ message: "A megadott számlaszám előtag nem megfelelő.",
81
+ category: "validation",
82
+ hint: "Csak a Beállítások / Előtagok menüpontban rögzített előtag használható."
83
+ },
84
+ 250: {
85
+ message: "A meghatalmazás nincs elfogadva.",
86
+ category: "account",
87
+ hint: "A könyvelői vagy aggregátor meghatalmazást a Számlázz.hu felületén kell elfogadni."
88
+ },
89
+ 259: {
90
+ message: "A tétel nettó értéke nem megfelelő.",
91
+ category: "validation",
92
+ hint: ITEM_AMOUNT_HINT
93
+ },
94
+ 260: {
95
+ message: "A tétel áfa értéke nem megfelelő.",
96
+ category: "validation",
97
+ hint: ITEM_AMOUNT_HINT
98
+ },
99
+ 261: {
100
+ message: "A tétel bruttó értéke nem megfelelő.",
101
+ category: "validation",
102
+ hint: ITEM_AMOUNT_HINT
103
+ },
104
+ 262: {
105
+ message: "A tétel nettó értéke nem megfelelő.",
106
+ category: "validation",
107
+ hint: ITEM_AMOUNT_HINT
108
+ },
109
+ 263: {
110
+ message: "A tétel áfa értéke nem megfelelő.",
111
+ category: "validation",
112
+ hint: ITEM_AMOUNT_HINT
113
+ },
114
+ 264: {
115
+ message: "A tétel bruttó értéke nem megfelelő.",
116
+ category: "validation",
117
+ hint: ITEM_AMOUNT_HINT
118
+ },
119
+ 335: {
120
+ message: "A hivatkozott díjbekérő nem található.",
121
+ category: "not_found"
122
+ },
123
+ 336: {
124
+ message: "A nyugta előtag már számlákhoz használatban van.",
125
+ category: "validation",
126
+ hint: "Nyugtához olyan előtag kell, amit számlán még nem használtál."
127
+ },
128
+ 337: {
129
+ message: "A nyugta előtag formátuma hibás.",
130
+ category: "validation",
131
+ hint: "Az előtag csak nagybetűt és számot tartalmazhat."
132
+ },
133
+ 338: {
134
+ message: "A hívásazonosító már létezik.",
135
+ category: "duplicate",
136
+ hint: "Ezzel a callId-val már készült nyugta, kérdezd le a meglévőt."
137
+ },
138
+ 339: {
139
+ message: "A nyugtaszám nem létezik.",
140
+ category: "not_found"
141
+ },
142
+ 340: {
143
+ message: "A kifizetett összeg eltér a bruttó végösszegtől.",
144
+ category: "validation"
145
+ },
146
+ 352: {
147
+ message: "A számla kelte csak a mai nap lehet.",
148
+ category: "validation",
149
+ hint: "A dátumot magyar idő (Europe/Budapest) szerint kell megadni, nem UTC szerint."
150
+ },
151
+ 363: {
152
+ message: "A tétel bruttó értékének egész számnak kell lennie.",
153
+ category: "validation",
154
+ hint: RECEIPT_AMOUNT_HINT
155
+ },
156
+ 364: {
157
+ message: "A tétel nettó értéke maximum 2 tizedes jegyet tartalmazhat.",
158
+ category: "validation",
159
+ hint: RECEIPT_AMOUNT_HINT
160
+ },
161
+ 365: {
162
+ message: "A tétel áfa értéke maximum 2 tizedes jegyet tartalmazhat.",
163
+ category: "validation",
164
+ hint: RECEIPT_AMOUNT_HINT
165
+ },
166
+ 395: {
167
+ message: "Érvénytelen áfakulcs.",
168
+ category: "validation",
169
+ hint: "Használd a VatRate típusban felsorolt áfakulcsok egyikét."
170
+ },
171
+ 396: {
172
+ message: "A megadott dátum túl korai.",
173
+ category: "validation",
174
+ hint: "A kelte és a teljesítés dátuma nem lehet a lezárt időszakban."
175
+ },
176
+ 537: {
177
+ message: "Egy tételhez legfeljebb 400 adattörlő kód adható.",
178
+ category: "validation"
179
+ },
180
+ 538: {
181
+ message: "Adattörlő kód demo- és tesztfiókban nem használható.",
182
+ category: "account"
183
+ },
184
+ 539: {
185
+ message: "Nincs bekapcsolva az adattörlő kód használata.",
186
+ category: "account",
187
+ hint: "A számlázási beállításokban kapcsold be az adattörlő kódot."
188
+ },
189
+ 551: {
190
+ message: "Egyszerűsített számlakép OSS vagy nem magyar adószám mellett nem használható.",
191
+ category: "validation",
192
+ hint: SIMPLE_ITEMS_HINT
193
+ },
194
+ 552: {
195
+ message: "Egyszerűsített számlaképen legfeljebb két tétel adható meg.",
196
+ category: "validation",
197
+ hint: SIMPLE_ITEMS_HINT
198
+ },
199
+ 553: {
200
+ message: "Egyszerűsített számlakép esetén érvénytelen adókulcs.",
201
+ category: "validation",
202
+ hint: SIMPLE_ITEMS_HINT
203
+ },
204
+ 554: {
205
+ message: "Egyszerűsített számlaképű számla nem helyesbíthető.",
206
+ category: "validation",
207
+ hint: SIMPLE_ITEMS_HINT
208
+ },
209
+ 555: {
210
+ message: "Egyszerűsített számlaképen a tételek áfakulcsai nem különbözhetnek.",
211
+ category: "validation",
212
+ hint: SIMPLE_ITEMS_HINT
213
+ },
214
+ 556: {
215
+ message: "Egyszerűsített számlakép szállítólevélen és helyesbítő számlán nem használható.",
216
+ category: "validation",
217
+ hint: SIMPLE_ITEMS_HINT
218
+ }
219
+ };
220
+ const RETRYABLE_CATEGORIES = /* @__PURE__ */ new Set([
221
+ "maintenance",
222
+ "network",
223
+ "timeout"
224
+ ]);
225
+ var SzamlazzError = class extends Error {
226
+ name = "SzamlazzError";
227
+ code;
228
+ category;
229
+ retryable;
230
+ hint;
231
+ action;
232
+ httpStatus;
233
+ rawResponse;
234
+ constructor(message, options) {
235
+ super(message, options.cause === void 0 ? void 0 : { cause: options.cause });
236
+ this.code = options.code;
237
+ this.category = options.category;
238
+ this.retryable = RETRYABLE_CATEGORIES.has(options.category);
239
+ this.hint = options.hint;
240
+ this.action = options.action;
241
+ this.httpStatus = options.httpStatus;
242
+ this.rawResponse = options.rawResponse;
243
+ }
244
+ get isDuplicate() {
245
+ return this.category === "duplicate";
246
+ }
247
+ get isNotFound() {
248
+ return this.category === "not_found";
249
+ }
250
+ };
251
+ function isSzamlazzError(error) {
252
+ return error instanceof SzamlazzError;
253
+ }
254
+ function createAgentError(input) {
255
+ const info = input.code === void 0 ? void 0 : AGENT_ERROR_CODES[input.code];
256
+ const message = input.message?.trim() || info?.message || "Ismeretlen hiba a Számlázz.hu válaszában.";
257
+ return new SzamlazzError(`${input.code === void 0 ? "" : `[${input.code}] `}${message}`, {
258
+ category: info?.category ?? "unknown",
259
+ code: input.code,
260
+ hint: info?.hint,
261
+ action: input.action,
262
+ httpStatus: input.httpStatus,
263
+ rawResponse: input.rawResponse
264
+ });
265
+ }
266
+ function parseErrorCode(value) {
267
+ if (value === null || value === void 0) return void 0;
268
+ const trimmed = value.trim();
269
+ if (!/^-?\d+$/.test(trimmed)) return void 0;
270
+ return Number(trimmed);
271
+ }
272
+ //#endregion
273
+ export { parseErrorCode as a, isSzamlazzError as i, SzamlazzError as n, createAgentError as r, AGENT_ERROR_CODES as t };