. */ /* */ /*************************************************************************************/ namespace SoColissimo\Loop; use SoColissimo\SoColissimo; use SoColissimo\WebService\FindByAddress; use Symfony\Component\Serializer\Exception\InvalidArgumentException; use Thelia\Core\Template\Element\ArraySearchLoopInterface; use Thelia\Core\Template\Element\BaseLoop; use Thelia\Core\Template\Element\LoopResult; use Thelia\Core\Template\Element\LoopResultRow; use Thelia\Core\Template\Loop\Argument\Argument; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Log\Tlog; use Thelia\Model\AddressQuery; use Thelia\Model\ConfigQuery; use Thelia\Model\CountryQuery; /** * Class GetRelais * @package SoColissimo\Loop * @author Thelia */ class GetRelais extends BaseLoop implements ArraySearchLoopInterface { /** * @return array|mixed * @throws \ErrorException */ public function buildArray() { // Find the address ... To find ! \m/ $zipcode = $this->getZipcode(); $city = $this->getCity(); $countryId = $this->getCountryid(); $addressId = $this->getAddress(); if (!empty($addressId) && (!empty($zipcode) || !empty($city))) { throw new \InvalidArgumentException( "Cannot have argument 'address' and 'zipcode' or 'city' at the same time." ); } if (null !== $addressModel = AddressQuery::create()->findPk($addressId)) { $address = array( "zipcode" => $addressModel->getZipcode(), "city" => $addressModel->getCity(), "address" => $addressModel->getAddress1(), "countrycode"=> $addressModel->getCountry()->getIsoalpha2() ); } elseif (empty($zipcode) || empty($city)) { $search = AddressQuery::create(); $customer = $this->securityContext->getCustomerUser(); if ($customer !== null) { $search->filterByCustomerId($customer->getId()); $search->filterByIsDefault("1"); } else { throw new \ErrorException("Customer not connected."); } $search = $search->findOne(); $address["zipcode"] = $search->getZipcode(); $address["city"] = $search->getCity(); $address["address"] = $search->getAddress1(); $address["countrycode"] = $search->getCountry()->getIsoalpha2(); } else { $address = array( "zipcode" => $zipcode, "city" => $city, "address" => "", "countrycode" => CountryQuery::create() ->findOneById($countryId) ->getIsoalpha2() ); } // Then ask the Web Service $request = new FindByAddress(); $request ->setAddress($address["address"]) ->setZipCode($address["zipcode"]) ->setCity($address["city"]) ->setCountryCode($address["countrycode"]) ->setFilterRelay("1") ->setRequestId(md5(microtime())) ->setLang("FR") ->setOptionInter("1") ->setShippingDate(date("d/m/Y")) ->setAccountNumber(ConfigQuery::read('socolissimo_login')) ->setPassword(ConfigQuery::read('socolissimo_pwd')) ; try { $response = $request->exec(); } catch (InvalidArgumentException $e) { $response = array(); } catch (\SoapFault $e) { $response = array(); } if (!is_array($response) && $response !== null) { $newResponse[] = $response; $response = $newResponse; } return $response; } /** * @param LoopResult $loopResult * * @return LoopResult */ public function parseResults(LoopResult $loopResult) { foreach ($loopResult->getResultDataCollection() as $item) { $loopResultRow = new LoopResultRow(); //Tlog::getInstance()->addDebug(print_r($item, true)); foreach ($item as $key => $value) { $loopResultRow->set($key, $value); } // format distance $distance = (string) $loopResultRow->get("distanceEnMetre"); if (strlen($distance) < 4) { $distance .= " m"; } else { $distance = (string) floatval($distance) / 1000; while (substr($distance, strlen($distance) - 1, 1) == "0") { $distance = substr($distance, 0, strlen($distance) - 1); } $distance = str_replace(".", ",", $distance) . " km"; } $loopResultRow->set('distance', $distance); $loopResult->addRow($loopResultRow); } return $loopResult; } /** * @inheritdoc */ protected function getArgDefinitions() { return new ArgumentCollection( Argument::createIntTypeArgument("countryid", ""), Argument::createAnyTypeArgument("zipcode", ""), Argument::createAnyTypeArgument("city", ""), Argument::createIntTypeArgument("address") ); } }