@hartl-services/medusa-base 2.10.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.
- package/.medusa/server/src/admin/index.js +44 -40
- package/.medusa/server/src/admin/index.mjs +44 -40
- package/.medusa/server/src/api/admin/tax-compliance/customer-addresses/[address_id]/tax-identification/route.js +15 -0
- package/.medusa/server/src/api/check-customer-address-tax-identification.js +93 -0
- package/.medusa/server/src/api/customer-address-identification-response.js +14 -0
- package/.medusa/server/src/api/middlewares.js +55 -1
- package/.medusa/server/src/api/store/carts/[id]/tax-identification/route.js +179 -0
- package/.medusa/server/src/api/store/customers/me/addresses/[address_id]/tax-identification/route.js +12 -0
- package/.medusa/server/src/api/store/customers/me/tax-identifications/route.js +14 -0
- package/.medusa/server/src/api/store/tax-identification-policy/route.js +21 -0
- package/.medusa/server/src/api/tax-identification-message.js +9 -0
- package/.medusa/server/src/api/to-response-amount.js +19 -0
- package/.medusa/server/src/email/application/deliver-ephemeral-auth-mail.js +2 -4
- package/.medusa/server/src/email/application/handle-password-reset-event.js +75 -27
- package/.medusa/server/src/email/rendering/default-templates.js +2 -1
- package/.medusa/server/src/email/rendering/render-email.js +2 -1
- package/.medusa/server/src/email/rendering/resolve-shop-configuration.js +5 -1
- package/.medusa/server/src/email/templates/blocks/dynamic-blocks.js +5 -2
- package/.medusa/server/src/email/templates/defaults/documents.js +8 -1
- package/.medusa/server/src/email/templates/defaults/subjects.js +3 -1
- package/.medusa/server/src/email/templates/defaults/texts.js +4 -2
- package/.medusa/server/src/email/templates/render.js +2 -1
- package/.medusa/server/src/email/templates/sample-data.js +5 -1
- package/.medusa/server/src/email/types/email-kinds.js +3 -1
- package/.medusa/server/src/email/types/template-data.js +8 -1
- package/.medusa/server/src/jobs/tax-compliance-state-sync.js +26 -0
- package/.medusa/server/src/modules/email/migrations/Migration20261013120000.js +20 -0
- package/.medusa/server/src/modules/tax-compliance/domain/validation-policy.js +48 -0
- package/.medusa/server/src/modules/tax-compliance/index.js +15 -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/migrations/Migration20260929091620.js +27 -0
- package/.medusa/server/src/modules/tax-compliance/migrations/Migration20261011090147.js +16 -0
- package/.medusa/server/src/modules/tax-compliance/models/tax-compliance-state.js +29 -0
- package/.medusa/server/src/modules/tax-compliance/models/tax-compliance-validation.js +74 -0
- package/.medusa/server/src/modules/tax-compliance/runtime-settings.js +43 -0
- package/.medusa/server/src/modules/tax-compliance/service.js +693 -0
- package/.medusa/server/src/providers/tax-compliance/index.js +11 -0
- package/.medusa/server/src/providers/tax-compliance/service.js +179 -0
- package/.medusa/server/src/public/constants.js +4 -2
- package/.medusa/server/src/public/index.js +6 -2
- package/.medusa/server/src/public/tax-compliance.js +22 -0
- package/.medusa/server/src/shared/lib/index.js +2 -1
- package/.medusa/server/src/shared/lib/optional-registration.js +34 -0
- package/.medusa/server/src/shop-config/build-food-shop-config.js +12 -9
- package/.medusa/server/src/subscribers/tax-compliance-plugin-features-updated.js +25 -0
- package/.medusa/server/src/tax-compliance/complete-cart-hooks.js +26 -0
- package/.medusa/server/src/tax-compliance/integrations/finanzonline/client.js +222 -0
- package/.medusa/server/src/tax-compliance/integrations/finanzonline/validator.js +50 -0
- package/.medusa/server/src/tax-compliance/integrations/registry.js +26 -0
- package/.medusa/server/src/tax-compliance/integrations/validator.js +19 -0
- package/.medusa/server/src/tax-compliance/lib/order-tax-context.js +100 -0
- package/.medusa/server/src/tax-compliance/lib/tax-compliance-state.js +59 -0
- package/.medusa/server/src/tax-compliance/lib/tax-runtime-settings.js +79 -0
- package/.medusa/server/src/tax-compliance/plugin-features.js +73 -0
- package/.medusa/server/src/tax-compliance/resolve-services.js +7 -0
- package/.medusa/server/src/tax-compliance/types/tax-compliance.js +6 -0
- package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +25 -30
- package/.medusa/server/src/workflows/documents/issue-packing-list.js +3 -14
- package/.medusa/server/src/workflows/hooks/cart-tax-context.js +78 -0
- package/.medusa/server/src/workflows/hooks/order-tax-context.js +7 -0
- package/.medusa/server/src/workflows/hooks/shipping-tax-apportionment.js +145 -0
- package/.medusa/server/src/workflows/tax-compliance/apportion-order-shipping-tax.js +72 -0
- package/.medusa/server/src/workflows/tax-compliance/domain/requires-frozen-tax-evidence.js +27 -0
- package/.medusa/server/src/workflows/tax-compliance/freeze-order-evidence.js +125 -0
- package/.medusa/server/src/workflows/tax-compliance/submit-customer-address-tax-identification.js +18 -0
- package/.medusa/server/src/workflows/tax-compliance/submit-tax-identification.js +18 -0
- package/README.md +369 -27
- package/dist/email/types/email-kinds.d.ts +3 -2
- package/dist/email/types/email-kinds.js +2 -0
- package/dist/email/types/shop-configuration.d.ts +8 -0
- package/dist/email/types/template-data.d.ts +6 -1
- package/dist/email/types/template-data.js +7 -0
- package/dist/public/constants.d.ts +2 -0
- package/dist/public/constants.js +3 -1
- package/dist/public/index.d.ts +2 -1
- package/dist/public/index.js +5 -1
- package/dist/public/tax-compliance.d.ts +30 -0
- package/dist/public/tax-compliance.js +21 -0
- package/dist/shared/lib/index.d.ts +1 -0
- package/dist/shared/lib/index.js +1 -0
- package/dist/shared/lib/optional-registration.d.ts +18 -0
- package/dist/shared/lib/optional-registration.js +33 -0
- package/dist/shop-config/build-food-shop-config.d.ts +2 -2
- package/dist/shop-config/build-food-shop-config.js +11 -8
- package/package.json +5 -4
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FinanzOnlineClient = exports.FINANZONLINE_LOGOUT_TIMEOUT_MS = exports.FINANZONLINE_VALIDATION_TIMEOUT_MS = exports.NodeSoapFinanzOnlineOperations = exports.buildStage2UidRequest = exports.FINANZONLINE_UID_WSDL = exports.FINANZONLINE_SESSION_WSDL = void 0;
|
|
4
|
+
const lib_1 = require("../../../shared/lib");
|
|
5
|
+
const soap_1 = require("soap");
|
|
6
|
+
exports.FINANZONLINE_SESSION_WSDL = "https://finanzonline.bmf.gv.at/fonws/ws/sessionService.wsdl";
|
|
7
|
+
exports.FINANZONLINE_UID_WSDL = "https://finanzonline.bmf.gv.at/fonuid/ws/uidAbfrageService.wsdl";
|
|
8
|
+
const buildStage2UidRequest = (input) => ({
|
|
9
|
+
tid: input.participantId,
|
|
10
|
+
benid: input.userId,
|
|
11
|
+
id: input.sessionId,
|
|
12
|
+
uid_tn: input.requestingVatNumber,
|
|
13
|
+
uid: input.targetVatNumber,
|
|
14
|
+
stufe: "2",
|
|
15
|
+
});
|
|
16
|
+
exports.buildStage2UidRequest = buildStage2UidRequest;
|
|
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 (0, lib_1.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, timeoutMs, operation) => {
|
|
37
|
+
const deadline = Date.now() + timeoutMs;
|
|
38
|
+
const client = await (0, soap_1.createClientAsync)(wsdl, {
|
|
39
|
+
wsdl_options: { timeout: timeoutMs },
|
|
40
|
+
});
|
|
41
|
+
try {
|
|
42
|
+
return await operation(client, {
|
|
43
|
+
timeout: Math.max(1, deadline - Date.now()),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
scrubSoapTransportState(client);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* The only class that knows the node-soap dynamic method names and the official
|
|
52
|
+
* FinanzOnline wire parameter names. Raw SOAP requests and responses never
|
|
53
|
+
* leave this boundary.
|
|
54
|
+
*/
|
|
55
|
+
class NodeSoapFinanzOnlineOperations {
|
|
56
|
+
async login(input, timeoutMs) {
|
|
57
|
+
const result = await withValidationScopedSoapClient(exports.FINANZONLINE_SESSION_WSDL, timeoutMs, async (client, requestOptions) => firstSoapResult(await client.loginAsync({
|
|
58
|
+
tid: input.participantId,
|
|
59
|
+
benid: input.userId,
|
|
60
|
+
pin: input.password,
|
|
61
|
+
herstellerid: input.manufacturerId,
|
|
62
|
+
}, requestOptions)));
|
|
63
|
+
return {
|
|
64
|
+
id: optionalString(result.id),
|
|
65
|
+
rc: asNumber(result.rc),
|
|
66
|
+
msg: optionalString(result.msg),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async queryUid(input, timeoutMs) {
|
|
70
|
+
const result = await withValidationScopedSoapClient(exports.FINANZONLINE_UID_WSDL, timeoutMs, async (client, requestOptions) => firstSoapResult(await client.uidAbfrageAsync((0, exports.buildStage2UidRequest)(input), requestOptions)));
|
|
71
|
+
return {
|
|
72
|
+
rc: asNumber(result.rc),
|
|
73
|
+
msg: optionalString(result.msg),
|
|
74
|
+
name: optionalString(result.name),
|
|
75
|
+
adrz1: optionalString(result.adrz1),
|
|
76
|
+
adrz2: optionalString(result.adrz2),
|
|
77
|
+
adrz3: optionalString(result.adrz3),
|
|
78
|
+
adrz4: optionalString(result.adrz4),
|
|
79
|
+
adrz5: optionalString(result.adrz5),
|
|
80
|
+
adrz6: optionalString(result.adrz6),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async logout(input, timeoutMs) {
|
|
84
|
+
const result = await withValidationScopedSoapClient(exports.FINANZONLINE_SESSION_WSDL, timeoutMs, async (client, requestOptions) => firstSoapResult(await client.logoutAsync({
|
|
85
|
+
tid: input.participantId,
|
|
86
|
+
benid: input.userId,
|
|
87
|
+
id: input.sessionId,
|
|
88
|
+
}, requestOptions)));
|
|
89
|
+
return {
|
|
90
|
+
rc: asNumber(result.rc),
|
|
91
|
+
msg: optionalString(result.msg),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.NodeSoapFinanzOnlineOperations = NodeSoapFinanzOnlineOperations;
|
|
96
|
+
const INVALID_TARGET_UID_RETURN_CODES = new Set([1, 4]);
|
|
97
|
+
/**
|
|
98
|
+
* Login and UID query share this budget. The checkout waits 15 s for the
|
|
99
|
+
* whole tax-identification request, which also recomputes the cart, and the
|
|
100
|
+
* check runs inside a database transaction that holds the UID lock.
|
|
101
|
+
*/
|
|
102
|
+
exports.FINANZONLINE_VALIDATION_TIMEOUT_MS = 10_000;
|
|
103
|
+
/** Best-effort logout after the budget above. */
|
|
104
|
+
exports.FINANZONLINE_LOGOUT_TIMEOUT_MS = 3_000;
|
|
105
|
+
const MAX_DIAGNOSTIC_LENGTH = 500;
|
|
106
|
+
const describeReturnCode = (response) => `rc=${response.rc}${response.msg ? `: ${response.msg}` : ""}`;
|
|
107
|
+
class FinanzOnlineClient {
|
|
108
|
+
constructor(operations_, credentials_, logger_, now_ = Date.now) {
|
|
109
|
+
this.operations_ = operations_;
|
|
110
|
+
this.credentials_ = credentials_;
|
|
111
|
+
this.logger_ = logger_;
|
|
112
|
+
this.now_ = now_;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* The shopper only sees "nicht verfügbar"; the FinanzOnline answer goes to
|
|
116
|
+
* the log. The PIN is masked in case a provider message ever echoes it.
|
|
117
|
+
*/
|
|
118
|
+
warn_(message) {
|
|
119
|
+
try {
|
|
120
|
+
const masked = message
|
|
121
|
+
.split(this.credentials_.password)
|
|
122
|
+
.join("***")
|
|
123
|
+
.slice(0, MAX_DIAGNOSTIC_LENGTH);
|
|
124
|
+
this.logger_?.warn(`Tax compliance: FinanzOnline-UID-Prüfung nicht verfügbar – ${masked}`);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Logging must not change the validation outcome.
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async validateUid(input) {
|
|
131
|
+
let sessionId;
|
|
132
|
+
let stage = "Login";
|
|
133
|
+
const deadline = this.now_() + exports.FINANZONLINE_VALIDATION_TIMEOUT_MS;
|
|
134
|
+
const remaining = () => Math.max(1, deadline - this.now_());
|
|
135
|
+
try {
|
|
136
|
+
const login = await this.operations_.login({
|
|
137
|
+
...this.credentials_,
|
|
138
|
+
manufacturerId: input.requestingVatNumber,
|
|
139
|
+
}, remaining());
|
|
140
|
+
if (login.rc !== 0 || !login.id) {
|
|
141
|
+
this.warn_(`Login abgelehnt (${describeReturnCode(login)})`);
|
|
142
|
+
return {
|
|
143
|
+
status: "unavailable",
|
|
144
|
+
provider: null,
|
|
145
|
+
reason: "provider_unavailable",
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
sessionId = login.id;
|
|
149
|
+
stage = "UID-Abfrage";
|
|
150
|
+
const result = await this.operations_.queryUid({
|
|
151
|
+
participantId: this.credentials_.participantId,
|
|
152
|
+
requestingVatNumber: input.requestingVatNumber,
|
|
153
|
+
sessionId,
|
|
154
|
+
targetVatNumber: input.targetVatNumber,
|
|
155
|
+
userId: this.credentials_.userId,
|
|
156
|
+
}, remaining());
|
|
157
|
+
if (result.rc === 0 && result.name) {
|
|
158
|
+
return {
|
|
159
|
+
status: "valid",
|
|
160
|
+
provider: {
|
|
161
|
+
valid: true,
|
|
162
|
+
name: result.name,
|
|
163
|
+
addressLines: [
|
|
164
|
+
result.adrz1,
|
|
165
|
+
result.adrz2,
|
|
166
|
+
result.adrz3,
|
|
167
|
+
result.adrz4,
|
|
168
|
+
result.adrz5,
|
|
169
|
+
result.adrz6,
|
|
170
|
+
].filter((line) => Boolean(line)),
|
|
171
|
+
reference: null,
|
|
172
|
+
returnCode: result.rc,
|
|
173
|
+
},
|
|
174
|
+
reason: "provider_valid",
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
if (INVALID_TARGET_UID_RETURN_CODES.has(result.rc)) {
|
|
178
|
+
return {
|
|
179
|
+
status: "invalid",
|
|
180
|
+
provider: {
|
|
181
|
+
valid: false,
|
|
182
|
+
name: null,
|
|
183
|
+
addressLines: [],
|
|
184
|
+
reference: null,
|
|
185
|
+
returnCode: result.rc,
|
|
186
|
+
},
|
|
187
|
+
reason: "provider_invalid",
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
this.warn_(`UID-Abfrage ohne Ergebnis (${describeReturnCode(result)})`);
|
|
191
|
+
return {
|
|
192
|
+
status: "unavailable",
|
|
193
|
+
provider: null,
|
|
194
|
+
reason: "provider_unavailable",
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
this.warn_(`${stage} fehlgeschlagen: ${error instanceof Error ? error.message : String(error)}`);
|
|
199
|
+
return {
|
|
200
|
+
status: "unavailable",
|
|
201
|
+
provider: null,
|
|
202
|
+
reason: "technical_error",
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
finally {
|
|
206
|
+
if (sessionId) {
|
|
207
|
+
try {
|
|
208
|
+
await this.operations_.logout({
|
|
209
|
+
participantId: this.credentials_.participantId,
|
|
210
|
+
sessionId,
|
|
211
|
+
userId: this.credentials_.userId,
|
|
212
|
+
}, exports.FINANZONLINE_LOGOUT_TIMEOUT_MS);
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
// Validation evidence is still usable when best-effort logout fails.
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
exports.FinanzOnlineClient = FinanzOnlineClient;
|
|
222
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3RheC1jb21wbGlhbmNlL2ludGVncmF0aW9ucy9maW5hbnpvbmxpbmUvY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE4QztBQUM5QywrQkFBcUQ7QUFJeEMsUUFBQSx5QkFBeUIsR0FDcEMsNkRBQTZELENBQUE7QUFDbEQsUUFBQSxxQkFBcUIsR0FDaEMsaUVBQWlFLENBQUE7QUFvQjVELE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxLQUFvQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlELEdBQUcsRUFBRSxLQUFLLENBQUMsYUFBYTtJQUN4QixLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU07SUFDbkIsRUFBRSxFQUFFLEtBQUssQ0FBQyxTQUFTO0lBQ25CLE1BQU0sRUFBRSxLQUFLLENBQUMsbUJBQW1CO0lBQ2pDLEdBQUcsRUFBRSxLQUFLLENBQUMsZUFBZTtJQUMxQixLQUFLLEVBQUUsR0FBWTtDQUNwQixDQUFDLENBQUE7QUFQVyxRQUFBLHFCQUFxQix5QkFPaEM7QUFnREYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFjLEVBQVUsRUFBRTtJQUMxQyxNQUFNLE1BQU0sR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hFLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFBO0FBQ3RELENBQUMsQ0FBQTtBQUVELE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBYyxFQUFzQixFQUFFLENBQzVELE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FB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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 lib_1 = require("../../../shared/lib");
|
|
5
|
+
const validation_policy_1 = require("../../../modules/tax-compliance/domain/validation-policy");
|
|
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, lib_1.normalizeVatNumber)(input.merchantVatNumber);
|
|
14
|
+
const targetVatNumber = (0, lib_1.normalizeVatNumber)(input.customerVatNumber);
|
|
15
|
+
if (requestingVatNumber === lib_1.VAT_NUMBER_PLACEHOLDER ||
|
|
16
|
+
targetVatNumber === lib_1.VAT_NUMBER_PLACEHOLDER) {
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3RheC1jb21wbGlhbmNlL2ludGVncmF0aW9ucy9maW5hbnpvbmxpbmUvdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUc0QjtBQUU1QixnR0FBOEY7QUFROUYsTUFBYSxpQ0FBaUM7SUFNNUMsWUFBNkIsT0FBK0I7UUFBL0IsWUFBTyxHQUFQLE9BQU8sQ0FBd0I7UUFIbkQsaUJBQVksR0FBRyxXQUFvQixDQUFBO1FBQ25DLGFBQVEsR0FBRyxpQkFBaUIsQ0FBQTtJQUUwQixDQUFDO0lBRWhFLEtBQUssQ0FBQyxRQUFRLENBQ1osS0FBa0M7UUFFbEMsTUFBTSxtQkFBbUIsR0FBRyxJQUFBLHdCQUFrQixFQUM1QyxLQUFLLENBQUMsaUJBQWlCLENBQ3hCLENBQUE7UUFDRCxNQUFNLGVBQWUsR0FBRyxJQUFBLHdCQUFrQixFQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBRW5FLElBQ0UsbUJBQW1CLEtBQUssNEJBQXNCO1lBQzlDLGVBQWUsS0FBSyw0QkFBc0IsRUFDMUMsQ0FBQztZQUNELE9BQU87Z0JBQ0wsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLFFBQVEsRUFBRSxJQUFJO2dCQUNkLE1BQU0sRUFBRSxjQUFjO2FBQ3ZCLENBQUE7UUFDSCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUM1QyxtQkFBbUI7WUFDbkIsZUFBZTtTQUNoQixDQUFDLENBQUE7UUFFRixJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDOUIsT0FBTztnQkFDTCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07Z0JBQ3JCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDekIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO2FBQ3RCLENBQUE7UUFDSCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBQSx1Q0FBbUIsRUFBQztZQUNuQyxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7WUFDcEMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzlCLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxpQkFBaUI7WUFDMUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtZQUM5QyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsbUJBQW1CO1lBQzlDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtTQUMxQixDQUFDLENBQUE7UUFFRixPQUFPO1lBQ0wsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1lBQ3ZCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN6QixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07U0FDeEIsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQXZERCw4RUF1REMifQ==
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.selectQualifiedVatValidator = void 0;
|
|
4
|
+
const lib_1 = require("../../shared/lib");
|
|
5
|
+
const validator_1 = require("./validator");
|
|
6
|
+
const client_1 = require("./finanzonline/client");
|
|
7
|
+
const validator_2 = require("./finanzonline/validator");
|
|
8
|
+
const selectQualifiedVatValidator = (input) => {
|
|
9
|
+
if (input.merchantCountryCode.toLowerCase() !== "at") {
|
|
10
|
+
return new validator_1.UnavailableQualifiedVatValidator("unsupported_merchant_country");
|
|
11
|
+
}
|
|
12
|
+
if ((0, lib_1.normalizeVatNumber)(input.merchantVatNumber) ===
|
|
13
|
+
lib_1.VAT_NUMBER_PLACEHOLDER) {
|
|
14
|
+
return new validator_1.UnavailableQualifiedVatValidator("merchant_uid_sentinel");
|
|
15
|
+
}
|
|
16
|
+
if (!input.credentials?.participantId.trim() ||
|
|
17
|
+
!input.credentials.userId.trim() ||
|
|
18
|
+
!input.credentials.password.trim()) {
|
|
19
|
+
return new validator_1.UnavailableQualifiedVatValidator("missing_credentials");
|
|
20
|
+
}
|
|
21
|
+
const client = input.client ??
|
|
22
|
+
new client_1.FinanzOnlineClient(new client_1.NodeSoapFinanzOnlineOperations(), input.credentials, input.logger);
|
|
23
|
+
return new validator_2.FinanzOnlineQualifiedVatValidator(client);
|
|
24
|
+
};
|
|
25
|
+
exports.selectQualifiedVatValidator = selectQualifiedVatValidator;
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdGF4LWNvbXBsaWFuY2UvaW50ZWdyYXRpb25zL3JlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDBDQUd5QjtBQUV6QiwyQ0FHb0I7QUFDcEIsa0RBTThCO0FBQzlCLHdEQUE0RTtBQVlyRSxNQUFNLDJCQUEyQixHQUFHLENBQ3pDLEtBQXVDLEVBQ2hCLEVBQUU7SUFDekIsSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDckQsT0FBTyxJQUFJLDRDQUFnQyxDQUN6Qyw4QkFBOEIsQ0FDL0IsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUNFLElBQUEsd0JBQWtCLEVBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDO1FBQzNDLDRCQUFzQixFQUN0QixDQUFDO1FBQ0QsT0FBTyxJQUFJLDRDQUFnQyxDQUFDLHVCQUF1QixDQUFDLENBQUE7SUFDdEUsQ0FBQztJQUVELElBQ0UsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxJQUFJLEVBQUU7UUFDeEMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7UUFDaEMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFDbEMsQ0FBQztRQUNELE9BQU8sSUFBSSw0Q0FBZ0MsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO0lBQ3BFLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FDVixLQUFLLENBQUMsTUFBTTtRQUNaLElBQUksMkJBQWtCLENBQ3BCLElBQUksdUNBQThCLEVBQUUsRUFDcEMsS0FBSyxDQUFDLFdBQVcsRUFDakIsS0FBSyxDQUFDLE1BQU0sQ0FDYixDQUFBO0lBRUgsT0FBTyxJQUFJLDZDQUFpQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ3RELENBQUMsQ0FBQTtBQWpDWSxRQUFBLDJCQUEyQiwrQkFpQ3ZDIn0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UnavailableQualifiedVatValidator = void 0;
|
|
4
|
+
class UnavailableQualifiedVatValidator {
|
|
5
|
+
constructor(reason_) {
|
|
6
|
+
this.reason_ = reason_;
|
|
7
|
+
this.availability = "unavailable";
|
|
8
|
+
this.provider = "local-unavailable";
|
|
9
|
+
}
|
|
10
|
+
async validate() {
|
|
11
|
+
return {
|
|
12
|
+
status: "unavailable",
|
|
13
|
+
provider: null,
|
|
14
|
+
reason: this.reason_,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.UnavailableQualifiedVatValidator = UnavailableQualifiedVatValidator;
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3RheC1jb21wbGlhbmNlL2ludGVncmF0aW9ucy92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBYUEsTUFBYSxnQ0FBZ0M7SUFNM0MsWUFBNkIsT0FBZTtRQUFmLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFIbkMsaUJBQVksR0FBRyxhQUFzQixDQUFBO1FBQ3JDLGFBQVEsR0FBRyxtQkFBbUIsQ0FBQTtJQUVRLENBQUM7SUFFaEQsS0FBSyxDQUFDLFFBQVE7UUFDWixPQUFPO1lBQ0wsTUFBTSxFQUFFLGFBQWE7WUFDckIsUUFBUSxFQUFFLElBQUk7WUFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDckIsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQWZELDRFQWVDIn0=
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createOrderTaxContextFromContainer = exports.createOrderTaxContext = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const tax_compliance_state_1 = require("./tax-compliance-state");
|
|
6
|
+
const resolve_services_1 = require("../resolve-services");
|
|
7
|
+
const shipping_tax_apportionment_1 = require("../../workflows/hooks/shipping-tax-apportionment");
|
|
8
|
+
const createOrderTaxContext = async (service, order) => {
|
|
9
|
+
const validationId = await service.getOrderValidationId(order.id);
|
|
10
|
+
return validationId
|
|
11
|
+
? {
|
|
12
|
+
tax_compliance_order_id: order.id,
|
|
13
|
+
tax_compliance_validation_id: validationId,
|
|
14
|
+
}
|
|
15
|
+
: undefined;
|
|
16
|
+
};
|
|
17
|
+
exports.createOrderTaxContext = createOrderTaxContext;
|
|
18
|
+
/**
|
|
19
|
+
* `updateOrderTaxLinesWorkflow`'s `setTaxLineContext` hook only carries the
|
|
20
|
+
* full item list on `order` for a whole-order recompute; a partial recompute
|
|
21
|
+
* (explicit item_ids/shipping_method_ids) fetches `order` without its items
|
|
22
|
+
* (see @medusajs/core-flows order/workflows/update-tax-lines.js `orderFields`
|
|
23
|
+
* vs `completeOrderFields`). Apportioning shipping tax always needs every
|
|
24
|
+
* item's current rate, not just the ones this particular call is touching,
|
|
25
|
+
* so this queries the order fresh whenever the hook's own order isn't
|
|
26
|
+
* already carrying its items.
|
|
27
|
+
*/
|
|
28
|
+
const resolveOrderForShippingApportionment = async (container, order) => {
|
|
29
|
+
if (Array.isArray(order.items) && order.currency_code) {
|
|
30
|
+
return order;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
34
|
+
const { data } = await query.graph({
|
|
35
|
+
entity: "order",
|
|
36
|
+
filters: { id: order.id },
|
|
37
|
+
fields: [
|
|
38
|
+
"id",
|
|
39
|
+
"currency_code",
|
|
40
|
+
"items.id",
|
|
41
|
+
"items.product_id",
|
|
42
|
+
"items.product_type_id",
|
|
43
|
+
"items.quantity",
|
|
44
|
+
// The order module fills `items.quantity` from the item detail only
|
|
45
|
+
// when the query joins it; without it every item weighs 0 and the
|
|
46
|
+
// order loses its apportioned shipping rate.
|
|
47
|
+
"items.detail.quantity",
|
|
48
|
+
"items.unit_price",
|
|
49
|
+
"shipping_address.country_code",
|
|
50
|
+
"shipping_address.province",
|
|
51
|
+
"shipping_address.address_1",
|
|
52
|
+
"shipping_address.address_2",
|
|
53
|
+
"shipping_address.city",
|
|
54
|
+
"shipping_address.postal_code",
|
|
55
|
+
"customer.id",
|
|
56
|
+
"customer.email",
|
|
57
|
+
"customer.groups.id",
|
|
58
|
+
],
|
|
59
|
+
});
|
|
60
|
+
return data[0] ?? null;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const createOrderTaxContextFromContainer = async (container, order) => {
|
|
67
|
+
let validationContext;
|
|
68
|
+
try {
|
|
69
|
+
validationContext = await (0, exports.createOrderTaxContext)((0, resolve_services_1.resolveTaxComplianceService)(container), order);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
try {
|
|
73
|
+
container
|
|
74
|
+
.resolve(utils_1.ContainerRegistrationKeys.LOGGER)
|
|
75
|
+
.warn("Tax compliance order context is unavailable; using ordinary B2C tax rates.");
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// A missing logger must not turn a tax-only failure into checkout failure.
|
|
79
|
+
}
|
|
80
|
+
validationContext = undefined;
|
|
81
|
+
}
|
|
82
|
+
// Frozen evidence of a completed order counts whatever `b2b` says now;
|
|
83
|
+
// only the shipping apportionment follows the stored toggle mirror.
|
|
84
|
+
if (!(await (0, tax_compliance_state_1.readTaxComplianceState)(container)).shipping_tax_active) {
|
|
85
|
+
return validationContext;
|
|
86
|
+
}
|
|
87
|
+
const fullOrder = await resolveOrderForShippingApportionment(container, order);
|
|
88
|
+
if (!fullOrder) {
|
|
89
|
+
return validationContext;
|
|
90
|
+
}
|
|
91
|
+
return (0, shipping_tax_apportionment_1.resolveShippingRateContext)(container, {
|
|
92
|
+
currencyCode: fullOrder.currency_code,
|
|
93
|
+
items: await (0, shipping_tax_apportionment_1.withLineDiscounts)(container, "order", fullOrder.id, fullOrder.items ?? []),
|
|
94
|
+
address: fullOrder.shipping_address,
|
|
95
|
+
customer: fullOrder.customer,
|
|
96
|
+
additionalContext: validationContext,
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
exports.createOrderTaxContextFromContainer = createOrderTaxContextFromContainer;
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItdGF4LWNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdGF4LWNvbXBsaWFuY2UvbGliL29yZGVyLXRheC1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLHFEQUFxRTtBQUVyRSxpRUFBK0Q7QUFDL0QsMERBQWlFO0FBQ2pFLGlHQUl5RDtBQU1sRCxNQUFNLHFCQUFxQixHQUFHLEtBQUssRUFDeEMsT0FBK0IsRUFDL0IsS0FBcUIsRUFDd0IsRUFBRTtJQUMvQyxNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDakUsT0FBTyxZQUFZO1FBQ2pCLENBQUMsQ0FBQztZQUNFLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ2pDLDRCQUE0QixFQUFFLFlBQVk7U0FDM0M7UUFDSCxDQUFDLENBQUMsU0FBUyxDQUFBO0FBQ2YsQ0FBQyxDQUFBO0FBWFksUUFBQSxxQkFBcUIseUJBV2pDO0FBc0JEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sb0NBQW9DLEdBQUcsS0FBSyxFQUNoRCxTQUEwQixFQUMxQixLQUE4RCxFQUNmLEVBQUU7SUFDakQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdEQsT0FBTyxLQUFpRCxDQUFBO0lBQzFELENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2hFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDakMsTUFBTSxFQUFFLE9BQU87WUFDZixPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUN6QixNQUFNLEVBQUU7Z0JBQ04sSUFBSTtnQkFDSixlQUFlO2dCQUNmLFVBQVU7Z0JBQ1Ysa0JBQWtCO2dCQUNsQix1QkFBdUI7Z0JBQ3ZCLGdCQUFnQjtnQkFDaEIsb0VBQW9FO2dCQUNwRSxrRUFBa0U7Z0JBQ2xFLDZDQUE2QztnQkFDN0MsdUJBQXVCO2dCQUN2QixrQkFBa0I7Z0JBQ2xCLCtCQUErQjtnQkFDL0IsMkJBQTJCO2dCQUMzQiw0QkFBNEI7Z0JBQzVCLDRCQUE0QjtnQkFDNUIsdUJBQXVCO2dCQUN2Qiw4QkFBOEI7Z0JBQzlCLGFBQWE7Z0JBQ2IsZ0JBQWdCO2dCQUNoQixvQkFBb0I7YUFDckI7U0FDRixDQUFDLENBQUE7UUFDRixPQUFRLElBQUksQ0FBQyxDQUFDLENBQThDLElBQUksSUFBSSxDQUFBO0lBQ3RFLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7QUFDSCxDQUFDLENBQUE7QUFFTSxNQUFNLGtDQUFrQyxHQUFHLEtBQUssRUFDckQsU0FBMEIsRUFDMUIsS0FBOEQsRUFDaEIsRUFBRTtJQUNoRCxJQUFJLGlCQUFxRCxDQUFBO0lBQ3pELElBQUksQ0FBQztRQUNILGlCQUFpQixHQUFHLE1BQU0sSUFBQSw2QkFBcUIsRUFDN0MsSUFBQSw4Q0FBMkIsRUFBQyxTQUFTLENBQUMsRUFDdEMsS0FBSyxDQUNOLENBQUE7SUFDSCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsSUFBSSxDQUFDO1lBQ0gsU0FBUztpQkFDTixPQUFPLENBRUwsaUNBQXlCLENBQUMsTUFBTSxDQUFDO2lCQUNuQyxJQUFJLENBQ0gsNEVBQTRFLENBQzdFLENBQUE7UUFDTCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsMkVBQTJFO1FBQzdFLENBQUM7UUFDRCxpQkFBaUIsR0FBRyxTQUFTLENBQUE7SUFDL0IsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSxvRUFBb0U7SUFDcEUsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFBLDZDQUFzQixFQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNuRSxPQUFPLGlCQUFpQixDQUFBO0lBQzFCLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLG9DQUFvQyxDQUMxRCxTQUFTLEVBQ1QsS0FBSyxDQUNOLENBQUE7SUFDRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixPQUFPLGlCQUFpQixDQUFBO0lBQzFCLENBQUM7SUFFRCxPQUFPLElBQUEsdURBQTBCLEVBQUMsU0FBUyxFQUFFO1FBQzNDLFlBQVksRUFBRSxTQUFTLENBQUMsYUFBYTtRQUNyQyxLQUFLLEVBQUUsTUFBTSxJQUFBLDhDQUFpQixFQUM1QixTQUFTLEVBQ1QsT0FBTyxFQUNQLFNBQVMsQ0FBQyxFQUFFLEVBQ1osU0FBUyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQ3RCO1FBQ0QsT0FBTyxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0I7UUFDbkMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRO1FBQzVCLGlCQUFpQixFQUFFLGlCQUFpQjtLQUNyQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUE7QUFuRFksUUFBQSxrQ0FBa0Msc0NBbUQ5QyJ9
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readTaxComplianceState = exports.storeTaxComplianceState = void 0;
|
|
4
|
+
const public_1 = require("../../public");
|
|
5
|
+
const tax_compliance_1 = require("@hartl-services/medusa-food-supplements-contracts/paths/tax-compliance");
|
|
6
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
const plugin_features_1 = require("../plugin-features");
|
|
8
|
+
const resolve_services_1 = require("../resolve-services");
|
|
9
|
+
const STATE_SYNC_LOCK_KEY = "tax-compliance-state-sync";
|
|
10
|
+
const SYNC_LOCK_TIMEOUT_SECONDS = 60;
|
|
11
|
+
/** Used when the mirror cannot be read: ordinary B2C rates, Medusa's shipping tax. */
|
|
12
|
+
const FAIL_SAFE_STATE = {
|
|
13
|
+
b2b_active: false,
|
|
14
|
+
shipping_tax_active: false,
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Copies the effective `b2b` and `shipping_tax` toggles (false while the
|
|
18
|
+
* plugin switch is off; `b2b` also while `vat_validation` is off) into the
|
|
19
|
+
* module's mirror, which the tax hooks and the order-evidence freeze read
|
|
20
|
+
* instead of the toggles. Toggle read and write share one lock, so the last
|
|
21
|
+
* run stores the latest values; a read failure propagates and nothing is
|
|
22
|
+
* written.
|
|
23
|
+
*/
|
|
24
|
+
const storeTaxComplianceState = async (container) => {
|
|
25
|
+
const locking = container.resolve(utils_1.Modules.LOCKING);
|
|
26
|
+
return await locking.execute(STATE_SYNC_LOCK_KEY, async () => {
|
|
27
|
+
const state = {
|
|
28
|
+
b2b_active: await (0, public_1.isPluginFeatureEnabled)(container, plugin_features_1.taxCompliancePluginFeatures, tax_compliance_1.TAX_COMPLIANCE_FEATURES.b2b),
|
|
29
|
+
shipping_tax_active: await (0, public_1.isPluginFeatureEnabled)(container, plugin_features_1.taxCompliancePluginFeatures, tax_compliance_1.TAX_COMPLIANCE_FEATURES.shippingTax),
|
|
30
|
+
};
|
|
31
|
+
await (0, resolve_services_1.resolveTaxComplianceService)(container).storeTaxComplianceState(state);
|
|
32
|
+
return state;
|
|
33
|
+
}, { timeout: SYNC_LOCK_TIMEOUT_SECONDS });
|
|
34
|
+
};
|
|
35
|
+
exports.storeTaxComplianceState = storeTaxComplianceState;
|
|
36
|
+
/**
|
|
37
|
+
* Reads the stored mirror. Safe on the tax path: it reads module data, never
|
|
38
|
+
* a toggle, and a failed read answers "both off" (ordinary B2C rates,
|
|
39
|
+
* Medusa's shipping tax) instead of failing the cart operation; unlike the
|
|
40
|
+
* Affiliate mirror, because charging VAT is the safe fallback for taxes.
|
|
41
|
+
*/
|
|
42
|
+
const readTaxComplianceState = async (container) => {
|
|
43
|
+
try {
|
|
44
|
+
return await (0, resolve_services_1.resolveTaxComplianceService)(container).getTaxComplianceState();
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
try {
|
|
48
|
+
container
|
|
49
|
+
.resolve(utils_1.ContainerRegistrationKeys.LOGGER)
|
|
50
|
+
.warn(`Tax compliance state could not be read; using ordinary B2C tax rates and Medusa's shipping tax: ${error instanceof Error ? error.message : String(error)}`);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// A missing logger must not turn a tax-only failure into checkout failure.
|
|
54
|
+
}
|
|
55
|
+
return FAIL_SAFE_STATE;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
exports.readTaxComplianceState = readTaxComplianceState;
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGF4LWNvbXBsaWFuY2Utc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdGF4LWNvbXBsaWFuY2UvbGliL3RheC1jb21wbGlhbmNlLXN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFxRDtBQUNyRCwyR0FBZ0g7QUFLaEgscURBQThFO0FBRzlFLHdEQUFnRTtBQUNoRSwwREFBaUU7QUFFakUsTUFBTSxtQkFBbUIsR0FBRywyQkFBMkIsQ0FBQTtBQUN2RCxNQUFNLHlCQUF5QixHQUFHLEVBQUUsQ0FBQTtBQUVwQyxzRkFBc0Y7QUFDdEYsTUFBTSxlQUFlLEdBQXdCO0lBQzNDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLG1CQUFtQixFQUFFLEtBQUs7Q0FDM0IsQ0FBQTtBQUVEOzs7Ozs7O0dBT0c7QUFDSSxNQUFNLHVCQUF1QixHQUFHLEtBQUssRUFDMUMsU0FBMEIsRUFDSSxFQUFFO0lBQ2hDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLE9BQU8sQ0FBbUIsQ0FBQTtJQUVwRSxPQUFPLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FDMUIsbUJBQW1CLEVBQ25CLEtBQUssSUFBSSxFQUFFO1FBQ1QsTUFBTSxLQUFLLEdBQXdCO1lBQ2pDLFVBQVUsRUFBRSxNQUFNLElBQUEsK0JBQXNCLEVBQ3RDLFNBQVMsRUFDVCw2Q0FBMkIsRUFDM0Isd0NBQXVCLENBQUMsR0FBRyxDQUM1QjtZQUNELG1CQUFtQixFQUFFLE1BQU0sSUFBQSwrQkFBc0IsRUFDL0MsU0FBUyxFQUNULDZDQUEyQixFQUMzQix3Q0FBdUIsQ0FBQyxXQUFXLENBQ3BDO1NBQ0YsQ0FBQTtRQUNELE1BQU0sSUFBQSw4Q0FBMkIsRUFBQyxTQUFTLENBQUMsQ0FBQyx1QkFBdUIsQ0FDbEUsS0FBSyxDQUNOLENBQUE7UUFDRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUMsRUFDRCxFQUFFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxDQUN2QyxDQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBM0JZLFFBQUEsdUJBQXVCLDJCQTJCbkM7QUFFRDs7Ozs7R0FLRztBQUNJLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxFQUN6QyxTQUEwQixFQUNJLEVBQUU7SUFDaEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLElBQUEsOENBQTJCLEVBQ3RDLFNBQVMsQ0FDVixDQUFDLHFCQUFxQixFQUFFLENBQUE7SUFDM0IsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUM7WUFDSCxTQUFTO2lCQUNOLE9BQU8sQ0FDTixpQ0FBeUIsQ0FBQyxNQUFNLENBQ2pDO2lCQUNBLElBQUksQ0FDSCxtR0FDRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUN2RCxFQUFFLENBQ0gsQ0FBQTtRQUNMLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCwyRUFBMkU7UUFDN0UsQ0FBQztRQUNELE9BQU8sZUFBZSxDQUFBO0lBQ3hCLENBQUM7QUFDSCxDQUFDLENBQUE7QUF2QlksUUFBQSxzQkFBc0IsMEJBdUJsQyJ9
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveMerchantProfile = resolveMerchantProfile;
|
|
4
|
+
exports.resolveFinanzOnlineCredentials = resolveFinanzOnlineCredentials;
|
|
5
|
+
const public_1 = require("../../public");
|
|
6
|
+
const lib_1 = require("../../shared/lib");
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const runtime_settings_1 = require("../../modules/tax-compliance/runtime-settings");
|
|
9
|
+
const plugin_features_1 = require("../plugin-features");
|
|
10
|
+
/**
|
|
11
|
+
* App-level readers for the runtime settings the tax checks need. They run
|
|
12
|
+
* with an application container (route scope, workflow step, hook), read
|
|
13
|
+
* through the base plugin and hand the result to the module service as a
|
|
14
|
+
* parameter: a module service does not reach into other modules.
|
|
15
|
+
*/
|
|
16
|
+
// One warning per process and not-configured state, not per validation. A
|
|
17
|
+
// configured read re-arms it.
|
|
18
|
+
const warnOnce = (0, lib_1.createWarnOnce)();
|
|
19
|
+
const FINANZONLINE_NOT_CONFIGURED_KEY = "finanzonline-not-configured";
|
|
20
|
+
/**
|
|
21
|
+
* Merchant country and UID from the shop master data (base plugin; there is
|
|
22
|
+
* no config fallback), normalized; `null` while either is unset.
|
|
23
|
+
*/
|
|
24
|
+
async function resolveMerchantProfile(container, options) {
|
|
25
|
+
try {
|
|
26
|
+
const { values } = await (0, public_1.getShopMasterData)(container);
|
|
27
|
+
return (0, runtime_settings_1.toMerchantProfile)(values);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (!options.failSafe) {
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
logError(container, `Tax compliance: shop master data could not be read for ${options.subject ?? "tax identification"}; continuing without B2B tax evidence.`, error);
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* FinanzOnline credentials from the plugin settings. Not configured or not
|
|
39
|
+
* readable (logged) means `undefined`: the registry then answers
|
|
40
|
+
* "unavailable" (`missing_credentials`) without calling FinanzOnline.
|
|
41
|
+
*/
|
|
42
|
+
async function resolveFinanzOnlineCredentials(container) {
|
|
43
|
+
let values;
|
|
44
|
+
try {
|
|
45
|
+
;
|
|
46
|
+
({ values } = await (0, public_1.getPluginSettings)(container, plugin_features_1.taxCompliancePluginFeatures));
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
logError(container, "Tax compliance: FinanzOnline settings could not be read; the qualified UID check is unavailable.", error);
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
const { credentials, missing } = (0, runtime_settings_1.toFinanzOnlineCredentials)(values);
|
|
53
|
+
if (credentials) {
|
|
54
|
+
warnOnce.reset(FINANZONLINE_NOT_CONFIGURED_KEY);
|
|
55
|
+
return credentials;
|
|
56
|
+
}
|
|
57
|
+
warnOnce(FINANZONLINE_NOT_CONFIGURED_KEY, missing.join(","), () => {
|
|
58
|
+
try {
|
|
59
|
+
container
|
|
60
|
+
.resolve(utils_1.ContainerRegistrationKeys.LOGGER)
|
|
61
|
+
.warn(`Tax compliance: FinanzOnline ist nicht konfiguriert (fehlend: ${missing.join(", ")}). Bis die Zugangsdaten im Admin unter „Hartl Services Plugins“ → Steuer-Compliance gepflegt sind, ist die qualifizierte UID-Prüfung nicht verfügbar.`);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Logging must not change the validation outcome.
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
function logError(container, message, error) {
|
|
70
|
+
try {
|
|
71
|
+
container
|
|
72
|
+
.resolve(utils_1.ContainerRegistrationKeys.LOGGER)
|
|
73
|
+
.error(message, error instanceof Error ? error : new Error(String(error)));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// A missing logger must not turn the fail-safe itself into a failure.
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGF4LXJ1bnRpbWUtc2V0dGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdGF4LWNvbXBsaWFuY2UvbGliL3RheC1ydW50aW1lLXNldHRpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNkNBLHdEQWtCQztBQU9ELHdFQW9DQztBQTFHRCx5Q0FHcUI7QUFDckIsMENBQWlEO0FBRWpELHFEQUFxRTtBQUdyRSxvRkFJc0Q7QUFDdEQsd0RBQWdFO0FBSWhFOzs7OztHQUtHO0FBRUgsMEVBQTBFO0FBQzFFLDhCQUE4QjtBQUM5QixNQUFNLFFBQVEsR0FBRyxJQUFBLG9CQUFjLEdBQUUsQ0FBQTtBQUNqQyxNQUFNLCtCQUErQixHQUFHLDZCQUE2QixDQUFBO0FBYXJFOzs7R0FHRztBQUNJLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsU0FBMEIsRUFDMUIsT0FBc0M7SUFFdEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBQSwwQkFBaUIsRUFBQyxTQUFTLENBQUMsQ0FBQTtRQUNyRCxPQUFPLElBQUEsb0NBQWlCLEVBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sS0FBSyxDQUFBO1FBQ2IsQ0FBQztRQUNELFFBQVEsQ0FDTixTQUFTLEVBQ1QsMERBQTBELE9BQU8sQ0FBQyxPQUFPLElBQUksb0JBQW9CLHdDQUF3QyxFQUN6SSxLQUFLLENBQ04sQ0FBQTtRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLDhCQUE4QixDQUNsRCxTQUEwQjtJQUUxQixJQUFJLE1BQXdDLENBQUE7SUFDNUMsSUFBSSxDQUFDO1FBQ0gsQ0FBQztRQUFBLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEsMEJBQWlCLEVBQ3BDLFNBQVMsRUFDVCw2Q0FBMkIsQ0FDNUIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixRQUFRLENBQ04sU0FBUyxFQUNULGtHQUFrRyxFQUNsRyxLQUFLLENBQ04sQ0FBQTtRQUNELE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRCxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUEsNENBQXlCLEVBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEUsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNoQixRQUFRLENBQUMsS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUE7UUFDL0MsT0FBTyxXQUFXLENBQUE7SUFDcEIsQ0FBQztJQUVELFFBQVEsQ0FBQywrQkFBK0IsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRTtRQUNoRSxJQUFJLENBQUM7WUFDSCxTQUFTO2lCQUNOLE9BQU8sQ0FBUyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUM7aUJBQ2pELElBQUksQ0FDSCxpRUFBaUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsdUpBQXVKLENBQzNPLENBQUE7UUFDTCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1Asa0RBQWtEO1FBQ3BELENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNGLE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FDZixTQUEwQixFQUMxQixPQUFlLEVBQ2YsS0FBYztJQUVkLElBQUksQ0FBQztRQUNILFNBQVM7YUFDTixPQUFPLENBQVMsaUNBQXlCLENBQUMsTUFBTSxDQUFDO2FBQ2pELEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzlFLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxzRUFBc0U7SUFDeEUsQ0FBQztBQUNILENBQUMifQ==
|