@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,521 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.issueInvoiceAfterShipmentWorkflow = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
7
+ const issuance_rules_1 = require("../../modules/documents/domain/issuance-rules");
8
+ const tax_breakdown_1 = require("../../modules/documents/domain/tax-breakdown");
9
+ const document_resolution_1 = require("../../modules/documents/domain/document-resolution");
10
+ const document_resolution_2 = require("../../modules/documents/domain/document-resolution");
11
+ const resolve_services_1 = require("../../documents/utils/resolve-services");
12
+ const issue_document_1 = require("./issue-document");
13
+ const publish_document_facts_1 = require("./publish-document-facts");
14
+ const asRecord = (value, field) => {
15
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
16
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Expected '${field}' to be an object.`);
17
+ }
18
+ return value;
19
+ };
20
+ const asOptionalRecord = (value) => value && typeof value === "object" && !Array.isArray(value)
21
+ ? value
22
+ : null;
23
+ const asRequiredString = (value, field) => {
24
+ if (typeof value !== "string" || !value.trim()) {
25
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Expected '${field}' to be a non-empty string.`);
26
+ }
27
+ return value;
28
+ };
29
+ const asOptionalString = (value) => typeof value === "string" ? value : null;
30
+ const asOptionalNumber = (value) => typeof value === "number" && Number.isFinite(value) ? value : null;
31
+ const asRequiredDate = (value, field) => {
32
+ const date = value instanceof Date ? value : new Date(String(value ?? ""));
33
+ if (Number.isNaN(date.getTime())) {
34
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Expected '${field}' to be a valid date.`);
35
+ }
36
+ return date;
37
+ };
38
+ const asQuantity = (value, field) => {
39
+ if (typeof value === "number" && Number.isFinite(value)) {
40
+ return value;
41
+ }
42
+ if (typeof value === "string" && value.trim() && Number.isFinite(Number(value))) {
43
+ return Number(value);
44
+ }
45
+ const record = asOptionalRecord(value);
46
+ const nestedValue = record?.value;
47
+ if ((typeof nestedValue === "number" || typeof nestedValue === "string") &&
48
+ Number.isFinite(Number(nestedValue))) {
49
+ return Number(nestedValue);
50
+ }
51
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Expected '${field}' to be a numeric quantity.`);
52
+ };
53
+ const asAmount = (value) => {
54
+ if (typeof value === "string" && value.trim()) {
55
+ return value;
56
+ }
57
+ if (typeof value === "number" && Number.isFinite(value)) {
58
+ return String(value);
59
+ }
60
+ const record = asOptionalRecord(value);
61
+ const nestedValue = record?.value;
62
+ if (typeof nestedValue === "string" && nestedValue.trim()) {
63
+ return nestedValue;
64
+ }
65
+ if (typeof nestedValue === "number" && Number.isFinite(nestedValue)) {
66
+ return String(nestedValue);
67
+ }
68
+ return "0";
69
+ };
70
+ const toMoney = (value, currencyCode) => ({
71
+ amount: asAmount(value),
72
+ currency_code: currencyCode,
73
+ });
74
+ const asTaxRate = (value, field) => {
75
+ const rate = Number(asAmount(value));
76
+ if (!Number.isFinite(rate)) {
77
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Expected '${field}' to be a numeric tax rate.`);
78
+ }
79
+ return rate;
80
+ };
81
+ /** Reads the calculated tax lines of order items and shipping methods. */
82
+ const toTaxLineAmounts = (owners, field) => {
83
+ if (!Array.isArray(owners)) {
84
+ return [];
85
+ }
86
+ return owners.flatMap((owner) => {
87
+ const taxLines = asRecord(owner, `order.${field}[]`).tax_lines;
88
+ if (!Array.isArray(taxLines)) {
89
+ return [];
90
+ }
91
+ return taxLines.map((value) => {
92
+ const taxLine = asRecord(value, `order.${field}[].tax_lines[]`);
93
+ const code = asOptionalString(taxLine.code);
94
+ return {
95
+ name: asOptionalString(taxLine.description)?.trim() ||
96
+ code?.trim() ||
97
+ "Umsatzsteuer",
98
+ code,
99
+ rate: asTaxRate(taxLine.rate, `order.${field}[].tax_lines[].rate`),
100
+ amount: asAmount(taxLine.total),
101
+ };
102
+ });
103
+ });
104
+ };
105
+ const toAddress = (value) => {
106
+ const address = asOptionalRecord(value);
107
+ if (!address) {
108
+ return null;
109
+ }
110
+ return {
111
+ first_name: asOptionalString(address.first_name),
112
+ last_name: asOptionalString(address.last_name),
113
+ company: asOptionalString(address.company),
114
+ address_1: asOptionalString(address.address_1),
115
+ address_2: asOptionalString(address.address_2),
116
+ postal_code: asOptionalString(address.postal_code),
117
+ city: asOptionalString(address.city),
118
+ country_code: asOptionalString(address.country_code),
119
+ };
120
+ };
121
+ const isBatchSnapshotCapability = (value) => !!value &&
122
+ typeof value === "object" &&
123
+ typeof value
124
+ .getOrderDocumentBatchSnapshot === "function";
125
+ const tryResolveOptional = (container, key) => {
126
+ try {
127
+ return container.resolve(key);
128
+ }
129
+ catch {
130
+ return null;
131
+ }
132
+ };
133
+ const resolveBatchAllocations = async (container, orderId) => {
134
+ const resolved = tryResolveOptional(container, "batch_management");
135
+ if (!resolved) {
136
+ return [];
137
+ }
138
+ if (!isBatchSnapshotCapability(resolved)) {
139
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "The installed batch-management plugin does not provide getOrderDocumentBatchSnapshot(orderId). Upgrade it before issuing documents.");
140
+ }
141
+ const snapshot = await resolved.getOrderDocumentBatchSnapshot(orderId);
142
+ if (snapshot.status !== "ready") {
143
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Batch allocations for order ${orderId} are not ready yet. The shipment event can be retried safely.`);
144
+ }
145
+ return snapshot.allocations;
146
+ };
147
+ const resolveOrderTaxCompliance = async (container, orderId) => {
148
+ if (!container.hasRegistration("tax_compliance")) {
149
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Documents benötigt das registrierte Plugin @hartl-services/medusa-tax-compliance (Modul tax_compliance) für Rechnungen.");
150
+ }
151
+ const service = container.resolve("tax_compliance");
152
+ const validationId = await service.getOrderValidationId(orderId);
153
+ if (!validationId) {
154
+ return null;
155
+ }
156
+ const evidence = await service.retrieveTaxComplianceValidation(validationId);
157
+ if (evidence.status !== "eligible") {
158
+ return null;
159
+ }
160
+ return {
161
+ customer_company_name: asRequiredString(evidence.company_name, "tax_compliance.company_name"),
162
+ customer_vat_number: asRequiredString(evidence.customer_vat_number, "tax_compliance.customer_vat_number"),
163
+ exemption_wording: "steuerfreie_innergemeinschaftliche_lieferung",
164
+ };
165
+ };
166
+ const findOrderIdForFulfillment = async (container, fulfillmentId) => {
167
+ const links = container.resolve(utils_1.ContainerRegistrationKeys.LINK);
168
+ const orderFulfillmentLink = links.getLinkModule(utils_1.Modules.ORDER, "order_id", utils_1.Modules.FULFILLMENT, "fulfillment_id");
169
+ const records = await orderFulfillmentLink.list({ fulfillment_id: fulfillmentId }, { select: ["order_id"] });
170
+ if (records.length !== 1 || !records[0]?.order_id) {
171
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `No order link exists for shipped fulfillment ${fulfillmentId}.`);
172
+ }
173
+ return records[0].order_id;
174
+ };
175
+ const toInvoiceSource = (rawOrder, batchAllocations, taxCompliance) => {
176
+ const currencyCode = asRequiredString(rawOrder.currency_code, "order.currency_code");
177
+ const allocationsByLine = (0, issuance_rules_1.mapBatchAllocationsByLineItem)(batchAllocations);
178
+ const rawItems = rawOrder.items;
179
+ if (!Array.isArray(rawItems)) {
180
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Order items are unavailable while preparing the document.");
181
+ }
182
+ const lines = rawItems.map((rawItem) => {
183
+ const item = asRecord(rawItem, "order.items[]");
184
+ const lineId = asRequiredString(item.id, "order.items[].id");
185
+ const variant = asOptionalRecord(item.variant);
186
+ const batchAllocations = allocationsByLine[lineId] ?? [];
187
+ return {
188
+ id: lineId,
189
+ title: asRequiredString(item.title, "order.items[].title"),
190
+ sku: asOptionalString(variant?.sku) ?? asOptionalString(item.variant_sku),
191
+ quantity: asQuantity(item.quantity, "order.items[].quantity"),
192
+ unit_price: toMoney(item.unit_price, currencyCode),
193
+ subtotal: toMoney(item.subtotal, currencyCode),
194
+ tax_total: toMoney(item.tax_total, currencyCode),
195
+ total: toMoney(item.total, currencyCode),
196
+ batch_allocations: batchAllocations.map((allocation) => ({ ...allocation })),
197
+ };
198
+ });
199
+ const taxTotal = toMoney(rawOrder.tax_total, currencyCode);
200
+ const taxBreakdown = (0, tax_breakdown_1.roundTaxBreakdown)((0, tax_breakdown_1.groupTaxLines)([
201
+ ...toTaxLineAmounts(rawItems, "items"),
202
+ ...toTaxLineAmounts(rawOrder.shipping_methods, "shipping_methods"),
203
+ ], currencyCode), taxTotal);
204
+ return {
205
+ order: {
206
+ id: asRequiredString(rawOrder.id, "order.id"),
207
+ display_id: asOptionalNumber(rawOrder.display_id),
208
+ email: asRequiredString(rawOrder.email, "order.email"),
209
+ currency_code: currencyCode,
210
+ billing_address: toAddress(rawOrder.billing_address),
211
+ tax_compliance: taxCompliance,
212
+ },
213
+ lines,
214
+ totals: {
215
+ subtotal: toMoney(rawOrder.subtotal, currencyCode),
216
+ tax_total: taxTotal,
217
+ tax_breakdown: taxBreakdown,
218
+ shipping_total: toMoney(rawOrder.shipping_total, currencyCode),
219
+ discount_total: toMoney(rawOrder.discount_total, currencyCode),
220
+ total: toMoney(rawOrder.total, currencyCode),
221
+ },
222
+ };
223
+ };
224
+ const resolveInvoiceCandidateStep = (0, workflows_sdk_1.createStep)("documents-resolve-invoice-candidate-after-shipment", async (input, { container }) => {
225
+ const orderId = input.order_id
226
+ ? input.order_id
227
+ : input.fulfillment_id
228
+ ? await findOrderIdForFulfillment(container, input.fulfillment_id)
229
+ : null;
230
+ if (!orderId) {
231
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "An order_id or fulfillment_id is required to issue an invoice.");
232
+ }
233
+ if (input.fulfillment_id) {
234
+ await (0, resolve_services_1.resolveDocumentsService)(container).upsertShipmentInvoiceAssignment({
235
+ order_id: orderId,
236
+ fulfillment_id: input.fulfillment_id,
237
+ });
238
+ }
239
+ const { result: rawOrder } = await (0, core_flows_1.getOrderDetailWorkflow)(container).run({
240
+ input: {
241
+ order_id: orderId,
242
+ fields: [
243
+ "id",
244
+ "display_id",
245
+ "email",
246
+ "customer_id",
247
+ "currency_code",
248
+ "canceled_at",
249
+ "fulfillment_status",
250
+ "fulfillments.id",
251
+ "fulfillments.created_at",
252
+ "fulfillments.shipped_at",
253
+ "fulfillments.canceled_at",
254
+ "billing_address.first_name",
255
+ "billing_address.last_name",
256
+ "billing_address.company",
257
+ "billing_address.address_1",
258
+ "billing_address.address_2",
259
+ "billing_address.postal_code",
260
+ "billing_address.city",
261
+ "billing_address.country_code",
262
+ "items.*",
263
+ "items.variant.sku",
264
+ "items.tax_lines.*",
265
+ "shipping_methods.tax_lines.*",
266
+ "subtotal",
267
+ "tax_total",
268
+ "shipping_total",
269
+ "discount_total",
270
+ "total",
271
+ ],
272
+ },
273
+ });
274
+ if (!rawOrder) {
275
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Order ${orderId} was not found after shipment.`);
276
+ }
277
+ const order = asRecord(rawOrder, "order");
278
+ const canceledAt = typeof order.canceled_at === "string" || order.canceled_at instanceof Date
279
+ ? order.canceled_at
280
+ : null;
281
+ const fulfillmentStatus = asOptionalString(order.fulfillment_status);
282
+ if (!(0, issuance_rules_1.isInvoiceIssuableAfterShipment)({
283
+ canceled_at: canceledAt,
284
+ fulfillment_status: fulfillmentStatus,
285
+ })) {
286
+ if (input.order_id) {
287
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, canceledAt
288
+ ? `Invoice issuance is blocked because order ${orderId} is canceled.`
289
+ : `Invoice issuance requires a completely shipped or delivered order. Order ${orderId} currently has fulfillment status '${fulfillmentStatus ?? "unknown"}'.`);
290
+ }
291
+ return new workflows_sdk_1.StepResponse({
292
+ should_issue: false,
293
+ source: null,
294
+ customer_id: null,
295
+ regenerate_document_id: input.regenerate_document_id ?? null,
296
+ order_id: orderId,
297
+ fulfillment_id: input.fulfillment_id ?? null,
298
+ });
299
+ }
300
+ let fulfillmentId = input.fulfillment_id ?? null;
301
+ if (!fulfillmentId && !input.regenerate_document_id) {
302
+ const fulfillments = Array.isArray(order.fulfillments)
303
+ ? order.fulfillments
304
+ .map((value) => asOptionalRecord(value))
305
+ .filter((value) => Boolean(value) && Boolean(value?.shipped_at) && !value?.canceled_at)
306
+ .map((value) => ({
307
+ fulfillment_id: asRequiredString(value.id, "fulfillment.id"),
308
+ created_at: asRequiredDate(value.created_at, "fulfillment.created_at"),
309
+ }))
310
+ : [];
311
+ fulfillmentId = (0, document_resolution_1.selectShipmentInvoiceCandidate)(fulfillments);
312
+ if (!fulfillmentId) {
313
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Order ${orderId} has no shipped fulfillment for invoice assignment.`);
314
+ }
315
+ await (0, resolve_services_1.resolveDocumentsService)(container).upsertShipmentInvoiceAssignment({
316
+ order_id: orderId,
317
+ fulfillment_id: fulfillmentId,
318
+ });
319
+ }
320
+ const batchAllocations = await resolveBatchAllocations(container, orderId);
321
+ const taxCompliance = await resolveOrderTaxCompliance(container, orderId);
322
+ return new workflows_sdk_1.StepResponse({
323
+ should_issue: true,
324
+ source: toInvoiceSource(order, batchAllocations, taxCompliance),
325
+ customer_id: asOptionalString(order.customer_id),
326
+ regenerate_document_id: input.regenerate_document_id ?? null,
327
+ order_id: orderId,
328
+ fulfillment_id: fulfillmentId,
329
+ });
330
+ });
331
+ const claimInvoiceStep = (0, workflows_sdk_1.createStep)("documents-claim-order-invoice", async (candidate, { container }) => {
332
+ if (!candidate.should_issue || !candidate.source) {
333
+ if (candidate.fulfillment_id) {
334
+ await (0, resolve_services_1.resolveDocumentsService)(container).claimShipmentInvoiceDecision({
335
+ order_id: candidate.order_id,
336
+ fulfillment_id: candidate.fulfillment_id,
337
+ order_complete: false,
338
+ });
339
+ }
340
+ return new workflows_sdk_1.StepResponse({
341
+ action: "not_eligible",
342
+ should_render: false,
343
+ document_id: null,
344
+ source: null,
345
+ kind: "invoice",
346
+ document_number: null,
347
+ document_issued_at: null,
348
+ source_document_number: null,
349
+ previous_file_id: null,
350
+ overwrite_issued: false,
351
+ attempt_token: null,
352
+ coordinator_token: null,
353
+ fulfillment_id: candidate.fulfillment_id,
354
+ }, null);
355
+ }
356
+ const rawOrder = candidate.source.order;
357
+ const orderId = rawOrder.id;
358
+ if (candidate.regenerate_document_id) {
359
+ const documents = (0, resolve_services_1.resolveDocumentsService)(container);
360
+ const document = await documents.getDocumentForOrder(candidate.regenerate_document_id, orderId);
361
+ if (!document?.document_number || !document.issued_at) {
362
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "An issued invoice is required before it can be regenerated.");
363
+ }
364
+ const regeneration = await documents.claimDocumentRegeneration(document.id);
365
+ if (regeneration.action === "in_progress" || !regeneration.attempt_token) {
366
+ return new workflows_sdk_1.StepResponse({
367
+ action: "in_progress",
368
+ should_render: false,
369
+ document_id: document.id,
370
+ source: null,
371
+ kind: "invoice",
372
+ document_number: document.document_number,
373
+ document_issued_at: document.issued_at.toISOString(),
374
+ source_document_number: null,
375
+ previous_file_id: document.file_id,
376
+ overwrite_issued: true,
377
+ attempt_token: null,
378
+ coordinator_token: null,
379
+ fulfillment_id: null,
380
+ }, null);
381
+ }
382
+ return new workflows_sdk_1.StepResponse({
383
+ action: "regenerate",
384
+ should_render: true,
385
+ document_id: document.id,
386
+ source: candidate.source,
387
+ kind: "invoice",
388
+ document_number: document.document_number,
389
+ document_issued_at: document.issued_at.toISOString(),
390
+ source_document_number: null,
391
+ previous_file_id: document.file_id,
392
+ overwrite_issued: true,
393
+ attempt_token: regeneration.attempt_token,
394
+ coordinator_token: null,
395
+ fulfillment_id: null,
396
+ }, null);
397
+ }
398
+ if (!candidate.fulfillment_id) {
399
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Order ${orderId} has no invoice assignment candidate.`);
400
+ }
401
+ const decision = await (0, resolve_services_1.resolveDocumentsService)(container).claimShipmentInvoiceDecision({
402
+ order_id: orderId,
403
+ fulfillment_id: candidate.fulfillment_id,
404
+ order_complete: true,
405
+ });
406
+ if (decision.action !== "render_invoice" || !decision.coordinator_token) {
407
+ return new workflows_sdk_1.StepResponse({
408
+ action: decision.action === "in_progress" ? "in_progress" : "issued",
409
+ should_render: false,
410
+ document_id: decision.assignment.invoice_document_id,
411
+ source: null,
412
+ kind: "invoice",
413
+ document_number: null,
414
+ document_issued_at: null,
415
+ source_document_number: null,
416
+ previous_file_id: null,
417
+ overwrite_issued: false,
418
+ attempt_token: null,
419
+ coordinator_token: null,
420
+ fulfillment_id: decision.assignment.fulfillment_id,
421
+ }, null);
422
+ }
423
+ const claimed = await (0, resolve_services_1.resolveDocumentsService)(container).startInvoiceIssuance({
424
+ order_id: orderId,
425
+ order_display_id: rawOrder.display_id,
426
+ customer_id: candidate.customer_id,
427
+ recipient_email: rawOrder.email,
428
+ });
429
+ return new workflows_sdk_1.StepResponse({
430
+ action: claimed.action,
431
+ should_render: claimed.action === "new",
432
+ document_id: claimed.document.id,
433
+ source: candidate.source,
434
+ kind: "invoice",
435
+ document_number: claimed.document.document_number,
436
+ document_issued_at: claimed.document.issued_at.toISOString(),
437
+ source_document_number: null,
438
+ previous_file_id: null,
439
+ overwrite_issued: false,
440
+ attempt_token: claimed.attempt_token,
441
+ coordinator_token: decision.coordinator_token,
442
+ fulfillment_id: decision.assignment.fulfillment_id,
443
+ }, claimed.action === "new" ? claimed.document.id : null);
444
+ });
445
+ const finalizeInvoiceStep = (0, workflows_sdk_1.createStep)("documents-finalize-invoice", async ({ claim, prepared }, { container }) => {
446
+ if (!prepared) {
447
+ return new workflows_sdk_1.StepResponse(null);
448
+ }
449
+ const documents = (0, resolve_services_1.resolveDocumentsService)(container);
450
+ try {
451
+ if (claim.overwrite_issued) {
452
+ if (!claim.attempt_token) {
453
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "The invoice regeneration lease is no longer active.");
454
+ }
455
+ const finalized = await documents.finalizeDocumentRegeneration({
456
+ id: prepared.document_id,
457
+ snapshot: prepared.snapshot,
458
+ file_id: prepared.file_id,
459
+ filename: prepared.filename,
460
+ overwrite_issued: true,
461
+ attempt_token: claim.attempt_token,
462
+ });
463
+ const replacedArtifact = finalized.replaced_artifact;
464
+ if (replacedArtifact &&
465
+ (0, document_resolution_2.canDeleteReplacedArtifact)(replacedArtifact) &&
466
+ replacedArtifact.file_id !== prepared.file_id) {
467
+ await (0, issue_document_1.deleteDocumentFileBestEffort)(container, replacedArtifact.file_id, prepared.document_id, replacedArtifact.id);
468
+ }
469
+ return new workflows_sdk_1.StepResponse(prepared.document_id);
470
+ }
471
+ if (!claim.fulfillment_id ||
472
+ !claim.coordinator_token ||
473
+ !claim.attempt_token) {
474
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "The invoice issuance leases are no longer active.");
475
+ }
476
+ await documents.finalizeShipmentInvoice({
477
+ order_id: prepared.snapshot.order.id,
478
+ fulfillment_id: claim.fulfillment_id,
479
+ coordinator_token: claim.coordinator_token,
480
+ document_id: prepared.document_id,
481
+ document_token: claim.attempt_token,
482
+ snapshot: prepared.snapshot,
483
+ file_id: prepared.file_id,
484
+ filename: prepared.filename,
485
+ });
486
+ return new workflows_sdk_1.StepResponse(prepared.document_id);
487
+ }
488
+ catch (error) {
489
+ await (0, issue_document_1.deleteDocumentFileBestEffort)(container, prepared.file_id, prepared.document_id);
490
+ if (claim.coordinator_token) {
491
+ await documents.releaseShipmentInvoiceDecision({
492
+ coordinator_token: claim.coordinator_token,
493
+ });
494
+ }
495
+ if (claim.attempt_token) {
496
+ await documents.markDocumentIssuanceFailed({
497
+ document_id: prepared.document_id,
498
+ attempt_token: claim.attempt_token,
499
+ reason: "The invoice could not be finalized.",
500
+ });
501
+ }
502
+ throw error;
503
+ }
504
+ });
505
+ exports.issueInvoiceAfterShipmentWorkflow = (0, workflows_sdk_1.createWorkflow)("documents-issue-invoice-after-shipment", (input) => {
506
+ const candidate = resolveInvoiceCandidateStep(input);
507
+ (0, issue_document_1.ensureDocumentMerchantStep)((0, workflows_sdk_1.transform)({ candidate }, ({ candidate }) => ({
508
+ required: candidate.should_issue && Boolean(candidate.source),
509
+ })));
510
+ const claim = claimInvoiceStep(candidate);
511
+ const rendered = (0, issue_document_1.renderDocumentPdfStep)(claim);
512
+ const issuedDocumentId = finalizeInvoiceStep({ claim, prepared: rendered });
513
+ const shouldPublish = (0, workflows_sdk_1.transform)({ claim }, ({ claim }) => !claim.overwrite_issued);
514
+ (0, publish_document_facts_1.publishDocumentFactsStep)({
515
+ limit: 20,
516
+ after: issuedDocumentId,
517
+ enabled: shouldPublish,
518
+ });
519
+ return new workflows_sdk_1.WorkflowResponse(issuedDocumentId);
520
+ });
521
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNzdWUtaW52b2ljZS1hZnRlci1zaGlwbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvZG9jdW1lbnRzL2lzc3VlLWludm9pY2UtYWZ0ZXItc2hpcG1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBSWtDO0FBQ2xDLHFFQU0wQztBQUMxQyw0REFBb0U7QUFTcEUsa0ZBSXNEO0FBQ3RELGdGQUlxRDtBQUNyRCw0RkFBbUc7QUFDbkcsNEZBQThGO0FBQzlGLDZFQUFnRjtBQUNoRixxREFPeUI7QUFDekIscUVBQW1FO0FBNERuRSxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQWMsRUFBRSxLQUFhLEVBQTJCLEVBQUU7SUFDMUUsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDbEMsYUFBYSxLQUFLLG9CQUFvQixDQUN2QyxDQUFBO0lBQ0gsQ0FBQztJQUVELE9BQU8sS0FBZ0MsQ0FBQTtBQUN6QyxDQUFDLENBQUE7QUFFRCxNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBYyxFQUFrQyxFQUFFLENBQzFFLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUN6RCxDQUFDLENBQUUsS0FBaUM7SUFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUVWLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxLQUFjLEVBQUUsS0FBYSxFQUFVLEVBQUU7SUFDakUsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUMvQyxNQUFNLElBQUksbUJB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