@hartl-services/medusa-base 0.4.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/admin/index.js +1657 -111
- package/.medusa/server/src/admin/index.mjs +1647 -101
- 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 +38 -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 +160 -0
- package/.medusa/server/src/documents/templates/format.js +73 -0
- package/.medusa/server/src/documents/templates/html-factory.js +42 -0
- package/.medusa/server/src/documents/templates/html-utils.js +23 -0
- package/.medusa/server/src/documents/templates/layout.js +142 -0
- package/.medusa/server/src/documents/templates/packing-list.js +52 -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/document-render-settings.js +59 -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 +318 -0
- package/.medusa/server/src/email/application/handle-password-reset-event.js +366 -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/domain/order-summary.js +103 -0
- package/.medusa/server/src/email/domain/refund-summary.js +43 -0
- package/.medusa/server/src/email/domain/return-summary.js +118 -0
- package/.medusa/server/src/email/domain/shipment-summary.js +74 -0
- package/.medusa/server/src/email/plugin-features.js +39 -0
- package/.medusa/server/src/email/rendering/default-templates.js +719 -0
- package/.medusa/server/src/email/rendering/load-email-shop-details.js +36 -0
- package/.medusa/server/src/email/rendering/render-email.js +50 -0
- package/.medusa/server/src/email/rendering/resolve-shop-configuration.js +67 -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 +232 -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/modules/plugin-features/domain/plugin-settings.js +4 -3
- 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/descriptor.js +3 -1
- 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-master-data.js +2 -2
- package/.medusa/server/src/public/shop-types.js +24 -0
- package/.medusa/server/src/shop-config/build-food-shop-config.js +252 -0
- package/.medusa/server/src/shop-config/options.js +75 -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 +165 -0
- package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +521 -0
- package/.medusa/server/src/workflows/documents/issue-packing-list.js +390 -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 +301 -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 +102 -0
- package/.medusa/server/src/workflows/email/prepare-order-received-email.js +82 -0
- package/.medusa/server/src/workflows/email/prepare-refund-email.js +71 -0
- package/.medusa/server/src/workflows/email/prepare-return-email.js +136 -0
- package/.medusa/server/src/workflows/email/prepare-shipment-email.js +115 -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 +1777 -8
- package/dist/admin-components/features/plugin-features/components/ImageSettingInput.d.ts +15 -0
- package/dist/admin-components/features/plugin-features/components/ImageSettingInput.js +42 -0
- package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.js +4 -2
- package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +1 -1
- package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.d.ts +4 -4
- package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +1 -1
- package/dist/admin-components/features/plugin-features/lib/image-upload.d.ts +6 -0
- package/dist/admin-components/features/plugin-features/lib/image-upload.js +17 -0
- package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +4 -4
- package/dist/admin-components/i18n/texts.d.ts +6 -0
- package/dist/admin-components/i18n/texts.js +6 -0
- 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 +159 -0
- package/dist/documents/templates/format.d.ts +30 -0
- package/dist/documents/templates/format.js +72 -0
- package/dist/documents/templates/html-factory.d.ts +15 -0
- package/dist/documents/templates/html-factory.js +41 -0
- package/dist/documents/templates/html-utils.d.ts +8 -0
- package/dist/documents/templates/html-utils.js +22 -0
- package/dist/documents/templates/layout.d.ts +35 -0
- package/dist/documents/templates/layout.js +141 -0
- package/dist/documents/templates/packing-list.d.ts +3 -0
- package/dist/documents/templates/packing-list.js +51 -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 +191 -0
- package/dist/documents/types/documents.js +2 -0
- package/dist/documents/types/html-factory.d.ts +8 -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 +68 -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 +609 -0
- package/dist/email/types/template-data.js +231 -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/descriptor.js +2 -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-master-data.d.ts +1 -1
- package/dist/public/shop-master-data.js +1 -1
- package/dist/public/shop-types.d.ts +7 -0
- package/dist/public/shop-types.js +23 -0
- package/dist/public/types.d.ts +19 -2
- package/dist/shop-config/build-food-shop-config.d.ts +44 -0
- package/dist/shop-config/build-food-shop-config.js +251 -0
- package/dist/shop-config/options.d.ts +48 -0
- package/dist/shop-config/options.js +74 -0
- 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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
|