@hartl-services/medusa-base 2.11.0 → 3.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 (68) hide show
  1. package/.medusa/server/src/admin/index.js +39 -39
  2. package/.medusa/server/src/admin/index.mjs +39 -39
  3. package/.medusa/server/src/api/admin/tax-compliance/customer-addresses/[address_id]/tax-identification/route.js +15 -0
  4. package/.medusa/server/src/api/check-customer-address-tax-identification.js +93 -0
  5. package/.medusa/server/src/api/customer-address-identification-response.js +14 -0
  6. package/.medusa/server/src/api/middlewares.js +55 -1
  7. package/.medusa/server/src/api/store/carts/[id]/tax-identification/route.js +179 -0
  8. package/.medusa/server/src/api/store/customers/me/addresses/[address_id]/tax-identification/route.js +12 -0
  9. package/.medusa/server/src/api/store/customers/me/tax-identifications/route.js +14 -0
  10. package/.medusa/server/src/api/store/tax-identification-policy/route.js +21 -0
  11. package/.medusa/server/src/api/tax-identification-message.js +9 -0
  12. package/.medusa/server/src/api/to-response-amount.js +19 -0
  13. package/.medusa/server/src/jobs/tax-compliance-state-sync.js +26 -0
  14. package/.medusa/server/src/modules/tax-compliance/domain/validation-policy.js +48 -0
  15. package/.medusa/server/src/modules/tax-compliance/index.js +15 -0
  16. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814120459.js +18 -0
  17. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814121724.js +14 -0
  18. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814153410.js +14 -0
  19. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260929091620.js +27 -0
  20. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20261011090147.js +16 -0
  21. package/.medusa/server/src/modules/tax-compliance/models/tax-compliance-state.js +29 -0
  22. package/.medusa/server/src/modules/tax-compliance/models/tax-compliance-validation.js +74 -0
  23. package/.medusa/server/src/modules/tax-compliance/runtime-settings.js +43 -0
  24. package/.medusa/server/src/modules/tax-compliance/service.js +693 -0
  25. package/.medusa/server/src/providers/tax-compliance/index.js +11 -0
  26. package/.medusa/server/src/providers/tax-compliance/service.js +179 -0
  27. package/.medusa/server/src/public/constants.js +4 -2
  28. package/.medusa/server/src/public/index.js +6 -2
  29. package/.medusa/server/src/public/tax-compliance.js +22 -0
  30. package/.medusa/server/src/shared/lib/index.js +2 -1
  31. package/.medusa/server/src/shared/lib/optional-registration.js +34 -0
  32. package/.medusa/server/src/shop-config/build-food-shop-config.js +6 -9
  33. package/.medusa/server/src/subscribers/tax-compliance-plugin-features-updated.js +25 -0
  34. package/.medusa/server/src/tax-compliance/complete-cart-hooks.js +26 -0
  35. package/.medusa/server/src/tax-compliance/integrations/finanzonline/client.js +222 -0
  36. package/.medusa/server/src/tax-compliance/integrations/finanzonline/validator.js +50 -0
  37. package/.medusa/server/src/tax-compliance/integrations/registry.js +26 -0
  38. package/.medusa/server/src/tax-compliance/integrations/validator.js +19 -0
  39. package/.medusa/server/src/tax-compliance/lib/order-tax-context.js +100 -0
  40. package/.medusa/server/src/tax-compliance/lib/tax-compliance-state.js +59 -0
  41. package/.medusa/server/src/tax-compliance/lib/tax-runtime-settings.js +79 -0
  42. package/.medusa/server/src/tax-compliance/plugin-features.js +73 -0
  43. package/.medusa/server/src/tax-compliance/resolve-services.js +7 -0
  44. package/.medusa/server/src/tax-compliance/types/tax-compliance.js +6 -0
  45. package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +25 -30
  46. package/.medusa/server/src/workflows/documents/issue-packing-list.js +3 -14
  47. package/.medusa/server/src/workflows/hooks/cart-tax-context.js +78 -0
  48. package/.medusa/server/src/workflows/hooks/order-tax-context.js +7 -0
  49. package/.medusa/server/src/workflows/hooks/shipping-tax-apportionment.js +145 -0
  50. package/.medusa/server/src/workflows/tax-compliance/apportion-order-shipping-tax.js +72 -0
  51. package/.medusa/server/src/workflows/tax-compliance/domain/requires-frozen-tax-evidence.js +27 -0
  52. package/.medusa/server/src/workflows/tax-compliance/freeze-order-evidence.js +125 -0
  53. package/.medusa/server/src/workflows/tax-compliance/submit-customer-address-tax-identification.js +18 -0
  54. package/.medusa/server/src/workflows/tax-compliance/submit-tax-identification.js +18 -0
  55. package/README.md +344 -22
  56. package/dist/public/constants.d.ts +2 -0
  57. package/dist/public/constants.js +3 -1
  58. package/dist/public/index.d.ts +2 -1
  59. package/dist/public/index.js +5 -1
  60. package/dist/public/tax-compliance.d.ts +30 -0
  61. package/dist/public/tax-compliance.js +21 -0
  62. package/dist/shared/lib/index.d.ts +1 -0
  63. package/dist/shared/lib/index.js +1 -0
  64. package/dist/shared/lib/optional-registration.d.ts +18 -0
  65. package/dist/shared/lib/optional-registration.js +33 -0
  66. package/dist/shop-config/build-food-shop-config.d.ts +2 -2
  67. package/dist/shop-config/build-food-shop-config.js +5 -8
  68. package/package.json +3 -2
@@ -4414,33 +4414,6 @@ const handle$7 = {
4414
4414
  breadcrumb: () => texts.breadcrumbs.emailAttachments
4415
4415
  };
4416
4416
  const EmailAttachmentsRoute = () => /* @__PURE__ */ jsxRuntime.jsx(PluginFeatureRoute, { pluginKey: "email", children: /* @__PURE__ */ jsxRuntime.jsx(EmailAttachmentsPage, {}) });
4417
- const EmailDeliveryPage = () => {
4418
- const query = usePluginFeature("email");
4419
- const plugin2 = query.data?.plugin;
4420
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-3", children: [
4421
- /* @__PURE__ */ jsxRuntime.jsx(
4422
- AdminPageHeader,
4423
- {
4424
- badges: plugin2 && /* @__PURE__ */ jsxRuntime.jsx(ui.StatusBadge, { color: plugin2.configured ? "green" : "orange", children: plugin2.configured ? texts.chips.configured : texts.chips.notConfigured }),
4425
- description: "SMTP oder Microsoft 365.",
4426
- icon: /* @__PURE__ */ jsxRuntime.jsx(icons.PaperPlane, {}),
4427
- title: texts.breadcrumbs.emailDelivery
4428
- }
4429
- ),
4430
- plugin2 ? /* @__PURE__ */ jsxRuntime.jsx(PluginSettingsForm, { plugin: plugin2 }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "p-0", children: /* @__PURE__ */ jsxRuntime.jsx(
4431
- QueryState,
4432
- {
4433
- error: query.error,
4434
- errorText: texts.states.error,
4435
- isLoading: query.isPending,
4436
- loadingText: texts.states.loading
4437
- }
4438
- ) })
4439
- ] });
4440
- };
4441
- const handle$6 = {
4442
- breadcrumb: () => texts.breadcrumbs.emailDelivery
4443
- };
4444
4417
  const LOG_PAGE_SIZE = 20;
4445
4418
  const LOG_MAX_OFFSET = 1e4;
4446
4419
  const LOG_MAX_RESOURCE_ID_LENGTH = 255;
@@ -4668,11 +4641,11 @@ const EmailLogPage = () => {
4668
4641
  ] })
4669
4642
  ] });
4670
4643
  };
4671
- const handle$5 = {
4644
+ const handle$6 = {
4672
4645
  breadcrumb: () => "Protokoll"
4673
4646
  };
4674
4647
  const EmailLogRoute = () => /* @__PURE__ */ jsxRuntime.jsx(PluginFeatureRoute, { pluginKey: "email", children: /* @__PURE__ */ jsxRuntime.jsx(EmailLogPage, {}) });
4675
- const handle$4 = {
4648
+ const handle$5 = {
4676
4649
  breadcrumb: () => EMAIL_TEMPLATE_GROUPS.order.label
4677
4650
  };
4678
4651
  const EmailOrderMailsRoute = () => /* @__PURE__ */ jsxRuntime.jsx(PluginFeatureRoute, { pluginKey: "email", children: /* @__PURE__ */ jsxRuntime.jsx(EmailTemplateGroupPage, { group: "order" }) });
@@ -4680,7 +4653,7 @@ const PluginDetailPage = () => {
4680
4653
  const { plugin_key: pluginKey = "" } = reactRouterDom.useParams();
4681
4654
  return /* @__PURE__ */ jsxRuntime.jsx(PluginPageShell, { pluginKey, variant: "header", children: /* @__PURE__ */ jsxRuntime.jsx(PluginFeatureSections, { pluginKey }) });
4682
4655
  };
4683
- const handle$3 = {
4656
+ const handle$4 = {
4684
4657
  breadcrumb: (match) => /* @__PURE__ */ jsxRuntime.jsx(PluginLabelCrumb, { pluginKey: match.params.plugin_key ?? "" })
4685
4658
  };
4686
4659
  const STATUS_BADGES = {
@@ -5048,13 +5021,40 @@ const EmailAttachmentCrumb = ({
5048
5021
  }).data?.attachments.find((attachment) => attachment.id === attachmentId)?.name;
5049
5022
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: name ?? "Anhang" });
5050
5023
  };
5051
- const handle$2 = {
5024
+ const handle$3 = {
5052
5025
  breadcrumb: (match) => /* @__PURE__ */ jsxRuntime.jsx(EmailAttachmentCrumb, { attachmentId: match.params.id ?? "" })
5053
5026
  };
5054
5027
  const EmailAttachmentRoute = () => {
5055
5028
  const { id } = reactRouterDom.useParams();
5056
5029
  return /* @__PURE__ */ jsxRuntime.jsx(PluginFeatureRoute, { pluginKey: "email", children: /* @__PURE__ */ jsxRuntime.jsx(EmailAttachmentDetailPage, { attachmentId: id ?? "" }) });
5057
5030
  };
5031
+ const EmailDeliveryPage = () => {
5032
+ const query = usePluginFeature("email");
5033
+ const plugin2 = query.data?.plugin;
5034
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-3", children: [
5035
+ /* @__PURE__ */ jsxRuntime.jsx(
5036
+ AdminPageHeader,
5037
+ {
5038
+ badges: plugin2 && /* @__PURE__ */ jsxRuntime.jsx(ui.StatusBadge, { color: plugin2.configured ? "green" : "orange", children: plugin2.configured ? texts.chips.configured : texts.chips.notConfigured }),
5039
+ description: "SMTP oder Microsoft 365.",
5040
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.PaperPlane, {}),
5041
+ title: texts.breadcrumbs.emailDelivery
5042
+ }
5043
+ ),
5044
+ plugin2 ? /* @__PURE__ */ jsxRuntime.jsx(PluginSettingsForm, { plugin: plugin2 }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { className: "p-0", children: /* @__PURE__ */ jsxRuntime.jsx(
5045
+ QueryState,
5046
+ {
5047
+ error: query.error,
5048
+ errorText: texts.states.error,
5049
+ isLoading: query.isPending,
5050
+ loadingText: texts.states.loading
5051
+ }
5052
+ ) })
5053
+ ] });
5054
+ };
5055
+ const handle$2 = {
5056
+ breadcrumb: () => texts.breadcrumbs.emailDelivery
5057
+ };
5058
5058
  const isNotFound = (error) => typeof error === "object" && error !== null && error.status === 404;
5059
5059
  const useResend = (message) => {
5060
5060
  const queryClient = reactQuery.useQueryClient();
@@ -6763,29 +6763,29 @@ const routeModule = {
6763
6763
  path: "/settings/hartl-services/email/attachments",
6764
6764
  handle: handle$7
6765
6765
  },
6766
- {
6767
- Component: EmailDeliveryPage,
6768
- path: "/settings/hartl-services/email/delivery",
6769
- handle: handle$6
6770
- },
6771
6766
  {
6772
6767
  Component: EmailLogRoute,
6773
6768
  path: "/settings/hartl-services/email/log",
6774
- handle: handle$5
6769
+ handle: handle$6
6775
6770
  },
6776
6771
  {
6777
6772
  Component: EmailOrderMailsRoute,
6778
6773
  path: "/settings/hartl-services/email/order",
6779
- handle: handle$4
6774
+ handle: handle$5
6780
6775
  },
6781
6776
  {
6782
6777
  Component: PluginDetailPage,
6783
6778
  path: "/settings/hartl-services/plugin/:plugin_key",
6784
- handle: handle$3
6779
+ handle: handle$4
6785
6780
  },
6786
6781
  {
6787
6782
  Component: EmailAttachmentRoute,
6788
6783
  path: "/settings/hartl-services/email/attachments/:id",
6784
+ handle: handle$3
6785
+ },
6786
+ {
6787
+ Component: EmailDeliveryPage,
6788
+ path: "/settings/hartl-services/email/delivery",
6789
6789
  handle: handle$2
6790
6790
  },
6791
6791
  {
@@ -4408,33 +4408,6 @@ const handle$7 = {
4408
4408
  breadcrumb: () => texts.breadcrumbs.emailAttachments
4409
4409
  };
4410
4410
  const EmailAttachmentsRoute = () => /* @__PURE__ */ jsx(PluginFeatureRoute, { pluginKey: "email", children: /* @__PURE__ */ jsx(EmailAttachmentsPage, {}) });
4411
- const EmailDeliveryPage = () => {
4412
- const query = usePluginFeature("email");
4413
- const plugin2 = query.data?.plugin;
4414
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-y-3", children: [
4415
- /* @__PURE__ */ jsx(
4416
- AdminPageHeader,
4417
- {
4418
- badges: plugin2 && /* @__PURE__ */ jsx(StatusBadge, { color: plugin2.configured ? "green" : "orange", children: plugin2.configured ? texts.chips.configured : texts.chips.notConfigured }),
4419
- description: "SMTP oder Microsoft 365.",
4420
- icon: /* @__PURE__ */ jsx(PaperPlane, {}),
4421
- title: texts.breadcrumbs.emailDelivery
4422
- }
4423
- ),
4424
- plugin2 ? /* @__PURE__ */ jsx(PluginSettingsForm, { plugin: plugin2 }) : /* @__PURE__ */ jsx(Container, { className: "p-0", children: /* @__PURE__ */ jsx(
4425
- QueryState,
4426
- {
4427
- error: query.error,
4428
- errorText: texts.states.error,
4429
- isLoading: query.isPending,
4430
- loadingText: texts.states.loading
4431
- }
4432
- ) })
4433
- ] });
4434
- };
4435
- const handle$6 = {
4436
- breadcrumb: () => texts.breadcrumbs.emailDelivery
4437
- };
4438
4411
  const LOG_PAGE_SIZE = 20;
4439
4412
  const LOG_MAX_OFFSET = 1e4;
4440
4413
  const LOG_MAX_RESOURCE_ID_LENGTH = 255;
@@ -4662,11 +4635,11 @@ const EmailLogPage = () => {
4662
4635
  ] })
4663
4636
  ] });
4664
4637
  };
4665
- const handle$5 = {
4638
+ const handle$6 = {
4666
4639
  breadcrumb: () => "Protokoll"
4667
4640
  };
4668
4641
  const EmailLogRoute = () => /* @__PURE__ */ jsx(PluginFeatureRoute, { pluginKey: "email", children: /* @__PURE__ */ jsx(EmailLogPage, {}) });
4669
- const handle$4 = {
4642
+ const handle$5 = {
4670
4643
  breadcrumb: () => EMAIL_TEMPLATE_GROUPS.order.label
4671
4644
  };
4672
4645
  const EmailOrderMailsRoute = () => /* @__PURE__ */ jsx(PluginFeatureRoute, { pluginKey: "email", children: /* @__PURE__ */ jsx(EmailTemplateGroupPage, { group: "order" }) });
@@ -4674,7 +4647,7 @@ const PluginDetailPage = () => {
4674
4647
  const { plugin_key: pluginKey = "" } = useParams();
4675
4648
  return /* @__PURE__ */ jsx(PluginPageShell, { pluginKey, variant: "header", children: /* @__PURE__ */ jsx(PluginFeatureSections, { pluginKey }) });
4676
4649
  };
4677
- const handle$3 = {
4650
+ const handle$4 = {
4678
4651
  breadcrumb: (match) => /* @__PURE__ */ jsx(PluginLabelCrumb, { pluginKey: match.params.plugin_key ?? "" })
4679
4652
  };
4680
4653
  const STATUS_BADGES = {
@@ -5042,13 +5015,40 @@ const EmailAttachmentCrumb = ({
5042
5015
  }).data?.attachments.find((attachment) => attachment.id === attachmentId)?.name;
5043
5016
  return /* @__PURE__ */ jsx(Fragment, { children: name ?? "Anhang" });
5044
5017
  };
5045
- const handle$2 = {
5018
+ const handle$3 = {
5046
5019
  breadcrumb: (match) => /* @__PURE__ */ jsx(EmailAttachmentCrumb, { attachmentId: match.params.id ?? "" })
5047
5020
  };
5048
5021
  const EmailAttachmentRoute = () => {
5049
5022
  const { id } = useParams();
5050
5023
  return /* @__PURE__ */ jsx(PluginFeatureRoute, { pluginKey: "email", children: /* @__PURE__ */ jsx(EmailAttachmentDetailPage, { attachmentId: id ?? "" }) });
5051
5024
  };
5025
+ const EmailDeliveryPage = () => {
5026
+ const query = usePluginFeature("email");
5027
+ const plugin2 = query.data?.plugin;
5028
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-y-3", children: [
5029
+ /* @__PURE__ */ jsx(
5030
+ AdminPageHeader,
5031
+ {
5032
+ badges: plugin2 && /* @__PURE__ */ jsx(StatusBadge, { color: plugin2.configured ? "green" : "orange", children: plugin2.configured ? texts.chips.configured : texts.chips.notConfigured }),
5033
+ description: "SMTP oder Microsoft 365.",
5034
+ icon: /* @__PURE__ */ jsx(PaperPlane, {}),
5035
+ title: texts.breadcrumbs.emailDelivery
5036
+ }
5037
+ ),
5038
+ plugin2 ? /* @__PURE__ */ jsx(PluginSettingsForm, { plugin: plugin2 }) : /* @__PURE__ */ jsx(Container, { className: "p-0", children: /* @__PURE__ */ jsx(
5039
+ QueryState,
5040
+ {
5041
+ error: query.error,
5042
+ errorText: texts.states.error,
5043
+ isLoading: query.isPending,
5044
+ loadingText: texts.states.loading
5045
+ }
5046
+ ) })
5047
+ ] });
5048
+ };
5049
+ const handle$2 = {
5050
+ breadcrumb: () => texts.breadcrumbs.emailDelivery
5051
+ };
5052
5052
  const isNotFound = (error) => typeof error === "object" && error !== null && error.status === 404;
5053
5053
  const useResend = (message) => {
5054
5054
  const queryClient = useQueryClient();
@@ -6757,29 +6757,29 @@ const routeModule = {
6757
6757
  path: "/settings/hartl-services/email/attachments",
6758
6758
  handle: handle$7
6759
6759
  },
6760
- {
6761
- Component: EmailDeliveryPage,
6762
- path: "/settings/hartl-services/email/delivery",
6763
- handle: handle$6
6764
- },
6765
6760
  {
6766
6761
  Component: EmailLogRoute,
6767
6762
  path: "/settings/hartl-services/email/log",
6768
- handle: handle$5
6763
+ handle: handle$6
6769
6764
  },
6770
6765
  {
6771
6766
  Component: EmailOrderMailsRoute,
6772
6767
  path: "/settings/hartl-services/email/order",
6773
- handle: handle$4
6768
+ handle: handle$5
6774
6769
  },
6775
6770
  {
6776
6771
  Component: PluginDetailPage,
6777
6772
  path: "/settings/hartl-services/plugin/:plugin_key",
6778
- handle: handle$3
6773
+ handle: handle$4
6779
6774
  },
6780
6775
  {
6781
6776
  Component: EmailAttachmentRoute,
6782
6777
  path: "/settings/hartl-services/email/attachments/:id",
6778
+ handle: handle$3
6779
+ },
6780
+ {
6781
+ Component: EmailDeliveryPage,
6782
+ path: "/settings/hartl-services/email/delivery",
6783
6783
  handle: handle$2
6784
6784
  },
6785
6785
  {
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = void 0;
4
+ const check_customer_address_tax_identification_1 = require("../../../../../check-customer-address-tax-identification");
5
+ /**
6
+ * Checks the UID of any customer's saved address again, e.g. when the check
7
+ * was unavailable while the customer applied as a partner.
8
+ */
9
+ const POST = async (req, res) => {
10
+ res
11
+ .status(200)
12
+ .json(await (0, check_customer_address_tax_identification_1.checkCustomerAddressTaxIdentification)(req.scope, req.params.address_id));
13
+ };
14
+ exports.POST = POST;
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3RheC1jb21wbGlhbmNlL2N1c3RvbWVyLWFkZHJlc3Nlcy9bYWRkcmVzc19pZF0vdGF4LWlkZW50aWZpY2F0aW9uL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU9BLHdIQUFnSDtBQUVoSDs7O0dBR0c7QUFDSSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQ3ZCLEdBQStCLEVBQy9CLEdBQW1FLEVBQ3BELEVBQUU7SUFDakIsR0FBRztTQUNBLE1BQU0sQ0FBQyxHQUFHLENBQUM7U0FDWCxJQUFJLENBQ0gsTUFBTSxJQUFBLGlGQUFxQyxFQUN6QyxHQUFHLENBQUMsS0FBSyxFQUNULEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUN0QixDQUNGLENBQUE7QUFDTCxDQUFDLENBQUE7QUFaWSxRQUFBLElBQUksUUFZaEIifQ==
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkCustomerAddressTaxIdentification = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const tax_compliance_1 = require("@hartl-services/medusa-food-supplements-contracts/paths/tax-compliance");
6
+ const tax_compliance_2 = require("@hartl-services/medusa-food-supplements-contracts/schemas/tax-compliance");
7
+ const tax_runtime_settings_1 = require("../tax-compliance/lib/tax-runtime-settings");
8
+ const submit_customer_address_tax_identification_1 = require("../workflows/tax-compliance/submit-customer-address-tax-identification");
9
+ const customer_address_identification_response_1 = require("./customer-address-identification-response");
10
+ const tax_identification_message_1 = require("./tax-identification-message");
11
+ const invalid = (message) => new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, message);
12
+ /**
13
+ * Checks the UID of a saved customer address. Company, UID (address
14
+ * metadata) and address come from the stored address, not from the request,
15
+ * so the evidence always describes the address as it is. With `customerId`
16
+ * only that customer's address is found (Store route); without it any
17
+ * customer's (Admin route), and the evidence belongs to the address's
18
+ * customer.
19
+ */
20
+ const checkCustomerAddressTaxIdentification = async (scope, addressId, customerId) => {
21
+ const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
22
+ const { data } = await query.graph({
23
+ entity: "customer_address",
24
+ fields: [
25
+ "id",
26
+ "customer_id",
27
+ "company",
28
+ "address_1",
29
+ "address_2",
30
+ "city",
31
+ "country_code",
32
+ "postal_code",
33
+ "metadata",
34
+ ],
35
+ filters: customerId
36
+ ? { id: addressId, customer_id: customerId }
37
+ : { id: addressId },
38
+ });
39
+ const address = data[0];
40
+ if (!address) {
41
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Address with id '${addressId}' not found.`);
42
+ }
43
+ const company = tax_compliance_2.SubmitTaxIdentificationSchema.shape.company_name.unwrap().safeParse(address.company ?? "");
44
+ if (!company.success) {
45
+ throw invalid("The address has no company.");
46
+ }
47
+ const vatNumber = tax_compliance_2.SubmitTaxIdentificationSchema.shape.vat_number.unwrap().safeParse(address.metadata?.[tax_compliance_1.TAX_IDENTIFICATION_METADATA_KEY] ?? "");
48
+ if (!vatNumber.success) {
49
+ throw invalid("The address has no valid VAT number.");
50
+ }
51
+ if (!address.address_1?.trim() ||
52
+ !address.city?.trim() ||
53
+ !address.country_code?.trim() ||
54
+ !address.postal_code?.trim()) {
55
+ throw invalid("The address is incomplete.");
56
+ }
57
+ const merchant = await (0, tax_runtime_settings_1.resolveMerchantProfile)(scope, {
58
+ failSafe: true,
59
+ subject: "address tax identification",
60
+ });
61
+ if (!merchant) {
62
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Tax compliance merchant configuration is unavailable.");
63
+ }
64
+ const { result: evidence } = await (0, submit_customer_address_tax_identification_1.submitCustomerAddressTaxIdentificationWorkflow)(scope).run({
65
+ input: {
66
+ customer_address_id: address.id,
67
+ customer_id: address.customer_id,
68
+ company_name: company.data,
69
+ customer_vat_number: vatNumber.data,
70
+ billing_address: {
71
+ address1: address.address_1,
72
+ address2: address.address_2,
73
+ city: address.city,
74
+ countryCode: address.country_code,
75
+ postalCode: address.postal_code,
76
+ },
77
+ merchant_country_code: merchant.countryCode,
78
+ merchant_vat_number: merchant.vatNumber,
79
+ },
80
+ });
81
+ return {
82
+ identification: (0, customer_address_identification_response_1.toCustomerAddressTaxIdentificationWire)({
83
+ customer_address_id: address.id,
84
+ status: evidence.status,
85
+ customer_vat_number: evidence.customer_vat_number,
86
+ company_name: evidence.company_name,
87
+ validated_at: evidence.validated_at,
88
+ }),
89
+ message: (0, tax_identification_message_1.taxIdentificationMessageFor)(evidence.status),
90
+ };
91
+ };
92
+ exports.checkCustomerAddressTaxIdentification = checkCustomerAddressTaxIdentification;
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2stY3VzdG9tZXItYWRkcmVzcy10YXgtaWRlbnRpZmljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL2NoZWNrLWN1c3RvbWVyLWFkZHJlc3MtdGF4LWlkZW50aWZpY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUdrQztBQUVsQywyR0FBd0g7QUFDeEgsNkdBQXdIO0FBR3hILHFGQUFtRjtBQUNuRix1SUFBdUk7QUFDdkkseUdBQW1HO0FBQ25HLDZFQUEwRTtBQWMxRSxNQUFNLE9BQU8sR0FBRyxDQUFDLE9BQWUsRUFBZSxFQUFFLENBQy9DLElBQUksbUJBQVcsQ0FBQyxtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUE7QUFFMUQ7Ozs7Ozs7R0FPRztBQUNJLE1BQU0scUNBQXFDLEdBQUcsS0FBSyxFQUN4RCxLQUFzQixFQUN0QixTQUFpQixFQUNqQixVQUFtQixFQUNzQyxFQUFFO0lBQzNELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDNUQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztRQUNqQyxNQUFNLEVBQUUsa0JBQWtCO1FBQzFCLE1BQU0sRUFBRTtZQUNOLElBQUk7WUFDSixhQUFhO1lBQ2IsU0FBUztZQUNULFdBQVc7WUFDWCxXQUFXO1lBQ1gsTUFBTTtZQUNOLGNBQWM7WUFDZCxhQUFhO1lBQ2IsVUFBVTtTQUNYO1FBQ0QsT0FBTyxFQUFFLFVBQVU7WUFDakIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFO1lBQzVDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUU7S0FDdEIsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxD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
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toCustomerAddressTaxIdentificationWire = void 0;
4
+ /** Only the public result: no provider facts, evidence IDs or merchant data. */
5
+ const toCustomerAddressTaxIdentificationWire = (source) => ({
6
+ customer_address_id: source.customer_address_id,
7
+ status: source.status,
8
+ verified: source.status === "eligible" || source.status === "ineligible",
9
+ vat_number: source.customer_vat_number,
10
+ company_name: source.company_name,
11
+ validated_at: new Date(source.validated_at).toISOString(),
12
+ });
13
+ exports.toCustomerAddressTaxIdentificationWire = toCustomerAddressTaxIdentificationWire;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tZXItYWRkcmVzcy1pZGVudGlmaWNhdGlvbi1yZXNwb25zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcGkvY3VzdG9tZXItYWRkcmVzcy1pZGVudGlmaWNhdGlvbi1yZXNwb25zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFZQSxnRkFBZ0Y7QUFDekUsTUFBTSxzQ0FBc0MsR0FBRyxDQUNwRCxNQUE0QixFQUNVLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxtQkFBbUI7SUFDL0MsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO0lBQ3JCLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVUsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFlBQVk7SUFDeEUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxtQkFBbUI7SUFDdEMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO0lBQ2pDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsV0FBVyxFQUFFO0NBQzFELENBQUMsQ0FBQTtBQVRXLFFBQUEsc0NBQXNDLDBDQVNqRCJ9
@@ -7,9 +7,12 @@ const email_1 = require("@hartl-services/medusa-food-supplements-contracts/schem
7
7
  const customer_auth_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/customer-auth");
8
8
  const customer_verification_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/customer-verification");
9
9
  const files_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/files");
10
+ const tax_compliance_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/tax-compliance");
11
+ const tax_compliance_2 = require("@hartl-services/medusa-food-supplements-contracts/paths/tax-compliance");
10
12
  const plugin_features_2 = require("../customer-auth/plugin-features");
11
13
  const plugin_features_3 = require("../documents/plugin-features");
12
14
  const plugin_features_4 = require("../email/plugin-features");
15
+ const plugin_features_5 = require("../tax-compliance/plugin-features");
13
16
  const customer_verification_request_throttle_1 = require("./customer-verification-request-throttle");
14
17
  const answer_code_provider_route_not_found_1 = require("./answer-code-provider-route-not-found");
15
18
  const answer_actor_type_casing_not_found_1 = require("./answer-actor-type-casing-not-found");
@@ -24,6 +27,11 @@ const public_1 = require("../public");
24
27
  */
25
28
  const documentsGate = (0, public_1.pluginFeatureGate)(plugin_features_3.documentsPluginFeatures);
26
29
  const customerAuthGate = (0, public_1.pluginFeatureGate)(plugin_features_2.customerAuthPluginFeatures);
30
+ // Steuer-Compliance: exact gates with the route's methods, so they touch no
31
+ // other cart or customer route. Tax hooks and complete-cart hooks never read
32
+ // a toggle; they read the stored mirror (tax-compliance/lib/tax-compliance-state.ts).
33
+ const requireB2b = (0, public_1.requirePluginFeature)(plugin_features_5.taxCompliancePluginFeatures, tax_compliance_2.TAX_COMPLIANCE_FEATURES.b2b);
34
+ const requireVatValidation = (0, public_1.requirePluginFeature)(plugin_features_5.taxCompliancePluginFeatures, tax_compliance_2.TAX_COMPLIANCE_FEATURES.vatValidation);
27
35
  // Authentication: Medusa authenticates every /admin route (actor "user";
28
36
  // bearer, session or secret API key) before plugin middlewares run
29
37
  // (framework 2.19.0 http/router.js), so no second `authenticate` here.
@@ -383,6 +391,52 @@ exports.default = (0, http_1.defineMiddlewares)({
383
391
  }),
384
392
  ],
385
393
  },
394
+ // --- Steuer-Compliance ----------------------------------------------
395
+ // The gate runs before the body validation below.
396
+ {
397
+ matcher: "/store/carts/:id/tax-identification",
398
+ methods: ["POST"],
399
+ middlewares: [requireB2b],
400
+ },
401
+ {
402
+ matcher: "/store/carts/:id/tax-identification",
403
+ methods: ["POST"],
404
+ middlewares: [(0, http_1.validateAndTransformBody)(tax_compliance_1.SubmitTaxIdentificationSchema)],
405
+ },
406
+ {
407
+ matcher: "/store/tax-identification-policy",
408
+ methods: ["GET"],
409
+ middlewares: [(0, public_1.requirePluginFeature)(plugin_features_5.taxCompliancePluginFeatures)],
410
+ },
411
+ // Saved customer addresses: UID-check gate first (404 while off, also for
412
+ // guests), then the customer login. Company, UID and address come from
413
+ // the stored address, so there is no body to validate.
414
+ {
415
+ matcher: "/store/customers/me/addresses/:address_id/tax-identification",
416
+ methods: ["POST"],
417
+ middlewares: [
418
+ requireVatValidation,
419
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
420
+ ],
421
+ },
422
+ {
423
+ matcher: "/store/customers/me/tax-identifications",
424
+ methods: ["GET"],
425
+ middlewares: [
426
+ requireVatValidation,
427
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
428
+ ],
429
+ },
430
+ // Admin re-check of any customer's saved address: gate first, then the
431
+ // admin login.
432
+ {
433
+ matcher: "/admin/tax-compliance/customer-addresses/:address_id/tax-identification",
434
+ methods: ["POST"],
435
+ middlewares: [
436
+ requireVatValidation,
437
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
438
+ ],
439
+ },
386
440
  ],
387
441
  });
388
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBS2lDO0FBQ2pDLCtHQUtrRjtBQUNsRixtR0FHNEU7QUFDNUUsMkZBWXdFO0FBQ3hFLDJHQUdnRjtBQUNoRiwySEFBa0k7QUFDbEksMkZBQXVIO0FBRXZILHNFQUE2RTtBQUM3RSxrRUFBc0U7QUFDdEUsOERBQThEO0FBQzlELHFHQUE4RjtBQUM5RixpR0FBd0Y7QUFDeEYsNkZBQW9GO0FBQ3BGLDJGQUFzRjtBQUN0RixpRkFHdUM7QUFDdkMsdURBQXlEO0FBQ3pELDJGQUFtRjtBQUNuRixzQ0FBbUU7QUFFbkU7OztHQUdHO0FBQ0gsTUFBTSxhQUFhLEdBQUcsSUFBQSwwQkFBaUIsRUFBQyx5Q0FBdUIsQ0FBQyxDQUFBO0FBQ2hFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSwwQkFBaUIsRUFBQyw0Q0FBMEIsQ0FBQyxDQUFBO0FBRXRFLHlFQUF5RTtBQUN6RSxtRUFBbUU7QUFDbkUsdUVBQXVFO0FBQ3ZFLDJFQUEyRTtBQUMzRSwwRUFBMEU7QUFDMUUsdUNBQXVDO0FBQ3ZDLGtCQUFlLElBQUEsd0JBQWlCLEVBQUM7SUFDL0IsTUFBTSxFQUFFO1FBQ047WUFDRSxPQUFPLEVBQUUsd0JBQXdCO1lBQ2pDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNqQixXQUFXLEVBQUUsQ0FBQyxJQUFBLCtCQUF3QixFQUFDLDRDQUEwQixDQUFDLENBQUM7U0FDcEU7UUFDRDtZQUNFLE9BQU8sRUFBRSw2Q0FBNkM7WUFDdEQsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2pCLFdBQVcsRUFBRSxDQUFDLElBQUEsK0JBQXdCLEVBQUMsNENBQTBCLENBQUMsQ0FBQztTQUNwRTtRQUNEO1lBQ0UsT0FBTyxFQUFFLHdEQUF3RDtZQUNqRSxPQUFPLEVBQUUsQ0FBQyxNQUFNLENB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
442
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBS2lDO0FBQ2pDLCtHQUtrRjtBQUNsRixtR0FHNEU7QUFDNUUsMkZBWXdFO0FBQ3hFLDJHQUdnRjtBQUNoRiwySEFBa0k7QUFDbEksMkZBQXVIO0FBQ3ZILDZHQUF3SDtBQUN4SCwyR0FBZ0g7QUFFaEgsc0VBQTZFO0FBQzdFLGtFQUFzRTtBQUN0RSw4REFBOEQ7QUFDOUQsdUVBQStFO0FBQy9FLHFHQUE4RjtBQUM5RixpR0FBd0Y7QUFDeEYsNkZBQW9GO0FBQ3BGLDJGQUFzRjtBQUN0RixpRkFHdUM7QUFDdkMsdURBQXlEO0FBQ3pELDJGQUFtRjtBQUNuRixzQ0FBbUU7QUFFbkU7OztHQUdHO0FBQ0gsTUFBTSxhQUFhLEdBQUcsSUFBQSwwQkFBaUIsRUFBQyx5Q0FBdUIsQ0FBQyxDQUFBO0FBQ2hFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSwwQkFBaUIsRUFBQyw0Q0FBMEIsQ0FBQyxDQUFBO0FBQ3RFLDRFQUE0RTtBQUM1RSw2RUFBNkU7QUFDN0Usc0ZBQXNGO0FBQ3RGLE1BQU0sVUFBVSxHQUFHLElBQUEsNkJBQW9CLEVBQ3JDLDZDQUEyQixFQUMzQix3Q0FBdUIsQ0FBQyxHQUFHLENBQzVCLENBQUE7QUFDRCxNQUFNLG9CQUFvQixHQUFHLElBQUEsNkJBQW9CLEVBQy9DLDZDQUEyQixFQUMzQix3Q0FBdUIsQ0FBQyxhQUFhLENBQ3RDLENBQUE7QUFFRCx5RUFBeUU7QUFDekUsbUVBQW1FO0FBQ25FLHVFQUF1RTtBQUN2RSwyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLHVDQUF1QztBQUN2QyxrQkFBZSxJQUFBLHdCQUFpQixFQUFDO0lBQy9CLE1BQU0sRUFBRTtRQUNOO1lBQ0UsT0FBTyxFQUFFLHdCQUF3QjtZQUNqQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENB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