@halftome/szamlazz-client 1.1.0 → 2.0.2

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/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { InvoiceOptions, LineItem, ReverseInvoiceOptions, KeyAuth, CredentialAuth, InvoiceItemResponse } from './types';
1
+ import type { InvoiceOptions, LineItem, ReverseInvoiceOptions, KeyAuth, CredentialAuth, InvoiceItemResponse } from './types.js';
2
2
  export declare class Client {
3
3
  readonly key?: string;
4
4
  readonly username?: string;
@@ -13,41 +13,4 @@ export declare class Client {
13
13
  testConnection(): Promise<boolean>;
14
14
  }
15
15
  export default Client;
16
- export * from './types';
17
- /**
18
-
19
- const c = new Client({ username: 'demo', password: 'demo' })
20
-
21
- c.generateInvoice(
22
- {
23
- eInvoice: true,
24
- currency: Currency.HUF,
25
- sendEmail: false,
26
- language: Language.HU,
27
- paymentMethod: PaymentMethod.Card,
28
- settled: true,
29
- comment: 'some random comment',
30
- customer: {
31
- name: 'Test',
32
- address: 'Test',
33
- city: 'Test',
34
- zip: 'TST111',
35
- },
36
- },
37
- [
38
- {
39
- amount: 1,
40
- amountName: 'db',
41
- grossAmount: 1000,
42
- netAmount: 1000,
43
- name: 'Test',
44
- netUnitPrice: 1000,
45
- taxAmount: 0,
46
- vatRate: NamedVATRate.AAM,
47
- },
48
- ],
49
- ).then((r) => {
50
- console.log(r)
51
- c.reverseInvoice(r.invoice.number, { eInvoice: true }).then((r) => console.log(r))
52
- })
53
- */
16
+ export * from './types.js';
package/dist/index.js CHANGED
@@ -1,32 +1,12 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- var __importDefault = (this && this.__importDefault) || function (mod) {
17
- return (mod && mod.__esModule) ? mod : { "default": mod };
18
- };
19
- Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.Client = void 0;
21
- const xmlbuilder2_1 = require("xmlbuilder2");
22
- const node_fetch_1 = __importDefault(require("node-fetch"));
23
- const form_data_1 = __importDefault(require("form-data"));
24
- const url_1 = require("url");
25
- const luxon_1 = require("luxon");
26
- const today = () => luxon_1.DateTime.now().setZone('Europe/Budapest').toFormat('yyyy-LL-dd');
27
- class Client {
1
+ import { create, convert } from 'xmlbuilder2';
2
+ import { URL } from 'url';
3
+ const toDateStr = (date) => date.toLocaleDateString('sv-SE', { timeZone: 'Europe/Budapest' });
4
+ export class Client {
5
+ key;
6
+ username;
7
+ password;
8
+ apiUrl = 'https://www.szamlazz.hu/szamla/';
28
9
  constructor(auth) {
29
- this.apiUrl = 'https://www.szamlazz.hu/szamla/';
30
10
  this.key = auth.key;
31
11
  this.username = auth.username;
32
12
  this.password = auth.password;
@@ -34,10 +14,10 @@ class Client {
34
14
  decodeResponse(response) {
35
15
  // Decode Response
36
16
  try {
37
- const obj = (0, xmlbuilder2_1.convert)(response, { format: 'object' });
17
+ const obj = convert(response, { format: 'object' });
38
18
  // Decode hosted url params:
39
- const url = new url_1.URL(obj.xmlszamlavalasz?.vevoifiokurl?.$);
40
- const pdfUrl = new url_1.URL(obj.xmlszamlavalasz?.vevoifiokurl?.$);
19
+ const url = new URL(obj.xmlszamlavalasz?.vevoifiokurl?.$);
20
+ const pdfUrl = new URL(obj.xmlszamlavalasz?.vevoifiokurl?.$);
41
21
  pdfUrl.searchParams.append('action', 'szamlapdf');
42
22
  pdfUrl.searchParams.delete('page');
43
23
  const decoded = {
@@ -63,13 +43,13 @@ class Client {
63
43
  }
64
44
  async sendRequest(type, content) {
65
45
  // Build XML
66
- const doc = (0, xmlbuilder2_1.create)({ encoding: 'UTF-8' }, content);
46
+ const doc = create({ encoding: 'UTF-8' }, content);
67
47
  const xml = doc.end({ prettyPrint: false });
68
48
  // Build Request
69
- const form = new form_data_1.default();
70
- form.append(type, xml, type);
49
+ const form = new FormData();
50
+ form.append(type, new Blob([xml], { type: 'application/xml' }), type);
71
51
  // Send Request
72
- const response = await (0, node_fetch_1.default)(this.apiUrl, { method: 'POST', body: form });
52
+ const response = await fetch(this.apiUrl, { method: 'POST', body: form });
73
53
  return await response.text();
74
54
  }
75
55
  authAttributes() {
@@ -80,7 +60,6 @@ class Client {
80
60
  };
81
61
  }
82
62
  async generateInvoice(options, items = []) {
83
- const now = today();
84
63
  const doc = {
85
64
  xmlszamla: {
86
65
  '@xmlns': 'http://www.szamlazz.hu/xmlszamla',
@@ -91,11 +70,12 @@ class Client {
91
70
  eszamla: options.eInvoice,
92
71
  szamlaLetoltes: options.downloadPDF ?? false,
93
72
  valaszVerzio: 2,
73
+ szamlaKulsoAzon: options.externalId,
94
74
  },
95
75
  fejlec: {
96
- keltDatum: options.issueDate ?? now,
97
- teljesitesDatum: options.completionDate ?? now,
98
- fizetesiHataridoDatum: options.dueDate ?? now,
76
+ keltDatum: toDateStr(options.issueDate),
77
+ teljesitesDatum: toDateStr(options.completionDate),
78
+ fizetesiHataridoDatum: toDateStr(options.dueDate),
99
79
  fizmod: options.paymentMethod,
100
80
  penznem: options.currency,
101
81
  szamlaNyelve: options.language,
@@ -109,7 +89,7 @@ class Client {
109
89
  elado: {
110
90
  bank: options.payee?.bankName,
111
91
  bankszamlaszam: options.payee?.bankAccountNumber,
112
- emailReplyTo: options.email?.replyTo,
92
+ emailReplyto: options.email?.replyTo,
113
93
  emailTargy: options.email?.subject,
114
94
  emailSzoveg: options.email?.content,
115
95
  },
@@ -145,7 +125,6 @@ class Client {
145
125
  return this.decodeResponse(await this.sendRequest('action-xmlagentxmlfile', doc));
146
126
  }
147
127
  async reverseInvoice(invoice, options) {
148
- const now = today();
149
128
  const doc = {
150
129
  xmlszamlast: {
151
130
  '@xmlns': 'http://www.szamlazz.hu/xmlszamlast',
@@ -159,8 +138,8 @@ class Client {
159
138
  },
160
139
  fejlec: {
161
140
  szamlaszam: invoice,
162
- keltDatum: options.issueDate ?? now,
163
- teljesitesDatum: options.completionDate ?? now,
141
+ keltDatum: toDateStr(options.issueDate),
142
+ teljesitesDatum: toDateStr(options.completionDate),
164
143
  },
165
144
  },
166
145
  };
@@ -177,47 +156,9 @@ class Client {
177
156
  },
178
157
  };
179
158
  const r = await this.sendRequest('action-szamla_agent_xml', doc);
180
- const obj = (0, xmlbuilder2_1.convert)(r, { format: 'object' });
159
+ const obj = convert(r, { format: 'object' });
181
160
  return obj.xmlszamlavalasz?.hibakod.$ == 7;
182
161
  }
183
162
  }
184
- exports.Client = Client;
185
- exports.default = Client;
186
- __exportStar(require("./types"), exports);
187
- /**
188
-
189
- const c = new Client({ username: 'demo', password: 'demo' })
190
-
191
- c.generateInvoice(
192
- {
193
- eInvoice: true,
194
- currency: Currency.HUF,
195
- sendEmail: false,
196
- language: Language.HU,
197
- paymentMethod: PaymentMethod.Card,
198
- settled: true,
199
- comment: 'some random comment',
200
- customer: {
201
- name: 'Test',
202
- address: 'Test',
203
- city: 'Test',
204
- zip: 'TST111',
205
- },
206
- },
207
- [
208
- {
209
- amount: 1,
210
- amountName: 'db',
211
- grossAmount: 1000,
212
- netAmount: 1000,
213
- name: 'Test',
214
- netUnitPrice: 1000,
215
- taxAmount: 0,
216
- vatRate: NamedVATRate.AAM,
217
- },
218
- ],
219
- ).then((r) => {
220
- console.log(r)
221
- c.reverseInvoice(r.invoice.number, { eInvoice: true }).then((r) => console.log(r))
222
- })
223
- */
163
+ export default Client;
164
+ export * from './types.js';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,54 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { Client, NamedVATRate, PaymentMethod } from './index.js';
3
+ describe('Client', () => {
4
+ const client = new Client({ username: 'demo', password: 'demo' });
5
+ it('should generate and reverse an invoice', { timeout: 30000 }, async () => {
6
+ const result = await client.generateInvoice({
7
+ eInvoice: true,
8
+ currency: 'HUF',
9
+ sendEmail: false,
10
+ language: 'hu',
11
+ paymentMethod: PaymentMethod.Card,
12
+ settled: true,
13
+ comment: 'some random comment',
14
+ issueDate: new Date(),
15
+ completionDate: new Date(),
16
+ dueDate: new Date(),
17
+ customer: {
18
+ name: 'Test',
19
+ address: 'Test',
20
+ city: 'Test',
21
+ zip: 'TST111',
22
+ },
23
+ }, [
24
+ {
25
+ amount: 1,
26
+ amountName: 'db',
27
+ grossAmount: 1000,
28
+ netAmount: 1000,
29
+ name: 'Test',
30
+ netUnitPrice: 1000,
31
+ taxAmount: 0,
32
+ vatRate: NamedVATRate.AAM,
33
+ },
34
+ ]);
35
+ expect(result.invoice.number).toBeDefined();
36
+ expect(result.net).toBe(1000);
37
+ expect(result.gross).toBe(1000);
38
+ const reverseResult = await client.reverseInvoice(result.invoice.number, {
39
+ eInvoice: true,
40
+ issueDate: new Date(),
41
+ completionDate: new Date(),
42
+ });
43
+ expect(reverseResult.invoice.number).toBeDefined();
44
+ });
45
+ it('should validate credentials with testConnection', async () => {
46
+ const isValid = await client.testConnection();
47
+ expect(isValid).toBe(true);
48
+ });
49
+ it('should reject invalid credentials', async () => {
50
+ const badClient = new Client({ username: 'invalid', password: 'invalid' });
51
+ const isValid = await badClient.testConnection();
52
+ expect(isValid).toBe(false);
53
+ });
54
+ });
package/dist/types.d.ts CHANGED
@@ -1,46 +1,31 @@
1
- /// <reference types="node" />
2
1
  export declare enum NamedVATRate {
3
- TEHK = "TEHK",
4
- TAHK = "TAHK",
5
- TAM = "TAM",
6
- AAM = "AAM",
7
- EUT = "EUT",
8
- EUKT = "EUKT",
9
- MAA = "MAA",
10
- F_AFA = "F.AFA",
11
- K_AFA = "K.AFA",
12
- HO = "HO",
13
- EUE = "EUE",
14
- EUFADE = "EUFADE",
15
- EUFAD37 = "EUFAD37",
16
- ATK = "ATK",
17
- NAM = "NAM",
18
- EAM = "EAM",
19
- KBAUK = "KBAUK",
2
+ TEHK = "TEHK",// Outside the scope of Hungarian VAT
3
+ TAHK = "TAHK",// Not subject to VAT
4
+ TAM = "TAM",// supply exempt from VAT / exempt supply
5
+ AAM = "AAM",// person exempt from VAT / exempt person
6
+ EUT = "EUT",// Within EU (former 'EU')
7
+ EUKT = "EUKT",// Outside EU (former 'EUK')
8
+ MAA = "MAA",// exempt from tax
9
+ F_AFA = "F.AFA",// reverse VAT
10
+ K_AFA = "K.AFA",// differential VAT
11
+ HO = "HO",// Harmadik országban teljesített ügylet (TEHK)
12
+ EUE = "EUE",// Másik tagállamban teljesített, nem fordítottan adózó ügylet
13
+ EUFADE = "EUFADE",// Másik tagállamban teljesített, nem az Áfa tv. 37. §-a alá tartozó, fordítottan adózó ügylet
14
+ EUFAD37 = "EUFAD37",// -Áfa tv. 37. §-a alapján másik tagállamban teljesített, fordítottan adózó ügylet
15
+ ATK = "ATK",// ÁFA tárgyi hatályán kívüli
16
+ NAM = "NAM",// adómentesség egyéb nemzetközi ügyletekhez
17
+ EAM = "EAM",// adómentes termékexport harmadik országba
18
+ KBAUK = "KBAUK",// Közösségen belüli termékértékesítés UK
20
19
  KBAET = "KBAET"
21
20
  }
22
- export declare type VATRate = 0 | 5 | 7 | 18 | 19 | 20 | 25 | 27 | NamedVATRate;
21
+ export type VATRate = 0 | 5 | 7 | 18 | 19 | 20 | 25 | 27 | NamedVATRate;
23
22
  export declare enum PaymentMethod {
24
23
  Transfer = "\u00E1tutal\u00E1s",
25
24
  Cash = "k\u00E9szp\u00E9nz",
26
25
  Card = "bankk\u00E1rtya"
27
26
  }
28
- export declare enum Currency {
29
- HUF = "HUF"
30
- }
31
- export declare enum Language {
32
- HU = "hu",
33
- EN = "en",
34
- DE = "de",
35
- IT = "it",
36
- RO = "ro",
37
- SK = "sk",
38
- HR = "hr",
39
- FR = "fr",
40
- ES = "es",
41
- CZ = "cz",
42
- PL = "pl"
43
- }
27
+ export type Currency = 'HUF' | 'EUR' | 'USD' | 'GBP' | 'CHF' | 'JPY' | 'CNY' | 'CZK' | 'PLN' | 'RON';
28
+ export type LanguageCode = 'hu' | 'en' | 'de' | 'it' | 'ro' | 'sk' | 'hr' | 'fr' | 'es' | 'cz' | 'pl' | 'bg' | 'nl' | 'ru' | 'si';
44
29
  export declare enum InvoiceTemplate {
45
30
  SzlaMost = "SzlaMost",
46
31
  SzlaAlap = "SzlaAlap",
@@ -52,12 +37,12 @@ export interface InvoiceOptions {
52
37
  payee?: PayeeDetails;
53
38
  customer: CustomerDetails;
54
39
  eInvoice: boolean;
55
- issueDate?: string;
56
- completionDate?: string;
57
- dueDate?: string;
40
+ issueDate: Date;
41
+ completionDate: Date;
42
+ dueDate: Date;
58
43
  paymentMethod: PaymentMethod | string;
59
44
  currency: Currency;
60
- language: Language;
45
+ language: LanguageCode;
61
46
  sendEmail: boolean;
62
47
  comment?: string;
63
48
  orderNumber?: string;
@@ -67,8 +52,9 @@ export interface InvoiceOptions {
67
52
  template?: InvoiceTemplate;
68
53
  settled?: boolean;
69
54
  downloadPDF?: boolean;
55
+ externalId?: string;
70
56
  }
71
- export declare type ReverseInvoiceOptions = Pick<InvoiceOptions, 'eInvoice' | 'issueDate' | 'completionDate' | 'downloadPDF'>;
57
+ export type ReverseInvoiceOptions = Pick<InvoiceOptions, 'eInvoice' | 'issueDate' | 'completionDate' | 'downloadPDF'>;
72
58
  export interface EmailDetails {
73
59
  replyTo?: string;
74
60
  subject: string;
@@ -93,12 +79,12 @@ export interface CustomerDetails {
93
79
  export interface LineItem {
94
80
  id?: string;
95
81
  name: string;
96
- amount: Number;
82
+ amount: number;
97
83
  amountName: string;
98
- netAmount: Number;
99
- taxAmount: Number;
100
- grossAmount: Number;
101
- netUnitPrice: Number;
84
+ netAmount: number;
85
+ taxAmount: number;
86
+ grossAmount: number;
87
+ netUnitPrice: number;
102
88
  vatRate: VATRate;
103
89
  comment?: string;
104
90
  }
package/dist/types.js CHANGED
@@ -1,7 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.InvoiceTemplate = exports.Language = exports.Currency = exports.PaymentMethod = exports.NamedVATRate = void 0;
4
- var NamedVATRate;
1
+ export var NamedVATRate;
5
2
  (function (NamedVATRate) {
6
3
  NamedVATRate["TEHK"] = "TEHK";
7
4
  NamedVATRate["TAHK"] = "TAHK";
@@ -21,36 +18,18 @@ var NamedVATRate;
21
18
  NamedVATRate["EAM"] = "EAM";
22
19
  NamedVATRate["KBAUK"] = "KBAUK";
23
20
  NamedVATRate["KBAET"] = "KBAET";
24
- })(NamedVATRate = exports.NamedVATRate || (exports.NamedVATRate = {}));
25
- var PaymentMethod;
21
+ })(NamedVATRate || (NamedVATRate = {}));
22
+ export var PaymentMethod;
26
23
  (function (PaymentMethod) {
27
24
  PaymentMethod["Transfer"] = "\u00E1tutal\u00E1s";
28
25
  PaymentMethod["Cash"] = "k\u00E9szp\u00E9nz";
29
26
  PaymentMethod["Card"] = "bankk\u00E1rtya";
30
- })(PaymentMethod = exports.PaymentMethod || (exports.PaymentMethod = {}));
31
- var Currency;
32
- (function (Currency) {
33
- Currency["HUF"] = "HUF";
34
- })(Currency = exports.Currency || (exports.Currency = {}));
35
- var Language;
36
- (function (Language) {
37
- Language["HU"] = "hu";
38
- Language["EN"] = "en";
39
- Language["DE"] = "de";
40
- Language["IT"] = "it";
41
- Language["RO"] = "ro";
42
- Language["SK"] = "sk";
43
- Language["HR"] = "hr";
44
- Language["FR"] = "fr";
45
- Language["ES"] = "es";
46
- Language["CZ"] = "cz";
47
- Language["PL"] = "pl";
48
- })(Language = exports.Language || (exports.Language = {}));
49
- var InvoiceTemplate;
27
+ })(PaymentMethod || (PaymentMethod = {}));
28
+ export var InvoiceTemplate;
50
29
  (function (InvoiceTemplate) {
51
30
  InvoiceTemplate["SzlaMost"] = "SzlaMost";
52
31
  InvoiceTemplate["SzlaAlap"] = "SzlaAlap";
53
32
  InvoiceTemplate["SzlaNoEnv"] = "SzlaNoEnv";
54
33
  InvoiceTemplate["Szla8cm"] = "Szla8cm";
55
34
  InvoiceTemplate["SzlaTomb"] = "SzlaTomb";
56
- })(InvoiceTemplate = exports.InvoiceTemplate || (exports.InvoiceTemplate = {}));
35
+ })(InvoiceTemplate || (InvoiceTemplate = {}));
package/package.json CHANGED
@@ -1,43 +1,47 @@
1
1
  {
2
2
  "name": "@halftome/szamlazz-client",
3
- "version": "1.1.0",
4
- "description": "Node.js client for using szamlazz.hu API",
5
- "scripts": {
6
- "build": "tsc",
7
- "dev": "tsc -w",
8
- "test": "echo \"No test yet\" && exit 0"
9
- },
3
+ "version": "2.0.2",
4
+ "type": "module",
5
+ "description": "Javascript client for using szamlazz.hu API",
10
6
  "repository": {
11
7
  "type": "git",
12
8
  "url": "git+https://github.com/half2me/szamlazz-client.git"
13
9
  },
14
10
  "author": "halftome@gmail.com",
15
11
  "types": "./dist/index.d.ts",
16
- "license": "SEE LICENSE IN LICENCE",
12
+ "license": "MIT",
13
+ "sideEffects": false,
14
+ "engines": {
15
+ "node": ">=20"
16
+ },
17
17
  "files": [
18
18
  "dist/**"
19
19
  ],
20
20
  "main": "./dist/index.js",
21
21
  "exports": {
22
- ".": "./dist/index.js"
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "default": "./dist/index.js"
25
+ }
23
26
  },
24
27
  "bugs": {
25
28
  "url": "https://github.com/half2me/szamlazz-client/issues"
26
29
  },
27
30
  "homepage": "https://github.com/half2me/szamlazz-client#readme",
28
31
  "devDependencies": {
29
- "@tsconfig/node14": "^1.0.1",
30
- "@types/luxon": "^2.3.1",
31
- "@types/node": "^16.3.3",
32
- "@types/node-fetch": "^2.5.11",
33
- "prettier": "^2.3.2",
34
- "tslib": "^2.3.0",
35
- "typescript": "^4.3.5"
32
+ "@tsconfig/node24": "^24.0.4",
33
+ "@types/node": "^25.0.10",
34
+ "prettier": "^3.8.1",
35
+ "tslib": "^2.8.1",
36
+ "typescript": "^5.9.3",
37
+ "vitest": "^4.0.18"
36
38
  },
37
39
  "dependencies": {
38
- "form-data": "^4.0.0",
39
- "luxon": "^2.3.2",
40
- "node-fetch": "^2.6.1",
41
- "xmlbuilder2": "^3.0.2"
40
+ "xmlbuilder2": "^4.0.3"
41
+ },
42
+ "scripts": {
43
+ "build": "tsc",
44
+ "dev": "tsc -w",
45
+ "test": "vitest run"
42
46
  }
43
- }
47
+ }
package/LICENCE DELETED
@@ -1 +0,0 @@
1
- (c) Copyright 2021 Benjamin Tamasi, all rights reserved.