@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
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveShippingRateContext = exports.withLineDiscounts = exports.netLineAmount = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const service_1 = require("../../providers/tax-compliance/service");
6
+ /**
7
+ * Net amount of a line after its discounts (the "Entgelt" shipping is split
8
+ * by), computed like Medusa's line item totals (@medusajs/utils
9
+ * totals/line-item and totals/adjustment): a tax-inclusive price or discount
10
+ * is reduced by the line's rate.
11
+ */
12
+ const netLineAmount = (item, ratePercent) => {
13
+ const divisor = utils_1.MathBN.add(1, utils_1.MathBN.div(ratePercent, 100));
14
+ const toNet = (amount, isTaxInclusive) => isTaxInclusive ? utils_1.MathBN.div(amount, divisor) : utils_1.MathBN.convert(amount);
15
+ const subtotal = toNet(utils_1.MathBN.mult(item.unit_price ?? 0, item.quantity ?? 0), item.is_tax_inclusive);
16
+ return (item.adjustments ?? []).reduce((net, adjustment) => utils_1.MathBN.sub(net, toNet(adjustment.amount ?? 0, adjustment.is_tax_inclusive)), subtotal);
17
+ };
18
+ exports.netLineAmount = netLineAmount;
19
+ /**
20
+ * Adds the price type and discounts `netLineAmount` needs to items from a
21
+ * workflow payload that does not select them. Fail-safe: when the query
22
+ * fails the items stay as they are and count as net and undiscounted.
23
+ */
24
+ const withLineDiscounts = async (container, entity, id, items) => {
25
+ if (items.length === 0) {
26
+ return [...items];
27
+ }
28
+ try {
29
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
30
+ const { data } = await query.graph({
31
+ entity,
32
+ filters: { id },
33
+ fields: [
34
+ "items.id",
35
+ "items.is_tax_inclusive",
36
+ "items.adjustments.amount",
37
+ "items.adjustments.is_tax_inclusive",
38
+ ],
39
+ });
40
+ const loaded = new Map((data[0]
41
+ ?.items ?? []).map((item) => [item.id, item]));
42
+ return items.map((item) => {
43
+ const discounts = loaded.get(item.id);
44
+ return discounts
45
+ ? {
46
+ ...item,
47
+ is_tax_inclusive: discounts.is_tax_inclusive,
48
+ adjustments: discounts.adjustments,
49
+ }
50
+ : item;
51
+ });
52
+ }
53
+ catch {
54
+ return [...items];
55
+ }
56
+ };
57
+ exports.withLineDiscounts = withLineDiscounts;
58
+ /**
59
+ * Ancillary supplies (shipping) share the tax treatment of the main supply
60
+ * (AT UStR 2000 Rz 347 / DE UStAE 3.10); with items at several rates the
61
+ * shipping is split by their net amount after discounts, which one rate
62
+ * weighted by that amount taxes exactly. Medusa's `getItemTaxLinesStep`
63
+ * always resolves item and shipping tax lines through two separate provider
64
+ * calls (@medusajs/core-flows tax/steps/get-item-tax-lines.js calls
65
+ * `taxService.getTaxLines` once for items, once for shipping methods, each
66
+ * with the other list empty), so `TaxComplianceTaxProviderService.getTaxLines`
67
+ * never sees the cart's items while resolving shipping tax lines and cannot
68
+ * apportion the shipping rate on its own. This precomputes the apportioned
69
+ * rate here -- a `setTaxLineContext` hook, which runs once before either of
70
+ * those two calls and still has the full item list -- and hands it to the
71
+ * provider through `additional_context`, which Medusa passes unchanged to
72
+ * both calls.
73
+ */
74
+ const resolveShippingRateContext = async (container, input) => {
75
+ const { items, address, currencyCode, customer, additionalContext } = input;
76
+ if (!address?.country_code || items.length === 0) {
77
+ return additionalContext;
78
+ }
79
+ let taxService;
80
+ try {
81
+ taxService = container.resolve(utils_1.Modules.TAX);
82
+ }
83
+ catch {
84
+ return additionalContext;
85
+ }
86
+ let itemTaxLines;
87
+ try {
88
+ itemTaxLines = await taxService.getTaxLines(items.map((item) => ({
89
+ id: item.id,
90
+ product_id: item.product_id,
91
+ product_type_id: item.product_type_id ?? undefined,
92
+ quantity: item.quantity,
93
+ unit_price: item.unit_price,
94
+ currency_code: currencyCode,
95
+ })), {
96
+ address: {
97
+ country_code: address.country_code,
98
+ province_code: address.province,
99
+ address_1: address.address_1 ?? undefined,
100
+ address_2: address.address_2 ?? undefined,
101
+ city: address.city ?? undefined,
102
+ postal_code: address.postal_code ?? undefined,
103
+ },
104
+ customer: customer
105
+ ? {
106
+ id: customer.id,
107
+ email: customer.email,
108
+ customer_groups: customer.groups?.map((group) => group.id) ?? [],
109
+ metadata: customer.metadata,
110
+ }
111
+ : undefined,
112
+ additional_context: additionalContext,
113
+ });
114
+ }
115
+ catch {
116
+ return additionalContext;
117
+ }
118
+ const rateByItemId = new Map();
119
+ for (const line of itemTaxLines) {
120
+ if (!("line_item_id" in line)) {
121
+ continue;
122
+ }
123
+ rateByItemId.set(line.line_item_id, utils_1.MathBN.add(rateByItemId.get(line.line_item_id) ?? utils_1.MathBN.convert(0), line.rate ?? 0));
124
+ }
125
+ const weighted = items
126
+ .map((item) => {
127
+ const rate = rateByItemId.get(item.id) ?? utils_1.MathBN.convert(0);
128
+ return { base: (0, exports.netLineAmount)(item, rate), rate };
129
+ })
130
+ .filter((entry) => utils_1.MathBN.gt(entry.base, 0));
131
+ if (weighted.length === 0) {
132
+ return additionalContext;
133
+ }
134
+ const totalBase = weighted.reduce((sum, entry) => utils_1.MathBN.add(sum, entry.base), utils_1.MathBN.convert(0));
135
+ if (utils_1.MathBN.lte(totalBase, 0)) {
136
+ return additionalContext;
137
+ }
138
+ const weightedRateSum = weighted.reduce((sum, entry) => utils_1.MathBN.add(sum, utils_1.MathBN.mult(entry.base, entry.rate)), utils_1.MathBN.convert(0));
139
+ return {
140
+ ...additionalContext,
141
+ [service_1.SHIPPING_TAX_RATE_CONTEXT_KEY]: utils_1.MathBN.div(weightedRateSum, totalBase).toNumber(),
142
+ };
143
+ };
144
+ exports.resolveShippingRateContext = resolveShippingRateContext;
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hpcHBpbmctdGF4LWFwcG9ydGlvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2hvb2tzL3NoaXBwaW5nLXRheC1hcHBvcnRpb25tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBLHFEQUlrQztBQUVsQyxvRUFBc0Y7QUFnQnRGOzs7OztHQUtHO0FBQ0ksTUFBTSxhQUFhLEdBQUcsQ0FDM0IsSUFBNkIsRUFDN0IsV0FBOEMsRUFDWCxFQUFFO0lBQ3JDLE1BQU0sT0FBTyxHQUFHLGNBQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGNBQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDM0QsTUFBTSxLQUFLLEdBQUcsQ0FDWixNQUErRCxFQUMvRCxjQUErQixFQUMvQixFQUFFLENBQ0YsY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUV2RSxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQ3BCLGNBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsRUFDckQsSUFBSSxDQUFDLGdCQUFnQixDQUN0QixDQUFBO0lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUNwQyxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUNsQixjQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFDN0UsUUFBUSxDQUNULENBQUE7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
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.apportionOrderShippingTaxStep = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
+ const lib_1 = require("../../shared/lib");
7
+ const order_tax_context_1 = require("../../tax-compliance/lib/order-tax-context");
8
+ const tax_compliance_state_1 = require("../../tax-compliance/lib/tax-compliance-state");
9
+ const service_1 = require("../../providers/tax-compliance/service");
10
+ const warnApportionmentUnavailable = (container, orderId, error) => {
11
+ try {
12
+ container
13
+ .resolve(utils_1.ContainerRegistrationKeys.LOGGER)
14
+ .warn(`Shipping tax of order ${orderId} keeps the cart's apportioned rate; recalculating it failed: ${error instanceof Error ? error.message : String(error)}`);
15
+ }
16
+ catch {
17
+ // Logging must not replace the original workflow outcome.
18
+ }
19
+ };
20
+ /**
21
+ * Medusa taxes a cart before it applies promotions (refreshCartItemsWorkflow
22
+ * runs the tax lines before updateCartPromotionsWorkflow), and redeeming a
23
+ * code through `POST /store/carts/:id/promotions` recalculates no tax at
24
+ * all, so the cart's apportioned shipping rate can be weighted by
25
+ * discounts that are no longer current. Once the order exists its discounts
26
+ * are final: this sets the rate of its apportioned shipping tax lines from
27
+ * them, through the same order tax context an order edit uses. Only
28
+ * tax-inclusive shipping, whose gross amount (and so the paid total) the
29
+ * rate does not change. Medusa's partial order tax recalculation would add
30
+ * lines instead of replacing them (setOrderTaxLinesForItemsStep upserts), so
31
+ * the existing lines are updated in place. Fail-safe: on error the order
32
+ * keeps the cart's rate.
33
+ */
34
+ exports.apportionOrderShippingTaxStep = (0, workflows_sdk_1.createStep)("apportion-tax-compliance-order-shipping-tax", async (input, { container }) => {
35
+ try {
36
+ if (!(await (0, tax_compliance_state_1.readTaxComplianceState)(container)).shipping_tax_active) {
37
+ return new workflows_sdk_1.StepResponse(undefined);
38
+ }
39
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
40
+ const { data } = await query.graph({
41
+ entity: "order",
42
+ filters: { id: input.order_id },
43
+ fields: [
44
+ "shipping_methods.is_tax_inclusive",
45
+ "shipping_methods.tax_lines.id",
46
+ "shipping_methods.tax_lines.code",
47
+ ],
48
+ });
49
+ const taxLineIds = (data[0]?.shipping_methods ?? []).flatMap((method) => method?.is_tax_inclusive
50
+ ? (method.tax_lines ?? []).flatMap((taxLine) => taxLine?.code === lib_1.APPORTIONED_SHIPPING_TAX_CODE
51
+ ? [taxLine.id]
52
+ : [])
53
+ : []);
54
+ if (taxLineIds.length === 0) {
55
+ return new workflows_sdk_1.StepResponse(undefined);
56
+ }
57
+ const rate = (await (0, order_tax_context_1.createOrderTaxContextFromContainer)(container, {
58
+ id: input.order_id,
59
+ }))?.[service_1.SHIPPING_TAX_RATE_CONTEXT_KEY];
60
+ if (typeof rate !== "number" || !Number.isFinite(rate)) {
61
+ throw new Error("No apportioned shipping rate for the order.");
62
+ }
63
+ await container
64
+ .resolve(utils_1.Modules.ORDER)
65
+ .upsertOrderShippingMethodTaxLines(taxLineIds.map((id) => ({ id, rate })));
66
+ }
67
+ catch (error) {
68
+ warnApportionmentUnavailable(container, input.order_id, error);
69
+ }
70
+ return new workflows_sdk_1.StepResponse(undefined);
71
+ });
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwb3J0aW9uLW9yZGVyLXNoaXBwaW5nLXRheC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvdGF4LWNvbXBsaWFuY2UvYXBwb3J0aW9uLW9yZGVyLXNoaXBwaW5nLXRheC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBOEU7QUFDOUUscUVBQTRFO0FBQzVFLDBDQUFnRTtBQUVoRSxrRkFBK0Y7QUFDL0Ysd0ZBQXNGO0FBQ3RGLG9FQUFzRjtBQVd0RixNQUFNLDRCQUE0QixHQUFHLENBQ25DLFNBQTBCLEVBQzFCLE9BQWUsRUFDZixLQUFjLEVBQ1IsRUFBRTtJQUNSLElBQUksQ0FBQztRQUNILFNBQVM7YUFDTixPQUFPLENBQ04saUNBQXlCLENBQUMsTUFBTSxDQUNqQzthQUNBLElBQUksQ0FDSCx5QkFBeUIsT0FBTyxnRUFBZ0UsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ3pKLENBQUE7SUFDTCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsMERBQTBEO0lBQzVELENBQUM7QUFDSCxDQUFDLENBQUE7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ1UsUUFBQSw2QkFBNkIsR0FBRyxJQUFBLDBCQUFVLEVBQ3JELDZDQUE2QyxFQUM3QyxLQUFLLEVBQUUsS0FBcUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDN0QsSUFBSSxDQUFDO1FBQ0gsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFBLDZDQUFzQixFQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNuRSxPQUFPLElBQUksNEJBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNwQyxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNoRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ2pDLE1BQU0sRUFBRSxPQUFPO1lBQ2YsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDL0IsTUFBTSxFQUFFO2dCQUNOLG1DQUFtQztnQkFDbkMsK0JBQStCO2dCQUMvQixpQ0FBaUM7YUFDbEM7U0FDRixDQUFDLENBQUE7UUFDRixNQUFNLFVBQVUsR0FBRyxDQUNoQixJQUFJLENBQUMsQ0FBQyxDQUFzQyxFQUFFLGdCQUFnQixJQUFJLEVBQUUsQ0FDdEUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUNuQixNQUFNLEVBQUUsZ0JBQWdCO1lBQ3RCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDM0MsT0FBTyxFQUFFLElBQUksS0FBSyxtQ0FBNkI7Z0JBQzdDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ2QsQ0FBQyxDQUFDLEVBQUUsQ0FDUDtZQUNILENBQUMsQ0FBQyxFQUFFLENBQ1AsQ0FBQTtRQUNELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QixPQUFPLElBQUksNEJBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNwQyxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsQ0FDWCxNQUFNLElBQUEsc0RBQWtDLEVBQUMsU0FBUyxFQUFFO1lBQ2xELEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUTtTQUNuQixDQUFDLENBQ0gsRUFBRSxDQUFDLHVDQUE2QixDQUFDLENBQUE7UUFDbEMsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdkQsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFBO1FBQ2hFLENBQUM7UUFFRCxNQUFNLFNBQVM7YUFDWixPQUFPLENBQUMsZUFBTyxDQUFDLEtBQUssQ0FBQzthQUN0QixpQ0FBaUMsQ0FDaEMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ3ZDLENBQUE7SUFDTCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2hFLENBQUM7SUFFRCxPQUFPLElBQUksNEJBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUNwQyxDQUFDLENBQ0YsQ0FBQSJ9
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requiresFrozenTaxEvidence = void 0;
4
+ const isZero = (value) => {
5
+ const numeric = Number(value);
6
+ return Number.isFinite(numeric) && numeric === 0;
7
+ };
8
+ /**
9
+ * An order may only complete with durably frozen tax evidence when the tax
10
+ * provider zero-rated a line whose configured rate is not zero (e.g. an
11
+ * intra-EU B2B reverse charge after a UID validation). A line that is zero
12
+ * because its configured tax rate is zero (e.g. a small-business exemption)
13
+ * is ordinary taxation and needs no evidence. A zero line whose configured
14
+ * rate is unknown fails closed.
15
+ */
16
+ const requiresFrozenTaxEvidence = (lines) => lines.some(({ rate, configuredRate }) => {
17
+ if (!isZero(rate)) {
18
+ return false;
19
+ }
20
+ if (configuredRate === undefined) {
21
+ return true;
22
+ }
23
+ // The provider applies a configured rate without a value as 0.
24
+ return configuredRate !== null && !isZero(configuredRate);
25
+ });
26
+ exports.requiresFrozenTaxEvidence = requiresFrozenTaxEvidence;
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWlyZXMtZnJvemVuLXRheC1ldmlkZW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvdGF4LWNvbXBsaWFuY2UvZG9tYWluL3JlcXVpcmVzLWZyb3plbi10YXgtZXZpZGVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFjLEVBQVcsRUFBRTtJQUN6QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDN0IsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDLENBQUE7QUFDbEQsQ0FBQyxDQUFBO0FBRUQ7Ozs7Ozs7R0FPRztBQUNJLE1BQU0seUJBQXlCLEdBQUcsQ0FDdkMsS0FBc0MsRUFDN0IsRUFBRSxDQUNYLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFO0lBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQixPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFDRCxJQUFJLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFDRCwrREFBK0Q7SUFDL0QsT0FBTyxjQUFjLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFBO0FBQzNELENBQUMsQ0FBQyxDQUFBO0FBWlMsUUFBQSx5QkFBeUIsNkJBWWxDIn0=
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.freezeOrderEvidenceWorkflow = exports.freezeOrderEvidenceStep = exports.FREEZE_TAX_COMPLIANCE_ORDER_EVIDENCE_WORKFLOW_ID = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
+ const complete_cart_hooks_1 = require("../../tax-compliance/complete-cart-hooks");
7
+ Object.defineProperty(exports, "FREEZE_TAX_COMPLIANCE_ORDER_EVIDENCE_WORKFLOW_ID", { enumerable: true, get: function () { return complete_cart_hooks_1.FREEZE_TAX_COMPLIANCE_ORDER_EVIDENCE_WORKFLOW_ID; } });
8
+ const tax_compliance_state_1 = require("../../tax-compliance/lib/tax-compliance-state");
9
+ const tax_runtime_settings_1 = require("../../tax-compliance/lib/tax-runtime-settings");
10
+ const resolve_services_1 = require("../../tax-compliance/resolve-services");
11
+ const apportion_order_shipping_tax_1 = require("./apportion-order-shipping-tax");
12
+ const requires_frozen_tax_evidence_1 = require("./domain/requires-frozen-tax-evidence");
13
+ /**
14
+ * Pairs every cart tax line with the rate configured on the tax rate it came
15
+ * from, so a configured 0 % (e.g. a small-business exemption) can be told
16
+ * apart from a line the provider zero-rated on UID evidence. Lines without a
17
+ * tax rate (the blended shipping rate, derived from the item lines) carry no
18
+ * evidence of their own and are left out.
19
+ */
20
+ const withConfiguredRates = async (container, taxLines) => {
21
+ const rateIds = [
22
+ ...new Set(taxLines.flatMap(({ tax_rate_id }) => (tax_rate_id ? [tax_rate_id] : []))),
23
+ ];
24
+ const configuredRates = new Map();
25
+ if (rateIds.length > 0) {
26
+ const taxRates = await container
27
+ .resolve(utils_1.Modules.TAX)
28
+ .listTaxRates({ id: rateIds }, { select: ["id", "rate"] });
29
+ for (const taxRate of taxRates) {
30
+ configuredRates.set(taxRate.id, taxRate.rate ?? null);
31
+ }
32
+ }
33
+ return taxLines.flatMap(({ rate, tax_rate_id }) => tax_rate_id
34
+ ? [{ rate, configuredRate: configuredRates.get(tax_rate_id) }]
35
+ : []);
36
+ };
37
+ const warnFreezeUnavailable = (container) => {
38
+ try {
39
+ container
40
+ .resolve(utils_1.ContainerRegistrationKeys.LOGGER)
41
+ .warn("Tax evidence freeze is unavailable; continuing without tax evidence.");
42
+ }
43
+ catch {
44
+ // Logging must not replace the original workflow outcome.
45
+ }
46
+ };
47
+ exports.freezeOrderEvidenceStep = (0, workflows_sdk_1.createStep)("freeze-tax-compliance-order-evidence", async (input, { container }) => {
48
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
49
+ const { data } = await query.graph({
50
+ entity: "cart",
51
+ fields: [
52
+ "id",
53
+ "billing_address.address_1",
54
+ "billing_address.address_2",
55
+ "billing_address.city",
56
+ "billing_address.company",
57
+ "billing_address.country_code",
58
+ "billing_address.postal_code",
59
+ "billing_address.metadata",
60
+ "shipping_address.country_code",
61
+ "items.tax_lines.rate",
62
+ "items.tax_lines.tax_rate_id",
63
+ "shipping_methods.tax_lines.rate",
64
+ "shipping_methods.tax_lines.tax_rate_id",
65
+ ],
66
+ filters: { id: input.cart_id },
67
+ });
68
+ const cart = data[0];
69
+ if (!cart) {
70
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Cart with id '${input.cart_id}' not found.`);
71
+ }
72
+ const { items, shipping_methods, ...snapshot } = cart;
73
+ const required = (0, requires_frozen_tax_evidence_1.requiresFrozenTaxEvidence)(await withConfiguredRates(container, [...(items ?? []), ...(shipping_methods ?? [])].flatMap(({ tax_lines }) => tax_lines ?? [])));
74
+ // With `b2b` off an ordinarily taxed order keeps no UID evidence: it
75
+ // would print a reverse-charge note on its invoice and zero-rate a later
76
+ // order edit. A zero-rated order (cart taxed before the switch) still
77
+ // needs its evidence.
78
+ if (!required && !(await (0, tax_compliance_state_1.readTaxComplianceState)(container)).b2b_active) {
79
+ return new workflows_sdk_1.StepResponse(null, null);
80
+ }
81
+ let frozen;
82
+ try {
83
+ // Strict merchant read, only once a current validation record exists:
84
+ // a failure reaches the catch below.
85
+ frozen = await (0, resolve_services_1.resolveTaxComplianceService)(container).freezeOrderEvidence(input.order_id, snapshot, async () => await (0, tax_runtime_settings_1.resolveMerchantProfile)(container, { failSafe: false }));
86
+ }
87
+ catch (error) {
88
+ // A zero-rated order cannot complete without its evidence; an
89
+ // ordinarily taxed B2C order must not fail over auxiliary evidence.
90
+ if (required) {
91
+ throw error;
92
+ }
93
+ warnFreezeUnavailable(container);
94
+ return new workflows_sdk_1.StepResponse(null, null);
95
+ }
96
+ if (!frozen && required) {
97
+ throw new Error("Zero-rated order completion requires durable frozen tax evidence.");
98
+ }
99
+ return new workflows_sdk_1.StepResponse(frozen?.evidence ?? null, frozen
100
+ ? {
101
+ validation_id: frozen.evidence.id,
102
+ previous_order_id: frozen.previousOrderId,
103
+ }
104
+ : null);
105
+ }, async (compensation, { container }) => {
106
+ if (!compensation) {
107
+ return;
108
+ }
109
+ await (0, resolve_services_1.resolveTaxComplianceService)(container).restoreOrderEvidence(compensation.validation_id, compensation.previous_order_id);
110
+ });
111
+ /**
112
+ * complete-cart `orderCreated` participant, run by @hartl-services/medusa-base:
113
+ * freezes the UID evidence, then sets the apportioned shipping tax from the
114
+ * order's final discounts (the base runs one participant per plugin and hook;
115
+ * the recalculation needs the frozen evidence for a zero-rated order).
116
+ */
117
+ exports.freezeOrderEvidenceWorkflow = (0, workflows_sdk_1.createWorkflow)({
118
+ name: complete_cart_hooks_1.FREEZE_TAX_COMPLIANCE_ORDER_EVIDENCE_WORKFLOW_ID,
119
+ ...complete_cart_hooks_1.ORDER_CREATED_PARTICIPANT_WORKFLOW_OPTIONS,
120
+ }, (input) => {
121
+ const evidence = (0, exports.freezeOrderEvidenceStep)(input);
122
+ (0, apportion_order_shipping_tax_1.apportionOrderShippingTaxStep)(input);
123
+ return new workflows_sdk_1.WorkflowResponse(evidence);
124
+ });
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlZXplLW9yZGVyLWV2aWRlbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy90YXgtY29tcGxpYW5jZS9mcmVlemUtb3JkZXItZXZpZGVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBSWtDO0FBQ2xDLHFFQUswQztBQUUxQyxrRkFHaUQ7QUFjeEMsaUlBaEJQLHNFQUFnRCxPQWdCTztBQWJ6RCx3RkFBc0Y7QUFDdEYsd0ZBQXNGO0FBS3RGLDRFQUFtRjtBQUNuRixpRkFBOEU7QUFDOUUsd0ZBRzhDO0FBdUI5Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLG1CQUFtQixHQUFHLEtBQUssRUFDL0IsU0FBMEIsRUFDMUIsUUFBNEMsRUFDWCxFQUFFO0lBQ25DLE1BQU0sT0FBTyxHQUFHO1FBQ2QsR0FBRyxJQUFJLEdBQUcsQ0FDUixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQzFFO0tBQ0YsQ0FBQTtJQUNELE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFBO0lBQ3hELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVM7YUFDN0IsT0FBTyxDQUFDLGVBQU8sQ0FBQyxHQUFHLENBQUM7YUFDcEIsWUFBWSxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUM1RCxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQy9CLGVBQWUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVB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
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.submitCustomerAddressTaxIdentificationWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const tax_runtime_settings_1 = require("../../tax-compliance/lib/tax-runtime-settings");
6
+ const resolve_services_1 = require("../../tax-compliance/resolve-services");
7
+ const validateCustomerAddressTaxIdentificationStep = (0, workflows_sdk_1.createStep)("validate-customer-address-tax-identification", async (input, { container }) => {
8
+ const service = (0, resolve_services_1.resolveTaxComplianceService)(container);
9
+ // Read here, not passed as workflow input, so the credentials never land
10
+ // in the workflow's stored input.
11
+ const credentials = (await service.requiresFinanzOnlineCredentials(input))
12
+ ? await (0, tax_runtime_settings_1.resolveFinanzOnlineCredentials)(container)
13
+ : undefined;
14
+ const evidence = await service.validateCustomerAddress(input, credentials);
15
+ return new workflows_sdk_1.StepResponse(evidence);
16
+ });
17
+ exports.submitCustomerAddressTaxIdentificationWorkflow = (0, workflows_sdk_1.createWorkflow)("submit-customer-address-tax-identification", (input) => new workflows_sdk_1.WorkflowResponse(validateCustomerAddressTaxIdentificationStep(input)));
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibWl0LWN1c3RvbWVyLWFkZHJlc3MtdGF4LWlkZW50aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy90YXgtY29tcGxpYW5jZS9zdWJtaXQtY3VzdG9tZXItYWRkcmVzcy10YXgtaWRlbnRpZmljYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBSzBDO0FBRTFDLHdGQUE4RjtBQUc5Riw0RUFBbUY7QUFFbkYsTUFBTSw0Q0FBNEMsR0FBRyxJQUFBLDBCQUFVLEVBQzdELDhDQUE4QyxFQUM5QyxLQUFLLEVBQ0gsS0FBb0QsRUFDcEQsRUFBRSxTQUFTLEVBQUUsRUFDYixFQUFFO0lBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBQSw4Q0FBMkIsRUFBQyxTQUFTLENBQUMsQ0FBQTtJQUN0RCx5RUFBeUU7SUFDekUsa0NBQWtDO0lBQ2xDLE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsK0JBQStCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEUsQ0FBQyxDQUFDLE1BQU0sSUFBQSxxREFBOEIsRUFBQyxTQUFTLENBQUM7UUFDakQsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNiLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUMxRSxPQUFPLElBQUksNEJBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQTtBQUNuQyxDQUFDLENBQ0YsQ0FBQTtBQUVZLFFBQUEsOENBQThDLEdBQUcsSUFBQSw4QkFBYyxFQUMxRSw0Q0FBNEMsRUFDNUMsQ0FBQyxLQUFvRCxFQUFFLEVBQUUsQ0FDdkQsSUFBSSxnQ0FBZ0IsQ0FDbEIsNENBQTRDLENBQzFDLEtBQUssQ0FDc0MsQ0FDOUMsQ0FDSixDQUFBIn0=
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.submitTaxIdentificationWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const tax_runtime_settings_1 = require("../../tax-compliance/lib/tax-runtime-settings");
6
+ const resolve_services_1 = require("../../tax-compliance/resolve-services");
7
+ const validateTaxIdentificationStep = (0, workflows_sdk_1.createStep)("validate-cart-tax-identification", async (input, { container }) => {
8
+ const service = (0, resolve_services_1.resolveTaxComplianceService)(container);
9
+ // Read here, not passed as workflow input, so the credentials never land
10
+ // in the workflow's stored input.
11
+ const credentials = (await service.requiresFinanzOnlineCredentials(input))
12
+ ? await (0, tax_runtime_settings_1.resolveFinanzOnlineCredentials)(container)
13
+ : undefined;
14
+ const evidence = await service.validateCart(input, credentials);
15
+ return new workflows_sdk_1.StepResponse(evidence);
16
+ });
17
+ exports.submitTaxIdentificationWorkflow = (0, workflows_sdk_1.createWorkflow)("submit-cart-tax-identification", (input) => new workflows_sdk_1.WorkflowResponse(validateTaxIdentificationStep(input)));
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibWl0LXRheC1pZGVudGlmaWNhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvdGF4LWNvbXBsaWFuY2Uvc3VibWl0LXRheC1pZGVudGlmaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFLMEM7QUFFMUMsd0ZBQThGO0FBRzlGLDRFQUFtRjtBQUVuRixNQUFNLDZCQUE2QixHQUFHLElBQUEsMEJBQVUsRUFDOUMsa0NBQWtDLEVBQ2xDLEtBQUssRUFBRSxLQUF5QyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUNqRSxNQUFNLE9BQU8sR0FBRyxJQUFBLDhDQUEyQixFQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3RELHlFQUF5RTtJQUN6RSxrQ0FBa0M7SUFDbEMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUMsTUFBTSxJQUFBLHFEQUE4QixFQUFDLFNBQVMsQ0FBQztRQUNqRCxDQUFDLENBQUMsU0FBUyxDQUFBO0lBQ2IsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUMvRCxPQUFPLElBQUksNEJBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQTtBQUNuQyxDQUFDLENBQ0YsQ0FBQTtBQUVZLFFBQUEsK0JBQStCLEdBQUcsSUFBQSw4QkFBYyxFQUMzRCxnQ0FBZ0MsRUFDaEMsQ0FBQyxLQUF5QyxFQUFFLEVBQUUsQ0FDNUMsSUFBSSxnQ0FBZ0IsQ0FDbEIsNkJBQTZCLENBQUMsS0FBSyxDQUE2QyxDQUNqRixDQUNKLENBQUEifQ==