@hartl-services/medusa-base 0.4.0 → 1.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 (235) hide show
  1. package/.medusa/server/src/admin/index.js +1517 -87
  2. package/.medusa/server/src/admin/index.mjs +1518 -88
  3. package/.medusa/server/src/api/admin/email/messages/[id]/resends/route.js +24 -0
  4. package/.medusa/server/src/api/admin/email/messages/[id]/route.js +12 -0
  5. package/.medusa/server/src/api/admin/email/messages/route.js +12 -0
  6. package/.medusa/server/src/api/admin/email/terms-versions/[id]/download/route.js +16 -0
  7. package/.medusa/server/src/api/admin/email/terms-versions/route.js +47 -0
  8. package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/download/route.js +21 -0
  9. package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/regenerate/route.js +38 -0
  10. package/.medusa/server/src/api/admin/orders/[id]/documents/regenerate/route.js +32 -0
  11. package/.medusa/server/src/api/admin/orders/[id]/documents/route.js +36 -0
  12. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/download/route.js +24 -0
  13. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/retry/route.js +44 -0
  14. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/route.js +82 -0
  15. package/.medusa/server/src/api/document-download-response.js +16 -0
  16. package/.medusa/server/src/api/document-response.js +23 -0
  17. package/.medusa/server/src/api/files/[asset]/route.js +24 -0
  18. package/.medusa/server/src/api/files/file-response.js +43 -0
  19. package/.medusa/server/src/api/files/gateway-options.js +31 -0
  20. package/.medusa/server/src/api/files/private/[token]/route.js +29 -0
  21. package/.medusa/server/src/api/files/upload/[token]/route.js +66 -0
  22. package/.medusa/server/src/api/middlewares.js +168 -1
  23. package/.medusa/server/src/api/packing-list-response.js +22 -0
  24. package/.medusa/server/src/api/route.js +27 -0
  25. package/.medusa/server/src/api/store/documents/[id]/download/route.js +21 -0
  26. package/.medusa/server/src/api/store/documents/[id]/route.js +15 -0
  27. package/.medusa/server/src/api/store/documents/route.js +11 -0
  28. package/.medusa/server/src/api/terms-download-response.js +12 -0
  29. package/.medusa/server/src/documents/config/index.js +18 -0
  30. package/.medusa/server/src/documents/paths/documents.js +6 -0
  31. package/.medusa/server/src/documents/paths/index.js +18 -0
  32. package/.medusa/server/src/documents/plugin-features.js +24 -0
  33. package/.medusa/server/src/documents/schemas/documents.js +18 -0
  34. package/.medusa/server/src/documents/schemas/index.js +18 -0
  35. package/.medusa/server/src/documents/scripts/verify-documents-file-storage.js +55 -0
  36. package/.medusa/server/src/documents/templates/financial-document.js +142 -0
  37. package/.medusa/server/src/documents/templates/format.js +31 -0
  38. package/.medusa/server/src/documents/templates/html-factory.js +40 -0
  39. package/.medusa/server/src/documents/templates/html-utils.js +13 -0
  40. package/.medusa/server/src/documents/templates/layout.js +97 -0
  41. package/.medusa/server/src/documents/templates/packing-list.js +50 -0
  42. package/.medusa/server/src/documents/types/admin-api.js +3 -0
  43. package/.medusa/server/src/documents/types/document-summary.js +3 -0
  44. package/.medusa/server/src/documents/types/documents.js +3 -0
  45. package/.medusa/server/src/documents/types/html-factory.js +6 -0
  46. package/.medusa/server/src/documents/types/index.js +22 -0
  47. package/.medusa/server/src/documents/types/store-api.js +3 -0
  48. package/.medusa/server/src/documents/utils/document-merchant.js +22 -0
  49. package/.medusa/server/src/documents/utils/html-to-pdf.js +61 -0
  50. package/.medusa/server/src/documents/utils/private-file-storage.js +64 -0
  51. package/.medusa/server/src/documents/utils/resolve-services.js +7 -0
  52. package/.medusa/server/src/email/application/handle-invite-event.js +312 -0
  53. package/.medusa/server/src/email/application/handle-password-reset-event.js +354 -0
  54. package/.medusa/server/src/email/config/index.js +84 -0
  55. package/.medusa/server/src/email/config/notification-module.js +20 -0
  56. package/.medusa/server/src/email/domain/business-keys.js +50 -0
  57. package/.medusa/server/src/email/domain/documents-fact-fingerprint.js +7 -0
  58. package/.medusa/server/src/email/domain/event-schemas.js +36 -0
  59. package/.medusa/server/src/email/domain/failure-classification.js +53 -0
  60. package/.medusa/server/src/email/plugin-features.js +31 -0
  61. package/.medusa/server/src/email/rendering/default-templates.js +91 -0
  62. package/.medusa/server/src/email/rendering/render-email.js +37 -0
  63. package/.medusa/server/src/email/rendering/resolve-shop-configuration.js +48 -0
  64. package/.medusa/server/src/email/types/email-kinds.js +18 -0
  65. package/.medusa/server/src/email/types/index.js +21 -0
  66. package/.medusa/server/src/email/types/shop-configuration.js +3 -0
  67. package/.medusa/server/src/email/types/smtp-configuration.js +3 -0
  68. package/.medusa/server/src/email/types/template-data.js +79 -0
  69. package/.medusa/server/src/files/config/index.js +256 -0
  70. package/.medusa/server/src/files/gateway/index.js +115 -0
  71. package/.medusa/server/src/files/types/index.js +6 -0
  72. package/.medusa/server/src/files/types/public.js +6 -0
  73. package/.medusa/server/src/jobs/document-fact-publication-reconciliation.js +18 -0
  74. package/.medusa/server/src/jobs/document-resolution-reconciliation.js +20 -0
  75. package/.medusa/server/src/jobs/packing-list-reconciliation.js +49 -0
  76. package/.medusa/server/src/jobs/reconcile-email-attempts.js +63 -0
  77. package/.medusa/server/src/jobs/reconcile-pending-email-messages.js +41 -0
  78. package/.medusa/server/src/jobs/retry-email-messages.js +27 -0
  79. package/.medusa/server/src/migration-scripts/dismiss-orphaned-cart-promotion-links.js +26 -0
  80. package/.medusa/server/src/modules/documents/domain/cancellation-snapshot.js +97 -0
  81. package/.medusa/server/src/modules/documents/domain/document-number.js +36 -0
  82. package/.medusa/server/src/modules/documents/domain/document-resolution.js +24 -0
  83. package/.medusa/server/src/modules/documents/domain/issuance-rules.js +37 -0
  84. package/.medusa/server/src/modules/documents/domain/merchant.js +86 -0
  85. package/.medusa/server/src/modules/documents/domain/options.js +40 -0
  86. package/.medusa/server/src/modules/documents/domain/packing-list.js +90 -0
  87. package/.medusa/server/src/modules/documents/domain/snapshot-normalization.js +17 -0
  88. package/.medusa/server/src/modules/documents/domain/tax-breakdown.js +66 -0
  89. package/.medusa/server/src/modules/documents/index.js +15 -0
  90. package/.medusa/server/src/modules/documents/loaders/assert-private-file-storage.js +20 -0
  91. package/.medusa/server/src/modules/documents/migrations/Migration20260827061749.js +75 -0
  92. package/.medusa/server/src/modules/documents/migrations/Migration20260830111207.js +28 -0
  93. package/.medusa/server/src/modules/documents/models/document-artifact.js +25 -0
  94. package/.medusa/server/src/modules/documents/models/document-number-sequence.js +29 -0
  95. package/.medusa/server/src/modules/documents/models/document.js +82 -0
  96. package/.medusa/server/src/modules/documents/models/order-cancellation-resolution.js +51 -0
  97. package/.medusa/server/src/modules/documents/models/packing-list-revision.js +36 -0
  98. package/.medusa/server/src/modules/documents/models/packing-list.js +27 -0
  99. package/.medusa/server/src/modules/documents/models/refund-document-resolution.js +66 -0
  100. package/.medusa/server/src/modules/documents/models/shipment-invoice-assignment.js +51 -0
  101. package/.medusa/server/src/modules/documents/models/shipment-invoice-coordinator.js +44 -0
  102. package/.medusa/server/src/modules/documents/service.js +1701 -0
  103. package/.medusa/server/src/modules/email/domain/attachment.js +25 -0
  104. package/.medusa/server/src/modules/email/domain/message-state.js +69 -0
  105. package/.medusa/server/src/modules/email/index.js +13 -0
  106. package/.medusa/server/src/modules/email/migrations/Migration20260826173422.js +32 -0
  107. package/.medusa/server/src/modules/email/migrations/Migration20260827172945.js +16 -0
  108. package/.medusa/server/src/modules/email/migrations/Migration20260827194804.js +22 -0
  109. package/.medusa/server/src/modules/email/migrations/Migration20260906195205.js +16 -0
  110. package/.medusa/server/src/modules/email/models/email-attempt.js +56 -0
  111. package/.medusa/server/src/modules/email/models/email-message.js +71 -0
  112. package/.medusa/server/src/modules/email/models/email-terms-version.js +37 -0
  113. package/.medusa/server/src/modules/email/service.js +1285 -0
  114. package/.medusa/server/src/providers/s3-cache/cache/atomic-write.js +25 -0
  115. package/.medusa/server/src/providers/s3-cache/cache/cache-manager.js +115 -0
  116. package/.medusa/server/src/providers/s3-cache/cache/keyed-lock.js +28 -0
  117. package/.medusa/server/src/providers/s3-cache/index.js +8 -0
  118. package/.medusa/server/src/providers/s3-cache/object-key.js +53 -0
  119. package/.medusa/server/src/providers/s3-cache/s3-cache-file.js +229 -0
  120. package/.medusa/server/src/providers/s3-cache/s3-object-store.js +86 -0
  121. package/.medusa/server/src/providers/smtp/index.js +8 -0
  122. package/.medusa/server/src/providers/smtp/service.js +236 -0
  123. package/.medusa/server/src/providers/smtp/types.js +11 -0
  124. package/.medusa/server/src/public/config.js +186 -0
  125. package/.medusa/server/src/public/gateway.js +19 -0
  126. package/.medusa/server/src/public/instrumentation.js +56 -0
  127. package/.medusa/server/src/public/shop-config.js +12 -0
  128. package/.medusa/server/src/public/shop-types.js +24 -0
  129. package/.medusa/server/src/shop-config/build-food-shop-config.js +248 -0
  130. package/.medusa/server/src/shop-config/options.js +71 -0
  131. package/.medusa/server/src/subscribers/affiliate-consignment-reminder-due.js +26 -0
  132. package/.medusa/server/src/subscribers/documents-order-canceled.js +24 -0
  133. package/.medusa/server/src/subscribers/documents-order-cancellation-ready.js +26 -0
  134. package/.medusa/server/src/subscribers/documents-refund-ready.js +24 -0
  135. package/.medusa/server/src/subscribers/documents-shipment-created.js +36 -0
  136. package/.medusa/server/src/subscribers/documents-shipment-invoice-assignment-decided.js +26 -0
  137. package/.medusa/server/src/subscribers/email-order-canceled.js +28 -0
  138. package/.medusa/server/src/subscribers/email-shipment-created.js +32 -0
  139. package/.medusa/server/src/subscribers/order-placed.js +27 -0
  140. package/.medusa/server/src/subscribers/packing-list-allocation-revised.js +32 -0
  141. package/.medusa/server/src/subscribers/packing-list-fulfillment-canceled.js +54 -0
  142. package/.medusa/server/src/subscribers/packing-list-fulfillment-created.js +31 -0
  143. package/.medusa/server/src/subscribers/password-reset.js +23 -0
  144. package/.medusa/server/src/subscribers/payment-refunded.js +38 -0
  145. package/.medusa/server/src/subscribers/return-received.js +27 -0
  146. package/.medusa/server/src/subscribers/return-requested.js +27 -0
  147. package/.medusa/server/src/subscribers/user-invite.js +23 -0
  148. package/.medusa/server/src/utils/cart-promotion-links.js +101 -0
  149. package/.medusa/server/src/workflows/documents/issue-cancellation-after-refund.js +246 -0
  150. package/.medusa/server/src/workflows/documents/issue-document.js +163 -0
  151. package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +521 -0
  152. package/.medusa/server/src/workflows/documents/issue-packing-list.js +384 -0
  153. package/.medusa/server/src/workflows/documents/publish-document-facts.js +53 -0
  154. package/.medusa/server/src/workflows/documents/reconcile-document-resolutions.js +48 -0
  155. package/.medusa/server/src/workflows/documents/reconcile-order-cancellation.js +92 -0
  156. package/.medusa/server/src/workflows/documents/regenerate-issued-document.js +61 -0
  157. package/.medusa/server/src/workflows/email/dispatch-email-message.js +299 -0
  158. package/.medusa/server/src/workflows/email/documents-required-facts.js +30 -0
  159. package/.medusa/server/src/workflows/email/prepare-affiliate-reminder-email.js +58 -0
  160. package/.medusa/server/src/workflows/email/prepare-order-canceled-email.js +64 -0
  161. package/.medusa/server/src/workflows/email/prepare-order-received-email.js +56 -0
  162. package/.medusa/server/src/workflows/email/prepare-refund-email.js +47 -0
  163. package/.medusa/server/src/workflows/email/prepare-return-email.js +75 -0
  164. package/.medusa/server/src/workflows/email/prepare-shipment-email.js +82 -0
  165. package/.medusa/server/src/workflows/email/retry-email-messages.js +31 -0
  166. package/.medusa/server/src/workflows/hooks/dismiss-deleted-promotion-cart-links.js +23 -0
  167. package/README.md +1619 -7
  168. package/dist/documents/config/index.d.ts +11 -0
  169. package/dist/documents/config/index.js +17 -0
  170. package/dist/documents/templates/financial-document.d.ts +3 -0
  171. package/dist/documents/templates/financial-document.js +141 -0
  172. package/dist/documents/templates/format.d.ts +16 -0
  173. package/dist/documents/templates/format.js +30 -0
  174. package/dist/documents/templates/html-factory.d.ts +11 -0
  175. package/dist/documents/templates/html-factory.js +39 -0
  176. package/dist/documents/templates/html-utils.d.ts +2 -0
  177. package/dist/documents/templates/html-utils.js +12 -0
  178. package/dist/documents/templates/layout.d.ts +17 -0
  179. package/dist/documents/templates/layout.js +96 -0
  180. package/dist/documents/templates/packing-list.d.ts +3 -0
  181. package/dist/documents/templates/packing-list.js +49 -0
  182. package/dist/documents/types/admin-api.d.ts +1 -0
  183. package/dist/documents/types/admin-api.js +2 -0
  184. package/dist/documents/types/document-summary.d.ts +1 -0
  185. package/dist/documents/types/document-summary.js +2 -0
  186. package/dist/documents/types/documents.d.ts +174 -0
  187. package/dist/documents/types/documents.js +2 -0
  188. package/dist/documents/types/html-factory.d.ts +7 -0
  189. package/dist/documents/types/html-factory.js +5 -0
  190. package/dist/documents/types/index.d.ts +5 -0
  191. package/dist/documents/types/index.js +21 -0
  192. package/dist/documents/types/store-api.d.ts +1 -0
  193. package/dist/documents/types/store-api.js +2 -0
  194. package/dist/email/config/index.d.ts +17 -0
  195. package/dist/email/config/index.js +83 -0
  196. package/dist/email/config/notification-module.d.ts +22 -0
  197. package/dist/email/config/notification-module.js +19 -0
  198. package/dist/email/types/email-kinds.d.ts +15 -0
  199. package/dist/email/types/email-kinds.js +17 -0
  200. package/dist/email/types/index.d.ts +4 -0
  201. package/dist/email/types/index.js +20 -0
  202. package/dist/email/types/shop-configuration.d.ts +43 -0
  203. package/dist/email/types/shop-configuration.js +2 -0
  204. package/dist/email/types/smtp-configuration.d.ts +9 -0
  205. package/dist/email/types/smtp-configuration.js +2 -0
  206. package/dist/email/types/template-data.d.ts +100 -0
  207. package/dist/email/types/template-data.js +78 -0
  208. package/dist/files/config/index.d.ts +32 -0
  209. package/dist/files/config/index.js +255 -0
  210. package/dist/files/gateway/index.d.ts +30 -0
  211. package/dist/files/gateway/index.js +114 -0
  212. package/dist/files/types/index.d.ts +2 -0
  213. package/dist/files/types/index.js +5 -0
  214. package/dist/files/types/public.d.ts +90 -0
  215. package/dist/files/types/public.js +5 -0
  216. package/dist/modules/documents/domain/merchant.d.ts +22 -0
  217. package/dist/modules/documents/domain/merchant.js +85 -0
  218. package/dist/modules/documents/domain/options.d.ts +34 -0
  219. package/dist/modules/documents/domain/options.js +39 -0
  220. package/dist/public/config.d.ts +59 -0
  221. package/dist/public/config.js +185 -0
  222. package/dist/public/gateway.d.ts +2 -0
  223. package/dist/public/gateway.js +18 -0
  224. package/dist/public/instrumentation.d.ts +12 -0
  225. package/dist/public/instrumentation.js +55 -0
  226. package/dist/public/shop-config.d.ts +8 -0
  227. package/dist/public/shop-config.js +11 -0
  228. package/dist/public/shop-types.d.ts +7 -0
  229. package/dist/public/shop-types.js +23 -0
  230. package/dist/public/types.d.ts +17 -1
  231. package/dist/shop-config/build-food-shop-config.d.ts +44 -0
  232. package/dist/shop-config/build-food-shop-config.js +247 -0
  233. package/dist/shop-config/options.d.ts +41 -0
  234. package/dist/shop-config/options.js +70 -0
  235. package/package.json +48 -5
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.verifyFileGatewayUploadToken = exports.verifyPrivateFileGatewayToken = exports.createFileGatewayUploadUrl = exports.createPrivateFileGatewayUrl = exports.publicFileGatewayKey = exports.toPublicFileGatewayUrl = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const PRIVATE_SIGNATURE_VERSION = "v1";
6
+ const safeLogicalKey = (value) => {
7
+ if (!value ||
8
+ value.startsWith("/") ||
9
+ value.includes("\\") ||
10
+ value
11
+ .split("/")
12
+ .some((segment) => !segment ||
13
+ segment === "." ||
14
+ segment === ".." ||
15
+ /[\u0000-\u001F\u007F]/u.test(segment))) {
16
+ throw new TypeError("File gateway key must be a safe relative path");
17
+ }
18
+ return value;
19
+ };
20
+ const gatewayUrl = (baseUrl, path) => {
21
+ const url = new URL(`${baseUrl.replace(/\/$/u, "")}/`);
22
+ url.pathname = `${url.pathname.replace(/\/$/u, "")}/${path}`;
23
+ return url;
24
+ };
25
+ const signatureFor = (input) => (0, node_crypto_1.createHmac)("sha256", input.secret)
26
+ .update(`${PRIVATE_SIGNATURE_VERSION}\n${input.action}\n${input.token}\n${input.expires}`)
27
+ .digest("base64url");
28
+ const createPrivateCapabilityUrl = (input) => {
29
+ const fileKey = safeLogicalKey(input.fileKey);
30
+ if (input.action === "download" && fileKey.startsWith("public/")) {
31
+ throw new TypeError("Public files must not use private gateway URLs");
32
+ }
33
+ const token = Buffer.from(fileKey, "utf8").toString("base64url");
34
+ const expires = Math.floor((input.now ?? Date.now()) / 1_000) + input.durationSeconds;
35
+ const url = gatewayUrl(input.baseUrl, `${input.path}/${token}`);
36
+ url.searchParams.set("expires", String(expires));
37
+ url.searchParams.set("signature", signatureFor({
38
+ action: input.action,
39
+ expires,
40
+ secret: input.signingSecret,
41
+ token,
42
+ }));
43
+ return url.toString();
44
+ };
45
+ const verifyPrivateCapabilityToken = (input) => {
46
+ if (!Number.isSafeInteger(input.expires) ||
47
+ input.expires < Math.floor((input.now ?? Date.now()) / 1_000)) {
48
+ return undefined;
49
+ }
50
+ const expected = Buffer.from(signatureFor({
51
+ action: input.action,
52
+ expires: input.expires,
53
+ secret: input.signingSecret,
54
+ token: input.token,
55
+ }), "base64url");
56
+ const provided = Buffer.from(input.signature, "base64url");
57
+ if (provided.toString("base64url") !== input.signature ||
58
+ provided.length !== expected.length ||
59
+ !(0, node_crypto_1.timingSafeEqual)(provided, expected)) {
60
+ return undefined;
61
+ }
62
+ try {
63
+ const fileKeyBuffer = Buffer.from(input.token, "base64url");
64
+ if (fileKeyBuffer.toString("base64url") !== input.token) {
65
+ return undefined;
66
+ }
67
+ const fileKey = safeLogicalKey(fileKeyBuffer.toString("utf8"));
68
+ return input.action === "download" && fileKey.startsWith("public/")
69
+ ? undefined
70
+ : fileKey;
71
+ }
72
+ catch {
73
+ return undefined;
74
+ }
75
+ };
76
+ const toPublicFileGatewayUrl = (baseUrl, logicalFileKey) => {
77
+ const key = safeLogicalKey(logicalFileKey);
78
+ if (!key.startsWith("public/")) {
79
+ throw new TypeError("Only public file keys can have public gateway URLs");
80
+ }
81
+ const asset = key.slice("public/".length);
82
+ if (!asset || asset.includes("/")) {
83
+ throw new TypeError("Public gateway files must have one opaque asset name");
84
+ }
85
+ return gatewayUrl(baseUrl, encodeURIComponent(asset)).toString();
86
+ };
87
+ exports.toPublicFileGatewayUrl = toPublicFileGatewayUrl;
88
+ const publicFileGatewayKey = (asset) => {
89
+ if (!asset || asset.includes("/") || asset.includes("\\")) {
90
+ throw new TypeError("Public gateway asset is invalid");
91
+ }
92
+ return safeLogicalKey(`public/${asset}`);
93
+ };
94
+ exports.publicFileGatewayKey = publicFileGatewayKey;
95
+ const createPrivateFileGatewayUrl = (input) => {
96
+ return createPrivateCapabilityUrl({
97
+ ...input,
98
+ action: "download",
99
+ path: "private",
100
+ });
101
+ };
102
+ exports.createPrivateFileGatewayUrl = createPrivateFileGatewayUrl;
103
+ const createFileGatewayUploadUrl = (input) => createPrivateCapabilityUrl({
104
+ ...input,
105
+ action: "upload",
106
+ path: "upload",
107
+ });
108
+ exports.createFileGatewayUploadUrl = createFileGatewayUploadUrl;
109
+ const verifyPrivateFileGatewayToken = (input) => {
110
+ return verifyPrivateCapabilityToken({ ...input, action: "download" });
111
+ };
112
+ exports.verifyPrivateFileGatewayToken = verifyPrivateFileGatewayToken;
113
+ const verifyFileGatewayUploadToken = (input) => verifyPrivateCapabilityToken({ ...input, action: "upload" });
114
+ exports.verifyFileGatewayUploadToken = verifyFileGatewayUploadToken;
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZmlsZXMvZ2F0ZXdheS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBMEQ7QUFFMUQsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUM7QUFFdkMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFhLEVBQVUsRUFBRTtJQUMvQyxJQUNFLENBQUMsS0FBSztRQUNOLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQ3JCLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3BCLEtBQUs7YUFDRixLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1YsSUFBSSxDQUNILENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDVixDQUFDLE9BQU87WUFDUixPQUFPLEtBQUssR0FBRztZQUNmLE9BQU8sS0FBSyxJQUFJO1lBQ2hCLHdCQUF3QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FDekMsRUFDSCxDQUFDO1FBQ0QsTUFBTSxJQUFJLFNBQVMsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBZSxFQUFFLElBQVksRUFBTyxFQUFFO0lBQ3hELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7SUFDN0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRyxDQUFDLEtBS3JCLEVBQVUsRUFBRSxD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
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BASE_PLUGIN_RESOLVE = void 0;
4
+ var public_1 = require("./public");
5
+ Object.defineProperty(exports, "BASE_PLUGIN_RESOLVE", { enumerable: true, get: function () { return public_1.BASE_PLUGIN_RESOLVE; } });
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZmlsZXMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBaUJBLG1DQUErQztBQUF0Qyw2R0FBQSxtQkFBbUIsT0FBQSJ9
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BASE_PLUGIN_RESOLVE = void 0;
4
+ /** Package name under which the gateway routes read the `files` options. */
5
+ exports.BASE_PLUGIN_RESOLVE = "@hartl-services/medusa-base";
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2ZpbGVzL3R5cGVzL3B1YmxpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFvRkEsNEVBQTRFO0FBQy9ELFFBQUEsbUJBQW1CLEdBQUcsNkJBQTZCLENBQUMifQ==
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = documentFactPublicationReconciliationJob;
5
+ const public_1 = require("../public");
6
+ const plugin_features_1 = require("../documents/plugin-features");
7
+ const publish_document_facts_1 = require("../workflows/documents/publish-document-facts");
8
+ async function documentFactPublicationReconciliationJob(container) {
9
+ if (!(await (0, public_1.isPluginFeatureEnabled)(container, plugin_features_1.documentsPluginFeatures, "invoices"))) {
10
+ return;
11
+ }
12
+ await (0, publish_document_facts_1.publishDocumentFactsWorkflow)(container).run({ input: { limit: 100 } });
13
+ }
14
+ exports.config = {
15
+ name: "documents-fact-publication-reconciliation",
16
+ schedule: "* * * * *",
17
+ };
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtZmFjdC1wdWJsaWNhdGlvbi1yZWNvbmNpbGlhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9qb2JzL2RvY3VtZW50LWZhY3QtcHVibGljYXRpb24tcmVjb25jaWxpYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBTUEsMkRBY0M7QUFwQkQsc0NBQWtEO0FBR2xELGtFQUFzRTtBQUN0RSwwRkFBNEY7QUFFN0UsS0FBSyxVQUFVLHdDQUF3QyxDQUNwRSxTQUEwQjtJQUUxQixJQUNFLENBQUMsQ0FBQyxNQUFNLElBQUEsK0JBQXNCLEVBQzVCLFNBQVMsRUFDVCx5Q0FBdUIsRUFDdkIsVUFBVSxDQUNYLENBQUMsRUFDRixDQUFDO1FBQ0QsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLElBQUEscURBQTRCLEVBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUM5RSxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQUc7SUFDcEIsSUFBSSxFQUFFLDJDQUEyQztJQUNqRCxRQUFRLEVBQUUsV0FBVztDQUNiLENBQUEifQ==
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = documentResolutionReconciliationJob;
5
+ const public_1 = require("../public");
6
+ const plugin_features_1 = require("../documents/plugin-features");
7
+ const reconcile_document_resolutions_1 = require("../workflows/documents/reconcile-document-resolutions");
8
+ async function documentResolutionReconciliationJob(container) {
9
+ if (!(await (0, public_1.isPluginFeatureEnabled)(container, plugin_features_1.documentsPluginFeatures, "invoices"))) {
10
+ return;
11
+ }
12
+ await (0, reconcile_document_resolutions_1.reconcileDocumentResolutionsWorkflow)(container).run({
13
+ input: { limit: 50 },
14
+ });
15
+ }
16
+ exports.config = {
17
+ name: "documents-domain-resolution-reconciliation",
18
+ schedule: "* * * * *",
19
+ };
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtcmVzb2x1dGlvbi1yZWNvbmNpbGlhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9qb2JzL2RvY3VtZW50LXJlc29sdXRpb24tcmVjb25jaWxpYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBTUEsc0RBZ0JDO0FBdEJELHNDQUFrRDtBQUdsRCxrRUFBc0U7QUFDdEUsMEdBQTRHO0FBRTdGLEtBQUssVUFBVSxtQ0FBbUMsQ0FDL0QsU0FBMEI7SUFFMUIsSUFDRSxDQUFDLENBQUMsTUFBTSxJQUFBLCtCQUFzQixFQUM1QixTQUFTLEVBQ1QseUNBQXVCLEVBQ3ZCLFVBQVUsQ0FDWCxDQUFDLEVBQ0YsQ0FBQztRQUNELE9BQU07SUFDUixDQUFDO0lBRUQsTUFBTSxJQUFBLHFFQUFvQyxFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUN4RCxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO0tBQ3JCLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBRztJQUNwQixJQUFJLEVBQUUsNENBQTRDO0lBQ2xELFFBQVEsRUFBRSxXQUFXO0NBQ2IsQ0FBQSJ9
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = packingListReconciliationJob;
5
+ const public_1 = require("../public");
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const plugin_features_1 = require("../documents/plugin-features");
8
+ const issue_packing_list_1 = require("../workflows/documents/issue-packing-list");
9
+ const PAGE_SIZE = 100;
10
+ async function packingListReconciliationJob(container) {
11
+ if (!(await (0, public_1.isPluginFeatureEnabled)(container, plugin_features_1.documentsPluginFeatures, "packing_lists"))) {
12
+ return;
13
+ }
14
+ const fulfillments = container.resolve(utils_1.Modules.FULFILLMENT);
15
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
16
+ let offset = 0;
17
+ let count = 0;
18
+ do {
19
+ const [page, total] = await fulfillments.listAndCountFulfillments({
20
+ canceled_at: null,
21
+ requires_shipping: true,
22
+ }, {
23
+ skip: offset,
24
+ take: PAGE_SIZE,
25
+ select: ["id"],
26
+ order: { created_at: "ASC", id: "ASC" },
27
+ });
28
+ count = total;
29
+ for (const fulfillment of page) {
30
+ try {
31
+ await (0, issue_packing_list_1.issuePackingListWorkflow)(container).run({
32
+ input: { fulfillment_id: fulfillment.id },
33
+ });
34
+ }
35
+ catch (error) {
36
+ logger.error(`documents: packing-list reconciliation failed for fulfillment ${fulfillment.id}`, error instanceof Error ? error : new Error(String(error)));
37
+ }
38
+ }
39
+ offset += page.length;
40
+ if (!page.length) {
41
+ break;
42
+ }
43
+ } while (offset < count);
44
+ }
45
+ exports.config = {
46
+ name: "documents-packing-list-reconciliation",
47
+ schedule: "*/10 * * * *",
48
+ };
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2luZy1saXN0LXJlY29uY2lsaWF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2pvYnMvcGFja2luZy1saXN0LXJlY29uY2lsaWF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWdCQSwrQ0FxREM7QUFyRUQsc0NBQWtEO0FBRWxELHFEQUE4RTtBQUU5RSxrRUFBc0U7QUFDdEUsa0ZBQW9GO0FBU3BGLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQTtBQUVOLEtBQUssVUFBVSw0QkFBNEIsQ0FDeEQsU0FBMEI7SUFFMUIsSUFDRSxDQUFDLENBQUMsTUFBTSxJQUFBLCtCQUFzQixFQUM1QixTQUFTLEVBQ1QseUNBQXVCLEVBQ3ZCLGVBQWUsQ0FDaEIsQ0FBQyxFQUNGLENBQUM7UUFDRCxPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQ3BDLGVBQU8sQ0FBQyxXQUFXLENBQ2EsQ0FBQTtJQUNsQyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFTLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzFFLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQTtJQUNkLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQTtJQUViLEdBQUcsQ0FBQztRQUNGLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxZQUFZLENBQUMsd0JBQXdCLENBQy9EO1lBQ0UsV0FBVyxFQUFFLElBQUk7WUFDakIsaUJBQWlCLEVBQUUsSUFBSTtTQUN4QixFQUNEO1lBQ0UsSUFBSSxFQUFFLE1BQU07WUFDWixJQUFJLEVBQUUsU0FBUztZQUNmLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQztZQUNkLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRTtTQUN4QyxDQUNGLENBQUE7UUFDRCxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBRWIsS0FBSyxNQUFNLFdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFBLDZDQUF3QixFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztvQkFDNUMsS0FBSyxFQUFFLEVBQUUsY0FBYyxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUU7aUJBQzFDLENBQUMsQ0FBQTtZQUNKLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sQ0FBQyxLQUFLLENBQ1YsaUVBQWlFLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFDakYsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDMUQsQ0FBQTtZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUE7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixNQUFLO1FBQ1AsQ0FBQztJQUNILENBQUMsUUFBUSxNQUFNLEdBQUcsS0FBSyxFQUFDO0FBQzFCLENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBRztJQUNwQixJQUFJLEVBQUUsdUNBQXVDO0lBQzdDLFFBQVEsRUFBRSxjQUFjO0NBQ3pCLENBQUEifQ==
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = reconcileEmailAttemptsJob;
5
+ const public_1 = require("../public");
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const plugin_features_1 = require("../email/plugin-features");
8
+ const email_1 = require("../modules/email");
9
+ const dispatch_email_message_1 = require("../workflows/email/dispatch-email-message");
10
+ async function reconcileEmailAttemptsJob(container) {
11
+ if (!(await (0, public_1.isPluginFeatureEnabled)(container, plugin_features_1.emailPluginFeatures))) {
12
+ return;
13
+ }
14
+ const email = container.resolve(email_1.EMAIL_MODULE);
15
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
16
+ const now = new Date();
17
+ let candidates;
18
+ try {
19
+ candidates = await email.listStaleAttemptCandidates({ limit: 20, now });
20
+ }
21
+ catch {
22
+ logger.error("email: attempt reconciliation failed (EMAIL_ATTEMPT_RECONCILIATION_FAILED)");
23
+ return;
24
+ }
25
+ for (const candidate of candidates) {
26
+ let notification = null;
27
+ try {
28
+ notification = await (0, dispatch_email_message_1.findAttemptNotification)(container, candidate.attempt_id);
29
+ }
30
+ catch {
31
+ logger.warn(`email: message=${candidate.message_id} kind=${candidate.kind} attempt=${candidate.attempt_id} code=notification_lookup_failed`);
32
+ continue;
33
+ }
34
+ try {
35
+ if (notification?.status === "success") {
36
+ await email.completeStaleAttempt({
37
+ attempt_id: candidate.attempt_id,
38
+ attempt_token: candidate.attempt_token,
39
+ now,
40
+ notification_id: notification.id,
41
+ outcome: "sent",
42
+ });
43
+ }
44
+ else {
45
+ await email.completeStaleAttempt({
46
+ attempt_id: candidate.attempt_id,
47
+ attempt_token: candidate.attempt_token,
48
+ now,
49
+ notification_id: notification?.id ?? null,
50
+ outcome: "unknown",
51
+ });
52
+ }
53
+ }
54
+ catch {
55
+ logger.warn(`email: message=${candidate.message_id} kind=${candidate.kind} attempt=${candidate.attempt_id} code=reconciliation_conflict`);
56
+ }
57
+ }
58
+ }
59
+ exports.config = {
60
+ name: "email-reconcile-attempts",
61
+ schedule: "* * * * *",
62
+ };
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb25jaWxlLWVtYWlsLWF0dGVtcHRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2pvYnMvcmVjb25jaWxlLWVtYWlsLWF0dGVtcHRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVNBLDRDQXlEQztBQWxFRCxzQ0FBbUQ7QUFFbkQscURBQXNFO0FBRXRFLDhEQUErRDtBQUMvRCw0Q0FBZ0Q7QUFFaEQsc0ZBQW9GO0FBRXJFLEtBQUssVUFBVSx5QkFBeUIsQ0FDckQsU0FBMEI7SUFFMUIsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFBLCtCQUFzQixFQUFDLFNBQVMsRUFBRSxxQ0FBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRSxPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQXFCLG9CQUFZLENBQUMsQ0FBQztJQUNsRSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFTLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNFLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDdkIsSUFBSSxVQUFVLENBQUM7SUFDZixJQUFJLENBQUM7UUFDSCxVQUFVLEdBQUcsTUFBTSxLQUFLLENBQUMsMEJBQTBCLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sQ0FBQyxLQUFLLENBQ1YsNEVBQTRFLENBQzdFLENBQUM7UUFDRixPQUFPO0lBQ1QsQ0FBQztJQUVELEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7UUFDbkMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQztZQUNILFlBQVksR0FBRyxNQUFNLElBQUEsZ0RBQXVCLEVBQzFDLFNBQVMsRUFDVCxTQUFTLENBQUMsVUFBVSxDQUNyQixDQUFDO1FBQ0osQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE1BQU0sQ0FBQyxJQUFJLENBQ1Qsa0JBQWtCLFNBQVMsQ0FBQyxVQUFVLFNBQVMsU0FBUyxDQUFDLElBQUksWUFBWSxTQUFTLENBQUMsVUFBVSxrQ0FBa0MsQ0FDaEksQ0FBQztZQUNGLFNBQVM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0gsSUFBSSxZQUFZLEVBQUUsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN2QyxNQUFNLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQztvQkFDL0IsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVO29CQUNoQyxhQUFhLEVBQUUsU0FBUyxDQUFDLGFBQWE7b0JBQ3RDLEdBQUc7b0JBQ0gsZUFBZSxFQUFFLFlBQVksQ0FBQyxFQUFFO29CQUNoQyxPQUFPLEVBQUUsTUFBTTtpQkFDaEIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sS0FBSyxDQUFDLG9CQUFvQixDQUFDO29CQUMvQixVQUFVLEVBQUUsU0FBUyxDQUFDLFVBQVU7b0JBQ2hDLGFBQWEsRUFBRSxTQUFTLENBQUMsYUFBYTtvQkFDdEMsR0FBRztvQkFDSCxlQUFlLEVBQUUsWUFBWSxFQUFFLEVBQUUsSUFBSSxJQUFJO29CQUN6QyxPQUFPLEVBQUUsU0FBUztpQkFDbkIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxNQUFNLENBQUMsSUFBSSxDQUNULGtCQUFrQixTQUFTLENBQUMsVUFBVSxTQUFTLFNBQVMsQ0FBQyxJQUFJLFlBQVksU0FBUyxDQUFDLFVBQVUsK0JBQStCLENBQzdILENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBRztJQUNwQixJQUFJLEVBQUUsMEJBQTBCO0lBQ2hDLFFBQVEsRUFBRSxXQUFXO0NBQ2IsQ0FBQyJ9
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = reconcilePendingEmailMessagesJob;
5
+ const public_1 = require("../public");
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const plugin_features_1 = require("../email/plugin-features");
8
+ const email_1 = require("../modules/email");
9
+ const dispatch_email_message_1 = require("../workflows/email/dispatch-email-message");
10
+ async function reconcilePendingEmailMessagesJob(container) {
11
+ if (!(await (0, public_1.isPluginFeatureEnabled)(container, plugin_features_1.emailPluginFeatures))) {
12
+ return;
13
+ }
14
+ const email = container.resolve(email_1.EMAIL_MODULE);
15
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
16
+ const now = new Date();
17
+ let messageIds;
18
+ try {
19
+ await email.reconcilePendingMessageDependencies({ limit: 100, now });
20
+ messageIds = await email.listReadyMessageIds({ limit: 20 });
21
+ }
22
+ catch {
23
+ logger.error("email: pending reconciliation failed (EMAIL_PENDING_RECONCILIATION_FAILED)");
24
+ return;
25
+ }
26
+ for (const messageId of messageIds) {
27
+ try {
28
+ await (0, dispatch_email_message_1.dispatchEmailMessageWorkflow)(container).run({
29
+ input: { message_id: messageId },
30
+ });
31
+ }
32
+ catch {
33
+ logger.warn(`email: message=${messageId} code=pending_dispatch_conflict`);
34
+ }
35
+ }
36
+ }
37
+ exports.config = {
38
+ name: "email-reconcile-pending-messages",
39
+ schedule: "* * * * *",
40
+ };
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb25jaWxlLXBlbmRpbmctZW1haWwtbWVzc2FnZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvam9icy9yZWNvbmNpbGUtcGVuZGluZy1lbWFpbC1tZXNzYWdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFTQSxtREE4QkM7QUF2Q0Qsc0NBQW1EO0FBRW5ELHFEQUFzRTtBQUV0RSw4REFBK0Q7QUFDL0QsNENBQWdEO0FBRWhELHNGQUF5RjtBQUUxRSxLQUFLLFVBQVUsZ0NBQWdDLENBQzVELFNBQTBCO0lBRTFCLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBQSwrQkFBc0IsRUFBQyxTQUFTLEVBQUUscUNBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEUsT0FBTztJQUNULENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFxQixvQkFBWSxDQUFDLENBQUM7SUFDbEUsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBUyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRSxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3ZCLElBQUksVUFBb0IsQ0FBQztJQUN6QixJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNyRSxVQUFVLEdBQUcsTUFBTSxLQUFLLENBQUMsbUJBQW1CLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxDQUFDLEtBQUssQ0FDViw0RUFBNEUsQ0FDN0UsQ0FBQztRQUNGLE9BQU87SUFDVCxDQUFDO0lBRUQsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUEscURBQTRCLEVBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUNoRCxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFO2FBQ2pDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixTQUFTLGlDQUFpQyxDQUFDLENBQUM7UUFDNUUsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQUc7SUFDcEIsSUFBSSxFQUFFLGtDQUFrQztJQUN4QyxRQUFRLEVBQUUsV0FBVztDQUNiLENBQUMifQ==
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = retryEmailMessagesJob;
5
+ const public_1 = require("../public");
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const plugin_features_1 = require("../email/plugin-features");
8
+ const retry_email_messages_1 = require("../workflows/email/retry-email-messages");
9
+ async function retryEmailMessagesJob(container) {
10
+ if (!(await (0, public_1.isPluginFeatureEnabled)(container, plugin_features_1.emailPluginFeatures))) {
11
+ return;
12
+ }
13
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
14
+ try {
15
+ await (0, retry_email_messages_1.retryEmailMessagesWorkflow)(container).run({
16
+ input: { limit: 20 },
17
+ });
18
+ }
19
+ catch {
20
+ logger.error("email: retry job failed (EMAIL_RETRY_JOB_FAILED)");
21
+ }
22
+ }
23
+ exports.config = {
24
+ name: "email-retry-messages",
25
+ schedule: "* * * * *",
26
+ };
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnktZW1haWwtbWVzc2FnZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvam9icy9yZXRyeS1lbWFpbC1tZXNzYWdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFPQSx3Q0FlQztBQXRCRCxzQ0FBbUQ7QUFFbkQscURBQXNFO0FBRXRFLDhEQUErRDtBQUMvRCxrRkFBcUY7QUFFdEUsS0FBSyxVQUFVLHFCQUFxQixDQUNqRCxTQUEwQjtJQUUxQixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUEsK0JBQXNCLEVBQUMsU0FBUyxFQUFFLHFDQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BFLE9BQU87SUFDVCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBUyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRSxJQUFJLENBQUM7UUFDSCxNQUFNLElBQUEsaURBQTBCLEVBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQzlDLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7U0FDckIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztJQUNuRSxDQUFDO0FBQ0gsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFHO0lBQ3BCLElBQUksRUFBRSxzQkFBc0I7SUFDNUIsUUFBUSxFQUFFLFdBQVc7Q0FDYixDQUFDIn0=
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dismissOrphanedCartPromotionLinks = void 0;
4
+ exports.default = dismissOrphanedCartPromotionLinksScript;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const cart_promotion_links_1 = require("../utils/cart-promotion-links");
7
+ /**
8
+ * One-off repair, run exactly once by `medusa db:migrate`: removes every
9
+ * `cart_promotion` link whose promotion was deleted before the
10
+ * `promotionsDeleted` hook (src/workflows/hooks/dismiss-deleted-
11
+ * promotion-cart-links.ts) existed. Such links surface as `null` entries in
12
+ * `cart.promotions` and crashed both the storefront cart and the affiliate
13
+ * plugin's cart hooks.
14
+ */
15
+ const dismissOrphanedCartPromotionLinks = async (container) => {
16
+ const orphaned = await (0, cart_promotion_links_1.findOrphanedCartPromotionLinks)(container);
17
+ await (0, cart_promotion_links_1.dismissCartPromotionLinks)(container, orphaned);
18
+ return orphaned.length;
19
+ };
20
+ exports.dismissOrphanedCartPromotionLinks = dismissOrphanedCartPromotionLinks;
21
+ async function dismissOrphanedCartPromotionLinksScript({ container, }) {
22
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
23
+ const removed = await (0, exports.dismissOrphanedCartPromotionLinks)(container);
24
+ logger.info(`Removed ${removed} cart_promotion link(s) pointing at deleted promotions.`);
25
+ }
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzbWlzcy1vcnBoYW5lZC1jYXJ0LXByb21vdGlvbi1saW5rcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9taWdyYXRpb24tc2NyaXB0cy9kaXNtaXNzLW9ycGhhbmVkLWNhcnQtcHJvbW90aW9uLWxpbmtzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXdCQSwwREFVQztBQWpDRCxxREFBcUU7QUFFckUsd0VBR3NDO0FBRXRDOzs7Ozs7O0dBT0c7QUFDSSxNQUFNLGlDQUFpQyxHQUFHLEtBQUssRUFDcEQsU0FBMEIsRUFDVCxFQUFFO0lBQ25CLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSxxREFBOEIsRUFBQyxTQUFTLENBQUMsQ0FBQTtJQUNoRSxNQUFNLElBQUEsZ0RBQXlCLEVBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ3BELE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQTtBQUN4QixDQUFDLENBQUE7QUFOWSxRQUFBLGlDQUFpQyxxQ0FNN0M7QUFFYyxLQUFLLFVBQVUsdUNBQXVDLENBQUMsRUFDcEUsU0FBUyxHQUdWO0lBQ0MsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNsRSxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEseUNBQWlDLEVBQUMsU0FBUyxDQUFDLENBQUE7SUFDbEUsTUFBTSxDQUFDLElBQUksQ0FDVCxXQUFXLE9BQU8seURBQXlELENBQzVFLENBQUE7QUFDSCxDQUFDIn0=
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCancellationSnapshot = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const snapshot_normalization_1 = require("./snapshot-normalization");
6
+ const tax_breakdown_1 = require("./tax-breakdown");
7
+ const asPositiveAmount = (value, field) => {
8
+ const amount = utils_1.MathBN.convert(value);
9
+ if (!amount.isFinite() || !utils_1.MathBN.gt(amount, 0)) {
10
+ throw new Error(`${field} must be a positive monetary amount.`);
11
+ }
12
+ return amount;
13
+ };
14
+ const scaleAsNegativeMoney = (input) => {
15
+ if (input.money.currency_code !== input.currency_code) {
16
+ throw new Error("The original invoice snapshot contains mixed currencies.");
17
+ }
18
+ const decimalPlaces = (0, tax_breakdown_1.getCurrencyDecimalPlaces)(input.currency_code);
19
+ const amount = utils_1.MathBN.mult(utils_1.MathBN.div(utils_1.MathBN.convert(input.money.amount), input.source_total), input.refund_amount)
20
+ .negated()
21
+ .decimalPlaces(decimalPlaces)
22
+ .toFixed(decimalPlaces);
23
+ return {
24
+ amount,
25
+ currency_code: input.currency_code,
26
+ };
27
+ };
28
+ /**
29
+ * Builds a negative correction from the invoice snapshot that the customer
30
+ * actually received. A payment refund has no item allocation, therefore the
31
+ * stored invoice's tax and total distribution is applied proportionally.
32
+ */
33
+ const createCancellationSnapshot = (input) => {
34
+ const sourceInvoice = (0, snapshot_normalization_1.normalizeDocumentSnapshot)(input.source_invoice);
35
+ if (sourceInvoice.document.kind !== "invoice" ||
36
+ !sourceInvoice.document.number) {
37
+ throw new Error("A numbered invoice snapshot is required for a cancellation.");
38
+ }
39
+ if (Number.isNaN(input.issued_at.getTime())) {
40
+ throw new Error("The cancellation issue date is invalid.");
41
+ }
42
+ const currencyCode = sourceInvoice.order.currency_code;
43
+ const sourceTotal = asPositiveAmount(sourceInvoice.totals.total.amount, "The original invoice total");
44
+ const refundAmount = asPositiveAmount(input.refund_amount, "The refund amount");
45
+ if (utils_1.MathBN.gt(refundAmount, sourceTotal)) {
46
+ throw new Error("The refund amount cannot exceed the original invoice total.");
47
+ }
48
+ const scale = (money) => scaleAsNegativeMoney({
49
+ money,
50
+ source_total: sourceTotal,
51
+ refund_amount: refundAmount,
52
+ currency_code: currencyCode,
53
+ });
54
+ const subtotal = scale(sourceInvoice.totals.subtotal);
55
+ const taxTotal = scale(sourceInvoice.totals.tax_total);
56
+ const taxBreakdown = (0, tax_breakdown_1.roundTaxBreakdown)(sourceInvoice.totals.tax_breakdown.map((entry) => ({
57
+ ...entry,
58
+ tax_total: scale(entry.tax_total),
59
+ })), taxTotal);
60
+ const total = {
61
+ amount: refundAmount.negated().toFixed((0, tax_breakdown_1.getCurrencyDecimalPlaces)(currencyCode)),
62
+ currency_code: currencyCode,
63
+ };
64
+ return {
65
+ document: {
66
+ id: input.document_id,
67
+ kind: "cancellation",
68
+ number: input.document_number,
69
+ issued_at: input.issued_at.toISOString(),
70
+ source_document_number: sourceInvoice.document.number,
71
+ },
72
+ order: { ...sourceInvoice.order },
73
+ lines: [
74
+ {
75
+ id: `refund:${input.document_id}`,
76
+ title: `Rückerstattung zu Rechnung ${sourceInvoice.document.number}`,
77
+ sku: null,
78
+ quantity: 1,
79
+ unit_price: { ...subtotal },
80
+ subtotal,
81
+ tax_total: taxTotal,
82
+ total,
83
+ batch_allocations: [],
84
+ },
85
+ ],
86
+ totals: {
87
+ subtotal,
88
+ tax_total: taxTotal,
89
+ tax_breakdown: taxBreakdown,
90
+ shipping_total: scale(sourceInvoice.totals.shipping_total),
91
+ discount_total: scale(sourceInvoice.totals.discount_total),
92
+ total,
93
+ },
94
+ };
95
+ };
96
+ exports.createCancellationSnapshot = createCancellationSnapshot;
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuY2VsbGF0aW9uLXNuYXBzaG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvZG9jdW1lbnRzL2RvbWFpbi9jYW5jZWxsYXRpb24tc25hcHNob3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQWtEO0FBTWxELHFFQUFvRTtBQUNwRSxtREFBNkU7QUFFN0UsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQWEsRUFBRSxLQUFhLEVBQUUsRUFBRTtJQUN4RCxNQUFNLE1BQU0sR0FBRyxjQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLHNDQUFzQyxDQUFDLENBQUE7SUFDakUsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyxDQUFBO0FBRUQsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEtBSzdCLEVBQWlCLEVBQUU7SUFDbEIsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFBO0lBQzdFLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFBLHdDQUF3QixFQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUNuRSxNQUFNLE1BQU0sR0FBRyxjQUFNLENBQUMsSUFBSSxDQUN4QixjQUFNLENBQUMsR0FBRyxDQUFDLGNBQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQ2xFLEtBQUssQ0FBQyxhQUFh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
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveDocumentNumberPeriodYear = exports.formatDocumentNumber = void 0;
4
+ const prefixByKind = {
5
+ invoice: "RE",
6
+ cancellation: "ST",
7
+ credit_note: "GS",
8
+ };
9
+ const formatDocumentNumber = (input) => {
10
+ if (!Number.isInteger(input.periodYear) || input.periodYear <= 0) {
11
+ throw new Error("The document-number period year must be a positive integer.");
12
+ }
13
+ if (!Number.isInteger(input.sequenceValue) || input.sequenceValue <= 0) {
14
+ throw new Error("The document-number sequence value must be a positive integer.");
15
+ }
16
+ return `${prefixByKind[input.kind]}-${input.periodYear}-${input.sequenceValue}`;
17
+ };
18
+ exports.formatDocumentNumber = formatDocumentNumber;
19
+ const resolveDocumentNumberPeriodYear = (issuedAt, timeZone) => {
20
+ if (Number.isNaN(issuedAt.getTime())) {
21
+ throw new Error("The document issue date is invalid.");
22
+ }
23
+ const year = new Intl.DateTimeFormat("en", {
24
+ timeZone,
25
+ year: "numeric",
26
+ })
27
+ .formatToParts(issuedAt)
28
+ .find((part) => part.type === "year")?.value;
29
+ const periodYear = Number(year);
30
+ if (!Number.isInteger(periodYear) || periodYear <= 0) {
31
+ throw new Error("The document-number period year could not be resolved.");
32
+ }
33
+ return periodYear;
34
+ };
35
+ exports.resolveDocumentNumberPeriodYear = resolveDocumentNumberPeriodYear;
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtbnVtYmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvZG9jdW1lbnRzL2RvbWFpbi9kb2N1bWVudC1udW1iZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsTUFBTSxZQUFZLEdBQWlDO0lBQ2pELE9BQU8sRUFBRSxJQUFJO0lBQ2IsWUFBWSxFQUFFLElBQUk7SUFDbEIsV0FBVyxFQUFFLElBQUk7Q0FDbEIsQ0FBQTtBQUVNLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxLQUlwQyxFQUFVLEVBQUU7SUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNqRSxNQUFNLElBQUksS0FBSyxDQUFDLDZEQUE2RCxDQUFDLENBQUE7SUFDaEYsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3ZFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQTtJQUNuRixDQUFDO0lBRUQsT0FBTyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUE7QUFDakYsQ0FBQyxDQUFBO0FBYlksUUFBQSxvQkFBb0Isd0JBYWhDO0FBRU0sTUFBTSwrQkFBK0IsR0FBRyxDQUM3QyxRQUFjLEVBQ2QsUUFBZ0IsRUFDUixFQUFFO0lBQ1YsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO0lBQ3hELENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFO1FBQ3pDLFFBQVE7UUFDUixJQUFJLEVBQUUsU0FBUztLQUNoQixDQUFDO1NBQ0MsYUFBYSxDQUFDLFFBQVEsQ0FBQztTQUN2QixJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFBO0lBQzlDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFBO0lBQzNFLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDLENBQUE7QUFwQlksUUFBQSwrQkFBK0IsbUNBb0IzQyJ9
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canDeleteReplacedArtifact = exports.isCancellationResolutionReady = exports.resolveRefundCommunicationOwner = exports.selectShipmentInvoiceCandidate = exports.canonicalizeRefundIds = void 0;
4
+ const canonicalizeRefundIds = (refundIds) => [...new Set(refundIds.map((id) => id.trim()).filter(Boolean))].sort((a, b) => a.localeCompare(b));
5
+ exports.canonicalizeRefundIds = canonicalizeRefundIds;
6
+ const selectShipmentInvoiceCandidate = (assignments) => [...assignments]
7
+ .sort((left, right) => left.created_at.getTime() - right.created_at.getTime() ||
8
+ left.fulfillment_id.localeCompare(right.fulfillment_id))[0]?.fulfillment_id ?? null;
9
+ exports.selectShipmentInvoiceCandidate = selectShipmentInvoiceCandidate;
10
+ const resolveRefundCommunicationOwner = (input) => input.order_canceled || input.cancellation_resolution_exists
11
+ ? "cancellation"
12
+ : "standalone";
13
+ exports.resolveRefundCommunicationOwner = resolveRefundCommunicationOwner;
14
+ const isCancellationResolutionReady = (expectedRefundIds, resolutions) => {
15
+ const stateByRefund = new Map(resolutions.map((resolution) => [resolution.refund_id, resolution.state]));
16
+ return (0, exports.canonicalizeRefundIds)(expectedRefundIds).every((refundId) => {
17
+ const state = stateByRefund.get(refundId);
18
+ return state === "ready" || state === "not_applicable";
19
+ });
20
+ };
21
+ exports.isCancellationResolutionReady = isCancellationResolutionReady;
22
+ const canDeleteReplacedArtifact = (artifact) => artifact?.communication_locked === false;
23
+ exports.canDeleteReplacedArtifact = canDeleteReplacedArtifact;
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtcmVzb2x1dGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2RvY3VtZW50cy9kb21haW4vZG9jdW1lbnQtcmVzb2x1dGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLTyxNQUFNLHFCQUFxQixHQUFHLENBQUMsU0FBNEIsRUFBWSxFQUFFLENBQzlFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUMzRSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUNuQixDQUFBO0FBSFUsUUFBQSxxQkFBcUIseUJBRy9CO0FBRUksTUFBTSw4QkFBOEIsR0FBRyxDQUM1QyxXQUFvRSxFQUNyRCxFQUFFLENBQ2pCLENBQUMsR0FBRyxXQUFXLENBQUM7S0FDYixJQUFJLENBQ0gsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDZCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFO0lBQ3RELElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FDMUQsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLElBQUksSUFBSSxDQUFBO0FBUm5CLFFBQUEsOEJBQThCLGtDQVFYO0FBRXpCLE1BQU0sK0JBQStCLEdBQUcsQ0FBQyxLQUcvQyxFQUE0QixFQUFFLENBQzdCLEtBQUssQ0FBQyxjQUFjLElBQUksS0FBSyxDQUFDLDhCQUE4QjtJQUMxRCxDQUFDLENBQUMsY0FBYztJQUNoQixDQUFDLENBQUMsWUFBWSxDQUFBO0FBTkwsUUFBQSwrQkFBK0IsbUNBTTFCO0FBRVgsTUFBTSw2QkFBNkIsR0FBRyxDQUMzQyxpQkFBb0MsRUFDcEMsV0FHRyxFQUNNLEVBQUU7SUFDWCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FDM0IsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUMxRSxDQUFBO0lBRUQsT0FBTyxJQUFBLDZCQUFxQixFQUFDLGlCQUFpQixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFDakUsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN6QyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQUksS0FBSyxLQUFLLGdCQUFnQixDQUFBO0lBQ3hELENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFBO0FBZlksUUFBQSw2QkFBNkIsaUNBZXpDO0FBRU0sTUFBTSx5QkFBeUIsR0FBRyxDQUN2QyxRQUFrRCxFQUN6QyxFQUFFLENBQUMsUUFBUSxFQUFFLG9CQUFvQixLQUFLLEtBQUssQ0FBQTtBQUZ6QyxRQUFBLHlCQUF5Qiw2QkFFZ0IifQ==
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canCustomerAccessDocument = exports.mapBatchAllocationsByLineItem = exports.isInvoiceIssuableAfterShipment = void 0;
4
+ /**
5
+ * The single invoice is deliberately deferred until Medusa has registered the
6
+ * final shipment. `partially_shipped` must never produce a partial invoice.
7
+ */
8
+ const isInvoiceIssuableAfterShipment = (order) => !order.canceled_at &&
9
+ (order.fulfillment_status === "shipped" ||
10
+ order.fulfillment_status === "delivered");
11
+ exports.isInvoiceIssuableAfterShipment = isInvoiceIssuableAfterShipment;
12
+ /**
13
+ * Maps immutable FEFO withdrawals to their order line. Sorting makes the
14
+ * template input deterministic even when a provider returns rows in a
15
+ * different order.
16
+ */
17
+ const mapBatchAllocationsByLineItem = (allocations) => {
18
+ const byLineItem = {};
19
+ for (const allocation of allocations) {
20
+ const { line_item_id: lineItemId, ...documentAllocation } = allocation;
21
+ const lineAllocations = byLineItem[lineItemId] ?? [];
22
+ lineAllocations.push(documentAllocation);
23
+ byLineItem[lineItemId] = lineAllocations;
24
+ }
25
+ for (const lineAllocations of Object.values(byLineItem)) {
26
+ lineAllocations.sort((left, right) => left.batch_id.localeCompare(right.batch_id));
27
+ }
28
+ return byLineItem;
29
+ };
30
+ exports.mapBatchAllocationsByLineItem = mapBatchAllocationsByLineItem;
31
+ /**
32
+ * Guest documents intentionally have no storefront owner and are never
33
+ * retrievable over Store.
34
+ */
35
+ const canCustomerAccessDocument = (documentCustomerId, actorCustomerId) => typeof documentCustomerId === "string" && documentCustomerId === actorCustomerId;
36
+ exports.canCustomerAccessDocument = canCustomerAccessDocument;
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNzdWFuY2UtcnVsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9kb2N1bWVudHMvZG9tYWluL2lzc3VhbmNlLXJ1bGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWVBOzs7R0FHRztBQUNJLE1BQU0sOEJBQThCLEdBQUcsQ0FDNUMsS0FBZ0MsRUFDdkIsRUFBRSxDQUNYLENBQUMsS0FBSyxDQUFDLFdBQVc7SUFDbEIsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEtBQUssU0FBUztRQUNyQyxLQUFLLENBQUMsa0JBQWtCLEtBQUssV0FBVyxDQUFDLENBQUE7QUFMaEMsUUFBQSw4QkFBOEIsa0NBS0U7QUFFN0M7Ozs7R0FJRztBQUNJLE1BQU0sNkJBQTZCLEdBQUcsQ0FDM0MsV0FBc0MsRUFDSyxFQUFFO0lBQzdDLE1BQU0sVUFBVSxHQUE4QyxFQUFFLENBQUE7SUFFaEUsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNyQyxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxHQUFHLGtCQUFrQixFQUFFLEdBQUcsVUFBVSxDQUFBO1FBQ3RFLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDcEQsZUFBZSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBQ3hDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxlQUFlLENBQUE7SUFDMUMsQ0FBQztJQUVELEtBQUssTUFBTSxlQUFlLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3hELGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUM1QyxDQUFBO0lBQ0gsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFBO0FBQ25CLENBQUMsQ0FBQTtBQW5CWSxRQUFBLDZCQUE2QixpQ0FtQnpDO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSx5QkFBeUIsR0FBRyxDQUN2QyxrQkFBNkMsRUFDN0MsZUFBdUIsRUFDZCxFQUFFLENBQ1gsT0FBTyxrQkFBa0IsS0FBSyxRQUFRLElBQUksa0JBQWtCLEtBQUssZUFBZSxDQUFBO0FBSnJFLFFBQUEseUJBQXlCLDZCQUk0QyJ9