/** * Find and add new recipients for the specified campaign * * @param Mzax_Emarketing_Model_Campaign $camapgin * @return integer The number of recipients found */ public function findRecipients(Mzax_Emarketing_Model_Campaign $camapgin) { if (!$camapgin->getId() || !$camapgin->getRecipientProvider() || !$camapgin->getMedium()) { return 0; } $adapter = $this->_getWriteAdapter(); $select = $adapter->select()->from(array('current_recipients' => $this->getTable('recipient')), 'object_id'); $select->where('`current_recipients`.`campaign_id` = ?', $camapgin->getId()); $select->where('`current_recipients`.`is_mock` = 0'); $time = $camapgin->getCurrentTime(); if (!$time instanceof Zend_Db_Expr) { $time = new Zend_Db_Expr('NOW()'); } if ($interval = (int) $camapgin->getMinResendInterval()) { $select->where("`current_recipients`.`created_at` > DATE_SUB({$time}, INTERVAL ? DAY)", $camapgin->getId()); } /* skip all already queued recipients */ $filterSelect = $camapgin->getRecipientProvider()->getSelect(); $filterSelect->exists($select, '`current_recipients`.`object_id` = {id}', false); $filterSelect->columns(array('created_at' => $time, 'campaign_id' => new Zend_Db_Expr($camapgin->getId()))); $adapter->beginTransaction(); try { $insertSql = $adapter->insertFromSelect($filterSelect, $this->getTable('recipient'), array('object_id', 'created_at', 'campaign_id')); $stmt = $adapter->query($insertSql); $adapter->update($this->getMainTable(), array('last_check' => new Zend_Db_Expr('NOW()')), $adapter->quoteInto('campaign_id = ?', $camapgin->getId())); $adapter->commit(); } catch (Exception $e) { $adapter->rollBack(); throw $e; } return $stmt->rowCount(); }
/** * Send message to all pending recipients * * @param Mzax_Emarketing_Model_Campaign $campaign * @param Varien_Object $options * @throws Exception * @return number */ public function sendRecipients(Mzax_Emarketing_Model_Campaign $campaign, Varien_Object $options) { $recipients = $campaign->getPendingRecipients(); $recipients->setPageSize($options->getMaximum()); $start = time(); $prepared = 0; $timeout = (int) $options->getTimeout(); /* @var $recipient Mzax_Emarketing_Model_Recipient */ foreach ($recipients as $recipient) { try { $this->sendRecipient($recipient); $prepared++; } catch (Exception $e) { $recipient->logException($e); if ($options->getBreakOnError()) { throw $e; } Mage::logException($e); } $recipient->isPrepared(true); $recipient->save(); if ($timeout && time() - $start > $timeout) { break; } } return $prepared; }
public function renderStats(Mzax_Emarketing_Model_Campaign $campagin) { $html = array(); $sendings = $campagin->getSendingStats(); $interactions = $campagin->getInteractionStats(); $conversions = $campagin->getConversionStats(); $fails = $campagin->getFailStats(); $html[] = sprintf('<div class="mzax-grid-stats" title="%s">', $this->__('%s Sendings', $sendings)); $html[] = sprintf('<div class="mzax-grid-stat interactions" style="width:%01.3f%%" title="%s"></div>', $interactions / $sendings * 100, $this->__('%s Interactions', $interactions)); $html[] = sprintf('<div class="mzax-grid-stat conversions" style="width:%01.3f%%" title="%s"></div>', $conversions / $sendings * 100, $this->__('%s Conversions', $conversions)); $html[] = sprintf('<div class="mzax-grid-stat fails" style="width:%01.3f%%" title="%s"></div>', $fails / $sendings * 100, $this->__('%s Bounces and Optouts', $fails)); $html[] = '</div>'; return implode("\n", $html); }
/** * Retrieve store * * @return Mage_Core_Model_Store|NULL */ public function getStore() { if ($this->_campaign) { return $this->_campaign->getStore(); } return Mage::app()->getStore($this->getStoreId()); }
public function renderFilters(Mzax_Emarketing_Model_Campaign $campagin) { $html = array(); $columnFilter = $this->getColumn()->getFilter(); if ($columnFilter) { $columnFilter = $columnFilter->getValue(); } /* @var $filter Mzax_Emarketing_Model_Object_Filter_Abstract */ foreach ($campagin->getFilters() as $filter) { $style = ''; if ($filter->getType() == $columnFilter) { $style = 'background:#FFFFDD; color:#222'; } $html[] = "<li style=\"{$style}\">{$filter->getQueryString()}</li>"; } $html = implode("\n", $html); $html = "<ul style=\"list-style: inside disc; font-size: 0.8em; color: #666;\">{$html}</ul>"; return $html; }
protected function _getLastRecordTime() { $adapter = $this->_getWriteAdapter(); $select = $this->_select($this->_reportTable, null, 'MAX(`goal_time`)'); if ($this->_tracker) { $select->where('`tracker_id` = ?', $this->_tracker->getId()); } if ($this->_campaign) { $select->where('`campaign_id` = ?', $this->_campaign->getId()); } return $adapter->fetchOne($select); }
/** * Name Frame Callback * * @param string $value * @param Mzax_Emarketing_Model_Campaign $row * @param Mage_Adminhtml_Block_Widget_Grid_Column $column * @param boolean $export * @return string */ public function renderName($value, $row, $column, $export) { if (!$export) { if ($row->isRunning()) { $value .= ' <span class="mzax-grid-running"></span>'; } foreach ($row->getTags() as $tag) { $t = strtolower($tag); if (!isset($this->_tagColorMap[$t])) { $this->_tagColorMap[$t] = $this->_tagColors[count($this->_tagColorMap) % count($this->_tagColors)]; } $value .= ' <span class="mzax-grid-tag" style="background-color: #' . $this->_tagColorMap[$t] . ';">' . $this->escapeHtml($tag) . '</span>'; } } return $value; }
/** * Retreive current campaign * * We must always return a campaign object! * getQuery() needs to work with no data set * * @return Mzax_Emarketing_Model_Campaign */ public function getCampaign() { if (!$this->_campaign) { $id = $this->getDataSetDefault('campaign'); if ($id === 'current') { $this->_campaign = $this->getParam('campaign'); } if (!$this->_campaign instanceof Mzax_Emarketing_Model_Campaign) { $this->_campaign = Mage::getModel('mzax_emarketing/campaign'); if ($id > 0) { $this->_campaign->load($id); } } } return $this->_campaign; }
/** * Set campaign * * @param Mzax_Emarketing_Model_Campaign $campaign * @return Mzax_Emarketing_Model_Recipient */ public function setCampaign(Mzax_Emarketing_Model_Campaign $campaign) { $this->_campaign = $campaign; $this->setCampaignId($campaign->getId()); return $this; }
/** * Get goal <-> recipient binder * * @param Mzax_Emarketing_Model_Campaign $campaign * @param boolean $direct * @param integer|false $variation * @return Mzax_Emarketing_Model_Resource_Recipient_Goal_Binder */ public function getRecipientBinder($campaign, $direct = false, $variation = false) { $select = $this->_select('sales/order', 'order'); $select->addBinding('order_id', 'entity_id'); $select->addBinding('order_time', 'created_at'); $select->addBinding('customer_id', 'customer_id'); $select->addBinding('email', 'customer_email'); $select->addBinding('quote_id', 'quote_id'); $select->addBinding('campaign', new Zend_Db_Expr($campaign->getId())); $select->where('{campaign_id} = ?', $campaign->getId()); $select->where('{order_time} > ?', $campaign->getCreatedAt()); $select->where('{order_time} > {sent_at}'); $select->where('{is_mock} = 0'); $select->setColumn('order_id'); $select->setColumn('order_time'); $select->setColumn('recipient_id'); if ($variation !== false) { $select->where('{variation_id} = ?', $variation); } /* @var $binder Mzax_Emarketing_Model_Resource_Recipient_Goal_Binder */ $binder = Mage::getResourceModel('mzax_emarketing/recipient_goal_binder'); $binder->setSelect($select); // create a direct binding using the goal table $binder->createBinding()->joinTable(array('object_type' => Mzax_Emarketing_Model_Goal::TYPE_ORDER, 'object_id' => '{order_id}'), 'goal')->joinTable(array('recipient_id' => '{recipient_id}'), 'recipient')->addBinding('recipient_id', 'goal.recipient_id')->addBinding('sent_at', 'recipient.sent_at')->addBinding('variation_id', 'recipient.variation_id')->addBinding('campaign_id', 'recipient.campaign_id')->addBinding('is_mock', 'recipient.is_mock'); if (!$direct) { // see if we can get any indirect bindings via email etc $campaign->bindRecipients($binder); } Mage::dispatchEvent('mzax_emarketing_order_recipient_binder', array('binder' => $binder, 'direct' => $direct, 'campaign' => $campaign)); return $binder; }
/** * * @param Mzax_Emarketing_Model_Campaign $campaign * @return Mzax_Emarketing_Model_Recipient_Provider_Abstract */ public function setCampaign(Mzax_Emarketing_Model_Campaign $campaign) { $this->_campaign = $campaign; $this->load($campaign->getFilterData()); return $this; }
/** * Add campaign filter */ protected function _renderFiltersBefore() { if ($this->_campaign) { $this->addFilter('campaign_id', $this->_campaign->getId()); } }