@hartl-services/medusa-base 1.0.0 → 2.0.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 (79) 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-merchant.js +5 -5
  11. package/.medusa/server/src/documents/utils/document-render-settings.js +59 -0
  12. package/.medusa/server/src/email/application/handle-invite-event.js +8 -2
  13. package/.medusa/server/src/email/application/handle-password-reset-event.js +16 -4
  14. package/.medusa/server/src/email/domain/order-summary.js +103 -0
  15. package/.medusa/server/src/email/domain/refund-summary.js +43 -0
  16. package/.medusa/server/src/email/domain/return-summary.js +118 -0
  17. package/.medusa/server/src/email/domain/shipment-summary.js +74 -0
  18. package/.medusa/server/src/email/plugin-features.js +9 -1
  19. package/.medusa/server/src/email/rendering/default-templates.js +693 -65
  20. package/.medusa/server/src/email/rendering/load-email-shop-details.js +36 -0
  21. package/.medusa/server/src/email/rendering/render-email.js +16 -3
  22. package/.medusa/server/src/email/rendering/resolve-shop-configuration.js +20 -1
  23. package/.medusa/server/src/email/types/template-data.js +155 -2
  24. package/.medusa/server/src/modules/documents/domain/merchant.js +2 -33
  25. package/.medusa/server/src/modules/documents/domain/options.js +1 -7
  26. package/.medusa/server/src/modules/plugin-features/domain/plugin-settings.js +4 -3
  27. package/.medusa/server/src/public/descriptor.js +3 -1
  28. package/.medusa/server/src/public/shop-master-data.js +7 -7
  29. package/.medusa/server/src/shop-config/build-food-shop-config.js +6 -6
  30. package/.medusa/server/src/shop-config/options.js +5 -15
  31. package/.medusa/server/src/workflows/documents/issue-cancellation-after-refund.js +2 -3
  32. package/.medusa/server/src/workflows/documents/issue-document.js +6 -5
  33. package/.medusa/server/src/workflows/documents/issue-packing-list.js +9 -3
  34. package/.medusa/server/src/workflows/email/dispatch-email-message.js +4 -2
  35. package/.medusa/server/src/workflows/email/prepare-order-canceled-email.js +42 -4
  36. package/.medusa/server/src/workflows/email/prepare-order-received-email.js +31 -5
  37. package/.medusa/server/src/workflows/email/prepare-refund-email.js +25 -1
  38. package/.medusa/server/src/workflows/email/prepare-return-email.js +64 -3
  39. package/.medusa/server/src/workflows/email/prepare-shipment-email.js +36 -3
  40. package/README.md +180 -43
  41. package/dist/admin-components/features/plugin-features/components/ImageSettingInput.d.ts +15 -0
  42. package/dist/admin-components/features/plugin-features/components/ImageSettingInput.js +42 -0
  43. package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.js +4 -2
  44. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +1 -1
  45. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.d.ts +4 -4
  46. package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +1 -1
  47. package/dist/admin-components/features/plugin-features/lib/image-upload.d.ts +6 -0
  48. package/dist/admin-components/features/plugin-features/lib/image-upload.js +17 -0
  49. package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +4 -4
  50. package/dist/admin-components/i18n/texts.d.ts +6 -0
  51. package/dist/admin-components/i18n/texts.js +6 -0
  52. package/dist/documents/templates/financial-document.d.ts +3 -3
  53. package/dist/documents/templates/financial-document.js +68 -50
  54. package/dist/documents/templates/format.d.ts +14 -0
  55. package/dist/documents/templates/format.js +43 -1
  56. package/dist/documents/templates/html-factory.d.ts +6 -2
  57. package/dist/documents/templates/html-factory.js +6 -4
  58. package/dist/documents/templates/html-utils.d.ts +6 -0
  59. package/dist/documents/templates/html-utils.js +11 -1
  60. package/dist/documents/templates/layout.d.ts +21 -3
  61. package/dist/documents/templates/layout.js +114 -69
  62. package/dist/documents/templates/packing-list.js +9 -7
  63. package/dist/documents/types/documents.d.ts +11 -16
  64. package/dist/documents/types/html-factory.d.ts +1 -0
  65. package/dist/email/types/shop-configuration.d.ts +25 -0
  66. package/dist/email/types/template-data.d.ts +509 -0
  67. package/dist/email/types/template-data.js +154 -1
  68. package/dist/modules/documents/domain/options.d.ts +1 -9
  69. package/dist/modules/documents/domain/options.js +0 -6
  70. package/dist/public/descriptor.js +2 -0
  71. package/dist/public/shop-master-data.d.ts +5 -6
  72. package/dist/public/shop-master-data.js +6 -6
  73. package/dist/public/types.d.ts +2 -1
  74. package/dist/shop-config/build-food-shop-config.js +5 -5
  75. package/dist/shop-config/options.d.ts +13 -8
  76. package/dist/shop-config/options.js +4 -14
  77. package/package.json +2 -2
  78. package/dist/modules/documents/domain/merchant.d.ts +0 -22
  79. package/dist/modules/documents/domain/merchant.js +0 -85
@@ -10,9 +10,11 @@ const packing_list_1 = require("./packing-list");
10
10
  * sender comes with every render input (`input.merchant`, the base plugin's
11
11
  * shop master data). `timeZone` is the IANA time zone in which printed dates
12
12
  * are shown; the plugin passes its resolved `numbering.timeZone` so the date
13
- * on a document matches the period its number was allocated in.
13
+ * on a document matches the period its number was allocated in. `theme`
14
+ * adds a project's CSS and page background (watermark) on top of the default
15
+ * look; the logo comes from the Documents settings (`input.settings`).
14
16
  */
15
- const createDefaultDocumentHtmlFactory = ({ timeZone, }) => {
17
+ const createDefaultDocumentHtmlFactory = ({ timeZone, theme, }) => {
16
18
  return (input) => {
17
19
  const kind = input.document.kind;
18
20
  switch (kind) {
@@ -20,12 +22,12 @@ const createDefaultDocumentHtmlFactory = ({ timeZone, }) => {
20
22
  case "cancellation":
21
23
  case "credit_note":
22
24
  if ("totals" in input) {
23
- return (0, financial_document_1.renderFinancialDocument)(input, (0, layout_1.createDocumentLayout)(input.merchant, true), timeZone);
25
+ return (0, financial_document_1.renderFinancialDocument)(input, (0, layout_1.createDocumentLayout)(input.merchant, input.settings, true, theme), timeZone);
24
26
  }
25
27
  break;
26
28
  case "packing_list":
27
29
  if ("fulfillment" in input) {
28
- return (0, packing_list_1.renderPackingList)(input, (0, layout_1.createDocumentLayout)(input.merchant, false), timeZone);
30
+ return (0, packing_list_1.renderPackingList)(input, (0, layout_1.createDocumentLayout)(input.merchant, input.settings, false, theme), timeZone);
29
31
  }
30
32
  break;
31
33
  default: {
@@ -37,4 +39,4 @@ const createDefaultDocumentHtmlFactory = ({ timeZone, }) => {
37
39
  };
38
40
  };
39
41
  exports.createDefaultDocumentHtmlFactory = createDefaultDocumentHtmlFactory;
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy90ZW1wbGF0ZXMvaHRtbC1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxxSUFBcUk7OztBQUlySSxxQ0FBK0M7QUFDL0MsNkRBQThEO0FBQzlELGlEQUFrRDtBQUVsRDs7Ozs7O0dBTUc7QUFDSSxNQUFNLGdDQUFnQyxHQUFHLENBQUMsRUFDL0MsUUFBUSxHQUdULEVBQXVCLEVBQUU7SUFDeEIsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ2YsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUE7UUFFaEMsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxjQUFjLENBQUM7WUFDcEIsS0FBSyxhQUFhO2dCQUNoQixJQUFJLFFBQVEsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDdEIsT0FBTyxJQUFBLDRDQUF1QixFQUM1QixLQUFLLEVBQ0wsSUFBQSw2QkFBb0IsRUFBQyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUMxQyxRQUFRLENBQ1QsQ0FBQTtnQkFDSCxDQUFDO2dCQUNELE1BQUs7WUFDUCxLQUFLLGNBQWM7Z0JBQ2pCLElBQUksYUFBYSxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUMzQixPQUFPLElBQUEsZ0NBQWlCLEVBQ3RCLEtBQUssRUFDTCxJQUFBLDZCQUFvQixFQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQzNDLFFBQVEsQ0FDVCxDQUFBO2dCQUNILENBQUM7Z0JBQ0QsTUFBSztZQUNQLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ1IsTUFBTSxlQUFlLEdBQVUsSUFBSSxDQUFBO2dCQUNuQyxNQUFNLElBQUksU0FBUyxDQUFDLDhCQUE4QixlQUFlLEVBQUUsQ0FBQyxDQUFBO1lBQ3RFLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxJQUFJLFNBQVMsQ0FBQyxvQ0FBb0MsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUNqRSxDQUFDLENBQUE7QUFDSCxDQUFDLENBQUE7QUFyQ1ksUUFBQSxnQ0FBZ0Msb0NBcUM1QyJ9
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy90ZW1wbGF0ZXMvaHRtbC1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxxSUFBcUk7OztBQUlySSxxQ0FBbUU7QUFDbkUsNkRBQThEO0FBQzlELGlEQUFrRDtBQUVsRDs7Ozs7Ozs7R0FRRztBQUNJLE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQyxFQUMvQyxRQUFRLEVBQ1IsS0FBSyxHQUlOLEVBQXVCLEVBQUU7SUFDeEIsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ2YsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUE7UUFFaEMsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxjQUFjLENBQUM7WUFDcEIsS0FBSyxhQUFhO2dCQUNoQixJQUFJLFFBQVEsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDdEIsT0FBTyxJQUFBLDRDQUF1QixFQUM1QixLQUFLLEVBQ0wsSUFBQSw2QkFBb0IsRUFBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUNqRSxRQUFRLENBQ1QsQ0FBQTtnQkFDSCxDQUFDO2dCQUNELE1BQUs7WUFDUCxLQUFLLGNBQWM7Z0JBQ2pCLElBQUksYUFBYSxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUMzQixPQUFPLElBQUEsZ0NBQWlCLEVBQ3RCLEtBQUssRUFDTCxJQUFBLDZCQUFvQixFQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQ2xFLFFBQVEsQ0FDVCxDQUFBO2dCQUNILENBQUM7Z0JBQ0QsTUFBSztZQUNQLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ1IsTUFBTSxlQUFlLEdBQVUsSUFBSSxDQUFBO2dCQUNuQyxNQUFNLElBQUksU0FBUyxDQUFDLDhCQUE4QixlQUFlLEVBQUUsQ0FBQyxDQUFBO1lBQ3RFLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxJQUFJLFNBQVMsQ0FBQyxvQ0FBb0MsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUNqRSxDQUFDLENBQUE7QUFDSCxDQUFDLENBQUE7QUF2Q1ksUUFBQSxnQ0FBZ0Msb0NBdUM1QyJ9
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.formatOrderReference = exports.escapeHtml = void 0;
3
+ exports.renderMoney = exports.formatOrderReference = exports.escapeHtml = void 0;
4
+ const format_1 = require("./format");
4
5
  const escapeHtml = (value) => String(value ?? "")
5
6
  .replaceAll("&", "&")
6
7
  .replaceAll("<", "&lt;")
@@ -10,4 +11,13 @@ const escapeHtml = (value) => String(value ?? "")
10
11
  exports.escapeHtml = escapeHtml;
11
12
  const formatOrderReference = (displayId) => displayId === null ? "-" : `#${displayId}`;
12
13
  exports.formatOrderReference = formatOrderReference;
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9kb2N1bWVudHMvdGVtcGxhdGVzL2h0bWwtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQU8sTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUF5QyxFQUFVLEVBQUUsQ0FDOUUsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7S0FDaEIsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7S0FDeEIsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUM7S0FDdkIsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUM7S0FDdkIsVUFBVSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUM7S0FDekIsVUFBVSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtBQU5qQixRQUFBLFVBQVUsY0FNTztBQUV2QixNQUFNLG9CQUFvQixHQUFHLENBQUMsU0FBd0IsRUFBVSxFQUFFLENBQ3ZFLFNBQVMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQTtBQUQvQixRQUFBLG9CQUFvQix3QkFDVyJ9
14
+ /**
15
+ * An amount as `<span class="money">` with separate currency and amount
16
+ * spans; `amount` overrides the money's own amount (e.g. a negated value).
17
+ */
18
+ const renderMoney = (money, amount = money.amount) => {
19
+ const parts = (0, format_1.formatMoneyParts)({ amount, currencyCode: money.currency_code });
20
+ return `<span class="money"><span class="currency">${(0, exports.escapeHtml)(parts.currency)}</span> <span class="amount">${(0, exports.escapeHtml)(parts.amount)}</span></span>`;
21
+ };
22
+ exports.renderMoney = renderMoney;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9kb2N1bWVudHMvdGVtcGxhdGVzL2h0bWwtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEscUNBQTJDO0FBRXBDLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBeUMsRUFBVSxFQUFFLENBQzlFLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO0tBQ2hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO0tBQ3hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0tBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0tBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO0tBQ3pCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFOakIsUUFBQSxVQUFVLGNBTU87QUFFdkIsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFNBQXdCLEVBQVUsRUFBRSxDQUN2RSxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxFQUFFLENBQUE7QUFEL0IsUUFBQSxvQkFBb0Isd0JBQ1c7QUFFNUM7OztHQUdHO0FBQ0ksTUFBTSxXQUFXLEdBQUcsQ0FDekIsS0FBb0IsRUFDcEIsU0FBaUIsS0FBSyxDQUFDLE1BQU0sRUFDckIsRUFBRTtJQUNWLE1BQU0sS0FBSyxHQUFHLElBQUEseUJBQWdCLEVBQUMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFBO0lBQzdFLE9BQU8sOENBQThDLElBQUEsa0JBQVUsRUFBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGdDQUFnQyxJQUFBLGtCQUFVLEVBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQTtBQUN6SixDQUFDLENBQUE7QUFOWSxRQUFBLFdBQVcsZUFNdkIifQ==
@@ -1,97 +1,142 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createDocumentLayout = void 0;
3
+ exports.createDocumentLayout = exports.formatCountryName = void 0;
4
4
  const html_utils_1 = require("./html-utils");
5
5
  const formatCountryName = (countryCode) => new Intl.DisplayNames("de", { type: "region" }).of(countryCode.toUpperCase()) ?? countryCode.toUpperCase();
6
- const renderMerchantAddress = (merchant) => [
7
- merchant.address_line1,
8
- merchant.address_line2,
9
- [merchant.postal_code, merchant.city].join(" "),
10
- formatCountryName(merchant.country_code),
11
- ]
12
- .filter((part) => Boolean(part))
6
+ exports.formatCountryName = formatCountryName;
7
+ const joinLines = (lines) => lines
8
+ .filter((line) => Boolean(line))
13
9
  .map(html_utils_1.escapeHtml)
14
10
  .join("<br />");
15
- /** Legal footer: name, UID, company register, contact and bank details that are set. */
11
+ const renderFooterColumn = (heading, lines) => {
12
+ const content = joinLines(lines);
13
+ if (!content) {
14
+ return "";
15
+ }
16
+ const title = heading
17
+ ? `<div class="footer-heading">${(0, html_utils_1.escapeHtml)(heading)}</div>`
18
+ : "";
19
+ return `<div class="footer-column">${title}${content}</div>`;
20
+ };
21
+ /**
22
+ * Legal footer in three columns: sender with UID and company register,
23
+ * contact, bank. Packing lists (`includeLegalDetails: false`) show only the
24
+ * sender's name and address.
25
+ */
16
26
  const renderMerchantFooter = (merchant, includeLegalDetails) => {
27
+ const sender = `<div class="footer-column"><strong>${(0, html_utils_1.escapeHtml)(merchant.legal_name)}</strong><br />${joinLines([
28
+ merchant.address_line1,
29
+ merchant.address_line2,
30
+ `${merchant.postal_code} ${merchant.city}`,
31
+ (0, exports.formatCountryName)(merchant.country_code),
32
+ ...(includeLegalDetails
33
+ ? [
34
+ merchant.vat_number ? `UID: ${merchant.vat_number}` : null,
35
+ merchant.company_register_number
36
+ ? `Firmenbuchnummer: ${merchant.company_register_number}`
37
+ : null,
38
+ merchant.company_register_court
39
+ ? `Firmenbuchgericht: ${merchant.company_register_court}`
40
+ : null,
41
+ ]
42
+ : []),
43
+ ])}</div>`;
17
44
  if (!includeLegalDetails) {
18
- return (0, html_utils_1.escapeHtml)(merchant.legal_name);
45
+ return sender;
19
46
  }
20
- const register = [
21
- merchant.company_register_number
22
- ? `Firmenbuchnummer: ${merchant.company_register_number}`
23
- : null,
24
- merchant.company_register_court
25
- ? `Firmenbuchgericht: ${merchant.company_register_court}`
26
- : null,
27
- ];
28
- const lines = [
29
- [
30
- merchant.legal_name,
31
- merchant.vat_number ? `UID: ${merchant.vat_number}` : null,
32
- ...register,
33
- ],
34
- [merchant.email, merchant.phone, merchant.website],
35
- [
36
- merchant.iban ? `IBAN: ${merchant.iban}` : null,
47
+ return [
48
+ sender,
49
+ renderFooterColumn("Kontakt", [
50
+ merchant.phone,
51
+ merchant.email,
52
+ merchant.website,
53
+ ]),
54
+ // The heading names the IBAN; only the BIC keeps its label.
55
+ renderFooterColumn("Bankverbindung", [
56
+ merchant.iban,
37
57
  merchant.bic ? `BIC: ${merchant.bic}` : null,
38
- ],
39
- ];
40
- return lines
41
- .map((parts) => parts
42
- .filter((part) => Boolean(part))
43
- .map(html_utils_1.escapeHtml)
44
- .join(" · "))
45
- .filter(Boolean)
46
- .join("<br />");
58
+ ]),
59
+ ].join("");
47
60
  };
61
+ const renderLetterhead = (merchant, settings) => settings.logo_src
62
+ ? `<img class="logo" src="${(0, html_utils_1.escapeHtml)(settings.logo_src)}" alt="${(0, html_utils_1.escapeHtml)(merchant.legal_name)}" />`
63
+ : `<div class="logo-text">${(0, html_utils_1.escapeHtml)(merchant.legal_name)}</div>`;
48
64
  const renderMetadata = (metadata) => metadata
49
- .map(({ label, value }) => `<div><strong>${(0, html_utils_1.escapeHtml)(label)}:</strong> ${(0, html_utils_1.escapeHtml)(value)}</div>`)
65
+ .map(({ label, value }) => `<tr><th scope="row">${(0, html_utils_1.escapeHtml)(label)}</th><td>${(0, html_utils_1.escapeHtml)(value)}</td></tr>`)
50
66
  .join("");
51
67
  /**
52
- * `includeLegalDetails` adds UID, company register, contact and bank details
53
- * to the footer (financial documents); packing lists show only the name.
68
+ * A4 with only a bottom page margin, which holds the page number
69
+ * (`@bottom-right`; `counter(pages)` works only in page margin boxes). `.page`
70
+ * carries the other margins and repeats them on every printed page
71
+ * (`box-decoration-break: clone`); the fixed footer is positioned in the page
72
+ * area, `--footer-height` reserves its space at the bottom of each page.
54
73
  */
55
- const createDocumentLayout = (merchant, includeLegalDetails) => ({ body, documentTitle, metadata, number, pageTitle }) => `<!doctype html>
56
- <html lang="de">
57
- <head>
58
- <meta charset="utf-8" />
59
- <title>${(0, html_utils_1.escapeHtml)(pageTitle)} ${(0, html_utils_1.escapeHtml)(number)}</title>
60
- <style>
61
- @page { margin: 18mm; }
62
- body { color: #1f2937; font-family: Arial, sans-serif; font-size: 11px; line-height: 1.45; }
63
- h1 { font-size: 24px; margin: 0 0 6px; }
64
- h2 { break-after: avoid; font-size: 12px; margin: 22px 0 6px; page-break-after: avoid; text-transform: uppercase; }
65
- .header { border-bottom: 2px solid #111827; display: flex; gap: 32px; justify-content: space-between; padding-bottom: 16px; }
66
- .document-metadata { display: flex; flex-wrap: wrap; gap: 6px 28px; margin: 18px 0 22px; }
67
- .document-metadata div { min-width: 180px; }
68
- .muted, .sku, .batch { color: #6b7280; }
69
- .batch, .packing-batch { font-size: 10px; margin-top: 2px; }
74
+ const DEFAULT_STYLESHEET = `
75
+ @page { size: A4; margin: 0 0 8mm 0; @bottom-right { color: #6b7280; content: "Seite " counter(page) " von " counter(pages); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 7.5pt; padding-right: 20mm; vertical-align: top; } }
76
+ :root { --accent: #111827; --text: #1f2937; --muted: #6b7280; --line: #d1d5db; --table-head: #f3f4f6; --page-x: 20mm; --page-top: 18mm; --footer-height: 30mm; }
77
+ * { box-sizing: border-box; }
78
+ html, body { margin: 0; padding: 0; }
79
+ body { color: var(--text); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 10pt; line-height: 1.4; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
80
+ .page { -webkit-box-decoration-break: clone; box-decoration-break: clone; padding: var(--page-top) var(--page-x) calc(var(--footer-height) + 8mm); }
81
+ .letterhead { margin-bottom: 14mm; min-height: 16mm; }
82
+ .logo { display: block; height: 22mm; max-width: 90mm; object-fit: contain; object-position: left center; width: auto; }
83
+ .logo-text { color: var(--accent); font-size: 20pt; font-weight: 700; letter-spacing: 0.02em; }
84
+ .document-head { break-inside: avoid; display: flex; gap: 12mm; justify-content: space-between; margin-bottom: 14mm; page-break-inside: avoid; }
85
+ .recipient { flex: 1 1 0; font-style: normal; padding-top: 9mm; }
86
+ .document-info { flex: 0 0 78mm; }
87
+ h1 { color: var(--accent); font-size: 16pt; font-weight: 400; letter-spacing: 0.08em; margin: 0 0 3mm; text-transform: uppercase; }
88
+ h2 { break-after: avoid; font-size: 10pt; margin: 8mm 0 2mm; page-break-after: avoid; }
89
+ .document-metadata { border-collapse: collapse; width: 100%; }
90
+ .document-metadata th, .document-metadata td { border: 0; font-weight: 400; padding: 0; text-align: left; vertical-align: top; }
91
+ .document-metadata td { text-align: right; }
92
+ .muted, .sku, .batch { color: var(--muted); }
93
+ .batch, .packing-batch { font-size: 8pt; margin-top: 1mm; }
70
94
  .packing-batch { display: flex; gap: 12px; justify-content: space-between; }
71
95
  table { border-collapse: collapse; page-break-inside: auto; width: 100%; }
72
96
  thead { display: table-header-group; }
73
97
  tfoot { display: table-footer-group; }
74
98
  tbody { page-break-inside: auto; }
75
99
  tr { break-inside: avoid; page-break-inside: avoid; }
76
- th { background: #f3f4f6; font-size: 10px; text-align: left; text-transform: uppercase; }
77
- th, td { border-bottom: 1px solid #d1d5db; padding: 8px 6px; vertical-align: top; }
100
+ .items th { background: var(--table-head); font-weight: 700; text-align: left; }
101
+ .items th.number { text-align: right; }
102
+ .items th, .items td { padding: 2.5mm 2mm; vertical-align: top; }
103
+ .items tbody.lines td { border-bottom: 1px solid var(--line); }
78
104
  .number { text-align: right; white-space: nowrap; }
79
- .recipient, .tax-compliance, .totals { break-inside: avoid; page-break-inside: avoid; }
80
- .totals { margin-left: auto; margin-top: 16px; width: 260px; }
81
- .totals td { border: 0; padding: 3px 0; }
82
- .totals tr:last-child td { border-top: 2px solid #111827; font-size: 14px; font-weight: 700; padding-top: 7px; }
83
- footer { border-top: 1px solid #d1d5db; break-inside: avoid; color: #6b7280; font-size: 9px; margin-top: 28px; page-break-inside: avoid; padding-top: 10px; }
84
- </style>
105
+ .money { white-space: nowrap; }
106
+ .items tbody.totals td { padding-bottom: 1.5mm; padding-top: 1.5mm; }
107
+ .items tbody.totals tr:first-child td { padding-top: 3mm; }
108
+ .items tbody.totals tr.grand-total td.label, .items tbody.totals tr.grand-total td.number { border-bottom: 1px solid var(--line); border-top: 1px solid var(--line); font-weight: 700; padding-bottom: 2mm; padding-top: 2mm; }
109
+ .payment-terms { margin-top: 10mm; white-space: pre-line; }
110
+ .recipient, .tax-compliance, .payment-terms, .items tbody.totals { break-inside: avoid; page-break-inside: avoid; }
111
+ .page-footer { align-items: flex-start; bottom: 4mm; color: var(--text); display: flex; font-size: 8pt; gap: 8mm; left: var(--page-x); line-height: 1.35; position: fixed; right: var(--page-x); }
112
+ .footer-column { flex: 1 1 0; }
113
+ .footer-heading { color: var(--muted); }
114
+ `;
115
+ /**
116
+ * `includeLegalDetails` adds UID, company register, contact and bank details
117
+ * to the footer (financial documents); packing lists show only the sender.
118
+ */
119
+ const createDocumentLayout = (merchant, settings, includeLegalDetails, theme = {}) => ({ body, documentTitle, metadata, number, pageTitle, recipient }) => `<!doctype html>
120
+ <html lang="de">
121
+ <head>
122
+ <meta charset="utf-8" />
123
+ <title>${(0, html_utils_1.escapeHtml)(pageTitle)} ${(0, html_utils_1.escapeHtml)(number)}</title>
124
+ <style>${DEFAULT_STYLESHEET}${theme.stylesheet ?? ""}</style>
85
125
  </head>
86
126
  <body>
87
- <section class="header">
88
- <div><h1>${(0, html_utils_1.escapeHtml)(documentTitle)}</h1><div class="muted">${(0, html_utils_1.escapeHtml)(number)}</div></div>
89
- <div><strong>${(0, html_utils_1.escapeHtml)(merchant.legal_name)}</strong><br />${renderMerchantAddress(merchant)}</div>
90
- </section>
91
- <section class="document-metadata">${renderMetadata(metadata)}</section>
92
- ${body}
93
- <footer>${renderMerchantFooter(merchant, includeLegalDetails)}</footer>
127
+ <footer class="page-footer">${renderMerchantFooter(merchant, includeLegalDetails)}</footer>
128
+ <main class="page">
129
+ <header class="letterhead">${renderLetterhead(merchant, settings)}</header>
130
+ <section class="document-head">
131
+ <address class="recipient">${recipient ?? ""}</address>
132
+ <div class="document-info">
133
+ <h1>${(0, html_utils_1.escapeHtml)(documentTitle)}</h1>
134
+ <table class="document-metadata"><tbody>${renderMetadata(metadata)}</tbody></table>
135
+ </div>
136
+ </section>
137
+ ${body}
138
+ </main>
94
139
  </body>
95
140
  </html>`;
96
141
  exports.createDocumentLayout = createDocumentLayout;
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy90ZW1wbGF0ZXMvbGF5b3V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLDZDQUF5QztBQWV6QyxNQUFNLGlCQUFpQixHQUFHLENBQUMsV0FBbUIsRUFBVSxFQUFFLENBQ3hELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQ2hELFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FDMUIsSUFBSSxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUE7QUFFaEMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFFBQTBCLEVBQVUsRUFBRSxDQUNuRTtJQUNFLFFBQVEsQ0FBQyxhQUFhO0lBQ3RCLFFBQVEsQ0FBQyxhQUFhO0lBQ3RCLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUMvQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO0NBQ3pDO0tBQ0UsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFrQixFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQy9DLEdBQUcsQ0FBQyx1QkFBVSxDQUFDO0tBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBRW5CLHdGQUF3RjtBQUN4RixNQUFNLG9CQUFvQixHQUFHLENBQzNCLFFBQTBCLEVBQzFCLG1CQUE0QixFQUNwQixFQUFFO0lBQ1YsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDekIsT0FBTyxJQUFBLHVCQUFVLEVBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3hDLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRztRQUNmLFFBQVEsQ0FBQyx1QkFBdUI7WUFDOUIsQ0FBQyxDQUFDLHFCQUFx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
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy90ZW1wbGF0ZXMvbGF5b3V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLDZDQUF5QztBQWlDbEMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFdBQW1CLEVBQVUsRUFBRSxDQUMvRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUNoRCxXQUFXLENBQUMsV0FBVyxFQUFFLENBQzFCLElBQUksV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBSG5CLFFBQUEsaUJBQWlCLHFCQUdFO0FBRWhDLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBaUMsRUFBVSxFQUFFLENBQzlELEtBQUs7S0FDRixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQWtCLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDL0MsR0FBRyxDQUFDLHVCQUFVLENBQUM7S0FDZixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7QUFFbkIsTUFBTSxrQkFBa0IsR0FBRyxDQUN6QixPQUFzQixFQUN0QixLQUFpQyxFQUN6QixFQUFFO0lBQ1YsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU8sRUFBRSxDQUFBO0lBQ1gsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLE9BQU87UUFDbkIsQ0FBQyxDQUFDLCtCQUErQixJQUFBLHVCQUFVLEVBQUMsT0FBTyxDQUFDLFFBQVE7UUFDNUQsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNOLE9BQU8sOEJBQThCLEtBQUssR0FBRyxPQUFPLFFBQVEsQ0FBQTtBQUM5RCxDQUFDLENBQUE7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxD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
@@ -10,15 +10,15 @@ const renderBatchAllocations = (line, timeZone) => {
10
10
  return line.batch_allocations
11
11
  .map((allocation) => `<div class="packing-batch">
12
12
  <strong>${(0, html_utils_1.escapeHtml)(allocation.lot_number)}</strong>
13
- <span>MHD: ${(0, format_1.formatDate)(allocation.expiry_date, { timeZone })}</span>
13
+ <span>MHD: ${(0, html_utils_1.escapeHtml)((0, format_1.formatDocumentDate)(allocation.expiry_date, timeZone))}</span>
14
14
  <span>Menge: ${(0, html_utils_1.escapeHtml)(allocation.quantity)}</span>
15
15
  </div>`)
16
16
  .join("");
17
17
  };
18
18
  const renderLines = (input, timeZone) => input.lines
19
19
  .map((line) => `<tr>
20
- <td>
21
- <strong>${(0, html_utils_1.escapeHtml)(line.title)}</strong>
20
+ <td class="item">
21
+ <div class="item-title">${(0, html_utils_1.escapeHtml)(line.title)}</div>
22
22
  ${line.sku ? `<div class="sku">SKU: ${(0, html_utils_1.escapeHtml)(line.sku)}</div>` : ""}
23
23
  </td>
24
24
  <td>${renderBatchAllocations(line, timeZone)}</td>
@@ -26,12 +26,13 @@ const renderLines = (input, timeZone) => input.lines
26
26
  </tr>`)
27
27
  .join("");
28
28
  const renderPackingList = (input, layout, timeZone) => layout({
29
- body: `<table>
30
- <thead><tr><th>Bezeichnung</th><th>Charge</th><th class="number">Benötigte Menge</th></tr></thead>
31
- <tbody>${renderLines(input, timeZone)}</tbody>
29
+ body: `<table class="items packing-items">
30
+ <thead><tr><th class="item">Bezeichnung</th><th>Charge</th><th class="number">Benötigte Menge</th></tr></thead>
31
+ <tbody class="lines">${renderLines(input, timeZone)}</tbody>
32
32
  </table>`,
33
33
  documentTitle: "Packliste",
34
34
  metadata: [
35
+ { label: "Packlistennummer", value: input.document.number },
35
36
  {
36
37
  label: "Bestellung",
37
38
  value: (0, html_utils_1.formatOrderReference)(input.order.display_id),
@@ -39,12 +40,13 @@ const renderPackingList = (input, layout, timeZone) => layout({
39
40
  { label: "Fulfillment", value: input.fulfillment.id },
40
41
  {
41
42
  label: "Erstellungsdatum",
42
- value: (0, format_1.formatDate)(input.document.generated_at, { timeZone }),
43
+ value: (0, format_1.formatDocumentDate)(input.document.generated_at, timeZone),
43
44
  },
44
45
  { label: "Lagerplatz", value: input.fulfillment.location_name },
45
46
  ],
46
47
  number: input.document.number,
47
48
  pageTitle: "Packliste",
49
+ recipient: null,
48
50
  });
49
51
  exports.renderPackingList = renderPackingList;
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2luZy1saXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy90ZW1wbGF0ZXMvcGFja2luZy1saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHFDQUFxQztBQUNyQyw2Q0FBK0Q7QUFHL0QsTUFBTSxzQkFBc0IsR0FBRyxDQUM3QixJQUErQyxFQUMvQyxRQUFnQixFQUNSLEVBQUU7SUFDVixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEMsT0FBTyw4QkFBOEIsQ0FBQTtJQUN2QyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsaUJBQWlCO1NBQzFCLEdBQUcsQ0FDRixDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7a0JBQ0osSUFBQSx1QkFBVSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7cUJBQzlCLElBQUEsbUJBQVUsRUFBQyxVQUFVLENBQUMsV0FBVyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUM7dUJBQzlDLElBQUEsdUJBQVUsRUFBQyxVQUFVLENBQUMsUUFBUSxDQUFDO2FBQ3pDLENBQ1I7U0FDQSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDYixDQUFDLENBQUE7QUFFRCxNQUFNLFdBQVcsR0FBRyxDQUNsQixLQUErQixFQUMvQixRQUFnQixFQUNSLEVBQUUsQ0FDVixLQUFLLENBQUMsS0FBSztLQUNSLEdBQUcsQ0FDRixDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7O29CQUVJLElBQUEsdUJBQVUsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixJQUFBLHVCQUFVLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7O2NBRW5FLHNCQUFzQixDQUFDLElBQUksRUFBRSxRQUFRLENBQUM7NkJBQ3ZCLElBQUEsdUJBQVUsRUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzFDLENBQ1A7S0FDQSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7QUFFTixNQUFNLGlCQUFpQixHQUFHLENBQy9CLEtBQStCLEVBQy9CLE1BQXNCLEVBQ3RCLFFBQWdCLEVBQ1IsRUFBRSxDQUNWLE1BQU0sQ0FBQztJQUNMLElBQUksRUFBRTs7ZUFFSyxXQUFXLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQzthQUM5QjtJQUNULGFBQWEsRUFBRSxXQUFXO0lBQzFCLFFBQVEsRUFBRTtRQUNSO1lBQ0UsS0FBSyxFQUFFLFlBQVk7WUFDbkIsS0FBSyxFQUFFLElBQUEsaUNBQW9CLEVBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7U0FDcEQ7UUFDRCxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFO1FBQ3JEO1lBQ0UsS0FBSyxFQUFFLGtCQUFrQjtZQUN6QixLQUFLLEVBQUUsSUFBQSxtQkFBVSxFQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUM7U0FDN0Q7UUFDRCxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFO0tBQ2hFO0lBQ0QsTUFBTSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTTtJQUM3QixTQUFTLEVBQUUsV0FBVztDQUN2QixDQUFDLENBQUE7QUF6QlMsUUFBQSxpQkFBaUIscUJBeUIxQiJ9
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2luZy1saXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy90ZW1wbGF0ZXMvcGFja2luZy1saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHFDQUE2QztBQUM3Qyw2Q0FBK0Q7QUFHL0QsTUFBTSxzQkFBc0IsR0FBRyxDQUM3QixJQUErQyxFQUMvQyxRQUFnQixFQUNSLEVBQUU7SUFDVixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEMsT0FBTyw4QkFBOEIsQ0FBQTtJQUN2QyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsaUJBQWlCO1NBQzFCLEdBQUcsQ0FDRixDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7a0JBQ0osSUFBQSx1QkFBVSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7cUJBQzlCLElBQUEsdUJBQVUsRUFBQyxJQUFBLDJCQUFrQixFQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7dUJBQzlELElBQUEsdUJBQVUsRUFBQyxVQUFVLENBQUMsUUFBUSxDQUFDO2FBQ3pDLENBQ1I7U0FDQSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDYixDQUFDLENBQUE7QUFFRCxNQUFNLFdBQVcsR0FBRyxDQUNsQixLQUErQixFQUMvQixRQUFnQixFQUNSLEVBQUUsQ0FDVixLQUFLLENBQUMsS0FBSztLQUNSLEdBQUcsQ0FDRixDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7O29DQUVvQixJQUFBLHVCQUFVLEVBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUM5QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsSUFBQSx1QkFBVSxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFOztjQUVuRSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDOzZCQUN2QixJQUFBLHVCQUFVLEVBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUMxQyxDQUNQO0tBQ0EsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBRU4sTUFBTSxpQkFBaUIsR0FBRyxDQUMvQixLQUErQixFQUMvQixNQUFzQixFQUN0QixRQUFnQixFQUNSLEVBQUUsQ0FDVixNQUFNLENBQUM7SUFDTCxJQUFJLEVBQUU7OzZCQUVtQixXQUFXLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQzthQUM1QztJQUNULGFBQWEsRUFBRSxXQUFXO0lBQzFCLFFBQVEsRUFBRTtRQUNSLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtRQUMzRDtZQUNFLEtBQUssRUFBRSxZQUFZO1lBQ25CLEtBQUssRUFBRSxJQUFBLGlDQUFvQixFQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1NBQ3BEO1FBQ0QsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRTtRQUNyRDtZQUNFLEtBQUssRUFBRSxrQkFBa0I7WUFDekIsS0FBSyxFQUFFLElBQUEsMkJBQWtCLEVBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDO1NBQ2pFO1FBQ0QsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRTtLQUNoRTtJQUNELE1BQU0sRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU07SUFDN0IsU0FBUyxFQUFFLFdBQVc7SUFDdEIsU0FBUyxFQUFFLElBQUk7Q0FDaEIsQ0FBQyxDQUFBO0FBM0JTLFFBQUEsaUJBQWlCLHFCQTJCMUIifQ==
@@ -5,13 +5,13 @@ const public_1 = require("../../public");
5
5
  const utils_1 = require("@medusajs/framework/utils");
6
6
  const merchant_1 = require("../../modules/documents/domain/merchant");
7
7
  /**
8
- * The shop's sender facts for one render: shop master data of the base
9
- * plugin (stored in the Admin) > the plugin's `merchant` option. Fails with
8
+ * The shop's sender facts for one render, from the base plugin's shop master
9
+ * data (stored in the Admin; there is no config fallback). Fails with
10
10
  * `UNEXPECTED_STATE` naming the missing fields, so the document is marked
11
11
  * failed and issued again once the data is complete. Read failures propagate.
12
12
  */
13
- const resolveDocumentMerchant = async (container, fallback) => {
14
- const { values } = await (0, public_1.getShopMasterData)(container, fallback);
13
+ const resolveDocumentMerchant = async (container) => {
14
+ const { values } = await (0, public_1.getShopMasterData)(container);
15
15
  const resolution = (0, merchant_1.toDocumentMerchant)(values);
16
16
  if (!resolution.merchant) {
17
17
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Shop-Stammdaten unvollständig: ${resolution.missing.join(", ")}. Bitte unter Einstellungen → Hartl Services Plugins → Shop-Stammdaten ergänzen.`);
@@ -19,4 +19,4 @@ const resolveDocumentMerchant = async (container, fallback) => {
19
19
  return resolution.merchant;
20
20
  };
21
21
  exports.resolveDocumentMerchant = resolveDocumentMerchant;
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtbWVyY2hhbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZG9jdW1lbnRzL3V0aWxzL2RvY3VtZW50LW1lcmNoYW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFnRDtBQUVoRCxxREFBdUQ7QUFFdkQsc0VBR2dEO0FBR2hEOzs7OztHQUtHO0FBQ0ksTUFBTSx1QkFBdUIsR0FBRyxLQUFLLEVBQzFDLFNBQTBCLEVBQzFCLFFBQWdDLEVBQ0wsRUFBRTtJQUM3QixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLDBCQUFpQixFQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUMvRCxNQUFNLFVBQVUsR0FBRyxJQUFBLDZCQUFrQixFQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyxrQ0FBa0MsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtGQUFrRixDQUNsSixDQUFBO0lBQ0gsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQTtBQUM1QixDQUFDLENBQUE7QUFiWSxRQUFBLHVCQUF1QiwyQkFhbkMifQ==
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtbWVyY2hhbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZG9jdW1lbnRzL3V0aWxzL2RvY3VtZW50LW1lcmNoYW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFnRDtBQUVoRCxxREFBdUQ7QUFFdkQsc0VBQTRFO0FBRzVFOzs7OztHQUtHO0FBQ0ksTUFBTSx1QkFBdUIsR0FBRyxLQUFLLEVBQzFDLFNBQTBCLEVBQ0MsRUFBRTtJQUM3QixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLDBCQUFpQixFQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3JELE1BQU0sVUFBVSxHQUFHLElBQUEsNkJBQWtCLEVBQUMsTUFBTSxDQUFDLENBQUE7SUFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQ2xDLGtDQUFrQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0ZBQWtGLENBQ2xKLENBQUE7SUFDSCxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFBO0FBQzVCLENBQUMsQ0FBQTtBQVpZLFFBQUEsdUJBQXVCLDJCQVluQyJ9
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveDocumentRenderSettings = void 0;
4
+ const public_1 = require("../../public");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const plugin_features_1 = require("../plugin-features");
7
+ const LOGO_TIMEOUT_MS = 10_000;
8
+ const LOGO_MAX_BYTES = 2 * 1024 * 1024;
9
+ const LOGO_TYPES = new Set(["image/png", "image/jpeg"]);
10
+ const logoError = (message) => new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, message);
11
+ /**
12
+ * Downloads the logo once per render and inlines it as a `data:` URL, so
13
+ * Chromium never waits on the network while printing. A logo that cannot be
14
+ * loaded is logged and left out: a missing logo must not block an invoice.
15
+ */
16
+ const loadLogo = async (url, fetchLogo) => {
17
+ const response = await fetchLogo(url, {
18
+ signal: AbortSignal.timeout(LOGO_TIMEOUT_MS),
19
+ });
20
+ if (!response.ok) {
21
+ throw logoError(`HTTP ${response.status}`);
22
+ }
23
+ const type = response.headers.get("content-type")?.split(";")[0]?.trim();
24
+ if (!type || !LOGO_TYPES.has(type)) {
25
+ throw logoError(`unsupported content type '${type ?? ""}'`);
26
+ }
27
+ const bytes = Buffer.from(await response.arrayBuffer());
28
+ if (bytes.length === 0 || bytes.length > LOGO_MAX_BYTES) {
29
+ throw logoError(`unsupported size of ${bytes.length} bytes`);
30
+ }
31
+ return `data:${type};base64,${bytes.toString("base64")}`;
32
+ };
33
+ /**
34
+ * The Documents settings a render needs. A settings read failure propagates
35
+ * (like the merchant read); a logo download failure renders without logo.
36
+ */
37
+ const resolveDocumentRenderSettings = async (container, fetchLogo = fetch) => {
38
+ const { values } = await (0, public_1.getPluginSettings)(container, plugin_features_1.documentsPluginFeatures);
39
+ const paymentTerms = typeof values.payment_terms === "string" && values.payment_terms.trim()
40
+ ? values.payment_terms.trim()
41
+ : null;
42
+ const logoUrl = typeof values.logo === "string" ? values.logo : null;
43
+ if (!logoUrl) {
44
+ return { logo_src: null, payment_terms: paymentTerms };
45
+ }
46
+ try {
47
+ return {
48
+ logo_src: await loadLogo(logoUrl, fetchLogo),
49
+ payment_terms: paymentTerms,
50
+ };
51
+ }
52
+ catch (error) {
53
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
54
+ logger.warn(`Documents: logo ${logoUrl} could not be loaded, rendering without it: ${error instanceof Error ? error.message : String(error)}`);
55
+ return { logo_src: null, payment_terms: paymentTerms };
56
+ }
57
+ };
58
+ exports.resolveDocumentRenderSettings = resolveDocumentRenderSettings;
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtcmVuZGVyLXNldHRpbmdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RvY3VtZW50cy91dGlscy9kb2N1bWVudC1yZW5kZXItc2V0dGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQWdEO0FBRWhELHFEQUFrRjtBQUVsRix3REFBNEQ7QUFHNUQsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFBO0FBQzlCLE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFBO0FBQ3RDLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUE7QUFJdkQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxPQUFlLEVBQWUsRUFBRSxDQUNqRCxJQUFJLG1CQUFXLENBQUMsbUJBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUE7QUFFOUQ7Ozs7R0FJRztBQUNILE1BQU0sUUFBUSxHQUFHLEtBQUssRUFDcEIsR0FBVyxFQUNYLFNBQW9CLEVBQ0gsRUFBRTtJQUNuQixNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDcEMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO0tBQzdDLENBQUMsQ0FBQTtJQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakIsTUFBTSxTQUFTLENBQUMsUUFBUSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUM1QyxDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFBO0lBQ3hFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxTQUFTLENBQUMsNkJBQTZCLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBQzdELENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUE7SUFDdkQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLGNBQWMsRUFBRSxDQUFDO1FBQ3hELE1BQU0sU0FBUyxDQUFDLHVCQUF1QixLQUFLLENBQUMsTUFBTSxRQUFRLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBQ0QsT0FBTyxRQUFRLElBQUksV0FBVyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUE7QUFDMUQsQ0FBQyxDQUFBO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSw2QkFBNkIsR0FBRyxLQUFLLEVBQ2hELFNBQTBCLEVBQzFCLFlBQXVCLEtBQUssRUFDSyxFQUFFO0lBQ25DLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEsMEJBQWlCLEVBQUMsU0FBUyxFQUFFLHlDQUF1QixDQUFDLENBQUE7SUFDOUUsTUFBTSxZQUFZLEdBQ2hCLE9BQU8sTUFBTSxDQUFDLGFBQWEsS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUU7UUFDckUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFO1FBQzdCLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDVixNQUFNLE9BQU8sR0FBRyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDcEUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxDQUFBO0lBQ3hELENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxPQUFPO1lBQ0wsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUM7WUFDNUMsYUFBYSxFQUFFLFlBQVk7U0FDNUIsQ0FBQTtJQUNILENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxNQUFNLENBQVcsQ0FBQTtRQUM1RSxNQUFNLENBQUMsSUFBSSxDQUNULG1CQUFtQixPQUFPLCtDQUN4QixLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUN2RCxFQUFFLENBQ0gsQ0FBQTtRQUNELE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsQ0FBQTtJQUN4RCxDQUFDO0FBQ0gsQ0FBQyxDQUFBO0FBNUJZLFFBQUEsNkJBQTZCLGlDQTRCekMifQ==
@@ -6,6 +6,8 @@ const failure_classification_1 = require("../domain/failure-classification");
6
6
  const business_keys_1 = require("../domain/business-keys");
7
7
  const event_schemas_1 = require("../domain/event-schemas");
8
8
  const email_1 = require("../../modules/email");
9
+ const load_email_shop_details_1 = require("../rendering/load-email-shop-details");
10
+ const order_summary_1 = require("../domain/order-summary");
9
11
  const render_email_1 = require("../rendering/render-email");
10
12
  const dispatch_email_message_1 = require("../../workflows/email/dispatch-email-message");
11
13
  exports.INVITE_MAX_ATTEMPTS = 2;
@@ -116,6 +118,8 @@ const deliverInvite = async (container, email, claim, inviteId, expectedToken, e
116
118
  if (!current || current.accepted || current.token !== expectedToken) {
117
119
  return await failClaim(email, claim, "invite_superseded", getNow());
118
120
  }
121
+ const shop = await (0, load_email_shop_details_1.loadEmailShopDetails)(container);
122
+ const expiresAtIso = (0, order_summary_1.toIsoDateTime)(current.expires_at);
119
123
  let rendered;
120
124
  try {
121
125
  const configuration = email.getDispatchConfiguration();
@@ -123,8 +127,10 @@ const deliverInvite = async (container, email, claim, inviteId, expectedToken, e
123
127
  kind: "user.invite",
124
128
  data: {
125
129
  invite_url: configuration.inviteUrl({ token: expectedToken }),
130
+ // An unreadable expiry only drops the validity sentence.
131
+ ...(expiresAtIso ? { expires_at: expiresAtIso } : {}),
126
132
  },
127
- });
133
+ }, shop);
128
134
  }
129
135
  catch {
130
136
  return await failClaim(email, claim, "render_failed", getNow());
@@ -309,4 +315,4 @@ const handleInviteEvent = async (container, payload, clock = () => new Date()) =
309
315
  }
310
316
  };
311
317
  exports.handleInviteEvent = handleInviteEvent;
312
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLWludml0ZS1ldmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbWFpbC9hcHBsaWNhdGlvbi9oYW5kbGUtaW52aXRlLWV2ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBLHFEQUFvRDtBQUVwRCw2RUFHMEM7QUFDMUMsMkRBQWdFO0FBQ2hFLDJEQUdpQztBQUNqQywrQ0FBbUQ7QUFNbkQsNERBQXdEO0FBQ3hELHlGQUF1RjtBQUUxRSxRQUFBLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUN4QixRQUFBLHFCQUFxQixHQUFHLG9CQUFvQixDQUFDO0FBc0IxRCxNQUFNLEtBQUssR0FBRyxHQUFVLEVBQUU7SUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBcUIsQ0FBQyxDQUFDO0FBQ3pDLENBQUMsQ0FBQztBQUVGLE1BQU0sZ0JBQWdCLEdBQUcsQ0FDdkIsT0FBMkIsRUFDM0IsSUFBYSxFQUNDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xCLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN6QixVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUU7SUFDdEIsTUFBTSxFQUNKLE9BQU8sQ0FBQyxNQUFNLEtBQUssTUFBTTtRQUN2QixDQUFDLENBQUMsTUFBTTtRQUNSLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVM7WUFDNUIsQ0FBQyxDQUFDLFNBQVM7WUFDWCxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxZQUFZO2dCQUM5RCxDQUFDLENBQUMsUUFBUTtnQkFDVixDQUFDLENBQUMsYUFBYTtDQUN4QixDQUFDLENBQUM7QUFFSCxNQUFNLG9CQUFvQixHQUFHLENBQUMsS0FBYyxFQUE2QixFQUFFO0lBQ3pFLElBQUksQ0FBQyxLQUFLLElB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
318
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLWludml0ZS1ldmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbWFpbC9hcHBsaWNhdGlvbi9oYW5kbGUtaW52aXRlLWV2ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBLHFEQUFvRDtBQUVwRCw2RUFHMEM7QUFDMUMsMkRBQWdFO0FBQ2hFLDJEQUdpQztBQUNqQywrQ0FBbUQ7QUFNbkQsa0ZBQTRFO0FBQzVFLDJEQUF3RDtBQUN4RCw0REFBd0Q7QUFDeEQseUZBQXVGO0FBRTFFLFFBQUEsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLFFBQUEscUJBQXFCLEdBQUcsb0JBQW9CLENBQUM7QUFzQjFELE1BQU0sS0FBSyxHQUFHLEdBQVUsRUFBRTtJQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUFxQixDQUFDLENBQUM7QUFDekMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxnQkFBZ0IsR0FBRyxDQUN2QixPQUEyQixFQUMzQixJQUFhLEVBQ0MsRUFBRSxDQUFDLENBQUM7SUFDbEIsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3pCLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRTtJQUN0QixNQUFNLEVBQ0osT0FBTyxDQUFDLE1BQU0sS0FBSyxNQUFNO1FBQ3ZCLENBQUMsQ0FBQyxNQUFNO1FBQ1IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUztZQUM1QixDQUFDLENBQUMsU0FBUztZQUNYLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLFlBQVk7Z0JBQzlELENBQUMsQ0FBQyxRQUFRO2dCQUNWLENBQUMsQ0FBQyxhQUFhO0NBQ3hCLENBQUMsQ0FBQztBQUVILE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxLQUFjLEVBQTZCLEVB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