@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,719 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDefaultEmailRenderers = exports.createDefaultEmailLayout = void 0;
4
+ const format_1 = require("../../documents/templates/format");
5
+ const escapeHtml = (value) => value
6
+ .replaceAll("&", "&")
7
+ .replaceAll("<", "&lt;")
8
+ .replaceAll(">", "&gt;")
9
+ .replaceAll('"', "&quot;")
10
+ .replaceAll("'", "&#039;");
11
+ // Mail clients ignore stylesheets and flexbox: tables and inline styles only.
12
+ const FONT = "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif";
13
+ const COLOR = {
14
+ background: "#f4f4f5",
15
+ border: "#e4e4e7",
16
+ heading: "#18181b",
17
+ text: "#3f3f46",
18
+ muted: "#71717a",
19
+ faint: "#a1a1aa",
20
+ };
21
+ const paragraph = (html) => `<p style="margin: 0 0 16px; font-family: ${FONT}; font-size: 15px; line-height: 24px; color: ${COLOR.text};">${html}</p>`;
22
+ const sectionHeading = (label) => `<h2 style="margin: 28px 0 12px; font-family: ${FONT}; font-size: 13px; line-height: 18px; font-weight: 600; letter-spacing: 0.4px; text-transform: uppercase; color: ${COLOR.muted};">${escapeHtml(label)}</h2>`;
23
+ const details = (rows) => `<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="margin: 8px 0 24px; background: ${COLOR.background}; border-radius: 6px;">${rows
24
+ .map(([label, value]) => `<tr><td style="padding: 10px 16px; font-family: ${FONT}; font-size: 13px; color: ${COLOR.muted}; width: 45%;">${escapeHtml(label)}</td><td style="padding: 10px 16px; font-family: ${FONT}; font-size: 14px; font-weight: 600; color: ${COLOR.heading};">${escapeHtml(value)}</td></tr>`)
25
+ .join("")}</table>`;
26
+ const button = (url, label) => {
27
+ const href = escapeHtml(url);
28
+ return `<table role="presentation" cellpadding="0" cellspacing="0" border="0" style="margin: 8px 0 24px;"><tr><td style="border-radius: 6px; background: ${COLOR.heading};"><a href="${href}" style="display: inline-block; padding: 12px 22px; font-family: ${FONT}; font-size: 15px; font-weight: 600; color: #ffffff; text-decoration: none; border-radius: 6px;">${escapeHtml(label)}</a></td></tr></table>`;
29
+ };
30
+ const isHttpUrl = (value) => {
31
+ if (!value) {
32
+ return false;
33
+ }
34
+ try {
35
+ const { protocol } = new URL(value);
36
+ return protocol === "http:" || protocol === "https:";
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ };
42
+ const joinPresent = (values, separator) => values.filter((value) => Boolean(value?.trim())).join(separator);
43
+ const logoHtml = (shop, displayName) => isHttpUrl(shop.logo)
44
+ ? // Height only: mail clients scale the width to the logo's aspect ratio.
45
+ `<img src="${escapeHtml(shop.logo)}" alt="${escapeHtml(displayName)}" height="56" style="display: block; margin: 0 auto; height: 56px; width: auto; max-width: 240px; border: 0; outline: none; text-decoration: none;" />`
46
+ : `<span style="font-family: ${FONT}; font-size: 20px; font-weight: 700; color: ${COLOR.heading};">${escapeHtml(displayName)}</span>`;
47
+ const linkStyle = `color: ${COLOR.muted}; text-decoration: underline;`;
48
+ /** "Fragen? Schreib uns an … oder ruf uns an unter …"; empty without contact data. */
49
+ const contactHtml = (shop) => {
50
+ const email = shop.email?.trim();
51
+ const phone = shop.phone?.trim();
52
+ const mail = email
53
+ ? `schreib uns an <a href="mailto:${escapeHtml(email)}" style="${linkStyle}">${escapeHtml(email)}</a>`
54
+ : "";
55
+ const call = phone
56
+ ? `ruf uns an unter <a href="tel:${escapeHtml(phone.replace(/[^\d+]/g, ""))}" style="${linkStyle}">${escapeHtml(phone)}</a>`
57
+ : "";
58
+ const ways = joinPresent([mail, call], " oder ");
59
+ return ways ? `Fragen? Dann ${ways}.` : "";
60
+ };
61
+ /** Company details of the footer, one entry per line. */
62
+ const companyLines = (shop, displayName) => {
63
+ const website = isHttpUrl(shop.website)
64
+ ? `<a href="${escapeHtml(shop.website)}" style="${linkStyle}">${escapeHtml(shop.website.replace(/^https?:\/\//, "").replace(/\/$/, ""))}</a>`
65
+ : "";
66
+ const register = joinPresent([
67
+ shop.company_register_number &&
68
+ `Firmenbuch: ${escapeHtml(shop.company_register_number)}`,
69
+ shop.company_register_court && escapeHtml(shop.company_register_court),
70
+ ], ", ");
71
+ return [
72
+ escapeHtml(shop.legal_name?.trim() || displayName),
73
+ escapeHtml(joinPresent([
74
+ shop.address_line1,
75
+ shop.address_line2,
76
+ joinPresent([shop.postal_code, shop.city], " "),
77
+ shop.country_code ? countryName(shop.country_code) : null,
78
+ ], ", ")),
79
+ joinPresent([shop.vat_number && `UID: ${escapeHtml(shop.vat_number)}`, register], " · "),
80
+ website,
81
+ ].filter(Boolean);
82
+ };
83
+ /**
84
+ * Neutral grey default layout: logo (or `displayName`) on top, the subject
85
+ * as heading, contact line and the shop master data in the footer.
86
+ */
87
+ const createDefaultEmailLayout = (displayName) => {
88
+ return ({ audience, bodyHtml, preheader, shop, subject }) => {
89
+ // The shop's own team does not need to be told how to reach the shop.
90
+ const contact = audience === "customer" ? contactHtml(shop) : "";
91
+ return `<!doctype html>
92
+ <html lang="de">
93
+ <head>
94
+ <meta charset="utf-8" />
95
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
96
+ <meta name="color-scheme" content="light" />
97
+ <title>${escapeHtml(subject)}</title>
98
+ </head>
99
+ <body style="margin: 0; padding: 0; background: ${COLOR.background}; font-family: ${FONT}; color: ${COLOR.text};">
100
+ <div style="display: none; max-height: 0; overflow: hidden; opacity: 0;">${escapeHtml(preheader)}</div>
101
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="background: ${COLOR.background};">
102
+ <tr>
103
+ <td align="center" style="padding: 32px 12px;">
104
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="max-width: 600px;">
105
+ <tr>
106
+ <td align="center" style="padding: 0 4px 24px; text-align: center;">${logoHtml(shop, displayName)}</td>
107
+ </tr>
108
+ <tr>
109
+ <td style="background: #ffffff; border: 1px solid ${COLOR.border}; border-radius: 8px; padding: 36px 32px; font-family: ${FONT}; font-size: 15px; line-height: 24px; color: ${COLOR.text};">
110
+ <h1 style="margin: 0 0 20px; font-family: ${FONT}; font-size: 22px; line-height: 30px; font-weight: 700; color: ${COLOR.heading};">${escapeHtml(subject)}</h1>
111
+ ${bodyHtml}
112
+ </td>
113
+ </tr>${contact
114
+ ? `
115
+ <tr>
116
+ <td align="center" style="padding: 24px 4px 0; font-family: ${FONT}; font-size: 14px; line-height: 21px; color: ${COLOR.text}; text-align: center;">${contact}</td>
117
+ </tr>`
118
+ : ""}
119
+ <tr>
120
+ <td align="center" style="padding: 24px 4px 0; font-family: ${FONT}; font-size: 12px; line-height: 18px; color: ${COLOR.faint}; text-align: center;">${companyLines(shop, displayName).join("<br />")}<br /><br />Diese E-Mail wurde automatisch versendet.</td>
121
+ </tr>
122
+ </table>
123
+ </td>
124
+ </tr>
125
+ </table>
126
+ </body>
127
+ </html>`;
128
+ };
129
+ };
130
+ exports.createDefaultEmailLayout = createDefaultEmailLayout;
131
+ const orderReference = (summary, orderId) => summary.display_id === null ? orderId : `#${summary.display_id}`;
132
+ // Medusa names the variant of a product without options "Default variant".
133
+ const isDefaultVariantTitle = (title) => /^default( variant)?$/i.test(title);
134
+ const countryName = (countryCode) => {
135
+ try {
136
+ return (new Intl.DisplayNames("de", { type: "region" }).of(countryCode.toUpperCase()) ?? countryCode.toUpperCase());
137
+ }
138
+ catch {
139
+ return countryCode.toUpperCase();
140
+ }
141
+ };
142
+ const addressLines = (address) => [
143
+ address.company,
144
+ [address.first_name, address.last_name].filter(Boolean).join(" "),
145
+ address.address_1,
146
+ address.address_2,
147
+ [address.postal_code, address.city].filter(Boolean).join(" "),
148
+ address.country_code ? countryName(address.country_code) : null,
149
+ ].filter((line) => Boolean(line));
150
+ const orderSummaryRows = (summary) => {
151
+ const money = (amount) => (0, format_1.formatMoney)({ amount, currencyCode: summary.currency_code });
152
+ const shippingLabel = summary.shipping_method_names.length
153
+ ? `Versand (${summary.shipping_method_names.join(", ")})`
154
+ : "Versand";
155
+ const rows = [
156
+ { label: "Zwischensumme", amount: money(summary.original_item_total) },
157
+ {
158
+ label: shippingLabel,
159
+ amount: Number(summary.original_shipping_total) === 0
160
+ ? "kostenlos"
161
+ : money(summary.original_shipping_total),
162
+ },
163
+ ];
164
+ if (Number(summary.discount_total) > 0) {
165
+ rows.push({
166
+ label: "Rabatt",
167
+ amount: `− ${money(summary.discount_total)}`,
168
+ });
169
+ }
170
+ rows.push({
171
+ label: "Gesamt",
172
+ amount: money(summary.total),
173
+ emphasis: true,
174
+ note: Number(summary.tax_total) > 0
175
+ ? `inkl. ${money(summary.tax_total)} MwSt.`
176
+ : undefined,
177
+ });
178
+ return rows;
179
+ };
180
+ const renderOrderSummaryHtml = (summary, heading, { withAddresses = true } = {}) => {
181
+ const money = (amount) => escapeHtml((0, format_1.formatMoney)({ amount, currencyCode: summary.currency_code }));
182
+ const cell = `font-family: ${FONT}; font-size: 14px; line-height: 20px; color: ${COLOR.text}; padding: 12px 0; border-bottom: 1px solid ${COLOR.border};`;
183
+ const items = summary.items
184
+ .map((item) => {
185
+ const variant = item.variant_title && !isDefaultVariantTitle(item.variant_title)
186
+ ? `<br /><span style="font-size: 13px; color: ${COLOR.muted};">${escapeHtml(item.variant_title)}</span>`
187
+ : "";
188
+ return `<tr><td style="${cell}"><span style="color: ${COLOR.heading}; font-weight: 600;">${escapeHtml(item.title)}</span>${variant}</td><td style="${cell} width: 48px; text-align: right; white-space: nowrap; color: ${COLOR.muted};">${escapeHtml(String(item.quantity))} ×</td><td style="${cell} width: 110px; text-align: right; white-space: nowrap;">${money(item.original_total)}</td></tr>`;
189
+ })
190
+ .join("");
191
+ const totals = orderSummaryRows(summary)
192
+ .map(({ amount, emphasis, label, note }) => {
193
+ const style = emphasis
194
+ ? `padding: 12px 0 0; font-size: 16px; font-weight: 700; color: ${COLOR.heading}; border-top: 1px solid ${COLOR.border};`
195
+ : `padding: 4px 0; font-size: 14px; color: ${COLOR.text};`;
196
+ const noteHtml = note
197
+ ? `<tr><td colspan="2" style="padding: 2px 0 0; font-family: ${FONT}; font-size: 12px; color: ${COLOR.muted}; text-align: right;">${escapeHtml(note)}</td></tr>`
198
+ : "";
199
+ return `<tr><td style="font-family: ${FONT}; ${style}">${escapeHtml(label)}</td><td style="font-family: ${FONT}; ${style} text-align: right; white-space: nowrap;">${escapeHtml(amount)}</td></tr>${noteHtml}`;
200
+ })
201
+ .join("");
202
+ const addressColumn = (label, address) => address
203
+ ? `<td valign="top" width="50%" style="padding: 0 12px 0 0;">${sectionHeading(label)}<p style="margin: 0; font-family: ${FONT}; font-size: 14px; line-height: 21px; color: ${COLOR.text};">${addressLines(address).map(escapeHtml).join("<br />")}</p></td>`
204
+ : "";
205
+ const addresses = withAddresses
206
+ ? addressColumn("Lieferadresse", summary.shipping_address) +
207
+ addressColumn("Rechnungsadresse", summary.billing_address)
208
+ : "";
209
+ return `${sectionHeading(heading)}
210
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0">${items}</table>
211
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="margin-top: 12px;">${totals}</table>
212
+ ${addresses ? `<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="margin-top: 8px;"><tr>${addresses}</tr></table>` : ""}`;
213
+ };
214
+ const renderOrderSummaryText = (summary, { withAddresses = true } = {}) => {
215
+ const money = (amount) => (0, format_1.formatMoney)({ amount, currencyCode: summary.currency_code });
216
+ const items = summary.items.map((item) => {
217
+ const variant = item.variant_title && !isDefaultVariantTitle(item.variant_title)
218
+ ? ` (${item.variant_title})`
219
+ : "";
220
+ return `${item.quantity} × ${item.title}${variant}: ${money(item.original_total)}`;
221
+ });
222
+ const totals = orderSummaryRows(summary).flatMap(({ amount, label, note }) => note ? [`${label}: ${amount}`, note] : [`${label}: ${amount}`]);
223
+ const address = (label, value) => withAddresses && value ? ["", `${label}:`, ...addressLines(value)] : [];
224
+ return [
225
+ ...items,
226
+ "",
227
+ ...totals,
228
+ ...address("Lieferadresse", summary.shipping_address),
229
+ ...address("Rechnungsadresse", summary.billing_address),
230
+ ].join("\n");
231
+ };
232
+ const itemLabelText = (title, variantTitle) => variantTitle && !isDefaultVariantTitle(variantTitle)
233
+ ? `${title} (${variantTitle})`
234
+ : title;
235
+ const shipmentReference = (shipment, orderId) => shipment.display_id === null ? orderId : `#${shipment.display_id}`;
236
+ const shipmentRows = (shipment, orderId) => {
237
+ const rows = [
238
+ ["Bestellnummer", shipmentReference(shipment, orderId)],
239
+ ];
240
+ if (shipment.shipping_method_name) {
241
+ rows.push(["Versandart", shipment.shipping_method_name]);
242
+ }
243
+ const numbers = shipment.tracking
244
+ .map(({ number }) => number)
245
+ .filter((number) => number !== null);
246
+ if (numbers.length) {
247
+ rows.push([
248
+ numbers.length === 1 ? "Sendungsnummer" : "Sendungsnummern",
249
+ numbers.join(", "),
250
+ ]);
251
+ }
252
+ return rows;
253
+ };
254
+ /** Tracking links as entered at shipping; only http(s) URLs are linked. */
255
+ const trackingLinks = (shipment) => shipment.tracking
256
+ .filter((entry) => isHttpUrl(entry.url ?? undefined))
257
+ .map((entry, index, all) => ({
258
+ label: all.length === 1
259
+ ? "Sendung verfolgen"
260
+ : `Sendung ${entry.number ?? index + 1} verfolgen`,
261
+ url: entry.url,
262
+ }));
263
+ /** Items with quantity and without prices (parcels, returns). */
264
+ const itemListHtml = (items) => {
265
+ const cell = `font-family: ${FONT}; font-size: 14px; line-height: 20px; color: ${COLOR.text}; padding: 12px 0; border-bottom: 1px solid ${COLOR.border};`;
266
+ const subline = (text) => `<br /><span style="font-size: 13px; color: ${COLOR.muted};">${escapeHtml(text)}</span>`;
267
+ const rows = items
268
+ .map((item) => {
269
+ const variant = item.variant_title && !isDefaultVariantTitle(item.variant_title)
270
+ ? subline(item.variant_title)
271
+ : "";
272
+ const note = item.note ? subline(item.note) : "";
273
+ return `<tr><td style="${cell}"><span style="color: ${COLOR.heading}; font-weight: 600;">${escapeHtml(item.title)}</span>${variant}${note}</td><td style="${cell} width: 48px; text-align: right; white-space: nowrap; color: ${COLOR.muted};">${escapeHtml(String(item.quantity))} ×</td></tr>`;
274
+ })
275
+ .join("");
276
+ return `<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="margin-bottom: 20px;">${rows}</table>`;
277
+ };
278
+ const addressHtml = (label, address) => `${sectionHeading(label)}<p style="margin: 0 0 16px; font-family: ${FONT}; font-size: 14px; line-height: 21px; color: ${COLOR.text};">${addressLines(address).map(escapeHtml).join("<br />")}</p>`;
279
+ const SHIPMENT_INTRO = "Gute Nachrichten: Deine Bestellung hat unser Lager verlassen und ist auf dem Weg zu dir.";
280
+ const MORE_TO_FOLLOW = "Weitere Artikel deiner Bestellung folgen in einer separaten Sendung.";
281
+ const INVOICE_ATTACHED = "Die Rechnung findest du im Anhang.";
282
+ const renderShipmentHtml = (shipment, orderId, invoiceAttached) => {
283
+ const links = trackingLinks(shipment);
284
+ const tracking = links.length === 1
285
+ ? button(links[0].url, links[0].label)
286
+ : links
287
+ .map(({ label, url }) => paragraph(`<a href="${escapeHtml(url)}" style="color: ${COLOR.heading}; font-weight: 600;">${escapeHtml(label)}</a>`))
288
+ .join("");
289
+ const notes = [
290
+ shipment.more_to_follow ? MORE_TO_FOLLOW : null,
291
+ invoiceAttached ? INVOICE_ATTACHED : null,
292
+ ]
293
+ .filter((note) => note !== null)
294
+ .map((note) => paragraph(escapeHtml(note)))
295
+ .join("");
296
+ const address = shipment.delivery_address
297
+ ? `${sectionHeading("Lieferadresse")}<p style="margin: 0; font-family: ${FONT}; font-size: 14px; line-height: 21px; color: ${COLOR.text};">${addressLines(shipment.delivery_address).map(escapeHtml).join("<br />")}</p>`
298
+ : "";
299
+ return `${paragraph(escapeHtml(SHIPMENT_INTRO))}${details(shipmentRows(shipment, orderId))}${tracking}${shipment.items.length
300
+ ? `${sectionHeading("In diesem Paket")}${itemListHtml(shipment.items)}`
301
+ : ""}${notes}${address}`;
302
+ };
303
+ const renderShipmentText = (shipment, orderId, invoiceAttached) => [
304
+ SHIPMENT_INTRO,
305
+ "",
306
+ ...shipmentRows(shipment, orderId).map(([label, value]) => `${label}: ${value}`),
307
+ ...trackingLinks(shipment).map(({ label, url }) => `${label}: ${url}`),
308
+ ...(shipment.items.length
309
+ ? [
310
+ "",
311
+ "In diesem Paket:",
312
+ ...shipment.items.map((item) => `${item.quantity} × ${itemLabelText(item.title, item.variant_title)}`),
313
+ ]
314
+ : []),
315
+ ...(shipment.more_to_follow ? ["", MORE_TO_FOLLOW] : []),
316
+ ...(invoiceAttached ? ["", INVOICE_ATTACHED] : []),
317
+ ...(shipment.delivery_address
318
+ ? ["", "Lieferadresse:", ...addressLines(shipment.delivery_address)]
319
+ : []),
320
+ ].join("\n");
321
+ const CANCELED_INTRO = "Deine Bestellung wurde storniert. Du musst nichts weiter tun.";
322
+ const CANCELED_PAYMENT = "Falls du bereits bezahlt hast, erstatten wir dir den Betrag auf dem ursprünglichen Zahlungsweg.";
323
+ const CANCELLATION_ATTACHED = "Die Stornorechnung findest du im Anhang.";
324
+ const RETURN_CREATED = "Wir haben die Rücksendung zu deiner Bestellung angelegt.";
325
+ const RETURN_INSTRUCTIONS = "Bitte schick uns die unten aufgeführten Artikel an die angegebene Adresse zurück.";
326
+ const returnReference = (summary) => summary.display_id === null ? null : `#R${summary.display_id}`;
327
+ const returnRows = (summary) => {
328
+ const reference = returnReference(summary);
329
+ return [
330
+ ...(summary.order_display_id === null
331
+ ? []
332
+ : [["Bestellnummer", `#${summary.order_display_id}`]]),
333
+ ...(reference ? [["Rücksendenummer", reference]] : []),
334
+ ...(summary.shipping_method_name
335
+ ? [["Rücksendeart", summary.shipping_method_name]]
336
+ : []),
337
+ ];
338
+ };
339
+ const returnNotes = (summary) => {
340
+ const reference = returnReference(summary);
341
+ return [
342
+ ...(reference
343
+ ? [
344
+ `Bitte leg einen Zettel mit der Rücksendenummer ${reference} bei, damit wir dein Paket zuordnen können.`,
345
+ ]
346
+ : []),
347
+ ];
348
+ };
349
+ const returnItems = (summary) => summary.items.map((item) => ({
350
+ ...item,
351
+ note: item.reason ? `Grund: ${item.reason}` : null,
352
+ }));
353
+ const renderReturnRequestedHtml = (summary) => {
354
+ const rows = returnRows(summary);
355
+ return `${paragraph(escapeHtml(`${RETURN_CREATED} ${RETURN_INSTRUCTIONS}`))}${rows.length ? details(rows) : ""}${summary.items.length
356
+ ? `${sectionHeading("Zurückzuschicken")}${itemListHtml(returnItems(summary))}`
357
+ : ""}${summary.return_address ? addressHtml("Rücksendeadresse", summary.return_address) : ""}${returnNotes(summary)
358
+ .map((note) => paragraph(escapeHtml(note)))
359
+ .join("")}`;
360
+ };
361
+ const renderReturnRequestedText = (summary) => [
362
+ `${RETURN_CREATED} ${RETURN_INSTRUCTIONS}`,
363
+ ...(returnRows(summary).length
364
+ ? [
365
+ "",
366
+ ...returnRows(summary).map(([label, value]) => `${label}: ${value}`),
367
+ ]
368
+ : []),
369
+ ...(summary.items.length
370
+ ? [
371
+ "",
372
+ "Zurückzuschicken:",
373
+ ...returnItems(summary).map((item) => `${item.quantity} × ${itemLabelText(item.title, item.variant_title)}${item.note ? ` – ${item.note}` : ""}`),
374
+ ]
375
+ : []),
376
+ ...(summary.return_address
377
+ ? ["", "Rücksendeadresse:", ...addressLines(summary.return_address)]
378
+ : []),
379
+ ...returnNotes(summary).flatMap((note) => ["", note]),
380
+ ].join("\n");
381
+ const RETURN_RECEIVED = "Deine Rücksendung ist bei uns eingetroffen. Vielen Dank!";
382
+ const RETURN_REFUND = "Falls dir eine Erstattung zusteht, veranlassen wir sie in Kürze auf dem ursprünglichen Zahlungsweg.";
383
+ const receivedItems = (summary) => summary.items.map((item) => ({
384
+ ...item,
385
+ note: item.damaged_quantity > 0
386
+ ? `davon beschädigt eingegangen: ${item.damaged_quantity}`
387
+ : null,
388
+ }));
389
+ const refundRows = (summary, timeZone) => [
390
+ ...(summary.order_display_id === null
391
+ ? []
392
+ : [["Bestellnummer", `#${summary.order_display_id}`]]),
393
+ [
394
+ "Betrag",
395
+ (0, format_1.formatMoney)({
396
+ amount: summary.amount,
397
+ currencyCode: summary.currency_code,
398
+ }),
399
+ ],
400
+ ...(summary.refunded_at && timeZone
401
+ ? [
402
+ [
403
+ "Erstattet am",
404
+ (0, format_1.formatDate)(summary.refunded_at, {
405
+ timeZone,
406
+ options: { dateStyle: "medium" },
407
+ }),
408
+ ],
409
+ ]
410
+ : []),
411
+ ...(summary.reason ? [["Grund", summary.reason]] : []),
412
+ ];
413
+ const REFUND_INTRO = "Wir haben dir eine Erstattung veranlasst.";
414
+ const REFUND_DURATION = "Je nach Zahlungsart kann es einige Tage dauern, bis der Betrag auf deinem Konto sichtbar ist.";
415
+ const PASSWORD_RESET_BUTTON = "Neues Passwort festlegen";
416
+ const PASSWORD_RESET_IGNORE = "Falls du kein neues Passwort angefordert hast, kannst du diese E-Mail ignorieren. Dein bisheriges Passwort bleibt dann unverändert.";
417
+ /** The link as copyable text below a button, for clients that block it. */
418
+ const linkFallbackHtml = (url) => `<p style="margin: 0 0 16px; font-family: ${FONT}; font-size: 13px; line-height: 20px; color: ${COLOR.muted};">Falls der Button nicht funktioniert, kopiere diesen Link in deinen Browser:<br /><a href="${escapeHtml(url)}" style="color: ${COLOR.muted}; word-break: break-all;">${escapeHtml(url)}</a></p>`;
419
+ const CONSIGNMENT_BILLING = "Aus deinem gezählten Bestand ergeben sich die verkauften Artikel, die wir dir anschließend in Rechnung stellen.";
420
+ const CONSIGNMENT_IGNORE = "Falls du die Meldung inzwischen eingereicht hast, kannst du diese E-Mail ignorieren.";
421
+ // Calendar values (YYYY-MM-DD) are dates, not instants: format them in UTC so
422
+ // no time zone shifts them to the neighbouring day.
423
+ const calendarMonth = (value) => (0, format_1.formatDate)(`${value}T00:00:00.000Z`, {
424
+ timeZone: "UTC",
425
+ options: { month: "long", year: "numeric" },
426
+ });
427
+ const calendarDate = (value) => (0, format_1.formatDate)(`${value}T00:00:00.000Z`, {
428
+ timeZone: "UTC",
429
+ options: { dateStyle: "medium" },
430
+ });
431
+ const INVITE_BUTTON = "Einladung annehmen";
432
+ const INVITE_IGNORE = "Falls du mit dieser Einladung nichts anfangen kannst, ignoriere diese E-Mail einfach.";
433
+ /** "Ada Beispiel" from the billing, else the shipping address; `null` without. */
434
+ const customerName = (summary) => {
435
+ for (const address of [summary.billing_address, summary.shipping_address]) {
436
+ const name = [address?.first_name, address?.last_name]
437
+ .filter(Boolean)
438
+ .join(" ");
439
+ if (name) {
440
+ return name;
441
+ }
442
+ }
443
+ return null;
444
+ };
445
+ /** Neutral German default renderers, one per accepted email kind. */
446
+ const createDefaultEmailRenderers = ({ adminOrderUrl, affiliatePortalUrl, displayName, timeZone, }) => {
447
+ return {
448
+ "order.received": ({ order_id, summary }) => {
449
+ const subject = "Wir haben deine Bestellung erhalten";
450
+ if (!summary) {
451
+ return {
452
+ bodyHtml: paragraph(`Vielen Dank für deine Bestellung <strong>${escapeHtml(order_id)}</strong>, diese ist bei uns eingetroffen und wir werden sie umgehend bearbeiten.`),
453
+ subject,
454
+ text: `Vielen Dank für deine Bestellung ${order_id}, diese ist bei uns eingetroffen und wir werden sie umgehend bearbeiten.`,
455
+ };
456
+ }
457
+ const reference = orderReference(summary, order_id);
458
+ const intro = "Vielen Dank für deine Bestellung, diese ist bei uns eingetroffen und wir werden sie umgehend bearbeiten.";
459
+ return {
460
+ bodyHtml: `${paragraph(escapeHtml(intro))}${details([["Bestellnummer", reference]])}${renderOrderSummaryHtml(summary, "Deine Bestellung")}`,
461
+ subject,
462
+ text: `${intro}\n\nBestellnummer: ${reference}\n\n${renderOrderSummaryText(summary)}`,
463
+ };
464
+ },
465
+ "order.received.admin": ({ order_id, summary }) => {
466
+ if (!summary) {
467
+ return {
468
+ bodyHtml: `<p>Die neue Bestellung <strong>${escapeHtml(order_id)}</strong> ist eingegangen und kann jetzt bearbeitet werden.</p>`,
469
+ subject: "Neue Bestellung eingegangen",
470
+ text: `Die neue Bestellung ${order_id} ist eingegangen und kann jetzt bearbeitet werden.`,
471
+ };
472
+ }
473
+ const reference = orderReference(summary, order_id);
474
+ const name = customerName(summary);
475
+ const intro = "Eine neue Bestellung ist eingegangen und kann jetzt bearbeitet werden.";
476
+ const rows = [
477
+ ["Bestellnummer", reference],
478
+ ];
479
+ if (name) {
480
+ rows.push(["Kunde", name]);
481
+ }
482
+ if (summary.email) {
483
+ rows.push(["E-Mail", summary.email]);
484
+ }
485
+ if (timeZone) {
486
+ rows.push([
487
+ "Bestellt am",
488
+ (0, format_1.formatDate)(summary.placed_at, {
489
+ timeZone,
490
+ options: { dateStyle: "medium", timeStyle: "short" },
491
+ }),
492
+ ]);
493
+ }
494
+ const adminUrl = adminOrderUrl?.({ orderId: order_id });
495
+ return {
496
+ bodyHtml: `${paragraph(escapeHtml(intro))}${details(rows)}${adminUrl ? button(adminUrl, "Im Admin öffnen") : ""}${renderOrderSummaryHtml(summary, "Bestellung")}`,
497
+ subject: `Neue Bestellung ${reference}${name ? ` von ${name}` : ""}`,
498
+ text: [
499
+ intro,
500
+ "",
501
+ ...rows.map(([label, value]) => `${label}: ${value}`),
502
+ ...(adminUrl ? ["", `Im Admin öffnen: ${adminUrl}`] : []),
503
+ "",
504
+ renderOrderSummaryText(summary),
505
+ ].join("\n"),
506
+ };
507
+ },
508
+ "order.shipped": ({ fulfillment_id, invoice_attached, order_id, shipment, }) => {
509
+ const subject = `Deine Bestellung bei ${displayName} ist unterwegs`;
510
+ if (!shipment) {
511
+ return {
512
+ bodyHtml: `<p>Deine Bestellung <strong>${escapeHtml(order_id)}</strong> ist unterwegs.</p><p>Versandreferenz: ${escapeHtml(fulfillment_id)}</p>`,
513
+ subject,
514
+ text: `Deine Bestellung ${order_id} ist unterwegs. Versandreferenz: ${fulfillment_id}.`,
515
+ };
516
+ }
517
+ const invoiceAttached = invoice_attached === true;
518
+ return {
519
+ bodyHtml: renderShipmentHtml(shipment, order_id, invoiceAttached),
520
+ subject,
521
+ text: renderShipmentText(shipment, order_id, invoiceAttached),
522
+ };
523
+ },
524
+ "order.canceled": ({ canceled_at, cancellation_attached, order_id, summary, }) => {
525
+ const reference = summary ? orderReference(summary, order_id) : null;
526
+ const rows = reference
527
+ ? [["Bestellnummer", reference]]
528
+ : [];
529
+ if (reference && canceled_at && timeZone) {
530
+ rows.push([
531
+ "Storniert am",
532
+ (0, format_1.formatDate)(canceled_at, {
533
+ timeZone,
534
+ options: { dateStyle: "medium" },
535
+ }),
536
+ ]);
537
+ }
538
+ const notes = [
539
+ CANCELED_PAYMENT,
540
+ ...(cancellation_attached === true ? [CANCELLATION_ATTACHED] : []),
541
+ ];
542
+ return {
543
+ bodyHtml: `${paragraph(escapeHtml(CANCELED_INTRO))}${rows.length ? details(rows) : ""}${notes.map((note) => paragraph(escapeHtml(note))).join("")}${summary ? renderOrderSummaryHtml(summary, "Stornierte Bestellung", { withAddresses: false }) : ""}`,
544
+ subject: `Deine Bestellung${reference ? ` ${reference}` : ""} bei ${displayName} wurde storniert`,
545
+ text: [
546
+ CANCELED_INTRO,
547
+ ...(rows.length
548
+ ? ["", ...rows.map(([label, value]) => `${label}: ${value}`)]
549
+ : []),
550
+ ...notes.flatMap((note) => ["", note]),
551
+ ...(summary
552
+ ? [
553
+ "",
554
+ "Stornierte Bestellung:",
555
+ renderOrderSummaryText(summary, { withAddresses: false }),
556
+ ]
557
+ : []),
558
+ ].join("\n"),
559
+ };
560
+ },
561
+ "order.return_requested": ({ summary }) => {
562
+ if (!summary) {
563
+ return {
564
+ bodyHtml: paragraph(escapeHtml(RETURN_CREATED)),
565
+ subject: `Deine Rücksendung bei ${displayName}`,
566
+ text: RETURN_CREATED,
567
+ };
568
+ }
569
+ return {
570
+ bodyHtml: renderReturnRequestedHtml(summary),
571
+ subject: summary.order_display_id === null
572
+ ? `Deine Rücksendung bei ${displayName}`
573
+ : `Deine Rücksendung zur Bestellung #${summary.order_display_id} bei ${displayName}`,
574
+ text: renderReturnRequestedText(summary),
575
+ };
576
+ },
577
+ "order.return_received": ({ summary }) => {
578
+ if (!summary) {
579
+ return {
580
+ bodyHtml: paragraph(escapeHtml(RETURN_RECEIVED)),
581
+ subject: `Deine Rücksendung bei ${displayName} ist eingetroffen`,
582
+ text: RETURN_RECEIVED,
583
+ };
584
+ }
585
+ const reference = returnReference(summary);
586
+ const rows = [
587
+ ...(summary.order_display_id === null
588
+ ? []
589
+ : [["Bestellnummer", `#${summary.order_display_id}`]]),
590
+ ...(reference ? [["Rücksendenummer", reference]] : []),
591
+ ];
592
+ if (summary.received_at && timeZone) {
593
+ rows.push([
594
+ "Eingegangen am",
595
+ (0, format_1.formatDate)(summary.received_at, {
596
+ timeZone,
597
+ options: { dateStyle: "medium" },
598
+ }),
599
+ ]);
600
+ }
601
+ const items = receivedItems(summary);
602
+ return {
603
+ bodyHtml: `${paragraph(escapeHtml(RETURN_RECEIVED))}${rows.length ? details(rows) : ""}${items.length
604
+ ? `${sectionHeading("Erhaltene Artikel")}${itemListHtml(items)}`
605
+ : ""}${paragraph(escapeHtml(RETURN_REFUND))}`,
606
+ subject: summary.order_display_id === null
607
+ ? `Deine Rücksendung bei ${displayName} ist eingetroffen`
608
+ : `Deine Rücksendung zur Bestellung #${summary.order_display_id} bei ${displayName} ist eingetroffen`,
609
+ text: [
610
+ RETURN_RECEIVED,
611
+ ...(rows.length
612
+ ? ["", ...rows.map(([label, value]) => `${label}: ${value}`)]
613
+ : []),
614
+ ...(items.length
615
+ ? [
616
+ "",
617
+ "Erhaltene Artikel:",
618
+ ...items.map((item) => `${item.quantity} × ${itemLabelText(item.title, item.variant_title)}${item.note ? ` – ${item.note}` : ""}`),
619
+ ]
620
+ : []),
621
+ "",
622
+ RETURN_REFUND,
623
+ ].join("\n"),
624
+ };
625
+ },
626
+ "order.refunded": ({ cancellation_attached, summary }) => {
627
+ const attachment = cancellation_attached === true ? [CANCELLATION_ATTACHED] : [];
628
+ if (!summary) {
629
+ const notes = [REFUND_INTRO, ...attachment];
630
+ return {
631
+ bodyHtml: notes.map((note) => paragraph(escapeHtml(note))).join(""),
632
+ subject: `Deine Erstattung bei ${displayName}`,
633
+ text: notes.join("\n\n"),
634
+ };
635
+ }
636
+ const rows = refundRows(summary, timeZone);
637
+ const notes = [REFUND_DURATION, ...attachment];
638
+ return {
639
+ bodyHtml: `${paragraph(escapeHtml(REFUND_INTRO))}${details(rows)}${notes.map((note) => paragraph(escapeHtml(note))).join("")}`,
640
+ subject: summary.order_display_id === null
641
+ ? `Deine Erstattung bei ${displayName}`
642
+ : `Deine Erstattung zur Bestellung #${summary.order_display_id} bei ${displayName}`,
643
+ text: [
644
+ REFUND_INTRO,
645
+ "",
646
+ ...rows.map(([label, value]) => `${label}: ${value}`),
647
+ ...notes.flatMap((note) => ["", note]),
648
+ ].join("\n"),
649
+ };
650
+ },
651
+ "auth.password_reset": ({ reset_url, valid_minutes }) => {
652
+ const intro = `Du hast ein neues Passwort für dein Kundenkonto bei ${displayName} angefordert. Über den Button kannst du es jetzt festlegen.`;
653
+ const validity = valid_minutes
654
+ ? `Der Link ist ${valid_minutes} ${valid_minutes === 1 ? "Minute" : "Minuten"} gültig.`
655
+ : null;
656
+ return {
657
+ bodyHtml: `${paragraph(escapeHtml(intro))}${button(reset_url, PASSWORD_RESET_BUTTON)}${linkFallbackHtml(reset_url)}${validity ? paragraph(escapeHtml(validity)) : ""}${paragraph(escapeHtml(PASSWORD_RESET_IGNORE))}`,
658
+ subject: `Neues Passwort für dein Kundenkonto bei ${displayName}`,
659
+ text: [
660
+ intro,
661
+ "",
662
+ `${PASSWORD_RESET_BUTTON}: ${reset_url}`,
663
+ ...(validity ? ["", validity] : []),
664
+ "",
665
+ PASSWORD_RESET_IGNORE,
666
+ ].join("\n"),
667
+ };
668
+ },
669
+ "affiliate.consignment_report_due": ({ affiliate_display_name, due_date, period_start, }) => {
670
+ const month = calendarMonth(period_start);
671
+ const greeting = `Hallo ${affiliate_display_name},`;
672
+ const intro = `deine Monatsmeldung für ${month} liegt uns noch nicht vor. Bitte zähl deinen Kommissionsbestand und reich die Meldung im Partnerbereich ein.`;
673
+ const rows = [
674
+ ["Meldemonat", month],
675
+ ["Stichtag", calendarDate(due_date)],
676
+ ];
677
+ return {
678
+ bodyHtml: `${paragraph(escapeHtml(greeting))}${paragraph(escapeHtml(intro))}${details(rows)}${paragraph(escapeHtml(CONSIGNMENT_BILLING))}${button(affiliatePortalUrl, "Zum Partnerbereich")}${paragraph(escapeHtml(CONSIGNMENT_IGNORE))}`,
679
+ subject: `Erinnerung: Deine Monatsmeldung für ${month}`,
680
+ text: [
681
+ greeting,
682
+ "",
683
+ intro,
684
+ "",
685
+ ...rows.map(([label, value]) => `${label}: ${value}`),
686
+ "",
687
+ CONSIGNMENT_BILLING,
688
+ "",
689
+ `Zum Partnerbereich: ${affiliatePortalUrl}`,
690
+ "",
691
+ CONSIGNMENT_IGNORE,
692
+ ].join("\n"),
693
+ };
694
+ },
695
+ "user.invite": ({ expires_at, invite_url }) => {
696
+ const intro = `Du wurdest eingeladen, im Admin-Bereich von ${displayName} mitzuarbeiten. Über den Button legst du dein Benutzerkonto an.`;
697
+ const validity = expires_at && timeZone
698
+ ? `Die Einladung ist gültig bis ${(0, format_1.formatDate)(expires_at, {
699
+ timeZone,
700
+ options: { dateStyle: "medium", timeStyle: "short" },
701
+ })} Uhr.`
702
+ : null;
703
+ return {
704
+ bodyHtml: `${paragraph(escapeHtml(intro))}${button(invite_url, INVITE_BUTTON)}${linkFallbackHtml(invite_url)}${validity ? paragraph(escapeHtml(validity)) : ""}${paragraph(escapeHtml(INVITE_IGNORE))}`,
705
+ subject: `Einladung ins Admin-Team von ${displayName}`,
706
+ text: [
707
+ intro,
708
+ "",
709
+ `${INVITE_BUTTON}: ${invite_url}`,
710
+ ...(validity ? ["", validity] : []),
711
+ "",
712
+ INVITE_IGNORE,
713
+ ].join("\n"),
714
+ };
715
+ },
716
+ };
717
+ };
718
+ exports.createDefaultEmailRenderers = createDefaultEmailRenderers;
719
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC10ZW1wbGF0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZW1haWwvcmVuZGVyaW5nL2RlZmF1bHQtdGVtcGxhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZEQUEyRTtBQWMzRSxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQWEsRUFBVSxFQUFFLENBQzNDLEtBQUs7S0FDRixVQUFVLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztLQUN4QixVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQztLQUN2QixVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQztLQUN2QixVQUFVLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQztLQUN6QixVQUFVLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBRS9CLDhFQUE4RTtBQUM5RSxNQUFNLElBQUksR0FDUixxRkFBcUYsQ0FBQztBQUN4RixNQUFNLEtBQUssR0FBRztJQUNaLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLElBQUksRUFBRSxTQUFTO0lBQ2YsS0FBSyxFQUFFLFNBQVM7SUFDaEIsS0FBSyxFQUFFLFNBQVM7Q0FDUixDQUFDO0FBRVgsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFZLEVBQVUsRUFBRSxDQUN6Qyw0Q0FBNEMsSUFBSSxnREFBZ0QsS0FBSyxDQUFDLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQztBQUU3SCxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWEsRUFBVSxFQUFFLENBQy9DLGdEQUFnRCxJQUFJLG9IQUFvSCxLQUFLLENBQUMsS0FBSyxNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0FBRXBOLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBOEMsRUFBVSxFQUFFLENBQ3pFLDZIQUE2SCxLQUFLLENBQUMsVUFBVSwwQkFBMEIsSUFB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