@hartl-services/medusa-base 2.11.0 → 4.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/admin-components/features/plugin-features/components/PluginActionsSection.d.ts +1 -1
- package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginFeaturesCard.d.ts +1 -1
- package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginHubCard.d.ts +1 -1
- package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginSettingsForm.d.ts +1 -1
- package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginStatusChips.d.ts +1 -1
- package/.medusa/server/src/admin/admin-components/features/plugin-features/components/ShopMasterDataBanner.d.ts +1 -1
- package/.medusa/server/src/admin/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +1 -1
- package/.medusa/server/src/admin/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +1 -1
- package/.medusa/server/src/admin/admin-components/features/plugin-features/hooks/usePluginSwitch.d.ts +1 -1
- package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/action-runs.d.ts +1 -1
- package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +1 -1
- package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/plugin-features-admin-client.js +1 -1
- package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/plugin-view.d.ts +1 -1
- package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/settings-draft.d.ts +1 -1
- package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/settings-layout.d.ts +1 -1
- package/.medusa/server/src/admin/index.js +4 -4
- package/.medusa/server/src/admin/index.mjs +4 -4
- package/.medusa/server/src/api/admin/draft-orders/[id]/order-confirmation/route.js +2 -2
- package/.medusa/server/src/api/admin/email/attachments/[id]/mail-kinds/route.js +2 -2
- package/.medusa/server/src/api/admin/email/attachments/[id]/route.js +2 -2
- package/.medusa/server/src/api/admin/email/attachments/[id]/versions/route.js +2 -2
- package/.medusa/server/src/api/admin/email/attachments/route.js +2 -2
- package/.medusa/server/src/api/admin/email/messages/[id]/resends/route.js +2 -2
- package/.medusa/server/src/api/admin/email/messages/[id]/route.js +2 -2
- package/.medusa/server/src/api/admin/email/messages/route.js +2 -2
- package/.medusa/server/src/api/admin/email/templates/[kind]/preview/route.js +2 -2
- package/.medusa/server/src/api/admin/email/templates/[kind]/route.js +2 -2
- package/.medusa/server/src/api/admin/email/templates/[kind]/send-test/route.js +2 -2
- package/.medusa/server/src/api/admin/email/templates/[kind]/test-sources/route.js +2 -2
- package/.medusa/server/src/api/admin/email/templates/route.js +2 -2
- package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/actions/[action_key]/route.js +2 -2
- package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/actions/[action_key]/runs/route.js +2 -2
- package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/route.js +2 -2
- package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/settings/route.js +2 -2
- package/.medusa/server/src/api/admin/plugin-features/route.js +2 -2
- package/.medusa/server/src/api/admin/tax-compliance/customer-addresses/[address_id]/tax-identification/route.js +15 -0
- package/.medusa/server/src/api/admin-first-login-password-policy.js +2 -2
- package/.medusa/server/src/api/answer-code-provider-route-not-found.js +2 -2
- package/.medusa/server/src/api/check-customer-address-tax-identification.js +93 -0
- package/.medusa/server/src/api/code-account-password-routes.js +2 -2
- package/.medusa/server/src/api/customer-address-identification-response.js +14 -0
- package/.medusa/server/src/api/middlewares.js +61 -7
- package/.medusa/server/src/api/password-policy.js +2 -2
- package/.medusa/server/src/api/plugin-actions.js +2 -2
- package/.medusa/server/src/api/plugin-features-http.js +2 -2
- package/.medusa/server/src/api/require-login-code-customer-email.js +2 -2
- package/.medusa/server/src/api/store/carts/[id]/completion-check/route.js +2 -2
- package/.medusa/server/src/api/store/carts/[id]/tax-identification/route.js +179 -0
- package/.medusa/server/src/api/store/customer-auth/password-policy/route.js +2 -2
- package/.medusa/server/src/api/store/customers/me/addresses/[address_id]/tax-identification/route.js +12 -0
- package/.medusa/server/src/api/store/customers/me/tax-identifications/route.js +14 -0
- package/.medusa/server/src/api/store/plugin-features/[plugin_key]/route.js +2 -2
- package/.medusa/server/src/api/store/plugin-features/route.js +2 -2
- package/.medusa/server/src/api/store/tax-identification-policy/route.js +21 -0
- package/.medusa/server/src/api/tax-identification-message.js +9 -0
- package/.medusa/server/src/api/to-response-amount.js +19 -0
- package/.medusa/server/src/customer-auth/application/prepare-code-account-password-reset.js +2 -2
- package/.medusa/server/src/customer-auth/application/request-login-code.js +2 -2
- package/.medusa/server/src/customer-auth/customer-password-policy.js +2 -2
- package/.medusa/server/src/customer-auth/domain/auth-methods.js +2 -2
- package/.medusa/server/src/customer-auth/domain/login-code.js +2 -2
- package/.medusa/server/src/customer-auth/login-code-state.js +2 -2
- package/.medusa/server/src/customer-auth/plugin-features.js +2 -2
- package/.medusa/server/src/documents/paths/documents.js +2 -2
- package/.medusa/server/src/documents/schemas/documents.js +2 -2
- package/.medusa/server/src/email/application/deliver-login-code.js +2 -2
- package/.medusa/server/src/email/domain/business-keys.js +2 -2
- package/.medusa/server/src/email/templates/blocks/render-document.js +2 -2
- package/.medusa/server/src/email/templates/render.js +2 -2
- package/.medusa/server/src/email/templates/validate.js +2 -2
- package/.medusa/server/src/email/types/template-data.js +2 -2
- package/.medusa/server/src/jobs/tax-compliance-state-sync.js +26 -0
- package/.medusa/server/src/modules/documents/service.js +2 -2
- package/.medusa/server/src/modules/email/domain/attachment.js +2 -2
- package/.medusa/server/src/modules/email/service.js +3 -3
- package/.medusa/server/src/modules/tax-compliance/domain/validation-policy.js +48 -0
- package/.medusa/server/src/modules/tax-compliance/index.js +15 -0
- package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814120459.js +18 -0
- package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814121724.js +14 -0
- package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814153410.js +14 -0
- package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260929091620.js +27 -0
- package/.medusa/server/src/modules/tax-compliance/migrations/Migration20261011090147.js +16 -0
- package/.medusa/server/src/modules/tax-compliance/models/tax-compliance-state.js +29 -0
- package/.medusa/server/src/modules/tax-compliance/models/tax-compliance-validation.js +74 -0
- package/.medusa/server/src/modules/tax-compliance/runtime-settings.js +43 -0
- package/.medusa/server/src/modules/tax-compliance/service.js +693 -0
- package/.medusa/server/src/providers/email-otp/service.js +2 -2
- package/.medusa/server/src/providers/tax-compliance/index.js +11 -0
- package/.medusa/server/src/providers/tax-compliance/service.js +179 -0
- package/.medusa/server/src/public/constants.js +4 -2
- package/.medusa/server/src/public/index.js +6 -2
- package/.medusa/server/src/public/shop-config.js +6 -6
- package/.medusa/server/src/public/tax-compliance.js +22 -0
- package/.medusa/server/src/shared/lib/index.js +2 -1
- package/.medusa/server/src/shared/lib/optional-registration.js +34 -0
- package/.medusa/server/src/shop-config/{build-food-shop-config.js → build-shop-config.js} +15 -18
- package/.medusa/server/src/shop-config/options.js +4 -4
- package/.medusa/server/src/subscribers/affiliate-application-submitted.js +2 -2
- package/.medusa/server/src/subscribers/affiliate-consignment-reminder-due.js +2 -2
- package/.medusa/server/src/subscribers/documents-order-cancellation-ready.js +2 -2
- package/.medusa/server/src/subscribers/documents-refund-ready.js +2 -2
- package/.medusa/server/src/subscribers/documents-shipment-invoice-assignment-decided.js +2 -2
- package/.medusa/server/src/subscribers/packing-list-allocation-revised.js +2 -2
- package/.medusa/server/src/subscribers/tax-compliance-plugin-features-updated.js +25 -0
- package/.medusa/server/src/tax-compliance/complete-cart-hooks.js +26 -0
- package/.medusa/server/src/tax-compliance/integrations/finanzonline/client.js +222 -0
- package/.medusa/server/src/tax-compliance/integrations/finanzonline/validator.js +50 -0
- package/.medusa/server/src/tax-compliance/integrations/registry.js +26 -0
- package/.medusa/server/src/tax-compliance/integrations/validator.js +19 -0
- package/.medusa/server/src/tax-compliance/lib/order-tax-context.js +100 -0
- package/.medusa/server/src/tax-compliance/lib/tax-compliance-state.js +59 -0
- package/.medusa/server/src/tax-compliance/lib/tax-runtime-settings.js +79 -0
- package/.medusa/server/src/tax-compliance/plugin-features.js +73 -0
- package/.medusa/server/src/tax-compliance/resolve-services.js +7 -0
- package/.medusa/server/src/tax-compliance/types/tax-compliance.js +6 -0
- package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +25 -30
- package/.medusa/server/src/workflows/documents/issue-packing-list.js +3 -14
- package/.medusa/server/src/workflows/hooks/cart-tax-context.js +78 -0
- package/.medusa/server/src/workflows/hooks/order-tax-context.js +7 -0
- package/.medusa/server/src/workflows/hooks/shipping-tax-apportionment.js +145 -0
- package/.medusa/server/src/workflows/tax-compliance/apportion-order-shipping-tax.js +72 -0
- package/.medusa/server/src/workflows/tax-compliance/domain/requires-frozen-tax-evidence.js +27 -0
- package/.medusa/server/src/workflows/tax-compliance/freeze-order-evidence.js +125 -0
- package/.medusa/server/src/workflows/tax-compliance/submit-customer-address-tax-identification.js +18 -0
- package/.medusa/server/src/workflows/tax-compliance/submit-tax-identification.js +18 -0
- package/README.md +393 -61
- package/dist/customer-auth/domain/auth-methods.js +1 -1
- package/dist/customer-auth/plugin-features.js +1 -1
- package/dist/documents/types/admin-api.d.ts +1 -1
- package/dist/documents/types/document-summary.d.ts +1 -1
- package/dist/documents/types/store-api.d.ts +1 -1
- package/dist/email/types/template-data.js +1 -1
- package/dist/public/constants.d.ts +2 -0
- package/dist/public/constants.js +3 -1
- package/dist/public/index.d.ts +2 -1
- package/dist/public/index.js +5 -1
- package/dist/public/shop-config.d.ts +4 -4
- package/dist/public/shop-config.js +5 -5
- package/dist/public/tax-compliance.d.ts +30 -0
- package/dist/public/tax-compliance.js +21 -0
- package/dist/shared/lib/index.d.ts +1 -0
- package/dist/shared/lib/index.js +1 -0
- package/dist/shared/lib/optional-registration.d.ts +18 -0
- package/dist/shared/lib/optional-registration.js +33 -0
- package/dist/shop-config/{build-food-shop-config.d.ts → build-shop-config.d.ts} +12 -12
- package/dist/shop-config/{build-food-shop-config.js → build-shop-config.js} +14 -17
- package/dist/shop-config/options.d.ts +3 -3
- package/dist/shop-config/options.js +3 -3
- package/package.json +7 -6
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.config = void 0;
|
|
4
4
|
exports.default = documentsShipmentAssignmentSubscriber;
|
|
5
5
|
const public_1 = require("../public");
|
|
6
|
-
const documents_1 = require("@hartl-services/medusa-
|
|
6
|
+
const documents_1 = require("@hartl-services/medusa-contracts/events/documents");
|
|
7
7
|
const plugin_features_1 = require("../email/plugin-features");
|
|
8
8
|
const prepare_shipment_email_1 = require("../workflows/email/prepare-shipment-email");
|
|
9
9
|
async function documentsShipmentAssignmentSubscriber({ event, container, }) {
|
|
@@ -23,4 +23,4 @@ async function documentsShipmentAssignmentSubscriber({ event, container, }) {
|
|
|
23
23
|
exports.config = {
|
|
24
24
|
event: documents_1.DOCUMENTS_SHIPMENT_INVOICE_ASSIGNMENT_DECIDED_EVENT,
|
|
25
25
|
};
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnRzLXNoaXBtZW50LWludm9pY2UtYXNzaWdubWVudC1kZWNpZGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL2RvY3VtZW50cy1zaGlwbWVudC1pbnZvaWNlLWFzc2lnbm1lbnQtZGVjaWRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFhQSx3REF1QkM7QUFwQ0Qsc0NBQW1EO0FBS25ELGlGQUcyRDtBQUUzRCw4REFBK0Q7QUFDL0Qsc0ZBQXlGO0FBRTFFLEtBQUssVUFBVSxxQ0FBcUMsQ0FBQyxFQUNsRSxLQUFLLEVBQ0wsU0FBUyxHQUNlO0lBQ3hCLElBQUksQ0FBQztRQUNILElBQ0UsQ0FBQyxDQUFDLE1BQU0sSUFBQSwrQkFBc0IsRUFDNUIsU0FBUyxFQUNULHFDQUFtQixFQUNuQixhQUFhLENBQ2QsQ0FBQyxFQUNGLENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLGdFQUFvRCxDQUFDLEtBQUssQ0FDeEUsS0FBSyxDQUFDLElBQUksQ0FDWCxDQUFDO1FBQ0YsTUFBTSxJQUFBLHFEQUE0QixFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNoRCxLQUFLLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFO1NBQzNDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDM0UsQ0FBQztBQUNILENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBcUI7SUFDdEMsS0FBSyxFQUFFLCtEQUFtRDtDQUMzRCxDQUFDIn0=
|
|
@@ -4,7 +4,7 @@ exports.config = void 0;
|
|
|
4
4
|
exports.default = packingListAllocationRevisedSubscriber;
|
|
5
5
|
const public_1 = require("../public");
|
|
6
6
|
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
-
const batch_management_1 = require("@hartl-services/medusa-
|
|
7
|
+
const batch_management_1 = require("@hartl-services/medusa-contracts/events/batch-management");
|
|
8
8
|
const plugin_features_1 = require("../documents/plugin-features");
|
|
9
9
|
const issue_packing_list_1 = require("../workflows/documents/issue-packing-list");
|
|
10
10
|
async function packingListAllocationRevisedSubscriber({ event, container, }) {
|
|
@@ -29,4 +29,4 @@ async function packingListAllocationRevisedSubscriber({ event, container, }) {
|
|
|
29
29
|
exports.config = {
|
|
30
30
|
event: batch_management_1.BATCH_MANAGEMENT_FULFILLMENT_ALLOCATION_REVISED_EVENT,
|
|
31
31
|
};
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2luZy1saXN0LWFsbG9jYXRpb24tcmV2aXNlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9wYWNraW5nLWxpc3QtYWxsb2NhdGlvbi1yZXZpc2VkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWVBLHlEQWlDQztBQWhERCxzQ0FBa0Q7QUFNbEQscURBQXFFO0FBQ3JFLCtGQUdpRTtBQUVqRSxrRUFBc0U7QUFDdEUsa0ZBQW9GO0FBRXJFLEtBQUssVUFBVSxzQ0FBc0MsQ0FBQyxFQUNuRSxLQUFLLEVBQ0wsU0FBUyxHQUNlO0lBQ3hCLElBQ0UsQ0FBQyxDQUFDLE1BQU0sSUFBQSwrQkFBc0IsRUFDNUIsU0FBUyxFQUNULHlDQUF1QixFQUN2QixlQUFlLENBQ2hCLENBQUMsRUFDRixDQUFDO1FBQ0QsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyx5RUFBc0QsQ0FBQyxLQUFLLENBQ3ZFLEtBQUssQ0FBQyxJQUFJLENBQ1gsQ0FBQTtJQUVELElBQUksQ0FBQztRQUNILE1BQU0sSUFBQSw2Q0FBd0IsRUFBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDNUMsS0FBSyxFQUFFO2dCQUNMLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO2FBQ3BDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFTLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzFFLE1BQU0sQ0FBQyxLQUFLLENBQ1Ysb0NBQW9DLElBQUksQ0FBQyxRQUFRLDJCQUEyQixJQUFJLENBQUMsY0FBYyxFQUFFLEVBQ2pHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQzFELENBQUE7UUFDRCxNQUFNLEtBQUssQ0FBQTtJQUNiLENBQUM7QUFDSCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQXFCO0lBQ3RDLEtBQUssRUFBRSx3RUFBcUQ7Q0FDN0QsQ0FBQSJ9
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = taxCompliancePluginFeaturesUpdatedSubscriber;
|
|
5
|
+
const public_1 = require("../public");
|
|
6
|
+
const plugin_features_1 = require("@hartl-services/medusa-contracts/events/plugin-features");
|
|
7
|
+
const tax_compliance_state_1 = require("../tax-compliance/lib/tax-compliance-state");
|
|
8
|
+
const plugin_features_2 = require("../tax-compliance/plugin-features");
|
|
9
|
+
/**
|
|
10
|
+
* Switching the plugin or one of its features in the Admin reaches the tax
|
|
11
|
+
* hooks right away instead of on the next `tax-compliance-state-sync` run.
|
|
12
|
+
* The sync reads the toggles itself, so a late or repeated event still
|
|
13
|
+
* converges on the current values.
|
|
14
|
+
*/
|
|
15
|
+
async function taxCompliancePluginFeaturesUpdatedSubscriber({ event, container, }) {
|
|
16
|
+
if (!(0, public_1.isOwnPluginEvent)(event.data, plugin_features_2.taxCompliancePluginFeatures.plugin_key)) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
plugin_features_1.PluginFeaturesUpdatedEventSchema.parse(event.data);
|
|
20
|
+
await (0, tax_compliance_state_1.storeTaxComplianceState)(container);
|
|
21
|
+
}
|
|
22
|
+
exports.config = {
|
|
23
|
+
event: plugin_features_1.PLUGIN_FEATURES_UPDATED_EVENT,
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGF4LWNvbXBsaWFuY2UtcGx1Z2luLWZlYXR1cmVzLXVwZGF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc3Vic2NyaWJlcnMvdGF4LWNvbXBsaWFuY2UtcGx1Z2luLWZlYXR1cmVzLXVwZGF0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBb0JBLCtEQVVDO0FBMUJELHNDQUE0QztBQUM1Qyw2RkFJZ0U7QUFFaEUscUZBQW9GO0FBQ3BGLHVFQUErRTtBQUUvRTs7Ozs7R0FLRztBQUNZLEtBQUssVUFBVSw0Q0FBNEMsQ0FBQyxFQUN6RSxLQUFLLEVBQ0wsU0FBUyxHQUNrQztJQUMzQyxJQUFJLENBQUMsSUFBQSx5QkFBZ0IsRUFBQyxLQUFLLENBQUMsSUFBSSxFQUFFLDZDQUEyQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDMUUsT0FBTTtJQUNSLENBQUM7SUFDRCxrREFBZ0MsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRWxELE1BQU0sSUFBQSw4Q0FBdUIsRUFBQyxTQUFTLENBQUMsQ0FBQTtBQUMxQyxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQXFCO0lBQ3RDLEtBQUssRUFBRSwrQ0FBNkI7Q0FDckMsQ0FBQSJ9
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.taxComplianceCompleteCartHooks = exports.ORDER_CREATED_PARTICIPANT_WORKFLOW_OPTIONS = exports.FREEZE_TAX_COMPLIANCE_ORDER_EVIDENCE_WORKFLOW_ID = void 0;
|
|
4
|
+
exports.FREEZE_TAX_COMPLIANCE_ORDER_EVIDENCE_WORKFLOW_ID = "freeze-tax-compliance-order-evidence";
|
|
5
|
+
/**
|
|
6
|
+
* The base cancels orderCreated participants by transaction id, also after
|
|
7
|
+
* they finished (compensation of a later complete-cart step). The in-memory
|
|
8
|
+
* workflow engine deletes a finished transaction unless it is stored with a
|
|
9
|
+
* retention time, so the participant keeps it as long as Medusa's
|
|
10
|
+
* completeCartWorkflow keeps its own (3 days, core-flows complete-cart.js).
|
|
11
|
+
*/
|
|
12
|
+
exports.ORDER_CREATED_PARTICIPANT_WORKFLOW_OPTIONS = {
|
|
13
|
+
store: true,
|
|
14
|
+
retentionTime: 60 * 60 * 24 * 3,
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Run by @hartl-services/medusa-base, which owns the complete-cart hooks.
|
|
18
|
+
* Runs after Affiliate's orderCreated participant (100).
|
|
19
|
+
*/
|
|
20
|
+
exports.taxComplianceCompleteCartHooks = {
|
|
21
|
+
orderCreated: {
|
|
22
|
+
workflow_id: exports.FREEZE_TAX_COMPLIANCE_ORDER_EVIDENCE_WORKFLOW_ID,
|
|
23
|
+
order: 200,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxldGUtY2FydC1ob29rcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90YXgtY29tcGxpYW5jZS9jb21wbGV0ZS1jYXJ0LWhvb2tzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVhLFFBQUEsZ0RBQWdELEdBQzNELHNDQUFzQyxDQUFBO0FBRXhDOzs7Ozs7R0FNRztBQUNVLFFBQUEsMENBQTBDLEdBQUc7SUFDeEQsS0FBSyxFQUFFLElBQUk7SUFDWCxhQUFhLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztDQUN2QixDQUFBO0FBRVY7OztHQUdHO0FBQ1UsUUFBQSw4QkFBOEIsR0FBaUM7SUFDMUUsWUFBWSxFQUFFO1FBQ1osV0FBVyxFQUFFLHdEQUFnRDtRQUM3RCxLQUFLLEVBQUUsR0FBRztLQUNYO0NBQ0YsQ0FBQSJ9
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FinanzOnlineClient = exports.FINANZONLINE_LOGOUT_TIMEOUT_MS = exports.FINANZONLINE_VALIDATION_TIMEOUT_MS = exports.NodeSoapFinanzOnlineOperations = exports.buildStage2UidRequest = exports.FINANZONLINE_UID_WSDL = exports.FINANZONLINE_SESSION_WSDL = void 0;
|
|
4
|
+
const lib_1 = require("../../../shared/lib");
|
|
5
|
+
const soap_1 = require("soap");
|
|
6
|
+
exports.FINANZONLINE_SESSION_WSDL = "https://finanzonline.bmf.gv.at/fonws/ws/sessionService.wsdl";
|
|
7
|
+
exports.FINANZONLINE_UID_WSDL = "https://finanzonline.bmf.gv.at/fonuid/ws/uidAbfrageService.wsdl";
|
|
8
|
+
const buildStage2UidRequest = (input) => ({
|
|
9
|
+
tid: input.participantId,
|
|
10
|
+
benid: input.userId,
|
|
11
|
+
id: input.sessionId,
|
|
12
|
+
uid_tn: input.requestingVatNumber,
|
|
13
|
+
uid: input.targetVatNumber,
|
|
14
|
+
stufe: "2",
|
|
15
|
+
});
|
|
16
|
+
exports.buildStage2UidRequest = buildStage2UidRequest;
|
|
17
|
+
const asNumber = (value) => {
|
|
18
|
+
const parsed = typeof value === "number" ? value : Number(value);
|
|
19
|
+
return Number.isFinite(parsed) ? parsed : Number.NaN;
|
|
20
|
+
};
|
|
21
|
+
const optionalString = (value) => typeof value === "string" && value.length > 0 ? value : undefined;
|
|
22
|
+
const firstSoapResult = (value) => {
|
|
23
|
+
if (!Array.isArray(value)) {
|
|
24
|
+
return {};
|
|
25
|
+
}
|
|
26
|
+
return (0, lib_1.asRecord)(value[0]);
|
|
27
|
+
};
|
|
28
|
+
const scrubSoapTransportState = (client) => {
|
|
29
|
+
const mutableClient = client;
|
|
30
|
+
for (const key of Object.getOwnPropertyNames(mutableClient)) {
|
|
31
|
+
if (key.startsWith("last")) {
|
|
32
|
+
delete mutableClient[key];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const withValidationScopedSoapClient = async (wsdl, timeoutMs, operation) => {
|
|
37
|
+
const deadline = Date.now() + timeoutMs;
|
|
38
|
+
const client = await (0, soap_1.createClientAsync)(wsdl, {
|
|
39
|
+
wsdl_options: { timeout: timeoutMs },
|
|
40
|
+
});
|
|
41
|
+
try {
|
|
42
|
+
return await operation(client, {
|
|
43
|
+
timeout: Math.max(1, deadline - Date.now()),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
scrubSoapTransportState(client);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* The only class that knows the node-soap dynamic method names and the official
|
|
52
|
+
* FinanzOnline wire parameter names. Raw SOAP requests and responses never
|
|
53
|
+
* leave this boundary.
|
|
54
|
+
*/
|
|
55
|
+
class NodeSoapFinanzOnlineOperations {
|
|
56
|
+
async login(input, timeoutMs) {
|
|
57
|
+
const result = await withValidationScopedSoapClient(exports.FINANZONLINE_SESSION_WSDL, timeoutMs, async (client, requestOptions) => firstSoapResult(await client.loginAsync({
|
|
58
|
+
tid: input.participantId,
|
|
59
|
+
benid: input.userId,
|
|
60
|
+
pin: input.password,
|
|
61
|
+
herstellerid: input.manufacturerId,
|
|
62
|
+
}, requestOptions)));
|
|
63
|
+
return {
|
|
64
|
+
id: optionalString(result.id),
|
|
65
|
+
rc: asNumber(result.rc),
|
|
66
|
+
msg: optionalString(result.msg),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async queryUid(input, timeoutMs) {
|
|
70
|
+
const result = await withValidationScopedSoapClient(exports.FINANZONLINE_UID_WSDL, timeoutMs, async (client, requestOptions) => firstSoapResult(await client.uidAbfrageAsync((0, exports.buildStage2UidRequest)(input), requestOptions)));
|
|
71
|
+
return {
|
|
72
|
+
rc: asNumber(result.rc),
|
|
73
|
+
msg: optionalString(result.msg),
|
|
74
|
+
name: optionalString(result.name),
|
|
75
|
+
adrz1: optionalString(result.adrz1),
|
|
76
|
+
adrz2: optionalString(result.adrz2),
|
|
77
|
+
adrz3: optionalString(result.adrz3),
|
|
78
|
+
adrz4: optionalString(result.adrz4),
|
|
79
|
+
adrz5: optionalString(result.adrz5),
|
|
80
|
+
adrz6: optionalString(result.adrz6),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async logout(input, timeoutMs) {
|
|
84
|
+
const result = await withValidationScopedSoapClient(exports.FINANZONLINE_SESSION_WSDL, timeoutMs, async (client, requestOptions) => firstSoapResult(await client.logoutAsync({
|
|
85
|
+
tid: input.participantId,
|
|
86
|
+
benid: input.userId,
|
|
87
|
+
id: input.sessionId,
|
|
88
|
+
}, requestOptions)));
|
|
89
|
+
return {
|
|
90
|
+
rc: asNumber(result.rc),
|
|
91
|
+
msg: optionalString(result.msg),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.NodeSoapFinanzOnlineOperations = NodeSoapFinanzOnlineOperations;
|
|
96
|
+
const INVALID_TARGET_UID_RETURN_CODES = new Set([1, 4]);
|
|
97
|
+
/**
|
|
98
|
+
* Login and UID query share this budget. The checkout waits 15 s for the
|
|
99
|
+
* whole tax-identification request, which also recomputes the cart, and the
|
|
100
|
+
* check runs inside a database transaction that holds the UID lock.
|
|
101
|
+
*/
|
|
102
|
+
exports.FINANZONLINE_VALIDATION_TIMEOUT_MS = 10_000;
|
|
103
|
+
/** Best-effort logout after the budget above. */
|
|
104
|
+
exports.FINANZONLINE_LOGOUT_TIMEOUT_MS = 3_000;
|
|
105
|
+
const MAX_DIAGNOSTIC_LENGTH = 500;
|
|
106
|
+
const describeReturnCode = (response) => `rc=${response.rc}${response.msg ? `: ${response.msg}` : ""}`;
|
|
107
|
+
class FinanzOnlineClient {
|
|
108
|
+
constructor(operations_, credentials_, logger_, now_ = Date.now) {
|
|
109
|
+
this.operations_ = operations_;
|
|
110
|
+
this.credentials_ = credentials_;
|
|
111
|
+
this.logger_ = logger_;
|
|
112
|
+
this.now_ = now_;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* The shopper only sees "nicht verfügbar"; the FinanzOnline answer goes to
|
|
116
|
+
* the log. The PIN is masked in case a provider message ever echoes it.
|
|
117
|
+
*/
|
|
118
|
+
warn_(message) {
|
|
119
|
+
try {
|
|
120
|
+
const masked = message
|
|
121
|
+
.split(this.credentials_.password)
|
|
122
|
+
.join("***")
|
|
123
|
+
.slice(0, MAX_DIAGNOSTIC_LENGTH);
|
|
124
|
+
this.logger_?.warn(`Tax compliance: FinanzOnline-UID-Prüfung nicht verfügbar – ${masked}`);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Logging must not change the validation outcome.
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async validateUid(input) {
|
|
131
|
+
let sessionId;
|
|
132
|
+
let stage = "Login";
|
|
133
|
+
const deadline = this.now_() + exports.FINANZONLINE_VALIDATION_TIMEOUT_MS;
|
|
134
|
+
const remaining = () => Math.max(1, deadline - this.now_());
|
|
135
|
+
try {
|
|
136
|
+
const login = await this.operations_.login({
|
|
137
|
+
...this.credentials_,
|
|
138
|
+
manufacturerId: input.requestingVatNumber,
|
|
139
|
+
}, remaining());
|
|
140
|
+
if (login.rc !== 0 || !login.id) {
|
|
141
|
+
this.warn_(`Login abgelehnt (${describeReturnCode(login)})`);
|
|
142
|
+
return {
|
|
143
|
+
status: "unavailable",
|
|
144
|
+
provider: null,
|
|
145
|
+
reason: "provider_unavailable",
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
sessionId = login.id;
|
|
149
|
+
stage = "UID-Abfrage";
|
|
150
|
+
const result = await this.operations_.queryUid({
|
|
151
|
+
participantId: this.credentials_.participantId,
|
|
152
|
+
requestingVatNumber: input.requestingVatNumber,
|
|
153
|
+
sessionId,
|
|
154
|
+
targetVatNumber: input.targetVatNumber,
|
|
155
|
+
userId: this.credentials_.userId,
|
|
156
|
+
}, remaining());
|
|
157
|
+
if (result.rc === 0 && result.name) {
|
|
158
|
+
return {
|
|
159
|
+
status: "valid",
|
|
160
|
+
provider: {
|
|
161
|
+
valid: true,
|
|
162
|
+
name: result.name,
|
|
163
|
+
addressLines: [
|
|
164
|
+
result.adrz1,
|
|
165
|
+
result.adrz2,
|
|
166
|
+
result.adrz3,
|
|
167
|
+
result.adrz4,
|
|
168
|
+
result.adrz5,
|
|
169
|
+
result.adrz6,
|
|
170
|
+
].filter((line) => Boolean(line)),
|
|
171
|
+
reference: null,
|
|
172
|
+
returnCode: result.rc,
|
|
173
|
+
},
|
|
174
|
+
reason: "provider_valid",
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
if (INVALID_TARGET_UID_RETURN_CODES.has(result.rc)) {
|
|
178
|
+
return {
|
|
179
|
+
status: "invalid",
|
|
180
|
+
provider: {
|
|
181
|
+
valid: false,
|
|
182
|
+
name: null,
|
|
183
|
+
addressLines: [],
|
|
184
|
+
reference: null,
|
|
185
|
+
returnCode: result.rc,
|
|
186
|
+
},
|
|
187
|
+
reason: "provider_invalid",
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
this.warn_(`UID-Abfrage ohne Ergebnis (${describeReturnCode(result)})`);
|
|
191
|
+
return {
|
|
192
|
+
status: "unavailable",
|
|
193
|
+
provider: null,
|
|
194
|
+
reason: "provider_unavailable",
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
this.warn_(`${stage} fehlgeschlagen: ${error instanceof Error ? error.message : String(error)}`);
|
|
199
|
+
return {
|
|
200
|
+
status: "unavailable",
|
|
201
|
+
provider: null,
|
|
202
|
+
reason: "technical_error",
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
finally {
|
|
206
|
+
if (sessionId) {
|
|
207
|
+
try {
|
|
208
|
+
await this.operations_.logout({
|
|
209
|
+
participantId: this.credentials_.participantId,
|
|
210
|
+
sessionId,
|
|
211
|
+
userId: this.credentials_.userId,
|
|
212
|
+
}, exports.FINANZONLINE_LOGOUT_TIMEOUT_MS);
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
// Validation evidence is still usable when best-effort logout fails.
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
exports.FinanzOnlineClient = FinanzOnlineClient;
|
|
222
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3RheC1jb21wbGlhbmNlL2ludGVncmF0aW9ucy9maW5hbnpvbmxpbmUvY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE4QztBQUM5QywrQkFBcUQ7QUFJeEMsUUFBQSx5QkFBeUIsR0FDcEMsNkRBQTZELENBQUE7QUFDbEQsUUFBQSxxQkFBcUIsR0FDaEMsaUVBQWlFLENBQUE7QUFvQjVELE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxLQUFvQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlELEdBQUcsRUFBRSxLQUFLLENBQUMsYUFBYTtJQUN4QixLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU07SUFDbkIsRUFBRSxFQUFFLEtBQUssQ0FBQyxTQUFTO0lBQ25CLE1BQU0sRUFBRSxLQUFLLENBQUMsbUJBQW1CO0lBQ2pDLEdBQUcsRUFBRSxLQUFLLENBQUMsZUFBZTtJQUMxQixLQUFLLEVBQUUsR0FBWTtDQUNwQixDQUFDLENBQUE7QUFQVyxRQUFBLHFCQUFxQix5QkFPaEM7QUFnREYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFjLEVBQVUsRUFBRTtJQUMxQyxNQUFNLE1BQU0sR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hFLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFBO0FBQ3RELENBQUMsQ0FBQTtBQUVELE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBYyxFQUFzQixFQUFFLENBQzVELE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FB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
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FinanzOnlineQualifiedVatValidator = void 0;
|
|
4
|
+
const lib_1 = require("../../../shared/lib");
|
|
5
|
+
const validation_policy_1 = require("../../../modules/tax-compliance/domain/validation-policy");
|
|
6
|
+
class FinanzOnlineQualifiedVatValidator {
|
|
7
|
+
constructor(client_) {
|
|
8
|
+
this.client_ = client_;
|
|
9
|
+
this.availability = "available";
|
|
10
|
+
this.provider = "at-finanzonline";
|
|
11
|
+
}
|
|
12
|
+
async validate(input) {
|
|
13
|
+
const requestingVatNumber = (0, lib_1.normalizeVatNumber)(input.merchantVatNumber);
|
|
14
|
+
const targetVatNumber = (0, lib_1.normalizeVatNumber)(input.customerVatNumber);
|
|
15
|
+
if (requestingVatNumber === lib_1.VAT_NUMBER_PLACEHOLDER ||
|
|
16
|
+
targetVatNumber === lib_1.VAT_NUMBER_PLACEHOLDER) {
|
|
17
|
+
return {
|
|
18
|
+
status: "unavailable",
|
|
19
|
+
provider: null,
|
|
20
|
+
reason: "uid_sentinel",
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const result = await this.client_.validateUid({
|
|
24
|
+
requestingVatNumber,
|
|
25
|
+
targetVatNumber,
|
|
26
|
+
});
|
|
27
|
+
if (result.status !== "valid") {
|
|
28
|
+
return {
|
|
29
|
+
status: result.status,
|
|
30
|
+
provider: result.provider,
|
|
31
|
+
reason: result.reason,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const decision = (0, validation_policy_1.evaluateEligibility)({
|
|
35
|
+
billingAddress: input.billingAddress,
|
|
36
|
+
companyName: input.companyName,
|
|
37
|
+
customerVatNumber: input.customerVatNumber,
|
|
38
|
+
deliveryCountryCode: input.deliveryCountryCode,
|
|
39
|
+
merchantCountryCode: input.merchantCountryCode,
|
|
40
|
+
provider: result.provider,
|
|
41
|
+
});
|
|
42
|
+
return {
|
|
43
|
+
status: decision.status,
|
|
44
|
+
provider: result.provider,
|
|
45
|
+
reason: decision.reason,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.FinanzOnlineQualifiedVatValidator = FinanzOnlineQualifiedVatValidator;
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3RheC1jb21wbGlhbmNlL2ludGVncmF0aW9ucy9maW5hbnpvbmxpbmUvdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUc0QjtBQUU1QixnR0FBOEY7QUFROUYsTUFBYSxpQ0FBaUM7SUFNNUMsWUFBNkIsT0FBK0I7UUFBL0IsWUFBTyxHQUFQLE9BQU8sQ0FBd0I7UUFIbkQsaUJBQVksR0FBRyxXQUFvQixDQUFBO1FBQ25DLGFBQVEsR0FBRyxpQkFBaUIsQ0FBQTtJQUUwQixDQUFDO0lBRWhFLEtBQUssQ0FBQyxRQUFRLENBQ1osS0FBa0M7UUFFbEMsTUFBTSxtQkFBbUIsR0FBRyxJQUFBLHdCQUFrQixFQUM1QyxLQUFLLENBQUMsaUJBQWlCLENBQ3hCLENBQUE7UUFDRCxNQUFNLGVBQWUsR0FBRyxJQUFBLHdCQUFrQixFQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBRW5FLElBQ0UsbUJBQW1CLEtBQUssNEJBQXNCO1lBQzlDLGVBQWUsS0FBSyw0QkFBc0IsRUFDMUMsQ0FBQztZQUNELE9BQU87Z0JBQ0wsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLFFBQVEsRUFBRSxJQUFJO2dCQUNkLE1BQU0sRUFBRSxjQUFjO2FBQ3ZCLENBQUE7UUFDSCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUM1QyxtQkFBbUI7WUFDbkIsZUFBZTtTQUNoQixDQUFDLENBQUE7UUFFRixJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDOUIsT0FBTztnQkFDTCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07Z0JBQ3JCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDekIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO2FBQ3RCLENBQUE7UUFDSCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBQSx1Q0FBbUIsRUFBQztZQUNuQyxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7WUFDcEMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzlCLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxpQkFBaUI7WUFDMUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtZQUM5QyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsbUJBQW1CO1lBQzlDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtTQUMxQixDQUFDLENBQUE7UUFFRixPQUFPO1lBQ0wsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1lBQ3ZCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN6QixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07U0FDeEIsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQXZERCw4RUF1REMifQ==
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.selectQualifiedVatValidator = void 0;
|
|
4
|
+
const lib_1 = require("../../shared/lib");
|
|
5
|
+
const validator_1 = require("./validator");
|
|
6
|
+
const client_1 = require("./finanzonline/client");
|
|
7
|
+
const validator_2 = require("./finanzonline/validator");
|
|
8
|
+
const selectQualifiedVatValidator = (input) => {
|
|
9
|
+
if (input.merchantCountryCode.toLowerCase() !== "at") {
|
|
10
|
+
return new validator_1.UnavailableQualifiedVatValidator("unsupported_merchant_country");
|
|
11
|
+
}
|
|
12
|
+
if ((0, lib_1.normalizeVatNumber)(input.merchantVatNumber) ===
|
|
13
|
+
lib_1.VAT_NUMBER_PLACEHOLDER) {
|
|
14
|
+
return new validator_1.UnavailableQualifiedVatValidator("merchant_uid_sentinel");
|
|
15
|
+
}
|
|
16
|
+
if (!input.credentials?.participantId.trim() ||
|
|
17
|
+
!input.credentials.userId.trim() ||
|
|
18
|
+
!input.credentials.password.trim()) {
|
|
19
|
+
return new validator_1.UnavailableQualifiedVatValidator("missing_credentials");
|
|
20
|
+
}
|
|
21
|
+
const client = input.client ??
|
|
22
|
+
new client_1.FinanzOnlineClient(new client_1.NodeSoapFinanzOnlineOperations(), input.credentials, input.logger);
|
|
23
|
+
return new validator_2.FinanzOnlineQualifiedVatValidator(client);
|
|
24
|
+
};
|
|
25
|
+
exports.selectQualifiedVatValidator = selectQualifiedVatValidator;
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdGF4LWNvbXBsaWFuY2UvaW50ZWdyYXRpb25zL3JlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDBDQUd5QjtBQUV6QiwyQ0FHb0I7QUFDcEIsa0RBTThCO0FBQzlCLHdEQUE0RTtBQVlyRSxNQUFNLDJCQUEyQixHQUFHLENBQ3pDLEtBQXVDLEVBQ2hCLEVBQUU7SUFDekIsSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDckQsT0FBTyxJQUFJLDRDQUFnQyxDQUN6Qyw4QkFBOEIsQ0FDL0IsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUNFLElBQUEsd0JBQWtCLEVBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDO1FBQzNDLDRCQUFzQixFQUN0QixDQUFDO1FBQ0QsT0FBTyxJQUFJLDRDQUFnQyxDQUFDLHVCQUF1QixDQUFDLENBQUE7SUFDdEUsQ0FBQztJQUVELElBQ0UsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxJQUFJLEVBQUU7UUFDeEMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7UUFDaEMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFDbEMsQ0FBQztRQUNELE9BQU8sSUFBSSw0Q0FBZ0MsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO0lBQ3BFLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FDVixLQUFLLENBQUMsTUFBTTtRQUNaLElBQUksMkJBQWtCLENBQ3BCLElBQUksdUNBQThCLEVBQUUsRUFDcEMsS0FBSyxDQUFDLFdBQVcsRUFDakIsS0FBSyxDQUFDLE1BQU0sQ0FDYixDQUFBO0lBRUgsT0FBTyxJQUFJLDZDQUFpQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ3RELENBQUMsQ0FBQTtBQWpDWSxRQUFBLDJCQUEyQiwrQkFpQ3ZDIn0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UnavailableQualifiedVatValidator = void 0;
|
|
4
|
+
class UnavailableQualifiedVatValidator {
|
|
5
|
+
constructor(reason_) {
|
|
6
|
+
this.reason_ = reason_;
|
|
7
|
+
this.availability = "unavailable";
|
|
8
|
+
this.provider = "local-unavailable";
|
|
9
|
+
}
|
|
10
|
+
async validate() {
|
|
11
|
+
return {
|
|
12
|
+
status: "unavailable",
|
|
13
|
+
provider: null,
|
|
14
|
+
reason: this.reason_,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.UnavailableQualifiedVatValidator = UnavailableQualifiedVatValidator;
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3RheC1jb21wbGlhbmNlL2ludGVncmF0aW9ucy92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBYUEsTUFBYSxnQ0FBZ0M7SUFNM0MsWUFBNkIsT0FBZTtRQUFmLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFIbkMsaUJBQVksR0FBRyxhQUFzQixDQUFBO1FBQ3JDLGFBQVEsR0FBRyxtQkFBbUIsQ0FBQTtJQUVRLENBQUM7SUFFaEQsS0FBSyxDQUFDLFFBQVE7UUFDWixPQUFPO1lBQ0wsTUFBTSxFQUFFLGFBQWE7WUFDckIsUUFBUSxFQUFFLElBQUk7WUFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDckIsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQWZELDRFQWVDIn0=
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createOrderTaxContextFromContainer = exports.createOrderTaxContext = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const tax_compliance_state_1 = require("./tax-compliance-state");
|
|
6
|
+
const resolve_services_1 = require("../resolve-services");
|
|
7
|
+
const shipping_tax_apportionment_1 = require("../../workflows/hooks/shipping-tax-apportionment");
|
|
8
|
+
const createOrderTaxContext = async (service, order) => {
|
|
9
|
+
const validationId = await service.getOrderValidationId(order.id);
|
|
10
|
+
return validationId
|
|
11
|
+
? {
|
|
12
|
+
tax_compliance_order_id: order.id,
|
|
13
|
+
tax_compliance_validation_id: validationId,
|
|
14
|
+
}
|
|
15
|
+
: undefined;
|
|
16
|
+
};
|
|
17
|
+
exports.createOrderTaxContext = createOrderTaxContext;
|
|
18
|
+
/**
|
|
19
|
+
* `updateOrderTaxLinesWorkflow`'s `setTaxLineContext` hook only carries the
|
|
20
|
+
* full item list on `order` for a whole-order recompute; a partial recompute
|
|
21
|
+
* (explicit item_ids/shipping_method_ids) fetches `order` without its items
|
|
22
|
+
* (see @medusajs/core-flows order/workflows/update-tax-lines.js `orderFields`
|
|
23
|
+
* vs `completeOrderFields`). Apportioning shipping tax always needs every
|
|
24
|
+
* item's current rate, not just the ones this particular call is touching,
|
|
25
|
+
* so this queries the order fresh whenever the hook's own order isn't
|
|
26
|
+
* already carrying its items.
|
|
27
|
+
*/
|
|
28
|
+
const resolveOrderForShippingApportionment = async (container, order) => {
|
|
29
|
+
if (Array.isArray(order.items) && order.currency_code) {
|
|
30
|
+
return order;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
34
|
+
const { data } = await query.graph({
|
|
35
|
+
entity: "order",
|
|
36
|
+
filters: { id: order.id },
|
|
37
|
+
fields: [
|
|
38
|
+
"id",
|
|
39
|
+
"currency_code",
|
|
40
|
+
"items.id",
|
|
41
|
+
"items.product_id",
|
|
42
|
+
"items.product_type_id",
|
|
43
|
+
"items.quantity",
|
|
44
|
+
// The order module fills `items.quantity` from the item detail only
|
|
45
|
+
// when the query joins it; without it every item weighs 0 and the
|
|
46
|
+
// order loses its apportioned shipping rate.
|
|
47
|
+
"items.detail.quantity",
|
|
48
|
+
"items.unit_price",
|
|
49
|
+
"shipping_address.country_code",
|
|
50
|
+
"shipping_address.province",
|
|
51
|
+
"shipping_address.address_1",
|
|
52
|
+
"shipping_address.address_2",
|
|
53
|
+
"shipping_address.city",
|
|
54
|
+
"shipping_address.postal_code",
|
|
55
|
+
"customer.id",
|
|
56
|
+
"customer.email",
|
|
57
|
+
"customer.groups.id",
|
|
58
|
+
],
|
|
59
|
+
});
|
|
60
|
+
return data[0] ?? null;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const createOrderTaxContextFromContainer = async (container, order) => {
|
|
67
|
+
let validationContext;
|
|
68
|
+
try {
|
|
69
|
+
validationContext = await (0, exports.createOrderTaxContext)((0, resolve_services_1.resolveTaxComplianceService)(container), order);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
try {
|
|
73
|
+
container
|
|
74
|
+
.resolve(utils_1.ContainerRegistrationKeys.LOGGER)
|
|
75
|
+
.warn("Tax compliance order context is unavailable; using ordinary B2C tax rates.");
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// A missing logger must not turn a tax-only failure into checkout failure.
|
|
79
|
+
}
|
|
80
|
+
validationContext = undefined;
|
|
81
|
+
}
|
|
82
|
+
// Frozen evidence of a completed order counts whatever `b2b` says now;
|
|
83
|
+
// only the shipping apportionment follows the stored toggle mirror.
|
|
84
|
+
if (!(await (0, tax_compliance_state_1.readTaxComplianceState)(container)).shipping_tax_active) {
|
|
85
|
+
return validationContext;
|
|
86
|
+
}
|
|
87
|
+
const fullOrder = await resolveOrderForShippingApportionment(container, order);
|
|
88
|
+
if (!fullOrder) {
|
|
89
|
+
return validationContext;
|
|
90
|
+
}
|
|
91
|
+
return (0, shipping_tax_apportionment_1.resolveShippingRateContext)(container, {
|
|
92
|
+
currencyCode: fullOrder.currency_code,
|
|
93
|
+
items: await (0, shipping_tax_apportionment_1.withLineDiscounts)(container, "order", fullOrder.id, fullOrder.items ?? []),
|
|
94
|
+
address: fullOrder.shipping_address,
|
|
95
|
+
customer: fullOrder.customer,
|
|
96
|
+
additionalContext: validationContext,
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
exports.createOrderTaxContextFromContainer = createOrderTaxContextFromContainer;
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItdGF4LWNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdGF4LWNvbXBsaWFuY2UvbGliL29yZGVyLXRheC1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLHFEQUFxRTtBQUVyRSxpRUFBK0Q7QUFDL0QsMERBQWlFO0FBQ2pFLGlHQUl5RDtBQU1sRCxNQUFNLHFCQUFxQixHQUFHLEtBQUssRUFDeEMsT0FBK0IsRUFDL0IsS0FBcUIsRUFDd0IsRUFBRTtJQUMvQyxNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDakUsT0FBTyxZQUFZO1FBQ2pCLENBQUMsQ0FBQztZQUNFLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ2pDLDRCQUE0QixFQUFFLFlBQVk7U0FDM0M7UUFDSCxDQUFDLENBQUMsU0FBUyxDQUFBO0FBQ2YsQ0FBQyxDQUFBO0FBWFksUUFBQSxxQkFBcUIseUJBV2pDO0FBc0JEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sb0NBQW9DLEdBQUcsS0FBSyxFQUNoRCxTQUEwQixFQUMxQixLQUE4RCxFQUNmLEVBQUU7SUFDakQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdEQsT0FBTyxLQUFpRCxDQUFBO0lBQzFELENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2hFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDakMsTUFBTSxFQUFFLE9BQU87WUFDZixPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUN6QixNQUFNLEVBQUU7Z0JBQ04sSUFBSTtnQkFDSixlQUFlO2dCQUNmLFVBQVU7Z0JBQ1Ysa0JBQWtCO2dCQUNsQix1QkFBdUI7Z0JBQ3ZCLGdCQUFnQjtnQkFDaEIsb0VBQW9FO2dCQUNwRSxrRUFBa0U7Z0JBQ2xFLDZDQUE2QztnQkFDN0MsdUJBQXVCO2dCQUN2QixrQkFBa0I7Z0JBQ2xCLCtCQUErQjtnQkFDL0IsMkJBQTJCO2dCQUMzQiw0QkFBNEI7Z0JBQzVCLDRCQUE0QjtnQkFDNUIsdUJBQXVCO2dCQUN2Qiw4QkFBOEI7Z0JBQzlCLGFBQWE7Z0JBQ2IsZ0JBQWdCO2dCQUNoQixvQkFBb0I7YUFDckI7U0FDRixDQUFDLENBQUE7UUFDRixPQUFRLElBQUksQ0FBQyxDQUFDLENBQThDLElBQUksSUFBSSxDQUFBO0lBQ3RFLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7QUFDSCxDQUFDLENBQUE7QUFFTSxNQUFNLGtDQUFrQyxHQUFHLEtBQUssRUFDckQsU0FBMEIsRUFDMUIsS0FBOEQsRUFDaEIsRUFBRTtJQUNoRCxJQUFJLGlCQUFxRCxDQUFBO0lBQ3pELElBQUksQ0FBQztRQUNILGlCQUFpQixHQUFHLE1BQU0sSUFBQSw2QkFBcUIsRUFDN0MsSUFBQSw4Q0FBMkIsRUFBQyxTQUFTLENBQUMsRUFDdEMsS0FBSyxDQUNOLENBQUE7SUFDSCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsSUFBSSxDQUFDO1lBQ0gsU0FBUztpQkFDTixPQUFPLENBRUwsaUNBQXlCLENBQUMsTUFBTSxDQUFDO2lCQUNuQyxJQUFJLENBQ0gsNEVBQTRFLENBQzdFLENBQUE7UUFDTCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsMkVBQTJFO1FBQzdFLENBQUM7UUFDRCxpQkFBaUIsR0FBRyxTQUFTLENBQUE7SUFDL0IsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSxvRUFBb0U7SUFDcEUsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFBLDZDQUFzQixFQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNuRSxPQUFPLGlCQUFpQixDQUFBO0lBQzFCLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLG9DQUFvQyxDQUMxRCxTQUFTLEVBQ1QsS0FBSyxDQUNOLENBQUE7SUFDRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixPQUFPLGlCQUFpQixDQUFBO0lBQzFCLENBQUM7SUFFRCxPQUFPLElBQUEsdURBQTBCLEVBQUMsU0FBUyxFQUFFO1FBQzNDLFlBQVksRUFBRSxTQUFTLENBQUMsYUFBYTtRQUNyQyxLQUFLLEVBQUUsTUFBTSxJQUFBLDhDQUFpQixFQUM1QixTQUFTLEVBQ1QsT0FBTyxFQUNQLFNBQVMsQ0FBQyxFQUFFLEVBQ1osU0FBUyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQ3RCO1FBQ0QsT0FBTyxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0I7UUFDbkMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRO1FBQzVCLGlCQUFpQixFQUFFLGlCQUFpQjtLQUNyQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUE7QUFuRFksUUFBQSxrQ0FBa0Msc0NBbUQ5QyJ9
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readTaxComplianceState = exports.storeTaxComplianceState = void 0;
|
|
4
|
+
const public_1 = require("../../public");
|
|
5
|
+
const tax_compliance_1 = require("@hartl-services/medusa-contracts/paths/tax-compliance");
|
|
6
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
const plugin_features_1 = require("../plugin-features");
|
|
8
|
+
const resolve_services_1 = require("../resolve-services");
|
|
9
|
+
const STATE_SYNC_LOCK_KEY = "tax-compliance-state-sync";
|
|
10
|
+
const SYNC_LOCK_TIMEOUT_SECONDS = 60;
|
|
11
|
+
/** Used when the mirror cannot be read: ordinary B2C rates, Medusa's shipping tax. */
|
|
12
|
+
const FAIL_SAFE_STATE = {
|
|
13
|
+
b2b_active: false,
|
|
14
|
+
shipping_tax_active: false,
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Copies the effective `b2b` and `shipping_tax` toggles (false while the
|
|
18
|
+
* plugin switch is off; `b2b` also while `vat_validation` is off) into the
|
|
19
|
+
* module's mirror, which the tax hooks and the order-evidence freeze read
|
|
20
|
+
* instead of the toggles. Toggle read and write share one lock, so the last
|
|
21
|
+
* run stores the latest values; a read failure propagates and nothing is
|
|
22
|
+
* written.
|
|
23
|
+
*/
|
|
24
|
+
const storeTaxComplianceState = async (container) => {
|
|
25
|
+
const locking = container.resolve(utils_1.Modules.LOCKING);
|
|
26
|
+
return await locking.execute(STATE_SYNC_LOCK_KEY, async () => {
|
|
27
|
+
const state = {
|
|
28
|
+
b2b_active: await (0, public_1.isPluginFeatureEnabled)(container, plugin_features_1.taxCompliancePluginFeatures, tax_compliance_1.TAX_COMPLIANCE_FEATURES.b2b),
|
|
29
|
+
shipping_tax_active: await (0, public_1.isPluginFeatureEnabled)(container, plugin_features_1.taxCompliancePluginFeatures, tax_compliance_1.TAX_COMPLIANCE_FEATURES.shippingTax),
|
|
30
|
+
};
|
|
31
|
+
await (0, resolve_services_1.resolveTaxComplianceService)(container).storeTaxComplianceState(state);
|
|
32
|
+
return state;
|
|
33
|
+
}, { timeout: SYNC_LOCK_TIMEOUT_SECONDS });
|
|
34
|
+
};
|
|
35
|
+
exports.storeTaxComplianceState = storeTaxComplianceState;
|
|
36
|
+
/**
|
|
37
|
+
* Reads the stored mirror. Safe on the tax path: it reads module data, never
|
|
38
|
+
* a toggle, and a failed read answers "both off" (ordinary B2C rates,
|
|
39
|
+
* Medusa's shipping tax) instead of failing the cart operation; unlike the
|
|
40
|
+
* Affiliate mirror, because charging VAT is the safe fallback for taxes.
|
|
41
|
+
*/
|
|
42
|
+
const readTaxComplianceState = async (container) => {
|
|
43
|
+
try {
|
|
44
|
+
return await (0, resolve_services_1.resolveTaxComplianceService)(container).getTaxComplianceState();
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
try {
|
|
48
|
+
container
|
|
49
|
+
.resolve(utils_1.ContainerRegistrationKeys.LOGGER)
|
|
50
|
+
.warn(`Tax compliance state could not be read; using ordinary B2C tax rates and Medusa's shipping tax: ${error instanceof Error ? error.message : String(error)}`);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// A missing logger must not turn a tax-only failure into checkout failure.
|
|
54
|
+
}
|
|
55
|
+
return FAIL_SAFE_STATE;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
exports.readTaxComplianceState = readTaxComplianceState;
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGF4LWNvbXBsaWFuY2Utc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdGF4LWNvbXBsaWFuY2UvbGliL3RheC1jb21wbGlhbmNlLXN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFxRDtBQUNyRCwwRkFBK0Y7QUFLL0YscURBQThFO0FBRzlFLHdEQUFnRTtBQUNoRSwwREFBaUU7QUFFakUsTUFBTSxtQkFBbUIsR0FBRywyQkFBMkIsQ0FBQTtBQUN2RCxNQUFNLHlCQUF5QixHQUFHLEVBQUUsQ0FBQTtBQUVwQyxzRkFBc0Y7QUFDdEYsTUFBTSxlQUFlLEdBQXdCO0lBQzNDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLG1CQUFtQixFQUFFLEtBQUs7Q0FDM0IsQ0FBQTtBQUVEOzs7Ozs7O0dBT0c7QUFDSSxNQUFNLHVCQUF1QixHQUFHLEtBQUssRUFDMUMsU0FBMEIsRUFDSSxFQUFFO0lBQ2hDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLE9BQU8sQ0FBbUIsQ0FBQTtJQUVwRSxPQUFPLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FDMUIsbUJBQW1CLEVBQ25CLEtBQUssSUFBSSxFQUFFO1FBQ1QsTUFBTSxLQUFLLEdBQXdCO1lBQ2pDLFVBQVUsRUFBRSxNQUFNLElBQUEsK0JBQXNCLEVBQ3RDLFNBQVMsRUFDVCw2Q0FBMkIsRUFDM0Isd0NBQXVCLENBQUMsR0FBRyxDQUM1QjtZQUNELG1CQUFtQixFQUFFLE1BQU0sSUFBQSwrQkFBc0IsRUFDL0MsU0FBUyxFQUNULDZDQUEyQixFQUMzQix3Q0FBdUIsQ0FBQyxXQUFXLENBQ3BDO1NBQ0YsQ0FBQTtRQUNELE1BQU0sSUFBQSw4Q0FBMkIsRUFBQyxTQUFTLENBQUMsQ0FBQyx1QkFBdUIsQ0FDbEUsS0FBSyxDQUNOLENBQUE7UUFDRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUMsRUFDRCxFQUFFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxDQUN2QyxDQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBM0JZLFFBQUEsdUJBQXVCLDJCQTJCbkM7QUFFRDs7Ozs7R0FLRztBQUNJLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxFQUN6QyxTQUEwQixFQUNJLEVBQUU7SUFDaEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLElBQUEsOENBQTJCLEVBQ3RDLFNBQVMsQ0FDVixDQUFDLHFCQUFxQixFQUFFLENBQUE7SUFDM0IsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUM7WUFDSCxTQUFTO2lCQUNOLE9BQU8sQ0FDTixpQ0FBeUIsQ0FBQyxNQUFNLENBQ2pDO2lCQUNBLElBQUksQ0FDSCxtR0FDRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUN2RCxFQUFFLENBQ0gsQ0FBQTtRQUNMLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCwyRUFBMkU7UUFDN0UsQ0FBQztRQUNELE9BQU8sZUFBZSxDQUFBO0lBQ3hCLENBQUM7QUFDSCxDQUFDLENBQUE7QUF2QlksUUFBQSxzQkFBc0IsMEJBdUJsQyJ9
|