/**
  * @return \Magento\Backend\Model\View\Result\Redirect
  */
 public function execute()
 {
     $searchIds = $this->getRequest()->getParam('selected');
     if (!is_array($searchIds)) {
         $this->messageManager->addErrorMessage(__('Please select campaigns.'));
     } else {
         try {
             //@codingStandardsIgnoreStart
             foreach ($searchIds as $searchId) {
                 $model = $this->campaign->create()->setId($searchId);
                 $model->delete();
             }
             //@codingStandardsIgnoreEnd
             $this->messageManager->addSuccessMessage(__('Total of %1 record(s) were deleted.', count($searchIds)));
         } 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;
 }
 /**
  * Register review campaign.
  *
  * @param $collection
  * @param $websiteId
  */
 public function registerCampaign($collection, $websiteId)
 {
     //review campaign id
     $campaignId = $this->helper->getCampaign($websiteId);
     if ($campaignId) {
         foreach ($collection as $order) {
             $this->helper->log('-- Order Review: ' . $order->getIncrementId() . ' Campaign Id: ' . $campaignId);
             try {
                 $emailCampaign = $this->campaignFactory->create()->setEmail($order->getCustomerEmail())->setStoreId($order->getStoreId())->setCampaignId($campaignId)->setEventName('Order Review')->setCreatedAt($this->dateTime->formatDate(true))->setOrderIncrementId($order->getIncrementId())->setQuoteId($order->getQuoteId());
                 if ($order->getCustomerId()) {
                     $emailCampaign->setCustomerId($order->getCustomerId());
                 }
                 //@codingStandardsIgnoreStart
                 $emailCampaign->getResource()->save($emailCampaign);
                 //@codingStandardsIgnoreEnd
             } catch (\Exception $e) {
                 $this->helper->debug((string) $e, []);
             }
         }
     }
 }
 /**
  * Proccess abandoned carts.
  *
  * @param string $mode
  */
 public function proccessAbandonedCarts($mode = 'all')
 {
     /*
      * Save lost baskets to be send in Send table.
      */
     $stores = $this->_helper->getStores();
     foreach ($stores as $store) {
         $storeId = $store->getId();
         if ($mode == 'all' || $mode == 'customers') {
             /*
              * Customers campaigns
              */
             foreach ($this->lostBasketCustomers as $num) {
                 //customer enabled
                 if ($this->_isLostBasketCustomerEnabled($num, $storeId)) {
                     //number of the campaign use minutes
                     if ($num == 1) {
                         $minutes = $this->_getLostBasketCustomerInterval($num, $storeId);
                         $interval = new \DateInterval('PT' . $minutes . 'M');
                     } else {
                         $hours = (int) $this->_getLostBasketCustomerInterval($num, $storeId);
                         $interval = new \DateInterval('PT' . $hours . 'H');
                     }
                     $fromTime = new \DateTime('now', new \DateTimeZone('UTC'));
                     $fromTime->sub($interval);
                     $toTime = clone $fromTime;
                     $fromTime->sub(new \DateInterval('PT5M'));
                     //format time
                     $fromDate = $fromTime->format('Y-m-d H:i:s');
                     $toDate = $toTime->format('Y-m-d H:i:s');
                     //active quotes
                     $quoteCollection = $this->_getStoreQuotes($fromDate, $toDate, $guest = false, $storeId);
                     //found abandoned carts
                     if ($quoteCollection->getSize()) {
                         $this->_helper->log('Customer cart : ' . $num . ', from : ' . $fromDate . ' ,to ' . $toDate);
                     }
                     //campaign id for customers
                     $campaignId = $this->_getLostBasketCustomerCampaignId($num, $storeId);
                     foreach ($quoteCollection as $quote) {
                         $email = $quote->getCustomerEmail();
                         $websiteId = $store->getWebsiteId();
                         $quoteId = $quote->getId();
                         //api - set the last quote id for customer
                         $this->_helper->updateLastQuoteId($quoteId, $email, $websiteId);
                         $items = $quote->getAllItems();
                         $mostExpensiveItem = false;
                         foreach ($items as $item) {
                             if ($mostExpensiveItem == false) {
                                 $mostExpensiveItem = $item;
                             } elseif ($item->getPrice() > $mostExpensiveItem->getPrice()) {
                                 $mostExpensiveItem = $item;
                             }
                         }
                         //api-send the most expensive product for abandoned cart
                         if ($mostExpensiveItem) {
                             $this->_helper->updateAbandonedProductName($mostExpensiveItem->getName(), $email, $websiteId);
                         }
                         //send email only if the interval limit passed, no emails during this interval
                         $intervalLimit = $this->_checkCustomerCartLimit($email, $storeId);
                         //no campign found for interval pass
                         if (!$intervalLimit) {
                             //save lost basket for sending
                             //@codingStandardsIgnoreStart
                             $this->_campaignFactory->create()->setEmail($email)->setCustomerId($quote->getCustomerId())->setEventName('Lost Basket')->setQuoteId($quoteId)->setMessage('Abandoned Cart ' . $num)->setCampaignId($campaignId)->setStoreId($storeId)->setWebsiteId($websiteId)->setIsSent(null)->save();
                             //@codingStandardsIgnoreEnd
                         }
                     }
                 }
             }
         }
         if ($mode == 'all' || $mode == 'guests') {
             /*
              * Guests campaigns
              */
             foreach ($this->lostBasketGuests as $num) {
                 if ($this->_isLostBasketGuestEnabled($num, $storeId)) {
                     //for the  first cart which use the minutes
                     if ($num == 1) {
                         $minutes = $this->_getLostBasketGuestIterval($num, $storeId);
                         $interval = new \DateInterval('PT' . $minutes . 'M');
                     } else {
                         $hours = $this->_getLostBasketGuestIterval($num, $storeId);
                         $interval = new \DateInterval('PT' . $hours . 'H');
                     }
                     $fromTime = new \DateTime('now', new \DateTimeZone('UTC'));
                     $fromTime->sub($interval);
                     $toTime = clone $fromTime;
                     $fromTime->sub(new \DateInterval('PT5M'));
                     //format time
                     $fromDate = $fromTime->format('Y-m-d H:i:s');
                     $toDate = $toTime->format('Y-m-d H:i:s');
                     //active guest quotes
                     $quoteCollection = $this->_getStoreQuotes($fromDate, $toDate, $guest = true, $storeId);
                     //log the time for carts found
                     if ($quoteCollection->getSize()) {
                         $this->_helper->log('Guest cart : ' . $num . ', from : ' . $fromDate . ' ,to : ' . $toDate);
                     }
                     $guestCampaignId = $this->_getLostBasketGuestCampaignId($num, $storeId);
                     foreach ($quoteCollection as $quote) {
                         $email = $quote->getCustomerEmail();
                         $websiteId = $store->getWebsiteId();
                         $quoteId = $quote->getId();
                         // upate last quote id for the contact
                         $this->_helper->updateLastQuoteId($quoteId, $email, $websiteId);
                         // update abandoned product name for contact
                         $items = $quote->getAllItems();
                         $mostExpensiveItem = false;
                         foreach ($items as $item) {
                             if ($mostExpensiveItem == false) {
                                 $mostExpensiveItem = $item;
                             } elseif ($item->getPrice() > $mostExpensiveItem->getPrice()) {
                                 $mostExpensiveItem = $item;
                             }
                         }
                         //api- set the most expensive product to datafield
                         if ($mostExpensiveItem) {
                             $this->_helper->updateAbandonedProductName($mostExpensiveItem->getName(), $email, $websiteId);
                         }
                         //send email only if the interval limit passed, no emails during this interval
                         $campignFound = $this->_checkCustomerCartLimit($email, $storeId);
                         //no campign found for interval pass
                         if (!$campignFound) {
                             //save lost basket for sending
                             //@codingStandardsIgnoreStart
                             $this->_campaignFactory->create()->setEmail($email)->setEventName('Lost Basket')->setQuoteId($quoteId)->setCheckoutMethod('Guest')->setMessage('Guest Abandoned Cart ' . $num)->setCampaignId($guestCampaignId)->setStoreId($storeId)->setWebsiteId($websiteId)->setIsSent(null)->save();
                             //@codingStandardsIgnoreEnd
                         }
                     }
                 }
             }
         }
     }
 }