@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.
- package/.medusa/server/src/admin/index.js +1517 -87
- package/.medusa/server/src/admin/index.mjs +1518 -88
- package/.medusa/server/src/api/admin/email/messages/[id]/resends/route.js +24 -0
- package/.medusa/server/src/api/admin/email/messages/[id]/route.js +12 -0
- package/.medusa/server/src/api/admin/email/messages/route.js +12 -0
- package/.medusa/server/src/api/admin/email/terms-versions/[id]/download/route.js +16 -0
- package/.medusa/server/src/api/admin/email/terms-versions/route.js +47 -0
- package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/download/route.js +21 -0
- package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/regenerate/route.js +38 -0
- package/.medusa/server/src/api/admin/orders/[id]/documents/regenerate/route.js +32 -0
- package/.medusa/server/src/api/admin/orders/[id]/documents/route.js +36 -0
- package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/download/route.js +24 -0
- package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/retry/route.js +44 -0
- package/.medusa/server/src/api/admin/orders/[id]/packing-lists/route.js +82 -0
- package/.medusa/server/src/api/document-download-response.js +16 -0
- package/.medusa/server/src/api/document-response.js +23 -0
- package/.medusa/server/src/api/files/[asset]/route.js +24 -0
- package/.medusa/server/src/api/files/file-response.js +43 -0
- package/.medusa/server/src/api/files/gateway-options.js +31 -0
- package/.medusa/server/src/api/files/private/[token]/route.js +29 -0
- package/.medusa/server/src/api/files/upload/[token]/route.js +66 -0
- package/.medusa/server/src/api/middlewares.js +168 -1
- package/.medusa/server/src/api/packing-list-response.js +22 -0
- package/.medusa/server/src/api/route.js +27 -0
- package/.medusa/server/src/api/store/documents/[id]/download/route.js +21 -0
- package/.medusa/server/src/api/store/documents/[id]/route.js +15 -0
- package/.medusa/server/src/api/store/documents/route.js +11 -0
- package/.medusa/server/src/api/terms-download-response.js +12 -0
- package/.medusa/server/src/documents/config/index.js +18 -0
- package/.medusa/server/src/documents/paths/documents.js +6 -0
- package/.medusa/server/src/documents/paths/index.js +18 -0
- package/.medusa/server/src/documents/plugin-features.js +24 -0
- package/.medusa/server/src/documents/schemas/documents.js +18 -0
- package/.medusa/server/src/documents/schemas/index.js +18 -0
- package/.medusa/server/src/documents/scripts/verify-documents-file-storage.js +55 -0
- package/.medusa/server/src/documents/templates/financial-document.js +142 -0
- package/.medusa/server/src/documents/templates/format.js +31 -0
- package/.medusa/server/src/documents/templates/html-factory.js +40 -0
- package/.medusa/server/src/documents/templates/html-utils.js +13 -0
- package/.medusa/server/src/documents/templates/layout.js +97 -0
- package/.medusa/server/src/documents/templates/packing-list.js +50 -0
- package/.medusa/server/src/documents/types/admin-api.js +3 -0
- package/.medusa/server/src/documents/types/document-summary.js +3 -0
- package/.medusa/server/src/documents/types/documents.js +3 -0
- package/.medusa/server/src/documents/types/html-factory.js +6 -0
- package/.medusa/server/src/documents/types/index.js +22 -0
- package/.medusa/server/src/documents/types/store-api.js +3 -0
- package/.medusa/server/src/documents/utils/document-merchant.js +22 -0
- package/.medusa/server/src/documents/utils/html-to-pdf.js +61 -0
- package/.medusa/server/src/documents/utils/private-file-storage.js +64 -0
- package/.medusa/server/src/documents/utils/resolve-services.js +7 -0
- package/.medusa/server/src/email/application/handle-invite-event.js +312 -0
- package/.medusa/server/src/email/application/handle-password-reset-event.js +354 -0
- package/.medusa/server/src/email/config/index.js +84 -0
- package/.medusa/server/src/email/config/notification-module.js +20 -0
- package/.medusa/server/src/email/domain/business-keys.js +50 -0
- package/.medusa/server/src/email/domain/documents-fact-fingerprint.js +7 -0
- package/.medusa/server/src/email/domain/event-schemas.js +36 -0
- package/.medusa/server/src/email/domain/failure-classification.js +53 -0
- package/.medusa/server/src/email/plugin-features.js +31 -0
- package/.medusa/server/src/email/rendering/default-templates.js +91 -0
- package/.medusa/server/src/email/rendering/render-email.js +37 -0
- package/.medusa/server/src/email/rendering/resolve-shop-configuration.js +48 -0
- package/.medusa/server/src/email/types/email-kinds.js +18 -0
- package/.medusa/server/src/email/types/index.js +21 -0
- package/.medusa/server/src/email/types/shop-configuration.js +3 -0
- package/.medusa/server/src/email/types/smtp-configuration.js +3 -0
- package/.medusa/server/src/email/types/template-data.js +79 -0
- package/.medusa/server/src/files/config/index.js +256 -0
- package/.medusa/server/src/files/gateway/index.js +115 -0
- package/.medusa/server/src/files/types/index.js +6 -0
- package/.medusa/server/src/files/types/public.js +6 -0
- package/.medusa/server/src/jobs/document-fact-publication-reconciliation.js +18 -0
- package/.medusa/server/src/jobs/document-resolution-reconciliation.js +20 -0
- package/.medusa/server/src/jobs/packing-list-reconciliation.js +49 -0
- package/.medusa/server/src/jobs/reconcile-email-attempts.js +63 -0
- package/.medusa/server/src/jobs/reconcile-pending-email-messages.js +41 -0
- package/.medusa/server/src/jobs/retry-email-messages.js +27 -0
- package/.medusa/server/src/migration-scripts/dismiss-orphaned-cart-promotion-links.js +26 -0
- package/.medusa/server/src/modules/documents/domain/cancellation-snapshot.js +97 -0
- package/.medusa/server/src/modules/documents/domain/document-number.js +36 -0
- package/.medusa/server/src/modules/documents/domain/document-resolution.js +24 -0
- package/.medusa/server/src/modules/documents/domain/issuance-rules.js +37 -0
- package/.medusa/server/src/modules/documents/domain/merchant.js +86 -0
- package/.medusa/server/src/modules/documents/domain/options.js +40 -0
- package/.medusa/server/src/modules/documents/domain/packing-list.js +90 -0
- package/.medusa/server/src/modules/documents/domain/snapshot-normalization.js +17 -0
- package/.medusa/server/src/modules/documents/domain/tax-breakdown.js +66 -0
- package/.medusa/server/src/modules/documents/index.js +15 -0
- package/.medusa/server/src/modules/documents/loaders/assert-private-file-storage.js +20 -0
- package/.medusa/server/src/modules/documents/migrations/Migration20260827061749.js +75 -0
- package/.medusa/server/src/modules/documents/migrations/Migration20260830111207.js +28 -0
- package/.medusa/server/src/modules/documents/models/document-artifact.js +25 -0
- package/.medusa/server/src/modules/documents/models/document-number-sequence.js +29 -0
- package/.medusa/server/src/modules/documents/models/document.js +82 -0
- package/.medusa/server/src/modules/documents/models/order-cancellation-resolution.js +51 -0
- package/.medusa/server/src/modules/documents/models/packing-list-revision.js +36 -0
- package/.medusa/server/src/modules/documents/models/packing-list.js +27 -0
- package/.medusa/server/src/modules/documents/models/refund-document-resolution.js +66 -0
- package/.medusa/server/src/modules/documents/models/shipment-invoice-assignment.js +51 -0
- package/.medusa/server/src/modules/documents/models/shipment-invoice-coordinator.js +44 -0
- package/.medusa/server/src/modules/documents/service.js +1701 -0
- package/.medusa/server/src/modules/email/domain/attachment.js +25 -0
- package/.medusa/server/src/modules/email/domain/message-state.js +69 -0
- package/.medusa/server/src/modules/email/index.js +13 -0
- package/.medusa/server/src/modules/email/migrations/Migration20260826173422.js +32 -0
- package/.medusa/server/src/modules/email/migrations/Migration20260827172945.js +16 -0
- package/.medusa/server/src/modules/email/migrations/Migration20260827194804.js +22 -0
- package/.medusa/server/src/modules/email/migrations/Migration20260906195205.js +16 -0
- package/.medusa/server/src/modules/email/models/email-attempt.js +56 -0
- package/.medusa/server/src/modules/email/models/email-message.js +71 -0
- package/.medusa/server/src/modules/email/models/email-terms-version.js +37 -0
- package/.medusa/server/src/modules/email/service.js +1285 -0
- package/.medusa/server/src/providers/s3-cache/cache/atomic-write.js +25 -0
- package/.medusa/server/src/providers/s3-cache/cache/cache-manager.js +115 -0
- package/.medusa/server/src/providers/s3-cache/cache/keyed-lock.js +28 -0
- package/.medusa/server/src/providers/s3-cache/index.js +8 -0
- package/.medusa/server/src/providers/s3-cache/object-key.js +53 -0
- package/.medusa/server/src/providers/s3-cache/s3-cache-file.js +229 -0
- package/.medusa/server/src/providers/s3-cache/s3-object-store.js +86 -0
- package/.medusa/server/src/providers/smtp/index.js +8 -0
- package/.medusa/server/src/providers/smtp/service.js +236 -0
- package/.medusa/server/src/providers/smtp/types.js +11 -0
- package/.medusa/server/src/public/config.js +186 -0
- package/.medusa/server/src/public/gateway.js +19 -0
- package/.medusa/server/src/public/instrumentation.js +56 -0
- package/.medusa/server/src/public/shop-config.js +12 -0
- package/.medusa/server/src/public/shop-types.js +24 -0
- package/.medusa/server/src/shop-config/build-food-shop-config.js +248 -0
- package/.medusa/server/src/shop-config/options.js +71 -0
- package/.medusa/server/src/subscribers/affiliate-consignment-reminder-due.js +26 -0
- package/.medusa/server/src/subscribers/documents-order-canceled.js +24 -0
- package/.medusa/server/src/subscribers/documents-order-cancellation-ready.js +26 -0
- package/.medusa/server/src/subscribers/documents-refund-ready.js +24 -0
- package/.medusa/server/src/subscribers/documents-shipment-created.js +36 -0
- package/.medusa/server/src/subscribers/documents-shipment-invoice-assignment-decided.js +26 -0
- package/.medusa/server/src/subscribers/email-order-canceled.js +28 -0
- package/.medusa/server/src/subscribers/email-shipment-created.js +32 -0
- package/.medusa/server/src/subscribers/order-placed.js +27 -0
- package/.medusa/server/src/subscribers/packing-list-allocation-revised.js +32 -0
- package/.medusa/server/src/subscribers/packing-list-fulfillment-canceled.js +54 -0
- package/.medusa/server/src/subscribers/packing-list-fulfillment-created.js +31 -0
- package/.medusa/server/src/subscribers/password-reset.js +23 -0
- package/.medusa/server/src/subscribers/payment-refunded.js +38 -0
- package/.medusa/server/src/subscribers/return-received.js +27 -0
- package/.medusa/server/src/subscribers/return-requested.js +27 -0
- package/.medusa/server/src/subscribers/user-invite.js +23 -0
- package/.medusa/server/src/utils/cart-promotion-links.js +101 -0
- package/.medusa/server/src/workflows/documents/issue-cancellation-after-refund.js +246 -0
- package/.medusa/server/src/workflows/documents/issue-document.js +163 -0
- package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +521 -0
- package/.medusa/server/src/workflows/documents/issue-packing-list.js +384 -0
- package/.medusa/server/src/workflows/documents/publish-document-facts.js +53 -0
- package/.medusa/server/src/workflows/documents/reconcile-document-resolutions.js +48 -0
- package/.medusa/server/src/workflows/documents/reconcile-order-cancellation.js +92 -0
- package/.medusa/server/src/workflows/documents/regenerate-issued-document.js +61 -0
- package/.medusa/server/src/workflows/email/dispatch-email-message.js +299 -0
- package/.medusa/server/src/workflows/email/documents-required-facts.js +30 -0
- package/.medusa/server/src/workflows/email/prepare-affiliate-reminder-email.js +58 -0
- package/.medusa/server/src/workflows/email/prepare-order-canceled-email.js +64 -0
- package/.medusa/server/src/workflows/email/prepare-order-received-email.js +56 -0
- package/.medusa/server/src/workflows/email/prepare-refund-email.js +47 -0
- package/.medusa/server/src/workflows/email/prepare-return-email.js +75 -0
- package/.medusa/server/src/workflows/email/prepare-shipment-email.js +82 -0
- package/.medusa/server/src/workflows/email/retry-email-messages.js +31 -0
- package/.medusa/server/src/workflows/hooks/dismiss-deleted-promotion-cart-links.js +23 -0
- package/README.md +1619 -7
- package/dist/documents/config/index.d.ts +11 -0
- package/dist/documents/config/index.js +17 -0
- package/dist/documents/templates/financial-document.d.ts +3 -0
- package/dist/documents/templates/financial-document.js +141 -0
- package/dist/documents/templates/format.d.ts +16 -0
- package/dist/documents/templates/format.js +30 -0
- package/dist/documents/templates/html-factory.d.ts +11 -0
- package/dist/documents/templates/html-factory.js +39 -0
- package/dist/documents/templates/html-utils.d.ts +2 -0
- package/dist/documents/templates/html-utils.js +12 -0
- package/dist/documents/templates/layout.d.ts +17 -0
- package/dist/documents/templates/layout.js +96 -0
- package/dist/documents/templates/packing-list.d.ts +3 -0
- package/dist/documents/templates/packing-list.js +49 -0
- package/dist/documents/types/admin-api.d.ts +1 -0
- package/dist/documents/types/admin-api.js +2 -0
- package/dist/documents/types/document-summary.d.ts +1 -0
- package/dist/documents/types/document-summary.js +2 -0
- package/dist/documents/types/documents.d.ts +174 -0
- package/dist/documents/types/documents.js +2 -0
- package/dist/documents/types/html-factory.d.ts +7 -0
- package/dist/documents/types/html-factory.js +5 -0
- package/dist/documents/types/index.d.ts +5 -0
- package/dist/documents/types/index.js +21 -0
- package/dist/documents/types/store-api.d.ts +1 -0
- package/dist/documents/types/store-api.js +2 -0
- package/dist/email/config/index.d.ts +17 -0
- package/dist/email/config/index.js +83 -0
- package/dist/email/config/notification-module.d.ts +22 -0
- package/dist/email/config/notification-module.js +19 -0
- package/dist/email/types/email-kinds.d.ts +15 -0
- package/dist/email/types/email-kinds.js +17 -0
- package/dist/email/types/index.d.ts +4 -0
- package/dist/email/types/index.js +20 -0
- package/dist/email/types/shop-configuration.d.ts +43 -0
- package/dist/email/types/shop-configuration.js +2 -0
- package/dist/email/types/smtp-configuration.d.ts +9 -0
- package/dist/email/types/smtp-configuration.js +2 -0
- package/dist/email/types/template-data.d.ts +100 -0
- package/dist/email/types/template-data.js +78 -0
- package/dist/files/config/index.d.ts +32 -0
- package/dist/files/config/index.js +255 -0
- package/dist/files/gateway/index.d.ts +30 -0
- package/dist/files/gateway/index.js +114 -0
- package/dist/files/types/index.d.ts +2 -0
- package/dist/files/types/index.js +5 -0
- package/dist/files/types/public.d.ts +90 -0
- package/dist/files/types/public.js +5 -0
- package/dist/modules/documents/domain/merchant.d.ts +22 -0
- package/dist/modules/documents/domain/merchant.js +85 -0
- package/dist/modules/documents/domain/options.d.ts +34 -0
- package/dist/modules/documents/domain/options.js +39 -0
- package/dist/public/config.d.ts +59 -0
- package/dist/public/config.js +185 -0
- package/dist/public/gateway.d.ts +2 -0
- package/dist/public/gateway.js +18 -0
- package/dist/public/instrumentation.d.ts +12 -0
- package/dist/public/instrumentation.js +55 -0
- package/dist/public/shop-config.d.ts +8 -0
- package/dist/public/shop-config.js +11 -0
- package/dist/public/shop-types.d.ts +7 -0
- package/dist/public/shop-types.js +23 -0
- package/dist/public/types.d.ts +17 -1
- package/dist/shop-config/build-food-shop-config.d.ts +44 -0
- package/dist/shop-config/build-food-shop-config.js +247 -0
- package/dist/shop-config/options.d.ts +41 -0
- package/dist/shop-config/options.js +70 -0
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNzdWUtZG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2RvY3VtZW50cy9pc3N1ZS1kb2N1bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFJa0M7QUFDbEMscUVBRzBDO0FBTzFDLCtFQUFpRjtBQUNqRixxRkFBcUY7QUFDckYsbUVBQW1FO0FBQ25FLDZFQUFnRjtBQUNoRiw0RkFBOEY7QUF1QzlGOzs7OztHQUtHO0FBQ1UsUUFBQSwwQkFBMEIsR0FBRyxJQUFBLDBCQUFVLEVBSWxELDJCQUEyQixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQzVELElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25CLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBQSwwQ0FBdUIsRUFBQyxTQUFTLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQzNFLE1BQU0sSUFBQSwyQ0FBdUIsRUFBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFDcEUsQ0FBQztJQUNELE9BQU8sSUFBSSw0QkFBWSxDQUFPLElBQUksQ0FBQyxDQUFBO0FBQ3JDLENBQUMsQ0FBQyxDQUFBO0FBRVcsUUFBQSxxQkFBcUIsR0FBRyxJQUFBLDBCQUFVLEVBSzdDLHNCQUFzQixFQUN0QixLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEUsT0FBTyxJQUFJLDRCQUFZLENBQTBCLElBQUksQ0FBQyxDQUFBO0lBQ3hELENBQUM7SUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFB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
|