diff --git a/app/code/Magento/Weee/Model/Observer/Session.php b/app/code/Magento/Weee/Model/Observer/Session.php new file mode 100644 index 0000000000000000000000000000000000000000..7f72b64c6bf792eff2d650191fa8016cb5ad2325 --- /dev/null +++ b/app/code/Magento/Weee/Model/Observer/Session.php @@ -0,0 +1,139 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +/** + * Customer Session Event Observer + */ +namespace Magento\Weee\Model\Observer; + +class Session +{ + /** + * @var \Magento\Customer\Model\Session + */ + protected $customerSession; + + /** + * @var \Magento\Weee\Helper\Data + */ + protected $weeeHelper; + + /** + * Module manager + * + * @var \Magento\Framework\Module\Manager + */ + private $moduleManager; + + /** + * Cache config + * + * @var \Magento\PageCache\Model\Config + */ + private $cacheConfig; + + /** + * @param \Magento\Customer\Model\Session $customerSession + * @param \Magento\Weee\Helper\Data $weeeHelper + * @param \Magento\Framework\Module\Manager $moduleManager + * @param \Magento\PageCache\Model\Config $cacheConfig + */ + public function __construct( + \Magento\Customer\Model\Session $customerSession, + \Magento\Weee\Helper\Data $weeeHelper, + \Magento\Framework\Module\Manager $moduleManager, + \Magento\PageCache\Model\Config $cacheConfig + ) { + $this->customerSession = $customerSession; + $this->weeeHelper = $weeeHelper; + $this->moduleManager = $moduleManager; + $this->cacheConfig = $cacheConfig; + } + + /** + * @param \Magento\Framework\Event\Observer $observer + * @return void + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) + */ + public function customerLoggedIn(\Magento\Framework\Event\Observer $observer) + { + if ($this->moduleManager->isEnabled('Magento_PageCache') && $this->cacheConfig->isEnabled() && + $this->weeeHelper->isEnabled()) { + /** @var \Magento\Customer\Model\Data\Customer $customer */ + $customer = $observer->getData('customer'); + + /** @var \Magento\Customer\Api\Data\AddressInterface[] $addresses */ + $addresses = $customer->getAddresses(); + if (isset($addresses)) { + $defaultShippingFound = false; + $defaultBillingFound = false; + foreach ($addresses as $address) { + if ($address->isDefaultBilling()) { + $defaultBillingFound = true; + $this->customerSession->setDefaultTaxBillingAddress( + [ + 'country_id' => $address->getCountryId(), + 'region_id' => $address->getRegion() ? $address->getRegion()->getRegionId() : null, + 'postcode' => $address->getPostcode(), + ] + ); + } + if ($address->isDefaultShipping()) { + $defaultShippingFound = true; + $this->customerSession->setDefaultTaxShippingAddress( + [ + 'country_id' => $address->getCountryId(), + 'region_id' => $address->getRegion() ? $address->getRegion()->getRegionId() : null, + 'postcode' => $address->getPostcode(), + ] + ); + } + if ($defaultShippingFound && $defaultBillingFound) { + break; + } + } + } + } + } + + /** + * Address after save event handler + * + * @param \Magento\Framework\Event\Observer $observer + * @return void + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + public function afterAddressSave($observer) + { + if ($this->moduleManager->isEnabled('Magento_PageCache') && $this->cacheConfig->isEnabled() && + $this->weeeHelper->isEnabled()) { + /** @var $customerAddress Address */ + $address = $observer->getCustomerAddress(); + + // Check if the address is either the default billing, shipping, or both + if ($address->getIsPrimaryBilling() || $address->getIsDefaultBilling()) { + $this->customerSession->setDefaultTaxBillingAddress( + [ + 'country_id' => $address->getCountryId(), + 'region_id' => $address->getRegion() ? $address->getRegionId() : null, + 'postcode' => $address->getPostcode(), + ] + ); + } + + if ($address->getIsPrimaryShipping() || $address->getIsDefaultShipping()) { + $this->customerSession->setDefaultTaxShippingAddress( + [ + 'country_id' => $address->getCountryId(), + 'region_id' => $address->getRegion() ? $address->getRegionId() : null, + 'postcode' => $address->getPostcode(), + ] + ); + } + } + } +} diff --git a/app/code/Magento/Weee/Test/Unit/Model/Observer/SessionTest.php b/app/code/Magento/Weee/Test/Unit/Model/Observer/SessionTest.php new file mode 100644 index 0000000000000000000000000000000000000000..db31c7931bedab29ca21223702a8b8cd035a3070 --- /dev/null +++ b/app/code/Magento/Weee/Test/Unit/Model/Observer/SessionTest.php @@ -0,0 +1,166 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Weee\Test\Unit\Model\Observer; + +class SessionTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Framework\Event\Observer + */ + protected $observerMock; + + /** + * @var \Magento\Customer\Model\Session + */ + protected $customerSessionMock; + + /** + * Module manager + * + * @var \Magento\Framework\Module\Manager + */ + private $moduleManagerMock; + + /** + * Cache config + * + * @var \Magento\PageCache\Model\Config + */ + private $cacheConfigMock; + + /** + * @var \Magento\Weee\Helper\Data + */ + protected $weeeHelperMock; + + /** + * @var \Magento\Tax\Model\Observer\Session + */ + protected $session; + + + protected function setUp() + { + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->observerMock = $this->getMockBuilder('Magento\Framework\Event\Observer') + ->disableOriginalConstructor() + ->setMethods([ + 'getCustomerAddress', 'getData' + ]) + ->getMock(); + + $this->customerSessionMock = $this->getMockBuilder('Magento\Customer\Model\Session') + ->disableOriginalConstructor() + ->setMethods([ + 'setDefaultTaxBillingAddress', 'setDefaultTaxShippingAddress', 'setWebsiteId' + ]) + ->getMock(); + + $this->moduleManagerMock = $this->getMockBuilder('Magento\Framework\Module\Manager') + ->disableOriginalConstructor() + ->getMock(); + + $this->cacheConfigMock = $this->getMockBuilder('Magento\PageCache\Model\Config') + ->disableOriginalConstructor() + ->getMock(); + + $this->weeeHelperMock = $this->getMockBuilder('Magento\Weee\Helper\Data') + ->disableOriginalConstructor() + ->getMock(); + + $this->session = $this->objectManager->getObject( + 'Magento\Weee\Model\Observer\Session', + [ + 'customerSession' => $this->customerSessionMock, + 'weeeHelper' => $this->weeeHelperMock, + 'moduleManager' => $this->moduleManagerMock, + 'cacheConfig' => $this->cacheConfigMock + ] + ); + } + + public function testCustomerLoggedIn() + { + $this->moduleManagerMock->expects($this->once()) + ->method('isEnabled') + ->with('Magento_PageCache') + ->willReturn(true); + + $this->cacheConfigMock->expects($this->once()) + ->method('isEnabled') + ->willReturn(true); + + $this->weeeHelperMock->expects($this->any()) + ->method('isEnabled') + ->willReturn(true); + + $customerMock = $this->getMockBuilder('Magento\Customer\Model\Data\Customer') + ->disableOriginalConstructor() + ->getMock(); + + $this->observerMock->expects($this->once()) + ->method('getData') + ->with('customer') + ->willReturn($customerMock); + + $address = $this->objectManager->getObject('Magento\Customer\Model\Data\Address'); + $address->setIsDefaultShipping(true); + $address->setIsDefaultBilling(true); + $address->setCountryId(1); + $address->setPostCode(11111); + + $addresses = [$address]; + $customerMock->expects($this->once()) + ->method('getAddresses') + ->willReturn($addresses); + + $this->customerSessionMock->expects($this->once()) + ->method('setDefaultTaxBillingAddress') + ->with(['country_id' => 1, 'region_id' => null, 'postcode' => 11111]); + $this->customerSessionMock->expects($this->once()) + ->method('setDefaultTaxShippingAddress') + ->with(['country_id' => 1, 'region_id' => null, 'postcode' => 11111]); + + $this->session->customerLoggedIn($this->observerMock); + } + + public function testAfterAddressSave() + { + $this->moduleManagerMock->expects($this->once()) + ->method('isEnabled') + ->with('Magento_PageCache') + ->willReturn(true); + + $this->cacheConfigMock->expects($this->once()) + ->method('isEnabled') + ->willReturn(true); + + $this->weeeHelperMock->expects($this->any()) + ->method('isEnabled') + ->willReturn(true); + + $address = $this->objectManager->getObject('Magento\Customer\Model\Address'); + $address->setIsDefaultShipping(true); + $address->setIsDefaultBilling(true); + $address->setIsPrimaryBilling(true); + $address->setIsPrimaryShipping(true); + $address->setCountryId(1); + $address->setData('postcode', 11111); + + $this->customerSessionMock->expects($this->once()) + ->method('setDefaultTaxBillingAddress') + ->with(['country_id' => 1, 'region_id' => null, 'postcode' => 11111]); + $this->customerSessionMock->expects($this->once()) + ->method('setDefaultTaxShippingAddress') + ->with(['country_id' => 1, 'region_id' => null, 'postcode' => 11111]); + + $this->observerMock->expects($this->once()) + ->method('getCustomerAddress') + ->willReturn($address); + + $this->session->afterAddressSave($this->observerMock); + } +} diff --git a/app/code/Magento/Weee/etc/frontend/events.xml b/app/code/Magento/Weee/etc/frontend/events.xml new file mode 100644 index 0000000000000000000000000000000000000000..2bc96ce0399341f63d40f814ee72e061f54d205c --- /dev/null +++ b/app/code/Magento/Weee/etc/frontend/events.xml @@ -0,0 +1,16 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd"> + <event name="customer_data_object_login"> + <observer name="customer_weee_logged_in" instance="Magento\Weee\Model\Observer\Session" method="customerLoggedIn" /> + </event> + <event name="customer_address_save_after"> + <observer name="customer_weee_after_address_save" instance="Magento\Weee\Model\Observer\Session" method="afterAddressSave" /> + </event> +</config>