diff --git a/packages/modules/fulfillment/integration-tests/__tests__/fulfillment-module-service/shipping-option.spec.ts b/packages/modules/fulfillment/integration-tests/__tests__/fulfillment-module-service/shipping-option.spec.ts index 27a2e3af0e..812bdb3852 100644 --- a/packages/modules/fulfillment/integration-tests/__tests__/fulfillment-module-service/shipping-option.spec.ts +++ b/packages/modules/fulfillment/integration-tests/__tests__/fulfillment-module-service/shipping-option.spec.ts @@ -226,6 +226,10 @@ moduleIntegrationTestRunner({ { name: "test", geo_zones: [ + { + type: GeoZoneType.COUNTRY, + country_code: "fr", + }, { type: GeoZoneType.ZIP, country_code: "fr", @@ -304,6 +308,42 @@ moduleIntegrationTestRunner({ country_code: "fr", province_code: "rhone", city: "paris", + }, + }) + + expect(shippingOptions).toHaveLength(3) + + shippingOptions = await service.listShippingOptionsForContext({ + address: { + country_code: "fr", + province_code: "rhone", + }, + }) + + expect(shippingOptions).toHaveLength(3) + + shippingOptions = await service.listShippingOptionsForContext({ + address: { + country_code: "fr", + }, + }) + + expect(shippingOptions).toHaveLength(3) + + shippingOptions = await service.listShippingOptionsForContext({ + address: { + country_code: "fr", + postal_expression: "75006", + }, + }) + + expect(shippingOptions).toHaveLength(3) + + shippingOptions = await service.listShippingOptionsForContext({ + address: { + country_code: "us", + province_code: "rhone", + city: "paris", postal_expression: "75001", }, }) diff --git a/packages/modules/fulfillment/src/services/fulfillment-module-service.ts b/packages/modules/fulfillment/src/services/fulfillment-module-service.ts index 799a6cd671..cf95dcaddd 100644 --- a/packages/modules/fulfillment/src/services/fulfillment-module-service.ts +++ b/packages/modules/fulfillment/src/services/fulfillment-module-service.ts @@ -2189,37 +2189,18 @@ export default class FulfillmentModuleService } /** - * Validate that the address has the required properties for the geo zones - * constraints to build after. We are going from the narrowest to the broadest + * The following changes assume that the lowest level check (e.g postal expression) can't exist multiple times in the higher level (e.g country) + * In case we encounter situations where it is possible to have multiple postal expressions for the same country we need to change the logic back + * to this pr https://github.com/medusajs/medusa/pull/8066 */ - Object.entries(geoZoneRequirePropertyHierarchy).forEach( - ([prop, requiredProps]) => { - if (address![prop]) { - for (const requiredProp of requiredProps) { - if (!address![requiredProp]) { - throw new MedusaError( - MedusaError.Types.INVALID_DATA, - `Missing required property ${requiredProp} for address when property ${prop} is set` - ) - } - } - } - } - ) const geoZoneConstraints = Object.entries(geoZoneRequirePropertyHierarchy) .map(([prop, requiredProps]) => { if (address![prop]) { return requiredProps.reduce((geoZoneConstraint, prop) => { - geoZoneConstraint.type = - prop === "postal_expression" - ? "zip" - : prop === "city" - ? "city" - : prop === "province_code" - ? "province" - : "country" - geoZoneConstraint[prop] = address![prop] + if (isPresent(address![prop])) { + geoZoneConstraint[prop] = address![prop] + } return geoZoneConstraint }, {} as Record) }