@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.
Files changed (149) hide show
  1. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginActionsSection.d.ts +1 -1
  2. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginFeaturesCard.d.ts +1 -1
  3. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginHubCard.d.ts +1 -1
  4. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginSettingsForm.d.ts +1 -1
  5. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginStatusChips.d.ts +1 -1
  6. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/ShopMasterDataBanner.d.ts +1 -1
  7. package/.medusa/server/src/admin/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +1 -1
  8. package/.medusa/server/src/admin/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +1 -1
  9. package/.medusa/server/src/admin/admin-components/features/plugin-features/hooks/usePluginSwitch.d.ts +1 -1
  10. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/action-runs.d.ts +1 -1
  11. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +1 -1
  12. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/plugin-features-admin-client.js +1 -1
  13. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/plugin-view.d.ts +1 -1
  14. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/settings-draft.d.ts +1 -1
  15. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/settings-layout.d.ts +1 -1
  16. package/.medusa/server/src/admin/index.js +4 -4
  17. package/.medusa/server/src/admin/index.mjs +4 -4
  18. package/.medusa/server/src/api/admin/draft-orders/[id]/order-confirmation/route.js +2 -2
  19. package/.medusa/server/src/api/admin/email/attachments/[id]/mail-kinds/route.js +2 -2
  20. package/.medusa/server/src/api/admin/email/attachments/[id]/route.js +2 -2
  21. package/.medusa/server/src/api/admin/email/attachments/[id]/versions/route.js +2 -2
  22. package/.medusa/server/src/api/admin/email/attachments/route.js +2 -2
  23. package/.medusa/server/src/api/admin/email/messages/[id]/resends/route.js +2 -2
  24. package/.medusa/server/src/api/admin/email/messages/[id]/route.js +2 -2
  25. package/.medusa/server/src/api/admin/email/messages/route.js +2 -2
  26. package/.medusa/server/src/api/admin/email/templates/[kind]/preview/route.js +2 -2
  27. package/.medusa/server/src/api/admin/email/templates/[kind]/route.js +2 -2
  28. package/.medusa/server/src/api/admin/email/templates/[kind]/send-test/route.js +2 -2
  29. package/.medusa/server/src/api/admin/email/templates/[kind]/test-sources/route.js +2 -2
  30. package/.medusa/server/src/api/admin/email/templates/route.js +2 -2
  31. package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/actions/[action_key]/route.js +2 -2
  32. package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/actions/[action_key]/runs/route.js +2 -2
  33. package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/route.js +2 -2
  34. package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/settings/route.js +2 -2
  35. package/.medusa/server/src/api/admin/plugin-features/route.js +2 -2
  36. package/.medusa/server/src/api/admin/tax-compliance/customer-addresses/[address_id]/tax-identification/route.js +15 -0
  37. package/.medusa/server/src/api/admin-first-login-password-policy.js +2 -2
  38. package/.medusa/server/src/api/answer-code-provider-route-not-found.js +2 -2
  39. package/.medusa/server/src/api/check-customer-address-tax-identification.js +93 -0
  40. package/.medusa/server/src/api/code-account-password-routes.js +2 -2
  41. package/.medusa/server/src/api/customer-address-identification-response.js +14 -0
  42. package/.medusa/server/src/api/middlewares.js +61 -7
  43. package/.medusa/server/src/api/password-policy.js +2 -2
  44. package/.medusa/server/src/api/plugin-actions.js +2 -2
  45. package/.medusa/server/src/api/plugin-features-http.js +2 -2
  46. package/.medusa/server/src/api/require-login-code-customer-email.js +2 -2
  47. package/.medusa/server/src/api/store/carts/[id]/completion-check/route.js +2 -2
  48. package/.medusa/server/src/api/store/carts/[id]/tax-identification/route.js +179 -0
  49. package/.medusa/server/src/api/store/customer-auth/password-policy/route.js +2 -2
  50. package/.medusa/server/src/api/store/customers/me/addresses/[address_id]/tax-identification/route.js +12 -0
  51. package/.medusa/server/src/api/store/customers/me/tax-identifications/route.js +14 -0
  52. package/.medusa/server/src/api/store/plugin-features/[plugin_key]/route.js +2 -2
  53. package/.medusa/server/src/api/store/plugin-features/route.js +2 -2
  54. package/.medusa/server/src/api/store/tax-identification-policy/route.js +21 -0
  55. package/.medusa/server/src/api/tax-identification-message.js +9 -0
  56. package/.medusa/server/src/api/to-response-amount.js +19 -0
  57. package/.medusa/server/src/customer-auth/application/prepare-code-account-password-reset.js +2 -2
  58. package/.medusa/server/src/customer-auth/application/request-login-code.js +2 -2
  59. package/.medusa/server/src/customer-auth/customer-password-policy.js +2 -2
  60. package/.medusa/server/src/customer-auth/domain/auth-methods.js +2 -2
  61. package/.medusa/server/src/customer-auth/domain/login-code.js +2 -2
  62. package/.medusa/server/src/customer-auth/login-code-state.js +2 -2
  63. package/.medusa/server/src/customer-auth/plugin-features.js +2 -2
  64. package/.medusa/server/src/documents/paths/documents.js +2 -2
  65. package/.medusa/server/src/documents/schemas/documents.js +2 -2
  66. package/.medusa/server/src/email/application/deliver-login-code.js +2 -2
  67. package/.medusa/server/src/email/domain/business-keys.js +2 -2
  68. package/.medusa/server/src/email/templates/blocks/render-document.js +2 -2
  69. package/.medusa/server/src/email/templates/render.js +2 -2
  70. package/.medusa/server/src/email/templates/validate.js +2 -2
  71. package/.medusa/server/src/email/types/template-data.js +2 -2
  72. package/.medusa/server/src/jobs/tax-compliance-state-sync.js +26 -0
  73. package/.medusa/server/src/modules/documents/service.js +2 -2
  74. package/.medusa/server/src/modules/email/domain/attachment.js +2 -2
  75. package/.medusa/server/src/modules/email/service.js +3 -3
  76. package/.medusa/server/src/modules/tax-compliance/domain/validation-policy.js +48 -0
  77. package/.medusa/server/src/modules/tax-compliance/index.js +15 -0
  78. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814120459.js +18 -0
  79. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814121724.js +14 -0
  80. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814153410.js +14 -0
  81. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260929091620.js +27 -0
  82. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20261011090147.js +16 -0
  83. package/.medusa/server/src/modules/tax-compliance/models/tax-compliance-state.js +29 -0
  84. package/.medusa/server/src/modules/tax-compliance/models/tax-compliance-validation.js +74 -0
  85. package/.medusa/server/src/modules/tax-compliance/runtime-settings.js +43 -0
  86. package/.medusa/server/src/modules/tax-compliance/service.js +693 -0
  87. package/.medusa/server/src/providers/email-otp/service.js +2 -2
  88. package/.medusa/server/src/providers/tax-compliance/index.js +11 -0
  89. package/.medusa/server/src/providers/tax-compliance/service.js +179 -0
  90. package/.medusa/server/src/public/constants.js +4 -2
  91. package/.medusa/server/src/public/index.js +6 -2
  92. package/.medusa/server/src/public/shop-config.js +6 -6
  93. package/.medusa/server/src/public/tax-compliance.js +22 -0
  94. package/.medusa/server/src/shared/lib/index.js +2 -1
  95. package/.medusa/server/src/shared/lib/optional-registration.js +34 -0
  96. package/.medusa/server/src/shop-config/{build-food-shop-config.js → build-shop-config.js} +15 -18
  97. package/.medusa/server/src/shop-config/options.js +4 -4
  98. package/.medusa/server/src/subscribers/affiliate-application-submitted.js +2 -2
  99. package/.medusa/server/src/subscribers/affiliate-consignment-reminder-due.js +2 -2
  100. package/.medusa/server/src/subscribers/documents-order-cancellation-ready.js +2 -2
  101. package/.medusa/server/src/subscribers/documents-refund-ready.js +2 -2
  102. package/.medusa/server/src/subscribers/documents-shipment-invoice-assignment-decided.js +2 -2
  103. package/.medusa/server/src/subscribers/packing-list-allocation-revised.js +2 -2
  104. package/.medusa/server/src/subscribers/tax-compliance-plugin-features-updated.js +25 -0
  105. package/.medusa/server/src/tax-compliance/complete-cart-hooks.js +26 -0
  106. package/.medusa/server/src/tax-compliance/integrations/finanzonline/client.js +222 -0
  107. package/.medusa/server/src/tax-compliance/integrations/finanzonline/validator.js +50 -0
  108. package/.medusa/server/src/tax-compliance/integrations/registry.js +26 -0
  109. package/.medusa/server/src/tax-compliance/integrations/validator.js +19 -0
  110. package/.medusa/server/src/tax-compliance/lib/order-tax-context.js +100 -0
  111. package/.medusa/server/src/tax-compliance/lib/tax-compliance-state.js +59 -0
  112. package/.medusa/server/src/tax-compliance/lib/tax-runtime-settings.js +79 -0
  113. package/.medusa/server/src/tax-compliance/plugin-features.js +73 -0
  114. package/.medusa/server/src/tax-compliance/resolve-services.js +7 -0
  115. package/.medusa/server/src/tax-compliance/types/tax-compliance.js +6 -0
  116. package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +25 -30
  117. package/.medusa/server/src/workflows/documents/issue-packing-list.js +3 -14
  118. package/.medusa/server/src/workflows/hooks/cart-tax-context.js +78 -0
  119. package/.medusa/server/src/workflows/hooks/order-tax-context.js +7 -0
  120. package/.medusa/server/src/workflows/hooks/shipping-tax-apportionment.js +145 -0
  121. package/.medusa/server/src/workflows/tax-compliance/apportion-order-shipping-tax.js +72 -0
  122. package/.medusa/server/src/workflows/tax-compliance/domain/requires-frozen-tax-evidence.js +27 -0
  123. package/.medusa/server/src/workflows/tax-compliance/freeze-order-evidence.js +125 -0
  124. package/.medusa/server/src/workflows/tax-compliance/submit-customer-address-tax-identification.js +18 -0
  125. package/.medusa/server/src/workflows/tax-compliance/submit-tax-identification.js +18 -0
  126. package/README.md +393 -61
  127. package/dist/customer-auth/domain/auth-methods.js +1 -1
  128. package/dist/customer-auth/plugin-features.js +1 -1
  129. package/dist/documents/types/admin-api.d.ts +1 -1
  130. package/dist/documents/types/document-summary.d.ts +1 -1
  131. package/dist/documents/types/store-api.d.ts +1 -1
  132. package/dist/email/types/template-data.js +1 -1
  133. package/dist/public/constants.d.ts +2 -0
  134. package/dist/public/constants.js +3 -1
  135. package/dist/public/index.d.ts +2 -1
  136. package/dist/public/index.js +5 -1
  137. package/dist/public/shop-config.d.ts +4 -4
  138. package/dist/public/shop-config.js +5 -5
  139. package/dist/public/tax-compliance.d.ts +30 -0
  140. package/dist/public/tax-compliance.js +21 -0
  141. package/dist/shared/lib/index.d.ts +1 -0
  142. package/dist/shared/lib/index.js +1 -0
  143. package/dist/shared/lib/optional-registration.d.ts +18 -0
  144. package/dist/shared/lib/optional-registration.js +33 -0
  145. package/dist/shop-config/{build-food-shop-config.d.ts → build-shop-config.d.ts} +12 -12
  146. package/dist/shop-config/{build-food-shop-config.js → build-shop-config.js} +14 -17
  147. package/dist/shop-config/options.d.ts +3 -3
  148. package/dist/shop-config/options.js +3 -3
  149. 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-food-supplements-contracts/events/documents");
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnRzLXNoaXBtZW50LWludm9pY2UtYXNzaWdubWVudC1kZWNpZGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL2RvY3VtZW50cy1zaGlwbWVudC1pbnZvaWNlLWFzc2lnbm1lbnQtZGVjaWRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFhQSx3REF1QkM7QUFwQ0Qsc0NBQW1EO0FBS25ELGtHQUc0RTtBQUU1RSw4REFBK0Q7QUFDL0Qsc0ZBQXlGO0FBRTFFLEtBQUssVUFBVSxxQ0FBcUMsQ0FBQyxFQUNsRSxLQUFLLEVBQ0wsU0FBUyxHQUNlO0lBQ3hCLElBQUksQ0FBQztRQUNILElBQ0UsQ0FBQyxDQUFDLE1BQU0sSUFBQSwrQkFBc0IsRUFDNUIsU0FBUyxFQUNULHFDQUFtQixFQUNuQixhQUFhLENBQ2QsQ0FBQyxFQUNGLENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLGdFQUFvRCxDQUFDLEtBQUssQ0FDeEUsS0FBSyxDQUFDLElBQUksQ0FDWCxDQUFDO1FBQ0YsTUFBTSxJQUFBLHFEQUE0QixFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNoRCxLQUFLLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFO1NBQzNDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDM0UsQ0FBQztBQUNILENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBcUI7SUFDdEMsS0FBSyxFQUFFLCtEQUFtRDtDQUMzRCxDQUFDIn0=
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-food-supplements-contracts/events/batch-management");
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2luZy1saXN0LWFsbG9jYXRpb24tcmV2aXNlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9wYWNraW5nLWxpc3QtYWxsb2NhdGlvbi1yZXZpc2VkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWVBLHlEQWlDQztBQWhERCxzQ0FBa0Q7QUFNbEQscURBQXFFO0FBQ3JFLGdIQUdrRjtBQUVsRixrRUFBc0U7QUFDdEUsa0ZBQW9GO0FBRXJFLEtBQUssVUFBVSxzQ0FBc0MsQ0FBQyxFQUNuRSxLQUFLLEVBQ0wsU0FBUyxHQUNlO0lBQ3hCLElBQ0UsQ0FBQyxDQUFDLE1BQU0sSUFBQSwrQkFBc0IsRUFDNUIsU0FBUyxFQUNULHlDQUF1QixFQUN2QixlQUFlLENBQ2hCLENBQUMsRUFDRixDQUFDO1FBQ0QsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyx5RUFBc0QsQ0FBQyxLQUFLLENBQ3ZFLEtBQUssQ0FBQyxJQUFJLENBQ1gsQ0FBQTtJQUVELElBQUksQ0FBQztRQUNILE1BQU0sSUFBQSw2Q0FBd0IsRUFBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDNUMsS0FBSyxFQUFFO2dCQUNMLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO2FBQ3BDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFTLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzFFLE1BQU0sQ0FBQyxLQUFLLENBQ1Ysb0NBQW9DLElBQUksQ0FBQyxRQUFRLDJCQUEyQixJQUFJLENBQUMsY0FBYyxFQUFFLEVBQ2pHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQzFELENBQUE7UUFDRCxNQUFNLEtBQUssQ0FBQTtJQUNiLENBQUM7QUFDSCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQXFCO0lBQ3RDLEtBQUssRUFBRSx3RUFBcUQ7Q0FDN0QsQ0FBQSJ9
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