@hartl-services/medusa-tax-compliance 0.1.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 (29) hide show
  1. package/.medusa/server/src/admin/index.js +26 -0
  2. package/.medusa/server/src/admin/index.mjs +27 -0
  3. package/.medusa/server/src/api/middlewares.js +14 -0
  4. package/.medusa/server/src/api/store/carts/[id]/tax-identification/route.js +128 -0
  5. package/.medusa/server/src/integrations/finanzonline/client.js +182 -0
  6. package/.medusa/server/src/integrations/finanzonline/validator.js +50 -0
  7. package/.medusa/server/src/integrations/registry.js +25 -0
  8. package/.medusa/server/src/integrations/validator.js +22 -0
  9. package/.medusa/server/src/modules/tax-compliance/domain/validation-policy.js +41 -0
  10. package/.medusa/server/src/modules/tax-compliance/index.js +14 -0
  11. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814120459.js +18 -0
  12. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814121724.js +14 -0
  13. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814153410.js +14 -0
  14. package/.medusa/server/src/modules/tax-compliance/models/tax-compliance-validation.js +59 -0
  15. package/.medusa/server/src/modules/tax-compliance/service.js +477 -0
  16. package/.medusa/server/src/providers/tax-compliance/index.js +11 -0
  17. package/.medusa/server/src/providers/tax-compliance/service.js +152 -0
  18. package/.medusa/server/src/types/index.js +3 -0
  19. package/.medusa/server/src/types/tax-compliance.js +10 -0
  20. package/.medusa/server/src/utils/resolve-services.js +7 -0
  21. package/.medusa/server/src/workflows/hooks/cart-tax-context.js +46 -0
  22. package/.medusa/server/src/workflows/hooks/complete-cart-order-evidence.js +10 -0
  23. package/.medusa/server/src/workflows/hooks/order-tax-context.js +93 -0
  24. package/.medusa/server/src/workflows/hooks/shipping-tax-apportionment.js +91 -0
  25. package/.medusa/server/src/workflows/tax-compliance/freeze-order-evidence.js +42 -0
  26. package/.medusa/server/src/workflows/tax-compliance/submit-tax-identification.js +11 -0
  27. package/LICENSE +21 -0
  28. package/README.md +189 -0
  29. package/package.json +69 -0
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ const widgetModule = { widgets: [] };
3
+ const routeModule = {
4
+ routes: []
5
+ };
6
+ const menuItemModule = {
7
+ menuItems: []
8
+ };
9
+ const formModule = { customFields: {} };
10
+ const displayModule = {
11
+ displays: {}
12
+ };
13
+ const i18nModule = { resources: {} };
14
+ const cellRendererModule = {};
15
+ const layoutModule = { layouts: [] };
16
+ const plugin = {
17
+ widgetModule,
18
+ routeModule,
19
+ menuItemModule,
20
+ formModule,
21
+ displayModule,
22
+ i18nModule,
23
+ cellRendererModule,
24
+ layoutModule
25
+ };
26
+ module.exports = plugin;
@@ -0,0 +1,27 @@
1
+ const widgetModule = { widgets: [] };
2
+ const routeModule = {
3
+ routes: []
4
+ };
5
+ const menuItemModule = {
6
+ menuItems: []
7
+ };
8
+ const formModule = { customFields: {} };
9
+ const displayModule = {
10
+ displays: {}
11
+ };
12
+ const i18nModule = { resources: {} };
13
+ const cellRendererModule = {};
14
+ const layoutModule = { layouts: [] };
15
+ const plugin = {
16
+ widgetModule,
17
+ routeModule,
18
+ menuItemModule,
19
+ formModule,
20
+ displayModule,
21
+ i18nModule,
22
+ cellRendererModule,
23
+ layoutModule
24
+ };
25
+ export {
26
+ plugin as default
27
+ };
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const http_1 = require("@medusajs/framework/http");
4
+ const tax_compliance_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/tax-compliance");
5
+ exports.default = (0, http_1.defineMiddlewares)({
6
+ routes: [
7
+ {
8
+ matcher: "/store/carts/:id/tax-identification",
9
+ methods: ["POST"],
10
+ middlewares: [(0, http_1.validateAndTransformBody)(tax_compliance_1.SubmitTaxIdentificationSchema)],
11
+ },
12
+ ],
13
+ });
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBR2lDO0FBRWpDLDZHQUF3SDtBQUV4SCxrQkFBZSxJQUFBLHdCQUFpQixFQUFDO0lBQy9CLE1BQU0sRUFBRTtRQUNOO1lBQ0UsT0FBTyxFQUFFLHFDQUFxQztZQUM5QyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDakIsV0FBVyxFQUFFLENBQUMsSUFBQSwrQkFBd0IsRUFBQyw4Q0FBNkIsQ0FBQyxDQUFDO1NBQ3ZFO0tBQ0Y7Q0FDRixDQUFDLENBQUEifQ==
@@ -0,0 +1,128 @@
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 resolve_services_1 = require("../../../../../utils/resolve-services");
7
+ const submit_tax_identification_1 = require("../../../../../workflows/tax-compliance/submit-tax-identification");
8
+ const cartFields = [
9
+ "id",
10
+ "currency_code",
11
+ "sales_channel_id",
12
+ "subtotal",
13
+ "discount_total",
14
+ "shipping_total",
15
+ "tax_total",
16
+ "total",
17
+ "billing_address.*",
18
+ "shipping_address.*",
19
+ "items.*",
20
+ "items.tax_lines.*",
21
+ "items.adjustments.*",
22
+ "shipping_methods.*",
23
+ "shipping_methods.tax_lines.*",
24
+ "shipping_methods.adjustments.*",
25
+ ];
26
+ const requireCompleteAddress = (address, label) => {
27
+ if (!address?.address_1?.trim() ||
28
+ !address.city?.trim() ||
29
+ !address.country_code?.trim() ||
30
+ !address.postal_code?.trim()) {
31
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `${label} address is incomplete.`);
32
+ }
33
+ return address;
34
+ };
35
+ const loadStoreCart = async (id, scope, allowedSalesChannelIds) => {
36
+ const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
37
+ const { data } = await query.graph({
38
+ entity: "cart",
39
+ fields: cartFields,
40
+ filters: { id },
41
+ });
42
+ const cart = data[0];
43
+ if (!cart || !allowedSalesChannelIds.includes(cart.sales_channel_id)) {
44
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Cart with id '${id}' not found.`);
45
+ }
46
+ return cart;
47
+ };
48
+ const toNumber = (value) => {
49
+ if (typeof value === "number") {
50
+ return value;
51
+ }
52
+ const numeric = Number(value ?? 0);
53
+ return Number.isFinite(numeric) ? numeric : 0;
54
+ };
55
+ const messageFor = (status) => status === "unavailable"
56
+ ? "Die UID-Prüfung ist derzeit nicht verfügbar. Bitte versuchen Sie es später erneut."
57
+ : null;
58
+ const POST = async (req, res) => {
59
+ const allowedSalesChannelIds = req.publishable_key_context.sales_channel_ids ?? [];
60
+ const initialCart = await loadStoreCart(req.params.id, req.scope, allowedSalesChannelIds);
61
+ const billingAddress = requireCompleteAddress(initialCart.billing_address, "Billing");
62
+ const shippingAddress = requireCompleteAddress(initialCart.shipping_address, "Shipping");
63
+ void shippingAddress;
64
+ await (0, core_flows_1.updateCartWorkflow)(req.scope).run({
65
+ input: {
66
+ id: initialCart.id,
67
+ billing_address: billingAddress.id
68
+ ? {
69
+ id: billingAddress.id,
70
+ company: req.validatedBody.company_name,
71
+ }
72
+ : {
73
+ address_1: billingAddress.address_1,
74
+ city: billingAddress.city,
75
+ company: req.validatedBody.company_name,
76
+ country_code: billingAddress.country_code,
77
+ postal_code: billingAddress.postal_code,
78
+ },
79
+ },
80
+ });
81
+ const currentCart = await loadStoreCart(req.params.id, req.scope, allowedSalesChannelIds);
82
+ const currentBillingAddress = requireCompleteAddress(currentCart.billing_address, "Billing");
83
+ const currentShippingAddress = requireCompleteAddress(currentCart.shipping_address, "Shipping");
84
+ const merchant = (0, resolve_services_1.resolveTaxComplianceService)(req.scope).getMerchantProfile();
85
+ if (!merchant) {
86
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Tax compliance merchant configuration is unavailable.");
87
+ }
88
+ const { result: evidence } = await (0, submit_tax_identification_1.submitTaxIdentificationWorkflow)(req.scope).run({
89
+ input: {
90
+ cart_id: currentCart.id,
91
+ company_name: req.validatedBody.company_name,
92
+ customer_vat_number: req.validatedBody.vat_number,
93
+ billing_address: {
94
+ address1: currentBillingAddress.address_1,
95
+ address2: currentBillingAddress.address_2,
96
+ city: currentBillingAddress.city,
97
+ countryCode: currentBillingAddress.country_code,
98
+ postalCode: currentBillingAddress.postal_code,
99
+ },
100
+ delivery_country_code: currentShippingAddress.country_code,
101
+ merchant_country_code: merchant.countryCode,
102
+ merchant_vat_number: merchant.vatNumber,
103
+ },
104
+ });
105
+ await (0, core_flows_1.updateTaxLinesWorkflow)(req.scope).run({
106
+ input: {
107
+ cart_id: currentCart.id,
108
+ force_tax_calculation: true,
109
+ },
110
+ });
111
+ const cart = await loadStoreCart(req.params.id, req.scope, allowedSalesChannelIds);
112
+ const status = evidence.status;
113
+ res.status(200).json({
114
+ status,
115
+ message: messageFor(status),
116
+ cart: {
117
+ id: cart.id,
118
+ currency_code: cart.currency_code,
119
+ subtotal: toNumber(cart.subtotal),
120
+ discount_total: toNumber(cart.discount_total),
121
+ shipping_total: toNumber(cart.shipping_total),
122
+ tax_total: toNumber(cart.tax_total),
123
+ total: toNumber(cart.total),
124
+ },
125
+ });
126
+ };
127
+ exports.POST = POST;
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2NhcnRzL1tpZF0vdGF4LWlkZW50aWZpY2F0aW9uL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLHFEQUdrQztBQUVsQyw0REFHb0M7QUFNcEMsNEVBQW1GO0FBQ25GLGlIQUFtSDtBQWlDbkgsTUFBTSxVQUFVLEdBQUc7SUFDakIsSUFBSTtJQUNKLGVBQWU7SUFDZixrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsV0FBVztJQUNYLE9BQU87SUFDUCxtQkFBbUI7SUFDbkIsb0JBQW9CO0lBQ3BCLFNBQVM7SUFDVCxtQkFBbUI7SUFDbkIscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQiw4QkFBOEI7SUFDOUIsZ0NBQWdDO0NBQ2pDLENBQUE7QUFFRCxNQUFNLHNCQUFzQixHQUFHLENBQzdCLE9BQXVDLEVBQ3ZDLEtBQWEsRUFNYixFQUFFO0lBQ0YsSUFDRSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO1FBQzNCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7UUFDckIsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRTtRQUM3QixDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEVBQzVCLENBQUM7UUFDRCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixHQUFHLEtBQUsseUJBQXlCLENBQ2xDLENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTyxPQUtOLENBQUE7QUFDSCxDQUFDLENBQUE7QUFFRCxNQUFNLGFBQWEsR0FBRyxLQUFLLEVBQ3pCLEVBQVUsRUFDVixLQUFrQyxFQUNsQyxzQkFBZ0MsRUFDQSxFQUFFO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLEtBQUss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
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FinanzOnlineClient = exports.NodeSoapFinanzOnlineOperations = exports.buildStage2UidRequest = exports.FINANZONLINE_UID_WSDL = exports.FINANZONLINE_SESSION_WSDL = void 0;
4
+ const soap_1 = require("soap");
5
+ exports.FINANZONLINE_SESSION_WSDL = "https://finanzonline.bmf.gv.at/fonws/ws/sessionService.wsdl";
6
+ exports.FINANZONLINE_UID_WSDL = "https://finanzonline.bmf.gv.at/fonuid/ws/uidAbfrageService.wsdl";
7
+ const buildStage2UidRequest = (input) => ({
8
+ tid: input.participantId,
9
+ benid: input.userId,
10
+ id: input.sessionId,
11
+ uid_tn: input.requestingVatNumber,
12
+ uid: input.targetVatNumber,
13
+ stufe: "2",
14
+ });
15
+ exports.buildStage2UidRequest = buildStage2UidRequest;
16
+ const asRecord = (value) => value && typeof value === "object" ? value : {};
17
+ const asNumber = (value) => {
18
+ const parsed = typeof value === "number" ? value : Number(value);
19
+ return Number.isFinite(parsed) ? parsed : Number.NaN;
20
+ };
21
+ const optionalString = (value) => typeof value === "string" && value.length > 0 ? value : undefined;
22
+ const firstSoapResult = (value) => {
23
+ if (!Array.isArray(value)) {
24
+ return {};
25
+ }
26
+ return asRecord(value[0]);
27
+ };
28
+ const scrubSoapTransportState = (client) => {
29
+ const mutableClient = client;
30
+ for (const key of Object.getOwnPropertyNames(mutableClient)) {
31
+ if (key.startsWith("last")) {
32
+ delete mutableClient[key];
33
+ }
34
+ }
35
+ };
36
+ const withValidationScopedSoapClient = async (wsdl, operation) => {
37
+ const client = await (0, soap_1.createClientAsync)(wsdl);
38
+ try {
39
+ return await operation(client);
40
+ }
41
+ finally {
42
+ scrubSoapTransportState(client);
43
+ }
44
+ };
45
+ /**
46
+ * The only class that knows the node-soap dynamic method names and the official
47
+ * FinanzOnline wire parameter names. Raw SOAP requests and responses never
48
+ * leave this boundary.
49
+ */
50
+ class NodeSoapFinanzOnlineOperations {
51
+ async login(input) {
52
+ const result = await withValidationScopedSoapClient(exports.FINANZONLINE_SESSION_WSDL, async (client) => firstSoapResult(await client.loginAsync({
53
+ tid: input.participantId,
54
+ benid: input.userId,
55
+ pin: input.password,
56
+ herstellerid: input.manufacturerId,
57
+ })));
58
+ return {
59
+ id: optionalString(result.id),
60
+ rc: asNumber(result.rc),
61
+ msg: optionalString(result.msg),
62
+ };
63
+ }
64
+ async queryUid(input) {
65
+ const result = await withValidationScopedSoapClient(exports.FINANZONLINE_UID_WSDL, async (client) => firstSoapResult(await client.uidAbfrageAsync((0, exports.buildStage2UidRequest)(input))));
66
+ return {
67
+ rc: asNumber(result.rc),
68
+ msg: optionalString(result.msg),
69
+ name: optionalString(result.name),
70
+ adrz1: optionalString(result.adrz1),
71
+ adrz2: optionalString(result.adrz2),
72
+ adrz3: optionalString(result.adrz3),
73
+ adrz4: optionalString(result.adrz4),
74
+ adrz5: optionalString(result.adrz5),
75
+ adrz6: optionalString(result.adrz6),
76
+ };
77
+ }
78
+ async logout(input) {
79
+ const result = await withValidationScopedSoapClient(exports.FINANZONLINE_SESSION_WSDL, async (client) => firstSoapResult(await client.logoutAsync({
80
+ tid: input.participantId,
81
+ benid: input.userId,
82
+ id: input.sessionId,
83
+ })));
84
+ return {
85
+ rc: asNumber(result.rc),
86
+ msg: optionalString(result.msg),
87
+ };
88
+ }
89
+ }
90
+ exports.NodeSoapFinanzOnlineOperations = NodeSoapFinanzOnlineOperations;
91
+ const INVALID_TARGET_UID_RETURN_CODES = new Set([1, 4]);
92
+ class FinanzOnlineClient {
93
+ constructor(operations_, credentials_) {
94
+ this.operations_ = operations_;
95
+ this.credentials_ = credentials_;
96
+ }
97
+ async validateUid(input) {
98
+ let sessionId;
99
+ try {
100
+ const login = await this.operations_.login({
101
+ ...this.credentials_,
102
+ manufacturerId: input.requestingVatNumber,
103
+ });
104
+ if (login.rc !== 0 || !login.id) {
105
+ return {
106
+ status: "unavailable",
107
+ provider: null,
108
+ reason: "provider_unavailable",
109
+ };
110
+ }
111
+ sessionId = login.id;
112
+ const result = await this.operations_.queryUid({
113
+ participantId: this.credentials_.participantId,
114
+ requestingVatNumber: input.requestingVatNumber,
115
+ sessionId,
116
+ targetVatNumber: input.targetVatNumber,
117
+ userId: this.credentials_.userId,
118
+ });
119
+ if (result.rc === 0 && result.name) {
120
+ return {
121
+ status: "valid",
122
+ provider: {
123
+ valid: true,
124
+ name: result.name,
125
+ addressLines: [
126
+ result.adrz1,
127
+ result.adrz2,
128
+ result.adrz3,
129
+ result.adrz4,
130
+ result.adrz5,
131
+ result.adrz6,
132
+ ].filter((line) => Boolean(line)),
133
+ reference: null,
134
+ returnCode: result.rc,
135
+ },
136
+ reason: "provider_valid",
137
+ };
138
+ }
139
+ if (INVALID_TARGET_UID_RETURN_CODES.has(result.rc)) {
140
+ return {
141
+ status: "invalid",
142
+ provider: {
143
+ valid: false,
144
+ name: null,
145
+ addressLines: [],
146
+ reference: null,
147
+ returnCode: result.rc,
148
+ },
149
+ reason: "provider_invalid",
150
+ };
151
+ }
152
+ return {
153
+ status: "unavailable",
154
+ provider: null,
155
+ reason: "provider_unavailable",
156
+ };
157
+ }
158
+ catch {
159
+ return {
160
+ status: "unavailable",
161
+ provider: null,
162
+ reason: "technical_error",
163
+ };
164
+ }
165
+ finally {
166
+ if (sessionId) {
167
+ try {
168
+ await this.operations_.logout({
169
+ participantId: this.credentials_.participantId,
170
+ sessionId,
171
+ userId: this.credentials_.userId,
172
+ });
173
+ }
174
+ catch {
175
+ // Validation evidence is still usable when best-effort logout fails.
176
+ }
177
+ }
178
+ }
179
+ }
180
+ }
181
+ exports.FinanzOnlineClient = FinanzOnlineClient;
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2ludGVncmF0aW9ucy9maW5hbnpvbmxpbmUvY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUFxRDtBQUl4QyxRQUFBLHlCQUF5QixHQUNwQyw2REFBNkQsQ0FBQTtBQUNsRCxRQUFBLHFCQUFxQixHQUNoQyxpRUFBaUUsQ0FBQTtBQW9CNUQsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEtBQW9CLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUQsR0FBRyxFQUFFLEtBQUssQ0FBQyxhQUFhO0lBQ3hCLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTTtJQUNuQixFQUFFLEVBQUUsS0FBSyxDQUFDLFNBQVM7SUFDbkIsTUFBTSxFQUFFLEtBQUssQ0FBQyxtQkFBbUI7SUFDakMsR0FBRyxFQUFFLEtBQUssQ0FBQyxlQUFlO0lBQzFCLEtBQUssRUFBRSxHQUFZO0NBQ3BCLENBQUMsQ0FBQTtBQVBXLFFBQUEscUJBQXFCLHlCQU9oQztBQTRDRixNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQWMsRUFBMkIsRUFBRSxDQUMzRCxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBRSxLQUFpQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7QUFFOUUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFjLEVBQVUsRUFBRTtJQUMxQyxNQUFNLE1BQU0sR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hFLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFBO0FBQ3RELENBQUMsQ0FBQTtBQUVELE1BQU0sY0FBYyxHQUFHLENB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
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FinanzOnlineQualifiedVatValidator = void 0;
4
+ const validation_policy_1 = require("../../modules/tax-compliance/domain/validation-policy");
5
+ const validator_1 = require("../validator");
6
+ class FinanzOnlineQualifiedVatValidator {
7
+ constructor(client_) {
8
+ this.client_ = client_;
9
+ this.availability = "available";
10
+ this.provider = "at-finanzonline";
11
+ }
12
+ async validate(input) {
13
+ const requestingVatNumber = (0, validator_1.normalizeQualifiedVatNumber)(input.merchantVatNumber);
14
+ const targetVatNumber = (0, validator_1.normalizeQualifiedVatNumber)(input.customerVatNumber);
15
+ if (requestingVatNumber === validator_1.QUALIFIED_VAT_DEVELOPMENT_SENTINEL ||
16
+ targetVatNumber === validator_1.QUALIFIED_VAT_DEVELOPMENT_SENTINEL) {
17
+ return {
18
+ status: "unavailable",
19
+ provider: null,
20
+ reason: "uid_sentinel",
21
+ };
22
+ }
23
+ const result = await this.client_.validateUid({
24
+ requestingVatNumber,
25
+ targetVatNumber,
26
+ });
27
+ if (result.status !== "valid") {
28
+ return {
29
+ status: result.status,
30
+ provider: result.provider,
31
+ reason: result.reason,
32
+ };
33
+ }
34
+ const decision = (0, validation_policy_1.evaluateEligibility)({
35
+ billingAddress: input.billingAddress,
36
+ companyName: input.companyName,
37
+ customerVatNumber: input.customerVatNumber,
38
+ deliveryCountryCode: input.deliveryCountryCode,
39
+ merchantCountryCode: input.merchantCountryCode,
40
+ provider: result.provider,
41
+ });
42
+ return {
43
+ status: decision.status,
44
+ provider: result.provider,
45
+ reason: decision.reason,
46
+ };
47
+ }
48
+ }
49
+ exports.FinanzOnlineQualifiedVatValidator = FinanzOnlineQualifiedVatValidator;
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2ludGVncmF0aW9ucy9maW5hbnpvbmxpbmUvdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZGQUEyRjtBQUszRiw0Q0FJcUI7QUFHckIsTUFBYSxpQ0FBaUM7SUFNNUMsWUFBNkIsT0FBK0I7UUFBL0IsWUFBTyxHQUFQLE9BQU8sQ0FBd0I7UUFIbkQsaUJBQVksR0FBRyxXQUFvQixDQUFBO1FBQ25DLGFBQVEsR0FBRyxpQkFBaUIsQ0FBQTtJQUUwQixDQUFDO0lBRWhFLEtBQUssQ0FBQyxRQUFRLENBQ1osS0FBa0M7UUFFbEMsTUFBTSxtQkFBbUIsR0FBRyxJQUFBLHVDQUEyQixFQUNyRCxLQUFLLENBQUMsaUJBQWlCLENBQ3hCLENBQUE7UUFDRCxNQUFNLGVBQWUsR0FBRyxJQUFBLHVDQUEyQixFQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBRTVFLElBQ0UsbUJBQW1CLEtBQUssOENBQWtDO1lBQzFELGVBQWUsS0FBSyw4Q0FBa0MsRUFDdEQsQ0FBQztZQUNELE9BQU87Z0JBQ0wsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLFFBQVEsRUFBRSxJQUFJO2dCQUNkLE1BQU0sRUFBRSxjQUFjO2FBQ3ZCLENBQUE7UUFDSCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUM1QyxtQkFBbUI7WUFDbkIsZUFBZTtTQUNoQixDQUFDLENBQUE7UUFFRixJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDOUIsT0FBTztnQkFDTCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07Z0JBQ3JCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDekIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO2FBQ3RCLENBQUE7UUFDSCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBQSx1Q0FBbUIsRUFBQztZQUNuQyxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7WUFDcEMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzlCLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxpQkFBaUI7WUFDMUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtZQUM5QyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsbUJBQW1CO1lBQzlDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtTQUMxQixDQUFDLENBQUE7UUFFRixPQUFPO1lBQ0wsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1lBQ3ZCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN6QixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07U0FDeEIsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQXZERCw4RUF1REMifQ==
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.selectQualifiedVatValidator = void 0;
4
+ const validator_1 = require("./validator");
5
+ const client_1 = require("./finanzonline/client");
6
+ const validator_2 = require("./finanzonline/validator");
7
+ const selectQualifiedVatValidator = (input) => {
8
+ if (input.merchantCountryCode.toLowerCase() !== "at") {
9
+ return new validator_1.UnavailableQualifiedVatValidator("unsupported_merchant_country");
10
+ }
11
+ if ((0, validator_1.normalizeQualifiedVatNumber)(input.merchantVatNumber) ===
12
+ validator_1.QUALIFIED_VAT_DEVELOPMENT_SENTINEL) {
13
+ return new validator_1.UnavailableQualifiedVatValidator("merchant_uid_sentinel");
14
+ }
15
+ if (!input.credentials?.participantId.trim() ||
16
+ !input.credentials.userId.trim() ||
17
+ !input.credentials.password.trim()) {
18
+ return new validator_1.UnavailableQualifiedVatValidator("missing_credentials");
19
+ }
20
+ const client = input.client ??
21
+ new client_1.FinanzOnlineClient(new client_1.NodeSoapFinanzOnlineOperations(), input.credentials);
22
+ return new validator_2.FinanzOnlineQualifiedVatValidator(client);
23
+ };
24
+ exports.selectQualifiedVatValidator = selectQualifiedVatValidator;
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW50ZWdyYXRpb25zL3JlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUtvQjtBQUNwQixrREFLOEI7QUFDOUIsd0RBQTRFO0FBV3JFLE1BQU0sMkJBQTJCLEdBQUcsQ0FDekMsS0FBdUMsRUFDaEIsRUFBRTtJQUN6QixJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNyRCxPQUFPLElBQUksNENBQWdDLENBQ3pDLDhCQUE4QixDQUMvQixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQ0UsSUFBQSx1Q0FBMkIsRUFBQyxLQUFLLENBQUMsaUJBQWlCLENBQUM7UUFDcEQsOENBQWtDLEVBQ2xDLENBQUM7UUFDRCxPQUFPLElBQUksNENBQWdDLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtJQUN0RSxDQUFDO0lBRUQsSUFDRSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLElBQUksRUFBRTtRQUN4QyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtRQUNoQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUNsQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLDRDQUFnQyxDQUFDLHFCQUFxQixDQUFDLENBQUE7SUFDcEUsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUNWLEtBQUssQ0FBQyxNQUFNO1FBQ1osSUFBSSwyQkFBa0IsQ0FDcEIsSUFBSSx1Q0FBOEIsRUFBRSxFQUNwQyxLQUFLLENBQUMsV0FBVyxDQUNsQixDQUFBO0lBRUgsT0FBTyxJQUFJLDZDQUFpQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ3RELENBQUMsQ0FBQTtBQWhDWSxRQUFBLDJCQUEyQiwrQkFnQ3ZDIn0=
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UnavailableQualifiedVatValidator = exports.normalizeQualifiedVatNumber = exports.QUALIFIED_VAT_DEVELOPMENT_SENTINEL = void 0;
4
+ exports.QUALIFIED_VAT_DEVELOPMENT_SENTINEL = "ATU00000000";
5
+ const normalizeQualifiedVatNumber = (value) => value.replace(/\s+/g, "").toUpperCase();
6
+ exports.normalizeQualifiedVatNumber = normalizeQualifiedVatNumber;
7
+ class UnavailableQualifiedVatValidator {
8
+ constructor(reason_) {
9
+ this.reason_ = reason_;
10
+ this.availability = "unavailable";
11
+ this.provider = "local-unavailable";
12
+ }
13
+ async validate() {
14
+ return {
15
+ status: "unavailable",
16
+ provider: null,
17
+ reason: this.reason_,
18
+ };
19
+ }
20
+ }
21
+ exports.UnavailableQualifiedVatValidator = UnavailableQualifiedVatValidator;
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2ludGVncmF0aW9ucy92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS2EsUUFBQSxrQ0FBa0MsR0FBRyxhQUFhLENBQUE7QUFFeEQsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLEtBQWEsRUFBVSxFQUFFLENBQ25FLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBRDVCLFFBQUEsMkJBQTJCLCtCQUNDO0FBVXpDLE1BQWEsZ0NBQWdDO0lBTTNDLFlBQTZCLE9BQWU7UUFBZixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBSG5DLGlCQUFZLEdBQUcsYUFBc0IsQ0FBQTtRQUNyQyxhQUFRLEdBQUcsbUJBQW1CLENBQUE7SUFFUSxDQUFDO0lBRWhELEtBQUssQ0FBQyxRQUFRO1FBQ1osT0FBTztZQUNMLE1BQU0sRUFBRSxhQUFhO1lBQ3JCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQ3JCLENBQUE7SUFDSCxDQUFDO0NBQ0Y7QUFmRCw0RUFlQyJ9
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.evaluateEligibility = 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
+ const evaluateEligibility = (facts) => {
20
+ const customerCountryCode = facts.customerVatNumber.slice(0, 2).toLowerCase();
21
+ const deliveryCountryCode = facts.deliveryCountryCode.toLowerCase();
22
+ const merchantCountryCode = facts.merchantCountryCode.toLowerCase();
23
+ const checks = {
24
+ addressMatches: addressMatches(facts.billingAddress, facts.provider.addressLines),
25
+ companyMatches: comparable(facts.companyName) === comparable(facts.provider.name ?? ""),
26
+ crossBorder: deliveryCountryCode !== merchantCountryCode,
27
+ vatCountryMatchesDelivery: customerCountryCode === deliveryCountryCode,
28
+ };
29
+ if (!facts.provider.valid) {
30
+ return { status: "invalid", reason: "provider_invalid", checks };
31
+ }
32
+ if (!checks.companyMatches || !checks.addressMatches) {
33
+ return { status: "invalid", reason: "submitted_facts_mismatch", checks };
34
+ }
35
+ if (!checks.crossBorder || !checks.vatCountryMatchesDelivery) {
36
+ return { status: "ineligible", reason: "country_policy", checks };
37
+ }
38
+ return { status: "eligible", reason: "qualified_cross_border", checks };
39
+ };
40
+ exports.evaluateEligibility = evaluateEligibility;
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1wb2xpY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9kb21haW4vdmFsaWRhdGlvbi1wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMEJBLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBYSxFQUFVLEVBQUUsQ0FDM0MsS0FBSztLQUNGLFNBQVMsQ0FBQyxNQUFNLENBQUM7S0FDakIsT0FBTyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQztLQUMvQixpQkFBaUIsQ0FBQyxPQUFPLENBQUM7S0FDMUIsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUU5QixNQUFNLGNBQWMsR0FBRyxDQUNyQixPQUF3QixFQUN4QixvQkFBOEIsRUFDckIsRUFBRTtJQUNYLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNsRSxNQUFNLGFBQWEsR0FBRztRQUNwQixPQUFPLENBQUMsUUFBUTtRQUNoQixPQUFPLENBQUMsUUFBUTtRQUNoQixPQUFPLENBQUMsVUFBVTtRQUNsQixPQUFPLENBQUMsSUFBSTtLQUNiLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFtQixFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFFNUQsT0FBTyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbEYsQ0FBQyxDQUFBO0FBRU0sTUFBTSxtQkFBbUIsR0FBRyxDQUNqQyxLQUF1QixFQUNGLEVBQUU7SUFDdkIsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUM3RSxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNuRSxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNuRSxNQUFNLE1BQU0sR0FBRztRQUNiLGNBQWMsRUFBRSxjQUFjLENBQzVCLEtBQUssQ0FBQyxjQUFjLEVBQ3BCLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUM1QjtRQUNELGNBQWMsRUFDWixVQUFVLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDekUsV0FBVyxFQUFFLG1CQUFtQixLQUFLLG1CQUFtQjtRQUN4RCx5QkFBeUIsRUFBRSxtQkFBbUIsS0FBSyxtQkFBbUI7S0FDdkUsQ0FBQTtJQUVELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsQ0FBQTtJQUNsRSxDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFBO0lBQzFFLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsQ0FBQTtJQUNuRSxDQUFDO0lBRUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sRUFBRSxDQUFBO0FBQ3pFLENBQUMsQ0FBQTtBQTlCWSxRQUFBLG1CQUFtQix1QkE4Qi9CIn0=
@@ -0,0 +1,14 @@
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 service_1 = __importDefault(require("./service"));
9
+ exports.TaxComplianceService = service_1.default;
10
+ exports.TAX_COMPLIANCE_MODULE = "tax_compliance";
11
+ exports.default = (0, utils_1.Module)(exports.TAX_COMPLIANCE_MODULE, {
12
+ service: service_1.default,
13
+ });
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxxREFBa0Q7QUFFbEQsd0RBQTRDO0FBUW5DLCtCQVJGLGlCQUFvQixDQVFFO0FBTmhCLFFBQUEscUJBQXFCLEdBQUcsZ0JBQWdCLENBQUE7QUFFckQsa0JBQWUsSUFBQSxjQUFNLEVBQUMsNkJBQXFCLEVBQUU7SUFDM0MsT0FBTyxFQUFFLGlCQUFvQjtDQUM5QixDQUFDLENBQUEifQ==
@@ -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==