@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,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
6
+ const lib_1 = require("../../../../../shared/lib");
7
+ const tax_compliance_1 = require("@hartl-services/medusa-food-supplements-contracts/paths/tax-compliance");
8
+ const tax_runtime_settings_1 = require("../../../../../tax-compliance/lib/tax-runtime-settings");
9
+ const validation_policy_1 = require("../../../../../modules/tax-compliance/domain/validation-policy");
10
+ const service_1 = require("../../../../../modules/tax-compliance/service");
11
+ const resolve_services_1 = require("../../../../../tax-compliance/resolve-services");
12
+ const tax_identification_message_1 = require("../../../../tax-identification-message");
13
+ const to_response_amount_1 = require("../../../../to-response-amount");
14
+ const submit_tax_identification_1 = require("../../../../../workflows/tax-compliance/submit-tax-identification");
15
+ const cartFields = [
16
+ "id",
17
+ "currency_code",
18
+ "sales_channel_id",
19
+ "subtotal",
20
+ "discount_total",
21
+ "shipping_total",
22
+ "tax_total",
23
+ "total",
24
+ "billing_address.*",
25
+ "shipping_address.*",
26
+ "items.*",
27
+ "items.tax_lines.*",
28
+ "items.adjustments.*",
29
+ "shipping_methods.*",
30
+ "shipping_methods.tax_lines.*",
31
+ "shipping_methods.adjustments.*",
32
+ "payment_collection.id",
33
+ ];
34
+ const requireCompleteAddress = (address, label) => {
35
+ if (!address?.address_1?.trim() ||
36
+ !address.city?.trim() ||
37
+ !address.country_code?.trim() ||
38
+ !address.postal_code?.trim()) {
39
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `${label} address is incomplete.`);
40
+ }
41
+ return address;
42
+ };
43
+ const loadStoreCart = async (id, scope, allowedSalesChannelIds) => {
44
+ const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
45
+ const { data } = await query.graph({
46
+ entity: "cart",
47
+ fields: cartFields,
48
+ filters: { id },
49
+ });
50
+ const cart = data[0];
51
+ if (!cart || !allowedSalesChannelIds.includes(cart.sales_channel_id)) {
52
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Cart with id '${id}' not found.`);
53
+ }
54
+ return cart;
55
+ };
56
+ /**
57
+ * Checks the UID of the cart's billing address (company and
58
+ * `metadata.vat_number`) and recomputes the cart's tax. Without a UID the cart
59
+ * is taxed ordinarily: an exemption from an earlier check falls away. The
60
+ * deprecated body (`company_name` + `vat_number`) is written into the billing
61
+ * address first.
62
+ */
63
+ const POST = async (req, res) => {
64
+ const allowedSalesChannelIds = req.publishable_key_context.sales_channel_ids ?? [];
65
+ const initialCart = await loadStoreCart(req.params.id, req.scope, allowedSalesChannelIds);
66
+ const { company_name: legacyCompanyName, vat_number: legacyVatNumber } = req.validatedBody;
67
+ if (legacyCompanyName && legacyVatNumber) {
68
+ const billingAddress = requireCompleteAddress(initialCart.billing_address, "Billing");
69
+ requireCompleteAddress(initialCart.shipping_address, "Shipping");
70
+ const vatMetadata = {
71
+ [tax_compliance_1.TAX_IDENTIFICATION_METADATA_KEY]: legacyVatNumber.replace(/\s+/g, ""),
72
+ };
73
+ await (0, core_flows_1.updateCartWorkflow)(req.scope).run({
74
+ input: {
75
+ id: initialCart.id,
76
+ billing_address: billingAddress.id
77
+ ? {
78
+ id: billingAddress.id,
79
+ company: legacyCompanyName,
80
+ metadata: vatMetadata,
81
+ }
82
+ : {
83
+ address_1: billingAddress.address_1,
84
+ city: billingAddress.city,
85
+ company: legacyCompanyName,
86
+ country_code: billingAddress.country_code,
87
+ postal_code: billingAddress.postal_code,
88
+ metadata: vatMetadata,
89
+ },
90
+ },
91
+ });
92
+ }
93
+ const currentCart = await loadStoreCart(req.params.id, req.scope, allowedSalesChannelIds);
94
+ const vatNumber = (0, service_1.readAddressVatNumber)(currentCart.billing_address?.metadata);
95
+ let status = null;
96
+ const merchant = vatNumber
97
+ ? await (0, tax_runtime_settings_1.resolveMerchantProfile)(req.scope, {
98
+ failSafe: true,
99
+ subject: "tax identification",
100
+ })
101
+ : null;
102
+ if (vatNumber && !merchant) {
103
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Tax compliance merchant configuration is unavailable.");
104
+ }
105
+ // A domestic company is an ordinary purchase: no check, no status, and an
106
+ // exemption from an earlier foreign address falls away below.
107
+ const checksVatNumber = vatNumber &&
108
+ merchant &&
109
+ !(0, validation_policy_1.isDomesticCompany)(currentCart.billing_address?.country_code ?? "", merchant.countryCode);
110
+ if (checksVatNumber && merchant) {
111
+ const billingAddress = requireCompleteAddress(currentCart.billing_address, "Billing");
112
+ const shippingAddress = requireCompleteAddress(currentCart.shipping_address, "Shipping");
113
+ const companyName = billingAddress.company?.trim();
114
+ if (!companyName) {
115
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Billing address needs a company for its VAT number.");
116
+ }
117
+ const { result: evidence } = await (0, submit_tax_identification_1.submitTaxIdentificationWorkflow)(req.scope).run({
118
+ input: {
119
+ cart_id: currentCart.id,
120
+ company_name: companyName,
121
+ customer_vat_number: vatNumber,
122
+ billing_address: {
123
+ address1: billingAddress.address_1,
124
+ address2: billingAddress.address_2,
125
+ city: billingAddress.city,
126
+ countryCode: billingAddress.country_code,
127
+ postalCode: billingAddress.postal_code,
128
+ },
129
+ delivery_country_code: shippingAddress.country_code,
130
+ merchant_country_code: merchant.countryCode,
131
+ merchant_vat_number: merchant.vatNumber,
132
+ },
133
+ });
134
+ status = evidence.status;
135
+ }
136
+ // Medusa recomputes taxes only when the shipping address changes, not when
137
+ // the billing company or UID does. Without a UID to check only a cart checked before
138
+ // can still carry an exemption, so ordinary carts skip the recomputation.
139
+ if (checksVatNumber ||
140
+ (await (0, resolve_services_1.resolveTaxComplianceService)(req.scope).hasCurrentCartEvidence(currentCart.id))) {
141
+ await (0, core_flows_1.updateTaxLinesWorkflow)(req.scope).run({
142
+ input: {
143
+ cart_id: currentCart.id,
144
+ force_tax_calculation: true,
145
+ },
146
+ });
147
+ // The recomputed tax lines change the cart total, but only a cart
148
+ // workflow reconciles the payment collection. Without this, a payment
149
+ // session opened on the B2C total keeps charging it after zero-rating
150
+ // (and vice versa). Medusa leaves the sessions alone while the amount is
151
+ // unchanged; otherwise the storefront re-initiates payment afterwards.
152
+ // Guarded because the workflow expects a collection.
153
+ if (currentCart.payment_collection?.id) {
154
+ await (0, core_flows_1.refreshPaymentCollectionForCartWorkflow)(req.scope).run({
155
+ input: { cart_id: currentCart.id },
156
+ });
157
+ }
158
+ }
159
+ const cart = await loadStoreCart(req.params.id, req.scope, allowedSalesChannelIds);
160
+ // The change is already done: an unreadable total is logged and sent as 0
161
+ // instead of failing the request.
162
+ const logger = (0, lib_1.resolveOptionalLogger)(req.scope);
163
+ const toAmount = (field, value) => (0, to_response_amount_1.toResponseAmount)(value, () => logger?.warn(`Tax identification: cart ${cart.id} total "${field}" is not a number; sending 0.`));
164
+ res.status(200).json({
165
+ status,
166
+ message: status ? (0, tax_identification_message_1.taxIdentificationMessageFor)(status) : null,
167
+ cart: {
168
+ id: cart.id,
169
+ currency_code: cart.currency_code,
170
+ subtotal: toAmount("subtotal", cart.subtotal),
171
+ discount_total: toAmount("discount_total", cart.discount_total),
172
+ shipping_total: toAmount("shipping_total", cart.shipping_total),
173
+ tax_total: toAmount("tax_total", cart.tax_total),
174
+ total: toAmount("total", cart.total),
175
+ },
176
+ });
177
+ };
178
+ exports.POST = POST;
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2NhcnRzL1tpZF0vdGF4LWlkZW50aWZpY2F0aW9uL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLHFEQUdrQztBQUVsQyw0REFJb0M7QUFFcEMsbURBQWlFO0FBQ2pFLDJHQUF3SDtBQUl4SCxpR0FBK0Y7QUFDL0Ysc0dBQWtHO0FBQ2xHLDJFQUFvRjtBQUNwRixxRkFBNEY7QUFDNUYsdUZBQW9GO0FBQ3BGLHVFQUFpRTtBQUVqRSxpSEFBbUg7QUFtQ25ILE1BQU0sVUFBVSxHQUFHO0lBQ2pCLElBQUk7SUFDSixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLFVBQVU7SUFDVixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLFdBQVc7SUFDWCxPQUFPO0lBQ1AsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixTQUFTO0lBQ1QsbUJBQW1CO0lBQ25CLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsOEJBQThCO0lBQzlCLGdDQUFnQztJQUNoQyx1QkFBdUI7Q0FDeEIsQ0FBQTtBQUVELE1BQU0sc0JBQXNCLEdBQUcsQ0FDN0IsT0FBdUMsRUFDdkMsS0FBYSxFQU1iLEVBQUU7SUFDRixJQUNFLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUU7UUFDM0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRTtRQUNyQixDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFO1FBQzdCLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsRUFDNUIsQ0FBQztRQUNELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLEdBQUcsS0FBSyx5QkFBeUIsQ0FDbEMsQ0FBQTtJQUNILENBQUM7SUFFRCxPQUFPLE9BS04sQ0FBQTtBQUNILENB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
@@ -0,0 +1,12 @@
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
+ /** Checks the UID of one of the logged-in customer's saved addresses. */
6
+ const POST = async (req, res) => {
7
+ res
8
+ .status(200)
9
+ .json(await (0, check_customer_address_tax_identification_1.checkCustomerAddressTaxIdentification)(req.scope, req.params.address_id, req.auth_context.actor_id));
10
+ };
11
+ exports.POST = POST;
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9tZS9hZGRyZXNzZXMvW2FkZHJlc3NfaWRdL3RheC1pZGVudGlmaWNhdGlvbi9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFPQSwySEFBbUg7QUFFbkgseUVBQXlFO0FBQ2xFLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDdkIsR0FBK0IsRUFDL0IsR0FBbUUsRUFDcEQsRUFBRTtJQUNqQixHQUFHO1NBQ0EsTUFBTSxDQUFDLEdBQUcsQ0FBQztTQUNYLElBQUksQ0FDSCxNQUFNLElBQUEsaUZBQXFDLEVBQ3pDLEdBQUcsQ0FBQyxLQUFLLEVBQ1QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQ3JCLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUMxQixDQUNGLENBQUE7QUFDTCxDQUFDLENBQUE7QUFiWSxRQUFBLElBQUksUUFhaEIifQ==
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = void 0;
4
+ const resolve_services_1 = require("../../../../../tax-compliance/resolve-services");
5
+ const customer_address_identification_response_1 = require("../../../../customer-address-identification-response");
6
+ /** Check result of each saved address of the logged-in customer that still matches it. */
7
+ const GET = async (req, res) => {
8
+ const identifications = await (0, resolve_services_1.resolveTaxComplianceService)(req.scope).listCustomerAddressIdentifications(req.auth_context.actor_id);
9
+ res.status(200).json({
10
+ identifications: identifications.map(customer_address_identification_response_1.toCustomerAddressTaxIdentificationWire),
11
+ });
12
+ };
13
+ exports.GET = GET;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9tZS90YXgtaWRlbnRpZmljYXRpb25zL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU9BLHFGQUE0RjtBQUM1RixtSEFBNkc7QUFFN0csMEZBQTBGO0FBQ25GLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBK0IsRUFDL0IsR0FBMkQsRUFDNUMsRUFBRTtJQUNqQixNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUEsOENBQTJCLEVBQ3ZELEdBQUcsQ0FBQyxLQUFLLENBQ1YsQ0FBQyxrQ0FBa0MsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRS9ELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ25CLGVBQWUsRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLGlGQUFzQyxDQUFDO0tBQzdFLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQTtBQVhZLFFBQUEsR0FBRyxPQVdmIn0=
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = void 0;
4
+ const tax_runtime_settings_1 = require("../../../tax-compliance/lib/tax-runtime-settings");
5
+ /**
6
+ * The merchant country from the shop master data: a company there is never
7
+ * checked (see the cart tax-identification route), so a storefront asks for
8
+ * a UID only for other countries. Unreadable or unset master data answer
9
+ * `null`, and the storefront then asks everywhere.
10
+ */
11
+ const GET = async (req, res) => {
12
+ const merchant = await (0, tax_runtime_settings_1.resolveMerchantProfile)(req.scope, {
13
+ failSafe: true,
14
+ subject: "the tax identification policy",
15
+ });
16
+ res.status(200).json({
17
+ merchant_country_code: merchant?.countryCode ?? null,
18
+ });
19
+ };
20
+ exports.GET = GET;
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3RheC1pZGVudGlmaWNhdGlvbi1wb2xpY3kvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBT0EsMkZBQXlGO0FBRXpGOzs7OztHQUtHO0FBQ0ksTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUN0QixHQUF1QixFQUN2QixHQUF1RCxFQUN4QyxFQUFFO0lBQ2pCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSw2Q0FBc0IsRUFBQyxHQUFHLENBQUMsS0FBSyxFQUFFO1FBQ3ZELFFBQVEsRUFBRSxJQUFJO1FBQ2QsT0FBTyxFQUFFLCtCQUErQjtLQUN6QyxDQUFDLENBQUE7SUFFRixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNuQixxQkFBcUIsRUFBRSxRQUFRLEVBQUUsV0FBVyxJQUFJLElBQUk7S0FDckQsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFBO0FBWlksUUFBQSxHQUFHLE9BWWYifQ==
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.taxIdentificationMessageFor = void 0;
4
+ /** The only public message: shown when no qualified answer could be obtained. */
5
+ const taxIdentificationMessageFor = (status) => status === "unavailable"
6
+ ? "Die UID-Prüfung ist derzeit nicht verfügbar. Bitte versuchen Sie es später erneut."
7
+ : null;
8
+ exports.taxIdentificationMessageFor = taxIdentificationMessageFor;
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGF4LWlkZW50aWZpY2F0aW9uLW1lc3NhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL3RheC1pZGVudGlmaWNhdGlvbi1tZXNzYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLGlGQUFpRjtBQUMxRSxNQUFNLDJCQUEyQixHQUFHLENBQ3pDLE1BQTJCLEVBQ1osRUFBRSxDQUNqQixNQUFNLEtBQUssYUFBYTtJQUN0QixDQUFDLENBQUMsb0ZBQW9GO0lBQ3RGLENBQUMsQ0FBQyxJQUFJLENBQUE7QUFMRyxRQUFBLDJCQUEyQiwrQkFLOUIifQ==
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toResponseAmount = void 0;
4
+ const lib_1 = require("../shared/lib");
5
+ /**
6
+ * A cart total for a response that is sent after the change already happened:
7
+ * an unreadable value is reported through `onInvalid` and sent as 0 instead of
8
+ * failing the request.
9
+ */
10
+ const toResponseAmount = (value, onInvalid) => {
11
+ const amount = (0, lib_1.toNumericAmount)(value);
12
+ if (amount === null) {
13
+ onInvalid();
14
+ return 0;
15
+ }
16
+ return amount;
17
+ };
18
+ exports.toResponseAmount = toResponseAmount;
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tcmVzcG9uc2UtYW1vdW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS90by1yZXNwb25zZS1hbW91bnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQStDO0FBRS9DOzs7O0dBSUc7QUFDSSxNQUFNLGdCQUFnQixHQUFHLENBQzlCLEtBQWMsRUFDZCxTQUFxQixFQUNiLEVBQUU7SUFDVixNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFlLEVBQUMsS0FBSyxDQUFDLENBQUE7SUFDckMsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDcEIsU0FBUyxFQUFFLENBQUE7UUFDWCxPQUFPLENBQUMsQ0FBQTtJQUNWLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMsQ0FBQTtBQVZZLFFBQUEsZ0JBQWdCLG9CQVU1QiJ9
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = taxComplianceStateSyncJob;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const tax_compliance_state_1 = require("../tax-compliance/lib/tax-compliance-state");
7
+ /**
8
+ * Safety net for the toggle mirror: catches up on a missed
9
+ * `plugin-features.updated.v1` event and writes the first row after an
10
+ * upgrade, so the tax hooks follow the toggles within a few minutes.
11
+ */
12
+ async function taxComplianceStateSyncJob(container) {
13
+ try {
14
+ await (0, tax_compliance_state_1.storeTaxComplianceState)(container);
15
+ }
16
+ catch (error) {
17
+ container
18
+ .resolve(utils_1.ContainerRegistrationKeys.LOGGER)
19
+ .error("Tax compliance state could not be synchronized", error instanceof Error ? error : new Error(String(error)));
20
+ }
21
+ }
22
+ exports.config = {
23
+ name: "tax-compliance-state-sync",
24
+ schedule: "*/5 * * * *",
25
+ };
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGF4LWNvbXBsaWFuY2Utc3RhdGUtc3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9qb2JzL3RheC1jb21wbGlhbmNlLXN0YXRlLXN5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsNENBYUM7QUF0QkQscURBQXFFO0FBRXJFLHFGQUFvRjtBQUVwRjs7OztHQUlHO0FBQ1ksS0FBSyxVQUFVLHlCQUF5QixDQUNyRCxTQUEwQjtJQUUxQixJQUFJLENBQUM7UUFDSCxNQUFNLElBQUEsOENBQXVCLEVBQUMsU0FBUyxDQUFDLENBQUE7SUFDMUMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixTQUFTO2FBQ04sT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQzthQUN6QyxLQUFLLENBQ0osZ0RBQWdELEVBQ2hELEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQzFELENBQUE7SUFDTCxDQUFDO0FBQ0gsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFHO0lBQ3BCLElBQUksRUFBRSwyQkFBMkI7SUFDakMsUUFBUSxFQUFFLGFBQWE7Q0FDeEIsQ0FBQSJ9
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.evaluateEligibility = exports.isDomesticCompany = void 0;
4
+ const comparable = (value) => value
5
+ .normalize("NFKD")
6
+ .replace(/[\u0300-\u036f]/g, "")
7
+ .toLocaleLowerCase("de-AT")
8
+ .replace(/[^a-z0-9]/g, "");
9
+ const addressMatches = (address, providerAddressLines) => {
10
+ const providerAddress = comparable(providerAddressLines.join(" "));
11
+ const requiredParts = [
12
+ address.address1,
13
+ address.address2,
14
+ address.postalCode,
15
+ address.city,
16
+ ].filter((value) => Boolean(value?.trim()));
17
+ return requiredParts.every((part) => providerAddress.includes(comparable(part)));
18
+ };
19
+ /**
20
+ * A company in the merchant's own country never qualifies for a tax-free
21
+ * intra-Community supply, so its UID is not checked at all.
22
+ */
23
+ const isDomesticCompany = (billingCountryCode, merchantCountryCode) => billingCountryCode.trim().toLowerCase() ===
24
+ merchantCountryCode.trim().toLowerCase();
25
+ exports.isDomesticCompany = isDomesticCompany;
26
+ const evaluateEligibility = (facts) => {
27
+ const customerCountryCode = facts.customerVatNumber.slice(0, 2).toLowerCase();
28
+ const deliveryCountryCode = facts.deliveryCountryCode.toLowerCase();
29
+ const merchantCountryCode = facts.merchantCountryCode.toLowerCase();
30
+ const checks = {
31
+ addressMatches: addressMatches(facts.billingAddress, facts.provider.addressLines),
32
+ companyMatches: comparable(facts.companyName) === comparable(facts.provider.name ?? ""),
33
+ crossBorder: deliveryCountryCode !== merchantCountryCode,
34
+ vatCountryMatchesDelivery: customerCountryCode === deliveryCountryCode,
35
+ };
36
+ if (!facts.provider.valid) {
37
+ return { status: "invalid", reason: "provider_invalid", checks };
38
+ }
39
+ if (!checks.companyMatches || !checks.addressMatches) {
40
+ return { status: "invalid", reason: "submitted_facts_mismatch", checks };
41
+ }
42
+ if (!checks.crossBorder || !checks.vatCountryMatchesDelivery) {
43
+ return { status: "ineligible", reason: "country_policy", checks };
44
+ }
45
+ return { status: "eligible", reason: "qualified_cross_border", checks };
46
+ };
47
+ exports.evaluateEligibility = evaluateEligibility;
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1wb2xpY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9kb21haW4vdmFsaWRhdGlvbi1wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMEJBLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBYSxFQUFVLEVBQUUsQ0FDM0MsS0FBSztLQUNGLFNBQVMsQ0FBQyxNQUFNLENBQUM7S0FDakIsT0FBTyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQztLQUMvQixpQkFBaUIsQ0FBQyxPQUFPLENBQUM7S0FDMUIsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUU5QixNQUFNLGNBQWMsR0FBRyxDQUNyQixPQUF3QixFQUN4QixvQkFBOEIsRUFDckIsRUFBRTtJQUNYLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNsRSxNQUFNLGFBQWEsR0FBRztRQUNwQixPQUFPLENBQUMsUUFBUTtRQUNoQixPQUFPLENBQUMsUUFBUTtRQUNoQixPQUFPLENBQUMsVUFBVTtRQUNsQixPQUFPLENBQUMsSUFBSTtLQUNiLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFtQixFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFFNUQsT0FBTyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbEYsQ0FBQyxDQUFBO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxDQUMvQixrQkFBMEIsRUFDMUIsbUJBQTJCLEVBQ2xCLEVBQUUsQ0FDWCxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7SUFDdkMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUE7QUFMN0IsUUFBQSxpQkFBaUIscUJBS1k7QUFFbkMsTUFBTSxtQkFBbUIsR0FBRyxDQUNqQyxLQUF1QixFQUNGLEVBQUU7SUFDdkIsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUM3RSxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNuRSxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNuRSxNQUFNLE1BQU0sR0FBRztRQUNiLGNBQWMsRUFBRSxjQUFjLENBQzVCLEtBQUssQ0FBQyxjQUFjLEVBQ3BCLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUM1QjtRQUNELGNBQWMsRUFDWixVQUFVLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDekUsV0FBVyxFQUFFLG1CQUFtQixLQUFLLG1CQUFtQjtRQUN4RCx5QkFBeUIsRUFBRSxtQkFBbUIsS0FBSyxtQkFBbUI7S0FDdkUsQ0FBQTtJQUVELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsQ0FBQTtJQUNsRSxDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFBO0lBQzFFLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsQ0FBQTtJQUNuRSxDQUFDO0lBRUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sRUFBRSxDQUFBO0FBQ3pFLENBQUMsQ0FBQTtBQTlCWSxRQUFBLG1CQUFtQix1QkE4Qi9CIn0=
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TaxComplianceService = exports.TAX_COMPLIANCE_MODULE = void 0;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const constants_1 = require("../../public/constants");
9
+ Object.defineProperty(exports, "TAX_COMPLIANCE_MODULE", { enumerable: true, get: function () { return constants_1.TAX_COMPLIANCE_MODULE; } });
10
+ const service_1 = __importDefault(require("./service"));
11
+ exports.TaxComplianceService = service_1.default;
12
+ exports.default = (0, utils_1.Module)(constants_1.TAX_COMPLIANCE_MODULE, {
13
+ service: service_1.default,
14
+ });
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxxREFBa0Q7QUFFbEQsc0RBQThEO0FBR3JELHNHQUhBLGlDQUFxQixPQUdBO0FBRjlCLHdEQUE0QztBQVFuQywrQkFSRixpQkFBb0IsQ0FRRTtBQUo3QixrQkFBZSxJQUFBLGNBQU0sRUFBQyxpQ0FBcUIsRUFBRTtJQUMzQyxPQUFPLEVBQUUsaUJBQW9CO0NBQzlCLENBQUMsQ0FBQSJ9
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260814120459 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260814120459 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`create table if not exists "tax_compliance_validation" ("id" text not null, "cart_id" text not null, "order_id" text null, "status" text not null, "company_name" text not null, "customer_vat_number" text not null, "billing_address" jsonb not null, "delivery_country_code" text not null, "merchant_country_code" text not null, "merchant_vat_number" text not null, "provider" text not null, "provider_facts" jsonb null, "validation_reason" text not null, "cart_fingerprint" text not null, "merchant_profile_fingerprint" text not null, "validated_at" timestamptz not null, "validation_date" text not null, "is_current" boolean not null default true, "cache_used" boolean not null default false, "reuse_reason" text null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "tax_compliance_validation_pkey" primary key ("id"));`);
8
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_tax_compliance_validation_deleted_at" ON "tax_compliance_validation" ("deleted_at") WHERE deleted_at IS NULL;`);
9
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_tax_compliance_validation_cart_id" ON "tax_compliance_validation" ("cart_id") WHERE deleted_at IS NULL;`);
10
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_tax_compliance_validation_order_id" ON "tax_compliance_validation" ("order_id") WHERE deleted_at IS NULL;`);
11
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_tax_compliance_validation_current_uid_day" ON "tax_compliance_validation" ("customer_vat_number", "validation_date") WHERE deleted_at IS NULL AND is_current = true;`);
12
+ }
13
+ async down() {
14
+ this.addSql(`drop table if exists "tax_compliance_validation" cascade;`);
15
+ }
16
+ }
17
+ exports.Migration20260814120459 = Migration20260814120459;
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA4MTQxMjA0NTkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYwODE0MTIwNDU5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpNUJBQWk1QixDQUFDLENBQUM7UUFDLzVCLElBQUksQ0FBQyxNQUFNLENBQUMsK0lBQStJLENBQUMsQ0FBQztRQUM3SixJQUFJLENBQUMsTUFBTSxDQUFDLHlJQUF5SSxDQUFDLENBQUM7UUFDdkosSUFBSSxDQUFDLE1BQU0sQ0FBQywySUFBMkksQ0FBQyxDQUFDO1FBQ3pKLElBQUksQ0FBQyxNQUFNLENBQUMsc01BQXNNLENBQUMsQ0FBQztJQUN0TixDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQywyREFBMkQsQ0FBQyxDQUFDO0lBQzNFLENBQUM7Q0FFRjtBQWRELDBEQWNDIn0=
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260814121724 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260814121724 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_tax_compliance_validation_current_cart" ON "tax_compliance_validation" ("cart_id") WHERE deleted_at IS NULL AND is_current = true;`);
8
+ }
9
+ async down() {
10
+ this.addSql(`drop index if exists "IDX_tax_compliance_validation_current_cart";`);
11
+ }
12
+ }
13
+ exports.Migration20260814121724 = Migration20260814121724;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA4MTQxMjE3MjQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYwODE0MTIxNzI0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQywyS0FBMkssQ0FBQyxDQUFDO0lBQzNMLENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDcEYsQ0FBQztDQUVGO0FBVkQsMERBVUMifQ==
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260814153410 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260814153410 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_tax_compliance_validation_merchant_uid_day" ON "tax_compliance_validation" ("merchant_vat_number", "customer_vat_number", "validation_date") WHERE deleted_at IS NULL;`);
8
+ }
9
+ async down() {
10
+ this.addSql(`drop index if exists "IDX_tax_compliance_validation_merchant_uid_day";`);
11
+ }
12
+ }
13
+ exports.Migration20260814153410 = Migration20260814153410;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA4MTQxNTM0MTAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYwODE0MTUzNDEwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3TUFBd00sQ0FBQyxDQUFDO0lBQ3hOLENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHdFQUF3RSxDQUFDLENBQUM7SUFDeEYsQ0FBQztDQUVGO0FBVkQsMERBVUMifQ==
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260929091620 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260929091620 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`alter table if exists "tax_compliance_validation" add column if not exists "customer_address_id" text null, add column if not exists "customer_id" text null;`);
8
+ this.addSql(`alter table if exists "tax_compliance_validation" alter column "cart_id" type text using ("cart_id"::text);`);
9
+ this.addSql(`alter table if exists "tax_compliance_validation" alter column "cart_id" drop not null;`);
10
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_tax_compliance_validation_customer_id" ON "tax_compliance_validation" ("customer_id") WHERE deleted_at IS NULL;`);
11
+ this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_tax_compliance_validation_current_customer_address" ON "tax_compliance_validation" ("customer_address_id") WHERE deleted_at IS NULL AND is_current = true;`);
12
+ // Exactly one evidence subject: a cart, or a customer address with its customer.
13
+ this.addSql(`alter table if exists "tax_compliance_validation" add constraint "CHK_tax_compliance_validation_subject" check ((cart_id is not null and customer_address_id is null and customer_id is null) or (cart_id is null and customer_address_id is not null and customer_id is not null));`);
14
+ }
15
+ async down() {
16
+ this.addSql(`alter table if exists "tax_compliance_validation" drop constraint if exists "CHK_tax_compliance_validation_subject";`);
17
+ // Address evidence has no cart and cannot survive cart_id becoming required again.
18
+ this.addSql(`delete from "tax_compliance_validation" where "cart_id" is null;`);
19
+ this.addSql(`drop index if exists "IDX_tax_compliance_validation_customer_id";`);
20
+ this.addSql(`drop index if exists "IDX_tax_compliance_validation_current_customer_address";`);
21
+ this.addSql(`alter table if exists "tax_compliance_validation" drop column if exists "customer_address_id", drop column if exists "customer_id";`);
22
+ this.addSql(`alter table if exists "tax_compliance_validation" alter column "cart_id" type text using ("cart_id"::text);`);
23
+ this.addSql(`alter table if exists "tax_compliance_validation" alter column "cart_id" set not null;`);
24
+ }
25
+ }
26
+ exports.Migration20260929091620 = Migration20260929091620;
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA5MjkwOTE2MjAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYwOTI5MDkxNjIwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQywrSkFBK0osQ0FBQyxDQUFDO1FBQzdLLElBQUksQ0FBQyxNQUFNLENBQUMsNkdBQTZHLENBQUMsQ0FBQztRQUMzSCxJQUFJLENBQUMsTUFBTSxDQUFDLHlGQUF5RixDQUFDLENBQUM7UUFDdkcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpSkFBaUosQ0FBQyxDQUFDO1FBQy9KLElBQUksQ0FBQyxNQUFNLENBQUMsbU1BQW1NLENBQUMsQ0FBQztRQUNqTixpRkFBaUY7UUFDakYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzUkFBc1IsQ0FBQyxDQUFDO0lBQ3RTLENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHNIQUFzSCxDQUFDLENBQUM7UUFDcEksbUZBQW1GO1FBQ25GLElBQUksQ0FBQyxNQUFNLENBQUMsa0VBQWtFLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsTUFBTSxDQUFDLG1FQUFtRSxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnRkFBZ0YsQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQyxNQUFNLENBQUMscUlBQXFJLENBQUMsQ0FBQztRQUVuSixJQUFJLENBQUMsTUFBTSxDQUFDLDZHQUE2RyxDQUFDLENBQUM7UUFDM0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3RkFBd0YsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7Q0FFRjtBQXhCRCwwREF3QkMifQ==
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20261011090147 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20261011090147 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`create table if not exists "tax_compliance_state" ("id" text not null, "scope" text not null default 'global', "b2b_active" boolean not null default true, "shipping_tax_active" boolean not null default true, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "tax_compliance_state_pkey" primary key ("id"));`);
8
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_tax_compliance_state_deleted_at" ON "tax_compliance_state" ("deleted_at") WHERE deleted_at IS NULL;`);
9
+ this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_tax_compliance_state_global" ON "tax_compliance_state" ("scope") WHERE deleted_at IS NULL;`);
10
+ }
11
+ async down() {
12
+ this.addSql(`drop table if exists "tax_compliance_state" cascade;`);
13
+ }
14
+ }
15
+ exports.Migration20261011090147 = Migration20261011090147;
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjEwMTEwOTAxNDcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYxMDExMDkwMTQ3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyw4WUFBOFksQ0FBQyxDQUFDO1FBQzVaLElBQUksQ0FBQyxNQUFNLENBQUMscUlBQXFJLENBQUMsQ0FBQztRQUNuSixJQUFJLENBQUMsTUFBTSxDQUFDLG1JQUFtSSxDQUFDLENBQUM7SUFDbkosQ0FBQztJQUVRLEtBQUssQ0FBQyxJQUFJO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsc0RBQXNELENBQUMsQ0FBQztJQUN0RSxDQUFDO0NBRUY7QUFaRCwwREFZQyJ9
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ /**
5
+ * Mirrors the effective `b2b` and `shipping_tax` feature toggles for the tax
6
+ * hooks and the order-evidence freeze, which never read toggles: written only
7
+ * by the state sync (subscriber + job), see src/lib/tax-compliance-state.ts.
8
+ * One row (`scope` = "global"); no row means "not synchronized yet".
9
+ */
10
+ const TaxComplianceState = utils_1.model
11
+ .define({
12
+ name: "tax_compliance_state",
13
+ tableName: "tax_compliance_state",
14
+ }, {
15
+ id: utils_1.model.id({ prefix: "tcstate" }).primaryKey(),
16
+ scope: utils_1.model.text().default("global"),
17
+ b2b_active: utils_1.model.boolean().default(true),
18
+ shipping_tax_active: utils_1.model.boolean().default(true),
19
+ })
20
+ .indexes([
21
+ {
22
+ name: "IDX_tax_compliance_state_global",
23
+ on: ["scope"],
24
+ unique: true,
25
+ where: "deleted_at IS NULL",
26
+ },
27
+ ]);
28
+ exports.default = TaxComplianceState;
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGF4LWNvbXBsaWFuY2Utc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9tb2RlbHMvdGF4LWNvbXBsaWFuY2Utc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFBaUQ7QUFFakQ7Ozs7O0dBS0c7QUFDSCxNQUFNLGtCQUFrQixHQUFHLGFBQUs7S0FDN0IsTUFBTSxDQUNMO0lBQ0UsSUFBSSxFQUFFLHNCQUFzQjtJQUM1QixTQUFTLEVBQUUsc0JBQXNCO0NBQ2xDLEVBQ0Q7SUFDRSxFQUFFLEVBQUUsYUFBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRTtJQUNoRCxLQUFLLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDckMsVUFBVSxFQUFFLGFBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ3pDLG1CQUFtQixFQUFFLGFBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0NBQ25ELENBQ0Y7S0FDQSxPQUFPLENBQUM7SUFDUDtRQUNFLElBQUksRUFBRSxpQ0FBaUM7UUFDdkMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQ2IsTUFBTSxFQUFFLElBQUk7UUFDWixLQUFLLEVBQUUsb0JBQW9CO0tBQzVCO0NBQ0YsQ0FBQyxDQUFBO0FBRUosa0JBQWUsa0JBQWtCLENBQUEifQ==
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ const TaxComplianceValidation = utils_1.model
5
+ .define({
6
+ name: "tax_compliance_validation",
7
+ tableName: "tax_compliance_validation",
8
+ }, {
9
+ id: utils_1.model.id({ prefix: "tcv" }).primaryKey(),
10
+ // Exactly one subject per record (CHECK in the migration): a cart, or a
11
+ // saved customer address together with its customer.
12
+ cart_id: utils_1.model.text().nullable(),
13
+ customer_address_id: utils_1.model.text().nullable(),
14
+ customer_id: utils_1.model.text().nullable(),
15
+ order_id: utils_1.model.text().nullable(),
16
+ status: utils_1.model.text(),
17
+ company_name: utils_1.model.text(),
18
+ customer_vat_number: utils_1.model.text(),
19
+ billing_address: utils_1.model.json(),
20
+ delivery_country_code: utils_1.model.text(),
21
+ merchant_country_code: utils_1.model.text(),
22
+ merchant_vat_number: utils_1.model.text(),
23
+ provider: utils_1.model.text(),
24
+ provider_facts: utils_1.model.json().nullable(),
25
+ validation_reason: utils_1.model.text(),
26
+ cart_fingerprint: utils_1.model.text(),
27
+ merchant_profile_fingerprint: utils_1.model.text(),
28
+ validated_at: utils_1.model.dateTime(),
29
+ validation_date: utils_1.model.text(),
30
+ is_current: utils_1.model.boolean().default(true),
31
+ cache_used: utils_1.model.boolean().default(false),
32
+ reuse_reason: utils_1.model.text().nullable(),
33
+ })
34
+ .indexes([
35
+ {
36
+ name: "IDX_tax_compliance_validation_cart_id",
37
+ on: ["cart_id"],
38
+ where: "deleted_at IS NULL",
39
+ },
40
+ {
41
+ name: "IDX_tax_compliance_validation_order_id",
42
+ on: ["order_id"],
43
+ where: "deleted_at IS NULL",
44
+ },
45
+ {
46
+ name: "IDX_tax_compliance_validation_current_uid_day",
47
+ on: ["customer_vat_number", "validation_date"],
48
+ where: "deleted_at IS NULL AND is_current = true",
49
+ },
50
+ {
51
+ name: "IDX_tax_compliance_validation_merchant_uid_day",
52
+ on: ["merchant_vat_number", "customer_vat_number", "validation_date"],
53
+ where: "deleted_at IS NULL",
54
+ },
55
+ {
56
+ name: "IDX_tax_compliance_validation_current_cart",
57
+ on: ["cart_id"],
58
+ unique: true,
59
+ where: "deleted_at IS NULL AND is_current = true",
60
+ },
61
+ {
62
+ name: "IDX_tax_compliance_validation_customer_id",
63
+ on: ["customer_id"],
64
+ where: "deleted_at IS NULL",
65
+ },
66
+ {
67
+ name: "IDX_tax_compliance_validation_current_customer_address",
68
+ on: ["customer_address_id"],
69
+ unique: true,
70
+ where: "deleted_at IS NULL AND is_current = true",
71
+ },
72
+ ]);
73
+ exports.default = TaxComplianceValidation;
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGF4LWNvbXBsaWFuY2UtdmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3RheC1jb21wbGlhbmNlL21vZGVscy90YXgtY29tcGxpYW5jZS12YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscURBQWlEO0FBRWpELE1BQU0sdUJBQXVCLEdBQUcsYUFBSztLQUNsQyxNQUFNLENBQ0w7SUFDRSxJQUFJLEVBQUUsMkJBQTJCO0lBQ2pDLFNBQVMsRUFBRSwyQkFBMkI7Q0FDdkMsRUFDRDtJQUNFLEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFO0lBQzVDLHdFQUF3RTtJQUN4RSxxREFBcUQ7SUFDckQsT0FBTyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDaEMsbUJBQW1CLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM1QyxXQUFXLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNwQyxRQUFRLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNqQyxNQUFNLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUNwQixZQUFZLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUMxQixtQkFBbUIsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ2pDLGVBQWUsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQzdCLHFCQUFxQixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDbkMscUJBQXFCLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUNuQyxtQkFBbUIsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ2pDLFFBQVEsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3RCLGNBQWMsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3ZDLGlCQUFpQixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDL0IsZ0JBQWdCLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUM5Qiw0QkFBNEIsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQzFDLFlBQVksRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFO0lBQzlCLGVBQWUsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQzdCLFVBQVUsRUFBRSxhQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztJQUN6QyxVQUFVLEVBQUUsYUFBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDMUMsWUFBWSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDdEMsQ0FDRjtLQUNBLE9BQU8sQ0FBQztJQUNQO1FBQ0UsSUFBSSxFQUFFLHVDQUF1QztRQUM3QyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDZixLQUFLLEVBQUUsb0JBQW9CO0tBQzVCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsd0NBQXdDO1FBQzlDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUNoQixLQUFLLEVBQUUsb0JBQW9CO0tBQzVCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsK0NBQStDO1FBQ3JELEVBQUUsRUFBRSxDQUFDLHFCQUFxQixFQUFFLGlCQUFpQixDQUFDO1FBQzlDLEtBQUssRUFBRSwwQ0FBMEM7S0FDbEQ7SUFDRDtRQUNFLElBQUksRUFBRSxnREFBZ0Q7UUFDdEQsRUFBRSxFQUFFLENBQUMscUJBQXFCLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLENBQUM7UUFDckUsS0FBSyxFQUFFLG9CQUFvQjtLQUM1QjtJQUNEO1FBQ0UsSUFBSSxFQUFFLDRDQUE0QztRQUNsRCxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDZixNQUFNLEVBQUUsSUFBSTtRQUNaLEtBQUssRUFBRSwwQ0FBMEM7S0FDbEQ7SUFDRDtRQUNFLElBQUksRUFBRSwyQ0FBMkM7UUFDakQsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDO1FBQ25CLEtBQUssRUFBRSxvQkFBb0I7S0FDNUI7SUFDRDtRQUNFLElBQUksRUFBRSx3REFBd0Q7UUFDOUQsRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUM7UUFDM0IsTUFBTSxFQUFFLElBQUk7UUFDWixLQUFLLEVBQUUsMENBQTBDO0tBQ2xEO0NBQ0YsQ0FBQyxDQUFBO0FBRUosa0JBQWUsdUJBQXVCLENBQUEifQ==