Exemple #1
0
 /**
  * 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();
 }
Exemple #2
0
 /**
  * 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;
 }
Exemple #3
0
 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);
 }
Exemple #4
0
 /**
  * Retrieve store
  * 
  * @return Mage_Core_Model_Store|NULL
  */
 public function getStore()
 {
     if ($this->_campaign) {
         return $this->_campaign->getStore();
     }
     return Mage::app()->getStore($this->getStoreId());
 }
Exemple #5
0
 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;
 }
Exemple #6
0
 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);
 }
Exemple #7
0
 /**
  * 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;
 }
Exemple #8
0
 /**
  * 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;
 }
Exemple #9
0
 /**
  * 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;
 }
Exemple #10
0
 /**
  * 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;
 }
Exemple #11
0
 /**
  * 
  * @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;
 }
Exemple #12
0
 /**
  * Add campaign filter
  */
 protected function _renderFiltersBefore()
 {
     if ($this->_campaign) {
         $this->addFilter('campaign_id', $this->_campaign->getId());
     }
 }