diff --git a/README.md b/README.md index 588115f77..540d28651 100755 --- a/README.md +++ b/README.md @@ -34,6 +34,11 @@ You are welcome to contribute to Engagement Cloud for Magento! You can either: - Fix a bug: please fork this repo and submit the Pull Request to our [Develop branch](https://github.com/dotmailer/dotmailer-magento-extension/tree/develop) Request a feature on our [roadmap](https://roadmap.dotdigital.com) +# V6.4.14 + +##### Bug Fixes +- We've fixed a problem with scheduled campaign sends, arising from campaigns stuck in a "Processing" state on Engagement Cloud. In such cases, we will expire campaigns that have been "Processing" for longer than two hours. + # V6.4.13 ##### Bug Fixes diff --git a/code/Dotdigitalgroup/Email/Model/Campaign.php b/code/Dotdigitalgroup/Email/Model/Campaign.php index 6c82bd7ae..9d55b15f0 100755 --- a/code/Dotdigitalgroup/Email/Model/Campaign.php +++ b/code/Dotdigitalgroup/Email/Model/Campaign.php @@ -97,6 +97,7 @@ public function loadByQuoteId($quoteId, $storeId) */ protected function _checkSendStatus($website) { + $this->expireExpiredCampaigns($website->getStoreIds()); $campaigns = $this->_getEmailCampaigns($website->getStoreIds(), self::PROCESSING, true); foreach ($campaigns as $campaign) { $client = Mage::helper('ddg')->getWebsiteApiClient($website); @@ -113,6 +114,19 @@ protected function _checkSendStatus($website) } } + /** + * @param array $storeIds + */ + private function expireExpiredCampaigns($storeIds) + { + $expiredCampaigns = $this->getExpiredEmailCampaignsByStoreIds($storeIds); + $ids = $expiredCampaigns->getColumnValues('id'); + if (! empty($ids)) { + $this->getResource()->expireCampaigns($ids); + } + } + + /** * Sending the campaigns. * @@ -268,4 +282,21 @@ protected function _getEmailCampaigns($storeIds, $sendStatus = 0, $sendIdCheck = //@codingStandardsIgnoreEnd return $emailCollection; } + + /** + * @param array $storeIds + * @return Dotdigitalgroup_Email_Model_Resource_Campaign_Collection + */ + private function getExpiredEmailCampaignsByStoreIds($storeIds) + { + $time = Zend_Date::now(Mage::app()->getLocale()->getLocale())->subHour(2); + $campaignCollection = $this->getCollection() + ->addFieldToFilter('campaign_id', array('notnull' => true)) + ->addFieldToFilter('send_status', Dotdigitalgroup_Email_Model_Campaign::PROCESSING) + ->addFieldToFilter('store_id', array('in' => $storeIds)) + ->addFieldToFilter('send_id', array('notnull' => true)) + ->addFieldToFilter('updated_at', array('lt' => $time->toString('yyyy-MM-dd HH:mm'))); + + return $campaignCollection; + } } \ No newline at end of file diff --git a/code/Dotdigitalgroup/Email/Model/Resource/Campaign.php b/code/Dotdigitalgroup/Email/Model/Resource/Campaign.php index 6545aaa68..98a0c0d6e 100755 --- a/code/Dotdigitalgroup/Email/Model/Resource/Campaign.php +++ b/code/Dotdigitalgroup/Email/Model/Resource/Campaign.php @@ -182,4 +182,23 @@ public function setProcessing($ids, $sendId) Mage::logException($e); } } + + /** + * @param array $ids + */ + public function expireCampaigns($ids) + { + $now = Mage::getSingleton('core/date')->gmtDate(); + $bind = array( + 'send_status' => Dotdigitalgroup_Email_Model_Campaign::SENT, + 'message' => 'Check sending status in Engagement Cloud', + 'updated_at' => $now + ); + $this->_getWriteAdapter() + ->update( + $this->getMainTable(), + $bind, + array("id in (?)" => $ids) + ); + } } \ No newline at end of file diff --git a/code/Dotdigitalgroup/Email/etc/config.xml b/code/Dotdigitalgroup/Email/etc/config.xml index 8b9ef48a0..26720188f 100755 --- a/code/Dotdigitalgroup/Email/etc/config.xml +++ b/code/Dotdigitalgroup/Email/etc/config.xml @@ -2,7 +2,7 @@ - 6.4.13 + 6.4.14