/**
  * Get options.
  *
  * @return array
  */
 public function toOptionArray()
 {
     $fields = [];
     $fields[] = ['value' => '0', 'label' => '-- Disabled --'];
     $websiteName = $this->request->getParam('website', false);
     $website = $websiteName ? $this->storeManager->getWebsite($websiteName) : 0;
     if ($this->helper->isEnabled($website)) {
         $savedPrograms = $this->registry->registry('programs');
         //get saved datafileds from registry
         if (is_array($savedPrograms)) {
             $programs = $savedPrograms;
         } else {
             //grab the datafields request and save to register
             $client = $this->helper->getWebsiteApiClient($website);
             $programs = $client->getPrograms();
             $this->registry->unregister('programs');
             $this->registry->register('programs', $programs);
         }
         //set the api error message for the first option
         if (isset($programs->message)) {
             //message
             $fields[] = ['value' => 0, 'label' => $programs->message];
         } elseif (!empty($programs)) {
             //loop for all programs option
             foreach ($programs as $program) {
                 if (isset($program->id) && $program->status == 'Active') {
                     //@codingStandardsIgnoreStart
                     $fields[] = ['value' => $program->id, 'label' => addslashes($program->name)];
                     //@codingStandardsIgnoreEnd
                 }
             }
         }
     }
     return $fields;
 }
 /**
  * Retrieve list of options.
  *
  * @return array
  */
 public function toOptionArray()
 {
     $fields = [];
     // Add a "Do Not Map" Option
     $fields[] = ['value' => 0, 'label' => '-- Please Select --'];
     $apiEnabled = $this->helper->isEnabled($this->helper->getWebsite());
     if ($apiEnabled) {
         $savedAddressbooks = $this->registry->registry('addressbooks');
         if ($savedAddressbooks) {
             $addressBooks = $savedAddressbooks;
         } else {
             $client = $this->helper->getWebsiteApiClient();
             //make an api call an register the addressbooks
             $addressBooks = $client->getAddressBooks();
             if ($addressBooks) {
                 $this->registry->register('addressbooks', $addressBooks);
             }
         }
         //set up fields with book id and label
         foreach ($addressBooks as $book) {
             if (isset($book->id)) {
                 $fields[] = ['value' => (string) $book->id, 'label' => (string) $book->name];
             }
         }
     }
     return $fields;
 }
 /**
  *  Datafields option.
  *
  * @return array
  */
 public function toOptionArray()
 {
     $fields = [];
     //default data option
     $fields[] = ['value' => '0', 'label' => '-- Please Select --'];
     $apiEnabled = $this->helper->isEnabled($this->helper->getWebsite());
     if ($apiEnabled) {
         $savedDatafields = $this->registry->registry('datafields');
         //get saved datafileds from registry
         if ($savedDatafields) {
             $datafields = $savedDatafields;
         } else {
             //grab the datafields request and save to register
             $client = $this->helper->getWebsiteApiClient();
             $datafields = $client->getDatafields();
             $this->registry->register('datafields', $datafields);
         }
         //set the api error message for the first option
         if (isset($datafields->message)) {
             //message
             $fields[] = ['value' => 0, 'label' => $datafields->message];
         } else {
             //loop for all datafields option
             foreach ($datafields as $datafield) {
                 if (isset($datafield->name)) {
                     $fields[] = ['value' => $datafield->name, 'label' => $datafield->name];
                 }
             }
         }
     }
     return $fields;
 }
 /**
  * @return array
  */
 public function toOptionArray()
 {
     $fields = [];
     $fields[] = ['value' => '0', 'label' => '-- Please Select --'];
     $apiEnabled = $this->helper->isEnabled($this->helper->getWebsite());
     if ($apiEnabled) {
         $savedCampaigns = $this->registry->registry('campaigns');
         if (is_array($savedCampaigns)) {
             $campaigns = $savedCampaigns;
         } else {
             //grab the datafields request and save to register
             $client = $this->helper->getWebsiteApiClient();
             $campaigns = $client->getCampaigns();
             $this->registry->register('campaigns', $campaigns);
         }
         //set the api error message for the first option
         if (isset($campaigns->message)) {
             //message
             $fields[] = ['value' => 0, 'label' => $campaigns->message];
         } elseif (!empty($campaigns)) {
             //loop for all campaing options
             foreach ($campaigns as $campaign) {
                 if (isset($campaign->name)) {
                     //@codingStandardsIgnoreStart
                     $fields[] = ['value' => $campaign->id, 'label' => addslashes($campaign->name)];
                     //@codingStandardsIgnoreEnd
                 }
             }
         }
     }
     return $fields;
 }
 /**
  * Get data fields.
  *
  * @return mixed
  */
 public function getDataFields()
 {
     $website = $this->helper->getWebsite();
     $client = $this->helper->getWebsiteApiClient($website);
     //grab the datafields request and save to register
     $datafields = $client->getDataFields();
     return $datafields;
 }
 /**
  * * Get api client.
  *
  * @return bool|mixed|object
  */
 public function _getApiClient()
 {
     if (empty($this->client)) {
         $website = $this->getCustomer()->getStore()->getWebsite();
         $client = $this->helper->getWebsiteApiClient($website);
         $client->setApiUsername($this->helper->getApiUsername($website))->setApiPassword($this->helper->getApiPassword($website));
         $this->client = $client;
     }
     return $this->client;
 }
 /**
  * Get address books.
  */
 public function getAddressBooks()
 {
     $website = $this->helper->getWebsite();
     $client = $this->helper->getWebsiteApiClient($website);
     $savedAddressBooks = $this->registry->registry('addressbooks');
     //get saved address books from registry
     if ($savedAddressBooks) {
         $addressBooks = $savedAddressBooks;
     } else {
         // api all address books
         $addressBooks = $client->getAddressBooks();
         $this->registry->register('addressbooks', $addressBooks);
     }
     return $addressBooks;
 }
 /**
  * Sync.
  *
  * @param $collection
  */
 public function sync($collection)
 {
     foreach ($collection as $item) {
         $websiteId = $item->getWebsiteId();
         $file = $item->getImportFile();
         if ($this->helper->isEnabled($websiteId)) {
             $this->client = $this->helper->getWebsiteApiClient($websiteId);
             $addressBook = $this->_getAddressBook($item->getImportType(), $websiteId);
             if (!empty($file) && !empty($addressBook) && $this->client) {
                 //import contacts from csv file
                 $result = $this->client->postAddressBookContactsImport($file, $addressBook);
                 $this->_handleItemAfterSync($item, $result);
             }
         }
     }
 }
 /**
  * Create certain address books.
  *
  * @param $username
  * @param $password
  *
  * @return bool
  */
 public function createAddressBooks($username, $password)
 {
     $addressBooks = [['name' => 'Magento_Customers', 'visibility' => 'Private'], ['name' => 'Magento_Subscribers', 'visibility' => 'Private'], ['name' => 'Magento_Guests', 'visibility' => 'Private']];
     $addressBookMap = ['Magento_Customers' => Config::XML_PATH_CONNECTOR_CUSTOMERS_ADDRESS_BOOK_ID, 'Magento_Subscribers' => Config::XML_PATH_CONNECTOR_SUBSCRIBERS_ADDRESS_BOOK_ID, 'Magento_Guests' => Config::XML_PATH_CONNECTOR_GUEST_ADDRESS_BOOK_ID];
     $error = false;
     $client = false;
     if ($this->helper->isEnabled()) {
         $client = $this->helper->getWebsiteApiClient(0, $username, $password);
     }
     if (!$client) {
         $error = true;
         $this->helper->log('createAddressBooks client is not enabled');
     } else {
         foreach ($addressBooks as $addressBook) {
             $addressBookName = $addressBook['name'];
             $visibility = $addressBook['visibility'];
             if (!empty($addressBookName)) {
                 $response = $client->postAddressBooks($addressBookName, $visibility);
                 if (isset($response->message)) {
                     $error = true;
                 } else {
                     //map the successfully created address book
                     $this->helper->saveConfigData($addressBookMap[$addressBookName], $response->id, 'default', 0);
                     $this->helper->log('successfully connected address book : ' . $addressBookName);
                 }
             }
         }
     }
     return $error == true ? false : true;
 }
 /**
  * Execute method.
  */
 public function execute()
 {
     $addressBookName = $this->getRequest()->getParam('name');
     $visibility = $this->getRequest()->getParam('visibility');
     $website = $this->getRequest()->getParam('website', 0);
     if ($this->helperData->isEnabled($website)) {
         $client = $this->helperData->getWebsiteApiClient($website);
         if (!empty($addressBookName)) {
             $response = $client->postAddressBooks($addressBookName, $visibility);
             if (isset($response->message)) {
                 $this->messageManager->addErrorMessage($response->message);
             } else {
                 $this->messageManager->addSuccessMessage('Address book : ' . $addressBookName . ' created.');
             }
         }
     }
 }
 /**
  * Execute method.
  */
 public function execute()
 {
     $datafield = $this->getRequest()->getParam('name');
     $type = $this->getRequest()->getParam('type');
     $default = $this->getRequest()->getParam('default');
     $visibility = $this->getRequest()->getParam('visibility');
     $website = $this->getRequest()->getParam('website', 0);
     $client = $this->dataHelper->getWebsiteApiClient($website);
     if (!empty($datafield)) {
         $response = $client->postDataFields($datafield, $type, $visibility, $default);
         if (isset($response->message)) {
             $this->messageManager->addErrorMessage($response->message);
         } else {
             $this->messageManager->addSuccessMessage('Datafield : ' . $datafield . ' created.');
         }
     }
 }
 /**
  * Validate apiuser on save.
  *
  * @param string $apiUsername
  * @param string $apiPassword
  *
  * @return bool|mixed
  */
 public function validate($apiUsername, $apiPassword)
 {
     if (!$this->helper->isEnabled()) {
         return false;
     }
     $client = $this->helper->getWebsiteApiClient();
     if ($apiUsername && $apiPassword) {
         $client->setApiUsername($apiUsername)->setApiPassword($apiPassword);
         $accountInfo = $client->getAccountInfo();
         if (isset($accountInfo->message)) {
             $this->helper->log('VALIDATION ERROR :  ' . $accountInfo->message);
             return false;
         }
         return $accountInfo;
     }
     return false;
 }
 /**
  * Enrol contacts for a program.
  *
  * @param $contacts
  * @param $websiteId
  *
  * @return mixed
  */
 public function sendContactsToAutomation($contacts, $websiteId)
 {
     $client = $this->helper->getWebsiteApiClient($websiteId);
     $data = ['Contacts' => $contacts, 'ProgramId' => $this->programId, 'AddressBooks' => []];
     //api add contact to automation enrolment
     $result = $client->postProgramsEnrolments($data);
     return $result;
 }
 /**
  * Execute method.
  */
 public function execute()
 {
     $result = ['errors' => false, 'message' => ''];
     $website = $this->getRequest()->getParam('website', 0);
     $client = false;
     if ($this->data->isEnabled()) {
         $client = $this->data->getWebsiteApiClient($website);
     }
     $redirectUrl = $this->getUrl('adminhtml/system_config/edit', ['section' => 'connector_developer_settings']);
     if (!$client) {
         $this->messageManager->addNoticeMessage('Please enable api first.');
     } else {
         // get all possible datatifileds
         $datafields = $this->datafield->getContactDatafields();
         foreach ($datafields as $key => $datafield) {
             $response = $client->postDataFields($datafield);
             //ignore existing datafields message
             if (isset($response->message) && $response->message != \Dotdigitalgroup\Email\Model\Apiconnector\Client::API_ERROR_DATAFIELD_EXISTS) {
                 $result['errors'] = true;
                 $result['message'] .= ' Datafield ' . $datafield['name'] . ' - ' . $response->message . '</br>';
             } else {
                 if ($website) {
                     $scope = 'websites';
                     $scopeId = $website;
                 } else {
                     $scope = 'default';
                     $scopeId = '0';
                 }
                 /*
                  * map the succesful created datafield
                  */
                 $this->data->saveConfigData('connector_data_mapping/customer_data/' . $key, strtoupper($datafield['name']), $scope, $scopeId);
                 $this->data->log('successfully connected : ' . $datafield['name']);
             }
         }
         if ($result['errors']) {
             $this->messageManager->addNoticeMessage($result['message']);
         } else {
             $this->messageManager->addSuccessMessage('All Datafields Created And Mapped.');
         }
     }
     $this->_redirect($redirectUrl);
 }
 /**
  * Validate api user.
  */
 public function execute()
 {
     $params = $this->getRequest()->getParams();
     $apiUsername = $params['api_username'];
     //@codingStandardsIgnoreStart
     $apiPassword = base64_decode($params['api_password']);
     //@codingStandardsIgnoreEnd
     //validate api, check against account info.
     if ($this->data->isEnabled()) {
         $client = $this->data->getWebsiteApiClient();
         $result = $client->validate($apiUsername, $apiPassword);
         $resonseData['success'] = true;
         //validation failed
         if (!$result) {
             $resonseData['success'] = false;
             $resonseData['message'] = 'Authorization has been denied for this request.';
         }
         $this->getResponse()->representJson($this->jsonHelper->jsonEncode($resonseData));
     }
 }
 /**
  * Get options.
  *
  * @return array
  */
 public function toOptionArray()
 {
     $fields = [];
     $fields[] = ['value' => '0', 'label' => __('-- Disabled --')];
     $websiteName = $this->request->getParam('website', false);
     $website = $websiteName ? $this->_storeManager->getWebsite($websiteName) : 0;
     //api client is enabled
     $apiEnabled = $this->helper->isEnabled($website);
     if ($apiEnabled) {
         $client = $this->helper->getWebsiteApiClient($website);
         $programs = $client->getPrograms();
         foreach ($programs as $one) {
             if (isset($one->id)) {
                 if ($one->status == 'Active') {
                     $fields[] = ['value' => $one->id, 'label' => __($one->name)];
                 }
             }
         }
     }
     return $fields;
 }
 /**
  * @param $website
  */
 public function _checkSendStatus($website)
 {
     $storeIds = $this->websiteFactory->create()->load($website->getId())->getStoreIds();
     $campaigns = $this->_getEmailCampaigns($storeIds, \Dotdigitalgroup\Email\Model\Campaign::PROCESSING, true);
     foreach ($campaigns as $campaign) {
         $client = $this->helper->getWebsiteApiClient($website);
         $response = $client->getSendStatus($campaign->getSendId());
         if (isset($response->message)) {
             //update  the failed to send email message
             $this->campaignResourceModel->setMessage([$campaign->getSendId()], $response->message);
         } elseif ($response->status == 'Sent') {
             $this->campaignResourceModel->setSent($campaign->getSendId());
         }
     }
 }
 /**
  * Get report info for contacts sync.
  *
  * @param int $id
  * @param int $websiteId
  *
  * @throws \Magento\Framework\Exception\LocalizedException
  */
 public function _processContactImportReportFaults($id, $websiteId)
 {
     $client = $this->helper->getWebsiteApiClient($websiteId);
     $response = $client->getContactImportReportFaults($id);
     if ($response) {
         $data = $this->_removeUtf8Bom($response);
         $fileName = $this->directoryList->getPath('var') . DIRECTORY_SEPARATOR . 'DmTempCsvFromApi.csv';
         $this->file->open();
         $check = $this->file->write($fileName, $data);
         if ($check) {
             $csvArray = $this->_csvToArray($fileName);
             $this->file->rm($fileName);
             $this->contact->unsubscribe($csvArray);
         } else {
             $this->helper->log('_processContactImportReportFaults: cannot save data to CSV file.');
         }
     }
 }
 /**
  * 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();
 }
 /**
  * @return \Magento\Framework\App\ResponseInterface
  */
 public function execute()
 {
     if (!$this->formKeyValidator->validate($this->getRequest()) or !$this->customerSession->getConnectorContactId()) {
         return $this->_redirect('customer/account/');
     }
     //params
     $additionalSubscriptions = $this->getRequest()->getParam('additional_subscriptions');
     $paramDataFields = $this->getRequest()->getParam('data_fields');
     $customerId = $this->customerSession->getConnectorContactId();
     $customerEmail = $this->customerSession->getCustomer()->getEmail();
     //client
     $website = $this->customerSession->getCustomer()->getStore()->getWebsite();
     //if enabled
     if ($this->helper->isEnabled($website)) {
         $client = $this->helper->getWebsiteApiClient($website);
         $client->setApiUsername($this->helper->getApiUsername($website))->setApiPassword($this->helper->getApiPassword($website));
         $contact = $client->getContactById($customerId);
         if (isset($contact->id)) {
             //contact address books
             $bookError = false;
             $addressBooks = $client->getContactAddressBooks($contact->id);
             $subscriberAddressBook = $this->helper->getSubscriberAddressBook($website);
             $processedAddressBooks = [];
             if (is_array($addressBooks)) {
                 foreach ($addressBooks as $addressBook) {
                     if ($subscriberAddressBook != $addressBook->id) {
                         $processedAddressBooks[$addressBook->id] = $addressBook->name;
                     }
                 }
             }
             if (isset($additionalSubscriptions)) {
                 foreach ($additionalSubscriptions as $additionalSubscription) {
                     if (!isset($processedAddressBooks[$additionalSubscription])) {
                         $bookResponse = $client->postAddressBookContacts($additionalSubscription, $contact);
                         if (isset($bookResponse->message)) {
                             $bookError = true;
                         }
                     }
                 }
                 foreach ($processedAddressBooks as $bookId => $name) {
                     if (!in_array($bookId, $additionalSubscriptions)) {
                         $bookResponse = $client->deleteAddressBookContact($bookId, $contact->id);
                         if (isset($bookResponse->message)) {
                             $bookError = true;
                         }
                     }
                 }
             } else {
                 foreach ($processedAddressBooks as $bookId => $name) {
                     $bookResponse = $client->deleteAddressBookContact($bookId, $contact->id);
                     if (isset($bookResponse->message)) {
                         $bookError = true;
                     }
                 }
             }
             //contact data fields
             $data = [];
             $dataFields = $client->getDataFields();
             $processedFields = [];
             foreach ($dataFields as $dataField) {
                 $processedFields[$dataField->name] = $dataField->type;
             }
             foreach ($paramDataFields as $key => $value) {
                 if (isset($processedFields[$key]) && $value) {
                     if ($processedFields[$key] == 'Numeric') {
                         $paramDataFields[$key] = (int) $value;
                     }
                     if ($processedFields[$key] == 'String') {
                         $paramDataFields[$key] = (string) $value;
                     }
                     if ($processedFields[$key] == 'Date') {
                         $paramDataFields[$key] = $this->localeDate->date($value)->format(\Zend_Date::ISO_8601);
                     }
                     $data[] = ['Key' => $key, 'Value' => $paramDataFields[$key]];
                 }
             }
             $contactResponse = $client->updateContactDatafieldsByEmail($customerEmail, $data);
             if (isset($contactResponse->message) && $bookError) {
                 $this->messageManager->addErrorMessage(__('An error occurred while saving your subscription preferences.'));
             } else {
                 $this->messageManager->addSuccessMessage(__('The subscription preferences has been saved.'));
             }
         } else {
             $this->messageManager->addErrorMessage(__('An error occurred while saving your subscription preferences.'));
         }
     }
     $this->_redirect('customer/account/');
 }