/** * If it's configured to capture on shipment - do this. * * @param \Magento\Framework\Event\Observer $observer * * @return $this */ public function execute(\Magento\Framework\Event\Observer $observer) { $customer = $observer->getEvent()->getCustomer(); $email = $customer->getEmail(); $websiteId = $customer->getWebsiteId(); $apiEnabled = $this->helper->isEnabled($websiteId); $customerSync = $this->helper->isCustomerSyncEnabled($websiteId); /* * Remove contact. */ if ($apiEnabled && $customerSync) { try { //register in queue with importer $this->importerFactory->create()->registerQueue(\Dotdigitalgroup\Email\Model\Importer::IMPORT_TYPE_CONTACT, $email, \Dotdigitalgroup\Email\Model\Importer::MODE_CONTACT_DELETE, $websiteId); $contactModel = $this->contactFactory->create()->loadByCustomerEmail($email, $websiteId); if ($contactModel->getId()) { //remove contact $contactModel->delete(); } } catch (\Exception $e) { $this->helper->debug((string) $e, []); } } return $this; }
/** * If it's configured to capture on shipment - do this. * * @param \Magento\Framework\Event\Observer $observer * * @return $this */ public function execute(\Magento\Framework\Event\Observer $observer) { $customer = $observer->getEvent()->getCustomer(); $email = $customer->getEmail(); $websiteId = $customer->getWebsiteId(); $customerId = $customer->getEntityId(); $isSubscribed = $customer->getIsSubscribed(); try { // fix for a multiple hit of the observer $emailReg = $this->registry->registry($email . '_customer_save'); if ($emailReg) { return $this; } $this->registry->register($email . '_customer_save', $email); $emailBefore = $this->customerFactory->create()->load($customer->getId())->getEmail(); $contactModel = $this->contactFactory->create()->loadByCustomerEmail($emailBefore, $websiteId); //email change detection if ($email != $emailBefore) { $this->helper->log('email change detected : ' . $email . ', after : ' . $emailBefore . ', website id : ' . $websiteId); $data = ['emailBefore' => $emailBefore, 'email' => $email, 'isSubscribed' => $isSubscribed]; $this->importerFactory->registerQueue(\Dotdigitalgroup\Email\Model\Importer::IMPORT_TYPE_CONTACT_UPDATE, $data, \Dotdigitalgroup\Email\Model\Importer::MODE_CONTACT_EMAIL_UPDATE, $websiteId); } elseif (!$emailBefore) { //for new contacts update email $contactModel->setEmail($email); } $contactModel->setEmailImported(\Dotdigitalgroup\Email\Model\Contact::EMAIL_CONTACT_NOT_IMPORTED)->setCustomerId($customerId)->save(); } catch (\Exception $e) { $this->helper->debug((string) $e, []); } return $this; }
/** * Export guests for a website. * * @param $website * * @throws \Magento\Framework\Exception\LocalizedException */ public function exportGuestPerWebsite($website) { $guests = $this->contactFactory->create()->getGuests($website); //found some guests if ($guests->getSize()) { $guestFilename = strtolower($website->getCode() . '_guest_' . date('d_m_Y_Hi') . '.csv'); $this->helper->log('Guest file: ' . $guestFilename); $storeName = $this->helper->getMappedStoreName($website); $this->file->outputCSV($this->file->getFilePath($guestFilename), ['Email', 'emailType', $storeName]); foreach ($guests as $guest) { $email = $guest->getEmail(); try { //@codingStandardsIgnoreStart $guest->setEmailImported(\Dotdigitalgroup\Email\Model\Contact::EMAIL_CONTACT_IMPORTED); $guest->getResource()->save($guest); //@codingStandardsIgnoreEnd $storeName = $website->getName(); // save data for guests $this->file->outputCSV($this->file->getFilePath($guestFilename), [$email, 'Html', $storeName]); ++$this->countGuests; } catch (\Exception $e) { throw new \Magento\Framework\Exception\LocalizedException(__($e->getMessage())); } } if ($this->countGuests) { //register in queue with importer $this->importerFactory->create()->registerQueue(\Dotdigitalgroup\Email\Model\Importer::IMPORT_TYPE_GUEST, '', \Dotdigitalgroup\Email\Model\Importer::MODE_BULK, $website->getId(), $guestFilename); } } }
/** * Execute method. * * @param \Magento\Framework\Event\Observer $observer * * @return $this * @codingStandardsIgnoreStart */ public function execute(\Magento\Framework\Event\Observer $observer) { //@codingStandardsIgnoreEnd $contactModel = $this->contactResourceFactory->create(); $numImported = $this->contactFactory->create()->getNumberOfImportedContacs(); $updated = $contactModel->resetAllContacts(); $this->helper->log('-- Imported contacts: ' . $numImported . ' reseted : ' . $updated . ' --'); return $this; }
/** * Change contact subscription status. * * @param \Magento\Framework\Event\Observer $observer * * @return $this */ public function execute(\Magento\Framework\Event\Observer $observer) { $subscriber = $observer->getEvent()->getSubscriber(); $email = $subscriber->getEmail(); $storeId = $subscriber->getStoreId(); $subscriberStatus = $subscriber->getSubscriberStatus(); $websiteId = $this->storeManager->getStore($subscriber->getStoreId())->getWebsiteId(); //check if enabled if (!$this->helper->isEnabled($websiteId)) { return $this; } try { $contactEmail = $this->contactFactory->create()->loadByCustomerEmail($email, $websiteId); // only for subscribers if ($subscriberStatus == \Magento\Newsletter\Model\Subscriber::STATUS_SUBSCRIBED) { //Set contact as subscribed $contactEmail->setSubscriberStatus($subscriberStatus)->setIsSubscriber('1'); //Subscriber subscribed when it is suppressed in table then re-subscribe if ($contactEmail->getSuppressed()) { $this->importerFactory->registerQueue(\Dotdigitalgroup\Email\Model\Importer::IMPORT_TYPE_SUBSCRIBER_RESUBSCRIBED, ['email' => $email], \Dotdigitalgroup\Email\Model\Importer::MODE_SUBSCRIBER_RESUBSCRIBED, $websiteId); //Set to subscriber imported and reset the subscriber as suppressed $contactEmail->setSubscriberImported(1)->setSuppressed(null); } //not subscribed } else { //skip if contact is suppressed if ($contactEmail->getSuppressed()) { return $this; } //update contact id for the subscriber $contactId = $contactEmail->getContactId(); //get the contact id if (!$contactId) { $this->importerFactory->registerQueue(\Dotdigitalgroup\Email\Model\Importer::IMPORT_TYPE_SUBSCRIBER_UPDATE, ['email' => $email, 'id' => $contactEmail->getId()], \Dotdigitalgroup\Email\Model\Importer::MODE_SUBSCRIBER_UPDATE, $websiteId); } $contactEmail->setIsSubscriber(null)->setSubscriberStatus(\Magento\Newsletter\Model\Subscriber::STATUS_UNSUBSCRIBED); } // fix for a multiple hit of the observer. stop adding the duplicates on the automation $emailReg = $this->registry->registry($email . '_subscriber_save'); if ($emailReg) { return $this; } $this->registry->register($email . '_subscriber_save', $email); //add subscriber to automation $this->addSubscriberToAutomation($email, $subscriber, $websiteId); //update the contact $contactEmail->setStoreId($storeId); //update contact $contactEmail->save(); } catch (\Exception $e) { $this->helper->debug((string) $e, []); } return $this; }
/** * Export subscribers per website. * * @param $website * * @return int * * @throws LocalizedException */ public function exportSubscribersPerWebsite($website) { $updated = 0; $limit = $this->helper->getSyncLimit($website->getId()); //subscriber collection to import $subscribers = $this->contactFactory->create()->getSubscribersToImport($website, $limit); if ($subscribers->getSize()) { $subscribersFilename = strtolower($website->getCode() . '_subscribers_' . date('d_m_Y_Hi') . '.csv'); //get mapped storename $subscriberStoreName = $this->helper->getMappedStoreName($website); //file headers $this->file->outputCSV($this->file->getFilePath($subscribersFilename), ['Email', 'emailType', $subscriberStoreName]); $emails = $subscribers->getColumnValues('email'); $subscriberFactory = $this->subscriberFactory->create(); $subscribersData = $subscriberFactory->getCollection()->addFieldToFilter('subscriber_email', ['in' => $emails])->addFieldToSelect(['subscriber_email', 'store_id'])->toArray(); foreach ($subscribers as $subscriber) { $email = $subscriber->getEmail(); $storeId = $this->getStoreIdForSubscriber($email, $subscribersData['items']); $storeName = $this->storeManager->getStore($storeId)->getName(); // save data for subscribers $this->file->outputCSV($this->file->getFilePath($subscribersFilename), [$email, 'Html', $storeName]); //@codingStandardsIgnoreStart $subscriber->setSubscriberImported(1)->save(); //@codingStandardsIgnoreEnd ++$updated; } $this->helper->log('Subscriber filename: ' . $subscribersFilename); //register in queue with importer $this->importerFactory->create()->registerQueue(\Dotdigitalgroup\Email\Model\Importer::IMPORT_TYPE_SUBSCRIBERS, '', \Dotdigitalgroup\Email\Model\Importer::MODE_BULK, $website->getId(), $subscribersFilename); } //add updated number for the website $this->countSubscriber += $updated; return $updated; }
/** * @return \Magento\Backend\Model\View\Result\Redirect */ public function execute() { $ids = $this->getRequest()->getParam('selected'); if (!is_array($ids)) { $this->messageManager->addErrorMessage(__('Please select contact.')); } else { try { //@codingStandardsIgnoreStart foreach ($ids as $id) { $model = $this->contact->create()->setEmailContactId($id); $model->delete(); } //@codingStandardsIgnoreEnd $this->messageManager->addSuccessMessage(__('Total of %1 record(s) were deleted.', count($ids))); } catch (\Exception $e) { $this->messageManager->addErrorMessage($e->getMessage()); } } /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); $resultRedirect->setPath('*/*/'); return $resultRedirect; }
/** * Mark contact for reimport. * * @param $customerId */ public function setConnectorContactToReImport($customerId) { $contactModel = $this->contactFactory->create(); $contactModel->loadByCustomerId($customerId)->setEmailImported(\Dotdigitalgroup\Email\Model\Contact::EMAIL_CONTACT_NOT_IMPORTED)->save(); }
/** * Sync a single contact. * * @param null $contactId * * @return mixed */ public function syncContact($contactId = null) { if ($contactId) { $contact = $this->contactFactory->create()->load($contactId); } else { $contact = $this->registry->registry('current_contact'); } if (!$contact->getId()) { $this->messageManager->addErrorMessage('No contact found!'); return false; } $websiteId = $contact->getWebsiteId(); $website = $this->storeManager->getWebsite($websiteId); $updated = 0; $customers = $headers = $allMappedHash = []; $this->helper->log('---------- Start single customer sync ----------'); //skip if the mapping field is missing if (!$this->helper->getCustomerAddressBook($website)) { return false; } $customerId = $contact->getCustomerId(); if (!$customerId) { $this->messageManager->addErrorMessage('Cannot manually sync guests!'); return false; } if (!$this->helper->isEnabled($websiteId)) { $this->messageManager->addErrorMessage('Api is not enabled'); return false; } $client = $this->helper->getWebsiteApiClient($website); //create customer filename $customersFile = strtolower($website->getCode() . '_customers_' . date('d_m_Y_Hi') . '.csv'); $this->helper->log('Customers file : ' . $customersFile); /* * HEADERS. */ $mappedHash = $this->helper->getWebsiteCustomerMappingDatafields($website); $headers = $mappedHash; //custom customer attributes $customAttributes = $this->helper->getCustomAttributes($website); foreach ($customAttributes as $data) { $headers[] = $data['datafield']; $allMappedHash[$data['attribute']] = $data['datafield']; } $headers[] = 'Email'; $headers[] = 'EmailType'; $this->file->outputCSV($this->file->getFilePath($customersFile), $headers); /* * END HEADERS. */ $customerCollection = $this->_getCustomerCollection([$customerId], $website->getId()); foreach ($customerCollection as $customer) { $contactModel = $this->contactFactory->create()->loadByCustomerEmail($customer->getEmail(), $websiteId); //contact with this email not found if (!$contactModel->getId()) { continue; } /* * DATA. */ $connectorCustomer = $this->emailCustomer->create()->setMappingHash($mappedHash)->setCustomerData($customer); $customers[] = $connectorCustomer; foreach ($customAttributes as $data) { $attribute = $data['attribute']; $value = $customer->getData($attribute); $connectorCustomer->setData($value); } //contact email and email type $connectorCustomer->setData($customer->getEmail()); $connectorCustomer->setData('Html'); // save csv file data for customers $this->file->outputCSV($this->file->getFilePath($customersFile), $connectorCustomer->toCSVArray()); /* * END DATA. */ //mark the contact as imported $contactModel->setEmailImported(\Dotdigitalgroup\Email\Model\Contact::EMAIL_CONTACT_IMPORTED); $subscriber = $this->subscriberFactory->create()->loadByEmail($customer->getEmail()); if ($subscriber->isSubscribed()) { $contactModel->setIsSubscriber('1')->setSubscriberStatus($subscriber->getSubscriberStatus()); } //@codingStandardsIgnoreStart $contactModel->getResource()->save($contactModel); ++$updated; } if (is_file($this->file->getFilePath($customersFile))) { //@codingStandardsIgnoreEnd //import contacts if ($updated > 0) { //register in queue with importer $this->importerFactory->create()->registerQueue(\Dotdigitalgroup\Email\Model\Importer::IMPORT_TYPE_CONTACT, '', \Dotdigitalgroup\Email\Model\Importer::MODE_BULK, $website->getId(), $customersFile); $client->postAddressBookContactsImport($customersFile, $this->helper->getCustomerAddressBook($website)); } } return $contact->getEmail(); }