@@ -42,18 +42,18 @@ class Shipment
4242 protected $ capabilityService ;
4343
4444 public function __construct (
45- Connector $ connector ,
46- PieceFactory $ pieceFactory ,
47- UUIDFactory $ uuidFactory ,
48- ShipmentRequestFactory $ shipmentRequestFactory ,
49- AddresseeFactory $ addresseeFactory ,
50- OptionFactory $ optionFactory ,
51- ShipmentResponseFactory $ shipmentResponseFactory ,
52- PieceResource $ pieceResource ,
45+ Connector $ connector ,
46+ PieceFactory $ pieceFactory ,
47+ UUIDFactory $ uuidFactory ,
48+ ShipmentRequestFactory $ shipmentRequestFactory ,
49+ AddresseeFactory $ addresseeFactory ,
50+ OptionFactory $ optionFactory ,
51+ ShipmentResponseFactory $ shipmentResponseFactory ,
52+ PieceResource $ pieceResource ,
5353 OrderRepositoryInterface $ orderRepository ,
54- TrackFactory $ trackFactory ,
55- Data $ helper ,
56- Capability $ capabilityService
54+ TrackFactory $ trackFactory ,
55+ Data $ helper ,
56+ Capability $ capabilityService
5757 ) {
5858 $ this ->connector = $ connector ;
5959 $ this ->pieceFactory = $ pieceFactory ;
@@ -142,7 +142,7 @@ public function getReturnRequestData($storeId, ShipmentRequest $shipmentRequest)
142142 );
143143
144144 // Return labels are at least DOOR
145- $ options = [ $ this ->optionFactory ->create (['automap ' => ['key ' => 'DOOR ' ]])];
145+ $ options = [$ this ->optionFactory ->create (['automap ' => ['key ' => 'DOOR ' ]])];
146146 $ copyOptions = ['REFERENCE ' , 'REFERENCE2 ' ];
147147
148148 foreach ($ shipmentRequest ->options as $ option ) {
@@ -189,19 +189,19 @@ public function sendRequest(ShipmentRequest $shipmentRequest)
189189 public function fakeRequest ($ shipmentRequest )
190190 {
191191 $ response = [
192- 'shipmentId ' => $ shipmentRequest ->shipmentId ,
193- 'product ' => 'DFY-B2C ' ,
194- 'pieces ' => array (array (
195- 'labelId ' => uniqid ('TEST-LABEL-ID- ' ),
196- 'trackerCode ' => 'JVGL0 ' . rand (100000000000000000 , 999999999999999999 ),
197- 'parcelType ' => 'SMALL ' ,
198- 'pieceNumber ' => 1 ,
199- 'labelType ' => 'B2X_Generic_A4_Third '
200- )),
192+ 'shipmentId ' => $ shipmentRequest ->shipmentId ,
193+ 'product ' => 'DFY-B2C ' ,
194+ 'pieces ' => array (array (
195+ 'labelId ' => uniqid ('TEST-LABEL-ID- ' ),
196+ 'trackerCode ' => 'JVGL0 ' . rand (100000000000000000 , 999999999999999999 ),
197+ 'parcelType ' => 'SMALL ' ,
198+ 'pieceNumber ' => 1 ,
199+ 'labelType ' => 'B2X_Generic_A4_Third '
200+ )),
201201 'orderReference ' => $ shipmentRequest ->orderReference ,
202- 'deliveryArea ' => [
202+ 'deliveryArea ' => [
203203 'remote ' => false ,
204- 'type ' => 'NonRemote '
204+ 'type ' => 'NonRemote '
205205 ]
206206 ];
207207
@@ -233,16 +233,16 @@ public function createTracks($pieceResponses, $isReturn = false)
233233 /** @var Piece $piece */
234234 $ piece = $ this ->pieceFactory ->create ();
235235 $ piece ->addData ([
236- 'label_id ' => $ pieceResponse ->labelId ,
237- 'tracker_code ' => $ pieceResponse ->trackerCode ,
238- 'postal_code ' => $ pieceResponse ->postalCode ,
239- 'parcel_type ' => $ pieceResponse ->parcelType ,
240- 'piece_number ' => $ pieceResponse ->pieceNumber ,
241- 'label_type ' => $ pieceResponse ->labelType ,
242- 'is_return ' => $ isReturn ,
243- 'shipment_request ' => $ pieceResponse ->shipmentRequest ,
244- 'service_options ' => $ pieceResponse ->serviceOptions ,
245- 'country_code ' => $ pieceResponse ->countryCode
236+ 'label_id ' => $ pieceResponse ->labelId ,
237+ 'tracker_code ' => $ pieceResponse ->trackerCode ,
238+ 'postal_code ' => $ pieceResponse ->postalCode ,
239+ 'parcel_type ' => $ pieceResponse ->parcelType ,
240+ 'piece_number ' => $ pieceResponse ->pieceNumber ,
241+ 'label_type ' => $ pieceResponse ->labelType ,
242+ 'is_return ' => $ isReturn ,
243+ 'shipment_request ' => $ pieceResponse ->shipmentRequest ,
244+ 'service_options ' => $ pieceResponse ->serviceOptions ,
245+ 'country_code ' => $ pieceResponse ->countryCode
246246 ]);
247247
248248 $ this ->pieceResource ->save ($ piece );
@@ -276,6 +276,25 @@ public function addReference($shipmentRequest, $reference)
276276 return $ shipmentRequest ;
277277 }
278278
279+ /**
280+ * Check if an address string array, when joined, should be split into street, houseNumber and addition.
281+ * It should only be split if it starts or ends (but not both) with a digit. And only if the array contains only one number.
282+ *
283+ * @param array $strings
284+ * @return bool
285+ */
286+ public function shouldSplitAddress (array $ strings ): bool
287+ {
288+ $ joined = trim (implode (' ' , $ strings ));
289+ preg_match_all ('/\d+/ ' , $ joined , $ numberMatches );
290+
291+ $ hasExactlyOneNumber = count ($ numberMatches [0 ]) === 1 ;
292+ $ hasNumberAtStart = preg_match ('/^(\d+)\s+(.+)$/ ' , $ joined ) === 1 ;
293+ $ hasNumberAtEnd = preg_match ('/^(.+?)\s+(\d+)$/ ' , $ joined ) === 1 ;
294+
295+ return $ hasExactlyOneNumber && ($ hasNumberAtStart xor $ hasNumberAtEnd );
296+ }
297+
279298 protected function tagShipmentRequest (ShipmentResponse $ shipmentResponse , $ shipmentRequest )
280299 {
281300 if ($ this ->helper ->getConfigData ('debug/enabled ' )
@@ -419,10 +438,16 @@ protected function updateAddressStreet(Address $address, array $street)
419438 {
420439 $ fullStreet = implode (' ' , $ street );
421440
422- $ data = $ this ->parseStreetData ($ fullStreet );
423- $ address ->street = $ data ['street ' ];
424- $ address ->number = $ data ['number ' ];
425- $ address ->addition = $ data ['addition ' ];
441+ if ($ this ->shouldSplitAddress ($ street )) {
442+ $ data = $ this ->parseStreetData ($ fullStreet );
443+ $ address ->street = $ data ['street ' ];
444+ $ address ->number = $ data ['number ' ];
445+ $ address ->addition = $ data ['addition ' ];
446+ } else {
447+ $ address ->street = $ fullStreet ;
448+ $ address ->number = '' ;
449+ $ address ->addition = '' ;
450+ }
426451
427452 return $ address ;
428453 }
@@ -474,8 +499,8 @@ protected function parseStreetData($raw)
474499
475500 preg_match ('/([^0-9]*)\s*(.*)/ ' , trim ($ parsableStreet ), $ streetParts );
476501 $ address = [
477- 'street ' => isset ($ streetParts [1 ]) ? trim ($ streetParts [1 ]) : '' ,
478- 'number ' => isset ($ streetParts [2 ]) ? trim ($ streetParts [2 ]) : '' ,
502+ 'street ' => isset ($ streetParts [1 ]) ? trim ($ streetParts [1 ]) : '' ,
503+ 'number ' => isset ($ streetParts [2 ]) ? trim ($ streetParts [2 ]) : '' ,
479504 'addition ' => '' ,
480505 ];
481506
0 commit comments