diff --git a/src/MyParcelComApi.php b/src/MyParcelComApi.php index 09887122..88f9e954 100644 --- a/src/MyParcelComApi.php +++ b/src/MyParcelComApi.php @@ -152,6 +152,7 @@ public function getPickUpDropOffLocations( CarrierInterface $specificCarrier = null, bool $onlyActiveContracts = true, int $ttl = self::TTL_10MIN, + ?array $filters = null, ): ResourceCollectionInterface|array { $carriers = $this->determineCarriersForPudoLocations($onlyActiveContracts, $specificCarrier); @@ -176,6 +177,9 @@ public function getPickUpDropOffLocations( if ($streetNumber) { $uri->addQuery(['street_number' => $streetNumber]); } + if ($filters) { + $uri->addQuery($this->arrayToFilters($filters)); + } $pudoLocations = []; diff --git a/src/MyParcelComApiInterface.php b/src/MyParcelComApiInterface.php index 16589192..3b314f91 100644 --- a/src/MyParcelComApiInterface.php +++ b/src/MyParcelComApiInterface.php @@ -76,6 +76,7 @@ public function getPickUpDropOffLocations( CarrierInterface $specificCarrier = null, bool $onlyActiveContracts = true, int $ttl = self::TTL_10MIN, + ?array $filters = null, ): ResourceCollectionInterface|array; /** diff --git a/src/Resources/PickUpDropOffLocation.php b/src/Resources/PickUpDropOffLocation.php index 37017f4a..3e0be878 100644 --- a/src/Resources/PickUpDropOffLocation.php +++ b/src/Resources/PickUpDropOffLocation.php @@ -24,6 +24,7 @@ class PickUpDropOffLocation implements PickUpDropOffLocationInterface const ATTRIBUTE_OPENING_HOURS = 'openingHours'; const ATTRIBUTE_POSITION = 'position'; const ATTRIBUTE_CATEGORIES = 'categories'; + const ATTRIBUTE_LOCATION_TYPE = 'location_type'; const RELATIONSHIP_CARRIER = 'carrier'; @@ -38,6 +39,7 @@ class PickUpDropOffLocation implements PickUpDropOffLocationInterface self::ATTRIBUTE_ADDRESS => null, self::ATTRIBUTE_OPENING_HOURS => [], self::ATTRIBUTE_POSITION => null, + self::ATTRIBUTE_LOCATION_TYPE => null, self::ATTRIBUTE_CATEGORIES => [], ]; @@ -149,4 +151,16 @@ public function getCategories(): array { return $this->attributes[self::ATTRIBUTE_CATEGORIES]; } + + public function setLocationType(string $type): self + { + $this->attributes[self::ATTRIBUTE_LOCATION_TYPE] = $type; + + return $this; + } + + public function getLocationType(): string + { + return $this->attributes[self::ATTRIBUTE_LOCATION_TYPE]; + } } diff --git a/tests/Feature/MyParcelComApi/PickUpDropOffLocationsTest.php b/tests/Feature/MyParcelComApi/PickUpDropOffLocationsTest.php index 762cd84c..cca0cad5 100644 --- a/tests/Feature/MyParcelComApi/PickUpDropOffLocationsTest.php +++ b/tests/Feature/MyParcelComApi/PickUpDropOffLocationsTest.php @@ -168,4 +168,30 @@ public function testGetPudoLocationsForSpecificCarrierWhichDoesntHaveActiveContr // The other carrier does not have any pudo services and should thus not return pudo locations. $this->assertEmpty($pudoLocations); } + + public function testGetPudoLocationsWithLocationTypesFilter() + { + $carrier = $this->createMock(CarrierInterface::class); + $carrier + ->method('getId') + ->willReturn('eef00b32-177e-43d3-9b26-715365e4ce46'); + + $pudoLocations = $this->api->getPickUpDropOffLocations( + 'GB', + 'B48 7QN', + null, + null, + $carrier, + false, + filters: ['location_type' => ['office']], + ); + + // The carrier with pudo locations should return a set of pudo locations. + $this->assertCount(10, $pudoLocations); + + /** @var \MyParcelCom\ApiSdk\Resources\PickUpDropOffLocation $pudoLocation */ + foreach ($pudoLocations as $pudoLocation) { + $this->assertEquals('office', $pudoLocation->getLocationType()); + } + } } diff --git a/tests/Stubs/get/https---api-carriers-eef00b32-177e-43d3-9b26-715365e4ce46-pickup-dropoff-locations-GB-B48 7QN.json b/tests/Stubs/get/https---api-carriers-eef00b32-177e-43d3-9b26-715365e4ce46-pickup-dropoff-locations-GB-B48 7QN.json index fc865afd..77b15730 100644 --- a/tests/Stubs/get/https---api-carriers-eef00b32-177e-43d3-9b26-715365e4ce46-pickup-dropoff-locations-GB-B48 7QN.json +++ b/tests/Stubs/get/https---api-carriers-eef00b32-177e-43d3-9b26-715365e4ce46-pickup-dropoff-locations-GB-B48 7QN.json @@ -54,7 +54,8 @@ "position": { "latitude": 52.3032936742545, "longitude": 4.69476214016944 - } + }, + "location_type": "office" }, "meta": { "distance": 318 @@ -125,7 +126,8 @@ "position": { "latitude": 52.3089878674629, "longitude": 4.68188672729443 - } + }, + "location_type": "locker" }, "meta": { "distance": 764 @@ -197,7 +199,8 @@ "position": { "latitude": 52.3143764678125, "longitude": 4.69640792135398 - } + }, + "location_type": "office" }, "meta": { "distance": 1137 @@ -269,7 +272,8 @@ "position": { "latitude": 52.3155020752417, "longitude": 4.69523182366827 - } + }, + "location_type": "office" }, "meta": { "distance": 1233 @@ -340,7 +344,8 @@ "position": { "latitude": 52.3094281618872, "longitude": 4.67139513180198 - } + }, + "location_type": "office" }, "meta": { "distance": 1413 @@ -411,7 +416,8 @@ "position": { "latitude": 52.3013913423774, "longitude": 4.66375416731004 - } + }, + "location_type": "office" }, "meta": { "distance": 1872 @@ -482,7 +488,8 @@ "position": { "latitude": 52.2864669620795, "longitude": 4.68239055845954 - } + }, + "location_type": "office" }, "meta": { "distance": 2110 @@ -553,7 +560,8 @@ "position": { "latitude": 52.3147095499762, "longitude": 4.65903497807609 - } + }, + "location_type": "office" }, "meta": { "distance": 2422 @@ -624,7 +632,8 @@ "position": { "latitude": 52.3066891744711, "longitude": 4.63838904899413 - } + }, + "location_type": "office" }, "meta": { "distance": 3565 @@ -695,7 +704,8 @@ "position": { "latitude": 52.3569768014508, "longitude": 5.15416255988611 - } + }, + "location_type": "office" }, "meta": { "distance": 32019 diff --git a/tests/Stubs/get/https---api-carriers-eef00b32-177e-43d3-9b26-715365e4ce46-pickup-dropoff-locations-GB-B48 7QN/filter-location_type--0--office.json b/tests/Stubs/get/https---api-carriers-eef00b32-177e-43d3-9b26-715365e4ce46-pickup-dropoff-locations-GB-B48 7QN/filter-location_type--0--office.json new file mode 100644 index 00000000..3bb1d368 --- /dev/null +++ b/tests/Stubs/get/https---api-carriers-eef00b32-177e-43d3-9b26-715365e4ce46-pickup-dropoff-locations-GB-B48 7QN/filter-location_type--0--office.json @@ -0,0 +1,735 @@ +{ + "data": [ + { + "id": "176227", + "type": "pickup-dropoff-locations", + "attributes": { + "code": "176227", + "address": { + "street_1": "Polderplein", + "street_number": 3, + "postal_code": "2132BA", + "city": "Hoofddorp", + "country_code": "NL", + "company": "Primera Sanders", + "phone_number": "023-5640556" + }, + "opening_hours": [ + { + "day": "Monday", + "open": "11:00", + "closed": "18:00" + }, + { + "day": "Tuesday", + "open": "09:00", + "closed": "18:00" + }, + { + "day": "Wednesday", + "open": "09:00", + "closed": "18:00" + }, + { + "day": "Thursday", + "open": "09:00", + "closed": "18:00" + }, + { + "day": "Friday", + "open": "09:00", + "closed": "21:00" + }, + { + "day": "Saturday", + "open": "09:00", + "closed": "17:00" + }, + { + "day": "Sunday", + "open": "12:00", + "closed": "17:00" + } + ], + "position": { + "latitude": 52.3032936742545, + "longitude": 4.69476214016944 + }, + "location_type": "office" + }, + "meta": { + "distance": 318 + }, + "relationships": { + "carrier": { + "links": { + "related": "https://api/carriers/eef00b32-177e-43d3-9b26-715365e4ce46" + }, + "data": { + "id": "eef00b32-177e-43d3-9b26-715365e4ce46", + "type": "carriers" + } + } + } + }, + { + "id": "205604", + "type": "pickup-dropoff-locations", + "attributes": { + "code": "205604", + "address": { + "street_1": "Paxlaan", + "street_number": 10, + "postal_code": "2131PZ", + "city": "Hoofddorp", + "country_code": "NL", + "company": "pax shop", + "phone_number": "023-5626572" + }, + "opening_hours": [ + { + "day": "Monday", + "open": "08:00", + "closed": "22:00" + }, + { + "day": "Tuesday", + "open": "08:00", + "closed": "22:00" + }, + { + "day": "Wednesday", + "open": "08:00", + "closed": "22:00" + }, + { + "day": "Thursday", + "open": "08:00", + "closed": "22:00" + }, + { + "day": "Friday", + "open": "08:00", + "closed": "22:00" + }, + { + "day": "Saturday", + "open": "08:00", + "closed": "22:00" + }, + { + "day": "Sunday", + "open": "10:00", + "closed": "22:00" + } + ], + "position": { + "latitude": 52.3089878674629, + "longitude": 4.68188672729443 + }, + "location_type": "office" + }, + "meta": { + "distance": 764 + }, + "relationships": { + "carrier": { + "links": { + "related": "https://api/carriers/eef00b32-177e-43d3-9b26-715365e4ce46" + }, + "data": { + "id": "eef00b32-177e-43d3-9b26-715365e4ce46", + "type": "carriers" + } + } + } + }, + { + "id": "167536", + "type": "pickup-dropoff-locations", + "attributes": { + "code": "167536", + "address": { + "street_1": "Noordmeerstraat", + "street_number": 22, + "street_number_suffix": "-30", + "postal_code": "2131AD", + "city": "Hoofddorp", + "country_code": "NL", + "company": "GAMMA Hoofddorp", + "phone_number": "023-5657656" + }, + "opening_hours": [ + { + "day": "Monday", + "open": "09:00", + "closed": "21:00" + }, + { + "day": "Tuesday", + "open": "09:00", + "closed": "21:00" + }, + { + "day": "Wednesday", + "open": "09:00", + "closed": "21:00" + }, + { + "day": "Thursday", + "open": "09:00", + "closed": "21:00" + }, + { + "day": "Friday", + "open": "09:00", + "closed": "21:00" + }, + { + "day": "Saturday", + "open": "09:00", + "closed": "18:00" + }, + { + "day": "Sunday", + "open": "12:00", + "closed": "17:00" + } + ], + "position": { + "latitude": 52.3143764678125, + "longitude": 4.69640792135398 + }, + "location_type": "office" + }, + "meta": { + "distance": 1137 + }, + "relationships": { + "carrier": { + "links": { + "related": "https://api/carriers/eef00b32-177e-43d3-9b26-715365e4ce46" + }, + "data": { + "id": "eef00b32-177e-43d3-9b26-715365e4ce46", + "type": "carriers" + } + } + } + }, + { + "id": "171963", + "type": "pickup-dropoff-locations", + "attributes": { + "code": "171963", + "address": { + "street_1": "Noordmeerstraat", + "street_number": 32, + "street_number_suffix": "-36", + "postal_code": "2131AD", + "city": "Hoofddorp", + "country_code": "NL", + "company": "Karwei Hoofddorp", + "phone_number": "023-5651215" + }, + "opening_hours": [ + { + "day": "Monday", + "open": "09:00", + "closed": "21:00" + }, + { + "day": "Tuesday", + "open": "09:00", + "closed": "21:00" + }, + { + "day": "Wednesday", + "open": "09:00", + "closed": "21:00" + }, + { + "day": "Thursday", + "open": "09:00", + "closed": "21:00" + }, + { + "day": "Friday", + "open": "09:00", + "closed": "21:00" + }, + { + "day": "Saturday", + "open": "09:00", + "closed": "18:00" + }, + { + "day": "Sunday", + "open": "00:00", + "closed": "00:00" + } + ], + "position": { + "latitude": 52.3155020752417, + "longitude": 4.69523182366827 + }, + "location_type": "office" + }, + "meta": { + "distance": 1233 + }, + "relationships": { + "carrier": { + "links": { + "related": "https://api/carriers/eef00b32-177e-43d3-9b26-715365e4ce46" + }, + "data": { + "id": "eef00b32-177e-43d3-9b26-715365e4ce46", + "type": "carriers" + } + } + } + }, + { + "id": "173804", + "type": "pickup-dropoff-locations", + "attributes": { + "code": "173804", + "address": { + "street_1": "Skagerrak", + "street_number": 218, + "postal_code": "2133DW", + "city": "Hoofddorp", + "country_code": "NL", + "company": "Primera Sanders Skagerhof", + "phone_number": "023-5631358" + }, + "opening_hours": [ + { + "day": "Monday", + "open": "08:30", + "closed": "18:00" + }, + { + "day": "Tuesday", + "open": "08:30", + "closed": "18:00" + }, + { + "day": "Wednesday", + "open": "08:30", + "closed": "18:00" + }, + { + "day": "Thursday", + "open": "08:30", + "closed": "18:00" + }, + { + "day": "Friday", + "open": "08:30", + "closed": "18:00" + }, + { + "day": "Saturday", + "open": "08:30", + "closed": "17:00" + }, + { + "day": "Sunday", + "open": "00:00", + "closed": "00:00" + } + ], + "position": { + "latitude": 52.3094281618872, + "longitude": 4.67139513180198 + }, + "location_type": "office" + }, + "meta": { + "distance": 1413 + }, + "relationships": { + "carrier": { + "links": { + "related": "https://api/carriers/eef00b32-177e-43d3-9b26-715365e4ce46" + }, + "data": { + "id": "eef00b32-177e-43d3-9b26-715365e4ce46", + "type": "carriers" + } + } + } + }, + { + "id": "161807", + "type": "pickup-dropoff-locations", + "attributes": { + "code": "161807", + "address": { + "street_1": "Markenburg", + "street_number": 73, + "postal_code": "2135DS", + "city": "Hoofddorp", + "country_code": "NL", + "company": "Bruna", + "phone_number": "023-5628403" + }, + "opening_hours": [ + { + "day": "Monday", + "open": "11:00", + "closed": "18:00" + }, + { + "day": "Tuesday", + "open": "09:00", + "closed": "18:00" + }, + { + "day": "Wednesday", + "open": "09:00", + "closed": "18:00" + }, + { + "day": "Thursday", + "open": "09:00", + "closed": "18:00" + }, + { + "day": "Friday", + "open": "09:00", + "closed": "20:00" + }, + { + "day": "Saturday", + "open": "09:00", + "closed": "17:30" + }, + { + "day": "Sunday", + "open": "00:00", + "closed": "00:00" + } + ], + "position": { + "latitude": 52.3013913423774, + "longitude": 4.66375416731004 + }, + "location_type": "office" + }, + "meta": { + "distance": 1872 + }, + "relationships": { + "carrier": { + "links": { + "related": "https://api/carriers/eef00b32-177e-43d3-9b26-715365e4ce46" + }, + "data": { + "id": "eef00b32-177e-43d3-9b26-715365e4ce46", + "type": "carriers" + } + } + } + }, + { + "id": "173187", + "type": "pickup-dropoff-locations", + "attributes": { + "code": "173187", + "address": { + "street_1": "Jacobus Spijkerdreef", + "street_number": 10, + "postal_code": "2132PZ", + "city": "Hoofddorp", + "country_code": "NL", + "company": "Staples Office Centre", + "phone_number": "023-5576310" + }, + "opening_hours": [ + { + "day": "Monday", + "open": "09:00", + "closed": "18:30" + }, + { + "day": "Tuesday", + "open": "09:00", + "closed": "18:30" + }, + { + "day": "Wednesday", + "open": "09:00", + "closed": "18:30" + }, + { + "day": "Thursday", + "open": "09:00", + "closed": "18:30" + }, + { + "day": "Friday", + "open": "09:00", + "closed": "18:30" + }, + { + "day": "Saturday", + "open": "09:00", + "closed": "17:00" + }, + { + "day": "Sunday", + "open": "00:00", + "closed": "00:00" + } + ], + "position": { + "latitude": 52.2864669620795, + "longitude": 4.68239055845954 + }, + "location_type": "office" + }, + "meta": { + "distance": 2110 + }, + "relationships": { + "carrier": { + "links": { + "related": "https://api/carriers/eef00b32-177e-43d3-9b26-715365e4ce46" + }, + "data": { + "id": "eef00b32-177e-43d3-9b26-715365e4ce46", + "type": "carriers" + } + } + } + }, + { + "id": "163365", + "type": "pickup-dropoff-locations", + "attributes": { + "code": "163365", + "address": { + "street_1": "Muiderbos", + "street_number": 124, + "postal_code": "2134SV", + "city": "Hoofddorp", + "country_code": "NL", + "company": "AKO", + "phone_number": "088-1338104" + }, + "opening_hours": [ + { + "day": "Monday", + "open": "09:00", + "closed": "18:00" + }, + { + "day": "Tuesday", + "open": "09:00", + "closed": "18:00" + }, + { + "day": "Wednesday", + "open": "09:00", + "closed": "18:00" + }, + { + "day": "Thursday", + "open": "09:00", + "closed": "18:00" + }, + { + "day": "Friday", + "open": "09:00", + "closed": "18:00" + }, + { + "day": "Saturday", + "open": "09:00", + "closed": "17:00" + }, + { + "day": "Sunday", + "open": "00:00", + "closed": "00:00" + } + ], + "position": { + "latitude": 52.3147095499762, + "longitude": 4.65903497807609 + }, + "location_type": "office" + }, + "meta": { + "distance": 2422 + }, + "relationships": { + "carrier": { + "links": { + "related": "https://api/carriers/eef00b32-177e-43d3-9b26-715365e4ce46" + }, + "data": { + "id": "eef00b32-177e-43d3-9b26-715365e4ce46", + "type": "carriers" + } + } + } + }, + { + "id": "161766", + "type": "pickup-dropoff-locations", + "attributes": { + "code": "161766", + "address": { + "street_1": "Genderenplein", + "street_number": 20, + "postal_code": "2134DP", + "city": "Hoofddorp", + "country_code": "NL", + "company": "Bruna Genderenplein", + "phone_number": "023-5619043" + }, + "opening_hours": [ + { + "day": "Monday", + "open": "09:00", + "closed": "18:00" + }, + { + "day": "Tuesday", + "open": "09:00", + "closed": "18:00" + }, + { + "day": "Wednesday", + "open": "09:00", + "closed": "18:00" + }, + { + "day": "Thursday", + "open": "09:00", + "closed": "18:00" + }, + { + "day": "Friday", + "open": "09:00", + "closed": "21:00" + }, + { + "day": "Saturday", + "open": "09:00", + "closed": "17:00" + }, + { + "day": "Sunday", + "open": "00:00", + "closed": "00:00" + } + ], + "position": { + "latitude": 52.3066891744711, + "longitude": 4.63838904899413 + }, + "location_type": "office" + }, + "meta": { + "distance": 3565 + }, + "relationships": { + "carrier": { + "links": { + "related": "https://api/carriers/eef00b32-177e-43d3-9b26-715365e4ce46" + }, + "data": { + "id": "eef00b32-177e-43d3-9b26-715365e4ce46", + "type": "carriers" + } + } + } + }, + { + "id": "203330", + "type": "pickup-dropoff-locations", + "attributes": { + "code": "203330", + "address": { + "street_1": "Alseïdenstraat", + "street_number": 20, + "street_number_suffix": "PBA", + "postal_code": "1363SR", + "city": "Almere", + "country_code": "NL", + "company": "Pakket- en Briefautomaat" + }, + "opening_hours": [ + { + "day": "Monday", + "open": "00:00", + "closed": "23:59" + }, + { + "day": "Tuesday", + "open": "00:00", + "closed": "23:59" + }, + { + "day": "Wednesday", + "open": "00:00", + "closed": "23:59" + }, + { + "day": "Thursday", + "open": "00:00", + "closed": "23:59" + }, + { + "day": "Friday", + "open": "00:00", + "closed": "23:59" + }, + { + "day": "Saturday", + "open": "00:00", + "closed": "23:59" + }, + { + "day": "Sunday", + "open": "00:00", + "closed": "23:59" + } + ], + "position": { + "latitude": 52.3569768014508, + "longitude": 5.15416255988611 + }, + "location_type": "office" + }, + "meta": { + "distance": 32019 + }, + "relationships": { + "carrier": { + "links": { + "related": "https://api/carriers/eef00b32-177e-43d3-9b26-715365e4ce46" + }, + "data": { + "id": "eef00b32-177e-43d3-9b26-715365e4ce46", + "type": "carriers" + } + } + } + } + ], + "meta": { + "total_pages": 1, + "total_records": 10 + }, + "links": { + "self": "https://api/carriers/eef00b32-177e-43d3-9b26-715365e4ce46/pickup-dropoff-locations/NL/2131BC?page[size]=30&page[number]=1", + "first": "https://api/carriers/eef00b32-177e-43d3-9b26-715365e4ce46/pickup-dropoff-locations/NL/2131BC?page[size]=30&page[number]=1", + "last": "https://api/carriers/eef00b32-177e-43d3-9b26-715365e4ce46/pickup-dropoff-locations/NL/2131BC?page[size]=30&page[number]=1" + } +} diff --git a/tests/Unit/Resources/PickUpDropOffLocationTest.php b/tests/Unit/Resources/PickUpDropOffLocationTest.php index 04926459..a84ce0ca 100644 --- a/tests/Unit/Resources/PickUpDropOffLocationTest.php +++ b/tests/Unit/Resources/PickUpDropOffLocationTest.php @@ -183,6 +183,7 @@ public function testJsonSerialize() ->setOpeningHours([$openingHour]) ->setPosition($position) ->setDistance(5000) + ->setLocationType('office') ->setCategories(['drop-off', 'pick-up']); $this->assertEquals([ @@ -219,6 +220,7 @@ public function testJsonSerialize() 'drop-off', 'pick-up', ], + 'location_type' => 'office', ], 'meta' => [ 'distance' => 5000,