'email', 'firstname' => '$first_name', 'lastname' => '$last_name', ]; const CUSTOMER_WEBSERVICE_PROPERTIES_MAP = [ '$email' => 'email', ]; /** * @var DateTimeService */ protected $dateTimeService; /** * @var ContextService */ protected $contextService; /** * @var CustomerService */ protected $customerService; public function __construct( DateTimeService $dateTimeService, ContextService $contextService, CustomerService $customerService ) { $this->dateTimeService = $dateTimeService; $this->contextService = $contextService; $this->customerService = $customerService; } /** * Build payload for webservice to identify a PrestaShop customer into Klaviyo * * @param ArrayObject $customer * @return array * @throws KlaviyoException */ public function buildPayload(ArrayObject $customer) { if (!isset($customer['cache_payload'])) { $result = []; $allGroups = $this->customerService->getAllGroups($customer); $defaultGroups = $this->customerService->getDefaultGroups($customer); $gender = $this->customerService->getGender($customer); $registerDate = $this->customerService->getRegisterDate($customer); $birthday = $this->customerService->getBirthday($customer); $lang = $this->contextService->getLang($customer['context']); $country = $this->contextService->getCountry($customer['context']); $result['$email'] = $this->customerService->getEmail($customer); if (!empty($customer['firstname'])) { $result['firstname'] = $customer['firstname']; } if (!empty($customer['lastname'])) { $result['lastname'] = $customer['lastname']; } if ($lang !== null && $country !== null) { $result['$locale'] = $this->extractLocale( $lang, $country ); } if ($gender !== null) { $result['Gender'] = $this->extractGenderName( $gender ); } if (!empty($allGroups)) { $result['PrestaShop Groups'] = $this->extractAllGroupsName( $allGroups ); } if (!empty($defaultGroups)) { $result['PrestaShop Default Group'] = $this->extractAllDefaultGroupsName( $defaultGroups ); } if ($registerDate !== null) { $result['PrestaShop Account Created Date'] = $this->dateTimeService->format( $registerDate ); } if ($birthday !== null) { $result['Birthday'] = $birthday; } if ($this->contextService->hasMultishop()) { $shops = $this->customerService->getAllShops($customer); if (!empty($shops)) { $result['PrestaShop Shops'] = $this->extractAllShopsName( $shops ); } } $customer['cache_payload'] = $result; } return $customer['cache_payload']; } /** * Build payload for JS SDK to identify a PrestaShop customer into Klaviyo * Data are adapted from buildPayload for JS SDK * * @return array * @see self::buildPayload * @throws KlaviyoException */ public function buildPayloadForJs(ArrayObject $customer) { return $this->adaptPayload($customer, self::CUSTOMER_JS_PROPERTIES_MAP); } /** * Build payload for PrestaShop Webservice to identify a PrestaShop customer into Klaviyo * Data are adapted from buildPayload for PrestaShop Webservice * * @return array * @see self::buildPayload */ public function buildPayloadForWebservice(ArrayObject $customer) { return $this->adaptPayload($customer, self::CUSTOMER_WEBSERVICE_PROPERTIES_MAP); } /** * Build $locale data for user by using IETF BCP 47 format * https://help.klaviyo.com/hc/en-us/articles/360053679071#:~:text=%24locale%3A%C2%A0The,from%20%24locale%20property * * @param Language $lang * @param Country|null $country * @return string */ protected function extractLocale( Language $lang, Country $country ) { $langIso = strtolower($lang->iso_code); $countryIso = strtoupper($country->iso_code); return "{$langIso}-{$countryIso}"; } /** * @return string */ protected function extractGenderName(Gender $gender) { $genderName = trim((string) $gender->name); // Not supposed to happen if (empty($genderName)) { return (string) $gender->id; } return $genderName; } /** * @return string */ protected function extractGroupName(Group $group) { $idGroup = (string) $group->id; $groupName = trim((string) $group->name); return trim("{$idGroup} {$groupName}"); } /** * @param Group[] $allGroups * @return string[] */ protected function extractAllGroupsName($allGroups) { $result = []; foreach ($allGroups as $group) { $result[] = $this->extractGroupName($group); } return $result; } /** * @param Group[] $allGroups * @return string|string[] */ protected function extractAllDefaultGroupsName($allGroups) { // If multishop is not enabled // Then, send Default group with array format and idShop will complexify the data format // Whereas this is not useful if (!$this->contextService->hasMultishop()) { $result = $this->extractAllGroupsName($allGroups); return $result[0]; } $result = []; foreach ($allGroups as $idShop => $group) { $shop = new Shop($idShop); $shopPart = $this->extractShopName($shop); $groupPart = $this->extractGroupName($group); $result[] = trim("{$shopPart} - {$groupPart}"); } return $result; } /** * @return string */ protected function extractShopName(Shop $shop) { $idShop = (string) $shop->id; $shopName = trim((string) $shop->name); return trim("{$idShop} {$shopName}"); } /** * @param Shop[] $allShops * @return string[] */ protected function extractAllShopsName($allShops) { $result = []; foreach ($allShops as $shop) { $result[] = $this->extractShopName($shop); } return $result; } /** * @param ArrayObject $customer * @param array $mapping * @return array * @throws KlaviyoException */ protected function adaptPayload(ArrayObject $customer, $mapping) { $result = $this->buildPayload($customer); // Convert properties for JS SDK payload // And keep only custom properties in $temp foreach ($mapping as $old => $new) { if (!isset($result[$old])) { continue; } $result[$new] = $result[$old]; unset($result[$old]); } return $result; } }