* @copyright 2021 DIGITAL RETAIL TECHNOLOGIES SL * @license https://opensource.org/licenses/MIT The MIT License * * Don't forget to prefix your containers with your own identifier * to avoid any conflicts with others containers. */ class RetailcrmCustomerAddressBuilder extends RetailcrmAbstractBuilder implements RetailcrmBuilderInterface { /** * @var Address|AddressCore customerAddress */ private $customerAddress; /** * @var array */ private $dataCrm; /** * @var int */ private $idCustomer; /** * @var string */ private $firstName; /** * @var string */ private $lastName; /** * @var string */ private $phone; /** * @var string */ private $alias; /** * RetailcrmCustomerAddressBuilder constructor. */ public function __construct() { $this->reset(); } /** * @param Address|AddressCore $customerAddress * * @return RetailcrmCustomerAddressBuilder */ public function setCustomerAddress($customerAddress) { $this->customerAddress = $customerAddress; return $this; } public function setDataCrm($dataCrm) { $this->dataCrm = $dataCrm; return $this; } /** * @param int $idCustomer * * @return RetailcrmCustomerAddressBuilder */ public function setIdCustomer($idCustomer) { $this->idCustomer = $idCustomer; return $this; } /** * @param string $alias * * @return RetailcrmCustomerAddressBuilder */ public function setAlias($alias) { $this->alias = $alias; return $this; } /** * @param string $firstName * * @return RetailcrmCustomerAddressBuilder */ public function setFirstName($firstName) { $this->firstName = $firstName; return $this; } /** * @param string $lastName * * @return RetailcrmCustomerAddressBuilder */ public function setLastName($lastName) { $this->lastName = $lastName; return $this; } /** * @param string $phone * * @return RetailcrmCustomerAddressBuilder */ public function setPhone($phone) { $this->phone = $phone; return $this; } public function getData() { if (!empty($this->customerAddress)) { return $this->customerAddress; } return []; } public function reset() { $this->customerAddress = new Address(); $this->setAddressField('id_country', Configuration::get('PS_COUNTRY_DEFAULT')); return $this; } public function build() { if (empty($this->customerAddress)) { $this->reset(); } $this->customerAddress->id_customer = $this->idCustomer; $this->setAddressField('alias', $this->alias, 'default'); $this->setAddressField('lastname', $this->lastName, ''); $this->setAddressField('firstname', $this->firstName, ''); $this->setAddressField('phone', $this->phone, ''); $this->buildAddressLine(); if (array_key_exists('notes', $this->dataCrm)) { $this->setAddressField('other', $this->dataCrm['notes'], ''); } if (array_key_exists('countryIso', $this->dataCrm)) { $countryIso = null; if (Validate::isLanguageIsoCode($this->dataCrm['countryIso'])) { $countryIso = Country::getByIso($this->dataCrm['countryIso']); } $this->setAddressField('id_country', $countryIso, Configuration::get('PS_COUNTRY_DEFAULT')); } if (array_key_exists('city', $this->dataCrm)) { $this->setAddressField('city', $this->dataCrm['city'], '--'); } if (array_key_exists('index', $this->dataCrm)) { $this->setAddressField('postcode', $this->dataCrm['index'], ''); } if (array_key_exists('region', $this->dataCrm)) { $this->setAddressField('id_state', (int) State::getIdByName($this->dataCrm['region'])); } $this->customerAddress = RetailcrmTools::filter( 'RetailcrmFilterSaveCustomerAddress', $this->customerAddress, [ 'dataCrm' => $this->dataCrm, ] ); return $this; } private function setAddressField($field, $value, $default = null) { if (!property_exists($this->customerAddress, $field)) { throw new InvalidArgumentException("Property $field not exist in the object"); } if (null !== $value) { $this->customerAddress->$field = $value; } else { $this->customerAddress->$field = $default; } } private function buildAddressLine() { if (isset($this->dataCrm['text'])) { $text = $this->dataCrm['text']; if (isset($this->dataCrm['notes'])) { $text = str_replace($this->dataCrm['notes'], '', $text); } $text = rtrim($text, ', '); $addressLine = explode(RetailcrmAddressBuilder::ADDRESS_LINE_DIVIDER, $text, 2); $this->setAddressField('address1', $addressLine[0], '--'); if (1 == count($addressLine)) { $this->setAddressField('address2', ''); } else { $this->setAddressField('address2', $addressLine[1], ''); } } } }