@hartl-services/medusa-base 1.0.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 (71) hide show
  1. package/.medusa/server/src/admin/index.js +117 -1
  2. package/.medusa/server/src/admin/index.mjs +118 -2
  3. package/.medusa/server/src/documents/plugin-features.js +15 -1
  4. package/.medusa/server/src/documents/templates/financial-document.js +69 -51
  5. package/.medusa/server/src/documents/templates/format.js +44 -2
  6. package/.medusa/server/src/documents/templates/html-factory.js +7 -5
  7. package/.medusa/server/src/documents/templates/html-utils.js +12 -2
  8. package/.medusa/server/src/documents/templates/layout.js +115 -70
  9. package/.medusa/server/src/documents/templates/packing-list.js +10 -8
  10. package/.medusa/server/src/documents/utils/document-render-settings.js +59 -0
  11. package/.medusa/server/src/email/application/handle-invite-event.js +8 -2
  12. package/.medusa/server/src/email/application/handle-password-reset-event.js +16 -4
  13. package/.medusa/server/src/email/domain/order-summary.js +103 -0
  14. package/.medusa/server/src/email/domain/refund-summary.js +43 -0
  15. package/.medusa/server/src/email/domain/return-summary.js +118 -0
  16. package/.medusa/server/src/email/domain/shipment-summary.js +74 -0
  17. package/.medusa/server/src/email/plugin-features.js +9 -1
  18. package/.medusa/server/src/email/rendering/default-templates.js +693 -65
  19. package/.medusa/server/src/email/rendering/load-email-shop-details.js +36 -0
  20. package/.medusa/server/src/email/rendering/render-email.js +16 -3
  21. package/.medusa/server/src/email/rendering/resolve-shop-configuration.js +20 -1
  22. package/.medusa/server/src/email/types/template-data.js +155 -2
  23. package/.medusa/server/src/modules/plugin-features/domain/plugin-settings.js +4 -3
  24. package/.medusa/server/src/public/descriptor.js +3 -1
  25. package/.medusa/server/src/public/shop-master-data.js +2 -2
  26. package/.medusa/server/src/shop-config/build-food-shop-config.js +5 -1
  27. package/.medusa/server/src/shop-config/options.js +5 -1
  28. package/.medusa/server/src/workflows/documents/issue-document.js +4 -2
  29. package/.medusa/server/src/workflows/documents/issue-packing-list.js +8 -2
  30. package/.medusa/server/src/workflows/email/dispatch-email-message.js +4 -2
  31. package/.medusa/server/src/workflows/email/prepare-order-canceled-email.js +42 -4
  32. package/.medusa/server/src/workflows/email/prepare-order-received-email.js +31 -5
  33. package/.medusa/server/src/workflows/email/prepare-refund-email.js +25 -1
  34. package/.medusa/server/src/workflows/email/prepare-return-email.js +64 -3
  35. package/.medusa/server/src/workflows/email/prepare-shipment-email.js +36 -3
  36. package/README.md +166 -9
  37. package/dist/admin-components/features/plugin-features/components/ImageSettingInput.d.ts +15 -0
  38. package/dist/admin-components/features/plugin-features/components/ImageSettingInput.js +42 -0
  39. package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.js +4 -2
  40. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +1 -1
  41. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.d.ts +4 -4
  42. package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +1 -1
  43. package/dist/admin-components/features/plugin-features/lib/image-upload.d.ts +6 -0
  44. package/dist/admin-components/features/plugin-features/lib/image-upload.js +17 -0
  45. package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +4 -4
  46. package/dist/admin-components/i18n/texts.d.ts +6 -0
  47. package/dist/admin-components/i18n/texts.js +6 -0
  48. package/dist/documents/templates/financial-document.d.ts +3 -3
  49. package/dist/documents/templates/financial-document.js +68 -50
  50. package/dist/documents/templates/format.d.ts +14 -0
  51. package/dist/documents/templates/format.js +43 -1
  52. package/dist/documents/templates/html-factory.d.ts +6 -2
  53. package/dist/documents/templates/html-factory.js +6 -4
  54. package/dist/documents/templates/html-utils.d.ts +6 -0
  55. package/dist/documents/templates/html-utils.js +11 -1
  56. package/dist/documents/templates/layout.d.ts +21 -3
  57. package/dist/documents/templates/layout.js +114 -69
  58. package/dist/documents/templates/packing-list.js +9 -7
  59. package/dist/documents/types/documents.d.ts +17 -0
  60. package/dist/documents/types/html-factory.d.ts +1 -0
  61. package/dist/email/types/shop-configuration.d.ts +25 -0
  62. package/dist/email/types/template-data.d.ts +509 -0
  63. package/dist/email/types/template-data.js +154 -1
  64. package/dist/public/descriptor.js +2 -0
  65. package/dist/public/shop-master-data.d.ts +1 -1
  66. package/dist/public/shop-master-data.js +1 -1
  67. package/dist/public/types.d.ts +2 -1
  68. package/dist/shop-config/build-food-shop-config.js +4 -0
  69. package/dist/shop-config/options.d.ts +10 -3
  70. package/dist/shop-config/options.js +4 -0
  71. package/package.json +2 -2
@@ -1,91 +1,719 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createDefaultEmailRenderers = exports.createDefaultEmailLayout = void 0;
4
+ const format_1 = require("../../documents/templates/format");
4
5
  const escapeHtml = (value) => value
5
6
  .replaceAll("&", "&")
6
7
  .replaceAll("<", "&lt;")
7
8
  .replaceAll(">", "&gt;")
8
9
  .replaceAll('"', "&quot;")
9
10
  .replaceAll("'", "&#039;");
10
- /** Neutral default layout; the shop appears only as `displayName`. */
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
+ */
11
87
  const createDefaultEmailLayout = (displayName) => {
12
- const shop = escapeHtml(displayName);
13
- return ({ bodyHtml, preheader, subject }) => `<!doctype html>
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>
14
92
  <html lang="de">
15
93
  <head>
16
94
  <meta charset="utf-8" />
17
95
  <meta name="viewport" content="width=device-width, initial-scale=1" />
96
+ <meta name="color-scheme" content="light" />
18
97
  <title>${escapeHtml(subject)}</title>
19
98
  </head>
20
- <body style="background: #f2f2f5; color: #24242b; font-family: Arial, sans-serif; margin: 0; padding: 24px 12px;">
99
+ <body style="margin: 0; padding: 0; background: ${COLOR.background}; font-family: ${FONT}; color: ${COLOR.text};">
21
100
  <div style="display: none; max-height: 0; overflow: hidden; opacity: 0;">${escapeHtml(preheader)}</div>
22
- <main style="background: #ffffff; margin: 0 auto; max-width: 600px; padding: 32px;">
23
- <header>
24
- <h1 style="color: #1f1f2e; margin: 0;">${shop}</h1>
25
- <div style="background: #6b5bff; height: 2px; margin: 16px 0 24px;"></div>
26
- </header>
27
- ${bodyHtml}
28
- <footer style="border-top: 1px solid #6b5bff; color: #6b6b74; font-size: 12px; margin-top: 28px; padding-top: 16px;">${shop}</footer>
29
- </main>
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>
30
126
  </body>
31
127
  </html>`;
128
+ };
32
129
  };
33
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
+ };
34
445
  /** Neutral German default renderers, one per accepted email kind. */
35
- const createDefaultEmailRenderers = ({ affiliatePortalUrl, displayName, }) => {
36
- const shop = escapeHtml(displayName);
446
+ const createDefaultEmailRenderers = ({ adminOrderUrl, affiliatePortalUrl, displayName, timeZone, }) => {
37
447
  return {
38
- "order.received": ({ order_id }) => ({
39
- bodyHtml: `<p>Vielen Dank für deine Bestellung <strong>${escapeHtml(order_id)}</strong>. Wir haben sie erhalten und bearbeiten sie jetzt.</p>`,
40
- subject: "Wir haben deine Bestellung erhalten",
41
- text: `Vielen Dank für deine Bestellung ${order_id}. Wir haben sie erhalten und bearbeiten sie jetzt.`,
42
- }),
43
- "order.received.admin": ({ order_id }) => ({
44
- bodyHtml: `<p>Die neue Bestellung <strong>${escapeHtml(order_id)}</strong> ist eingegangen und kann jetzt bearbeitet werden.</p>`,
45
- subject: "Neue Bestellung eingegangen",
46
- text: `Die neue Bestellung ${order_id} ist eingegangen und kann jetzt bearbeitet werden.`,
47
- }),
48
- "order.shipped": ({ order_id, fulfillment_id }) => ({
49
- bodyHtml: `<p>Deine Bestellung <strong>${escapeHtml(order_id)}</strong> ist unterwegs.</p><p>Versandreferenz: ${escapeHtml(fulfillment_id)}</p>`,
50
- subject: "Deine Bestellung ist unterwegs",
51
- text: `Deine Bestellung ${order_id} ist unterwegs. Versandreferenz: ${fulfillment_id}.`,
52
- }),
53
- "order.canceled": ({ order_id }) => ({
54
- bodyHtml: `<p>Deine Bestellung <strong>${escapeHtml(order_id)}</strong> wurde storniert.</p>`,
55
- subject: "Deine Bestellung wurde storniert",
56
- text: `Deine Bestellung ${order_id} wurde storniert.`,
57
- }),
58
- "order.return_requested": ({ order_id, return_id }) => ({
59
- bodyHtml: `<p>Wir haben deine Rücksendeanfrage <strong>${escapeHtml(return_id)}</strong> zur Bestellung ${escapeHtml(order_id)} erhalten.</p>`,
60
- subject: "Wir haben deine Rücksendeanfrage erhalten",
61
- text: `Wir haben deine Rücksendeanfrage ${return_id} zur Bestellung ${order_id} erhalten.`,
62
- }),
63
- "order.return_received": ({ order_id, return_id }) => ({
64
- bodyHtml: `<p>Deine Rücksendung <strong>${escapeHtml(return_id)}</strong> zur Bestellung ${escapeHtml(order_id)} ist bei uns eingetroffen.</p>`,
65
- subject: "Deine Rücksendung ist eingetroffen",
66
- text: `Deine Rücksendung ${return_id} zur Bestellung ${order_id} ist bei uns eingetroffen.`,
67
- }),
68
- "order.refunded": ({ order_id, refund_id }) => ({
69
- bodyHtml: `<p>Die Erstattung <strong>${escapeHtml(refund_id)}</strong> zur Bestellung ${escapeHtml(order_id)} wurde veranlasst.</p>`,
70
- subject: "Deine Erstattung wurde veranlasst",
71
- text: `Die Erstattung ${refund_id} zur Bestellung ${order_id} wurde veranlasst.`,
72
- }),
73
- "auth.password_reset": ({ reset_url }) => ({
74
- bodyHtml: `<p>Du hast ein neues Passwort angefordert.</p><p><a href="${escapeHtml(reset_url)}">Passwort sicher zurücksetzen</a></p>`,
75
- subject: `Setze dein ${displayName} Passwort zurück`,
76
- text: `Du hast ein neues Passwort angefordert. Setze es hier zurück: ${reset_url}`,
77
- }),
78
- "affiliate.consignment_report_due": ({ affiliate_display_name, due_date, period_start, }) => ({
79
- bodyHtml: `<p>Hallo ${escapeHtml(affiliate_display_name)}, bitte reiche deine Monatsmeldung für ${escapeHtml(period_start)} bis ${escapeHtml(due_date)} ein.</p><p><a href="${escapeHtml(affiliatePortalUrl)}">Zum Partnerbereich</a></p>`,
80
- subject: "Erinnerung: Monatsmeldung einreichen",
81
- text: `Hallo ${affiliate_display_name}, bitte reiche deine Monatsmeldung für ${period_start} bis ${due_date} ein: ${affiliatePortalUrl}`,
82
- }),
83
- "user.invite": ({ invite_url }) => ({
84
- bodyHtml: `<p>Du wurdest eingeladen, dem ${shop}-Adminteam beizutreten.</p><p><a href="${escapeHtml(invite_url)}">Einladung annehmen</a></p>`,
85
- subject: `Du wurdest zu ${displayName} eingeladen`,
86
- text: `Du wurdest eingeladen, dem ${displayName}-Adminteam beizutreten. Einladung annehmen: ${invite_url}`,
87
- }),
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
+ },
88
716
  };
89
717
  };
90
718
  exports.createDefaultEmailRenderers = createDefaultEmailRenderers;
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC10ZW1wbGF0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZW1haWwvcmVuZGVyaW5nL2RlZmF1bHQtdGVtcGxhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU1BLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBYSxFQUFVLEVBQUUsQ0FDM0MsS0FBSztLQUNGLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO0tBQ3hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0tBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0tBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO0tBQ3pCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFFL0Isc0VBQXNFO0FBQy9ELE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxXQUFtQixFQUFlLEVBQUU7SUFDM0UsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRXJDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDOzs7OzthQUtsQyxVQUFVLENBQUMsT0FBTyxDQUFDOzs7K0VBRytDLFVBQVUsQ0FBQyxTQUFTLENBQUM7OztpREFHbkQsSUFBSTs7O1FBRzdDLFFBQVE7NkhBQzZHLElBQUk7OztRQUd6SCxDQUFDO0FBQ1QsQ0FBQyxDQUFDO0FBdEJXLFFBQUEsd0JBQXdCLDRCQXNCbkM7QUFFRixxRUFBcUU7QUFDOUQsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLEVBQzFDLGtCQUFrQixFQUNsQixXQUFXLEdBSVosRUFBb0IsRUFBRTtJQUNyQixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFckMsT0FBTztRQUNMLGdCQUFnQixFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMs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
719
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC10ZW1wbGF0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZW1haWwvcmVuZGVyaW5nL2RlZmF1bHQtdGVtcGxhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZEQUEyRTtBQWMzRSxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQWEsRUFBVSxFQUFFLENBQzNDLEtBQUs7S0FDRixVQUFVLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztLQUN4QixVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQztLQUN2QixVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQztLQUN2QixVQUFVLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQztLQUN6QixVQUFVLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBRS9CLDhFQUE4RTtBQUM5RSxNQUFNLElBQUksR0FDUixxRkFBcUYsQ0FBQztBQUN4RixNQUFNLEtBQUssR0FBRztJQUNaLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLElBQUksRUFBRSxTQUFTO0lBQ2YsS0FBSyxFQUFFLFNBQVM7SUFDaEIsS0FBSyxFQUFFLFNBQVM7Q0FDUixDQUFDO0FBRVgsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFZLEVBQVUsRUFBRSxDQUN6Qyw0Q0FBNEMsSUFBSSxnREFBZ0QsS0FBSyxDQUFDLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQztBQUU3SCxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWEsRUFBVSxFQUFFLENBQy9DLGdEQUFnRCxJQUFJLG9IQUFvSCxLQUFLLENBQUMsS0FBSyxNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0FBRXBOLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBOEMsRUFBVSxFQUFFLENBQ3pFLDZIQUE2SCxLQUFLLENBQUMsVUFBVSwwQkFBMEIsSUFB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