@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.
Files changed (87) hide show
  1. package/.medusa/server/src/admin/index.js +44 -40
  2. package/.medusa/server/src/admin/index.mjs +44 -40
  3. package/.medusa/server/src/api/admin/tax-compliance/customer-addresses/[address_id]/tax-identification/route.js +15 -0
  4. package/.medusa/server/src/api/check-customer-address-tax-identification.js +93 -0
  5. package/.medusa/server/src/api/customer-address-identification-response.js +14 -0
  6. package/.medusa/server/src/api/middlewares.js +55 -1
  7. package/.medusa/server/src/api/store/carts/[id]/tax-identification/route.js +179 -0
  8. package/.medusa/server/src/api/store/customers/me/addresses/[address_id]/tax-identification/route.js +12 -0
  9. package/.medusa/server/src/api/store/customers/me/tax-identifications/route.js +14 -0
  10. package/.medusa/server/src/api/store/tax-identification-policy/route.js +21 -0
  11. package/.medusa/server/src/api/tax-identification-message.js +9 -0
  12. package/.medusa/server/src/api/to-response-amount.js +19 -0
  13. package/.medusa/server/src/email/application/deliver-ephemeral-auth-mail.js +2 -4
  14. package/.medusa/server/src/email/application/handle-password-reset-event.js +75 -27
  15. package/.medusa/server/src/email/rendering/default-templates.js +2 -1
  16. package/.medusa/server/src/email/rendering/render-email.js +2 -1
  17. package/.medusa/server/src/email/rendering/resolve-shop-configuration.js +5 -1
  18. package/.medusa/server/src/email/templates/blocks/dynamic-blocks.js +5 -2
  19. package/.medusa/server/src/email/templates/defaults/documents.js +8 -1
  20. package/.medusa/server/src/email/templates/defaults/subjects.js +3 -1
  21. package/.medusa/server/src/email/templates/defaults/texts.js +4 -2
  22. package/.medusa/server/src/email/templates/render.js +2 -1
  23. package/.medusa/server/src/email/templates/sample-data.js +5 -1
  24. package/.medusa/server/src/email/types/email-kinds.js +3 -1
  25. package/.medusa/server/src/email/types/template-data.js +8 -1
  26. package/.medusa/server/src/jobs/tax-compliance-state-sync.js +26 -0
  27. package/.medusa/server/src/modules/email/migrations/Migration20261013120000.js +20 -0
  28. package/.medusa/server/src/modules/tax-compliance/domain/validation-policy.js +48 -0
  29. package/.medusa/server/src/modules/tax-compliance/index.js +15 -0
  30. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814120459.js +18 -0
  31. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814121724.js +14 -0
  32. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260814153410.js +14 -0
  33. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20260929091620.js +27 -0
  34. package/.medusa/server/src/modules/tax-compliance/migrations/Migration20261011090147.js +16 -0
  35. package/.medusa/server/src/modules/tax-compliance/models/tax-compliance-state.js +29 -0
  36. package/.medusa/server/src/modules/tax-compliance/models/tax-compliance-validation.js +74 -0
  37. package/.medusa/server/src/modules/tax-compliance/runtime-settings.js +43 -0
  38. package/.medusa/server/src/modules/tax-compliance/service.js +693 -0
  39. package/.medusa/server/src/providers/tax-compliance/index.js +11 -0
  40. package/.medusa/server/src/providers/tax-compliance/service.js +179 -0
  41. package/.medusa/server/src/public/constants.js +4 -2
  42. package/.medusa/server/src/public/index.js +6 -2
  43. package/.medusa/server/src/public/tax-compliance.js +22 -0
  44. package/.medusa/server/src/shared/lib/index.js +2 -1
  45. package/.medusa/server/src/shared/lib/optional-registration.js +34 -0
  46. package/.medusa/server/src/shop-config/build-food-shop-config.js +12 -9
  47. package/.medusa/server/src/subscribers/tax-compliance-plugin-features-updated.js +25 -0
  48. package/.medusa/server/src/tax-compliance/complete-cart-hooks.js +26 -0
  49. package/.medusa/server/src/tax-compliance/integrations/finanzonline/client.js +222 -0
  50. package/.medusa/server/src/tax-compliance/integrations/finanzonline/validator.js +50 -0
  51. package/.medusa/server/src/tax-compliance/integrations/registry.js +26 -0
  52. package/.medusa/server/src/tax-compliance/integrations/validator.js +19 -0
  53. package/.medusa/server/src/tax-compliance/lib/order-tax-context.js +100 -0
  54. package/.medusa/server/src/tax-compliance/lib/tax-compliance-state.js +59 -0
  55. package/.medusa/server/src/tax-compliance/lib/tax-runtime-settings.js +79 -0
  56. package/.medusa/server/src/tax-compliance/plugin-features.js +73 -0
  57. package/.medusa/server/src/tax-compliance/resolve-services.js +7 -0
  58. package/.medusa/server/src/tax-compliance/types/tax-compliance.js +6 -0
  59. package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +25 -30
  60. package/.medusa/server/src/workflows/documents/issue-packing-list.js +3 -14
  61. package/.medusa/server/src/workflows/hooks/cart-tax-context.js +78 -0
  62. package/.medusa/server/src/workflows/hooks/order-tax-context.js +7 -0
  63. package/.medusa/server/src/workflows/hooks/shipping-tax-apportionment.js +145 -0
  64. package/.medusa/server/src/workflows/tax-compliance/apportion-order-shipping-tax.js +72 -0
  65. package/.medusa/server/src/workflows/tax-compliance/domain/requires-frozen-tax-evidence.js +27 -0
  66. package/.medusa/server/src/workflows/tax-compliance/freeze-order-evidence.js +125 -0
  67. package/.medusa/server/src/workflows/tax-compliance/submit-customer-address-tax-identification.js +18 -0
  68. package/.medusa/server/src/workflows/tax-compliance/submit-tax-identification.js +18 -0
  69. package/README.md +369 -27
  70. package/dist/email/types/email-kinds.d.ts +3 -2
  71. package/dist/email/types/email-kinds.js +2 -0
  72. package/dist/email/types/shop-configuration.d.ts +8 -0
  73. package/dist/email/types/template-data.d.ts +6 -1
  74. package/dist/email/types/template-data.js +7 -0
  75. package/dist/public/constants.d.ts +2 -0
  76. package/dist/public/constants.js +3 -1
  77. package/dist/public/index.d.ts +2 -1
  78. package/dist/public/index.js +5 -1
  79. package/dist/public/tax-compliance.d.ts +30 -0
  80. package/dist/public/tax-compliance.js +21 -0
  81. package/dist/shared/lib/index.d.ts +1 -0
  82. package/dist/shared/lib/index.js +1 -0
  83. package/dist/shared/lib/optional-registration.d.ts +18 -0
  84. package/dist/shared/lib/optional-registration.js +33 -0
  85. package/dist/shop-config/build-food-shop-config.d.ts +2 -2
  86. package/dist/shop-config/build-food-shop-config.js +11 -8
  87. package/package.json +5 -4
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.evaluateEligibility = exports.isDomesticCompany = void 0;
4
+ const comparable = (value) => value
5
+ .normalize("NFKD")
6
+ .replace(/[\u0300-\u036f]/g, "")
7
+ .toLocaleLowerCase("de-AT")
8
+ .replace(/[^a-z0-9]/g, "");
9
+ const addressMatches = (address, providerAddressLines) => {
10
+ const providerAddress = comparable(providerAddressLines.join(" "));
11
+ const requiredParts = [
12
+ address.address1,
13
+ address.address2,
14
+ address.postalCode,
15
+ address.city,
16
+ ].filter((value) => Boolean(value?.trim()));
17
+ return requiredParts.every((part) => providerAddress.includes(comparable(part)));
18
+ };
19
+ /**
20
+ * A company in the merchant's own country never qualifies for a tax-free
21
+ * intra-Community supply, so its UID is not checked at all.
22
+ */
23
+ const isDomesticCompany = (billingCountryCode, merchantCountryCode) => billingCountryCode.trim().toLowerCase() ===
24
+ merchantCountryCode.trim().toLowerCase();
25
+ exports.isDomesticCompany = isDomesticCompany;
26
+ const evaluateEligibility = (facts) => {
27
+ const customerCountryCode = facts.customerVatNumber.slice(0, 2).toLowerCase();
28
+ const deliveryCountryCode = facts.deliveryCountryCode.toLowerCase();
29
+ const merchantCountryCode = facts.merchantCountryCode.toLowerCase();
30
+ const checks = {
31
+ addressMatches: addressMatches(facts.billingAddress, facts.provider.addressLines),
32
+ companyMatches: comparable(facts.companyName) === comparable(facts.provider.name ?? ""),
33
+ crossBorder: deliveryCountryCode !== merchantCountryCode,
34
+ vatCountryMatchesDelivery: customerCountryCode === deliveryCountryCode,
35
+ };
36
+ if (!facts.provider.valid) {
37
+ return { status: "invalid", reason: "provider_invalid", checks };
38
+ }
39
+ if (!checks.companyMatches || !checks.addressMatches) {
40
+ return { status: "invalid", reason: "submitted_facts_mismatch", checks };
41
+ }
42
+ if (!checks.crossBorder || !checks.vatCountryMatchesDelivery) {
43
+ return { status: "ineligible", reason: "country_policy", checks };
44
+ }
45
+ return { status: "eligible", reason: "qualified_cross_border", checks };
46
+ };
47
+ exports.evaluateEligibility = evaluateEligibility;
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1wb2xpY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9kb21haW4vdmFsaWRhdGlvbi1wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMEJBLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBYSxFQUFVLEVBQUUsQ0FDM0MsS0FBSztLQUNGLFNBQVMsQ0FBQyxNQUFNLENBQUM7S0FDakIsT0FBTyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQztLQUMvQixpQkFBaUIsQ0FBQyxPQUFPLENBQUM7S0FDMUIsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUU5QixNQUFNLGNBQWMsR0FBRyxDQUNyQixPQUF3QixFQUN4QixvQkFBOEIsRUFDckIsRUFBRTtJQUNYLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNsRSxNQUFNLGFBQWEsR0FBRztRQUNwQixPQUFPLENBQUMsUUFBUTtRQUNoQixPQUFPLENBQUMsUUFBUTtRQUNoQixPQUFPLENBQUMsVUFBVTtRQUNsQixPQUFPLENBQUMsSUFBSTtLQUNiLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFtQixFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFFNUQsT0FBTyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbEYsQ0FBQyxDQUFBO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxDQUMvQixrQkFBMEIsRUFDMUIsbUJBQTJCLEVBQ2xCLEVBQUUsQ0FDWCxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7SUFDdkMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUE7QUFMN0IsUUFBQSxpQkFBaUIscUJBS1k7QUFFbkMsTUFBTSxtQkFBbUIsR0FBRyxDQUNqQyxLQUF1QixFQUNGLEVBQUU7SUFDdkIsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUM3RSxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNuRSxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNuRSxNQUFNLE1BQU0sR0FBRztRQUNiLGNBQWMsRUFBRSxjQUFjLENBQzVCLEtBQUssQ0FBQyxjQUFjLEVBQ3BCLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUM1QjtRQUNELGNBQWMsRUFDWixVQUFVLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDekUsV0FBVyxFQUFFLG1CQUFtQixLQUFLLG1CQUFtQjtRQUN4RCx5QkFBeUIsRUFBRSxtQkFBbUIsS0FBSyxtQkFBbUI7S0FDdkUsQ0FBQTtJQUVELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsQ0FBQTtJQUNsRSxDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFBO0lBQzFFLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsQ0FBQTtJQUNuRSxDQUFDO0lBRUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sRUFBRSxDQUFBO0FBQ3pFLENBQUMsQ0FBQTtBQTlCWSxRQUFBLG1CQUFtQix1QkE4Qi9CIn0=
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TaxComplianceService = exports.TAX_COMPLIANCE_MODULE = void 0;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const constants_1 = require("../../public/constants");
9
+ Object.defineProperty(exports, "TAX_COMPLIANCE_MODULE", { enumerable: true, get: function () { return constants_1.TAX_COMPLIANCE_MODULE; } });
10
+ const service_1 = __importDefault(require("./service"));
11
+ exports.TaxComplianceService = service_1.default;
12
+ exports.default = (0, utils_1.Module)(constants_1.TAX_COMPLIANCE_MODULE, {
13
+ service: service_1.default,
14
+ });
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxxREFBa0Q7QUFFbEQsc0RBQThEO0FBR3JELHNHQUhBLGlDQUFxQixPQUdBO0FBRjlCLHdEQUE0QztBQVFuQywrQkFSRixpQkFBb0IsQ0FRRTtBQUo3QixrQkFBZSxJQUFBLGNBQU0sRUFBQyxpQ0FBcUIsRUFBRTtJQUMzQyxPQUFPLEVBQUUsaUJBQW9CO0NBQzlCLENBQUMsQ0FBQSJ9
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260814120459 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260814120459 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`create table if not exists "tax_compliance_validation" ("id" text not null, "cart_id" text not null, "order_id" text null, "status" text not null, "company_name" text not null, "customer_vat_number" text not null, "billing_address" jsonb not null, "delivery_country_code" text not null, "merchant_country_code" text not null, "merchant_vat_number" text not null, "provider" text not null, "provider_facts" jsonb null, "validation_reason" text not null, "cart_fingerprint" text not null, "merchant_profile_fingerprint" text not null, "validated_at" timestamptz not null, "validation_date" text not null, "is_current" boolean not null default true, "cache_used" boolean not null default false, "reuse_reason" text null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "tax_compliance_validation_pkey" primary key ("id"));`);
8
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_tax_compliance_validation_deleted_at" ON "tax_compliance_validation" ("deleted_at") WHERE deleted_at IS NULL;`);
9
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_tax_compliance_validation_cart_id" ON "tax_compliance_validation" ("cart_id") WHERE deleted_at IS NULL;`);
10
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_tax_compliance_validation_order_id" ON "tax_compliance_validation" ("order_id") WHERE deleted_at IS NULL;`);
11
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_tax_compliance_validation_current_uid_day" ON "tax_compliance_validation" ("customer_vat_number", "validation_date") WHERE deleted_at IS NULL AND is_current = true;`);
12
+ }
13
+ async down() {
14
+ this.addSql(`drop table if exists "tax_compliance_validation" cascade;`);
15
+ }
16
+ }
17
+ exports.Migration20260814120459 = Migration20260814120459;
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA4MTQxMjA0NTkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYwODE0MTIwNDU5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpNUJBQWk1QixDQUFDLENBQUM7UUFDLzVCLElBQUksQ0FBQyxNQUFNLENBQUMsK0lBQStJLENBQUMsQ0FBQztRQUM3SixJQUFJLENBQUMsTUFBTSxDQUFDLHlJQUF5SSxDQUFDLENBQUM7UUFDdkosSUFBSSxDQUFDLE1BQU0sQ0FBQywySUFBMkksQ0FBQyxDQUFDO1FBQ3pKLElBQUksQ0FBQyxNQUFNLENBQUMsc01BQXNNLENBQUMsQ0FBQztJQUN0TixDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQywyREFBMkQsQ0FBQyxDQUFDO0lBQzNFLENBQUM7Q0FFRjtBQWRELDBEQWNDIn0=
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260814121724 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260814121724 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_tax_compliance_validation_current_cart" ON "tax_compliance_validation" ("cart_id") WHERE deleted_at IS NULL AND is_current = true;`);
8
+ }
9
+ async down() {
10
+ this.addSql(`drop index if exists "IDX_tax_compliance_validation_current_cart";`);
11
+ }
12
+ }
13
+ exports.Migration20260814121724 = Migration20260814121724;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA4MTQxMjE3MjQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYwODE0MTIxNzI0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQywyS0FBMkssQ0FBQyxDQUFDO0lBQzNMLENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDcEYsQ0FBQztDQUVGO0FBVkQsMERBVUMifQ==
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260814153410 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260814153410 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_tax_compliance_validation_merchant_uid_day" ON "tax_compliance_validation" ("merchant_vat_number", "customer_vat_number", "validation_date") WHERE deleted_at IS NULL;`);
8
+ }
9
+ async down() {
10
+ this.addSql(`drop index if exists "IDX_tax_compliance_validation_merchant_uid_day";`);
11
+ }
12
+ }
13
+ exports.Migration20260814153410 = Migration20260814153410;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA4MTQxNTM0MTAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYwODE0MTUzNDEwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3TUFBd00sQ0FBQyxDQUFDO0lBQ3hOLENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHdFQUF3RSxDQUFDLENBQUM7SUFDeEYsQ0FBQztDQUVGO0FBVkQsMERBVUMifQ==
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260929091620 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260929091620 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`alter table if exists "tax_compliance_validation" add column if not exists "customer_address_id" text null, add column if not exists "customer_id" text null;`);
8
+ this.addSql(`alter table if exists "tax_compliance_validation" alter column "cart_id" type text using ("cart_id"::text);`);
9
+ this.addSql(`alter table if exists "tax_compliance_validation" alter column "cart_id" drop not null;`);
10
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_tax_compliance_validation_customer_id" ON "tax_compliance_validation" ("customer_id") WHERE deleted_at IS NULL;`);
11
+ this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_tax_compliance_validation_current_customer_address" ON "tax_compliance_validation" ("customer_address_id") WHERE deleted_at IS NULL AND is_current = true;`);
12
+ // Exactly one evidence subject: a cart, or a customer address with its customer.
13
+ this.addSql(`alter table if exists "tax_compliance_validation" add constraint "CHK_tax_compliance_validation_subject" check ((cart_id is not null and customer_address_id is null and customer_id is null) or (cart_id is null and customer_address_id is not null and customer_id is not null));`);
14
+ }
15
+ async down() {
16
+ this.addSql(`alter table if exists "tax_compliance_validation" drop constraint if exists "CHK_tax_compliance_validation_subject";`);
17
+ // Address evidence has no cart and cannot survive cart_id becoming required again.
18
+ this.addSql(`delete from "tax_compliance_validation" where "cart_id" is null;`);
19
+ this.addSql(`drop index if exists "IDX_tax_compliance_validation_customer_id";`);
20
+ this.addSql(`drop index if exists "IDX_tax_compliance_validation_current_customer_address";`);
21
+ this.addSql(`alter table if exists "tax_compliance_validation" drop column if exists "customer_address_id", drop column if exists "customer_id";`);
22
+ this.addSql(`alter table if exists "tax_compliance_validation" alter column "cart_id" type text using ("cart_id"::text);`);
23
+ this.addSql(`alter table if exists "tax_compliance_validation" alter column "cart_id" set not null;`);
24
+ }
25
+ }
26
+ exports.Migration20260929091620 = Migration20260929091620;
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA5MjkwOTE2MjAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYwOTI5MDkxNjIwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQywrSkFBK0osQ0FBQyxDQUFDO1FBQzdLLElBQUksQ0FBQyxNQUFNLENBQUMsNkdBQTZHLENBQUMsQ0FBQztRQUMzSCxJQUFJLENBQUMsTUFBTSxDQUFDLHlGQUF5RixDQUFDLENBQUM7UUFDdkcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpSkFBaUosQ0FBQyxDQUFDO1FBQy9KLElBQUksQ0FBQyxNQUFNLENBQUMsbU1BQW1NLENBQUMsQ0FBQztRQUNqTixpRkFBaUY7UUFDakYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzUkFBc1IsQ0FBQyxDQUFDO0lBQ3RTLENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHNIQUFzSCxDQUFDLENBQUM7UUFDcEksbUZBQW1GO1FBQ25GLElBQUksQ0FBQyxNQUFNLENBQUMsa0VBQWtFLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsTUFBTSxDQUFDLG1FQUFtRSxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnRkFBZ0YsQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQyxNQUFNLENBQUMscUlBQXFJLENBQUMsQ0FBQztRQUVuSixJQUFJLENBQUMsTUFBTSxDQUFDLDZHQUE2RyxDQUFDLENBQUM7UUFDM0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3RkFBd0YsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7Q0FFRjtBQXhCRCwwREF3QkMifQ==
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20261011090147 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20261011090147 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`create table if not exists "tax_compliance_state" ("id" text not null, "scope" text not null default 'global', "b2b_active" boolean not null default true, "shipping_tax_active" boolean not null default true, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "tax_compliance_state_pkey" primary key ("id"));`);
8
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_tax_compliance_state_deleted_at" ON "tax_compliance_state" ("deleted_at") WHERE deleted_at IS NULL;`);
9
+ this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_tax_compliance_state_global" ON "tax_compliance_state" ("scope") WHERE deleted_at IS NULL;`);
10
+ }
11
+ async down() {
12
+ this.addSql(`drop table if exists "tax_compliance_state" cascade;`);
13
+ }
14
+ }
15
+ exports.Migration20261011090147 = Migration20261011090147;
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjEwMTEwOTAxNDcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYxMDExMDkwMTQ3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyw4WUFBOFksQ0FBQyxDQUFDO1FBQzVaLElBQUksQ0FBQyxNQUFNLENBQUMscUlBQXFJLENBQUMsQ0FBQztRQUNuSixJQUFJLENBQUMsTUFBTSxDQUFDLG1JQUFtSSxDQUFDLENBQUM7SUFDbkosQ0FBQztJQUVRLEtBQUssQ0FBQyxJQUFJO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsc0RBQXNELENBQUMsQ0FBQztJQUN0RSxDQUFDO0NBRUY7QUFaRCwwREFZQyJ9
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ /**
5
+ * Mirrors the effective `b2b` and `shipping_tax` feature toggles for the tax
6
+ * hooks and the order-evidence freeze, which never read toggles: written only
7
+ * by the state sync (subscriber + job), see src/lib/tax-compliance-state.ts.
8
+ * One row (`scope` = "global"); no row means "not synchronized yet".
9
+ */
10
+ const TaxComplianceState = utils_1.model
11
+ .define({
12
+ name: "tax_compliance_state",
13
+ tableName: "tax_compliance_state",
14
+ }, {
15
+ id: utils_1.model.id({ prefix: "tcstate" }).primaryKey(),
16
+ scope: utils_1.model.text().default("global"),
17
+ b2b_active: utils_1.model.boolean().default(true),
18
+ shipping_tax_active: utils_1.model.boolean().default(true),
19
+ })
20
+ .indexes([
21
+ {
22
+ name: "IDX_tax_compliance_state_global",
23
+ on: ["scope"],
24
+ unique: true,
25
+ where: "deleted_at IS NULL",
26
+ },
27
+ ]);
28
+ exports.default = TaxComplianceState;
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGF4LWNvbXBsaWFuY2Utc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90YXgtY29tcGxpYW5jZS9tb2RlbHMvdGF4LWNvbXBsaWFuY2Utc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFBaUQ7QUFFakQ7Ozs7O0dBS0c7QUFDSCxNQUFNLGtCQUFrQixHQUFHLGFBQUs7S0FDN0IsTUFBTSxDQUNMO0lBQ0UsSUFBSSxFQUFFLHNCQUFzQjtJQUM1QixTQUFTLEVBQUUsc0JBQXNCO0NBQ2xDLEVBQ0Q7SUFDRSxFQUFFLEVBQUUsYUFBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRTtJQUNoRCxLQUFLLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDckMsVUFBVSxFQUFFLGFBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ3pDLG1CQUFtQixFQUFFLGFBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0NBQ25ELENBQ0Y7S0FDQSxPQUFPLENBQUM7SUFDUDtRQUNFLElBQUksRUFBRSxpQ0FBaUM7UUFDdkMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQ2IsTUFBTSxFQUFFLElBQUk7UUFDWixLQUFLLEVBQUUsb0JBQW9CO0tBQzVCO0NBQ0YsQ0FBQyxDQUFBO0FBRUosa0JBQWUsa0JBQWtCLENBQUEifQ==
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ const TaxComplianceValidation = utils_1.model
5
+ .define({
6
+ name: "tax_compliance_validation",
7
+ tableName: "tax_compliance_validation",
8
+ }, {
9
+ id: utils_1.model.id({ prefix: "tcv" }).primaryKey(),
10
+ // Exactly one subject per record (CHECK in the migration): a cart, or a
11
+ // saved customer address together with its customer.
12
+ cart_id: utils_1.model.text().nullable(),
13
+ customer_address_id: utils_1.model.text().nullable(),
14
+ customer_id: utils_1.model.text().nullable(),
15
+ order_id: utils_1.model.text().nullable(),
16
+ status: utils_1.model.text(),
17
+ company_name: utils_1.model.text(),
18
+ customer_vat_number: utils_1.model.text(),
19
+ billing_address: utils_1.model.json(),
20
+ delivery_country_code: utils_1.model.text(),
21
+ merchant_country_code: utils_1.model.text(),
22
+ merchant_vat_number: utils_1.model.text(),
23
+ provider: utils_1.model.text(),
24
+ provider_facts: utils_1.model.json().nullable(),
25
+ validation_reason: utils_1.model.text(),
26
+ cart_fingerprint: utils_1.model.text(),
27
+ merchant_profile_fingerprint: utils_1.model.text(),
28
+ validated_at: utils_1.model.dateTime(),
29
+ validation_date: utils_1.model.text(),
30
+ is_current: utils_1.model.boolean().default(true),
31
+ cache_used: utils_1.model.boolean().default(false),
32
+ reuse_reason: utils_1.model.text().nullable(),
33
+ })
34
+ .indexes([
35
+ {
36
+ name: "IDX_tax_compliance_validation_cart_id",
37
+ on: ["cart_id"],
38
+ where: "deleted_at IS NULL",
39
+ },
40
+ {
41
+ name: "IDX_tax_compliance_validation_order_id",
42
+ on: ["order_id"],
43
+ where: "deleted_at IS NULL",
44
+ },
45
+ {
46
+ name: "IDX_tax_compliance_validation_current_uid_day",
47
+ on: ["customer_vat_number", "validation_date"],
48
+ where: "deleted_at IS NULL AND is_current = true",
49
+ },
50
+ {
51
+ name: "IDX_tax_compliance_validation_merchant_uid_day",
52
+ on: ["merchant_vat_number", "customer_vat_number", "validation_date"],
53
+ where: "deleted_at IS NULL",
54
+ },
55
+ {
56
+ name: "IDX_tax_compliance_validation_current_cart",
57
+ on: ["cart_id"],
58
+ unique: true,
59
+ where: "deleted_at IS NULL AND is_current = true",
60
+ },
61
+ {
62
+ name: "IDX_tax_compliance_validation_customer_id",
63
+ on: ["customer_id"],
64
+ where: "deleted_at IS NULL",
65
+ },
66
+ {
67
+ name: "IDX_tax_compliance_validation_current_customer_address",
68
+ on: ["customer_address_id"],
69
+ unique: true,
70
+ where: "deleted_at IS NULL AND is_current = true",
71
+ },
72
+ ]);
73
+ exports.default = TaxComplianceValidation;
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGF4LWNvbXBsaWFuY2UtdmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3RheC1jb21wbGlhbmNlL21vZGVscy90YXgtY29tcGxpYW5jZS12YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscURBQWlEO0FBRWpELE1BQU0sdUJBQXVCLEdBQUcsYUFBSztLQUNsQyxNQUFNLENBQ0w7SUFDRSxJQUFJLEVBQUUsMkJBQTJCO0lBQ2pDLFNBQVMsRUFBRSwyQkFBMkI7Q0FDdkMsRUFDRDtJQUNFLEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFO0lBQzVDLHdFQUF3RTtJQUN4RSxxREFBcUQ7SUFDckQsT0FBTyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDaEMsbUJBQW1CLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM1QyxXQUFXLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNwQyxRQUFRLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNqQyxNQUFNLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUNwQixZQUFZLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUMxQixtQkFBbUIsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ2pDLGVBQWUsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQzdCLHFCQUFxQixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDbkMscUJBQXFCLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUNuQyxtQkFBbUIsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ2pDLFFBQVEsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3RCLGNBQWMsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3ZDLGlCQUFpQixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDL0IsZ0JBQWdCLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUM5Qiw0QkFBNEIsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQzFDLFlBQVksRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFO0lBQzlCLGVBQWUsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQzdCLFVBQVUsRUFBRSxhQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztJQUN6QyxVQUFVLEVBQUUsYUFBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDMUMsWUFBWSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDdEMsQ0FDRjtLQUNBLE9BQU8sQ0FBQztJQUNQO1FBQ0UsSUFBSSxFQUFFLHVDQUF1QztRQUM3QyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDZixLQUFLLEVBQUUsb0JBQW9CO0tBQzVCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsd0NBQXdDO1FBQzlDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUNoQixLQUFLLEVBQUUsb0JBQW9CO0tBQzVCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsK0NBQStDO1FBQ3JELEVBQUUsRUFBRSxDQUFDLHFCQUFxQixFQUFFLGlCQUFpQixDQUFDO1FBQzlDLEtBQUssRUFBRSwwQ0FBMEM7S0FDbEQ7SUFDRDtRQUNFLElBQUksRUFBRSxnREFBZ0Q7UUFDdEQsRUFBRSxFQUFFLENBQUMscUJBQXFCLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLENBQUM7UUFDckUsS0FBSyxFQUFFLG9CQUFvQjtLQUM1QjtJQUNEO1FBQ0UsSUFBSSxFQUFFLDRDQUE0QztRQUNsRCxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDZixNQUFNLEVBQUUsSUFBSTtRQUNaLEtBQUssRUFBRSwwQ0FBMEM7S0FDbEQ7SUFDRDtRQUNFLElBQUksRUFBRSwyQ0FBMkM7UUFDakQsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDO1FBQ25CLEtBQUssRUFBRSxvQkFBb0I7S0FDNUI7SUFDRDtRQUNFLElBQUksRUFBRSx3REFBd0Q7UUFDOUQsRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUM7UUFDM0IsTUFBTSxFQUFFLElBQUk7UUFDWixLQUFLLEVBQUUsMENBQTBDO0tBQ2xEO0NBQ0YsQ0FBQyxDQUFBO0FBRUosa0JBQWUsdUJBQXVCLENBQUEifQ==
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toFinanzOnlineCredentials = exports.FINANZONLINE_SETTING_KEYS = exports.toMerchantProfile = exports.normalizeMerchantProfile = void 0;
4
+ const lib_1 = require("../../shared/lib");
5
+ const text = (value) => {
6
+ if (typeof value !== "string") {
7
+ return undefined;
8
+ }
9
+ const trimmed = value.trim();
10
+ return trimmed ? trimmed : undefined;
11
+ };
12
+ /** Lower-case country code and upper-case UID without whitespace. */
13
+ const normalizeMerchantProfile = (merchant) => ({
14
+ countryCode: merchant.countryCode.trim().replace(/\s+/g, " ").toLowerCase(),
15
+ vatNumber: (0, lib_1.normalizeVatNumber)(merchant.vatNumber),
16
+ });
17
+ exports.normalizeMerchantProfile = normalizeMerchantProfile;
18
+ /** Normalized; `null` while country or UID is unset. */
19
+ const toMerchantProfile = (values) => {
20
+ const countryCode = text(values.country_code);
21
+ const vatNumber = text(values.vat_number);
22
+ return countryCode && vatNumber
23
+ ? (0, exports.normalizeMerchantProfile)({ countryCode, vatNumber })
24
+ : null;
25
+ };
26
+ exports.toMerchantProfile = toMerchantProfile;
27
+ exports.FINANZONLINE_SETTING_KEYS = [
28
+ "finanzonline_participant_id",
29
+ "finanzonline_user_id",
30
+ "finanzonline_password",
31
+ ];
32
+ /** All three values or none: a partial set counts as not configured. */
33
+ const toFinanzOnlineCredentials = (values) => {
34
+ const participantId = text(values.finanzonline_participant_id);
35
+ const userId = text(values.finanzonline_user_id);
36
+ const password = text(values.finanzonline_password);
37
+ const missing = exports.FINANZONLINE_SETTING_KEYS.filter((key) => !text(values[key]));
38
+ return participantId && userId && password
39
+ ? { credentials: { participantId, userId, password }, missing: [] }
40
+ : { credentials: undefined, missing };
41
+ };
42
+ exports.toFinanzOnlineCredentials = toFinanzOnlineCredentials;
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS1zZXR0aW5ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3RheC1jb21wbGlhbmNlL3J1bnRpbWUtc2V0dGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMENBQXFEO0FBaUJyRCxNQUFNLElBQUksR0FBRyxDQUFDLEtBQWMsRUFBc0IsRUFBRTtJQUNsRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDNUIsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0FBQ3RDLENBQUMsQ0FBQTtBQUVELHFFQUFxRTtBQUM5RCxNQUFNLHdCQUF3QixHQUFHLENBQ3RDLFFBQXNDLEVBQ1IsRUFBRSxDQUFDLENBQUM7SUFDbEMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUU7SUFDM0UsU0FBUyxFQUFFLElBQUEsd0JBQWtCLEVBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztDQUNsRCxDQUFDLENBQUE7QUFMVyxRQUFBLHdCQUF3Qiw0QkFLbkM7QUFFRix3REFBd0Q7QUFDakQsTUFBTSxpQkFBaUIsR0FBRyxDQUMvQixNQUF1QyxFQUNGLEVBQUU7SUFDdkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUM3QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3pDLE9BQU8sV0FBVyxJQUFJLFNBQVM7UUFDN0IsQ0FBQyxDQUFDLElBQUEsZ0NBQXdCLEVBQUMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDdEQsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUNWLENBQUMsQ0FBQTtBQVJZLFFBQUEsaUJBQWlCLHFCQVE3QjtBQUVZLFFBQUEseUJBQXlCLEdBQUc7SUFDdkMsNkJBQTZCO0lBQzdCLHNCQUFzQjtJQUN0Qix1QkFBdUI7Q0FDZixDQUFBO0FBT1Ysd0VBQXdFO0FBQ2pFLE1BQU0seUJBQXlCLEdBQUcsQ0FDdkMsTUFBd0MsRUFDUixFQUFFO0lBQ2xDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtJQUM5RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUE7SUFDaEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO0lBQ25ELE1BQU0sT0FBTyxHQUFHLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUU3RSxPQUFPLGFBQWEsSUFBSSxNQUFNLElBQUksUUFBUTtRQUN4QyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7UUFDbkUsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQTtBQUN6QyxDQUFDLENBQUE7QUFYWSxRQUFBLHlCQUF5Qiw2QkFXckMifQ==