@kreiseck/kasseneck-api 1.3.0 → 1.5.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 (88) hide show
  1. package/CHANGELOG.md +176 -0
  2. package/README.md +293 -1
  3. package/dist/cjs/client/aufrufe.d.ts +2 -2
  4. package/dist/cjs/client/aufrufe.js +58 -0
  5. package/dist/cjs/inventory/api.d.ts +61 -0
  6. package/dist/cjs/inventory/api.js +54 -0
  7. package/dist/cjs/inventory/auth.d.ts +17 -0
  8. package/dist/cjs/inventory/auth.js +27 -0
  9. package/dist/cjs/inventory/endpunkte.d.ts +91 -0
  10. package/dist/cjs/inventory/endpunkte.js +290 -0
  11. package/dist/cjs/inventory/fehler.d.ts +43 -0
  12. package/dist/cjs/inventory/fehler.js +66 -0
  13. package/dist/cjs/inventory/index.d.ts +21 -0
  14. package/dist/cjs/inventory/index.js +94 -0
  15. package/dist/cjs/inventory/lesen.d.ts +45 -0
  16. package/dist/cjs/inventory/lesen.js +424 -0
  17. package/dist/cjs/inventory/schreiben.d.ts +83 -0
  18. package/dist/cjs/inventory/schreiben.js +315 -0
  19. package/dist/cjs/inventory/typen.d.ts +679 -0
  20. package/dist/cjs/inventory/typen.js +14 -0
  21. package/dist/cjs/inventory/vertrag.d.ts +136 -0
  22. package/dist/cjs/inventory/vertrag.js +291 -0
  23. package/dist/cjs/inventory/webhook.d.ts +52 -0
  24. package/dist/cjs/inventory/webhook.js +116 -0
  25. package/dist/cjs/invoice/index.d.ts +2 -2
  26. package/dist/cjs/invoice/index.js +2 -1
  27. package/dist/cjs/invoice/typen.d.ts +46 -2
  28. package/dist/cjs/invoice/vertrag.d.ts +19 -5
  29. package/dist/cjs/invoice/vertrag.js +37 -5
  30. package/dist/cjs/stored/vokabular.d.ts +1 -1
  31. package/dist/cjs/stored/vokabular.js +5 -3
  32. package/dist/cjs/version.d.ts +1 -1
  33. package/dist/cjs/version.js +1 -1
  34. package/dist/esm/client/aufrufe.d.ts +2 -2
  35. package/dist/esm/client/aufrufe.js +58 -0
  36. package/dist/esm/inventory/api.d.ts +61 -0
  37. package/dist/esm/inventory/api.js +51 -0
  38. package/dist/esm/inventory/auth.d.ts +17 -0
  39. package/dist/esm/inventory/auth.js +24 -0
  40. package/dist/esm/inventory/endpunkte.d.ts +91 -0
  41. package/dist/esm/inventory/endpunkte.js +267 -0
  42. package/dist/esm/inventory/fehler.d.ts +43 -0
  43. package/dist/esm/inventory/fehler.js +57 -0
  44. package/dist/esm/inventory/index.d.ts +21 -0
  45. package/dist/esm/inventory/index.js +20 -0
  46. package/dist/esm/inventory/lesen.d.ts +45 -0
  47. package/dist/esm/inventory/lesen.js +404 -0
  48. package/dist/esm/inventory/schreiben.d.ts +83 -0
  49. package/dist/esm/inventory/schreiben.js +298 -0
  50. package/dist/esm/inventory/typen.d.ts +679 -0
  51. package/dist/esm/inventory/typen.js +13 -0
  52. package/dist/esm/inventory/vertrag.d.ts +136 -0
  53. package/dist/esm/inventory/vertrag.js +288 -0
  54. package/dist/esm/inventory/webhook.d.ts +52 -0
  55. package/dist/esm/inventory/webhook.js +107 -0
  56. package/dist/esm/invoice/index.d.ts +2 -2
  57. package/dist/esm/invoice/index.js +1 -1
  58. package/dist/esm/invoice/typen.d.ts +46 -2
  59. package/dist/esm/invoice/vertrag.d.ts +19 -5
  60. package/dist/esm/invoice/vertrag.js +36 -4
  61. package/dist/esm/stored/vokabular.d.ts +1 -1
  62. package/dist/esm/stored/vokabular.js +5 -3
  63. package/dist/esm/version.d.ts +1 -1
  64. package/dist/esm/version.js +1 -1
  65. package/fixtures/hobex-hps-codes.json +1 -1
  66. package/fixtures/invoice-api-examples/credit-error-reservation.json +26 -0
  67. package/fixtures/invoice-api-examples/issue-error-reservation-article.json +25 -0
  68. package/fixtures/invoice-api-examples/issue-error-vat-id-risk.json +26 -0
  69. package/fixtures/invoice-api-examples/issue-reservation.json +24 -0
  70. package/fixtures/invoice-api-examples/issue-vat-id-risk.json +28 -0
  71. package/fixtures/invoice-api.schema.json +15 -2
  72. package/fixtures/invoice-texts.json +1 -1
  73. package/fixtures/pos-texts.json +1 -1
  74. package/fixtures/surface.json +306 -5
  75. package/fixtures/v3/README.md +9 -1
  76. package/fixtures/v3/antworten/belege.json +2 -2
  77. package/fixtures/v3/antworten/belegmail.json +2 -2
  78. package/fixtures/v3/antworten/kasse-belege.json +2 -2
  79. package/fixtures/v3/antworten/kasse.json +3 -3
  80. package/fixtures/v3/antworten/lager.json +3881 -0
  81. package/fixtures/v3/antworten/rechnungen.json +267 -44
  82. package/fixtures/v3/antworten/storno.json +2 -2
  83. package/fixtures/v3/stored/belege.json +2 -2
  84. package/fixtures/v3/stored/kasse.json +404 -4
  85. package/fixtures/v3/stored/rechnungen.json +174 -18
  86. package/fixtures/v3/v3-vokabular.json +1007 -20
  87. package/fixtures/v3/zahlbetrag-faelle.json +2 -2
  88. package/package.json +14 -2
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Der Vertrag der Lager-API (Backend Stufe 5a lesen, 5b schreiben und
3
+ * reservieren) als Daten: Endpunkte, Wertkataloge, Ereignisse, Fehler- und
4
+ * Hinweiscodes, englisch wie am Draht `/v3`.
5
+ *
6
+ * Quelle ist der Vertrags-Export des Backends (`fixtures/v3/v3-vokabular.json`):
7
+ * `endpoints.public`, die Kataloge `STANDORT_TYP`, `BEWEGUNG_ART`,
8
+ * `BEWEGUNG_QUELLE`, `LAGER_ZUSTAND`, `LAGER_URSACHE`, `ZUSTELLUNG`,
9
+ * `LAGER_ABGANG_GRUND`, `LAGER_ENTNAHME_ART`, `LAGER_NEBENKOSTEN_ART`,
10
+ * `LAGER_VERTEILUNG`, `RESERVIERUNG_STATUS`, dazu `events`, `errorCodes.inventory`
11
+ * und `warningCodes.inventory`. `test/inventory.test.ts` haelt jede Liste
12
+ * deckungsgleich mit dieser Datei; nichts hier wird geraten.
13
+ */
14
+ /** Die 27 Endpunkte (14 aus 5a, 13 aus 5b), in der Reihenfolge von `endpoints.public`. */
15
+ export declare const INVENTORY_ENDPOINTS: readonly ["getArticle", "listArticles", "lookupArticleByCode", "listLocations", "getStock", "listStock", "listStockMovements", "createWebhook", "updateWebhook", "deleteWebhook", "listWebhooks", "sendWebhookTest", "rotateWebhookSecret", "listWebhookDeliveries", "createArticle", "updateArticle", "deactivateArticle", "receiveGoods", "transferStock", "recordStockLoss", "changeStockCondition", "reverseStockMovement", "createReservation", "extendReservation", "releaseReservation", "getReservation", "listReservations"];
16
+ export type InventoryEndpoint = (typeof INVENTORY_ENDPOINTS)[number];
17
+ /** Art eines Standorts (Katalog `STANDORT_TYP`). */
18
+ export declare const LOCATION_TYPES: readonly ["warehouse", "store", "vehicle", "other"];
19
+ export type LocationType = (typeof LOCATION_TYPES)[number];
20
+ /**
21
+ * Art einer Lagerbewegung (Katalog `BEWEGUNG_ART`); zugleich der Filter `type`.
22
+ * `goods_receipt` ist der Wareneingang, `takeover` der uebernommene Anfangsbestand
23
+ * (auch per Import). `receipt` gibt es hier nicht: das ist der Kassenbeleg (Quelle).
24
+ * `reservation` (seit 1.5.0) aendert nur `reserved`: `quantityDelta` ist 0, die
25
+ * Menge steht in `reservedDelta`.
26
+ */
27
+ export declare const STOCK_MOVEMENT_TYPES: readonly ["sale", "goods_receipt", "loss", "return", "transfer_out", "transfer_in", "condition_out", "condition_in", "stocktake", "adjustment", "takeover", "reversal", "revaluation", "method_change", "reservation"];
28
+ export type StockMovementType = (typeof STOCK_MOVEMENT_TYPES)[number];
29
+ /**
30
+ * Woher eine Bewegung kommt (Katalog `BEWEGUNG_QUELLE`); zugleich der Filter
31
+ * `source`. `receipt` ist der Kassenbeleg wie ueberall in der API (der
32
+ * Wareneingang ist die Bewegungsart `goods_receipt`).
33
+ */
34
+ export declare const STOCK_MOVEMENT_SOURCES: readonly ["receipt", "invoice", "cancellation", "credit_note", "panel", "register", "api", "stocktake", "system"];
35
+ export type StockMovementSource = (typeof STOCK_MOVEMENT_SOURCES)[number];
36
+ /** Zustand der Ware an einer Bewegung (Katalog `LAGER_ZUSTAND`). */
37
+ export declare const STOCK_CONDITIONS: readonly ["sellable", "defective"];
38
+ export type StockCondition = (typeof STOCK_CONDITIONS)[number];
39
+ /**
40
+ * Ursache eines `stock.changed` (Katalog `LAGER_URSACHE`), abgeleitet aus der
41
+ * juengsten Bewegung mit Mengenwirkung. `other`: keine Regel passt oder es
42
+ * gibt keine Bewegung (dann ist `movementId` `null`).
43
+ */
44
+ export declare const STOCK_CHANGE_CAUSES: readonly ["sale", "invoice", "credit_note", "cancellation", "goods_receipt", "transfer", "loss", "condition", "reversal", "reservation", "stocktake", "takeover", "other"];
45
+ export type StockChangeCause = (typeof STOCK_CHANGE_CAUSES)[number];
46
+ /** Stand einer Zustellung (Katalog `ZUSTELLUNG`, derselbe wie bei Partner-Webhooks). */
47
+ export declare const WEBHOOK_DELIVERY_STATUSES: readonly ["delivered", "pending", "failed", "dropped"];
48
+ export type WebhookDeliveryStatus = (typeof WEBHOOK_DELIVERY_STATUSES)[number];
49
+ /**
50
+ * Die Ereignisse, die ein Konto-Webhook abonnieren kann, in der Reihenfolge von
51
+ * `listWebhooks().events`. `reservation.*` (seit 1.5.0) tragen die Reservierung
52
+ * wie `getReservation`, mit dem Status danach: `reservation.released` und
53
+ * `reservation.redeemed` kommen bei jeder wirksamen Freigabe bzw. Einloesung,
54
+ * auch einer teilweisen (dann bleibt der Status `active`).
55
+ */
56
+ export declare const INVENTORY_WEBHOOK_EVENTS: readonly ["stock.changed", "stock.below_minimum", "article.created", "article.updated", "article.deactivated", "reservation.expired", "reservation.released", "reservation.redeemed"];
57
+ export type InventoryWebhookEventType = (typeof INVENTORY_WEBHOOK_EVENTS)[number];
58
+ /**
59
+ * Die Felder der Huelle jeder Zustellung, in der Reihenfolge am Draht. Statt
60
+ * `partnerId` (Partner-Webhooks) traegt sie `accountId`; `test` steht nur auf
61
+ * Probesendungen.
62
+ */
63
+ export declare const INVENTORY_WEBHOOK_ENVELOPE_FIELDS: readonly ["id", "type", "createdAt", "accountId", "test", "data"];
64
+ /** Hoechstzahl der Webhooks je Konto (`webhook_limit`, wie bei Partner-Webhooks). */
65
+ export declare const INVENTORY_WEBHOOK_LIMIT = 5;
66
+ /** Groesstes `limit` einer Liste; ohne Angabe liefert der Server 50. */
67
+ export declare const INVENTORY_LIST_LIMIT_MAX = 200;
68
+ /**
69
+ * Die Codes, die die Lager-Endpunkte selbst senden (`errorCodes.inventory`;
70
+ * `register_user_not_allowed` steht bei [INVENTORY_REQUEST_ERROR_CODES]).
71
+ * `validation` traegt `errors: [{ field, message }]`, `rate_limited` traegt
72
+ * `retryAfterSec` (dazu die Kopfzeile `Retry-After`) – auch bei
73
+ * `sendWebhookTest` nach 20 Probesendungen je Wiener Kalendertag (dann bis
74
+ * Mitternacht in Wien).
75
+ *
76
+ * Seit 1.5.0 hinten angehaengt, in der Reihenfolge des Vertrags: die Codes
77
+ * der schreibenden Endpunkte. `idempotency_key_required` (Schluessel fehlt),
78
+ * `idempotency_conflict` (derselbe Schluessel mit anderem Inhalt),
79
+ * `exceeds_stock` (Abgang, Umbuchung und Zustandswechsel ueberziehen nie),
80
+ * `insufficient_available` (Reservierung; `data.details[]`, siehe
81
+ * [inventoryShortfalls]), `code_taken` und `external_id_taken` (mit `field` und
82
+ * `articleId` des Artikels, dem der Code gehoert), `stock_kind_locked`,
83
+ * `reservation_not_found`, `reservation_not_active` …
84
+ */
85
+ export declare const INVENTORY_ERROR_CODES: readonly ["validation", "invalid_cursor", "article_not_found", "webhook_not_found", "webhook_limit", "invalid_webhook_url", "event_not_subscribed", "webhook_inactive", "inventory_api_not_enabled", "module_inactive", "rate_limited", "server_error", "idempotency_key_required", "idempotency_conflict", "location_not_found", "location_inactive", "invalid_location", "invalid_locations", "invalid_transfer", "operation_not_found", "already_reversed", "reversal_not_possible", "reversal_not_supported", "exceeds_stock", "no_positions", "too_many_positions", "invalid_step", "invalid_quantity", "invalid_amount", "invalid_price", "negative_value", "invalid_reason", "note_required", "withdrawal_type_required", "invalid_method", "invalid_stock_kind", "invalid_minimum", "invalid_dimensions", "weight_missing", "invalid_landed_cost", "invalid_distribution", "landed_costs_mismatch", "return_totals_mismatch", "lot_not_found", "invalid_serial", "serial_required", "serial_not_allowed", "serial_already_exists", "serial_not_in_stock", "code_taken", "external_id_taken", "group_not_found", "revenue_group_not_found", "stock_kind_locked", "article_inactive", "invalid_position", "invalid_condition", "reason_required", "insufficient_available", "reservation_not_found", "reservation_not_active"];
86
+ export type InventoryErrorCode = (typeof INVENTORY_ERROR_CODES)[number];
87
+ /**
88
+ * Codes, die Anmeldung und Rand auf jedem Lager-Aufruf erzeugen koennen,
89
+ * soweit sie nicht schon in [INVENTORY_ERROR_CODES] stehen: `errorCodes.auth`
90
+ * ohne die des Partner-Zugangs und `errorCodes.edge` (sortiert), zuletzt
91
+ * `route_missing` (Code des Pakets). Dieselbe Ableitung wie bei der
92
+ * Rechnungs-API.
93
+ */
94
+ export declare const INVENTORY_REQUEST_ERROR_CODES: readonly ["account_not_found", "admin_required", "api_not_approved", "cashregister_not_assigned", "cashregister_not_found", "cashregister_token_invalid", "cashregister_token_missing", "dialect_mismatch", "internal_translation_error", "live_not_enabled", "method_not_allowed", "mfa_required", "not_found", "register_user_no_business", "register_user_not_allowed", "register_user_not_found", "response_translation_failed", "session_expired", "session_other_cashregister", "unauthorized", "user_disabled", "user_verification_failed", "route_missing"];
95
+ export type InventoryRequestErrorCode = (typeof INVENTORY_REQUEST_ERROR_CODES)[number];
96
+ /**
97
+ * Hinweise einer Buchung (`warnings[].code`, `warningCodes.inventory`). Sie sind
98
+ * keine Fehler: die Buchung hat gewirkt. `insufficient_stock` gibt es nur beim
99
+ * Verkauf (Abgang, Umbuchung und Zustandswechsel weisen mit `exceeds_stock` ab),
100
+ * `below_minimum` misst am verfuegbaren Bestand (`onHand − reserved`) gegen den
101
+ * Mindestbestand des Standorts, `reservation_exceeded` meldet eine Rechnung, die
102
+ * mehr verkauft als reserviert war.
103
+ */
104
+ export declare const INVENTORY_WARNING_CODES: readonly ["insufficient_stock", "below_minimum", "return_exceeds_sale", "reservation_exceeded"];
105
+ export type InventoryWarningCode = (typeof INVENTORY_WARNING_CODES)[number];
106
+ /**
107
+ * Bestandsart eines Artikels (`stockKind`): `quantity` = Menge, `serial` =
108
+ * Einzelstueck mit Seriennummer. Kein Katalog des Vokabulars, der Server
109
+ * uebersetzt das Feld selbst; nach der ersten Bewegung fest (`stock_kind_locked`).
110
+ */
111
+ export declare const STOCK_KINDS: readonly ["quantity", "serial"];
112
+ export type StockKind = (typeof STOCK_KINDS)[number];
113
+ /** Grund eines Abgangs (`recordStockLoss.reason`, Katalog `LAGER_ABGANG_GRUND`). `other` braucht `note`. */
114
+ export declare const STOCK_LOSS_REASONS: readonly ["breakage", "shrinkage", "theft", "expired", "withdrawal", "disposal", "other"];
115
+ export type StockLossReason = (typeof STOCK_LOSS_REASONS)[number];
116
+ /** Art einer Entnahme (`withdrawalType`, Katalog `LAGER_ENTNAHME_ART`); Pflicht bei `reason: 'withdrawal'`, sonst nicht erlaubt. */
117
+ export declare const WITHDRAWAL_TYPES: readonly ["private", "staff", "gift", "sample"];
118
+ export type WithdrawalType = (typeof WITHDRAWAL_TYPES)[number];
119
+ /** Art von Nebenkosten eines Wareneingangs (`landedCosts[].type`, Katalog `LAGER_NEBENKOSTEN_ART`). */
120
+ export declare const LANDED_COST_TYPES: readonly ["freight", "customs", "insurance", "other", "discount", "cash_discount"];
121
+ export type LandedCostType = (typeof LANDED_COST_TYPES)[number];
122
+ /** Verteilung der Nebenkosten (`allocation`, Katalog `LAGER_VERTEILUNG`); Vorgabe des Servers `value`. */
123
+ export declare const LANDED_COST_ALLOCATIONS: readonly ["value", "quantity", "weight", "manual"];
124
+ export type LandedCostAllocation = (typeof LANDED_COST_ALLOCATIONS)[number];
125
+ /**
126
+ * Stand einer Reservierung (Katalog `RESERVIERUNG_STATUS`). Nur `active` haelt
127
+ * Ware zurueck; die drei anderen sind endgueltig: `redeemed` (ueber eine
128
+ * Rechnung eingeloest), `released` (freigegeben), `expired` (abgelaufen).
129
+ */
130
+ export declare const RESERVATION_STATUSES: readonly ["active", "redeemed", "released", "expired"];
131
+ export type ReservationStatus = (typeof RESERVATION_STATUSES)[number];
132
+ /** Laengster `idempotencyKey` (Zeichen); laenger weist der Server ab, er schneidet nie ab. */
133
+ export declare const INVENTORY_IDEMPOTENCY_KEY_MAX = 120;
134
+ /** Kuerzeste und laengste Haltedauer einer Reservierung in Minuten (`expiresInMinutes`, 30 Tage). */
135
+ export declare const RESERVATION_MINUTES_MIN = 5;
136
+ export declare const RESERVATION_MINUTES_MAX = 43200;
@@ -0,0 +1,288 @@
1
+ /**
2
+ * Der Vertrag der Lager-API (Backend Stufe 5a lesen, 5b schreiben und
3
+ * reservieren) als Daten: Endpunkte, Wertkataloge, Ereignisse, Fehler- und
4
+ * Hinweiscodes, englisch wie am Draht `/v3`.
5
+ *
6
+ * Quelle ist der Vertrags-Export des Backends (`fixtures/v3/v3-vokabular.json`):
7
+ * `endpoints.public`, die Kataloge `STANDORT_TYP`, `BEWEGUNG_ART`,
8
+ * `BEWEGUNG_QUELLE`, `LAGER_ZUSTAND`, `LAGER_URSACHE`, `ZUSTELLUNG`,
9
+ * `LAGER_ABGANG_GRUND`, `LAGER_ENTNAHME_ART`, `LAGER_NEBENKOSTEN_ART`,
10
+ * `LAGER_VERTEILUNG`, `RESERVIERUNG_STATUS`, dazu `events`, `errorCodes.inventory`
11
+ * und `warningCodes.inventory`. `test/inventory.test.ts` haelt jede Liste
12
+ * deckungsgleich mit dieser Datei; nichts hier wird geraten.
13
+ */
14
+ /** Die 27 Endpunkte (14 aus 5a, 13 aus 5b), in der Reihenfolge von `endpoints.public`. */
15
+ export const INVENTORY_ENDPOINTS = [
16
+ 'getArticle',
17
+ 'listArticles',
18
+ 'lookupArticleByCode',
19
+ 'listLocations',
20
+ 'getStock',
21
+ 'listStock',
22
+ 'listStockMovements',
23
+ 'createWebhook',
24
+ 'updateWebhook',
25
+ 'deleteWebhook',
26
+ 'listWebhooks',
27
+ 'sendWebhookTest',
28
+ 'rotateWebhookSecret',
29
+ 'listWebhookDeliveries',
30
+ 'createArticle',
31
+ 'updateArticle',
32
+ 'deactivateArticle',
33
+ 'receiveGoods',
34
+ 'transferStock',
35
+ 'recordStockLoss',
36
+ 'changeStockCondition',
37
+ 'reverseStockMovement',
38
+ 'createReservation',
39
+ 'extendReservation',
40
+ 'releaseReservation',
41
+ 'getReservation',
42
+ 'listReservations',
43
+ ];
44
+ /** Art eines Standorts (Katalog `STANDORT_TYP`). */
45
+ export const LOCATION_TYPES = ['warehouse', 'store', 'vehicle', 'other'];
46
+ /**
47
+ * Art einer Lagerbewegung (Katalog `BEWEGUNG_ART`); zugleich der Filter `type`.
48
+ * `goods_receipt` ist der Wareneingang, `takeover` der uebernommene Anfangsbestand
49
+ * (auch per Import). `receipt` gibt es hier nicht: das ist der Kassenbeleg (Quelle).
50
+ * `reservation` (seit 1.5.0) aendert nur `reserved`: `quantityDelta` ist 0, die
51
+ * Menge steht in `reservedDelta`.
52
+ */
53
+ export const STOCK_MOVEMENT_TYPES = [
54
+ 'sale',
55
+ 'goods_receipt',
56
+ 'loss',
57
+ 'return',
58
+ 'transfer_out',
59
+ 'transfer_in',
60
+ 'condition_out',
61
+ 'condition_in',
62
+ 'stocktake',
63
+ 'adjustment',
64
+ 'takeover',
65
+ 'reversal',
66
+ 'revaluation',
67
+ 'method_change',
68
+ 'reservation',
69
+ ];
70
+ /**
71
+ * Woher eine Bewegung kommt (Katalog `BEWEGUNG_QUELLE`); zugleich der Filter
72
+ * `source`. `receipt` ist der Kassenbeleg wie ueberall in der API (der
73
+ * Wareneingang ist die Bewegungsart `goods_receipt`).
74
+ */
75
+ export const STOCK_MOVEMENT_SOURCES = [
76
+ 'receipt',
77
+ 'invoice',
78
+ 'cancellation',
79
+ 'credit_note',
80
+ 'panel',
81
+ 'register',
82
+ 'api',
83
+ 'stocktake',
84
+ 'system',
85
+ ];
86
+ /** Zustand der Ware an einer Bewegung (Katalog `LAGER_ZUSTAND`). */
87
+ export const STOCK_CONDITIONS = ['sellable', 'defective'];
88
+ /**
89
+ * Ursache eines `stock.changed` (Katalog `LAGER_URSACHE`), abgeleitet aus der
90
+ * juengsten Bewegung mit Mengenwirkung. `other`: keine Regel passt oder es
91
+ * gibt keine Bewegung (dann ist `movementId` `null`).
92
+ */
93
+ export const STOCK_CHANGE_CAUSES = [
94
+ 'sale',
95
+ 'invoice',
96
+ 'credit_note',
97
+ 'cancellation',
98
+ 'goods_receipt',
99
+ 'transfer',
100
+ 'loss',
101
+ 'condition',
102
+ 'reversal',
103
+ 'reservation',
104
+ 'stocktake',
105
+ 'takeover',
106
+ 'other',
107
+ ];
108
+ /** Stand einer Zustellung (Katalog `ZUSTELLUNG`, derselbe wie bei Partner-Webhooks). */
109
+ export const WEBHOOK_DELIVERY_STATUSES = ['delivered', 'pending', 'failed', 'dropped'];
110
+ /**
111
+ * Die Ereignisse, die ein Konto-Webhook abonnieren kann, in der Reihenfolge von
112
+ * `listWebhooks().events`. `reservation.*` (seit 1.5.0) tragen die Reservierung
113
+ * wie `getReservation`, mit dem Status danach: `reservation.released` und
114
+ * `reservation.redeemed` kommen bei jeder wirksamen Freigabe bzw. Einloesung,
115
+ * auch einer teilweisen (dann bleibt der Status `active`).
116
+ */
117
+ export const INVENTORY_WEBHOOK_EVENTS = [
118
+ 'stock.changed',
119
+ 'stock.below_minimum',
120
+ 'article.created',
121
+ 'article.updated',
122
+ 'article.deactivated',
123
+ 'reservation.expired',
124
+ 'reservation.released',
125
+ 'reservation.redeemed',
126
+ ];
127
+ /**
128
+ * Die Felder der Huelle jeder Zustellung, in der Reihenfolge am Draht. Statt
129
+ * `partnerId` (Partner-Webhooks) traegt sie `accountId`; `test` steht nur auf
130
+ * Probesendungen.
131
+ */
132
+ export const INVENTORY_WEBHOOK_ENVELOPE_FIELDS = ['id', 'type', 'createdAt', 'accountId', 'test', 'data'];
133
+ /** Hoechstzahl der Webhooks je Konto (`webhook_limit`, wie bei Partner-Webhooks). */
134
+ export const INVENTORY_WEBHOOK_LIMIT = 5;
135
+ /** Groesstes `limit` einer Liste; ohne Angabe liefert der Server 50. */
136
+ export const INVENTORY_LIST_LIMIT_MAX = 200;
137
+ /**
138
+ * Die Codes, die die Lager-Endpunkte selbst senden (`errorCodes.inventory`;
139
+ * `register_user_not_allowed` steht bei [INVENTORY_REQUEST_ERROR_CODES]).
140
+ * `validation` traegt `errors: [{ field, message }]`, `rate_limited` traegt
141
+ * `retryAfterSec` (dazu die Kopfzeile `Retry-After`) – auch bei
142
+ * `sendWebhookTest` nach 20 Probesendungen je Wiener Kalendertag (dann bis
143
+ * Mitternacht in Wien).
144
+ *
145
+ * Seit 1.5.0 hinten angehaengt, in der Reihenfolge des Vertrags: die Codes
146
+ * der schreibenden Endpunkte. `idempotency_key_required` (Schluessel fehlt),
147
+ * `idempotency_conflict` (derselbe Schluessel mit anderem Inhalt),
148
+ * `exceeds_stock` (Abgang, Umbuchung und Zustandswechsel ueberziehen nie),
149
+ * `insufficient_available` (Reservierung; `data.details[]`, siehe
150
+ * [inventoryShortfalls]), `code_taken` und `external_id_taken` (mit `field` und
151
+ * `articleId` des Artikels, dem der Code gehoert), `stock_kind_locked`,
152
+ * `reservation_not_found`, `reservation_not_active` …
153
+ */
154
+ export const INVENTORY_ERROR_CODES = [
155
+ 'validation',
156
+ 'invalid_cursor',
157
+ 'article_not_found',
158
+ 'webhook_not_found',
159
+ 'webhook_limit',
160
+ 'invalid_webhook_url',
161
+ 'event_not_subscribed',
162
+ 'webhook_inactive',
163
+ 'inventory_api_not_enabled',
164
+ 'module_inactive',
165
+ 'rate_limited',
166
+ 'server_error',
167
+ 'idempotency_key_required',
168
+ 'idempotency_conflict',
169
+ 'location_not_found',
170
+ 'location_inactive',
171
+ 'invalid_location',
172
+ 'invalid_locations',
173
+ 'invalid_transfer',
174
+ 'operation_not_found',
175
+ 'already_reversed',
176
+ 'reversal_not_possible',
177
+ 'reversal_not_supported',
178
+ 'exceeds_stock',
179
+ 'no_positions',
180
+ 'too_many_positions',
181
+ 'invalid_step',
182
+ 'invalid_quantity',
183
+ 'invalid_amount',
184
+ 'invalid_price',
185
+ 'negative_value',
186
+ 'invalid_reason',
187
+ 'note_required',
188
+ 'withdrawal_type_required',
189
+ 'invalid_method',
190
+ 'invalid_stock_kind',
191
+ 'invalid_minimum',
192
+ 'invalid_dimensions',
193
+ 'weight_missing',
194
+ 'invalid_landed_cost',
195
+ 'invalid_distribution',
196
+ 'landed_costs_mismatch',
197
+ 'return_totals_mismatch',
198
+ 'lot_not_found',
199
+ 'invalid_serial',
200
+ 'serial_required',
201
+ 'serial_not_allowed',
202
+ 'serial_already_exists',
203
+ 'serial_not_in_stock',
204
+ 'code_taken',
205
+ 'external_id_taken',
206
+ 'group_not_found',
207
+ 'revenue_group_not_found',
208
+ 'stock_kind_locked',
209
+ 'article_inactive',
210
+ 'invalid_position',
211
+ 'invalid_condition',
212
+ 'reason_required',
213
+ 'insufficient_available',
214
+ 'reservation_not_found',
215
+ 'reservation_not_active',
216
+ ];
217
+ /**
218
+ * Codes, die Anmeldung und Rand auf jedem Lager-Aufruf erzeugen koennen,
219
+ * soweit sie nicht schon in [INVENTORY_ERROR_CODES] stehen: `errorCodes.auth`
220
+ * ohne die des Partner-Zugangs und `errorCodes.edge` (sortiert), zuletzt
221
+ * `route_missing` (Code des Pakets). Dieselbe Ableitung wie bei der
222
+ * Rechnungs-API.
223
+ */
224
+ export const INVENTORY_REQUEST_ERROR_CODES = [
225
+ 'account_not_found',
226
+ 'admin_required',
227
+ 'api_not_approved',
228
+ 'cashregister_not_assigned',
229
+ 'cashregister_not_found',
230
+ 'cashregister_token_invalid',
231
+ 'cashregister_token_missing',
232
+ 'dialect_mismatch',
233
+ 'internal_translation_error',
234
+ 'live_not_enabled',
235
+ 'method_not_allowed',
236
+ 'mfa_required',
237
+ 'not_found',
238
+ 'register_user_no_business',
239
+ 'register_user_not_allowed',
240
+ 'register_user_not_found',
241
+ 'response_translation_failed',
242
+ 'session_expired',
243
+ 'session_other_cashregister',
244
+ 'unauthorized',
245
+ 'user_disabled',
246
+ 'user_verification_failed',
247
+ 'route_missing',
248
+ ];
249
+ // ---- Schreiben und Reservierung (Backend Stufe 5b, seit 1.5.0) -----------------
250
+ /**
251
+ * Hinweise einer Buchung (`warnings[].code`, `warningCodes.inventory`). Sie sind
252
+ * keine Fehler: die Buchung hat gewirkt. `insufficient_stock` gibt es nur beim
253
+ * Verkauf (Abgang, Umbuchung und Zustandswechsel weisen mit `exceeds_stock` ab),
254
+ * `below_minimum` misst am verfuegbaren Bestand (`onHand − reserved`) gegen den
255
+ * Mindestbestand des Standorts, `reservation_exceeded` meldet eine Rechnung, die
256
+ * mehr verkauft als reserviert war.
257
+ */
258
+ export const INVENTORY_WARNING_CODES = [
259
+ 'insufficient_stock',
260
+ 'below_minimum',
261
+ 'return_exceeds_sale',
262
+ 'reservation_exceeded',
263
+ ];
264
+ /**
265
+ * Bestandsart eines Artikels (`stockKind`): `quantity` = Menge, `serial` =
266
+ * Einzelstueck mit Seriennummer. Kein Katalog des Vokabulars, der Server
267
+ * uebersetzt das Feld selbst; nach der ersten Bewegung fest (`stock_kind_locked`).
268
+ */
269
+ export const STOCK_KINDS = ['quantity', 'serial'];
270
+ /** Grund eines Abgangs (`recordStockLoss.reason`, Katalog `LAGER_ABGANG_GRUND`). `other` braucht `note`. */
271
+ export const STOCK_LOSS_REASONS = ['breakage', 'shrinkage', 'theft', 'expired', 'withdrawal', 'disposal', 'other'];
272
+ /** Art einer Entnahme (`withdrawalType`, Katalog `LAGER_ENTNAHME_ART`); Pflicht bei `reason: 'withdrawal'`, sonst nicht erlaubt. */
273
+ export const WITHDRAWAL_TYPES = ['private', 'staff', 'gift', 'sample'];
274
+ /** Art von Nebenkosten eines Wareneingangs (`landedCosts[].type`, Katalog `LAGER_NEBENKOSTEN_ART`). */
275
+ export const LANDED_COST_TYPES = ['freight', 'customs', 'insurance', 'other', 'discount', 'cash_discount'];
276
+ /** Verteilung der Nebenkosten (`allocation`, Katalog `LAGER_VERTEILUNG`); Vorgabe des Servers `value`. */
277
+ export const LANDED_COST_ALLOCATIONS = ['value', 'quantity', 'weight', 'manual'];
278
+ /**
279
+ * Stand einer Reservierung (Katalog `RESERVIERUNG_STATUS`). Nur `active` haelt
280
+ * Ware zurueck; die drei anderen sind endgueltig: `redeemed` (ueber eine
281
+ * Rechnung eingeloest), `released` (freigegeben), `expired` (abgelaufen).
282
+ */
283
+ export const RESERVATION_STATUSES = ['active', 'redeemed', 'released', 'expired'];
284
+ /** Laengster `idempotencyKey` (Zeichen); laenger weist der Server ab, er schneidet nie ab. */
285
+ export const INVENTORY_IDEMPOTENCY_KEY_MAX = 120;
286
+ /** Kuerzeste und laengste Haltedauer einer Reservierung in Minuten (`expiresInMinutes`, 30 Tage). */
287
+ export const RESERVATION_MINUTES_MIN = 5;
288
+ export const RESERVATION_MINUTES_MAX = 43_200;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Eingehende Konto-Webhooks der Lager-API: Signatur pruefen, Ereignis lesen.
3
+ *
4
+ * Dasselbe Verfahren wie bei Partner-Webhooks (Backend
5
+ * `gemeinsam/webhook-core.js`, `signaturKopf`/`pruefeSignatur`): Kopf
6
+ * `X-Kasseneck-Signature: t=<unix-sekunden>,v1=<hex>` mit
7
+ * `v1 = HMAC-SHA256(secret, "<t>.<roher Rumpf>")`, Zeitfenster 300 Sekunden in
8
+ * beide Richtungen, zeitkonstanter Vergleich, mehrere `v1=`-Anteile erlaubt.
9
+ * Die Pruefung selbst liegt in `partner/webhook-signatur.ts` und wird hier nur
10
+ * mit der Form `(secret, kopf, rumpf, optionen)` angeboten.
11
+ *
12
+ * Reihenfolge im Empfaenger: **erst pruefen, dann lesen**, und dabei den
13
+ * **rohen** Rumpf nehmen (in Express `express.raw({ type: '*\/*' })` vor jedem
14
+ * JSON-Parser).
15
+ */
16
+ import type { InventoryWebhookEvent } from './typen.js';
17
+ export { WEBHOOK_SIGNATURE_HEADER, WEBHOOK_EVENT_HEADER, WEBHOOK_DELIVERY_HEADER, WEBHOOK_TOLERANCE_SEC, } from '../partner/webhook-signatur.js';
18
+ export interface VerifyInventoryWebhookOptions {
19
+ /** Erlaubte Abweichung des Zeitstempels in Sekunden, in beide Richtungen; Vorgabe 300. */
20
+ toleranceSec?: number;
21
+ /** Jetzt: ein `Date` oder Millisekunden seit 1970 (wie `Date.now()`). Vorgabe: die Systemuhr. */
22
+ now?: Date | number;
23
+ }
24
+ /**
25
+ * Prueft die Signatur einer Zustellung. `true` nur, wenn Kopf, Zeitfenster
26
+ * und HMAC stimmen; jede schlechte Eingabe und jede Ausnahme ist `false`,
27
+ * nie ein Wurf.
28
+ *
29
+ * **Asynchron**, weil die Pruefung WebCrypto (`crypto.subtle`) benutzt: das
30
+ * Paket hat keine Laufzeitabhaengigkeit und laeuft auch im Browser.
31
+ *
32
+ * @param secret das Secret aus `createWebhook`/`rotateWebhookSecret`; eine
33
+ * Liste erlaubt den Wechsel (es reicht, wenn eines passt)
34
+ * @param header der Wert von `X-Kasseneck-Signature`, unveraendert
35
+ * @param rawBody der **rohe** Rumpf (Text oder Bytes), nicht `JSON.parse` + `stringify`
36
+ */
37
+ export declare function verifyInventoryWebhookSignature(secret: string | readonly string[], header: string | null | undefined, rawBody: string | Uint8Array, options?: VerifyInventoryWebhookOptions): Promise<boolean>;
38
+ /**
39
+ * Liest eine Zustellung als typisiertes Ereignis. Vorher die Signatur pruefen
40
+ * ([verifyInventoryWebhookSignature]).
41
+ *
42
+ * - Ein Ereignis, das diese Paketversion nicht kennt (etwa `variant_group.*`
43
+ * einer spaeteren Stufe), ergibt `null`: mit 2xx antworten und uebergehen.
44
+ * - `reservation.expired|released|redeemed` tragen die Reservierung wie
45
+ * `getReservation`, mit dem Status nach dem Vorgang (seit 1.5.0).
46
+ * - Ein Rumpf, der keine Huelle ist, oder eine Bruchzahl in einer Menge wirft
47
+ * `KasseneckValidationError` (`scope: 'response'`).
48
+ *
49
+ * **Entdoppeln** auf `event.id`; **Stand statt Aenderung**: einen gespeicherten
50
+ * Bestand nur ueberschreiben, wenn `data.sequence` groesser ist.
51
+ */
52
+ export declare function parseInventoryWebhookEvent(rawBody: string | Uint8Array): InventoryWebhookEvent | null;
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Eingehende Konto-Webhooks der Lager-API: Signatur pruefen, Ereignis lesen.
3
+ *
4
+ * Dasselbe Verfahren wie bei Partner-Webhooks (Backend
5
+ * `gemeinsam/webhook-core.js`, `signaturKopf`/`pruefeSignatur`): Kopf
6
+ * `X-Kasseneck-Signature: t=<unix-sekunden>,v1=<hex>` mit
7
+ * `v1 = HMAC-SHA256(secret, "<t>.<roher Rumpf>")`, Zeitfenster 300 Sekunden in
8
+ * beide Richtungen, zeitkonstanter Vergleich, mehrere `v1=`-Anteile erlaubt.
9
+ * Die Pruefung selbst liegt in `partner/webhook-signatur.ts` und wird hier nur
10
+ * mit der Form `(secret, kopf, rumpf, optionen)` angeboten.
11
+ *
12
+ * Reihenfolge im Empfaenger: **erst pruefen, dann lesen**, und dabei den
13
+ * **rohen** Rumpf nehmen (in Express `express.raw({ type: '*\/*' })` vor jedem
14
+ * JSON-Parser).
15
+ */
16
+ import { KasseneckValidationError } from '../client/errors.js';
17
+ import { verifyWebhookSignature as pruefeSignatur } from '../partner/webhook-signatur.js';
18
+ import { artikel, bestandGeaendert, objekt, reservierung, unterMindestbestand } from './lesen.js';
19
+ import { INVENTORY_WEBHOOK_EVENTS } from './vertrag.js';
20
+ export { WEBHOOK_SIGNATURE_HEADER, WEBHOOK_EVENT_HEADER, WEBHOOK_DELIVERY_HEADER, WEBHOOK_TOLERANCE_SEC, } from '../partner/webhook-signatur.js';
21
+ /**
22
+ * Prueft die Signatur einer Zustellung. `true` nur, wenn Kopf, Zeitfenster
23
+ * und HMAC stimmen; jede schlechte Eingabe und jede Ausnahme ist `false`,
24
+ * nie ein Wurf.
25
+ *
26
+ * **Asynchron**, weil die Pruefung WebCrypto (`crypto.subtle`) benutzt: das
27
+ * Paket hat keine Laufzeitabhaengigkeit und laeuft auch im Browser.
28
+ *
29
+ * @param secret das Secret aus `createWebhook`/`rotateWebhookSecret`; eine
30
+ * Liste erlaubt den Wechsel (es reicht, wenn eines passt)
31
+ * @param header der Wert von `X-Kasseneck-Signature`, unveraendert
32
+ * @param rawBody der **rohe** Rumpf (Text oder Bytes), nicht `JSON.parse` + `stringify`
33
+ */
34
+ export async function verifyInventoryWebhookSignature(secret, header, rawBody, options = {}) {
35
+ try {
36
+ const jetzt = options.now instanceof Date ? options.now.getTime() : options.now;
37
+ const nowSec = typeof jetzt === 'number' && Number.isFinite(jetzt) ? Math.floor(jetzt / 1000) : undefined;
38
+ const r = await pruefeSignatur({
39
+ secret,
40
+ signatureHeader: header,
41
+ body: rawBody,
42
+ ...(nowSec === undefined ? {} : { nowSec }),
43
+ ...(options.toleranceSec === undefined ? {} : { toleranceSec: options.toleranceSec }),
44
+ });
45
+ return r.ok;
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ }
51
+ const BEKANNT = new Set(INVENTORY_WEBHOOK_EVENTS);
52
+ function kaputt(grund) {
53
+ return new KasseneckValidationError('parseInventoryWebhookEvent', grund, 'response');
54
+ }
55
+ /**
56
+ * Liest eine Zustellung als typisiertes Ereignis. Vorher die Signatur pruefen
57
+ * ([verifyInventoryWebhookSignature]).
58
+ *
59
+ * - Ein Ereignis, das diese Paketversion nicht kennt (etwa `variant_group.*`
60
+ * einer spaeteren Stufe), ergibt `null`: mit 2xx antworten und uebergehen.
61
+ * - `reservation.expired|released|redeemed` tragen die Reservierung wie
62
+ * `getReservation`, mit dem Status nach dem Vorgang (seit 1.5.0).
63
+ * - Ein Rumpf, der keine Huelle ist, oder eine Bruchzahl in einer Menge wirft
64
+ * `KasseneckValidationError` (`scope: 'response'`).
65
+ *
66
+ * **Entdoppeln** auf `event.id`; **Stand statt Aenderung**: einen gespeicherten
67
+ * Bestand nur ueberschreiben, wenn `data.sequence` groesser ist.
68
+ */
69
+ export function parseInventoryWebhookEvent(rawBody) {
70
+ const text = typeof rawBody === 'string' ? rawBody : new TextDecoder('utf-8').decode(rawBody);
71
+ let roh;
72
+ try {
73
+ roh = JSON.parse(text);
74
+ }
75
+ catch {
76
+ throw kaputt('Rumpf ist kein JSON');
77
+ }
78
+ const e = objekt(roh);
79
+ if (!e)
80
+ throw kaputt('Rumpf ist kein Ereignis (kein Objekt)');
81
+ const { id, type, createdAt, accountId, data } = e;
82
+ if (typeof id !== 'string' || id === '' || typeof type !== 'string' || type === '')
83
+ throw kaputt('Ereignis ohne id oder type');
84
+ if (typeof createdAt !== 'number' || !Number.isFinite(createdAt))
85
+ throw kaputt('Ereignis ohne createdAt');
86
+ if (typeof accountId !== 'string' || accountId === '')
87
+ throw kaputt('Ereignis ohne accountId');
88
+ if (!BEKANNT.has(type))
89
+ return null;
90
+ const ort = { name: 'parseInventoryWebhookEvent', pfad: 'data' };
91
+ if (!objekt(data))
92
+ throw kaputt('Ereignis ohne data');
93
+ // Nur ein ausdrueckliches `true` ist eine Probe; im Zweifel der Ernstfall.
94
+ const huelle = { id, type: type, createdAt, accountId, test: e.test === true };
95
+ switch (huelle.type) {
96
+ case 'stock.changed':
97
+ return { ...huelle, type: huelle.type, data: bestandGeaendert(ort, data) };
98
+ case 'stock.below_minimum':
99
+ return { ...huelle, type: huelle.type, data: unterMindestbestand(ort, data) };
100
+ case 'reservation.expired':
101
+ case 'reservation.released':
102
+ case 'reservation.redeemed':
103
+ return { ...huelle, type: huelle.type, data: reservierung(ort, data) };
104
+ default:
105
+ return { ...huelle, type: huelle.type, data: artikel(ort, data) };
106
+ }
107
+ }
@@ -14,8 +14,8 @@ export { createInvoiceApi, type InvoiceApi, type InvoiceApiOptions } from './api
14
14
  export { invoiceKeyAuth, type InvoiceKeyAuthOptions } from './auth.js';
15
15
  export { isInvoiceError, isInvoiceErrorCode, invoiceErrorCode, invoiceFieldErrors, type InvoiceApiErrorCode, type InvoiceFieldError, } from './fehler.js';
16
16
  export { cancelInvoice, createCreditNote, createCustomer, getCustomer, getInvoice, getInvoicePdf, getInvoiceSetupStatus, getInvoiceXml, issueInvoice, listBrands, listInvoices, previewInvoice, recordInvoicePayment, searchCustomers, updateCustomer, } from './endpunkte.js';
17
- export type { Brand, CancelInvoiceRequest, CancelResult, CreditNoteItemInput, CreditNoteRequest, CreditNoteResult, Customer, CustomerInput, CustomerPage, CustomerSearch, EInvoiceStatus, Invoice, InvoiceDetail, InvoiceDetailPayment, InvoiceItem, InvoiceItemInput, InvoiceListQuery, InvoicePage, InvoiceRecipient, InvoiceSetupGap, InvoiceSetupStatus, InvoiceTotals, InvoiceXml, InvoiceNotice, InvoicePayment, InvoicePreview, InvoiceRateTotals, IssueInvoiceRequest, IssueResult, PaymentInput, PreviewResult, RecordPaymentRequest, RecordPaymentResult, } from './typen.js';
17
+ export type { Brand, CancelInvoiceRequest, CancelResult, CreditNoteItemInput, CreditNoteRequest, CreditNoteResult, Customer, CustomerInput, CustomerPage, CustomerSearch, EInvoiceStatus, Invoice, InvoiceDetail, InvoiceDetailPayment, InvoiceItem, InvoiceItemInput, IssueInvoiceItemInput, InvoiceListQuery, InvoicePage, InvoiceRecipient, InvoiceSetupGap, InvoiceSetupStatus, InvoiceTotals, InvoiceXml, InvoiceNotice, InvoicePayment, InvoicePreview, InvoiceRateTotals, InvoiceVatIdProof, InvoiceVatIdRisk, IssueInvoiceRequest, IssueResult, PaymentInput, PreviewResult, RecordPaymentRequest, RecordPaymentResult, } from './typen.js';
18
18
  export { INVOICE_TEXTS, invoiceText, type InvoiceTextKey } from './texte.js';
19
19
  export { computeInvoiceTotals, ZERO_RATED_TAX_SCHEMES, type TotalsItem } from './summen.js';
20
20
  export { proratedPriceMicros, MAX_AMOUNT_CENTS, itemFromEuro, formatUnitPrice, CalcError, calculateInvoice, roundDiv, vatRateMapKey, formatVatRate, type CalcResult, type CalcErrorCode, type CalcOptions, type CalcItem, type RateTotal, type ItemConversion, type ConversionReason, type LineAmount, } from './calc.js';
21
- export { INVOICE_CONTRACT_VERSION, INVOICE_ENDPOINTS, INVOICE_ERROR_CODES, INVOICE_REQUEST_ERROR_CODES, CREDIT_NOTE_REASONS, TAX_SCHEMES, PRICE_MODES, VAT_RATES, CUSTOMER_TYPES, INVOICE_LIST_STATUS, DOC_TYPES, EINVOICE_FORMATS, EINVOICE_MISSING_CODES, WRITE_OFF_REASON_CODES, INVOICE_LANGUAGES, INVOICE_PAYMENT_METHODS, ITEM_KINDS, REVERSE_CHARGE_REASONS, INVOICE_NOTICE_CODES, INVOICE_UNITS, INVOICE_UNIT_CODES, INVOICE_SETUP_REQUIREMENTS, CUSTOMER_FIELDS, ITEM_FIELDS, CREDIT_NOTE_ITEM_FIELDS, RETURN_DISPOSITIONS, ITEM_PRICE_EXACTLY_ONE, INVOICE_REQUESTS, INVOICE_EXACTLY_ONE, INVOICE_AT_LEAST_ONE, type InvoiceEndpoint, type InvoiceErrorCode, type InvoiceRequestErrorCode, type CreditNoteReason, type ReturnDisposition, type TaxScheme, type PriceMode, type VatRatePercent, type CustomerType, type InvoiceListStatus, type DocType, type EInvoiceFormat, type EInvoiceMissingCode, type WriteOffReasonCode, type InvoiceLanguage, type InvoicePaymentMethod, type ItemKind, type ReverseChargeReason, type InvoiceNoticeCode, type InvoiceUnit, type InvoiceSetupRequirement, type FieldFormat, type Field, } from './vertrag.js';
21
+ export { INVOICE_CONTRACT_VERSION, INVOICE_ENDPOINTS, INVOICE_ERROR_CODES, INVOICE_REQUEST_ERROR_CODES, CREDIT_NOTE_REASONS, TAX_SCHEMES, PRICE_MODES, VAT_RATES, CUSTOMER_TYPES, INVOICE_LIST_STATUS, DOC_TYPES, EINVOICE_FORMATS, EINVOICE_MISSING_CODES, WRITE_OFF_REASON_CODES, INVOICE_LANGUAGES, INVOICE_PAYMENT_METHODS, ITEM_KINDS, REVERSE_CHARGE_REASONS, INVOICE_NOTICE_CODES, INVOICE_UNITS, INVOICE_UNIT_CODES, INVOICE_SETUP_REQUIREMENTS, CUSTOMER_FIELDS, ITEM_FIELDS, INVOICE_ITEM_FIELDS, CREDIT_NOTE_ITEM_FIELDS, RETURN_DISPOSITIONS, ITEM_PRICE_EXACTLY_ONE, INVOICE_REQUESTS, INVOICE_EXACTLY_ONE, INVOICE_AT_LEAST_ONE, type InvoiceEndpoint, type InvoiceErrorCode, type InvoiceRequestErrorCode, type CreditNoteReason, type ReturnDisposition, type TaxScheme, type PriceMode, type VatRatePercent, type CustomerType, type InvoiceListStatus, type DocType, type EInvoiceFormat, type EInvoiceMissingCode, type WriteOffReasonCode, type InvoiceLanguage, type InvoicePaymentMethod, type ItemKind, type ReverseChargeReason, type InvoiceNoticeCode, type InvoiceUnit, type InvoiceSetupRequirement, type FieldFormat, type Field, } from './vertrag.js';
@@ -17,4 +17,4 @@ export { cancelInvoice, createCreditNote, createCustomer, getCustomer, getInvoic
17
17
  export { INVOICE_TEXTS, invoiceText } from './texte.js';
18
18
  export { computeInvoiceTotals, ZERO_RATED_TAX_SCHEMES } from './summen.js';
19
19
  export { proratedPriceMicros, MAX_AMOUNT_CENTS, itemFromEuro, formatUnitPrice, CalcError, calculateInvoice, roundDiv, vatRateMapKey, formatVatRate, } from './calc.js';
20
- export { INVOICE_CONTRACT_VERSION, INVOICE_ENDPOINTS, INVOICE_ERROR_CODES, INVOICE_REQUEST_ERROR_CODES, CREDIT_NOTE_REASONS, TAX_SCHEMES, PRICE_MODES, VAT_RATES, CUSTOMER_TYPES, INVOICE_LIST_STATUS, DOC_TYPES, EINVOICE_FORMATS, EINVOICE_MISSING_CODES, WRITE_OFF_REASON_CODES, INVOICE_LANGUAGES, INVOICE_PAYMENT_METHODS, ITEM_KINDS, REVERSE_CHARGE_REASONS, INVOICE_NOTICE_CODES, INVOICE_UNITS, INVOICE_UNIT_CODES, INVOICE_SETUP_REQUIREMENTS, CUSTOMER_FIELDS, ITEM_FIELDS, CREDIT_NOTE_ITEM_FIELDS, RETURN_DISPOSITIONS, ITEM_PRICE_EXACTLY_ONE, INVOICE_REQUESTS, INVOICE_EXACTLY_ONE, INVOICE_AT_LEAST_ONE, } from './vertrag.js';
20
+ export { INVOICE_CONTRACT_VERSION, INVOICE_ENDPOINTS, INVOICE_ERROR_CODES, INVOICE_REQUEST_ERROR_CODES, CREDIT_NOTE_REASONS, TAX_SCHEMES, PRICE_MODES, VAT_RATES, CUSTOMER_TYPES, INVOICE_LIST_STATUS, DOC_TYPES, EINVOICE_FORMATS, EINVOICE_MISSING_CODES, WRITE_OFF_REASON_CODES, INVOICE_LANGUAGES, INVOICE_PAYMENT_METHODS, ITEM_KINDS, REVERSE_CHARGE_REASONS, INVOICE_NOTICE_CODES, INVOICE_UNITS, INVOICE_UNIT_CODES, INVOICE_SETUP_REQUIREMENTS, CUSTOMER_FIELDS, ITEM_FIELDS, INVOICE_ITEM_FIELDS, CREDIT_NOTE_ITEM_FIELDS, RETURN_DISPOSITIONS, ITEM_PRICE_EXACTLY_ONE, INVOICE_REQUESTS, INVOICE_EXACTLY_ONE, INVOICE_AT_LEAST_ONE, } from './vertrag.js';