Skip to content

Commit

Permalink
Separated functions for special prices builMailchimpDataJoinForSpecia…
Browse files Browse the repository at this point in the history
…lPrices, executeMailchimpDataJoin,builMailchimpDataJoinForSpecialPrices #964
  • Loading branch information
brian-ebizmarts committed Jun 3, 2019
1 parent df69f36 commit 5a4083c
Show file tree
Hide file tree
Showing 2 changed files with 164 additions and 114 deletions.
145 changes: 114 additions & 31 deletions app/code/community/Ebizmarts/MailChimp/Model/Api/Products.php
Original file line number Diff line number Diff line change
Expand Up @@ -539,24 +539,8 @@ public function joinQtyAndBackorders($collection)
);
}

/**
* This function will perform the join of the collection with the table mailchimp_ecommerce_sync_data when the program
* creates the batch json to send the product data to mailchimp or to mark the products with an active special price
*
* @param $collection
* @param $mailchimpStoreId
*/
public function joinMailchimpSyncData($collection, $mailchimpStoreId, $isForSpecialPrice = false)
{
$whereCreateBatchJson = "m4m.mailchimp_sync_delta IS null OR m4m.mailchimp_sync_modified = 1";
$this->joinMailchimpSyncDataWithoutWhere($collection, $mailchimpStoreId, $isForSpecialPrice);
if ($isForSpecialPrice) {
$whereMarkSpecialPrice = new Zend_Db_Expr("((IF(at_special_from_date.value_id > 0, at_special_from_date.value, at_special_from_date_default.value) <= '" . date('Y-m-d', time()) . " 23:59:59' AND m4m.mailchimp_sync_delta < IF(at_special_from_date.value_id > 0, at_special_from_date.value, at_special_from_date_default.value)) OR (IF(at_special_to_date.value_id > 0, at_special_to_date.value, at_special_to_date_default.value) < '" . date('Y-m-d', time()) . " 00:00:00' AND m4m.mailchimp_sync_delta < IF(at_special_to_date.value_id > 0, at_special_to_date.value, at_special_to_date_default.value)) AND mailchimp_sync_delta IS NOT NULL)");
$collection->getSelect()->where($whereMarkSpecialPrice);
} else {
$collection->getSelect()->where($whereCreateBatchJson);
}
}



/**
* @param $product
Expand Down Expand Up @@ -655,20 +639,63 @@ protected function getMailChimpHelper()
}

/**
* This function will perform the join of the collection with the table mailchimp_ecommerce_sync_data when the program
* creates the batch json to send the product data to mailchimp
*
* @param $collection
* @param $mailchimpStoreId
* @param bool $isForSpecialPrice
*/
public function joinMailchimpSyncDataWithoutWhere($collection, $mailchimpStoreId, $isForSpecialPrice = false)
public function joinMailchimpSyncData($collection, $mailchimpStoreId)
{
$joinCondition = $this->buildMailchimpDataJoin();
$this->executeMailchimpDataJoin($collection, $mailchimpStoreId, $joinCondition);
$this->buildMailchimpDataWhere($collection);
}

/**
* @return string
*/
protected function buildMailchimpDataJoin()
{
$joinCondition = "m4m.related_id = e.entity_id AND m4m.type = '%s' AND m4m.mailchimp_store_id = '%s'";
if ($isForSpecialPrice) {
$joinCondition = $joinCondition . "AND m4m.mailchimp_sync_modified = 0";
}
return $joinCondition;
}

/**
* This function will perform the join of the collection with the table mailchimp_ecommerce_sync_data
* to mark products as modified when special price starts/ends
*
* @param $collection
* @param $mailchimpStoreId
*/
public function joinMailchimpSyncDataForSpecialPrices($collection, $mailchimpStoreId)
{
$joinCondition = $this->builMailchimpDataJoinForSpecialPrices();
$this->executeMailchimpDataJoin($collection, $mailchimpStoreId, $joinCondition);
$this->builMailchimpDataJoinForSpecialPrices($collection);
}

/**
* @return string
*/
protected function builMailchimpDataJoinForSpecialPrices()
{
$joinCondition = $this->buildMailchimpDataJoin(). " AND m4m.mailchimp_sync_modified = 0";
return $joinCondition;
}

/**
* @param $collection
* @param $mailchimpStoreId
* @param $joinCondition
*/
protected function executeMailchimpDataJoin($collection, $mailchimpStoreId, $joinCondition)
{
$mailchimpTableName = $this->getSyncDataTableName();
$collection->getSelect()->joinLeft(
array("m4m" => $mailchimpTableName),
sprintf($joinCondition, Ebizmarts_MailChimp_Model_Config::IS_PRODUCT, $mailchimpStoreId), array(
sprintf($joinCondition, Ebizmarts_MailChimp_Model_Config::IS_PRODUCT, $mailchimpStoreId),
array(
"m4m.related_id",
"m4m.type",
"m4m.mailchimp_store_id",
Expand All @@ -678,6 +705,20 @@ public function joinMailchimpSyncDataWithoutWhere($collection, $mailchimpStoreId
);
}

/**
* @param $collection
*/
protected function buildMailchimpDataWhere($collection)
{
$whereCreateBatchJson = "m4m.mailchimp_sync_delta IS null OR m4m.mailchimp_sync_modified = 1";
$collection->getSelect()->where($whereCreateBatchJson);
}

/**
* @param $childId
* @param $magentoStoreId
* @return string|null
*/
public function getNotVisibleProductUrl($childId, $magentoStoreId)
{
$helper = $this->getMailChimpHelper();
Expand Down Expand Up @@ -968,6 +1009,14 @@ protected function getMailchimpFinalPrice($product)
return $price;
}

/**
* @return Mage_Core_Model_Resource
*/
public function getCoreResource()
{
return Mage::getSingleton('core/resource');
}

/**
* Sync to mailchimp the special price of the products
*
Expand All @@ -978,29 +1027,63 @@ public function _markSpecialPrices($mailchimpStoreId, $magentoStoreId)
{
/**
* get the products with current special price that are not synced and mark it as modified
* get the products that was synced when it have special price and have no more special price
*/
$resource = $this->getCoreResource();
$connection = $resource->getConnection('core_write');

$collection = $this->getProductResourceCollection();
$collection->addStoreFilter($magentoStoreId);

$this->joinMailchimpSyncDataForSpecialPrices($collection, $mailchimpStoreId);

$collection->addAttributeToFilter(
'special_price',
array('notnull' => true),
array('gt' => 0),
'left'
)->addAttributeToFilter(
'special_from_date',
array('notnull' => true),
'special_from_date' ,
array('lteq' => date('Y-m-d', time())." 23:59:59"),
'left'
)->addAttributeToSelect(
'special_to_date',
)->addAttributeToFilter(
'special_from_date' ,
array('gt' => new Zend_Db_Expr('m4m.mailchimp_sync_delta')),
'left'
);

$this->joinMailchimpSyncData($collection, $mailchimpStoreId, true);
$whereCondition = $connection->quoteInto('m4m.mailchimp_sync_delta IS NOT NULL AND m4m.mailchimp_sync_delta < ?', date('Y-m-d', time())." 00:00:00");
$collection->getSelect()->where($whereCondition);

foreach ($collection as $item) {
$this->update($item->getEntityId(), $mailchimpStoreId);
}

/**
* get the products that was synced when it have special price and have no more special price
*/
$collection2 = $this->getProductResourceCollection();
$collection2->addStoreFilter($magentoStoreId);
$this->joinMailchimpSyncDataForSpecialPrices($collection2, $mailchimpStoreId);

$collection2->addAttributeToFilter(
'special_price',
array('gt' => 0),
'left'
)->addAttributeToFilter(
'special_to_date' ,
array('lt' => date('Y-m-d', time())." 00:00:00"),
'left'
)->addAttributeToFilter(
'special_to_date' ,
array('gt' => new Zend_Db_Expr('m4m.mailchimp_sync_delta')),
'left'
);

$collection2->getSelect()->where($whereCondition );
foreach ($collection2 as $item) {
$this->update($item->getEntityId(), $mailchimpStoreId);
}


}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -628,23 +628,16 @@ public function testMarkSpecialPrices()
$mailchimpStoreId = '3ade9d9e52e35e9b18d95bdd4d9e9a44';
$magentoStoreId = 1;
$entityId = 145;
$stringSpecialPrice = 'special_price';
$arraySpecialPrice = array('notnull' => true);
$joinTypeSpecialPrice = 'left';
$stringSpecialFromDate = 'special_from_date';
$arraySpecialFromDate = array('notnull' => true);
$joinTypeSpecialFromDate = 'left';
$stringSpecialToDate = 'special_to_date';
$joinTypeSpecialToDate = 'left';
$time = time();

$productsApiMock = $this->productsApiMock
->setMethods(array('getProductResourceCollection', 'update', 'joinMailchimpSyncData'))
->setMethods(array('getProductResourceCollection', 'getSelect', 'update', 'joinMailchimpSyncDataForSpecialPrices'))
->getMock();

$collectiontMock = $this
->getMockBuilder(Mage_Catalog_Model_Resource_Product_Collection::class)
->disableOriginalConstructor()
->setMethods(array('addStoreFilter', 'addAttributeToFilter', 'getIterator', 'addAttributeToSelect'))
->setMethods(array('addStoreFilter', 'addAttributeToFilter', 'getIterator','getSelect'))
->getMock();

$itemMock = $this
Expand All @@ -653,116 +646,90 @@ public function testMarkSpecialPrices()
->setMethods(array('getEntityId'))
->getMock();

$productsApiMock->expects($this->once())
$productsApiMock->expects($this->exactly(2))
->method('getProductResourceCollection')
->willReturn($collectiontMock);
$productsApiMock->expects($this->once())
$productsApiMock->expects($this->exactly(2))
->method('update')
->with($entityId, $mailchimpStoreId);
$productsApiMock->expects($this->once())
->method('joinMailchimpSyncData')
->with($collectiontMock, $mailchimpStoreId, true);
$productsApiMock->expects($this->exactly(2))
->method('joinMailchimpSyncDataForSpecialPrices')
->with($collectiontMock, $mailchimpStoreId);

$varienSelectMock = $this
->getMockBuilder(Varien_Db_Select::class)
->disableOriginalConstructor()
->setMethods(array('where'))
->getMock();

$collectiontMock->expects($this->exactly(2))
->method('getSelect')
->willReturn($varienSelectMock);

$collectiontMock->expects($this->once())
$collectiontMock->expects($this->exactly(2))
->method('addStoreFilter')
->with($magentoStoreId)
->willReturnSelf();
$collectiontMock->expects($this->exactly(2))

$collectiontMock->expects($this->exactly(6))
->method('addAttributeToFilter')
->withConsecutive(
array($stringSpecialPrice, $arraySpecialPrice, $joinTypeSpecialPrice),
array($stringSpecialFromDate, $arraySpecialFromDate, $joinTypeSpecialFromDate)
array('special_price', array('gt' => 0) , 'left'),
array('special_from_date', array('lteq' => date('Y-m-d', $time)." 23:59:59"),'left'),
array('special_from_date', array('gt' => new Zend_Db_Expr('m4m.mailchimp_sync_delta')) , 'left'),
array('special_price', array('gt' => 0), 'left'),
array('special_to_date', array('lt' => date('Y-m-d', $time)." 00:00:00"), 'left'),
array('special_to_date', array('gt' => new Zend_Db_Expr('m4m.mailchimp_sync_delta')), 'left')
)->willReturnOnConsecutiveCalls(
$collectiontMock,
$collectiontMock,
$collectiontMock,
$collectiontMock,
$collectiontMock,
$collectiontMock
);
$collectiontMock->expects($this->once())
->method('addAttributeToSelect')
->with($stringSpecialToDate, $joinTypeSpecialToDate)
->willReturnSelf();
$collectiontMock->expects($this->once())

$collectiontMock->expects($this->exactly(2))
->method('getIterator')
->willReturn(new ArrayIterator(array($itemMock)));

$itemMock->expects($this->once())
$itemMock->expects($this->exactly(2))
->method('getEntityId')
->willReturn($entityId);

$productsApiMock->_markSpecialPrices($mailchimpStoreId, $magentoStoreId);
}

public function testJoinMailchimpSyncDataMarkSpecialPrice()
{
$mailchimpStoreId = '';
$isForSpecialPrice = true;
$whereMarkSpecialPrice = "((IF(at_special_from_date.value_id > 0, at_special_from_date.value, at_special_from_date_default.value) <= '" . date('Y-m-d', time()) . " 23:59:59' AND m4m.mailchimp_sync_delta < IF(at_special_from_date.value_id > 0, at_special_from_date.value, at_special_from_date_default.value)) OR (IF(at_special_to_date.value_id > 0, at_special_to_date.value, at_special_to_date_default.value) < '" . date('Y-m-d', time()) . " 00:00:00' AND m4m.mailchimp_sync_delta < IF(at_special_to_date.value_id > 0, at_special_to_date.value, at_special_to_date_default.value)) AND mailchimp_sync_delta IS NOT NULL)";
public function testJoinMailchimpSyncData(){
$mailchimpStoreId = '3ade9d9e52e35e9b18d95bdd4d9e9a44';
$joinCondition = "m4m.related_id = e.entity_id AND m4m.type = '%s' AND m4m.mailchimp_store_id = '%s'";

$productsApiMock = $this->productsApiMock
->setMethods(array('joinMailchimpSyncDataWithoutWhere'))
->getMock();

$collectiontMock = $this
->getMockBuilder(Mage_Catalog_Model_Resource_Product_Collection::class)
->disableOriginalConstructor(array('getSelect'))
->setMethods(array("buildMailchimpDataJoin","executeMailchimpDataJoin","buildMailchimpDataWhere"))
->getMock();

$varienSelectMock = $this
->getMockBuilder(Varien_Db_Select::class)
$collectionMock = $this->getMockBuilder(Mage_Catalog_Model_Resource_Product_Collection::class)
->disableOriginalConstructor()
->setMethods(array('where'))
->setMethods(array("getSelect"))
->getMock();

$productsApiMock->expects($this->once())
->method('joinMailchimpSyncDataWithoutWhere')
->with($collectiontMock, $mailchimpStoreId, $isForSpecialPrice);

$collectiontMock->expects($this->once())
->method('getSelect')
->willReturn($varienSelectMock);

$varienSelectMock->expects($this->once())
->method('where')
->with($whereMarkSpecialPrice);

$productsApiMock->joinMailchimpSyncData($collectiontMock, $mailchimpStoreId, $isForSpecialPrice);
}

public function testJoinMailchimpSyncDataCreateBatchJson()
{
$mailchimpStoreId = '';
$isForSpecialPrice = false;
$whereCreateBatchJson = "m4m.mailchimp_sync_delta IS null OR m4m.mailchimp_sync_modified = 1";

$productsApiMock = $this->productsApiMock
->setMethods(array('joinMailchimpSyncDataWithoutWhere'))
->getMock();

$collectiontMock = $this
->getMockBuilder(Mage_Catalog_Model_Resource_Product_Collection::class)
->disableOriginalConstructor(array('getSelect'))
->getMock();

$varienSelectMock = $this
->getMockBuilder(Varien_Db_Select::class)
->disableOriginalConstructor()
->setMethods(array('where'))
->getMock();
->method('buildMailchimpDataJoin')
->willReturn($joinCondition);

$productsApiMock->expects($this->once())
->method('joinMailchimpSyncDataWithoutWhere')
->with($collectiontMock, $mailchimpStoreId, $isForSpecialPrice);

$collectiontMock->expects($this->once())
->method('getSelect')
->willReturn($varienSelectMock);
->method('executeMailchimpDataJoin')
->with($collectionMock, $mailchimpStoreId, $joinCondition)
->willReturnSelf();

$varienSelectMock->expects($this->once())
->method('where')
->with($whereCreateBatchJson);
$productsApiMock->expects($this->once())
->method('buildMailchimpDataWhere')
->with($collectionMock);

$productsApiMock->joinMailchimpSyncData($collectiontMock, $mailchimpStoreId, $isForSpecialPrice);
$productsApiMock->joinMailchimpSyncData($collectionMock, $mailchimpStoreId);
}


public function testMakeProductChildrenArray()
{
$magentoStoreId = 1;
Expand Down

0 comments on commit 5a4083c

Please sign in to comment.