@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.
- package/.medusa/server/src/admin/index.js +26 -0
- package/.medusa/server/src/admin/index.mjs +27 -0
- package/.medusa/server/src/api/middlewares.js +14 -0
- package/.medusa/server/src/api/store/carts/[id]/tax-identification/route.js +128 -0
- package/.medusa/server/src/integrations/finanzonline/client.js +182 -0
- package/.medusa/server/src/integrations/finanzonline/validator.js +50 -0
- package/.medusa/server/src/integrations/registry.js +25 -0
- package/.medusa/server/src/integrations/validator.js +22 -0
- package/.medusa/server/src/modules/tax-compliance/domain/validation-policy.js +41 -0
- package/.medusa/server/src/modules/tax-compliance/index.js +14 -0
- package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814120459.js +18 -0
- package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814121724.js +14 -0
- package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814153410.js +14 -0
- package/.medusa/server/src/modules/tax-compliance/models/tax-compliance-validation.js +59 -0
- package/.medusa/server/src/modules/tax-compliance/service.js +477 -0
- package/.medusa/server/src/providers/tax-compliance/index.js +11 -0
- package/.medusa/server/src/providers/tax-compliance/service.js +152 -0
- package/.medusa/server/src/types/index.js +3 -0
- package/.medusa/server/src/types/tax-compliance.js +10 -0
- package/.medusa/server/src/utils/resolve-services.js +7 -0
- package/.medusa/server/src/workflows/hooks/cart-tax-context.js +46 -0
- package/.medusa/server/src/workflows/hooks/complete-cart-order-evidence.js +10 -0
- package/.medusa/server/src/workflows/hooks/order-tax-context.js +93 -0
- package/.medusa/server/src/workflows/hooks/shipping-tax-apportionment.js +91 -0
- package/.medusa/server/src/workflows/tax-compliance/freeze-order-evidence.js +42 -0
- package/.medusa/server/src/workflows/tax-compliance/submit-tax-identification.js +11 -0
- package/LICENSE +21 -0
- package/README.md +189 -0
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2NhcnRzL1tpZF0vdGF4LWlkZW50aWZpY2F0aW9uL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLHFEQUdrQztBQUVsQyw0REFHb0M7QUFNcEMsNEVBQW1GO0FBQ25GLGlIQUFtSDtBQWlDbkgsTUFBTSxVQUFVLEdBQUc7SUFDakIsSUFBSTtJQUNKLGVBQWU7SUFDZixrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsV0FBVztJQUNYLE9BQU87SUFDUCxtQkFBbUI7SUFDbkIsb0JBQW9CO0lBQ3BCLFNBQVM7SUFDVCxtQkFBbUI7SUFDbkIscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQiw4QkFBOEI7SUFDOUIsZ0NBQWdDO0NBQ2pDLENBQUE7QUFFRCxNQUFNLHNCQUFzQixHQUFHLENBQzdCLE9BQXVDLEVBQ3ZDLEtBQWEsRUFNYixFQUFFO0lBQ0YsSUFDRSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO1FBQzNCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7UUFDckIsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRTtRQUM3QixDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEVBQzVCLENBQUM7UUFDRCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixHQUFHLEtBQUsseUJBQXlCLENBQ2xDLENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTyxPQUtOLENBQUE7QUFDSCxDQUFDLENBQUE7QUFFRCxNQUFNLGFBQWEsR0FBRyxLQUFLLEVBQ3pCLEVBQVUsRUFDVixLQUFrQyxFQUNsQyxzQkFBZ0MsRUFDQSxFQUFFO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDNUQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztRQUNqQyxNQUFNLEVBQUUsTUFBTTtRQUNkLE1BQU0sRUFBRSxVQUFVO1FBQ2xCLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRTtLQUNoQixDQUFDLENBQUE7SUFDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFzQyxDQUFBO0lBQ3pELElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztRQUNyRSxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMzQixpQkFBaUIsRUFBRSxjQUFjLENBQ2xDLENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDLENBQUE7QUFFRCxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQWMsRUFBVSxFQUFFO0lBQzFDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNsQyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQy9DLENBQUMsQ0FBQTtBQUVELE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBMkIsRUFBaUIsRUFBRSxDQUNoRSxNQUFNLEtBQUssYUFBYTtJQUN0QixDQUFDLENBQUMsb0ZBQW9GO0lBQ3RGLENBQUMsQ0FBQyxJQUFJLENBQUE7QUFFSCxNQUFNLElBQUksR0FBRyxLQUFLLEVBQ3ZCLEdBQW9ELEVBQ3BELEdBQW9ELEVBQ3JDLEVBQUU7SUFDakIsTUFBTSxzQkFBc0IsR0FDMUIsR0FBRyxDQUFDLHVCQUF1QixDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQTtJQUNyRCxNQUFNLFdBQVcsR0FBRyxNQUFNLGFBQWEsQ0FDckMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQ2IsR0FBRyxDQUFDLEtBQUssRUFDVCxzQkFBc0IsQ0FDdkIsQ0FBQTtJQUNELE1BQU0sY0FBYyxHQUFHLHNCQUFzQixDQUMzQyxXQUFXLENBQUMsZUFBZSxFQUMzQixTQUFTLENBQ1YsQ0FBQTtJQUNELE1BQU0sZUFBZSxHQUFHLHNCQUFzQixDQUM1QyxXQUFXLENBQUMsZ0JBQWdCLEVBQzVCLFVBQVUsQ0FDWCxDQUFBO0lBQ0QsS0FBSyxlQUFlLENBQUE7SUFFcEIsTUFBTSxJQUFBLCtCQUFrQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDdEMsS0FBSyxFQUFFO1lBQ0wsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO1lBQ2xCLGVBQWUsRUFBRSxjQUFjLENBQUMsRUFBRTtnQkFDaEMsQ0FBQyxDQUFDO29CQUNFLEVBQUUsRUFBRSxjQUFjLENBQUMsRUFBRTtvQkFDckIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsWUFBWTtpQkFDeEM7Z0JBQ0gsQ0FBQyxDQUFDO29CQUNFLFNBQVMsRUFBRSxjQUFjLENBQUMsU0FBUztvQkFDbkMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxJQUFJO29CQUN6QixPQUFPLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxZQUFZO29CQUN2QyxZQUFZLEVBQUUsY0FBYyxDQUFDLFlBQVk7b0JBQ3pDLFdBQVcsRUFBRSxjQUFjLENBQUMsV0FBVztpQkFDeEM7U0FDTjtLQUNGLENBQUMsQ0FBQTtJQUVGLE1BQU0sV0FBVyxHQUFHLE1BQU0sYUFBYSxDQUNyQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFDYixHQUFHLENBQUMsS0FBSyxFQUNULHNCQUFzQixDQUN2QixDQUFBO0lBQ0QsTUFBTSxxQkFBcUIsR0FBRyxzQkFBc0IsQ0FDbEQsV0FBVyxDQUFDLGVBQWUsRUFDM0IsU0FBUyxDQUNWLENBQUE7SUFDRCxNQUFNLHNCQUFzQixHQUFHLHNCQUFzQixDQUNuRCxXQUFXLENBQUMsZ0JBQWdCLEVBQzVCLFVBQVUsQ0FDWCxDQUFBO0lBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBQSw4Q0FBMkIsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtJQUM1RSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQ2xDLHVEQUF1RCxDQUN4RCxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxJQUFBLDJEQUErQixFQUNoRSxHQUFHLENBQUMsS0FBSyxDQUNWLENBQUMsR0FBRyxDQUFDO1FBQ0osS0FBSyxFQUFFO1lBQ0wsT0FBTyxFQUFFLFdBQVcsQ0FBQyxFQUFFO1lBQ3ZCLFlBQVksRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLFlBQVk7WUFDNUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVO1lBQ2pELGVBQWUsRUFBRTtnQkFDZixRQUFRLEVBQUUscUJBQXFCLENBQUMsU0FBUztnQkFDekMsUUFBUSxFQUFFLHFCQUFxQixDQUFDLFNBQVM7Z0JBQ3pDLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxJQUFJO2dCQUNoQyxXQUFXLEVBQUUscUJBQXFCLENBQUMsWUFBWTtnQkFDL0MsVUFBVSxFQUFFLHFCQUFxQixDQUFDLFdBQVc7YUFDOUM7WUFDRCxxQkFBcUIsRUFBRSxzQkFBc0IsQ0FBQyxZQUFZO1lBQzFELHFCQUFxQixFQUFFLFFBQVEsQ0FBQyxXQUFXO1lBQzNDLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxTQUFTO1NBQ3hDO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsTUFBTSxJQUFBLG1DQUFzQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDMUMsS0FBSyxFQUFFO1lBQ0wsT0FBTyxFQUFFLFdBQVcsQ0FBQyxFQUFFO1lBQ3ZCLHFCQUFxQixFQUFFLElBQUk7U0FDNUI7S0FDRixDQUFDLENBQUE7SUFFRixNQUFNLElBQUksR0FBRyxNQUFNLGFBQWEsQ0FDOUIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQ2IsR0FBRyxDQUFDLEtBQUssRUFDVCxzQkFBc0IsQ0FDdkIsQ0FBQTtJQUNELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUE2QixDQUFBO0lBQ3JELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ25CLE1BQU07UUFDTixPQUFPLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLEVBQUU7WUFDSixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWCxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDakMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ2pDLGNBQWMsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUM3QyxjQUFjLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDN0MsU0FBUyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ25DLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztTQUM1QjtLQUNGLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQTtBQTFHWSxRQUFBLElBQUksUUEwR2hCIn0=
|
|
@@ -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==
|