@hartl-services/medusa-base 0.4.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/.medusa/server/src/admin/index.js +1657 -111
  2. package/.medusa/server/src/admin/index.mjs +1647 -101
  3. package/.medusa/server/src/api/admin/email/messages/[id]/resends/route.js +24 -0
  4. package/.medusa/server/src/api/admin/email/messages/[id]/route.js +12 -0
  5. package/.medusa/server/src/api/admin/email/messages/route.js +12 -0
  6. package/.medusa/server/src/api/admin/email/terms-versions/[id]/download/route.js +16 -0
  7. package/.medusa/server/src/api/admin/email/terms-versions/route.js +47 -0
  8. package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/download/route.js +21 -0
  9. package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/regenerate/route.js +38 -0
  10. package/.medusa/server/src/api/admin/orders/[id]/documents/regenerate/route.js +32 -0
  11. package/.medusa/server/src/api/admin/orders/[id]/documents/route.js +36 -0
  12. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/download/route.js +24 -0
  13. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/retry/route.js +44 -0
  14. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/route.js +82 -0
  15. package/.medusa/server/src/api/document-download-response.js +16 -0
  16. package/.medusa/server/src/api/document-response.js +23 -0
  17. package/.medusa/server/src/api/files/[asset]/route.js +24 -0
  18. package/.medusa/server/src/api/files/file-response.js +43 -0
  19. package/.medusa/server/src/api/files/gateway-options.js +31 -0
  20. package/.medusa/server/src/api/files/private/[token]/route.js +29 -0
  21. package/.medusa/server/src/api/files/upload/[token]/route.js +66 -0
  22. package/.medusa/server/src/api/middlewares.js +168 -1
  23. package/.medusa/server/src/api/packing-list-response.js +22 -0
  24. package/.medusa/server/src/api/route.js +27 -0
  25. package/.medusa/server/src/api/store/documents/[id]/download/route.js +21 -0
  26. package/.medusa/server/src/api/store/documents/[id]/route.js +15 -0
  27. package/.medusa/server/src/api/store/documents/route.js +11 -0
  28. package/.medusa/server/src/api/terms-download-response.js +12 -0
  29. package/.medusa/server/src/documents/config/index.js +18 -0
  30. package/.medusa/server/src/documents/paths/documents.js +6 -0
  31. package/.medusa/server/src/documents/paths/index.js +18 -0
  32. package/.medusa/server/src/documents/plugin-features.js +38 -0
  33. package/.medusa/server/src/documents/schemas/documents.js +18 -0
  34. package/.medusa/server/src/documents/schemas/index.js +18 -0
  35. package/.medusa/server/src/documents/scripts/verify-documents-file-storage.js +55 -0
  36. package/.medusa/server/src/documents/templates/financial-document.js +160 -0
  37. package/.medusa/server/src/documents/templates/format.js +73 -0
  38. package/.medusa/server/src/documents/templates/html-factory.js +42 -0
  39. package/.medusa/server/src/documents/templates/html-utils.js +23 -0
  40. package/.medusa/server/src/documents/templates/layout.js +142 -0
  41. package/.medusa/server/src/documents/templates/packing-list.js +52 -0
  42. package/.medusa/server/src/documents/types/admin-api.js +3 -0
  43. package/.medusa/server/src/documents/types/document-summary.js +3 -0
  44. package/.medusa/server/src/documents/types/documents.js +3 -0
  45. package/.medusa/server/src/documents/types/html-factory.js +6 -0
  46. package/.medusa/server/src/documents/types/index.js +22 -0
  47. package/.medusa/server/src/documents/types/store-api.js +3 -0
  48. package/.medusa/server/src/documents/utils/document-merchant.js +22 -0
  49. package/.medusa/server/src/documents/utils/document-render-settings.js +59 -0
  50. package/.medusa/server/src/documents/utils/html-to-pdf.js +61 -0
  51. package/.medusa/server/src/documents/utils/private-file-storage.js +64 -0
  52. package/.medusa/server/src/documents/utils/resolve-services.js +7 -0
  53. package/.medusa/server/src/email/application/handle-invite-event.js +318 -0
  54. package/.medusa/server/src/email/application/handle-password-reset-event.js +366 -0
  55. package/.medusa/server/src/email/config/index.js +84 -0
  56. package/.medusa/server/src/email/config/notification-module.js +20 -0
  57. package/.medusa/server/src/email/domain/business-keys.js +50 -0
  58. package/.medusa/server/src/email/domain/documents-fact-fingerprint.js +7 -0
  59. package/.medusa/server/src/email/domain/event-schemas.js +36 -0
  60. package/.medusa/server/src/email/domain/failure-classification.js +53 -0
  61. package/.medusa/server/src/email/domain/order-summary.js +103 -0
  62. package/.medusa/server/src/email/domain/refund-summary.js +43 -0
  63. package/.medusa/server/src/email/domain/return-summary.js +118 -0
  64. package/.medusa/server/src/email/domain/shipment-summary.js +74 -0
  65. package/.medusa/server/src/email/plugin-features.js +39 -0
  66. package/.medusa/server/src/email/rendering/default-templates.js +719 -0
  67. package/.medusa/server/src/email/rendering/load-email-shop-details.js +36 -0
  68. package/.medusa/server/src/email/rendering/render-email.js +50 -0
  69. package/.medusa/server/src/email/rendering/resolve-shop-configuration.js +67 -0
  70. package/.medusa/server/src/email/types/email-kinds.js +18 -0
  71. package/.medusa/server/src/email/types/index.js +21 -0
  72. package/.medusa/server/src/email/types/shop-configuration.js +3 -0
  73. package/.medusa/server/src/email/types/smtp-configuration.js +3 -0
  74. package/.medusa/server/src/email/types/template-data.js +232 -0
  75. package/.medusa/server/src/files/config/index.js +256 -0
  76. package/.medusa/server/src/files/gateway/index.js +115 -0
  77. package/.medusa/server/src/files/types/index.js +6 -0
  78. package/.medusa/server/src/files/types/public.js +6 -0
  79. package/.medusa/server/src/jobs/document-fact-publication-reconciliation.js +18 -0
  80. package/.medusa/server/src/jobs/document-resolution-reconciliation.js +20 -0
  81. package/.medusa/server/src/jobs/packing-list-reconciliation.js +49 -0
  82. package/.medusa/server/src/jobs/reconcile-email-attempts.js +63 -0
  83. package/.medusa/server/src/jobs/reconcile-pending-email-messages.js +41 -0
  84. package/.medusa/server/src/jobs/retry-email-messages.js +27 -0
  85. package/.medusa/server/src/migration-scripts/dismiss-orphaned-cart-promotion-links.js +26 -0
  86. package/.medusa/server/src/modules/documents/domain/cancellation-snapshot.js +97 -0
  87. package/.medusa/server/src/modules/documents/domain/document-number.js +36 -0
  88. package/.medusa/server/src/modules/documents/domain/document-resolution.js +24 -0
  89. package/.medusa/server/src/modules/documents/domain/issuance-rules.js +37 -0
  90. package/.medusa/server/src/modules/documents/domain/merchant.js +86 -0
  91. package/.medusa/server/src/modules/documents/domain/options.js +40 -0
  92. package/.medusa/server/src/modules/documents/domain/packing-list.js +90 -0
  93. package/.medusa/server/src/modules/documents/domain/snapshot-normalization.js +17 -0
  94. package/.medusa/server/src/modules/documents/domain/tax-breakdown.js +66 -0
  95. package/.medusa/server/src/modules/documents/index.js +15 -0
  96. package/.medusa/server/src/modules/documents/loaders/assert-private-file-storage.js +20 -0
  97. package/.medusa/server/src/modules/documents/migrations/Migration20260827061749.js +75 -0
  98. package/.medusa/server/src/modules/documents/migrations/Migration20260830111207.js +28 -0
  99. package/.medusa/server/src/modules/documents/models/document-artifact.js +25 -0
  100. package/.medusa/server/src/modules/documents/models/document-number-sequence.js +29 -0
  101. package/.medusa/server/src/modules/documents/models/document.js +82 -0
  102. package/.medusa/server/src/modules/documents/models/order-cancellation-resolution.js +51 -0
  103. package/.medusa/server/src/modules/documents/models/packing-list-revision.js +36 -0
  104. package/.medusa/server/src/modules/documents/models/packing-list.js +27 -0
  105. package/.medusa/server/src/modules/documents/models/refund-document-resolution.js +66 -0
  106. package/.medusa/server/src/modules/documents/models/shipment-invoice-assignment.js +51 -0
  107. package/.medusa/server/src/modules/documents/models/shipment-invoice-coordinator.js +44 -0
  108. package/.medusa/server/src/modules/documents/service.js +1701 -0
  109. package/.medusa/server/src/modules/email/domain/attachment.js +25 -0
  110. package/.medusa/server/src/modules/email/domain/message-state.js +69 -0
  111. package/.medusa/server/src/modules/email/index.js +13 -0
  112. package/.medusa/server/src/modules/email/migrations/Migration20260826173422.js +32 -0
  113. package/.medusa/server/src/modules/email/migrations/Migration20260827172945.js +16 -0
  114. package/.medusa/server/src/modules/email/migrations/Migration20260827194804.js +22 -0
  115. package/.medusa/server/src/modules/email/migrations/Migration20260906195205.js +16 -0
  116. package/.medusa/server/src/modules/email/models/email-attempt.js +56 -0
  117. package/.medusa/server/src/modules/email/models/email-message.js +71 -0
  118. package/.medusa/server/src/modules/email/models/email-terms-version.js +37 -0
  119. package/.medusa/server/src/modules/email/service.js +1285 -0
  120. package/.medusa/server/src/modules/plugin-features/domain/plugin-settings.js +4 -3
  121. package/.medusa/server/src/providers/s3-cache/cache/atomic-write.js +25 -0
  122. package/.medusa/server/src/providers/s3-cache/cache/cache-manager.js +115 -0
  123. package/.medusa/server/src/providers/s3-cache/cache/keyed-lock.js +28 -0
  124. package/.medusa/server/src/providers/s3-cache/index.js +8 -0
  125. package/.medusa/server/src/providers/s3-cache/object-key.js +53 -0
  126. package/.medusa/server/src/providers/s3-cache/s3-cache-file.js +229 -0
  127. package/.medusa/server/src/providers/s3-cache/s3-object-store.js +86 -0
  128. package/.medusa/server/src/providers/smtp/index.js +8 -0
  129. package/.medusa/server/src/providers/smtp/service.js +236 -0
  130. package/.medusa/server/src/providers/smtp/types.js +11 -0
  131. package/.medusa/server/src/public/config.js +186 -0
  132. package/.medusa/server/src/public/descriptor.js +3 -1
  133. package/.medusa/server/src/public/gateway.js +19 -0
  134. package/.medusa/server/src/public/instrumentation.js +56 -0
  135. package/.medusa/server/src/public/shop-config.js +12 -0
  136. package/.medusa/server/src/public/shop-master-data.js +2 -2
  137. package/.medusa/server/src/public/shop-types.js +24 -0
  138. package/.medusa/server/src/shop-config/build-food-shop-config.js +252 -0
  139. package/.medusa/server/src/shop-config/options.js +75 -0
  140. package/.medusa/server/src/subscribers/affiliate-consignment-reminder-due.js +26 -0
  141. package/.medusa/server/src/subscribers/documents-order-canceled.js +24 -0
  142. package/.medusa/server/src/subscribers/documents-order-cancellation-ready.js +26 -0
  143. package/.medusa/server/src/subscribers/documents-refund-ready.js +24 -0
  144. package/.medusa/server/src/subscribers/documents-shipment-created.js +36 -0
  145. package/.medusa/server/src/subscribers/documents-shipment-invoice-assignment-decided.js +26 -0
  146. package/.medusa/server/src/subscribers/email-order-canceled.js +28 -0
  147. package/.medusa/server/src/subscribers/email-shipment-created.js +32 -0
  148. package/.medusa/server/src/subscribers/order-placed.js +27 -0
  149. package/.medusa/server/src/subscribers/packing-list-allocation-revised.js +32 -0
  150. package/.medusa/server/src/subscribers/packing-list-fulfillment-canceled.js +54 -0
  151. package/.medusa/server/src/subscribers/packing-list-fulfillment-created.js +31 -0
  152. package/.medusa/server/src/subscribers/password-reset.js +23 -0
  153. package/.medusa/server/src/subscribers/payment-refunded.js +38 -0
  154. package/.medusa/server/src/subscribers/return-received.js +27 -0
  155. package/.medusa/server/src/subscribers/return-requested.js +27 -0
  156. package/.medusa/server/src/subscribers/user-invite.js +23 -0
  157. package/.medusa/server/src/utils/cart-promotion-links.js +101 -0
  158. package/.medusa/server/src/workflows/documents/issue-cancellation-after-refund.js +246 -0
  159. package/.medusa/server/src/workflows/documents/issue-document.js +165 -0
  160. package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +521 -0
  161. package/.medusa/server/src/workflows/documents/issue-packing-list.js +390 -0
  162. package/.medusa/server/src/workflows/documents/publish-document-facts.js +53 -0
  163. package/.medusa/server/src/workflows/documents/reconcile-document-resolutions.js +48 -0
  164. package/.medusa/server/src/workflows/documents/reconcile-order-cancellation.js +92 -0
  165. package/.medusa/server/src/workflows/documents/regenerate-issued-document.js +61 -0
  166. package/.medusa/server/src/workflows/email/dispatch-email-message.js +301 -0
  167. package/.medusa/server/src/workflows/email/documents-required-facts.js +30 -0
  168. package/.medusa/server/src/workflows/email/prepare-affiliate-reminder-email.js +58 -0
  169. package/.medusa/server/src/workflows/email/prepare-order-canceled-email.js +102 -0
  170. package/.medusa/server/src/workflows/email/prepare-order-received-email.js +82 -0
  171. package/.medusa/server/src/workflows/email/prepare-refund-email.js +71 -0
  172. package/.medusa/server/src/workflows/email/prepare-return-email.js +136 -0
  173. package/.medusa/server/src/workflows/email/prepare-shipment-email.js +115 -0
  174. package/.medusa/server/src/workflows/email/retry-email-messages.js +31 -0
  175. package/.medusa/server/src/workflows/hooks/dismiss-deleted-promotion-cart-links.js +23 -0
  176. package/README.md +1777 -8
  177. package/dist/admin-components/features/plugin-features/components/ImageSettingInput.d.ts +15 -0
  178. package/dist/admin-components/features/plugin-features/components/ImageSettingInput.js +42 -0
  179. package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.js +4 -2
  180. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +1 -1
  181. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.d.ts +4 -4
  182. package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +1 -1
  183. package/dist/admin-components/features/plugin-features/lib/image-upload.d.ts +6 -0
  184. package/dist/admin-components/features/plugin-features/lib/image-upload.js +17 -0
  185. package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +4 -4
  186. package/dist/admin-components/i18n/texts.d.ts +6 -0
  187. package/dist/admin-components/i18n/texts.js +6 -0
  188. package/dist/documents/config/index.d.ts +11 -0
  189. package/dist/documents/config/index.js +17 -0
  190. package/dist/documents/templates/financial-document.d.ts +3 -0
  191. package/dist/documents/templates/financial-document.js +159 -0
  192. package/dist/documents/templates/format.d.ts +30 -0
  193. package/dist/documents/templates/format.js +72 -0
  194. package/dist/documents/templates/html-factory.d.ts +15 -0
  195. package/dist/documents/templates/html-factory.js +41 -0
  196. package/dist/documents/templates/html-utils.d.ts +8 -0
  197. package/dist/documents/templates/html-utils.js +22 -0
  198. package/dist/documents/templates/layout.d.ts +35 -0
  199. package/dist/documents/templates/layout.js +141 -0
  200. package/dist/documents/templates/packing-list.d.ts +3 -0
  201. package/dist/documents/templates/packing-list.js +51 -0
  202. package/dist/documents/types/admin-api.d.ts +1 -0
  203. package/dist/documents/types/admin-api.js +2 -0
  204. package/dist/documents/types/document-summary.d.ts +1 -0
  205. package/dist/documents/types/document-summary.js +2 -0
  206. package/dist/documents/types/documents.d.ts +191 -0
  207. package/dist/documents/types/documents.js +2 -0
  208. package/dist/documents/types/html-factory.d.ts +8 -0
  209. package/dist/documents/types/html-factory.js +5 -0
  210. package/dist/documents/types/index.d.ts +5 -0
  211. package/dist/documents/types/index.js +21 -0
  212. package/dist/documents/types/store-api.d.ts +1 -0
  213. package/dist/documents/types/store-api.js +2 -0
  214. package/dist/email/config/index.d.ts +17 -0
  215. package/dist/email/config/index.js +83 -0
  216. package/dist/email/config/notification-module.d.ts +22 -0
  217. package/dist/email/config/notification-module.js +19 -0
  218. package/dist/email/types/email-kinds.d.ts +15 -0
  219. package/dist/email/types/email-kinds.js +17 -0
  220. package/dist/email/types/index.d.ts +4 -0
  221. package/dist/email/types/index.js +20 -0
  222. package/dist/email/types/shop-configuration.d.ts +68 -0
  223. package/dist/email/types/shop-configuration.js +2 -0
  224. package/dist/email/types/smtp-configuration.d.ts +9 -0
  225. package/dist/email/types/smtp-configuration.js +2 -0
  226. package/dist/email/types/template-data.d.ts +609 -0
  227. package/dist/email/types/template-data.js +231 -0
  228. package/dist/files/config/index.d.ts +32 -0
  229. package/dist/files/config/index.js +255 -0
  230. package/dist/files/gateway/index.d.ts +30 -0
  231. package/dist/files/gateway/index.js +114 -0
  232. package/dist/files/types/index.d.ts +2 -0
  233. package/dist/files/types/index.js +5 -0
  234. package/dist/files/types/public.d.ts +90 -0
  235. package/dist/files/types/public.js +5 -0
  236. package/dist/modules/documents/domain/merchant.d.ts +22 -0
  237. package/dist/modules/documents/domain/merchant.js +85 -0
  238. package/dist/modules/documents/domain/options.d.ts +34 -0
  239. package/dist/modules/documents/domain/options.js +39 -0
  240. package/dist/public/config.d.ts +59 -0
  241. package/dist/public/config.js +185 -0
  242. package/dist/public/descriptor.js +2 -0
  243. package/dist/public/gateway.d.ts +2 -0
  244. package/dist/public/gateway.js +18 -0
  245. package/dist/public/instrumentation.d.ts +12 -0
  246. package/dist/public/instrumentation.js +55 -0
  247. package/dist/public/shop-config.d.ts +8 -0
  248. package/dist/public/shop-config.js +11 -0
  249. package/dist/public/shop-master-data.d.ts +1 -1
  250. package/dist/public/shop-master-data.js +1 -1
  251. package/dist/public/shop-types.d.ts +7 -0
  252. package/dist/public/shop-types.js +23 -0
  253. package/dist/public/types.d.ts +19 -2
  254. package/dist/shop-config/build-food-shop-config.d.ts +44 -0
  255. package/dist/shop-config/build-food-shop-config.js +251 -0
  256. package/dist/shop-config/options.d.ts +48 -0
  257. package/dist/shop-config/options.js +74 -0
  258. package/package.json +48 -5
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderFinancialDocument = void 0;
4
+ const format_1 = require("./format");
5
+ const html_utils_1 = require("./html-utils");
6
+ const layout_1 = require("./layout");
7
+ const labelsByKind = {
8
+ cancellation: {
9
+ number: "Stornonummer",
10
+ title: "Stornorechnung",
11
+ },
12
+ credit_note: {
13
+ number: "Gutschriftnummer",
14
+ title: "Gutschrift",
15
+ },
16
+ invoice: {
17
+ number: "Rechnungsnummer",
18
+ title: "Rechnung",
19
+ },
20
+ };
21
+ const renderAddress = (input) => {
22
+ const address = input.order.billing_address;
23
+ if (!address) {
24
+ return (0, html_utils_1.escapeHtml)(input.order.email);
25
+ }
26
+ return [
27
+ address.company,
28
+ [address.first_name, address.last_name]
29
+ .filter((part) => Boolean(part))
30
+ .join(" "),
31
+ address.address_1,
32
+ address.address_2,
33
+ [address.postal_code, address.city]
34
+ .filter((part) => Boolean(part))
35
+ .join(" "),
36
+ address.country_code ? (0, layout_1.formatCountryName)(address.country_code) : null,
37
+ ]
38
+ .filter((part) => Boolean(part))
39
+ .map(html_utils_1.escapeHtml)
40
+ .join("<br />");
41
+ };
42
+ /** "Charge: L-1, MHD: 30.06.2027"; the quantity only when a line has several batches. */
43
+ const renderBatchDetails = (line, timeZone) => {
44
+ const showQuantity = line.batch_allocations.length > 1;
45
+ return line.batch_allocations
46
+ .map((allocation) => {
47
+ const parts = [
48
+ `Charge: ${allocation.lot_number}`,
49
+ `MHD: ${(0, format_1.formatDocumentDate)(allocation.expiry_date, timeZone)}`,
50
+ showQuantity ? `Menge: ${allocation.quantity}` : null,
51
+ ].filter((part) => Boolean(part));
52
+ return `<div class="batch">${(0, html_utils_1.escapeHtml)(parts.join(", "))}</div>`;
53
+ })
54
+ .join("");
55
+ };
56
+ const renderLines = (input, timeZone) => input.lines
57
+ .map((line) => `<tr>
58
+ <td class="item">
59
+ <div class="item-title">${(0, html_utils_1.escapeHtml)(line.title)}</div>
60
+ ${line.sku ? `<div class="sku">SKU: ${(0, html_utils_1.escapeHtml)(line.sku)}</div>` : ""}
61
+ ${renderBatchDetails(line, timeZone)}
62
+ </td>
63
+ <td class="number quantity">${(0, html_utils_1.escapeHtml)(line.quantity)}</td>
64
+ <td class="number">${(0, html_utils_1.renderMoney)(line.unit_price)}</td>
65
+ <td class="number">${(0, html_utils_1.renderMoney)(line.total)}</td>
66
+ </tr>`)
67
+ .join("");
68
+ const isExemptIntraCommunitySupply = (input) => input.order.tax_compliance?.exemption_wording ===
69
+ "steuerfreie_innergemeinschaftliche_lieferung";
70
+ const renderTaxCompliance = (input) => {
71
+ const evidence = input.order.tax_compliance;
72
+ if (!evidence || !isExemptIntraCommunitySupply(input)) {
73
+ return "";
74
+ }
75
+ return `<section class="tax-compliance">
76
+ <h2>Steuerliche Angaben</h2>
77
+ <strong>${(0, html_utils_1.escapeHtml)(evidence.customer_company_name)}</strong><br />
78
+ UID des Kunden: ${(0, html_utils_1.escapeHtml)(evidence.customer_vat_number)}<br />
79
+ Steuerfreie innergemeinschaftliche Lieferung
80
+ </section>`;
81
+ };
82
+ const renderDiscountTotal = (input) => {
83
+ const discount = input.totals.discount_total;
84
+ const displayAmount = input.document.kind === "invoice" && Number(discount.amount) > 0
85
+ ? `-${discount.amount}`
86
+ : discount.amount;
87
+ return (0, html_utils_1.renderMoney)(discount, displayAmount);
88
+ };
89
+ const formatTaxRate = (rate) => new Intl.NumberFormat(format_1.DEFAULT_FORMAT_LOCALE, {
90
+ maximumFractionDigits: 2,
91
+ style: "percent",
92
+ }).format(rate / 100);
93
+ /** One totals row below the Menge/Einzelpreis columns; the amount sits under "Summe". */
94
+ const renderTotalRow = (label, value, className) => `<tr${className ? ` class="${className}"` : ""}><td class="spacer"></td><td class="label" colspan="2">${(0, html_utils_1.escapeHtml)(label)}</td><td class="number">${value}</td></tr>`;
95
+ const renderTaxRows = (input) => {
96
+ const { tax_breakdown: breakdown, tax_total: taxTotal } = input.totals;
97
+ const rows = breakdown.length > 0
98
+ ? breakdown.map((entry) => ({
99
+ label: `${entry.name} ${formatTaxRate(entry.rate)}`,
100
+ money: entry.tax_total,
101
+ }))
102
+ : [{ label: "Umsatzsteuer", money: taxTotal }];
103
+ return rows
104
+ .map(({ label, money }) => renderTotalRow(label, (0, html_utils_1.renderMoney)(money)))
105
+ .join("");
106
+ };
107
+ /** Only invoices ask for payment; cancellations and credit notes do not. */
108
+ const renderPaymentTerms = (input) => input.document.kind === "invoice" && input.settings.payment_terms
109
+ ? `<section class="payment-terms">${(0, html_utils_1.escapeHtml)(input.settings.payment_terms)}</section>`
110
+ : "";
111
+ const renderFinancialDocument = (input, layout, timeZone) => {
112
+ const labels = labelsByKind[input.document.kind];
113
+ const metadata = [
114
+ { label: labels.number, value: input.document.number },
115
+ {
116
+ label: "Bestellung",
117
+ value: (0, html_utils_1.formatOrderReference)(input.order.display_id),
118
+ },
119
+ ];
120
+ if (input.document.kind !== "invoice") {
121
+ metadata.push({
122
+ label: "Ursprungsrechnung",
123
+ value: input.document.source_document_number ?? "-",
124
+ });
125
+ }
126
+ if (input.order.tax_compliance && isExemptIntraCommunitySupply(input)) {
127
+ metadata.push({
128
+ label: "Kunden-UID",
129
+ value: input.order.tax_compliance.customer_vat_number,
130
+ });
131
+ }
132
+ metadata.push({
133
+ label: "Datum",
134
+ value: (0, format_1.formatDocumentDate)(input.document.issued_at, timeZone),
135
+ });
136
+ const { totals } = input;
137
+ const body = `<table class="items financial-items">
138
+ <thead><tr><th class="item">Artikel</th><th class="number quantity">Menge</th><th class="number">Einzelpreis</th><th class="number">Summe</th></tr></thead>
139
+ <tbody class="lines">${renderLines(input, timeZone)}</tbody>
140
+ <tbody class="totals">
141
+ ${renderTotalRow("Zwischensumme", (0, html_utils_1.renderMoney)(totals.subtotal))}
142
+ ${renderTotalRow("Versand", (0, html_utils_1.renderMoney)(totals.shipping_total))}
143
+ ${renderTotalRow("Rabatt", renderDiscountTotal(input))}
144
+ ${renderTaxRows(input)}
145
+ ${renderTotalRow("Gesamt", (0, html_utils_1.renderMoney)(totals.total), "grand-total")}
146
+ </tbody>
147
+ </table>
148
+ ${renderTaxCompliance(input)}
149
+ ${renderPaymentTerms(input)}`;
150
+ return layout({
151
+ body,
152
+ documentTitle: labels.title,
153
+ metadata,
154
+ number: input.document.number,
155
+ pageTitle: labels.title,
156
+ recipient: renderAddress(input),
157
+ });
158
+ };
159
+ exports.renderFinancialDocument = renderFinancialDocument;
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluYW5jaWFsLWRvY3VtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy90ZW1wbGF0ZXMvZmluYW5jaWFsLWRvY3VtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU1BLHFDQUFvRTtBQUNwRSw2Q0FBNEU7QUFDNUUscUNBQWlFO0FBT2pFLE1BQU0sWUFBWSxHQUFHO0lBQ25CLFlBQVksRUFBRTtRQUNaLE1BQU0sRUFBRSxjQUFjO1FBQ3RCLEtBQUssRUFBRSxnQkFBZ0I7S0FDeEI7SUFDRCxXQUFXLEVBQUU7UUFDWCxNQUFNLEVBQUUsa0JBQWtCO1FBQzFCLEtBQUssRUFBRSxZQUFZO0tBQ3BCO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsTUFBTSxFQUFFLGlCQUFpQjtRQUN6QixLQUFLLEVBQUUsVUFBVTtLQUNsQjtDQUlGLENBQUE7QUFFRCxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQTRCLEVBQVUsRUFBRTtJQUM3RCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQTtJQUMzQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLElBQUEsdUJBQVUsRUFBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3RDLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxDQUFDLE9BQU87UUFDZixDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQzthQUNwQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQWtCLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDL0MsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNaLE9BQU8sQ0FBQyxTQUFTO1FBQ2pCLE9BQU8sQ0FBQyxTQUFTO1FBQ2pCLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDO2FBQ2hDLE1BQU0sQ0FBQyxD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
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatDocumentDate = exports.formatMoneyParts = exports.formatDate = exports.formatMoney = exports.DEFAULT_FORMAT_LOCALE = void 0;
4
+ exports.DEFAULT_FORMAT_LOCALE = "de-AT";
5
+ const formatMoney = ({ amount, currencyCode }, { locale = exports.DEFAULT_FORMAT_LOCALE } = {}) => {
6
+ const numericAmount = Number(amount);
7
+ const normalizedCurrencyCode = currencyCode.toUpperCase();
8
+ const fallback = `${String(amount)} ${normalizedCurrencyCode}`;
9
+ if (!Number.isFinite(numericAmount)) {
10
+ return fallback;
11
+ }
12
+ try {
13
+ return new Intl.NumberFormat(locale, {
14
+ currency: normalizedCurrencyCode,
15
+ style: "currency",
16
+ }).format(numericAmount);
17
+ }
18
+ catch {
19
+ return fallback;
20
+ }
21
+ };
22
+ exports.formatMoney = formatMoney;
23
+ const formatDate = (value, { locale = exports.DEFAULT_FORMAT_LOCALE, options, timeZone }) => {
24
+ const date = value instanceof Date ? value : new Date(value);
25
+ if (Number.isNaN(date.getTime())) {
26
+ return String(value);
27
+ }
28
+ return new Intl.DateTimeFormat(locale, { timeZone, ...options }).format(date);
29
+ };
30
+ exports.formatDate = formatDate;
31
+ /**
32
+ * `formatMoney` split into currency and number, so a template can align the
33
+ * currency and the amount separately. Falls back to the whole
34
+ * `formatMoney` text as `amount`.
35
+ */
36
+ const formatMoneyParts = ({ amount, currencyCode }, { locale = exports.DEFAULT_FORMAT_LOCALE } = {}) => {
37
+ const numericAmount = Number(amount);
38
+ const fallback = {
39
+ currency: "",
40
+ amount: (0, exports.formatMoney)({ amount, currencyCode }, { locale }),
41
+ };
42
+ if (!Number.isFinite(numericAmount)) {
43
+ return fallback;
44
+ }
45
+ try {
46
+ const parts = new Intl.NumberFormat(locale, {
47
+ currency: currencyCode.toUpperCase(),
48
+ style: "currency",
49
+ }).formatToParts(numericAmount);
50
+ return {
51
+ currency: parts
52
+ .filter((part) => part.type === "currency")
53
+ .map((part) => part.value)
54
+ .join(""),
55
+ amount: parts
56
+ .filter((part) => part.type !== "currency" &&
57
+ !(part.type === "literal" && !part.value.trim()))
58
+ .map((part) => part.value)
59
+ .join(""),
60
+ };
61
+ }
62
+ catch {
63
+ return fallback;
64
+ }
65
+ };
66
+ exports.formatMoneyParts = formatMoneyParts;
67
+ /** A document date as "01.01.2027" in the given time zone. */
68
+ const formatDocumentDate = (value, timeZone) => (0, exports.formatDate)(value, {
69
+ timeZone,
70
+ options: { day: "2-digit", month: "2-digit", year: "numeric" },
71
+ });
72
+ exports.formatDocumentDate = formatDocumentDate;
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy90ZW1wbGF0ZXMvZm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFhLFFBQUEscUJBQXFCLEdBQUcsT0FBTyxDQUFBO0FBV3JDLE1BQU0sV0FBVyxHQUFHLENBQ3pCLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0IsRUFDMUMsRUFBRSxNQUFNLEdBQUcsNkJBQXFCLEtBQXlCLEVBQUUsRUFDbkQsRUFBRTtJQUNWLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNwQyxNQUFNLHNCQUFzQixHQUFHLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUN6RCxNQUFNLFFBQVEsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxzQkFBc0IsRUFBRSxDQUFBO0lBRTlELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDcEMsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUNuQyxRQUFRLEVBQUUsc0JBQXNCO1lBQ2hDLEtBQUssRUFBRSxVQUFVO1NBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDMUIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7QUFDSCxDQUFDLENBQUE7QUFwQlksUUFBQSxXQUFXLGVBb0J2QjtBQVNNLE1BQU0sVUFBVSxHQUFHLENBQ3hCLEtBQW9CLEVBQ3BCLEVBQUUsTUFBTSxHQUFHLDZCQUFxQixFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQXFCLEVBQ2hFLEVBQUU7SUFDVixNQUFNLElBQUksR0FBRyxLQUFLLFlBQVksSUFBSSxDQUFDLENB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
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /* eslint-disable @medusajs/use-medusa-error-not-generic-error -- Invalid render inputs are programmer errors, not HTTP responses. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.createDefaultDocumentHtmlFactory = void 0;
5
+ const layout_1 = require("./layout");
6
+ const financial_document_1 = require("./financial-document");
7
+ const packing_list_1 = require("./packing-list");
8
+ /**
9
+ * The plugin's default document markup (German, locale de-AT). The legal
10
+ * sender comes with every render input (`input.merchant`, the base plugin's
11
+ * shop master data). `timeZone` is the IANA time zone in which printed dates
12
+ * are shown; the plugin passes its resolved `numbering.timeZone` so the date
13
+ * on a document matches the period its number was allocated in. `theme`
14
+ * adds a project's CSS and page background (watermark) on top of the default
15
+ * look; the logo comes from the Documents settings (`input.settings`).
16
+ */
17
+ const createDefaultDocumentHtmlFactory = ({ timeZone, theme, }) => {
18
+ return (input) => {
19
+ const kind = input.document.kind;
20
+ switch (kind) {
21
+ case "invoice":
22
+ case "cancellation":
23
+ case "credit_note":
24
+ if ("totals" in input) {
25
+ return (0, financial_document_1.renderFinancialDocument)(input, (0, layout_1.createDocumentLayout)(input.merchant, input.settings, true, theme), timeZone);
26
+ }
27
+ break;
28
+ case "packing_list":
29
+ if ("fulfillment" in input) {
30
+ return (0, packing_list_1.renderPackingList)(input, (0, layout_1.createDocumentLayout)(input.merchant, input.settings, false, theme), timeZone);
31
+ }
32
+ break;
33
+ default: {
34
+ const unsupportedKind = kind;
35
+ throw new TypeError(`Unsupported document kind: ${unsupportedKind}`);
36
+ }
37
+ }
38
+ throw new TypeError(`Invalid input for document kind: ${kind}`);
39
+ };
40
+ };
41
+ exports.createDefaultDocumentHtmlFactory = createDefaultDocumentHtmlFactory;
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy90ZW1wbGF0ZXMvaHRtbC1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxxSUFBcUk7OztBQUlySSxxQ0FBbUU7QUFDbkUsNkRBQThEO0FBQzlELGlEQUFrRDtBQUVsRDs7Ozs7Ozs7R0FRRztBQUNJLE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQyxFQUMvQyxRQUFRLEVBQ1IsS0FBSyxHQUlOLEVBQXVCLEVBQUU7SUFDeEIsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ2YsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUE7UUFFaEMsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxjQUFjLENBQUM7WUFDcEIsS0FBSyxhQUFhO2dCQUNoQixJQUFJLFFBQVEsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDdEIsT0FBTyxJQUFBLDRDQUF1QixFQUM1QixLQUFLLEVBQ0wsSUFBQSw2QkFBb0IsRUFBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUNqRSxRQUFRLENBQ1QsQ0FBQTtnQkFDSCxDQUFDO2dCQUNELE1BQUs7WUFDUCxLQUFLLGNBQWM7Z0JBQ2pCLElBQUksYUFBYSxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUMzQixPQUFPLElBQUEsZ0NBQWlCLEVBQ3RCLEtBQUssRUFDTCxJQUFBLDZCQUFvQixFQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQ2xFLFFBQVEsQ0FDVCxDQUFBO2dCQUNILENBQUM7Z0JBQ0QsTUFBSztZQUNQLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ1IsTUFBTSxlQUFlLEdBQVUsSUFBSSxDQUFBO2dCQUNuQyxNQUFNLElBQUksU0FBUyxDQUFDLDhCQUE4QixlQUFlLEVBQUUsQ0FBQyxDQUFBO1lBQ3RFLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxJQUFJLFNBQVMsQ0FBQyxvQ0FBb0MsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUNqRSxDQUFDLENBQUE7QUFDSCxDQUFDLENBQUE7QUF2Q1ksUUFBQSxnQ0FBZ0Msb0NBdUM1QyJ9
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderMoney = exports.formatOrderReference = exports.escapeHtml = void 0;
4
+ const format_1 = require("./format");
5
+ const escapeHtml = (value) => String(value ?? "")
6
+ .replaceAll("&", "&amp;")
7
+ .replaceAll("<", "&lt;")
8
+ .replaceAll(">", "&gt;")
9
+ .replaceAll('"', "&quot;")
10
+ .replaceAll("'", "&#039;");
11
+ exports.escapeHtml = escapeHtml;
12
+ const formatOrderReference = (displayId) => displayId === null ? "-" : `#${displayId}`;
13
+ exports.formatOrderReference = formatOrderReference;
14
+ /**
15
+ * An amount as `<span class="money">` with separate currency and amount
16
+ * spans; `amount` overrides the money's own amount (e.g. a negated value).
17
+ */
18
+ const renderMoney = (money, amount = money.amount) => {
19
+ const parts = (0, format_1.formatMoneyParts)({ amount, currencyCode: money.currency_code });
20
+ return `<span class="money"><span class="currency">${(0, exports.escapeHtml)(parts.currency)}</span> <span class="amount">${(0, exports.escapeHtml)(parts.amount)}</span></span>`;
21
+ };
22
+ exports.renderMoney = renderMoney;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9kb2N1bWVudHMvdGVtcGxhdGVzL2h0bWwtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEscUNBQTJDO0FBRXBDLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBeUMsRUFBVSxFQUFFLENBQzlFLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO0tBQ2hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO0tBQ3hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0tBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0tBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO0tBQ3pCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFOakIsUUFBQSxVQUFVLGNBTU87QUFFdkIsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFNBQXdCLEVBQVUsRUFBRSxDQUN2RSxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxFQUFFLENBQUE7QUFEL0IsUUFBQSxvQkFBb0Isd0JBQ1c7QUFFNUM7OztHQUdHO0FBQ0ksTUFBTSxXQUFXLEdBQUcsQ0FDekIsS0FBb0IsRUFDcEIsU0FBaUIsS0FBSyxDQUFDLE1BQU0sRUFDckIsRUFBRTtJQUNWLE1BQU0sS0FBSyxHQUFHLElBQUEseUJBQWdCLEVBQUMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFBO0lBQzdFLE9BQU8sOENBQThDLElBQUEsa0JBQVUsRUFBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGdDQUFnQyxJQUFBLGtCQUFVLEVBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQTtBQUN6SixDQUFDLENBQUE7QUFOWSxRQUFBLFdBQVcsZUFNdkIifQ==
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDocumentLayout = exports.formatCountryName = void 0;
4
+ const html_utils_1 = require("./html-utils");
5
+ const formatCountryName = (countryCode) => new Intl.DisplayNames("de", { type: "region" }).of(countryCode.toUpperCase()) ?? countryCode.toUpperCase();
6
+ exports.formatCountryName = formatCountryName;
7
+ const joinLines = (lines) => lines
8
+ .filter((line) => Boolean(line))
9
+ .map(html_utils_1.escapeHtml)
10
+ .join("<br />");
11
+ const renderFooterColumn = (heading, lines) => {
12
+ const content = joinLines(lines);
13
+ if (!content) {
14
+ return "";
15
+ }
16
+ const title = heading
17
+ ? `<div class="footer-heading">${(0, html_utils_1.escapeHtml)(heading)}</div>`
18
+ : "";
19
+ return `<div class="footer-column">${title}${content}</div>`;
20
+ };
21
+ /**
22
+ * Legal footer in three columns: sender with UID and company register,
23
+ * contact, bank. Packing lists (`includeLegalDetails: false`) show only the
24
+ * sender's name and address.
25
+ */
26
+ const renderMerchantFooter = (merchant, includeLegalDetails) => {
27
+ const sender = `<div class="footer-column"><strong>${(0, html_utils_1.escapeHtml)(merchant.legal_name)}</strong><br />${joinLines([
28
+ merchant.address_line1,
29
+ merchant.address_line2,
30
+ `${merchant.postal_code} ${merchant.city}`,
31
+ (0, exports.formatCountryName)(merchant.country_code),
32
+ ...(includeLegalDetails
33
+ ? [
34
+ merchant.vat_number ? `UID: ${merchant.vat_number}` : null,
35
+ merchant.company_register_number
36
+ ? `Firmenbuchnummer: ${merchant.company_register_number}`
37
+ : null,
38
+ merchant.company_register_court
39
+ ? `Firmenbuchgericht: ${merchant.company_register_court}`
40
+ : null,
41
+ ]
42
+ : []),
43
+ ])}</div>`;
44
+ if (!includeLegalDetails) {
45
+ return sender;
46
+ }
47
+ return [
48
+ sender,
49
+ renderFooterColumn("Kontakt", [
50
+ merchant.phone,
51
+ merchant.email,
52
+ merchant.website,
53
+ ]),
54
+ // The heading names the IBAN; only the BIC keeps its label.
55
+ renderFooterColumn("Bankverbindung", [
56
+ merchant.iban,
57
+ merchant.bic ? `BIC: ${merchant.bic}` : null,
58
+ ]),
59
+ ].join("");
60
+ };
61
+ const renderLetterhead = (merchant, settings) => settings.logo_src
62
+ ? `<img class="logo" src="${(0, html_utils_1.escapeHtml)(settings.logo_src)}" alt="${(0, html_utils_1.escapeHtml)(merchant.legal_name)}" />`
63
+ : `<div class="logo-text">${(0, html_utils_1.escapeHtml)(merchant.legal_name)}</div>`;
64
+ const renderMetadata = (metadata) => metadata
65
+ .map(({ label, value }) => `<tr><th scope="row">${(0, html_utils_1.escapeHtml)(label)}</th><td>${(0, html_utils_1.escapeHtml)(value)}</td></tr>`)
66
+ .join("");
67
+ /**
68
+ * A4 with only a bottom page margin, which holds the page number
69
+ * (`@bottom-right`; `counter(pages)` works only in page margin boxes). `.page`
70
+ * carries the other margins and repeats them on every printed page
71
+ * (`box-decoration-break: clone`); the fixed footer is positioned in the page
72
+ * area, `--footer-height` reserves its space at the bottom of each page.
73
+ */
74
+ const DEFAULT_STYLESHEET = `
75
+ @page { size: A4; margin: 0 0 8mm 0; @bottom-right { color: #6b7280; content: "Seite " counter(page) " von " counter(pages); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 7.5pt; padding-right: 20mm; vertical-align: top; } }
76
+ :root { --accent: #111827; --text: #1f2937; --muted: #6b7280; --line: #d1d5db; --table-head: #f3f4f6; --page-x: 20mm; --page-top: 18mm; --footer-height: 30mm; }
77
+ * { box-sizing: border-box; }
78
+ html, body { margin: 0; padding: 0; }
79
+ body { color: var(--text); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 10pt; line-height: 1.4; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
80
+ .page { -webkit-box-decoration-break: clone; box-decoration-break: clone; padding: var(--page-top) var(--page-x) calc(var(--footer-height) + 8mm); }
81
+ .letterhead { margin-bottom: 14mm; min-height: 16mm; }
82
+ .logo { display: block; height: 22mm; max-width: 90mm; object-fit: contain; object-position: left center; width: auto; }
83
+ .logo-text { color: var(--accent); font-size: 20pt; font-weight: 700; letter-spacing: 0.02em; }
84
+ .document-head { break-inside: avoid; display: flex; gap: 12mm; justify-content: space-between; margin-bottom: 14mm; page-break-inside: avoid; }
85
+ .recipient { flex: 1 1 0; font-style: normal; padding-top: 9mm; }
86
+ .document-info { flex: 0 0 78mm; }
87
+ h1 { color: var(--accent); font-size: 16pt; font-weight: 400; letter-spacing: 0.08em; margin: 0 0 3mm; text-transform: uppercase; }
88
+ h2 { break-after: avoid; font-size: 10pt; margin: 8mm 0 2mm; page-break-after: avoid; }
89
+ .document-metadata { border-collapse: collapse; width: 100%; }
90
+ .document-metadata th, .document-metadata td { border: 0; font-weight: 400; padding: 0; text-align: left; vertical-align: top; }
91
+ .document-metadata td { text-align: right; }
92
+ .muted, .sku, .batch { color: var(--muted); }
93
+ .batch, .packing-batch { font-size: 8pt; margin-top: 1mm; }
94
+ .packing-batch { display: flex; gap: 12px; justify-content: space-between; }
95
+ table { border-collapse: collapse; page-break-inside: auto; width: 100%; }
96
+ thead { display: table-header-group; }
97
+ tfoot { display: table-footer-group; }
98
+ tbody { page-break-inside: auto; }
99
+ tr { break-inside: avoid; page-break-inside: avoid; }
100
+ .items th { background: var(--table-head); font-weight: 700; text-align: left; }
101
+ .items th.number { text-align: right; }
102
+ .items th, .items td { padding: 2.5mm 2mm; vertical-align: top; }
103
+ .items tbody.lines td { border-bottom: 1px solid var(--line); }
104
+ .number { text-align: right; white-space: nowrap; }
105
+ .money { white-space: nowrap; }
106
+ .items tbody.totals td { padding-bottom: 1.5mm; padding-top: 1.5mm; }
107
+ .items tbody.totals tr:first-child td { padding-top: 3mm; }
108
+ .items tbody.totals tr.grand-total td.label, .items tbody.totals tr.grand-total td.number { border-bottom: 1px solid var(--line); border-top: 1px solid var(--line); font-weight: 700; padding-bottom: 2mm; padding-top: 2mm; }
109
+ .payment-terms { margin-top: 10mm; white-space: pre-line; }
110
+ .recipient, .tax-compliance, .payment-terms, .items tbody.totals { break-inside: avoid; page-break-inside: avoid; }
111
+ .page-footer { align-items: flex-start; bottom: 4mm; color: var(--text); display: flex; font-size: 8pt; gap: 8mm; left: var(--page-x); line-height: 1.35; position: fixed; right: var(--page-x); }
112
+ .footer-column { flex: 1 1 0; }
113
+ .footer-heading { color: var(--muted); }
114
+ `;
115
+ /**
116
+ * `includeLegalDetails` adds UID, company register, contact and bank details
117
+ * to the footer (financial documents); packing lists show only the sender.
118
+ */
119
+ const createDocumentLayout = (merchant, settings, includeLegalDetails, theme = {}) => ({ body, documentTitle, metadata, number, pageTitle, recipient }) => `<!doctype html>
120
+ <html lang="de">
121
+ <head>
122
+ <meta charset="utf-8" />
123
+ <title>${(0, html_utils_1.escapeHtml)(pageTitle)} ${(0, html_utils_1.escapeHtml)(number)}</title>
124
+ <style>${DEFAULT_STYLESHEET}${theme.stylesheet ?? ""}</style>
125
+ </head>
126
+ <body>
127
+ <footer class="page-footer">${renderMerchantFooter(merchant, includeLegalDetails)}</footer>
128
+ <main class="page">
129
+ <header class="letterhead">${renderLetterhead(merchant, settings)}</header>
130
+ <section class="document-head">
131
+ <address class="recipient">${recipient ?? ""}</address>
132
+ <div class="document-info">
133
+ <h1>${(0, html_utils_1.escapeHtml)(documentTitle)}</h1>
134
+ <table class="document-metadata"><tbody>${renderMetadata(metadata)}</tbody></table>
135
+ </div>
136
+ </section>
137
+ ${body}
138
+ </main>
139
+ </body>
140
+ </html>`;
141
+ exports.createDocumentLayout = createDocumentLayout;
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy90ZW1wbGF0ZXMvbGF5b3V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLDZDQUF5QztBQWlDbEMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFdBQW1CLEVBQVUsRUFBRSxDQUMvRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUNoRCxXQUFXLENBQUMsV0FBVyxFQUFFLENBQzFCLElBQUksV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBSG5CLFFBQUEsaUJBQWlCLHFCQUdFO0FBRWhDLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBaUMsRUFBVSxFQUFFLENBQzlELEtBQUs7S0FDRixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQWtCLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDL0MsR0FBRyxDQUFDLHVCQUFVLENBQUM7S0FDZixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7QUFFbkIsTUFBTSxrQkFBa0IsR0FBRyxDQUN6QixPQUFzQixFQUN0QixLQUFpQyxFQUN6QixFQUFFO0lBQ1YsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU8sRUFBRSxDQUFBO0lBQ1gsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLE9BQU87UUFDbkIsQ0FBQyxDQUFDLCtCQUErQixJQUFBLHVCQUFVLEVBQUMsT0FBTyxDQUFDLFFBQVE7UUFDNUQsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNOLE9BQU8sOEJBQThCLEtBQUssR0FBRyxPQUFPLFFBQVEsQ0FBQTtBQUM5RCxDQUFDLENBQUE7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxD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
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderPackingList = void 0;
4
+ const format_1 = require("./format");
5
+ const html_utils_1 = require("./html-utils");
6
+ const renderBatchAllocations = (line, timeZone) => {
7
+ if (line.batch_allocations.length === 0) {
8
+ return '<span class="muted">-</span>';
9
+ }
10
+ return line.batch_allocations
11
+ .map((allocation) => `<div class="packing-batch">
12
+ <strong>${(0, html_utils_1.escapeHtml)(allocation.lot_number)}</strong>
13
+ <span>MHD: ${(0, html_utils_1.escapeHtml)((0, format_1.formatDocumentDate)(allocation.expiry_date, timeZone))}</span>
14
+ <span>Menge: ${(0, html_utils_1.escapeHtml)(allocation.quantity)}</span>
15
+ </div>`)
16
+ .join("");
17
+ };
18
+ const renderLines = (input, timeZone) => input.lines
19
+ .map((line) => `<tr>
20
+ <td class="item">
21
+ <div class="item-title">${(0, html_utils_1.escapeHtml)(line.title)}</div>
22
+ ${line.sku ? `<div class="sku">SKU: ${(0, html_utils_1.escapeHtml)(line.sku)}</div>` : ""}
23
+ </td>
24
+ <td>${renderBatchAllocations(line, timeZone)}</td>
25
+ <td class="number">${(0, html_utils_1.escapeHtml)(line.quantity)}</td>
26
+ </tr>`)
27
+ .join("");
28
+ const renderPackingList = (input, layout, timeZone) => layout({
29
+ body: `<table class="items packing-items">
30
+ <thead><tr><th class="item">Bezeichnung</th><th>Charge</th><th class="number">Benötigte Menge</th></tr></thead>
31
+ <tbody class="lines">${renderLines(input, timeZone)}</tbody>
32
+ </table>`,
33
+ documentTitle: "Packliste",
34
+ metadata: [
35
+ { label: "Packlistennummer", value: input.document.number },
36
+ {
37
+ label: "Bestellung",
38
+ value: (0, html_utils_1.formatOrderReference)(input.order.display_id),
39
+ },
40
+ { label: "Fulfillment", value: input.fulfillment.id },
41
+ {
42
+ label: "Erstellungsdatum",
43
+ value: (0, format_1.formatDocumentDate)(input.document.generated_at, timeZone),
44
+ },
45
+ { label: "Lagerplatz", value: input.fulfillment.location_name },
46
+ ],
47
+ number: input.document.number,
48
+ pageTitle: "Packliste",
49
+ recipient: null,
50
+ });
51
+ exports.renderPackingList = renderPackingList;
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2luZy1saXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy90ZW1wbGF0ZXMvcGFja2luZy1saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHFDQUE2QztBQUM3Qyw2Q0FBK0Q7QUFHL0QsTUFBTSxzQkFBc0IsR0FBRyxDQUM3QixJQUErQyxFQUMvQyxRQUFnQixFQUNSLEVBQUU7SUFDVixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEMsT0FBTyw4QkFBOEIsQ0FBQTtJQUN2QyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsaUJBQWlCO1NBQzFCLEdBQUcsQ0FDRixDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7a0JBQ0osSUFBQSx1QkFBVSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7cUJBQzlCLElBQUEsdUJBQVUsRUFBQyxJQUFBLDJCQUFrQixFQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7dUJBQzlELElBQUEsdUJBQVUsRUFBQyxVQUFVLENBQUMsUUFBUSxDQUFDO2FBQ3pDLENBQ1I7U0FDQSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDYixDQUFDLENBQUE7QUFFRCxNQUFNLFdBQVcsR0FBRyxDQUNsQixLQUErQixFQUMvQixRQUFnQixFQUNSLEVBQUUsQ0FDVixLQUFLLENBQUMsS0FBSztLQUNSLEdBQUcsQ0FDRixDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7O29DQUVvQixJQUFBLHVCQUFVLEVBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUM5QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsSUFBQSx1QkFBVSxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFOztjQUVuRSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDOzZCQUN2QixJQUFBLHVCQUFVLEVBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUMxQyxDQUNQO0tBQ0EsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBRU4sTUFBTSxpQkFBaUIsR0FBRyxDQUMvQixLQUErQixFQUMvQixNQUFzQixFQUN0QixRQUFnQixFQUNSLEVBQUUsQ0FDVixNQUFNLENBQUM7SUFDTCxJQUFJLEVBQUU7OzZCQUVtQixXQUFXLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQzthQUM1QztJQUNULGFBQWEsRUFBRSxXQUFXO0lBQzFCLFFBQVEsRUFBRTtRQUNSLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtRQUMzRDtZQUNFLEtBQUssRUFBRSxZQUFZO1lBQ25CLEtBQUssRUFBRSxJQUFBLGlDQUFvQixFQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1NBQ3BEO1FBQ0QsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRTtRQUNyRDtZQUNFLEtBQUssRUFBRSxrQkFBa0I7WUFDekIsS0FBSyxFQUFFLElBQUEsMkJBQWtCLEVBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDO1NBQ2pFO1FBQ0QsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRTtLQUNoRTtJQUNELE1BQU0sRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU07SUFDN0IsU0FBUyxFQUFFLFdBQVc7SUFDdEIsU0FBUyxFQUFFLElBQUk7Q0FDaEIsQ0FBQyxDQUFBO0FBM0JTLFFBQUEsaUJBQWlCLHFCQTJCMUIifQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4tYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy90eXBlcy9hZG1pbi1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtc3VtbWFyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9kb2N1bWVudHMvdHlwZXMvZG9jdW1lbnQtc3VtbWFyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy90eXBlcy9kb2N1bWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineDocumentHtmlFactory = void 0;
4
+ const defineDocumentHtmlFactory = (factory) => factory;
5
+ exports.defineDocumentHtmlFactory = defineDocumentHtmlFactory;
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy90eXBlcy9odG1sLWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBVU8sTUFBTSx5QkFBeUIsR0FBRyxDQUN2QyxPQUE0QixFQUNQLEVBQUUsQ0FBQyxPQUFPLENBQUE7QUFGcEIsUUFBQSx5QkFBeUIsNkJBRUwifQ==
@@ -0,0 +1,22 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./admin-api"), exports);
18
+ __exportStar(require("./documents"), exports);
19
+ __exportStar(require("./document-summary"), exports);
20
+ __exportStar(require("./html-factory"), exports);
21
+ __exportStar(require("./store-api"), exports);
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZG9jdW1lbnRzL3R5cGVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw4Q0FBMkI7QUFDM0IsOENBQTJCO0FBQzNCLHFEQUFrQztBQUNsQyxpREFBOEI7QUFDOUIsOENBQTJCIn0=
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy90eXBlcy9zdG9yZS1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveDocumentMerchant = void 0;
4
+ const public_1 = require("../../public");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const merchant_1 = require("../../modules/documents/domain/merchant");
7
+ /**
8
+ * The shop's sender facts for one render: shop master data of the base
9
+ * plugin (stored in the Admin) > the plugin's `merchant` option. Fails with
10
+ * `UNEXPECTED_STATE` naming the missing fields, so the document is marked
11
+ * failed and issued again once the data is complete. Read failures propagate.
12
+ */
13
+ const resolveDocumentMerchant = async (container, fallback) => {
14
+ const { values } = await (0, public_1.getShopMasterData)(container, fallback);
15
+ const resolution = (0, merchant_1.toDocumentMerchant)(values);
16
+ if (!resolution.merchant) {
17
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Shop-Stammdaten unvollständig: ${resolution.missing.join(", ")}. Bitte unter Einstellungen → Hartl Services Plugins → Shop-Stammdaten ergänzen.`);
18
+ }
19
+ return resolution.merchant;
20
+ };
21
+ exports.resolveDocumentMerchant = resolveDocumentMerchant;
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtbWVyY2hhbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZG9jdW1lbnRzL3V0aWxzL2RvY3VtZW50LW1lcmNoYW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFnRDtBQUVoRCxxREFBdUQ7QUFFdkQsc0VBR2dEO0FBR2hEOzs7OztHQUtHO0FBQ0ksTUFBTSx1QkFBdUIsR0FBRyxLQUFLLEVBQzFDLFNBQTBCLEVBQzFCLFFBQWdDLEVBQ0wsRUFBRTtJQUM3QixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLDBCQUFpQixFQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUMvRCxNQUFNLFVBQVUsR0FBRyxJQUFBLDZCQUFrQixFQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyxrQ0FBa0MsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtGQUFrRixDQUNsSixDQUFBO0lBQ0gsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQTtBQUM1QixDQUFDLENBQUE7QUFiWSxRQUFBLHVCQUF1QiwyQkFhbkMifQ==