@kreiseck/kasseneck-api 0.14.0 → 0.15.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 (55) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +65 -0
  3. package/dist/cjs/client/aufrufe.d.ts +1 -1
  4. package/dist/cjs/client/aufrufe.js +11 -0
  5. package/dist/cjs/rechnung/api.d.ts +43 -0
  6. package/dist/cjs/rechnung/api.js +35 -0
  7. package/dist/cjs/rechnung/auth.d.ts +21 -0
  8. package/dist/cjs/rechnung/auth.js +36 -0
  9. package/dist/cjs/rechnung/endpunkte.d.ts +48 -0
  10. package/dist/cjs/rechnung/endpunkte.js +129 -0
  11. package/dist/cjs/rechnung/fehler.d.ts +21 -0
  12. package/dist/cjs/rechnung/fehler.js +44 -0
  13. package/dist/cjs/rechnung/index.d.ts +18 -0
  14. package/dist/cjs/rechnung/index.js +52 -0
  15. package/dist/cjs/rechnung/typen.d.ts +224 -0
  16. package/dist/cjs/rechnung/typen.js +9 -0
  17. package/dist/cjs/rechnung/vertrag.d.ts +98 -0
  18. package/dist/cjs/rechnung/vertrag.js +191 -0
  19. package/dist/esm/client/aufrufe.d.ts +1 -1
  20. package/dist/esm/client/aufrufe.js +11 -0
  21. package/dist/esm/rechnung/api.d.ts +43 -0
  22. package/dist/esm/rechnung/api.js +32 -0
  23. package/dist/esm/rechnung/auth.d.ts +21 -0
  24. package/dist/esm/rechnung/auth.js +33 -0
  25. package/dist/esm/rechnung/endpunkte.d.ts +48 -0
  26. package/dist/esm/rechnung/endpunkte.js +116 -0
  27. package/dist/esm/rechnung/fehler.d.ts +21 -0
  28. package/dist/esm/rechnung/fehler.js +39 -0
  29. package/dist/esm/rechnung/index.d.ts +18 -0
  30. package/dist/esm/rechnung/index.js +17 -0
  31. package/dist/esm/rechnung/typen.d.ts +224 -0
  32. package/dist/esm/rechnung/typen.js +8 -0
  33. package/dist/esm/rechnung/vertrag.d.ts +98 -0
  34. package/dist/esm/rechnung/vertrag.js +188 -0
  35. package/fixtures/hobex-hps-codes.json +1 -1
  36. package/fixtures/kasse-texte.json +1 -1
  37. package/fixtures/oberflaeche.json +87 -1
  38. package/fixtures/rechnung-api-beispiele/credit-fehler-grund.json +24 -0
  39. package/fixtures/rechnung-api-beispiele/credit-ok.json +20 -0
  40. package/fixtures/rechnung-api-beispiele/customer-fehler-uid.json +25 -0
  41. package/fixtures/rechnung-api-beispiele/customer-get-fehler-beide.json +15 -0
  42. package/fixtures/rechnung-api-beispiele/customer-ok.json +20 -0
  43. package/fixtures/rechnung-api-beispiele/customer-search-fehler-leer.json +14 -0
  44. package/fixtures/rechnung-api-beispiele/issue-brutto-20.json +27 -0
  45. package/fixtures/rechnung-api-beispiele/issue-fehler-cent.json +26 -0
  46. package/fixtures/rechnung-api-beispiele/issue-fehler-menge.json +26 -0
  47. package/fixtures/rechnung-api-beispiele/issue-fehler-negativ.json +26 -0
  48. package/fixtures/rechnung-api-beispiele/issue-fehler-satz.json +26 -0
  49. package/fixtures/rechnung-api-beispiele/issue-fehler-unbekannt.json +27 -0
  50. package/fixtures/rechnung-api-beispiele/issue-gemischt.json +33 -0
  51. package/fixtures/rechnung-api-beispiele/issue-kleinunternehmer.json +27 -0
  52. package/fixtures/rechnung-api-beispiele/issue-netto-20.json +28 -0
  53. package/fixtures/rechnung-api-beispiele/issue-rabatt.json +28 -0
  54. package/fixtures/rechnung-api.schema.json +672 -0
  55. package/package.json +12 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,34 @@ Was vor 0.7.0 geschah, steht in der Commit-Historie (`git log`); ab hier wird
4
4
  es hier geführt. Ein Eintrag nennt die Änderung **und ihren Grund** —
5
5
  nur der Grund überlebt den nächsten Umbau.
6
6
 
7
+ ## 0.15.0
8
+
9
+ ### Rechnungs-API: Rechnungen statt Belege, per `api_key`
10
+
11
+ **Anlass:** Fremdsysteme (Shops, Buchhaltungssoftware) konnten Rechnungen nur
12
+ über die Endpunkte des Panels anlegen — mit Anmeldung als Mensch, als Entwurf,
13
+ ohne geprüfte Eingabe und ohne Schutz vor einer doppelt ausgestellten Rechnung
14
+ nach einem Zeitlimit. Eine festgeschriebene Rechnung lässt sich aber nur per
15
+ Gutschrift zurücknehmen; ein Doppel ist also teuer.
16
+
17
+ - Neuer Unterpfad `@kreiseck/kasseneck-api/rechnung` mit `createRechnungApi`:
18
+ Kunden (`createCustomer`, `getCustomer`, `updateCustomer`, `searchCustomers`),
19
+ Rechnungen (`issueInvoice`, `cancelInvoice`, `createCreditNote`, `getInvoice`,
20
+ `listInvoices`) und Dateien (`getInvoicePdf`, `getInvoiceXml`).
21
+ - Anmeldung `rechnungKeyAuth`: Kontoschlüssel als Bearer, **ohne**
22
+ Kassen-Token — eine Rechnung entsteht am Konto, nicht an einer Kasse. Ein
23
+ Partner-Schlüssel oder Kassen-Token wird ohne Netzaufruf abgewiesen.
24
+ - Der Vertrag steht als Daten in `src/rechnung/vertrag.ts` und wird als
25
+ `fixtures/rechnung-api.schema.json` ausgeliefert (`npm run fixtures:rechnung`),
26
+ dazu Beispielanfragen unter `fixtures/rechnung-api-beispiele/`. Grund: das
27
+ Backend und der Dart-Zwilling prüfen gegen dieselbe Datei — die Feldliste
28
+ kann nicht an drei Stellen auseinanderlaufen.
29
+ - `fixtures/oberflaeche.json` führt die elf Aufrufe und einen Abschnitt
30
+ `rechnung` (Fehlercodes, Gutschrift-Gründe, Steuerschemata).
31
+ - `getInvoiceXml` liefert das XML als Text im gewohnten Umschlag statt als rohe
32
+ Datei: so bleibt `einvoice_incomplete` ein gewöhnlicher Fehler mit
33
+ `missing[]`, und der Transport braucht keinen dritten Leseweg.
34
+
7
35
  ## 0.14.0
8
36
 
9
37
  ### Das Beleg-Blatt: ein Beleg, der überall gleich aussieht
package/README.md CHANGED
@@ -426,6 +426,70 @@ app.post('/kasseneck-webhook', express.raw({ type: '*/*' }), async (req, res) =>
426
426
  });
427
427
  ```
428
428
 
429
+ ## Rechnungs-API (`./rechnung`)
430
+
431
+ Für Shops, Buchhaltungs- und Branchensoftware: **Rechnungen** (§ 11 UStG) —
432
+ keine Belege — mit dem `api_key` eines Kontos ausstellen. Eine Rechnung ist
433
+ nach dem Aufruf **festgeschrieben**: sie trägt ihre fortlaufende Nummer, ist
434
+ unveränderlich und lässt sich nur noch per Gutschrift korrigieren.
435
+
436
+ **Was die Endpunkte tun, steht in der Referenz** — `docs/api/rechnungen.md`
437
+ im Backend. Hier steht, wie man den Client benutzt. Der Schlüssel gehört auf
438
+ einen **Server**.
439
+
440
+ ```ts
441
+ import { createRechnungApi, istRechnungFehler } from '@kreiseck/kasseneck-api/rechnung';
442
+
443
+ const rechnungen = createRechnungApi({ apiKey: process.env.KASSENECK_API_KEY! });
444
+
445
+ // 1. Kunde einmal anlegen — externalId ist die eigene Kundennummer.
446
+ let kunde;
447
+ try {
448
+ kunde = await rechnungen.createCustomer({
449
+ type: 'company', name: 'Café Muster GmbH', country: 'AT',
450
+ street: 'Hauptplatz', houseNumber: '3', zip: '1010', city: 'Wien',
451
+ externalId: 'shop-4711',
452
+ });
453
+ } catch (fehler) {
454
+ if (!istRechnungFehler(fehler, 'customer_exists')) throw fehler;
455
+ kunde = await rechnungen.getCustomer({ externalId: 'shop-4711' });
456
+ }
457
+
458
+ // 2. Ausstellen. Beträge in ganzen Cent; das Rechnungsdatum setzt der Server.
459
+ const { invoice, replayed } = await rechnungen.issueInvoice({
460
+ idempotencyKey: `bestellung-${bestellnummer}`, // gleiche Bestellung = gleiche Rechnung
461
+ customerId: kunde.id,
462
+ taxScheme: 'normal',
463
+ priceMode: 'net',
464
+ serviceStart: '2026-09-14',
465
+ items: [{ description: 'Beratung', quantity: 2, unit: 'Std', unitPriceCents: 5000, vatRate: 20 }],
466
+ });
467
+ // invoice.number, invoice.totals.grossCents (12000), invoice.statusUrl
468
+
469
+ // 3. Dateien holen.
470
+ const pdf = await rechnungen.getInvoicePdf(invoice.id); // Uint8Array, mit Factur-X
471
+ const xml = await rechnungen.getInvoiceXml(invoice.id, 'ubl'); // Peppol-UBL als Text
472
+
473
+ // 4. Korrigieren — nur per Gutschrift.
474
+ await rechnungen.createCreditNote({
475
+ idempotencyKey: `nachlass-${bestellnummer}`,
476
+ invoiceId: invoice.id,
477
+ reason: 'price_reduction',
478
+ items: [{ description: 'Nachlass Beratung', quantity: 1, unitPriceCents: 2000, vatRate: 20 }],
479
+ });
480
+ ```
481
+
482
+ **Nach einem Zeitlimit mit demselben `idempotencyKey` wiederholen**, nie mit
483
+ einem neuen: dann kommt die schon ausgestellte Rechnung zurück
484
+ (`replayed: true`). Derselbe Schlüssel mit anderen Daten ergibt
485
+ `idempotency_conflict`.
486
+
487
+ Formfehler kommen als `validation` mit Feldpfaden (`rechnungFeldFehler(fehler)`
488
+ → `[{ field: 'items[0].vatRate', message }]`). Der Vertrag selbst liegt als
489
+ Daten im Paket (`RECHNUNG_ANFRAGEN`) und als JSON Schema unter
490
+ `@kreiseck/kasseneck-api/fixtures/rechnung-api.schema.json`; das Backend prüft
491
+ gegen genau diese Datei.
492
+
429
493
  ## Unterpfade
430
494
 
431
495
  | Unterpfad | Inhalt |
@@ -437,6 +501,7 @@ app.post('/kasseneck-webhook', express.raw({ type: '*/*' }), async (req, res) =>
437
501
  | `…/register` | Anmeldung der Browser-Kasse: Gerät koppeln und entkoppeln, Benutzer auflisten, per PIN anmelden, Sitzung erneuern und beenden. |
438
502
  | `…/kasse` | Kachel-Kasse: Kassen-Einstellungen (betriebsweit / je Gerät), Artikelgruppen und Artikel für Kacheln, Rabattverteilung je Steuersatz, Reichweiten der Kassen-Rechte |
439
503
  | `…/partner` | Partner-API: Betriebe anlegen, FinanzOnline-Link, Signatur, Kassen, Zugangsdaten, Webhooks samt Signaturprüfung. **Gehört auf einen Server.** |
504
+ | `…/rechnung` | Rechnungs-API: Kunden anlegen und suchen, Rechnungen festgeschrieben ausstellen, Gutschrift und Storno, PDF und E-Rechnung-XML; der Vertrag als Daten. **Gehört auf einen Server.** |
440
505
  | `…/react` | Dünner React-Adapter, der ein Beleg-Layout zeichnet. Braucht React. |
441
506
  | `…/fixtures/*` | Golden-Belege (JSON): Eingaben `belege/<name>.json`, zugesagte Zeilenausgabe `erwartet/<name>.lines.json`, `manifest.json` mit Prüfsummen — dieselben Dateien prüfen Backend, Browser-Kasse und Flutter-Paket. |
442
507
 
@@ -13,7 +13,7 @@
13
13
  * umhuellt, muss ihn weiterhin absetzen koennen.
14
14
  */
15
15
  import type { TransportBodyFields } from './transport.js';
16
- export declare const AUFRUFE: readonly ["activateCashregister", "cancelReceipt", "createCustomerCashregister", "createPartnerCustomer", "checkPartnerCustomerEmail", "createPartnerWebhook", "createPaymentLinkStripe", "createPrintJob", "createReceipt", "deletePartnerWebhook", "downloadDailyReport", "downloadReport", "endRegisterSession", "financeWebService", "generateFullReceiptId", "getCustomerCredentials", "getCustomerSignatureStatus", "getFirstReceiptDate", "getKasseSettings", "getPartnerCustomer", "getPartnerInfo", "getPrintJob", "getReceipt", "hobexPayApi", "hobexRefundApi", "listCustomerCashregisters", "listMyArticleGroups", "listMyArticles", "listMyCashregisters", "listMyPrinters", "listMyReceipts", "listMyTipRecipients", "listPartnerCustomers", "listPartnerWebhookDeliveries", "listPartnerWebhooks", "listRegisterUsersForDevice", "listRegisterSessionsForDevice", "pairRegisterDevice", "registerPinLogin", "registerUserLogin", "renewRegisterSession", "requestCustomerSignature", "sendPartnerCustomerFonLink", "sendPartnerWebhookTest", "sendReceiptEmail", "setMyKasseSettings", "setMyRegisterDeviceSettings", "stripeCaptureIntent", "unpairRegisterDevice", "rotatePartnerWebhookSecret", "updatePartnerWebhook"];
16
+ export declare const AUFRUFE: readonly ["activateCashregister", "cancelInvoice", "cancelReceipt", "createCreditNote", "createCustomer", "createCustomerCashregister", "createPartnerCustomer", "checkPartnerCustomerEmail", "createPartnerWebhook", "createPaymentLinkStripe", "createPrintJob", "createReceipt", "deletePartnerWebhook", "downloadDailyReport", "downloadReport", "endRegisterSession", "financeWebService", "generateFullReceiptId", "getCustomer", "getCustomerCredentials", "getCustomerSignatureStatus", "getFirstReceiptDate", "getInvoice", "getInvoicePdf", "getInvoiceXml", "getKasseSettings", "getPartnerCustomer", "getPartnerInfo", "getPrintJob", "getReceipt", "hobexPayApi", "hobexRefundApi", "issueInvoice", "listCustomerCashregisters", "listInvoices", "listMyArticleGroups", "listMyArticles", "listMyCashregisters", "listMyPrinters", "listMyReceipts", "listMyTipRecipients", "listPartnerCustomers", "listPartnerWebhookDeliveries", "listPartnerWebhooks", "listRegisterUsersForDevice", "listRegisterSessionsForDevice", "pairRegisterDevice", "registerPinLogin", "registerUserLogin", "renewRegisterSession", "requestCustomerSignature", "searchCustomers", "sendPartnerCustomerFonLink", "sendPartnerWebhookTest", "sendReceiptEmail", "setMyKasseSettings", "setMyRegisterDeviceSettings", "stripeCaptureIntent", "unpairRegisterDevice", "rotatePartnerWebhookSecret", "updateCustomer", "updatePartnerWebhook"];
17
17
  export type Aufruf = typeof AUFRUFE[number];
18
18
  /** Wie [KasseneckTransport], nur mit bekanntem Aufrufnamen. Nicht exportiert nach aussen. */
19
19
  export type InternerTransport = <T = unknown>(functionName: Aufruf, params?: Record<string, unknown>, extraBodyFields?: TransportBodyFields, secretParams?: readonly string[]) => Promise<T>;
@@ -3,7 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AUFRUFE = void 0;
4
4
  exports.AUFRUFE = [
5
5
  'activateCashregister',
6
+ 'cancelInvoice',
6
7
  'cancelReceipt',
8
+ 'createCreditNote',
9
+ 'createCustomer',
7
10
  'createCustomerCashregister',
8
11
  'createPartnerCustomer',
9
12
  'checkPartnerCustomerEmail',
@@ -17,9 +20,13 @@ exports.AUFRUFE = [
17
20
  'endRegisterSession',
18
21
  'financeWebService',
19
22
  'generateFullReceiptId',
23
+ 'getCustomer',
20
24
  'getCustomerCredentials',
21
25
  'getCustomerSignatureStatus',
22
26
  'getFirstReceiptDate',
27
+ 'getInvoice',
28
+ 'getInvoicePdf',
29
+ 'getInvoiceXml',
23
30
  'getKasseSettings',
24
31
  'getPartnerCustomer',
25
32
  'getPartnerInfo',
@@ -27,7 +34,9 @@ exports.AUFRUFE = [
27
34
  'getReceipt',
28
35
  'hobexPayApi',
29
36
  'hobexRefundApi',
37
+ 'issueInvoice',
30
38
  'listCustomerCashregisters',
39
+ 'listInvoices',
31
40
  'listMyArticleGroups',
32
41
  'listMyArticles',
33
42
  'listMyCashregisters',
@@ -44,6 +53,7 @@ exports.AUFRUFE = [
44
53
  'registerUserLogin',
45
54
  'renewRegisterSession',
46
55
  'requestCustomerSignature',
56
+ 'searchCustomers',
47
57
  'sendPartnerCustomerFonLink',
48
58
  'sendPartnerWebhookTest',
49
59
  'sendReceiptEmail',
@@ -52,5 +62,6 @@ exports.AUFRUFE = [
52
62
  'stripeCaptureIntent',
53
63
  'unpairRegisterDevice',
54
64
  'rotatePartnerWebhookSecret',
65
+ 'updateCustomer',
55
66
  'updatePartnerWebhook',
56
67
  ];
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Fassade ueber den Aufrufen der Rechnungs-API: Schluessel einmal binden, dann rufen.
3
+ *
4
+ * Wie [createPartnerApi] bewusst **keine** Klasse — die Aufrufe sind freie
5
+ * Funktionen (endpunkte.ts) und bleiben einzeln importierbar.
6
+ */
7
+ import { type FetchLike } from '../client/transport.js';
8
+ import type { EInvoiceFormat } from './vertrag.js';
9
+ import type { CancelInvoiceRequest, CancelResult, CreditNoteRequest, CreditNoteResult, Customer, CustomerInput, CustomerPage, CustomerSearch, InvoiceDetail, InvoiceListQuery, InvoicePage, IssueInvoiceRequest, IssueResult } from './typen.js';
10
+ export interface RechnungApiOptions {
11
+ /** `api_key` des Kontos (`kr_live_…` / `kr_test_…`). Gehoert auf einen Server. */
12
+ apiKey: string;
13
+ /** Abweichende Basis-URL; Vorgabe `https://api.kasseneck.at/v1`. */
14
+ baseUrl?: string;
15
+ /** Zeitlimit je Aufruf in Millisekunden. */
16
+ timeoutMs?: number;
17
+ /** Eigene `fetch`-Umsetzung (Tests, Proxys). */
18
+ fetch?: FetchLike;
19
+ }
20
+ export interface RechnungApi {
21
+ createCustomer(customer: CustomerInput, optionen?: {
22
+ idempotencyKey?: string;
23
+ }): Promise<Customer>;
24
+ getCustomer(kennung: {
25
+ customerId: string;
26
+ } | {
27
+ externalId: string;
28
+ }): Promise<Customer>;
29
+ updateCustomer(customerId: string, patch: Partial<CustomerInput>): Promise<Customer>;
30
+ searchCustomers(suche: CustomerSearch): Promise<CustomerPage>;
31
+ issueInvoice(anfrage: IssueInvoiceRequest): Promise<IssueResult>;
32
+ cancelInvoice(anfrage: CancelInvoiceRequest): Promise<CancelResult>;
33
+ createCreditNote(anfrage: CreditNoteRequest): Promise<CreditNoteResult>;
34
+ getInvoice(kennung: {
35
+ invoiceId: string;
36
+ } | {
37
+ number: string;
38
+ }): Promise<InvoiceDetail>;
39
+ listInvoices(abfrage?: InvoiceListQuery): Promise<InvoicePage>;
40
+ getInvoicePdf(invoiceId: string): Promise<Uint8Array>;
41
+ getInvoiceXml(invoiceId: string, format?: EInvoiceFormat): Promise<string>;
42
+ }
43
+ export declare function createRechnungApi(optionen: RechnungApiOptions): RechnungApi;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /**
3
+ * Fassade ueber den Aufrufen der Rechnungs-API: Schluessel einmal binden, dann rufen.
4
+ *
5
+ * Wie [createPartnerApi] bewusst **keine** Klasse — die Aufrufe sind freie
6
+ * Funktionen (endpunkte.ts) und bleiben einzeln importierbar.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createRechnungApi = createRechnungApi;
10
+ const transport_js_1 = require("../client/transport.js");
11
+ const auth_js_1 = require("./auth.js");
12
+ const endpunkte_js_1 = require("./endpunkte.js");
13
+ function createRechnungApi(optionen) {
14
+ const transportOptionen = {
15
+ auth: (0, auth_js_1.rechnungKeyAuth)({ apiKey: optionen.apiKey }),
16
+ baseUrl: optionen.baseUrl,
17
+ timeoutMs: optionen.timeoutMs,
18
+ fetch: optionen.fetch,
19
+ };
20
+ const rufen = (0, transport_js_1.createTransport)(transportOptionen);
21
+ const rufenBinaer = (0, transport_js_1.createBinaryTransport)(transportOptionen);
22
+ return {
23
+ createCustomer: (customer, o) => (0, endpunkte_js_1.createCustomer)(rufen, customer, o),
24
+ getCustomer: (kennung) => (0, endpunkte_js_1.getCustomer)(rufen, kennung),
25
+ updateCustomer: (id, patch) => (0, endpunkte_js_1.updateCustomer)(rufen, id, patch),
26
+ searchCustomers: (suche) => (0, endpunkte_js_1.searchCustomers)(rufen, suche),
27
+ issueInvoice: (anfrage) => (0, endpunkte_js_1.issueInvoice)(rufen, anfrage),
28
+ cancelInvoice: (anfrage) => (0, endpunkte_js_1.cancelInvoice)(rufen, anfrage),
29
+ createCreditNote: (anfrage) => (0, endpunkte_js_1.createCreditNote)(rufen, anfrage),
30
+ getInvoice: (kennung) => (0, endpunkte_js_1.getInvoice)(rufen, kennung),
31
+ listInvoices: (abfrage) => (0, endpunkte_js_1.listInvoices)(rufen, abfrage),
32
+ getInvoicePdf: (id) => (0, endpunkte_js_1.getInvoicePdf)(rufenBinaer, id),
33
+ getInvoiceXml: (id, format) => (0, endpunkte_js_1.getInvoiceXml)(rufen, id, format),
34
+ };
35
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Anmeldung fuer die Rechnungs-API: der `api_key` des Kontos als Bearer.
3
+ *
4
+ * Anders als `apiKeyAuth` **ohne** `cashregister-token` — eine Rechnung
5
+ * entsteht nicht an einer Kasse, sondern am Konto.
6
+ *
7
+ * **Der Schluessel gehoert auf einen Server.** Mit ihm entstehen festgeschriebene
8
+ * Rechnungen mit fortlaufender Nummer, die sich nur noch per Gutschrift
9
+ * korrigieren lassen.
10
+ *
11
+ * Geprueft wird nur, was ohne Netz sicher falsch ist: ein leerer Wert, ein
12
+ * Partner-Schluessel (`pk_…`) oder ein Kassen-Token (`cb_…`). Die Form des
13
+ * Kontoschluessels selbst bleibt offen, weil das Backend neben `kr_<env>_…`
14
+ * weiterhin aeltere Formen annimmt. Die Meldung nennt nie den Wert, nur seine Art.
15
+ */
16
+ import type { KasseneckAuth } from '../client/auth.js';
17
+ export interface RechnungKeyAuthOptions {
18
+ /** `api_key` des Kontos, z. B. `kr_live_…` oder `kr_test_…`. */
19
+ apiKey: string;
20
+ }
21
+ export declare function rechnungKeyAuth(options: RechnungKeyAuthOptions): KasseneckAuth;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ /**
3
+ * Anmeldung fuer die Rechnungs-API: der `api_key` des Kontos als Bearer.
4
+ *
5
+ * Anders als `apiKeyAuth` **ohne** `cashregister-token` — eine Rechnung
6
+ * entsteht nicht an einer Kasse, sondern am Konto.
7
+ *
8
+ * **Der Schluessel gehoert auf einen Server.** Mit ihm entstehen festgeschriebene
9
+ * Rechnungen mit fortlaufender Nummer, die sich nur noch per Gutschrift
10
+ * korrigieren lassen.
11
+ *
12
+ * Geprueft wird nur, was ohne Netz sicher falsch ist: ein leerer Wert, ein
13
+ * Partner-Schluessel (`pk_…`) oder ein Kassen-Token (`cb_…`). Die Form des
14
+ * Kontoschluessels selbst bleibt offen, weil das Backend neben `kr_<env>_…`
15
+ * weiterhin aeltere Formen annimmt. Die Meldung nennt nie den Wert, nur seine Art.
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.rechnungKeyAuth = rechnungKeyAuth;
19
+ const errors_js_1 = require("../client/errors.js");
20
+ function rechnungKeyAuth(options) {
21
+ const schluessel = typeof options?.apiKey === 'string' ? options.apiKey.trim() : '';
22
+ if (!schluessel) {
23
+ throw new errors_js_1.KasseneckAuthError('rechnungKeyAuth: apiKey fehlt');
24
+ }
25
+ if (/^pk_(live|test)_/i.test(schluessel)) {
26
+ throw new errors_js_1.KasseneckAuthError('rechnungKeyAuth: das ist ein Partner-Schluessel (pk_…) — die Rechnungs-API nimmt den api_key des Kontos (kr_…)');
27
+ }
28
+ if (/^cb_(live|test)_/i.test(schluessel)) {
29
+ throw new errors_js_1.KasseneckAuthError('rechnungKeyAuth: das ist ein Kassen-Token (cb_…) — die Rechnungs-API nimmt den api_key des Kontos (kr_…)');
30
+ }
31
+ // Pro Aufruf ein frisches Objekt, wie bei den anderen Anmeldungen.
32
+ return () => ({
33
+ headers: { Authorization: `Bearer ${schluessel}` },
34
+ params: {},
35
+ });
36
+ }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Die Aufrufe der Rechnungs-API — Kunden, Rechnungen, Gutschriften, Dateien.
3
+ *
4
+ * Jede Funktion nimmt den Transport als ersten Parameter und ist einzeln
5
+ * importierbar; die Fassade [createRechnungApi] bindet ihn nur einmal.
6
+ *
7
+ * **Geprueft wird hier nichts Fachliches.** Die Anfrage geht unveraendert an
8
+ * das Backend, das sie gegen denselben Vertrag prueft (`vertrag.ts`) und einen
9
+ * Formfehler als `validation` mit `errors[]` zurueckgibt — zwei Pruefungen
10
+ * hiessen zwei Wahrheiten, von denen eine veraltet.
11
+ *
12
+ * **Nicht automatisch wiederholen.** Wer nach einem Zeitlimit erneut
13
+ * ausstellt, tut das mit **demselben** `idempotencyKey`: dann kommt die schon
14
+ * ausgestellte Rechnung zurueck (`replayed: true`) statt einer zweiten.
15
+ *
16
+ * Nach dem Senden wird nichts hart gecastet: fehlt ein zugesagtes Feld, wirft
17
+ * der Aufruf `KasseneckValidationError` mit `scope:'response'`.
18
+ */
19
+ import type { InternerBinaerTransport, InternerTransport } from '../client/aufrufe.js';
20
+ import type { EInvoiceFormat } from './vertrag.js';
21
+ import type { CancelInvoiceRequest, CancelResult, CreditNoteRequest, CreditNoteResult, Customer, CustomerInput, CustomerPage, CustomerSearch, InvoiceDetail, InvoiceListQuery, InvoicePage, IssueInvoiceRequest, IssueResult } from './typen.js';
22
+ export declare function createCustomer(rufen: InternerTransport, customer: CustomerInput, optionen?: {
23
+ idempotencyKey?: string;
24
+ }): Promise<Customer>;
25
+ export declare function getCustomer(rufen: InternerTransport, kennung: {
26
+ customerId: string;
27
+ } | {
28
+ externalId: string;
29
+ }): Promise<Customer>;
30
+ export declare function updateCustomer(rufen: InternerTransport, customerId: string, patch: Partial<CustomerInput>): Promise<Customer>;
31
+ export declare function searchCustomers(rufen: InternerTransport, suche: CustomerSearch): Promise<CustomerPage>;
32
+ export declare function issueInvoice(rufen: InternerTransport, anfrage: IssueInvoiceRequest): Promise<IssueResult>;
33
+ export declare function cancelInvoice(rufen: InternerTransport, anfrage: CancelInvoiceRequest): Promise<CancelResult>;
34
+ export declare function createCreditNote(rufen: InternerTransport, anfrage: CreditNoteRequest): Promise<CreditNoteResult>;
35
+ export declare function getInvoice(rufen: InternerTransport, kennung: {
36
+ invoiceId: string;
37
+ } | {
38
+ number: string;
39
+ }): Promise<InvoiceDetail>;
40
+ export declare function listInvoices(rufen: InternerTransport, abfrage?: InvoiceListQuery): Promise<InvoicePage>;
41
+ /** Das PDF der Rechnung (bei Gutschriften: der Gutschrift), mit eingebetteter Factur-X-Datei. */
42
+ export declare function getInvoicePdf(rufenBinaer: InternerBinaerTransport, invoiceId: string): Promise<Uint8Array>;
43
+ /**
44
+ * Die E-Rechnung als XML-Text. Sie kommt im gewohnten Umschlag (`data.xml`)
45
+ * und nicht als rohe Datei: so bleibt ein fachlicher Fehler
46
+ * (`einvoice_incomplete` mit `missing[]`) ein gewoehnlicher Fehler.
47
+ */
48
+ export declare function getInvoiceXml(rufen: InternerTransport, invoiceId: string, format?: EInvoiceFormat): Promise<string>;
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ /**
3
+ * Die Aufrufe der Rechnungs-API — Kunden, Rechnungen, Gutschriften, Dateien.
4
+ *
5
+ * Jede Funktion nimmt den Transport als ersten Parameter und ist einzeln
6
+ * importierbar; die Fassade [createRechnungApi] bindet ihn nur einmal.
7
+ *
8
+ * **Geprueft wird hier nichts Fachliches.** Die Anfrage geht unveraendert an
9
+ * das Backend, das sie gegen denselben Vertrag prueft (`vertrag.ts`) und einen
10
+ * Formfehler als `validation` mit `errors[]` zurueckgibt — zwei Pruefungen
11
+ * hiessen zwei Wahrheiten, von denen eine veraltet.
12
+ *
13
+ * **Nicht automatisch wiederholen.** Wer nach einem Zeitlimit erneut
14
+ * ausstellt, tut das mit **demselben** `idempotencyKey`: dann kommt die schon
15
+ * ausgestellte Rechnung zurueck (`replayed: true`) statt einer zweiten.
16
+ *
17
+ * Nach dem Senden wird nichts hart gecastet: fehlt ein zugesagtes Feld, wirft
18
+ * der Aufruf `KasseneckValidationError` mit `scope:'response'`.
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.createCustomer = createCustomer;
22
+ exports.getCustomer = getCustomer;
23
+ exports.updateCustomer = updateCustomer;
24
+ exports.searchCustomers = searchCustomers;
25
+ exports.issueInvoice = issueInvoice;
26
+ exports.cancelInvoice = cancelInvoice;
27
+ exports.createCreditNote = createCreditNote;
28
+ exports.getInvoice = getInvoice;
29
+ exports.listInvoices = listInvoices;
30
+ exports.getInvoicePdf = getInvoicePdf;
31
+ exports.getInvoiceXml = getInvoiceXml;
32
+ const errors_js_1 = require("../client/errors.js");
33
+ function objekt(wert) {
34
+ return wert !== null && typeof wert === 'object' && !Array.isArray(wert)
35
+ ? wert
36
+ : {};
37
+ }
38
+ /** Ein zugesagtes Objektfeld der Antwort — oder ein Antwortfehler. */
39
+ function pflichtObjekt(aufruf, daten, feld) {
40
+ const wert = objekt(daten)[feld];
41
+ if (wert === null || typeof wert !== 'object' || Array.isArray(wert)) {
42
+ throw new errors_js_1.KasseneckValidationError(aufruf, `Antwort ohne ${feld}`, 'response');
43
+ }
44
+ return wert;
45
+ }
46
+ /** Eine zugesagte Liste samt Cursor — oder ein Antwortfehler. */
47
+ function seite(aufruf, daten, feld) {
48
+ const o = objekt(daten);
49
+ if (!Array.isArray(o[feld])) {
50
+ throw new errors_js_1.KasseneckValidationError(aufruf, `Antwort ohne ${feld}`, 'response');
51
+ }
52
+ return { eintraege: o[feld], nextCursor: typeof o['nextCursor'] === 'string' ? o['nextCursor'] : null };
53
+ }
54
+ const zahl = (wert) => (typeof wert === 'number' && Number.isFinite(wert) ? wert : 0);
55
+ /** Anfrageobjekt als Nutzlast — flache Kopie, damit der Aufrufer sein Objekt behaelt. */
56
+ const nutzlast = (anfrage) => ({ ...anfrage });
57
+ // ---- Kunden -----------------------------------------------------------------
58
+ async function createCustomer(rufen, customer, optionen = {}) {
59
+ const params = { customer };
60
+ if (optionen.idempotencyKey)
61
+ params['idempotencyKey'] = optionen.idempotencyKey;
62
+ const daten = await rufen('createCustomer', params);
63
+ return pflichtObjekt('createCustomer', daten, 'customer');
64
+ }
65
+ async function getCustomer(rufen, kennung) {
66
+ const daten = await rufen('getCustomer', nutzlast(kennung));
67
+ return pflichtObjekt('getCustomer', daten, 'customer');
68
+ }
69
+ async function updateCustomer(rufen, customerId, patch) {
70
+ const daten = await rufen('updateCustomer', { customerId, customer: patch });
71
+ return pflichtObjekt('updateCustomer', daten, 'customer');
72
+ }
73
+ async function searchCustomers(rufen, suche) {
74
+ const daten = await rufen('searchCustomers', nutzlast(suche));
75
+ const { eintraege, nextCursor } = seite('searchCustomers', daten, 'customers');
76
+ return { customers: eintraege, nextCursor };
77
+ }
78
+ // ---- Rechnungen -------------------------------------------------------------
79
+ async function issueInvoice(rufen, anfrage) {
80
+ const daten = await rufen('issueInvoice', nutzlast(anfrage));
81
+ return {
82
+ invoice: pflichtObjekt('issueInvoice', daten, 'invoice'),
83
+ replayed: objekt(daten)['replayed'] === true,
84
+ };
85
+ }
86
+ async function cancelInvoice(rufen, anfrage) {
87
+ const daten = await rufen('cancelInvoice', nutzlast(anfrage));
88
+ return {
89
+ creditNote: pflichtObjekt('cancelInvoice', daten, 'creditNote'),
90
+ original: pflichtObjekt('cancelInvoice', daten, 'original'),
91
+ originalPaidCents: zahl(objekt(daten)['originalPaidCents']),
92
+ replayed: objekt(daten)['replayed'] === true,
93
+ };
94
+ }
95
+ async function createCreditNote(rufen, anfrage) {
96
+ const daten = await rufen('createCreditNote', nutzlast(anfrage));
97
+ return {
98
+ creditNote: pflichtObjekt('createCreditNote', daten, 'creditNote'),
99
+ remainingCents: zahl(objekt(daten)['remainingCents']),
100
+ replayed: objekt(daten)['replayed'] === true,
101
+ };
102
+ }
103
+ async function getInvoice(rufen, kennung) {
104
+ const daten = await rufen('getInvoice', nutzlast(kennung));
105
+ return pflichtObjekt('getInvoice', daten, 'invoice');
106
+ }
107
+ async function listInvoices(rufen, abfrage = {}) {
108
+ const daten = await rufen('listInvoices', nutzlast(abfrage));
109
+ const { eintraege, nextCursor } = seite('listInvoices', daten, 'invoices');
110
+ return { invoices: eintraege, nextCursor };
111
+ }
112
+ // ---- Dateien ----------------------------------------------------------------
113
+ /** Das PDF der Rechnung (bei Gutschriften: der Gutschrift), mit eingebetteter Factur-X-Datei. */
114
+ function getInvoicePdf(rufenBinaer, invoiceId) {
115
+ return rufenBinaer('getInvoicePdf', { invoiceId });
116
+ }
117
+ /**
118
+ * Die E-Rechnung als XML-Text. Sie kommt im gewohnten Umschlag (`data.xml`)
119
+ * und nicht als rohe Datei: so bleibt ein fachlicher Fehler
120
+ * (`einvoice_incomplete` mit `missing[]`) ein gewoehnlicher Fehler.
121
+ */
122
+ async function getInvoiceXml(rufen, invoiceId, format = 'ubl') {
123
+ const daten = await rufen('getInvoiceXml', { invoiceId, format });
124
+ const xml = objekt(daten)['xml'];
125
+ if (typeof xml !== 'string' || !xml) {
126
+ throw new errors_js_1.KasseneckValidationError('getInvoiceXml', 'Antwort ohne xml', 'response');
127
+ }
128
+ return xml;
129
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Fehler der Rechnungs-API auswerten — am Code, nie am Text.
3
+ *
4
+ * Es zaehlen nur Codes aus dem Vertrag ([INVOICE_ERROR_CODES]). Ein fremder
5
+ * Code (z. B. aus einer vorgeschalteten Schicht) ist fuer diese Helfer kein
6
+ * Rechnungs-Fehler: wer darauf verzweigt, soll es bewusst ueber
7
+ * `KasseneckApiError.code` tun.
8
+ */
9
+ import { type InvoiceErrorCode } from './vertrag.js';
10
+ /** Der Fehlercode eines geworfenen Fehlers — `undefined`, wenn es keiner der Rechnungs-API ist. */
11
+ export declare function rechnungFehlerCode(error: unknown): InvoiceErrorCode | undefined;
12
+ /** Kurzform fuer `catch (e) { if (istRechnungFehler(e, 'customer_exists')) … }`. */
13
+ export declare function istRechnungFehler(error: unknown, code: InvoiceErrorCode): boolean;
14
+ /** Ein Feldfehler aus `data.errors[]` einer `validation`-Antwort. */
15
+ export interface RechnungFeldFehler {
16
+ /** Feldpfad in der gesendeten Anfrage, z. B. `items[2].vatRate` oder `customer.vatId`. */
17
+ field: string;
18
+ message: string;
19
+ }
20
+ /** Die Feldfehler einer `validation`-Antwort; leer, wenn es keine sind. */
21
+ export declare function rechnungFeldFehler(error: unknown): RechnungFeldFehler[];
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ /**
3
+ * Fehler der Rechnungs-API auswerten — am Code, nie am Text.
4
+ *
5
+ * Es zaehlen nur Codes aus dem Vertrag ([INVOICE_ERROR_CODES]). Ein fremder
6
+ * Code (z. B. aus einer vorgeschalteten Schicht) ist fuer diese Helfer kein
7
+ * Rechnungs-Fehler: wer darauf verzweigt, soll es bewusst ueber
8
+ * `KasseneckApiError.code` tun.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.rechnungFehlerCode = rechnungFehlerCode;
12
+ exports.istRechnungFehler = istRechnungFehler;
13
+ exports.rechnungFeldFehler = rechnungFeldFehler;
14
+ const errors_js_1 = require("../client/errors.js");
15
+ const vertrag_js_1 = require("./vertrag.js");
16
+ const BEKANNT = new Set(vertrag_js_1.INVOICE_ERROR_CODES);
17
+ /** Der Fehlercode eines geworfenen Fehlers — `undefined`, wenn es keiner der Rechnungs-API ist. */
18
+ function rechnungFehlerCode(error) {
19
+ if (!(error instanceof errors_js_1.KasseneckApiError))
20
+ return undefined;
21
+ const code = error.code;
22
+ return code !== undefined && BEKANNT.has(code) ? code : undefined;
23
+ }
24
+ /** Kurzform fuer `catch (e) { if (istRechnungFehler(e, 'customer_exists')) … }`. */
25
+ function istRechnungFehler(error, code) {
26
+ return rechnungFehlerCode(error) === code;
27
+ }
28
+ /** Die Feldfehler einer `validation`-Antwort; leer, wenn es keine sind. */
29
+ function rechnungFeldFehler(error) {
30
+ if (!(error instanceof errors_js_1.KasseneckApiError))
31
+ return [];
32
+ const roh = error.details['errors'];
33
+ if (!Array.isArray(roh))
34
+ return [];
35
+ const raus = [];
36
+ for (const eintrag of roh) {
37
+ if (eintrag === null || typeof eintrag !== 'object')
38
+ continue;
39
+ const { field, message } = eintrag;
40
+ if (typeof field === 'string' && typeof message === 'string')
41
+ raus.push({ field, message });
42
+ }
43
+ return raus;
44
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * `@kreiseck/kasseneck-api/rechnung` — Rechnungen (§ 11 UStG, keine Belege)
3
+ * und Kunden ueber die Rechnungs-API.
4
+ *
5
+ * Ein eigener Unterpfad wie `partner`: der `api_key` eines Kontos, mit dem
6
+ * Rechnungen ausgestellt werden, gehoert auf einen **Server** und soll nicht
7
+ * versehentlich in ein Browser-Buendel der Kasse wandern.
8
+ *
9
+ * Die Beschreibung der Endpunkte steht in der Referenz des Backends
10
+ * (`docs/api/rechnungen.md`). Was hier steht, ist der Vertrag als Daten und die
11
+ * Benutzung des Clients.
12
+ */
13
+ export { createRechnungApi, type RechnungApi, type RechnungApiOptions } from './api.js';
14
+ export { rechnungKeyAuth, type RechnungKeyAuthOptions } from './auth.js';
15
+ export { istRechnungFehler, rechnungFehlerCode, rechnungFeldFehler, type RechnungFeldFehler, } from './fehler.js';
16
+ export { cancelInvoice, createCreditNote, createCustomer, getCustomer, getInvoice, getInvoicePdf, getInvoiceXml, issueInvoice, listInvoices, searchCustomers, updateCustomer, } from './endpunkte.js';
17
+ export type { CancelInvoiceRequest, CancelResult, CreditNoteRequest, CreditNoteResult, Customer, CustomerInput, CustomerPage, CustomerSearch, EInvoiceStatus, Invoice, InvoiceDetail, InvoiceItem, InvoiceItemInput, InvoiceListQuery, InvoicePage, InvoiceRecipient, InvoiceTotals, IssueInvoiceRequest, IssueResult, } from './typen.js';
18
+ export { RECHNUNG_VERTRAG_VERSION, RECHNUNG_AUFRUFE, INVOICE_ERROR_CODES, CREDIT_NOTE_REASONS, TAX_SCHEMES, PRICE_MODES, VAT_RATES, CUSTOMER_TYPES, INVOICE_LIST_STATUS, DOC_TYPES, EINVOICE_FORMATS, KUNDE_FELDER, POSITION_FELDER, RECHNUNG_ANFRAGEN, RECHNUNG_GENAU_EINS, RECHNUNG_MINDESTENS_EINS, type RechnungAufruf, type InvoiceErrorCode, type CreditNoteReason, type TaxScheme, type PriceMode, type VatRatePercent, type CustomerType, type InvoiceListStatus, type DocType, type EInvoiceFormat, type Format, type Feld, } from './vertrag.js';
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /**
3
+ * `@kreiseck/kasseneck-api/rechnung` — Rechnungen (§ 11 UStG, keine Belege)
4
+ * und Kunden ueber die Rechnungs-API.
5
+ *
6
+ * Ein eigener Unterpfad wie `partner`: der `api_key` eines Kontos, mit dem
7
+ * Rechnungen ausgestellt werden, gehoert auf einen **Server** und soll nicht
8
+ * versehentlich in ein Browser-Buendel der Kasse wandern.
9
+ *
10
+ * Die Beschreibung der Endpunkte steht in der Referenz des Backends
11
+ * (`docs/api/rechnungen.md`). Was hier steht, ist der Vertrag als Daten und die
12
+ * Benutzung des Clients.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.RECHNUNG_MINDESTENS_EINS = exports.RECHNUNG_GENAU_EINS = exports.RECHNUNG_ANFRAGEN = exports.POSITION_FELDER = exports.KUNDE_FELDER = exports.EINVOICE_FORMATS = exports.DOC_TYPES = exports.INVOICE_LIST_STATUS = exports.CUSTOMER_TYPES = exports.VAT_RATES = exports.PRICE_MODES = exports.TAX_SCHEMES = exports.CREDIT_NOTE_REASONS = exports.INVOICE_ERROR_CODES = exports.RECHNUNG_AUFRUFE = exports.RECHNUNG_VERTRAG_VERSION = exports.updateCustomer = exports.searchCustomers = exports.listInvoices = exports.issueInvoice = exports.getInvoiceXml = exports.getInvoicePdf = exports.getInvoice = exports.getCustomer = exports.createCustomer = exports.createCreditNote = exports.cancelInvoice = exports.rechnungFeldFehler = exports.rechnungFehlerCode = exports.istRechnungFehler = exports.rechnungKeyAuth = exports.createRechnungApi = void 0;
16
+ var api_js_1 = require("./api.js");
17
+ Object.defineProperty(exports, "createRechnungApi", { enumerable: true, get: function () { return api_js_1.createRechnungApi; } });
18
+ var auth_js_1 = require("./auth.js");
19
+ Object.defineProperty(exports, "rechnungKeyAuth", { enumerable: true, get: function () { return auth_js_1.rechnungKeyAuth; } });
20
+ var fehler_js_1 = require("./fehler.js");
21
+ Object.defineProperty(exports, "istRechnungFehler", { enumerable: true, get: function () { return fehler_js_1.istRechnungFehler; } });
22
+ Object.defineProperty(exports, "rechnungFehlerCode", { enumerable: true, get: function () { return fehler_js_1.rechnungFehlerCode; } });
23
+ Object.defineProperty(exports, "rechnungFeldFehler", { enumerable: true, get: function () { return fehler_js_1.rechnungFeldFehler; } });
24
+ var endpunkte_js_1 = require("./endpunkte.js");
25
+ Object.defineProperty(exports, "cancelInvoice", { enumerable: true, get: function () { return endpunkte_js_1.cancelInvoice; } });
26
+ Object.defineProperty(exports, "createCreditNote", { enumerable: true, get: function () { return endpunkte_js_1.createCreditNote; } });
27
+ Object.defineProperty(exports, "createCustomer", { enumerable: true, get: function () { return endpunkte_js_1.createCustomer; } });
28
+ Object.defineProperty(exports, "getCustomer", { enumerable: true, get: function () { return endpunkte_js_1.getCustomer; } });
29
+ Object.defineProperty(exports, "getInvoice", { enumerable: true, get: function () { return endpunkte_js_1.getInvoice; } });
30
+ Object.defineProperty(exports, "getInvoicePdf", { enumerable: true, get: function () { return endpunkte_js_1.getInvoicePdf; } });
31
+ Object.defineProperty(exports, "getInvoiceXml", { enumerable: true, get: function () { return endpunkte_js_1.getInvoiceXml; } });
32
+ Object.defineProperty(exports, "issueInvoice", { enumerable: true, get: function () { return endpunkte_js_1.issueInvoice; } });
33
+ Object.defineProperty(exports, "listInvoices", { enumerable: true, get: function () { return endpunkte_js_1.listInvoices; } });
34
+ Object.defineProperty(exports, "searchCustomers", { enumerable: true, get: function () { return endpunkte_js_1.searchCustomers; } });
35
+ Object.defineProperty(exports, "updateCustomer", { enumerable: true, get: function () { return endpunkte_js_1.updateCustomer; } });
36
+ var vertrag_js_1 = require("./vertrag.js");
37
+ Object.defineProperty(exports, "RECHNUNG_VERTRAG_VERSION", { enumerable: true, get: function () { return vertrag_js_1.RECHNUNG_VERTRAG_VERSION; } });
38
+ Object.defineProperty(exports, "RECHNUNG_AUFRUFE", { enumerable: true, get: function () { return vertrag_js_1.RECHNUNG_AUFRUFE; } });
39
+ Object.defineProperty(exports, "INVOICE_ERROR_CODES", { enumerable: true, get: function () { return vertrag_js_1.INVOICE_ERROR_CODES; } });
40
+ Object.defineProperty(exports, "CREDIT_NOTE_REASONS", { enumerable: true, get: function () { return vertrag_js_1.CREDIT_NOTE_REASONS; } });
41
+ Object.defineProperty(exports, "TAX_SCHEMES", { enumerable: true, get: function () { return vertrag_js_1.TAX_SCHEMES; } });
42
+ Object.defineProperty(exports, "PRICE_MODES", { enumerable: true, get: function () { return vertrag_js_1.PRICE_MODES; } });
43
+ Object.defineProperty(exports, "VAT_RATES", { enumerable: true, get: function () { return vertrag_js_1.VAT_RATES; } });
44
+ Object.defineProperty(exports, "CUSTOMER_TYPES", { enumerable: true, get: function () { return vertrag_js_1.CUSTOMER_TYPES; } });
45
+ Object.defineProperty(exports, "INVOICE_LIST_STATUS", { enumerable: true, get: function () { return vertrag_js_1.INVOICE_LIST_STATUS; } });
46
+ Object.defineProperty(exports, "DOC_TYPES", { enumerable: true, get: function () { return vertrag_js_1.DOC_TYPES; } });
47
+ Object.defineProperty(exports, "EINVOICE_FORMATS", { enumerable: true, get: function () { return vertrag_js_1.EINVOICE_FORMATS; } });
48
+ Object.defineProperty(exports, "KUNDE_FELDER", { enumerable: true, get: function () { return vertrag_js_1.KUNDE_FELDER; } });
49
+ Object.defineProperty(exports, "POSITION_FELDER", { enumerable: true, get: function () { return vertrag_js_1.POSITION_FELDER; } });
50
+ Object.defineProperty(exports, "RECHNUNG_ANFRAGEN", { enumerable: true, get: function () { return vertrag_js_1.RECHNUNG_ANFRAGEN; } });
51
+ Object.defineProperty(exports, "RECHNUNG_GENAU_EINS", { enumerable: true, get: function () { return vertrag_js_1.RECHNUNG_GENAU_EINS; } });
52
+ Object.defineProperty(exports, "RECHNUNG_MINDESTENS_EINS", { enumerable: true, get: function () { return vertrag_js_1.RECHNUNG_MINDESTENS_EINS; } });