@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,246 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.issueCancellationAfterRefundWorkflow = exports.listRefundIdsForPayment = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
+ const cancellation_snapshot_1 = require("../../modules/documents/domain/cancellation-snapshot");
7
+ const document_merchant_1 = require("../../documents/utils/document-merchant");
8
+ const resolve_services_1 = require("../../documents/utils/resolve-services");
9
+ const issue_document_1 = require("./issue-document");
10
+ const publish_document_facts_1 = require("./publish-document-facts");
11
+ const toAmountString = (value, field) => {
12
+ if (typeof value === "string" && value.trim()) {
13
+ return value;
14
+ }
15
+ if (typeof value === "number" && Number.isFinite(value)) {
16
+ return String(value);
17
+ }
18
+ if (value &&
19
+ typeof value === "object" &&
20
+ "value" in value &&
21
+ (typeof value.value === "string" || typeof value.value === "number")) {
22
+ return toAmountString(value.value, field);
23
+ }
24
+ if (value && typeof value === "object" && "toString" in value) {
25
+ const amount = String(value);
26
+ if (amount.trim() && amount !== "[object Object]") {
27
+ return amount;
28
+ }
29
+ }
30
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Payment refund field '${field}' is invalid.`);
31
+ };
32
+ const sourceFromSnapshot = (snapshot) => ({
33
+ order: snapshot.order,
34
+ lines: snapshot.lines,
35
+ totals: snapshot.totals,
36
+ });
37
+ const findOrderIdForPaymentCollection = async (container, paymentCollectionId) => {
38
+ const links = container.resolve(utils_1.ContainerRegistrationKeys.LINK);
39
+ const orderPaymentCollectionLink = links.getLinkModule(utils_1.Modules.ORDER, "order_id", utils_1.Modules.PAYMENT, "payment_collection_id");
40
+ const records = await orderPaymentCollectionLink.list({ payment_collection_id: paymentCollectionId }, { select: ["order_id"] });
41
+ if (records.length !== 1 || !records[0]?.order_id) {
42
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `No order link exists for payment collection ${paymentCollectionId}.`);
43
+ }
44
+ return records[0].order_id;
45
+ };
46
+ /** Returns every immutable refund ID currently persisted for one payment. */
47
+ const listRefundIdsForPayment = async (container, paymentId) => {
48
+ const payments = container.resolve(utils_1.Modules.PAYMENT);
49
+ const payment = await payments.retrievePayment(paymentId, {
50
+ relations: ["refunds"],
51
+ });
52
+ return (payment.refunds ?? []).map((refund) => refund.id);
53
+ };
54
+ exports.listRefundIdsForPayment = listRefundIdsForPayment;
55
+ const resolveRefundCandidateStep = (0, workflows_sdk_1.createStep)("documents-resolve-cancellation-after-refund", async (input, { container }) => {
56
+ const payments = container.resolve(utils_1.Modules.PAYMENT);
57
+ const payment = await payments.retrievePayment(input.payment_id, {
58
+ relations: ["refunds"],
59
+ });
60
+ const refund = payment.refunds?.find((entry) => entry.id === input.refund_id);
61
+ if (!refund) {
62
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Refund ${input.refund_id} does not belong to payment ${input.payment_id}.`);
63
+ }
64
+ const orderId = await findOrderIdForPaymentCollection(container, payment.payment_collection_id);
65
+ const orders = container.resolve(utils_1.Modules.ORDER);
66
+ const order = await orders.retrieveOrder(orderId, {
67
+ select: ["id", "canceled_at"],
68
+ });
69
+ const sourceInvoice = await (0, resolve_services_1.resolveDocumentsService)(container).getIssuedInvoiceForOrder(orderId);
70
+ return new workflows_sdk_1.StepResponse({
71
+ order_id: orderId,
72
+ payment_id: input.payment_id,
73
+ refund_id: refund.id,
74
+ refund_amount: toAmountString(refund.raw_amount ?? refund.amount, "raw_amount"),
75
+ source_invoice_id: sourceInvoice?.id ?? null,
76
+ order_canceled: Boolean(order.canceled_at),
77
+ });
78
+ });
79
+ const claimCancellationStep = (0, workflows_sdk_1.createStep)("documents-claim-cancellation", async (candidate, { container }) => {
80
+ const documentsService = (0, resolve_services_1.resolveDocumentsService)(container);
81
+ const resolution = await documentsService.upsertRefundDocumentResolution({
82
+ refund_id: candidate.refund_id,
83
+ order_id: candidate.order_id,
84
+ payment_id: candidate.payment_id,
85
+ });
86
+ const resolutionClaim = await documentsService.claimRefundDocumentResolution(resolution.id);
87
+ if (resolutionClaim.action !== "process" ||
88
+ !resolutionClaim.attempt_token) {
89
+ return new workflows_sdk_1.StepResponse({
90
+ action: resolutionClaim.action === "final" ? "issued" : "in_progress",
91
+ should_render: false,
92
+ document_id: resolutionClaim.resolution.document_id,
93
+ source: null,
94
+ kind: "cancellation",
95
+ document_number: null,
96
+ document_issued_at: null,
97
+ source_document_number: null,
98
+ previous_file_id: null,
99
+ overwrite_issued: false,
100
+ attempt_token: null,
101
+ resolution_id: resolution.id,
102
+ resolution_token: null,
103
+ order_canceled: candidate.order_canceled,
104
+ }, null);
105
+ }
106
+ if (!candidate.source_invoice_id) {
107
+ await documentsService.finalizeRefundWithoutDocument({
108
+ resolution_id: resolution.id,
109
+ attempt_token: resolutionClaim.attempt_token,
110
+ order_canceled: candidate.order_canceled,
111
+ });
112
+ return new workflows_sdk_1.StepResponse({
113
+ action: "not_eligible",
114
+ should_render: false,
115
+ document_id: null,
116
+ source: null,
117
+ kind: "cancellation",
118
+ document_number: null,
119
+ document_issued_at: null,
120
+ source_document_number: null,
121
+ previous_file_id: null,
122
+ overwrite_issued: false,
123
+ attempt_token: null,
124
+ resolution_id: resolution.id,
125
+ resolution_token: null,
126
+ order_canceled: candidate.order_canceled,
127
+ }, null);
128
+ }
129
+ const sourceInvoice = await documentsService.retrieveDocumentRecord(candidate.source_invoice_id);
130
+ if (!sourceInvoice.snapshot || !sourceInvoice.document_number) {
131
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Invoice ${sourceInvoice.id} has no usable document snapshot.`);
132
+ }
133
+ // Validate the sender facts before a cancellation number is reserved. The
134
+ // resolution is marked failed, so the reconciliation job retries it once
135
+ // the shop master data is complete.
136
+ try {
137
+ const options = await documentsService.getPluginOptions();
138
+ await (0, document_merchant_1.resolveDocumentMerchant)(container, options.merchantFallback);
139
+ }
140
+ catch (error) {
141
+ await documentsService.markRefundResolutionFailed({
142
+ resolution_id: resolution.id,
143
+ attempt_token: resolutionClaim.attempt_token,
144
+ failure_code: "merchant_unavailable",
145
+ });
146
+ throw error;
147
+ }
148
+ const claimed = await documentsService.startCancellationIssuance({
149
+ refund_id: candidate.refund_id,
150
+ source_invoice: sourceInvoice,
151
+ });
152
+ if (claimed.action !== "new") {
153
+ return new workflows_sdk_1.StepResponse({
154
+ action: claimed.action,
155
+ should_render: false,
156
+ document_id: claimed.document.id,
157
+ source: null,
158
+ kind: "cancellation",
159
+ document_number: null,
160
+ document_issued_at: null,
161
+ source_document_number: sourceInvoice.document_number,
162
+ previous_file_id: null,
163
+ overwrite_issued: false,
164
+ attempt_token: null,
165
+ resolution_id: resolution.id,
166
+ resolution_token: resolutionClaim.attempt_token,
167
+ order_canceled: candidate.order_canceled,
168
+ }, null);
169
+ }
170
+ const issuedAt = claimed.document.issued_at;
171
+ const number = claimed.document.document_number;
172
+ const snapshot = (0, cancellation_snapshot_1.createCancellationSnapshot)({
173
+ source_invoice: sourceInvoice.snapshot,
174
+ document_id: claimed.document.id,
175
+ document_number: number,
176
+ issued_at: issuedAt,
177
+ refund_amount: candidate.refund_amount,
178
+ });
179
+ return new workflows_sdk_1.StepResponse({
180
+ action: "new",
181
+ should_render: true,
182
+ document_id: claimed.document.id,
183
+ source: sourceFromSnapshot(snapshot),
184
+ kind: "cancellation",
185
+ document_number: number,
186
+ document_issued_at: issuedAt.toISOString(),
187
+ source_document_number: sourceInvoice.document_number,
188
+ previous_file_id: null,
189
+ overwrite_issued: false,
190
+ attempt_token: claimed.attempt_token,
191
+ resolution_id: resolution.id,
192
+ resolution_token: resolutionClaim.attempt_token,
193
+ order_canceled: candidate.order_canceled,
194
+ }, claimed.document.id);
195
+ });
196
+ const finalizeCancellationStep = (0, workflows_sdk_1.createStep)("documents-finalize-refund-document", async ({ claim, prepared }, { container }) => {
197
+ if (!prepared) {
198
+ return new workflows_sdk_1.StepResponse(null);
199
+ }
200
+ if (!claim.resolution_id ||
201
+ !claim.resolution_token ||
202
+ !claim.attempt_token) {
203
+ await (0, issue_document_1.deleteDocumentFileBestEffort)(container, prepared.file_id, prepared.document_id);
204
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "The refund document leases are no longer active.");
205
+ }
206
+ const documents = (0, resolve_services_1.resolveDocumentsService)(container);
207
+ try {
208
+ await documents.finalizeRefundDocument({
209
+ resolution_id: claim.resolution_id,
210
+ resolution_token: claim.resolution_token,
211
+ document_id: prepared.document_id,
212
+ document_token: claim.attempt_token,
213
+ snapshot: prepared.snapshot,
214
+ file_id: prepared.file_id,
215
+ filename: prepared.filename,
216
+ order_canceled: claim.order_canceled,
217
+ });
218
+ return new workflows_sdk_1.StepResponse(prepared.document_id);
219
+ }
220
+ catch (error) {
221
+ await (0, issue_document_1.deleteDocumentFileBestEffort)(container, prepared.file_id, prepared.document_id);
222
+ await documents.markRefundResolutionFailed({
223
+ resolution_id: claim.resolution_id,
224
+ attempt_token: claim.resolution_token,
225
+ failure_code: "document_finalization_failed",
226
+ });
227
+ await documents.markDocumentIssuanceFailed({
228
+ document_id: prepared.document_id,
229
+ attempt_token: claim.attempt_token,
230
+ reason: "The refund document could not be finalized.",
231
+ });
232
+ throw error;
233
+ }
234
+ });
235
+ exports.issueCancellationAfterRefundWorkflow = (0, workflows_sdk_1.createWorkflow)("documents-issue-cancellation-after-refund", (input) => {
236
+ const candidate = resolveRefundCandidateStep(input);
237
+ const claim = claimCancellationStep(candidate);
238
+ const rendered = (0, issue_document_1.renderDocumentPdfStep)(claim);
239
+ const issuedDocumentId = finalizeCancellationStep({
240
+ claim,
241
+ prepared: rendered,
242
+ });
243
+ (0, publish_document_facts_1.publishDocumentFactsStep)({ limit: 20, after: issuedDocumentId });
244
+ return new workflows_sdk_1.WorkflowResponse(issuedDocumentId);
245
+ });
246
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNzdWUtY2FuY2VsbGF0aW9uLWFmdGVyLXJlZnVuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvZG9jdW1lbnRzL2lzc3VlLWNhbmNlbGxhdGlvbi1hZnRlci1yZWZ1bmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EscURBSWtDO0FBQ2xDLHFFQUswQztBQUUxQyxnR0FBaUc7QUFFakcsK0VBQWlGO0FBQ2pGLDZFQUFnRjtBQUNoRixxREFNeUI7QUFDekIscUVBQW1FO0FBa0NuRSxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWMsRUFBRSxLQUFhLEVBQVUsRUFBRTtJQUMvRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUM5QyxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdEIsQ0FBQztJQUNELElBQ0UsS0FBSztRQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsT0FBTyxJQUFJLEtBQUs7UUFDaEIsQ0FBQyxPQUFPLEtBQUssQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsRUFDcEUsQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDM0MsQ0FBQztJQUNELElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxVQUFVLElBQUksS0FBSyxFQUFFLENBQUM7UUFDOUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzVCLElBQUksTUFBTSxD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
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deleteDocumentFileBestEffort = exports.issuePreparedDocumentStep = exports.savePreparedDocumentStep = exports.renderDocumentPdfStep = exports.ensureDocumentMerchantStep = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
+ const document_merchant_1 = require("../../documents/utils/document-merchant");
7
+ const private_file_storage_1 = require("../../documents/utils/private-file-storage");
8
+ const html_to_pdf_1 = require("../../documents/utils/html-to-pdf");
9
+ const resolve_services_1 = require("../../documents/utils/resolve-services");
10
+ const document_resolution_1 = require("../../modules/documents/domain/document-resolution");
11
+ /**
12
+ * Validates the shop's sender facts before a claim reserves a document number
13
+ * and issue date, so a shop with incomplete master data does not burn
14
+ * numbers. Fails with the same "Shop-Stammdaten unvollständig" message as the
15
+ * render step; `required: false` (nothing will be rendered) skips the check.
16
+ */
17
+ exports.ensureDocumentMerchantStep = (0, workflows_sdk_1.createStep)("documents-ensure-merchant", async (input, { container }) => {
18
+ if (input.required) {
19
+ const options = await (0, resolve_services_1.resolveDocumentsService)(container).getPluginOptions();
20
+ await (0, document_merchant_1.resolveDocumentMerchant)(container, options.merchantFallback);
21
+ }
22
+ return new workflows_sdk_1.StepResponse(null);
23
+ });
24
+ exports.renderDocumentPdfStep = (0, workflows_sdk_1.createStep)("documents-render-pdf", async (claim, { container }) => {
25
+ if (!claim.should_render || !claim.document_id || !claim.source) {
26
+ return new workflows_sdk_1.StepResponse(null);
27
+ }
28
+ if (!claim.attempt_token) {
29
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, `Document ${claim.document_id} has no active issuance token.`);
30
+ }
31
+ const options = await (0, resolve_services_1.resolveDocumentsService)(container).getPluginOptions();
32
+ if (!claim.document_number || !claim.document_issued_at) {
33
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Document ${claim.document_id} has no reserved number and issue date.`);
34
+ }
35
+ const issuedAt = new Date(claim.document_issued_at);
36
+ if (Number.isNaN(issuedAt.getTime())) {
37
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Document ${claim.document_id} has an invalid issue date.`);
38
+ }
39
+ const number = claim.document_number;
40
+ const snapshot = {
41
+ ...claim.source,
42
+ document: {
43
+ id: claim.document_id,
44
+ kind: claim.kind,
45
+ number,
46
+ issued_at: issuedAt.toISOString(),
47
+ source_document_number: claim.source_document_number,
48
+ },
49
+ };
50
+ try {
51
+ const merchant = await (0, document_merchant_1.resolveDocumentMerchant)(container, options.merchantFallback);
52
+ const html = await options.htmlFactory({ ...snapshot, merchant });
53
+ if (typeof html !== "string" || !html.trim()) {
54
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "The documents htmlFactory must return non-empty HTML.");
55
+ }
56
+ const pdf = await (0, html_to_pdf_1.renderHtmlToPdf)({
57
+ html,
58
+ executablePath: options.pdf.executablePath,
59
+ });
60
+ const filename = `${number}.pdf`;
61
+ (0, private_file_storage_1.assertPrivateFileStorage)(container);
62
+ const files = container.resolve(utils_1.Modules.FILE);
63
+ const file = await files.createFiles({
64
+ filename,
65
+ mimeType: "application/pdf",
66
+ content: pdf.toString("base64"),
67
+ access: "private",
68
+ });
69
+ return new workflows_sdk_1.StepResponse({
70
+ document_id: claim.document_id,
71
+ snapshot,
72
+ file_id: file.id,
73
+ filename,
74
+ overwrite_issued: claim.overwrite_issued,
75
+ previous_file_id: claim.previous_file_id,
76
+ attempt_token: claim.attempt_token,
77
+ });
78
+ }
79
+ catch (error) {
80
+ try {
81
+ if (claim.attempt_token) {
82
+ await (0, resolve_services_1.resolveDocumentsService)(container).markDocumentIssuanceFailed({
83
+ document_id: claim.document_id,
84
+ attempt_token: claim.attempt_token,
85
+ reason: error instanceof Error ? error.message : String(error),
86
+ });
87
+ }
88
+ if (claim.resolution_id && claim.resolution_token) {
89
+ await (0, resolve_services_1.resolveDocumentsService)(container).markRefundResolutionFailed({
90
+ resolution_id: claim.resolution_id,
91
+ attempt_token: claim.resolution_token,
92
+ failure_code: "document_render_failed",
93
+ });
94
+ }
95
+ if (claim.coordinator_token) {
96
+ await (0, resolve_services_1.resolveDocumentsService)(container).releaseShipmentInvoiceDecision({
97
+ coordinator_token: claim.coordinator_token,
98
+ });
99
+ }
100
+ }
101
+ catch (persistenceError) {
102
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
103
+ logger.warn(`Document ${claim.document_id} failed, but its failure reason could not be persisted.`, persistenceError);
104
+ }
105
+ throw error;
106
+ }
107
+ });
108
+ exports.savePreparedDocumentStep = (0, workflows_sdk_1.createStep)("documents-save-prepared-document", async (prepared, { container }) => {
109
+ if (!prepared) {
110
+ return new workflows_sdk_1.StepResponse(null);
111
+ }
112
+ if (!prepared.overwrite_issued || !prepared.attempt_token) {
113
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Only a token-owned regeneration can use the generic document finalizer.");
114
+ }
115
+ let finalized;
116
+ try {
117
+ finalized = await (0, resolve_services_1.resolveDocumentsService)(container).finalizeDocumentRegeneration({
118
+ id: prepared.document_id,
119
+ snapshot: prepared.snapshot,
120
+ file_id: prepared.file_id,
121
+ filename: prepared.filename,
122
+ overwrite_issued: true,
123
+ attempt_token: prepared.attempt_token,
124
+ });
125
+ }
126
+ catch (error) {
127
+ await (0, exports.deleteDocumentFileBestEffort)(container, prepared.file_id, prepared.document_id);
128
+ throw error;
129
+ }
130
+ const replacedArtifact = finalized.replaced_artifact;
131
+ if (replacedArtifact &&
132
+ (0, document_resolution_1.canDeleteReplacedArtifact)(replacedArtifact) &&
133
+ replacedArtifact.file_id !== prepared.file_id) {
134
+ await (0, exports.deleteDocumentFileBestEffort)(container, replacedArtifact.file_id, prepared.document_id, replacedArtifact.id);
135
+ }
136
+ return new workflows_sdk_1.StepResponse(prepared);
137
+ });
138
+ exports.issuePreparedDocumentStep = (0, workflows_sdk_1.createStep)("documents-issue-prepared-document", async (prepared, { container }) => {
139
+ if (!prepared) {
140
+ return new workflows_sdk_1.StepResponse(null);
141
+ }
142
+ return new workflows_sdk_1.StepResponse(prepared.document_id);
143
+ });
144
+ const deleteDocumentFileBestEffort = async (container, fileId, documentId, replacedArtifactId) => {
145
+ try {
146
+ const documents = (0, resolve_services_1.resolveDocumentsService)(container);
147
+ const deletable = await documents.isDocumentFileDeletable({
148
+ file_id: fileId,
149
+ replaced_artifact_id: replacedArtifactId,
150
+ });
151
+ if (!deletable) {
152
+ return;
153
+ }
154
+ const files = container.resolve(utils_1.Modules.FILE);
155
+ await files.deleteFiles([fileId]);
156
+ }
157
+ catch {
158
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
159
+ logger.warn(`Document ${documentId} could not safely clean up private file ${fileId} after finalization.`);
160
+ }
161
+ };
162
+ exports.deleteDocumentFileBestEffort = deleteDocumentFileBestEffort;
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNzdWUtZG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2RvY3VtZW50cy9pc3N1ZS1kb2N1bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFJa0M7QUFDbEMscUVBRzBDO0FBTzFDLCtFQUFpRjtBQUNqRixxRkFBcUY7QUFDckYsbUVBQW1FO0FBQ25FLDZFQUFnRjtBQUNoRiw0RkFBOEY7QUF1QzlGOzs7OztHQUtHO0FBQ1UsUUFBQSwwQkFBMEIsR0FBRyxJQUFBLDBCQUFVLEVBSWxELDJCQUEyQixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQzVELElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25CLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBQSwwQ0FBdUIsRUFBQyxTQUFTLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQzNFLE1BQU0sSUFBQSwyQ0FBdUIsRUFBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFDcEUsQ0FBQztJQUNELE9BQU8sSUFBSSw0QkFBWSxDQUFPLElBQUksQ0FBQyxDQUFBO0FBQ3JDLENBQUMsQ0FBQyxDQUFBO0FBRVcsUUFBQSxxQkFBcUIsR0FBRyxJQUFBLDBCQUFVLEVBSzdDLHNCQUFzQixFQUN0QixLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEUsT0FBTyxJQUFJLDRCQUFZLENBQTBCLElBQUksQ0FBQyxDQUFBO0lBQ3hELENBQUM7SUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQzFCLFlBQVksS0FBSyxDQUFDLFdBQVcsZ0NBQWdDLENBQzlELENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFBLDBDQUF1QixFQUFDLFNBQVMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUE7SUFDM0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN4RCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQ2xDLFlBQVksS0FBSyxDQUFDLFdBQVcseUNBQXlDLENBQ3ZFLENBQUE7SUFDSCxDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUE7SUFDbkQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyxZQUFZLEtBQUssQ0FBQyxXQUFXLDZCQUE2QixDQUMzRCxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUE7SUFDcEMsTUFBTSxRQUFRLEdBQXFCO1FBQ2pDLEdBQUcsS0FBSyxDQUFDLE1BQU07UUFDZixRQUFRLEVBQUU7WUFDUixFQUFFLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDckIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQ2hCLE1BQU07WUFDTixTQUFTLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRTtZQUNqQyxzQkFBc0IsRUFBRSxLQUFLLENBQUMsc0JBQXNCO1NBQ3JEO0tBQ0YsQ0FBQTtJQUNELElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSwyQ0FBdUIsRUFDNUMsU0FBUyxFQUNULE9BQU8sQ0FBQyxnQkFBZ0IsQ0FDekIsQ0FBQTtRQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFDakUsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUM3QyxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix1REFBdUQsQ0FDeEQsQ0FBQTtRQUNILENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUEsNkJBQWUsRUFBQztZQUNoQyxJQUFJO1lBQ0osY0FBYyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYztTQUMzQyxDQUFDLENBQUE7UUFDRixNQUFNLFFBQVEsR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFBO1FBQ2hDLElBQUEsK0NBQXdCLEVBQUMsU0FBUyxDQUFDLENBQUE7UUFDbkMsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsSUFBSSxDQUF1QixDQUFBO1FBQ25FLE1BQU0sSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUNuQyxRQUFRO1lBQ1IsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDL0IsTUFBTSxFQUFFLFNBQVM7U0FDbEIsQ0FBQyxDQUFBO1FBRUYsT0FBTyxJQUFJLDRCQUFZLENBQW1CO1lBQ3hDLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixRQUFRO1lBQ1IsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ2hCLFFBQVE7WUFDUixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1lBQ3hDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7WUFDeEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1NBQ25DLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDO1lBQ0gsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sSUFBQSwwQ0FBdUIsRUFBQyxTQUFTLENBQUMsQ0FBQywwQkFBMEIsQ0FBQztvQkFDbEUsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO29CQUM5QixhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7b0JBQ2xDLE1BQU0sRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2lCQUMvRCxDQUFDLENBQUE7WUFDSixDQUFDO1lBQ0QsSUFBSSxLQUFLLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNsRCxNQUFNLElBQUEsMENBQXVCLEVBQUMsU0FBUyxDQUFDLENBQUMsMEJBQTBCLENBQUM7b0JBQ2xFLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtvQkFDbEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7b0JBQ3JDLFlBQVksRUFBRSx3QkFBd0I7aUJBQ3ZDLENBQUMsQ0FBQTtZQUNKLENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUM1QixNQUFNLElBQUEsMENBQXVCLEVBQUMsU0FBUyxDQUFDLENBQUMsOEJBQThCLENBQUM7b0JBQ3RFLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxpQkFBaUI7aUJBQzNDLENBQUMsQ0FBQTtZQUNKLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFCLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQzlCLGlDQUF5QixDQUFDLE1BQU0sQ0FDdkIsQ0FBQTtZQUNYLE1BQU0sQ0FBQyxJQUFJLENBQ1QsWUFBWSxLQUFLLENBQUMsV0FBVyx5REFBeUQsRUFDdEYsZ0JBQWdCLENBQ2pCLENBQUE7UUFDSCxDQUFDO1FBRUQsTUFBTSxLQUFLLENBQUE7SUFDYixDQUFDO0FBQ0gsQ0FBQyxDQUNGLENBQUE7QUFFWSxRQUFBLHdCQUF3QixHQUFHLElBQUEsMEJBQVUsRUFLaEQsa0NBQWtDLEVBQ2xDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ2hDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE9BQU8sSUFBSSw0QkFBWSxDQUEwQixJQUFJLENBQUMsQ0FBQTtJQUN4RCxDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMxRCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQ2xDLHlFQUF5RSxDQUMxRSxDQUFBO0lBQ0gsQ0FBQztJQUNELElBQUksU0FBUyxDQUFBO0lBQ2IsSUFBSSxDQUFDO1FBQ0gsU0FBUyxHQUFHLE1BQU0sSUFBQSwwQ0FBdUIsRUFBQyxTQUFTLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQztZQUNoRixFQUFFLEVBQUUsUUFBUSxDQUFDLFdBQVc7WUFDeEIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO1lBQzNCLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztZQUN6QixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7WUFDM0IsZ0JBQWdCLEVBQUUsSUFBSTtZQUN0QixhQUFhLEVBQUUsUUFBUSxDQUFDLGFBQWE7U0FDdEMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUEsb0NBQTRCLEVBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ3JGLE1BQU0sS0FBSyxDQUFBO0lBQ2IsQ0FBQztJQUNELE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFBO0lBQ3BELElBQ0UsZ0JBQWdCO1FBQ2hCLElBQUEsK0NBQXlCLEVBQUMsZ0JBQWdCLENBQUM7UUFDM0MsZ0JBQWdCLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQyxPQUFPLEVBQzdDLENBQUM7UUFDRCxNQUFNLElBQUEsb0NBQTRCLEVBQ2hDLFNBQVMsRUFDVCxnQkFBZ0IsQ0FBQyxPQUFPLEVBQ3hCLFFBQVEsQ0FBQyxXQUFXLEVBQ3BCLGdCQUFnQixDQUFDLEVBQUUsQ0FDcEIsQ0FBQTtJQUNILENBQUM7SUFDRCxPQUFPLElBQUksNEJBQVksQ0FBMEIsUUFBUSxDQUFDLENBQUE7QUFDNUQsQ0FBQyxDQUNGLENBQUE7QUFFWSxRQUFBLHlCQUF5QixHQUFHLElBQUEsMEJBQVUsRUFLakQsbUNBQW1DLEVBQ25DLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ2hDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE9BQU8sSUFBSSw0QkFBWSxDQUFnQixJQUFJLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBRUQsT0FBTyxJQUFJLDRCQUFZLENBQWdCLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQUM5RCxDQUFDLENBQ0YsQ0FBQTtBQUVNLE1BQU0sNEJBQTRCLEdBQUcsS0FBSyxFQUMvQyxTQUF3RCxFQUN4RCxNQUFjLEVBQ2QsVUFBa0IsRUFDbEIsa0JBQTJCLEVBQ1osRUFBRTtJQUNqQixJQUFJLENBQUM7UUFDSCxNQUFNLFNBQVMsR0FBRyxJQUFBLDBDQUF1QixFQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3BELE1BQU0sU0FBUyxHQUFHLE1BQU0sU0FBUyxDQUFDLHVCQUF1QixDQUFDO1lBQ3hELE9BQU8sRUFBRSxNQUFNO1lBQ2Ysb0JBQW9CLEVBQUUsa0JBQWtCO1NBQ3pDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU07UUFDUixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsSUFBSSxDQUF1QixDQUFBO1FBQ25FLE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDbkMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFXLENBQUE7UUFDNUUsTUFBTSxDQUFDLElBQUksQ0FDVCxZQUFZLFVBQVUsMkNBQTJDLE1BQU0sc0JBQXNCLENBQzlGLENBQUE7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxDQUFBO0FBdkJZLFFBQUEsNEJBQTRCLGdDQXVCeEMifQ==