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.
- package/LICENSE +21 -0
- package/README.md +150 -0
- package/agents/README.md +59 -0
- package/agents/api.md +206 -0
- package/agents/pitfalls.md +52 -0
- package/agents/recipes.md +217 -0
- package/agents/skills/kassza/SKILL.md +29 -0
- package/assets/logo-wordmark.svg +25 -0
- package/assets/logo.svg +19 -0
- package/dist/binary-B89HM03_.cjs +63 -0
- package/dist/binary-D0M9U2MD.js +34 -0
- package/dist/client-B9kbKKBf.d.cts +748 -0
- package/dist/client-zv4enyq7.d.ts +748 -0
- package/dist/cookie-stores/index.cjs +153 -0
- package/dist/cookie-stores/index.d.cts +63 -0
- package/dist/cookie-stores/index.d.ts +63 -0
- package/dist/cookie-stores/index.js +144 -0
- package/dist/create-BZd6CUO7.cjs +1160 -0
- package/dist/create-DDZaNlOz.js +939 -0
- package/dist/dates-D2XebOIg.js +34 -0
- package/dist/dates-DtHzwNU6.d.cts +7 -0
- package/dist/dates-DtHzwNU6.d.ts +7 -0
- package/dist/dates-PPxH0n5H.cjs +57 -0
- package/dist/errors-B0QJhUW1.cjs +302 -0
- package/dist/errors-DapdV5DK.js +273 -0
- package/dist/index-CYAGCdKJ.d.cts +56 -0
- package/dist/index-CYAGCdKJ.d.ts +56 -0
- package/dist/index.cjs +1406 -0
- package/dist/index.d.cts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +1394 -0
- package/dist/ipn/index.cjs +108 -0
- package/dist/ipn/index.d.cts +32 -0
- package/dist/ipn/index.d.ts +32 -0
- package/dist/ipn/index.js +101 -0
- package/dist/money/index.cjs +15 -0
- package/dist/money/index.d.cts +2 -0
- package/dist/money/index.d.ts +2 -0
- package/dist/money/index.js +2 -0
- package/dist/money-C9j7nBNP.js +258 -0
- package/dist/money-DkiGukAw.cjs +335 -0
- package/dist/session-CRGOuz-R.cjs +100 -0
- package/dist/session-Dm_45x8K.d.cts +11 -0
- package/dist/session-Dm_45x8K.d.ts +11 -0
- package/dist/session-OJMLGufT.js +77 -0
- package/dist/shared-CrxlxI8n.cjs +207 -0
- package/dist/shared-D6DLa4b7.js +100 -0
- package/dist/storage/fs.cjs +88 -0
- package/dist/storage/fs.d.cts +13 -0
- package/dist/storage/fs.d.ts +13 -0
- package/dist/storage/fs.js +87 -0
- package/dist/storage/index.cjs +643 -0
- package/dist/storage/index.d.cts +288 -0
- package/dist/storage/index.d.ts +288 -0
- package/dist/storage/index.js +619 -0
- package/dist/testing/index.cjs +409 -0
- package/dist/testing/index.d.cts +35 -0
- package/dist/testing/index.d.ts +35 -0
- package/dist/testing/index.js +407 -0
- package/dist/types-DVRgwcqg.d.cts +26 -0
- package/dist/types-DVRgwcqg.d.ts +26 -0
- package/dist/validators/index.cjs +296 -0
- package/dist/validators/index.d.cts +51 -0
- package/dist/validators/index.d.ts +51 -0
- package/dist/validators/index.js +278 -0
- package/llms.txt +16 -0
- 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 };
|