@hartl-services/medusa-base 0.4.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/.medusa/server/src/admin/index.js +1657 -111
  2. package/.medusa/server/src/admin/index.mjs +1647 -101
  3. package/.medusa/server/src/api/admin/email/messages/[id]/resends/route.js +24 -0
  4. package/.medusa/server/src/api/admin/email/messages/[id]/route.js +12 -0
  5. package/.medusa/server/src/api/admin/email/messages/route.js +12 -0
  6. package/.medusa/server/src/api/admin/email/terms-versions/[id]/download/route.js +16 -0
  7. package/.medusa/server/src/api/admin/email/terms-versions/route.js +47 -0
  8. package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/download/route.js +21 -0
  9. package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/regenerate/route.js +38 -0
  10. package/.medusa/server/src/api/admin/orders/[id]/documents/regenerate/route.js +32 -0
  11. package/.medusa/server/src/api/admin/orders/[id]/documents/route.js +36 -0
  12. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/download/route.js +24 -0
  13. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/retry/route.js +44 -0
  14. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/route.js +82 -0
  15. package/.medusa/server/src/api/document-download-response.js +16 -0
  16. package/.medusa/server/src/api/document-response.js +23 -0
  17. package/.medusa/server/src/api/files/[asset]/route.js +24 -0
  18. package/.medusa/server/src/api/files/file-response.js +43 -0
  19. package/.medusa/server/src/api/files/gateway-options.js +31 -0
  20. package/.medusa/server/src/api/files/private/[token]/route.js +29 -0
  21. package/.medusa/server/src/api/files/upload/[token]/route.js +66 -0
  22. package/.medusa/server/src/api/middlewares.js +168 -1
  23. package/.medusa/server/src/api/packing-list-response.js +22 -0
  24. package/.medusa/server/src/api/route.js +27 -0
  25. package/.medusa/server/src/api/store/documents/[id]/download/route.js +21 -0
  26. package/.medusa/server/src/api/store/documents/[id]/route.js +15 -0
  27. package/.medusa/server/src/api/store/documents/route.js +11 -0
  28. package/.medusa/server/src/api/terms-download-response.js +12 -0
  29. package/.medusa/server/src/documents/config/index.js +18 -0
  30. package/.medusa/server/src/documents/paths/documents.js +6 -0
  31. package/.medusa/server/src/documents/paths/index.js +18 -0
  32. package/.medusa/server/src/documents/plugin-features.js +38 -0
  33. package/.medusa/server/src/documents/schemas/documents.js +18 -0
  34. package/.medusa/server/src/documents/schemas/index.js +18 -0
  35. package/.medusa/server/src/documents/scripts/verify-documents-file-storage.js +55 -0
  36. package/.medusa/server/src/documents/templates/financial-document.js +160 -0
  37. package/.medusa/server/src/documents/templates/format.js +73 -0
  38. package/.medusa/server/src/documents/templates/html-factory.js +42 -0
  39. package/.medusa/server/src/documents/templates/html-utils.js +23 -0
  40. package/.medusa/server/src/documents/templates/layout.js +142 -0
  41. package/.medusa/server/src/documents/templates/packing-list.js +52 -0
  42. package/.medusa/server/src/documents/types/admin-api.js +3 -0
  43. package/.medusa/server/src/documents/types/document-summary.js +3 -0
  44. package/.medusa/server/src/documents/types/documents.js +3 -0
  45. package/.medusa/server/src/documents/types/html-factory.js +6 -0
  46. package/.medusa/server/src/documents/types/index.js +22 -0
  47. package/.medusa/server/src/documents/types/store-api.js +3 -0
  48. package/.medusa/server/src/documents/utils/document-merchant.js +22 -0
  49. package/.medusa/server/src/documents/utils/document-render-settings.js +59 -0
  50. package/.medusa/server/src/documents/utils/html-to-pdf.js +61 -0
  51. package/.medusa/server/src/documents/utils/private-file-storage.js +64 -0
  52. package/.medusa/server/src/documents/utils/resolve-services.js +7 -0
  53. package/.medusa/server/src/email/application/handle-invite-event.js +318 -0
  54. package/.medusa/server/src/email/application/handle-password-reset-event.js +366 -0
  55. package/.medusa/server/src/email/config/index.js +84 -0
  56. package/.medusa/server/src/email/config/notification-module.js +20 -0
  57. package/.medusa/server/src/email/domain/business-keys.js +50 -0
  58. package/.medusa/server/src/email/domain/documents-fact-fingerprint.js +7 -0
  59. package/.medusa/server/src/email/domain/event-schemas.js +36 -0
  60. package/.medusa/server/src/email/domain/failure-classification.js +53 -0
  61. package/.medusa/server/src/email/domain/order-summary.js +103 -0
  62. package/.medusa/server/src/email/domain/refund-summary.js +43 -0
  63. package/.medusa/server/src/email/domain/return-summary.js +118 -0
  64. package/.medusa/server/src/email/domain/shipment-summary.js +74 -0
  65. package/.medusa/server/src/email/plugin-features.js +39 -0
  66. package/.medusa/server/src/email/rendering/default-templates.js +719 -0
  67. package/.medusa/server/src/email/rendering/load-email-shop-details.js +36 -0
  68. package/.medusa/server/src/email/rendering/render-email.js +50 -0
  69. package/.medusa/server/src/email/rendering/resolve-shop-configuration.js +67 -0
  70. package/.medusa/server/src/email/types/email-kinds.js +18 -0
  71. package/.medusa/server/src/email/types/index.js +21 -0
  72. package/.medusa/server/src/email/types/shop-configuration.js +3 -0
  73. package/.medusa/server/src/email/types/smtp-configuration.js +3 -0
  74. package/.medusa/server/src/email/types/template-data.js +232 -0
  75. package/.medusa/server/src/files/config/index.js +256 -0
  76. package/.medusa/server/src/files/gateway/index.js +115 -0
  77. package/.medusa/server/src/files/types/index.js +6 -0
  78. package/.medusa/server/src/files/types/public.js +6 -0
  79. package/.medusa/server/src/jobs/document-fact-publication-reconciliation.js +18 -0
  80. package/.medusa/server/src/jobs/document-resolution-reconciliation.js +20 -0
  81. package/.medusa/server/src/jobs/packing-list-reconciliation.js +49 -0
  82. package/.medusa/server/src/jobs/reconcile-email-attempts.js +63 -0
  83. package/.medusa/server/src/jobs/reconcile-pending-email-messages.js +41 -0
  84. package/.medusa/server/src/jobs/retry-email-messages.js +27 -0
  85. package/.medusa/server/src/migration-scripts/dismiss-orphaned-cart-promotion-links.js +26 -0
  86. package/.medusa/server/src/modules/documents/domain/cancellation-snapshot.js +97 -0
  87. package/.medusa/server/src/modules/documents/domain/document-number.js +36 -0
  88. package/.medusa/server/src/modules/documents/domain/document-resolution.js +24 -0
  89. package/.medusa/server/src/modules/documents/domain/issuance-rules.js +37 -0
  90. package/.medusa/server/src/modules/documents/domain/merchant.js +86 -0
  91. package/.medusa/server/src/modules/documents/domain/options.js +40 -0
  92. package/.medusa/server/src/modules/documents/domain/packing-list.js +90 -0
  93. package/.medusa/server/src/modules/documents/domain/snapshot-normalization.js +17 -0
  94. package/.medusa/server/src/modules/documents/domain/tax-breakdown.js +66 -0
  95. package/.medusa/server/src/modules/documents/index.js +15 -0
  96. package/.medusa/server/src/modules/documents/loaders/assert-private-file-storage.js +20 -0
  97. package/.medusa/server/src/modules/documents/migrations/Migration20260827061749.js +75 -0
  98. package/.medusa/server/src/modules/documents/migrations/Migration20260830111207.js +28 -0
  99. package/.medusa/server/src/modules/documents/models/document-artifact.js +25 -0
  100. package/.medusa/server/src/modules/documents/models/document-number-sequence.js +29 -0
  101. package/.medusa/server/src/modules/documents/models/document.js +82 -0
  102. package/.medusa/server/src/modules/documents/models/order-cancellation-resolution.js +51 -0
  103. package/.medusa/server/src/modules/documents/models/packing-list-revision.js +36 -0
  104. package/.medusa/server/src/modules/documents/models/packing-list.js +27 -0
  105. package/.medusa/server/src/modules/documents/models/refund-document-resolution.js +66 -0
  106. package/.medusa/server/src/modules/documents/models/shipment-invoice-assignment.js +51 -0
  107. package/.medusa/server/src/modules/documents/models/shipment-invoice-coordinator.js +44 -0
  108. package/.medusa/server/src/modules/documents/service.js +1701 -0
  109. package/.medusa/server/src/modules/email/domain/attachment.js +25 -0
  110. package/.medusa/server/src/modules/email/domain/message-state.js +69 -0
  111. package/.medusa/server/src/modules/email/index.js +13 -0
  112. package/.medusa/server/src/modules/email/migrations/Migration20260826173422.js +32 -0
  113. package/.medusa/server/src/modules/email/migrations/Migration20260827172945.js +16 -0
  114. package/.medusa/server/src/modules/email/migrations/Migration20260827194804.js +22 -0
  115. package/.medusa/server/src/modules/email/migrations/Migration20260906195205.js +16 -0
  116. package/.medusa/server/src/modules/email/models/email-attempt.js +56 -0
  117. package/.medusa/server/src/modules/email/models/email-message.js +71 -0
  118. package/.medusa/server/src/modules/email/models/email-terms-version.js +37 -0
  119. package/.medusa/server/src/modules/email/service.js +1285 -0
  120. package/.medusa/server/src/modules/plugin-features/domain/plugin-settings.js +4 -3
  121. package/.medusa/server/src/providers/s3-cache/cache/atomic-write.js +25 -0
  122. package/.medusa/server/src/providers/s3-cache/cache/cache-manager.js +115 -0
  123. package/.medusa/server/src/providers/s3-cache/cache/keyed-lock.js +28 -0
  124. package/.medusa/server/src/providers/s3-cache/index.js +8 -0
  125. package/.medusa/server/src/providers/s3-cache/object-key.js +53 -0
  126. package/.medusa/server/src/providers/s3-cache/s3-cache-file.js +229 -0
  127. package/.medusa/server/src/providers/s3-cache/s3-object-store.js +86 -0
  128. package/.medusa/server/src/providers/smtp/index.js +8 -0
  129. package/.medusa/server/src/providers/smtp/service.js +236 -0
  130. package/.medusa/server/src/providers/smtp/types.js +11 -0
  131. package/.medusa/server/src/public/config.js +186 -0
  132. package/.medusa/server/src/public/descriptor.js +3 -1
  133. package/.medusa/server/src/public/gateway.js +19 -0
  134. package/.medusa/server/src/public/instrumentation.js +56 -0
  135. package/.medusa/server/src/public/shop-config.js +12 -0
  136. package/.medusa/server/src/public/shop-master-data.js +2 -2
  137. package/.medusa/server/src/public/shop-types.js +24 -0
  138. package/.medusa/server/src/shop-config/build-food-shop-config.js +252 -0
  139. package/.medusa/server/src/shop-config/options.js +75 -0
  140. package/.medusa/server/src/subscribers/affiliate-consignment-reminder-due.js +26 -0
  141. package/.medusa/server/src/subscribers/documents-order-canceled.js +24 -0
  142. package/.medusa/server/src/subscribers/documents-order-cancellation-ready.js +26 -0
  143. package/.medusa/server/src/subscribers/documents-refund-ready.js +24 -0
  144. package/.medusa/server/src/subscribers/documents-shipment-created.js +36 -0
  145. package/.medusa/server/src/subscribers/documents-shipment-invoice-assignment-decided.js +26 -0
  146. package/.medusa/server/src/subscribers/email-order-canceled.js +28 -0
  147. package/.medusa/server/src/subscribers/email-shipment-created.js +32 -0
  148. package/.medusa/server/src/subscribers/order-placed.js +27 -0
  149. package/.medusa/server/src/subscribers/packing-list-allocation-revised.js +32 -0
  150. package/.medusa/server/src/subscribers/packing-list-fulfillment-canceled.js +54 -0
  151. package/.medusa/server/src/subscribers/packing-list-fulfillment-created.js +31 -0
  152. package/.medusa/server/src/subscribers/password-reset.js +23 -0
  153. package/.medusa/server/src/subscribers/payment-refunded.js +38 -0
  154. package/.medusa/server/src/subscribers/return-received.js +27 -0
  155. package/.medusa/server/src/subscribers/return-requested.js +27 -0
  156. package/.medusa/server/src/subscribers/user-invite.js +23 -0
  157. package/.medusa/server/src/utils/cart-promotion-links.js +101 -0
  158. package/.medusa/server/src/workflows/documents/issue-cancellation-after-refund.js +246 -0
  159. package/.medusa/server/src/workflows/documents/issue-document.js +165 -0
  160. package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +521 -0
  161. package/.medusa/server/src/workflows/documents/issue-packing-list.js +390 -0
  162. package/.medusa/server/src/workflows/documents/publish-document-facts.js +53 -0
  163. package/.medusa/server/src/workflows/documents/reconcile-document-resolutions.js +48 -0
  164. package/.medusa/server/src/workflows/documents/reconcile-order-cancellation.js +92 -0
  165. package/.medusa/server/src/workflows/documents/regenerate-issued-document.js +61 -0
  166. package/.medusa/server/src/workflows/email/dispatch-email-message.js +301 -0
  167. package/.medusa/server/src/workflows/email/documents-required-facts.js +30 -0
  168. package/.medusa/server/src/workflows/email/prepare-affiliate-reminder-email.js +58 -0
  169. package/.medusa/server/src/workflows/email/prepare-order-canceled-email.js +102 -0
  170. package/.medusa/server/src/workflows/email/prepare-order-received-email.js +82 -0
  171. package/.medusa/server/src/workflows/email/prepare-refund-email.js +71 -0
  172. package/.medusa/server/src/workflows/email/prepare-return-email.js +136 -0
  173. package/.medusa/server/src/workflows/email/prepare-shipment-email.js +115 -0
  174. package/.medusa/server/src/workflows/email/retry-email-messages.js +31 -0
  175. package/.medusa/server/src/workflows/hooks/dismiss-deleted-promotion-cart-links.js +23 -0
  176. package/README.md +1777 -8
  177. package/dist/admin-components/features/plugin-features/components/ImageSettingInput.d.ts +15 -0
  178. package/dist/admin-components/features/plugin-features/components/ImageSettingInput.js +42 -0
  179. package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.js +4 -2
  180. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +1 -1
  181. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.d.ts +4 -4
  182. package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +1 -1
  183. package/dist/admin-components/features/plugin-features/lib/image-upload.d.ts +6 -0
  184. package/dist/admin-components/features/plugin-features/lib/image-upload.js +17 -0
  185. package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +4 -4
  186. package/dist/admin-components/i18n/texts.d.ts +6 -0
  187. package/dist/admin-components/i18n/texts.js +6 -0
  188. package/dist/documents/config/index.d.ts +11 -0
  189. package/dist/documents/config/index.js +17 -0
  190. package/dist/documents/templates/financial-document.d.ts +3 -0
  191. package/dist/documents/templates/financial-document.js +159 -0
  192. package/dist/documents/templates/format.d.ts +30 -0
  193. package/dist/documents/templates/format.js +72 -0
  194. package/dist/documents/templates/html-factory.d.ts +15 -0
  195. package/dist/documents/templates/html-factory.js +41 -0
  196. package/dist/documents/templates/html-utils.d.ts +8 -0
  197. package/dist/documents/templates/html-utils.js +22 -0
  198. package/dist/documents/templates/layout.d.ts +35 -0
  199. package/dist/documents/templates/layout.js +141 -0
  200. package/dist/documents/templates/packing-list.d.ts +3 -0
  201. package/dist/documents/templates/packing-list.js +51 -0
  202. package/dist/documents/types/admin-api.d.ts +1 -0
  203. package/dist/documents/types/admin-api.js +2 -0
  204. package/dist/documents/types/document-summary.d.ts +1 -0
  205. package/dist/documents/types/document-summary.js +2 -0
  206. package/dist/documents/types/documents.d.ts +191 -0
  207. package/dist/documents/types/documents.js +2 -0
  208. package/dist/documents/types/html-factory.d.ts +8 -0
  209. package/dist/documents/types/html-factory.js +5 -0
  210. package/dist/documents/types/index.d.ts +5 -0
  211. package/dist/documents/types/index.js +21 -0
  212. package/dist/documents/types/store-api.d.ts +1 -0
  213. package/dist/documents/types/store-api.js +2 -0
  214. package/dist/email/config/index.d.ts +17 -0
  215. package/dist/email/config/index.js +83 -0
  216. package/dist/email/config/notification-module.d.ts +22 -0
  217. package/dist/email/config/notification-module.js +19 -0
  218. package/dist/email/types/email-kinds.d.ts +15 -0
  219. package/dist/email/types/email-kinds.js +17 -0
  220. package/dist/email/types/index.d.ts +4 -0
  221. package/dist/email/types/index.js +20 -0
  222. package/dist/email/types/shop-configuration.d.ts +68 -0
  223. package/dist/email/types/shop-configuration.js +2 -0
  224. package/dist/email/types/smtp-configuration.d.ts +9 -0
  225. package/dist/email/types/smtp-configuration.js +2 -0
  226. package/dist/email/types/template-data.d.ts +609 -0
  227. package/dist/email/types/template-data.js +231 -0
  228. package/dist/files/config/index.d.ts +32 -0
  229. package/dist/files/config/index.js +255 -0
  230. package/dist/files/gateway/index.d.ts +30 -0
  231. package/dist/files/gateway/index.js +114 -0
  232. package/dist/files/types/index.d.ts +2 -0
  233. package/dist/files/types/index.js +5 -0
  234. package/dist/files/types/public.d.ts +90 -0
  235. package/dist/files/types/public.js +5 -0
  236. package/dist/modules/documents/domain/merchant.d.ts +22 -0
  237. package/dist/modules/documents/domain/merchant.js +85 -0
  238. package/dist/modules/documents/domain/options.d.ts +34 -0
  239. package/dist/modules/documents/domain/options.js +39 -0
  240. package/dist/public/config.d.ts +59 -0
  241. package/dist/public/config.js +185 -0
  242. package/dist/public/descriptor.js +2 -0
  243. package/dist/public/gateway.d.ts +2 -0
  244. package/dist/public/gateway.js +18 -0
  245. package/dist/public/instrumentation.d.ts +12 -0
  246. package/dist/public/instrumentation.js +55 -0
  247. package/dist/public/shop-config.d.ts +8 -0
  248. package/dist/public/shop-config.js +11 -0
  249. package/dist/public/shop-master-data.d.ts +1 -1
  250. package/dist/public/shop-master-data.js +1 -1
  251. package/dist/public/shop-types.d.ts +7 -0
  252. package/dist/public/shop-types.js +23 -0
  253. package/dist/public/types.d.ts +19 -2
  254. package/dist/shop-config/build-food-shop-config.d.ts +44 -0
  255. package/dist/shop-config/build-food-shop-config.js +251 -0
  256. package/dist/shop-config/options.d.ts +48 -0
  257. package/dist/shop-config/options.js +74 -0
  258. package/package.json +48 -5
@@ -0,0 +1,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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuY2VsbGF0aW9uLXNuYXBzaG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvZG9jdW1lbnRzL2RvbWFpbi9jYW5jZWxsYXRpb24tc25hcHNob3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQWtEO0FBTWxELHFFQUFvRTtBQUNwRSxtREFBNkU7QUFFN0UsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQWEsRUFBRSxLQUFhLEVBQUUsRUFBRTtJQUN4RCxNQUFNLE1BQU0sR0FBRyxjQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLHNDQUFzQyxDQUFDLENBQUE7SUFDakUsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyxDQUFBO0FBRUQsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEtBSzdCLEVBQWlCLEVBQUU7SUFDbEIsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFBO0lBQzdFLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFBLHdDQUF3QixFQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUNuRSxNQUFNLE1BQU0sR0FBRyxjQUFNLENBQUMsSUFBSSxDQUN4QixjQUFNLENBQUMsR0FBRyxDQUFDLGNBQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQ2xFLEtBQUssQ0FBQyxhQUFhLENBQ3BCO1NBQ0UsT0FBTyxFQUFFO1NBQ1QsYUFBYSxDQUFDLGFBQWEsQ0FBQztTQUM1QixPQUFPLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFekIsT0FBTztRQUNMLE1BQU07UUFDTixhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7S0FDbkMsQ0FBQTtBQUNILENBQUMsQ0FBQTtBQUVEOzs7O0dBSUc7QUFDSSxNQUFNLDBCQUEwQixHQUFHLENBQUMsS0FNMUMsRUFBb0IsRUFBRTtJQUNyQixNQUFNLGFBQWEsR0FBRyxJQUFBLGtEQUF5QixFQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUNyRSxJQUNFLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLFNBQVM7UUFDekMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFDOUIsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQTtJQUNoRixDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQTtJQUM1RCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUE7SUFDdEQsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQ2xDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFDakMsNEJBQTRCLENBQzdCLENBQUE7SUFDRCxNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLG1CQUFtQixDQUFDLENBQUE7SUFDL0UsSUFBSSxjQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQTtJQUNoRixDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFvQixFQUFFLEVBQUUsQ0FDckMsb0JBQW9CLENBQUM7UUFDbkIsS0FBSztRQUNMLFlBQVksRUFBRSxXQUFXO1FBQ3pCLGFBQWEsRUFBRSxZQUFZO1FBQzNCLGFBQWEsRUFBRSxZQUFZO0tBQzVCLENBQUMsQ0FBQTtJQUVKLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3JELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3RELE1BQU0sWUFBWSxHQUFHLElBQUEsaUNBQWlCLEVBQ3BDLGFBQWEsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqRCxHQUFHLEtBQUs7UUFDUixTQUFTLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7S0FDbEMsQ0FBQyxDQUFDLEVBQ0gsUUFBUSxDQUNULENBQUE7SUFDRCxNQUFNLEtBQUssR0FBRztRQUNaLE1BQU0sRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUEsd0NBQXdCLEVBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUUsYUFBYSxFQUFFLFlBQVk7S0FDNUIsQ0FBQTtJQUVELE9BQU87UUFDTCxRQUFRLEVBQUU7WUFDUixFQUFFLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDckIsSUFBSSxFQUFFLGNBQWM7WUFDcEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxlQUFlO1lBQzdCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRTtZQUN4QyxzQkFBc0IsRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU07U0FDdEQ7UUFDRCxLQUFLLEVBQUUsRUFBRSxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUU7UUFDakMsS0FBSyxFQUFFO1lBQ0w7Z0JBQ0UsRUFBRSxFQUFFLFVBQVUsS0FBSyxDQUFDLFdBQVcsRUFBRTtnQkFDakMsS0FBSyxFQUFFLDhCQUE4QixhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtnQkFDcEUsR0FBRyxFQUFFLElBQUk7Z0JBQ1QsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsVUFBVSxFQUFFLEVBQUUsR0FBRyxRQUFRLEVBQUU7Z0JBQzNCLFFBQVE7Z0JBQ1IsU0FBUyxFQUFFLFFBQVE7Z0JBQ25CLEtBQUs7Z0JBQ0wsaUJBQWlCLEVBQUUsRUFBRTthQUN0QjtTQUNGO1FBQ0QsTUFBTSxFQUFFO1lBQ04sUUFBUTtZQUNSLFNBQVMsRUFBRSxRQUFRO1lBQ25CLGFBQWEsRUFBRSxZQUFZO1lBQzNCLGNBQWMsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7WUFDMUQsY0FBYyxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQztZQUMxRCxLQUFLO1NBQ047S0FDRixDQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBbEZZLFFBQUEsMEJBQTBCLDhCQWtGdEMifQ==
@@ -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
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toDocumentMerchant = exports.merchantOptionToFallback = exports.MERCHANT_VAT_PLACEHOLDER = exports.DOCUMENT_MERCHANT_REQUIRED_FIELDS = void 0;
4
+ /** Without these a financial document or packing list has no legal sender. */
5
+ exports.DOCUMENT_MERCHANT_REQUIRED_FIELDS = [
6
+ "legal_name",
7
+ "address_line1",
8
+ "postal_code",
9
+ "city",
10
+ "country_code",
11
+ ];
12
+ /** Development placeholder UID: never printed on a document. */
13
+ exports.MERCHANT_VAT_PLACEHOLDER = "ATU00000000";
14
+ const text = (value) => {
15
+ if (typeof value !== "string") {
16
+ return null;
17
+ }
18
+ const trimmed = value.trim();
19
+ return trimmed ? trimmed : null;
20
+ };
21
+ const vatNumber = (value) => {
22
+ const normalized = text(value);
23
+ return normalized &&
24
+ normalized.replace(/\s+/g, "").toUpperCase() === exports.MERCHANT_VAT_PLACEHOLDER
25
+ ? null
26
+ : normalized;
27
+ };
28
+ /**
29
+ * The plugin's `merchant` option as a per-field fallback for the shop master
30
+ * data. Empty values are left out so they never shadow a declared default.
31
+ */
32
+ const merchantOptionToFallback = (option) => {
33
+ if (!option) {
34
+ return {};
35
+ }
36
+ const address = option.registeredAddress;
37
+ const entries = [
38
+ ["legal_name", option.legalName],
39
+ ["address_line1", address?.address1],
40
+ ["address_line2", address?.address2],
41
+ ["postal_code", address?.postalCode],
42
+ ["city", address?.city],
43
+ [
44
+ "country_code",
45
+ text(address?.countryCode ?? option.countryCode)?.toLowerCase(),
46
+ ],
47
+ ["vat_number", option.vatNumber],
48
+ ];
49
+ const fallback = {};
50
+ for (const [key, value] of entries) {
51
+ const normalized = text(value);
52
+ if (normalized) {
53
+ fallback[key] = normalized;
54
+ }
55
+ }
56
+ return fallback;
57
+ };
58
+ exports.merchantOptionToFallback = merchantOptionToFallback;
59
+ /** Maps resolved shop master data to the render input's `merchant`. */
60
+ const toDocumentMerchant = (values) => {
61
+ const missing = exports.DOCUMENT_MERCHANT_REQUIRED_FIELDS.filter((key) => !text(values[key]));
62
+ if (missing.length > 0) {
63
+ return { merchant: null, missing };
64
+ }
65
+ return {
66
+ merchant: {
67
+ legal_name: text(values.legal_name),
68
+ address_line1: text(values.address_line1),
69
+ address_line2: text(values.address_line2),
70
+ postal_code: text(values.postal_code),
71
+ city: text(values.city),
72
+ country_code: text(values.country_code).toLowerCase(),
73
+ vat_number: vatNumber(values.vat_number),
74
+ email: text(values.email),
75
+ phone: text(values.phone),
76
+ website: text(values.website),
77
+ iban: text(values.iban),
78
+ bic: text(values.bic),
79
+ company_register_number: text(values.company_register_number),
80
+ company_register_court: text(values.company_register_court),
81
+ },
82
+ missing: [],
83
+ };
84
+ };
85
+ exports.toDocumentMerchant = toDocumentMerchant;
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyY2hhbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9kb2N1bWVudHMvZG9tYWluL21lcmNoYW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVVBLDhFQUE4RTtBQUNqRSxRQUFBLGlDQUFpQyxHQUFHO0lBQy9DLFlBQVk7SUFDWixlQUFlO0lBQ2YsYUFBYTtJQUNiLE1BQU07SUFDTixjQUFjO0NBQ21DLENBQUE7QUFFbkQsZ0VBQWdFO0FBQ25ELFFBQUEsd0JBQXdCLEdBQUcsYUFBYSxDQUFBO0FBRXJELE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBYyxFQUFpQixFQUFFO0lBQzdDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzVCLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUNqQyxDQUFDLENBQUE7QUFFRCxNQUFNLFNBQVMsR0FBRyxDQUFDLEtBQWMsRUFBaUIsRUFBRTtJQUNsRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDOUIsT0FBTyxVQUFVO1FBQ2YsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssZ0NBQXdCO1FBQ3pFLENBQUMsQ0FBQyxJQUFJO1FBQ04sQ0FBQyxDQUFDLFVBQVUsQ0FBQTtBQUNoQixDQUFDLENBQUE7QUFFRDs7O0dBR0c7QUFDSSxNQUFNLHdCQUF3QixHQUFHLENBQ3RDLE1BQTBDLEVBQ2xCLEVBQUU7SUFDMUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDO0lBQ0QsTUFBTSxPQUFPLEdB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
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveDocumentPluginOptions = exports.DEFAULT_NUMBERING_TIME_ZONE = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const html_factory_1 = require("../../../documents/templates/html-factory");
6
+ const merchant_1 = require("./merchant");
7
+ /** Used when the `documents.numbering.timeZone` option is not given. */
8
+ exports.DEFAULT_NUMBERING_TIME_ZONE = "Europe/Vienna";
9
+ const resolveDocumentPluginOptions = (options) => {
10
+ const configuredTimeZone = options?.numbering?.timeZone;
11
+ const timeZone = configuredTimeZone === undefined
12
+ ? exports.DEFAULT_NUMBERING_TIME_ZONE
13
+ : configuredTimeZone.trim();
14
+ if (!timeZone) {
15
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "The documents plugin requires a numbering time zone.");
16
+ }
17
+ try {
18
+ new Intl.DateTimeFormat("en", { timeZone }).format();
19
+ }
20
+ catch {
21
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `The documents numbering time zone '${timeZone}' is invalid.`);
22
+ }
23
+ if (options?.htmlFactory !== undefined &&
24
+ typeof options.htmlFactory !== "function") {
25
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "The documents 'htmlFactory' option must be a function.");
26
+ }
27
+ if (options?.merchant !== undefined &&
28
+ (typeof options.merchant !== "object" || options.merchant === null)) {
29
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "The documents 'merchant' option must be an object.");
30
+ }
31
+ const executablePath = options?.pdf?.executablePath?.trim() || "google-chrome";
32
+ return {
33
+ htmlFactory: options?.htmlFactory ?? (0, html_factory_1.createDefaultDocumentHtmlFactory)({ timeZone }),
34
+ merchantFallback: (0, merchant_1.merchantOptionToFallback)(options?.merchant),
35
+ numbering: { timeZone },
36
+ pdf: { executablePath },
37
+ };
38
+ };
39
+ exports.resolveDocumentPluginOptions = resolveDocumentPluginOptions;
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2RvY3VtZW50cy9kb21haW4vb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBdUQ7QUFFdkQsNEVBQTRGO0FBTTVGLHlDQUFrRjtBQUVsRix3RUFBd0U7QUFDM0QsUUFBQSwyQkFBMkIsR0FBRyxlQUFlLENBQUE7QUFnQ25ELE1BQU0sNEJBQTRCLEdBQUcsQ0FDMUMsT0FBMEMsRUFDWCxFQUFFO0lBQ2pDLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUE7SUFDdkQsTUFBTSxRQUFRLEdBQ1osa0JBQWtCLEtBQUssU0FBUztRQUM5QixDQUFDLENBQUMsbUNBQTJCO1FBQzdCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUMvQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixzREFBc0QsQ0FDdkQsQ0FBQTtJQUNILENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUN0RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsc0NBQXNDLFFBQVEsZUFBZSxDQUM5RCxDQUFBO0lBQ0gsQ0FBQztJQUVELElBQ0UsT0FBTyxFQUFFLFdBQVcsS0FBSyxTQUFTO1FBQ2xDLE9BQU8sT0FBTyxDQUFDLFdBQVcsS0FBSyxVQUFVLEVBQ3pDLENBQUM7UUFDRCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix3REFBd0QsQ0FDekQsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUNFLE9BQU8sRUFBRSxRQUFRLEtBQUssU0FBUztRQUMvQixDQUFDLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsRUFDbkUsQ0FBQztRQUNELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG9EQUFvRCxDQUNyRCxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUFHLE9BQU8sRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxJQUFJLGVBQWUsQ0FBQTtJQUM5RSxPQUFPO1FBQ0wsV0FBVyxFQUNULE9BQU8sRUFBRSxXQUFXLElBQUksSUFBQSwrQ0FBZ0MsRUFBQyxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQ3hFLGdCQUFnQixFQUFFLElBQUEsbUNBQXdCLEVBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQztRQUM3RCxTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUU7UUFDdkIsR0FBRyxFQUFFLEVBQUUsY0FBYyxFQUFFO0tBQ3hCLENBQUE7QUFDSCxDQUFDLENBQUE7QUFuRFksUUFBQSw0QkFBNEIsZ0NBbUR4QyJ9
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isPackingListFulfillmentEligible = exports.formatPackingListNumber = exports.createPackingListLines = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const requireString = (value, field) => {
6
+ if (!value.trim()) {
7
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Packing-list field '${field}' is empty.`);
8
+ }
9
+ return value;
10
+ };
11
+ const requireQuantity = (value, field) => {
12
+ if (!Number.isInteger(value) || value <= 0) {
13
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Packing-list field '${field}' must be a positive integer.`);
14
+ }
15
+ return value;
16
+ };
17
+ const requireIsoDate = (value, field) => {
18
+ const date = new Date(requireString(value, field));
19
+ if (Number.isNaN(date.getTime())) {
20
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Packing-list field '${field}' must be a valid date.`);
21
+ }
22
+ return date.toISOString();
23
+ };
24
+ const groupKey = (lineItemId, inventoryItemId) => `${lineItemId}\u0000${inventoryItemId ?? ""}`;
25
+ /**
26
+ * Fulfillment items already contain concrete inventory quantities, including
27
+ * variant inventory multipliers. Grouping on the same identity used by Batch
28
+ * Management keeps kits and partial fulfillments independent.
29
+ */
30
+ const createPackingListLines = (input) => {
31
+ const linesByKey = new Map();
32
+ for (const item of input.fulfillment_items) {
33
+ const lineItemId = requireString(item.line_item_id, "line_item_id");
34
+ const inventoryItemId = item.inventory_item_id
35
+ ? requireString(item.inventory_item_id, "inventory_item_id")
36
+ : null;
37
+ const key = groupKey(lineItemId, inventoryItemId);
38
+ const existing = linesByKey.get(key);
39
+ if (existing) {
40
+ if (existing.title !== item.title || existing.sku !== item.sku) {
41
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Fulfillment item group ${lineItemId} has inconsistent item details.`);
42
+ }
43
+ existing.quantity += requireQuantity(item.quantity, "quantity");
44
+ continue;
45
+ }
46
+ linesByKey.set(key, {
47
+ line_item_id: lineItemId,
48
+ inventory_item_id: inventoryItemId,
49
+ title: requireString(item.title, "title"),
50
+ sku: item.sku?.trim() || null,
51
+ quantity: requireQuantity(item.quantity, "quantity"),
52
+ batch_allocations: [],
53
+ });
54
+ }
55
+ for (const allocation of input.batch_allocations) {
56
+ const key = groupKey(requireString(allocation.line_item_id, "batch.line_item_id"), requireString(allocation.inventory_item_id, "batch.inventory_item_id"));
57
+ const line = linesByKey.get(key);
58
+ if (!line) {
59
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "A batch allocation does not belong to a fulfillment item.");
60
+ }
61
+ line.batch_allocations.push({
62
+ batch_id: requireString(allocation.batch_id, "batch.batch_id"),
63
+ lot_number: requireString(allocation.lot_number, "batch.lot_number"),
64
+ expiry_date: requireIsoDate(allocation.expiry_date, "batch.expiry_date"),
65
+ quantity: requireQuantity(allocation.quantity, "batch.quantity"),
66
+ });
67
+ }
68
+ const lines = [...linesByKey.values()];
69
+ for (const line of lines) {
70
+ line.batch_allocations.sort((left, right) => left.lot_number.localeCompare(right.lot_number) ||
71
+ left.batch_id.localeCompare(right.batch_id));
72
+ if (!input.batch_management_enabled || !line.inventory_item_id) {
73
+ continue;
74
+ }
75
+ const allocated = line.batch_allocations.reduce((sum, allocation) => sum + allocation.quantity, 0);
76
+ if (allocated !== line.quantity) {
77
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Batch allocations for fulfillment item ${line.line_item_id}/${line.inventory_item_id} total ${allocated}, expected ${line.quantity}.`);
78
+ }
79
+ }
80
+ return lines.sort((left, right) => left.title.localeCompare(right.title) ||
81
+ left.line_item_id.localeCompare(right.line_item_id) ||
82
+ (left.inventory_item_id ?? "").localeCompare(right.inventory_item_id ?? ""));
83
+ };
84
+ exports.createPackingListLines = createPackingListLines;
85
+ const formatPackingListNumber = (input) => `PL-${input.order_display_id ?? input.order_id}-${input.fulfillment_id}`;
86
+ exports.formatPackingListNumber = formatPackingListNumber;
87
+ const isPackingListFulfillmentEligible = (input) => input.requires_shipping !== false &&
88
+ (input.canceled_at === null || input.canceled_at === undefined);
89
+ exports.isPackingListFulfillmentEligible = isPackingListFulfillmentEligible;
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2luZy1saXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvZG9jdW1lbnRzL2RvbWFpbi9wYWNraW5nLWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQXVEO0FBb0J2RCxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQWEsRUFBRSxLQUFhLEVBQVUsRUFBRTtJQUM3RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDbEIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyx1QkFBdUIsS0FBSyxhQUFhLENBQzFDLENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDLENBQUE7QUFFRCxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWEsRUFBRSxLQUFhLEVBQVUsRUFBRTtJQUMvRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDM0MsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyx1QkFBdUIsS0FBSywrQkFBK0IsQ0FDNUQsQ0FBQTtJQUNILENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUMsQ0FBQTtBQUVELE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBYSxFQUFFLEtBQWEsRUFBVSxFQUFFO0lBQzlELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNsRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFL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
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeDocumentSnapshot = void 0;
4
+ /** Adds fields introduced after older document snapshots were persisted. */
5
+ const normalizeDocumentSnapshot = (snapshot) => ({
6
+ ...snapshot,
7
+ order: {
8
+ ...snapshot.order,
9
+ tax_compliance: snapshot.order.tax_compliance ?? null,
10
+ },
11
+ totals: {
12
+ ...snapshot.totals,
13
+ tax_breakdown: snapshot.totals.tax_breakdown ?? [],
14
+ },
15
+ });
16
+ exports.normalizeDocumentSnapshot = normalizeDocumentSnapshot;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3Qtbm9ybWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2RvY3VtZW50cy9kb21haW4vc25hcHNob3Qtbm9ybWFsaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSw0RUFBNEU7QUFDckUsTUFBTSx5QkFBeUIsR0FBRyxDQUN2QyxRQUEwQixFQUNSLEVBQUUsQ0FBQyxDQUFDO0lBQ3RCLEdBQUcsUUFBUTtJQUNYLEtBQUssRUFBRTtRQUNMLEdBQUcsUUFBUSxDQUFDLEtBQUs7UUFDakIsY0FBYyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsY0FBYyxJQUFJLElBQUk7S0FDdEQ7SUFDRCxNQUFNLEVBQUU7UUFDTixHQUFHLFFBQVEsQ0FBQyxNQUFNO1FBQ2xCLGFBQWEsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsSUFBSSxFQUFFO0tBQ25EO0NBQ0YsQ0FBQyxDQUFBO0FBWlcsUUFBQSx5QkFBeUIsNkJBWXBDIn0=
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.roundTaxBreakdown = exports.groupTaxLines = exports.getCurrencyDecimalPlaces = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const DEFAULT_CURRENCY_DECIMAL_PLACES = 2;
6
+ const getCurrencyDecimalPlaces = (currencyCode) => utils_1.defaultCurrencies[currencyCode.toUpperCase()]?.decimal_digits ??
7
+ DEFAULT_CURRENCY_DECIMAL_PLACES;
8
+ exports.getCurrencyDecimalPlaces = getCurrencyDecimalPlaces;
9
+ /**
10
+ * Sums item and shipping tax lines per configured tax rate. Lines with the
11
+ * same name and percentage form one entry; first occurrence defines order.
12
+ */
13
+ const groupTaxLines = (lines, currencyCode) => {
14
+ const groups = new Map();
15
+ for (const line of lines) {
16
+ const key = JSON.stringify([line.name, line.code, line.rate]);
17
+ const group = groups.get(key);
18
+ groups.set(key, {
19
+ name: line.name,
20
+ code: line.code,
21
+ rate: line.rate,
22
+ tax_total: {
23
+ amount: utils_1.MathBN.add(group?.tax_total.amount ?? 0, line.amount).toFixed(),
24
+ currency_code: currencyCode,
25
+ },
26
+ });
27
+ }
28
+ return [...groups.values()];
29
+ };
30
+ exports.groupTaxLines = groupTaxLines;
31
+ /**
32
+ * Rounds every entry to the currency's minor unit and assigns the rounding
33
+ * residue to the largest entry, so the printed rows add up exactly to the
34
+ * printed tax total. A residue larger than the accumulated rounding error
35
+ * means the entries do not describe the total and is rejected.
36
+ */
37
+ const roundTaxBreakdown = (entries, taxTotal) => {
38
+ if (entries.length === 0) {
39
+ return [];
40
+ }
41
+ const currencyCode = taxTotal.currency_code;
42
+ const decimalPlaces = (0, exports.getCurrencyDecimalPlaces)(currencyCode);
43
+ const target = utils_1.MathBN.convert(taxTotal.amount).decimalPlaces(decimalPlaces);
44
+ const rounded = entries.map((entry) => {
45
+ if (entry.tax_total.currency_code !== currencyCode) {
46
+ throw new Error("The tax breakdown contains mixed currencies.");
47
+ }
48
+ return utils_1.MathBN.convert(entry.tax_total.amount).decimalPlaces(decimalPlaces);
49
+ });
50
+ const residue = utils_1.MathBN.sub(target, utils_1.MathBN.sum(...rounded));
51
+ const minorUnit = utils_1.MathBN.convert(10).pow(-decimalPlaces);
52
+ if (utils_1.MathBN.gt(residue.abs(), utils_1.MathBN.mult(minorUnit, entries.length))) {
53
+ throw new Error("The tax breakdown does not match the tax total.");
54
+ }
55
+ const largestIndex = rounded.reduce((largest, amount, index) => utils_1.MathBN.gt(amount.abs(), rounded[largest].abs()) ? index : largest, 0);
56
+ rounded[largestIndex] = utils_1.MathBN.add(rounded[largestIndex], residue);
57
+ return entries.map((entry, index) => ({
58
+ ...entry,
59
+ tax_total: {
60
+ amount: rounded[index].toFixed(decimalPlaces),
61
+ currency_code: currencyCode,
62
+ },
63
+ }));
64
+ };
65
+ exports.roundTaxBreakdown = roundTaxBreakdown;
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGF4LWJyZWFrZG93bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2RvY3VtZW50cy9kb21haW4vdGF4LWJyZWFrZG93bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBcUU7QUFPckUsTUFBTSwrQkFBK0IsR0FBRyxDQUFDLENBQUE7QUFFbEMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLFlBQW9CLEVBQVUsRUFBRSxDQUN2RSx5QkFBaUIsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxjQUFjO0lBQzdELCtCQUErQixDQUFBO0FBRnBCLFFBQUEsd0JBQXdCLDRCQUVKO0FBU2pDOzs7R0FHRztBQUNJLE1BQU0sYUFBYSxHQUFHLENBQzNCLEtBQXNCLEVBQ3RCLFlBQW9CLEVBQ1MsRUFBRTtJQUMvQixNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBcUMsQ0FBQTtJQUMzRCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDN0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLFNBQVMsRUFBRTtnQkFDVCxNQUFNLEVBQUUsY0FBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FB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
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DOCUMENTS_MODULE = void 0;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const assert_private_file_storage_1 = __importDefault(require("./loaders/assert-private-file-storage"));
9
+ const service_1 = __importDefault(require("./service"));
10
+ exports.DOCUMENTS_MODULE = "documents";
11
+ exports.default = (0, utils_1.Module)(exports.DOCUMENTS_MODULE, {
12
+ service: service_1.default,
13
+ loaders: [assert_private_file_storage_1.default],
14
+ });
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9kb2N1bWVudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQWtEO0FBRWxELHdHQUE0RTtBQUM1RSx3REFBOEM7QUFFakMsUUFBQSxnQkFBZ0IsR0FBRyxXQUFXLENBQUE7QUFFM0Msa0JBQWUsSUFBQSxjQUFNLEVBQUMsd0JBQWdCLEVBQUU7SUFDdEMsT0FBTyxFQUFFLGlCQUFzQjtJQUMvQixPQUFPLEVBQUUsQ0FBQyxxQ0FBd0IsQ0FBQztDQUNwQyxDQUFDLENBQUEifQ==
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = warnAboutPublicFileStorage;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const private_file_storage_1 = require("../../../documents/utils/private-file-storage");
6
+ /**
7
+ * Warns at startup when issued documents would be publicly downloadable. It
8
+ * does not refuse to boot: the documents module ships with the base plugin,
9
+ * so a shop on Medusa's default file storage must still start. Issuance itself
10
+ * refuses to write a document in that case (`assertPrivateFileStorage`).
11
+ */
12
+ async function warnAboutPublicFileStorage({ container, }) {
13
+ const problem = (0, private_file_storage_1.findPubliclyServedPrivateFileStorage)(container.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE), process.cwd());
14
+ if (problem) {
15
+ container
16
+ .resolve(utils_1.ContainerRegistrationKeys.LOGGER)
17
+ .warn(`Documents cannot be issued: ${problem}`);
18
+ }
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0LXByaXZhdGUtZmlsZS1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvZG9jdW1lbnRzL2xvYWRlcnMvYXNzZXJ0LXByaXZhdGUtZmlsZS1zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBV0EsNkNBWUM7QUF0QkQscURBQXFFO0FBRXJFLHdGQUFvRztBQUVwRzs7Ozs7R0FLRztBQUNZLEtBQUssVUFBVSwwQkFBMEIsQ0FBQyxFQUN2RCxTQUFTLEdBQ0s7SUFDZCxNQUFNLE9BQU8sR0FBRyxJQUFBLDJEQUFvQyxFQUNsRCxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLGFBQWEsQ0FBQyxFQUMxRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQ2QsQ0FBQTtJQUNELElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixTQUFTO2FBQ04sT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQzthQUN6QyxJQUFJLENBQUMsK0JBQStCLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFDbkQsQ0FBQztBQUNILENBQUMifQ==