1
0
mirror of synced 2024-11-21 20:46:06 +03:00

Изменена логика передачи данных по заказам и клиентам

This commit is contained in:
Akolzin Dmitry 2019-01-18 11:45:51 +03:00
parent 6dd54014ae
commit f4eca5a7b0
5 changed files with 176 additions and 41 deletions

View File

@ -15,6 +15,7 @@ class OrderCreate implements \Magento\Framework\Event\ObserverInterface
private $registry; private $registry;
private $order; private $order;
private $serviceOrder; private $serviceOrder;
private $serviceCustomer;
/** /**
* Constructor * Constructor
@ -22,6 +23,7 @@ class OrderCreate implements \Magento\Framework\Event\ObserverInterface
* @param \Magento\Framework\Registry $registry * @param \Magento\Framework\Registry $registry
* @param \Retailcrm\Retailcrm\Model\Logger\Logger $logger * @param \Retailcrm\Retailcrm\Model\Logger\Logger $logger
* @param \Retailcrm\Retailcrm\Model\Service\Order $serviceOrder * @param \Retailcrm\Retailcrm\Model\Service\Order $serviceOrder
* @param \Retailcrm\Retailcrm\Model\Service\Customer $serviceCustomer
* @param Helper $helper * @param Helper $helper
* @param ApiClient $api * @param ApiClient $api
*/ */
@ -29,12 +31,14 @@ class OrderCreate implements \Magento\Framework\Event\ObserverInterface
\Magento\Framework\Registry $registry, \Magento\Framework\Registry $registry,
\Retailcrm\Retailcrm\Model\Logger\Logger $logger, \Retailcrm\Retailcrm\Model\Logger\Logger $logger,
\Retailcrm\Retailcrm\Model\Service\Order $serviceOrder, \Retailcrm\Retailcrm\Model\Service\Order $serviceOrder,
\Retailcrm\Retailcrm\Model\Service\Customer $serviceCustomer,
Helper $helper, Helper $helper,
ApiClient $api ApiClient $api
) { ) {
$this->logger = $logger; $this->logger = $logger;
$this->registry = $registry; $this->registry = $registry;
$this->serviceOrder = $serviceOrder; $this->serviceOrder = $serviceOrder;
$this->serviceCustomer = $serviceCustomer;
$this->helper = $helper; $this->helper = $helper;
$this->api = $api; $this->api = $api;
$this->order = []; $this->order = [];
@ -55,6 +59,7 @@ class OrderCreate implements \Magento\Framework\Event\ObserverInterface
return false; return false;
} }
/** @var \Magento\Sales\Model\Order $order */
$order = $observer->getEvent()->getOrder(); $order = $observer->getEvent()->getOrder();
$this->api->setSite($this->helper->getSite($order->getStore())); $this->api->setSite($this->helper->getSite($order->getStore()));
@ -62,13 +67,8 @@ class OrderCreate implements \Magento\Framework\Event\ObserverInterface
return false; return false;
} }
$billingAddress = $order->getBillingAddress();
$this->order = $this->serviceOrder->process($order); $this->order = $this->serviceOrder->process($order);
$this->setCustomer($order);
$this->setCustomer(
$order,
$billingAddress
);
Helper::filterRecursive($this->order); Helper::filterRecursive($this->order);
@ -80,16 +80,22 @@ class OrderCreate implements \Magento\Framework\Event\ObserverInterface
} }
/** /**
* @param $order * @param \Magento\Sales\Model\Order $order
* @param $billingAddress * @param \Magento\Sales\Model\Order\Address $billingAddress
*/ */
private function setCustomer($order, $billingAddress) private function setCustomer($order)
{ {
if ($order->getCustomerIsGuest() == 1) { if ($order->getCustomerIsGuest() == 1) {
$customer = $this->getCustomerByEmail($order->getCustomerEmail()); $customer = $this->getCustomerByEmail($order->getCustomerEmail());
if ($customer !== false) { if ($customer !== false) {
$this->order['customer']['id'] = $customer['id']; $this->order['customer']['id'] = $customer['id'];
} else {
$newCustomer = $this->serviceCustomer->prepareCustomerFromOrder($order);
$response = $this->api->customersCreate($newCustomer);
if ($response && isset($response['id'])) {
$this->order['customer']['id'] = $response['id'];
}
} }
} }
@ -97,18 +103,7 @@ class OrderCreate implements \Magento\Framework\Event\ObserverInterface
if ($this->existsInCrm($order->getCustomerId(), 'customersGet')) { if ($this->existsInCrm($order->getCustomerId(), 'customersGet')) {
$this->order['customer']['externalId'] = $order->getCustomerId(); $this->order['customer']['externalId'] = $order->getCustomerId();
} else { } else {
$preparedCustomer = [ $preparedCustomer = $this->serviceCustomer->process($order->getCustomer());
'externalId' => $order->getCustomerId(),
'firstName' => $order->getCustomerFirstname(),
'lastName' => $order->getCustomerLastname(),
'email' => $order->getCustomerEmail()
];
if ($billingAddress->getTelephone()) {
$preparedCustomer['phones'][] = [
'number' => $billingAddress->getTelephone()
];
}
if ($this->api->customersCreate($preparedCustomer)) { if ($this->api->customersCreate($preparedCustomer)) {
$this->order['customer']['externalId'] = $order->getCustomerId(); $this->order['customer']['externalId'] = $order->getCustomerId();

View File

@ -25,7 +25,6 @@ class Customer implements CustomerManagerInterface
* @param \Magento\Customer\Model\Customer $customer * @param \Magento\Customer\Model\Customer $customer
* *
* @return array $preparedCustomer * @return array $preparedCustomer
* @throws \Magento\Framework\Exception\LocalizedException
*/ */
public function process(\Magento\Customer\Model\Customer $customer) public function process(\Magento\Customer\Model\Customer $customer)
{ {
@ -60,6 +59,49 @@ class Customer implements CustomerManagerInterface
return $preparedCustomer; return $preparedCustomer;
} }
/**
* @param \Magento\Sales\Model\Order $order
*
* @return array
*/
public function prepareCustomerFromOrder(\Magento\Sales\Model\Order $order)
{
$billing = $order->getBillingAddress();
$preparedCustomer = [
'externalId' => uniqid(),
'email' => $billing->getEmail(),
'firstName' => $billing->getFirstname(),
'patronymic' => $billing->getMiddlename(),
'lastName' => $billing->getLastname(),
'createdAt' => $order->getCreatedAt(),
'address' => [
'countryIso' => $billing->getCountryId(),
'index' => $billing->getPostcode(),
'region' => $billing->getRegion(),
'city' => $billing->getCity(),
'street' => $billing->getStreet(),
'text' => sprintf(
'%s %s %s %s',
$billing->getPostcode(),
$billing->getRegion(),
$billing->getCity(),
$billing->getStreet()
)
]
];
if ($billing->getTelephone()) {
$preparedCustomer['phones'] = [
[
'number' => $billing->getTelephone()
]
];
}
return $preparedCustomer;
}
private function getAddress(\Magento\Customer\Model\Customer $customer) private function getAddress(\Magento\Customer\Model\Customer $customer)
{ {
$billingAddress = $customer->getDefaultBillingAddress(); $billingAddress = $customer->getDefaultBillingAddress();

View File

@ -34,7 +34,6 @@ class Order implements \Retailcrm\Retailcrm\Api\OrderManagerInterface
{ {
$items = $order->getAllItems(); $items = $order->getAllItems();
$products = $this->addProducts($items); $products = $this->addProducts($items);
$billingAddress = $order->getBillingAddress();
$shippingAddress = $order->getShippingAddress(); $shippingAddress = $order->getShippingAddress();
$shipping = $this->getShippingCode($order->getShippingMethod()); $shipping = $this->getShippingCode($order->getShippingMethod());
@ -42,11 +41,11 @@ class Order implements \Retailcrm\Retailcrm\Api\OrderManagerInterface
'externalId' => $order->getId(), 'externalId' => $order->getId(),
'number' => $order->getRealOrderId(), 'number' => $order->getRealOrderId(),
'createdAt' => $order->getCreatedAt(), 'createdAt' => $order->getCreatedAt(),
'lastName' => $order->getCustomerLastname(), 'lastName' => $shippingAddress->getLastname(),
'firstName' => $order->getCustomerFirstname(), 'firstName' => $shippingAddress->getFirstname(),
'patronymic' => $order->getCustomerMiddlename(), 'patronymic' => $shippingAddress->getMiddlename(),
'email' => $order->getCustomerEmail(), 'email' => $shippingAddress->getEmail(),
'phone' => $billingAddress->getTelephone(), 'phone' => $shippingAddress->getTelephone(),
'status' => $this->config->getValue('retailcrm/retailcrm_status/' . $order->getStatus()), 'status' => $this->config->getValue('retailcrm/retailcrm_status/' . $order->getStatus()),
'items' => $products, 'items' => $products,
'delivery' => [ 'delivery' => [
@ -73,8 +72,8 @@ class Order implements \Retailcrm\Retailcrm\Api\OrderManagerInterface
] ]
]; ];
if ($billingAddress->getData('country_id')) { if ($shippingAddress->getData('country_id')) {
$preparedOrder['countryIso'] = $billingAddress->getData('country_id'); $preparedOrder['countryIso'] = $shippingAddress->getData('country_id');
} }
if ($this->helper->getGeneralSettings('api_version') == 'v4') { if ($this->helper->getGeneralSettings('api_version') == 'v4') {

View File

@ -20,6 +20,8 @@ class OrderCreateTest extends \PHPUnit\Framework\TestCase
private $mockLogger; private $mockLogger;
private $mockServiceOrder; private $mockServiceOrder;
private $mockHelper; private $mockHelper;
private $mockServiceCustomer;
private $mockCustomer;
public function setUp() public function setUp()
{ {
@ -56,6 +58,12 @@ class OrderCreateTest extends \PHPUnit\Framework\TestCase
$this->mockOrder = $this->getMockBuilder(\Magento\Sales\Model\Order::class) $this->mockOrder = $this->getMockBuilder(\Magento\Sales\Model\Order::class)
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods([
'getCustomer',
'getId',
'getBillingAddress',
'getStore'
])
->getMock(); ->getMock();
$this->mockStore = $this->getMockBuilder(\Magento\Store\Model\Store::class) $this->mockStore = $this->getMockBuilder(\Magento\Store\Model\Store::class)
@ -81,10 +89,62 @@ class OrderCreateTest extends \PHPUnit\Framework\TestCase
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$this->mockServiceCustomer = $this->getMockBuilder(\Retailcrm\Retailcrm\Model\Service\Customer::class)
->disableOriginalConstructor()
->getMock();
$this->mockServiceCustomer->expects($this->any())->method('process')->willReturn($this->getCustomerTestData());
$this->mockServiceCustomer
->expects($this->any())
->method('prepareCustomerFromOrder')
->willReturn(
$this->getCustomerTestData()
);
$this->mockCustomer = $this->getMockBuilder(\Magento\Customer\Model\Customer::class)
->disableOriginalConstructor()
->setMethods([
'getId',
'getEmail',
'getFirstname',
'getMiddlename',
'getLastname',
'getStore',
'getGender',
'getDob',
'getDefaultBillingAddress',
'getAddressesCollection'
])
->getMock();
$testData = $this->getAfterSaveCustomerTestData();
// mock Customer
$this->mockCustomer->expects($this->any())
->method('getId')
->willReturn($testData['id']);
$this->mockCustomer->expects($this->any())
->method('getEmail')
->willReturn($testData['email']);
$this->mockCustomer->expects($this->any())
->method('getFirstname')
->willReturn($testData['firstname']);
$this->mockCustomer->expects($this->any())
->method('getMiddlename')
->willReturn($testData['middlename']);
$this->mockCustomer->expects($this->any())
->method('getLastname')
->willReturn($testData['lastname']);
$this->unit = new \Retailcrm\Retailcrm\Model\Observer\OrderCreate( $this->unit = new \Retailcrm\Retailcrm\Model\Observer\OrderCreate(
$this->mockRegistry, $this->mockRegistry,
$this->mockLogger, $this->mockLogger,
$this->mockServiceOrder, $this->mockServiceOrder,
$this->mockServiceCustomer,
$this->mockHelper, $this->mockHelper,
$this->mockApi $this->mockApi
); );
@ -177,6 +237,10 @@ class OrderCreateTest extends \PHPUnit\Framework\TestCase
->method('getStore') ->method('getStore')
->willReturn($this->mockStore); ->willReturn($this->mockStore);
$this->mockOrder->expects($this->any())
->method('getCustomer')
->willReturn($this->mockCustomer);
// mock Event // mock Event
$this->mockEvent->expects($this->any()) $this->mockEvent->expects($this->any())
->method('getOrder') ->method('getOrder')
@ -379,4 +443,37 @@ class OrderCreateTest extends \PHPUnit\Framework\TestCase
] ]
]; ];
} }
/**
* Get test customer data
*
* @return array
*/
private function getAfterSaveCustomerTestData()
{
return [
'id' => 1,
'email' => 'test@mail.com',
'firstname' => 'TestFirstname',
'lastname' => 'Testlastname',
'middlename' => 'Testmiddlename',
'birthday' => '1990-01-01',
'gender' => 1
];
}
/**
* @return array
*/
private function getCustomerTestData()
{
return [
'externalId' => 1,
'email' => 'test@mail.com',
'firstName' => 'TestFirstname',
'lastName' => 'Testlastname',
'patronymic' => 'Testmiddlename',
'createdAt' => \date('Y-m-d H:i:s')
];
}
} }

View File

@ -90,7 +90,14 @@ class OrderTest extends \PHPUnit\Framework\TestCase
$mockShippingAddress = $this->getMockBuilder(\Magento\Sales\Model\Order\Address::class) $mockShippingAddress = $this->getMockBuilder(\Magento\Sales\Model\Order\Address::class)
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(['getData']) ->setMethods([
'getData',
'getTelephone',
'getFirstname',
'getLastname',
'getMiddlename',
'getEmail'
])
->getMock(); ->getMock();
$mockShippingAddress->expects($this->any()) $mockShippingAddress->expects($this->any())
->method('getData') ->method('getData')
@ -103,11 +110,11 @@ class OrderTest extends \PHPUnit\Framework\TestCase
)) ))
->will($this->returnCallback([$this, 'getCallbackDataAddress'])); ->will($this->returnCallback([$this, 'getCallbackDataAddress']));
$mockBillingAddress = $this->getMockBuilder(\Magento\Sales\Model\Order\Address::class) $mockShippingAddress->expects($this->any())->method('getTelephone')->willReturn('89000000000');
->disableOriginalConstructor() $mockShippingAddress->expects($this->any())->method('getFirstname')->willReturn('Test');
->setMethods(['getTelephone']) $mockShippingAddress->expects($this->any())->method('getLastname')->willReturn('Test');
->getMock(); $mockShippingAddress->expects($this->any())->method('getMiddlename')->willReturn('Test');
$mockBillingAddress->expects($this->any())->method('getTelephone')->willReturn('89000000000'); $mockShippingAddress->expects($this->any())->method('getEmail')->willReturn('test@mail.com');
$mockPaymentMethod = $this->getMockBuilder(\Magento\Payment\Model\MethodInterface::class) $mockPaymentMethod = $this->getMockBuilder(\Magento\Payment\Model\MethodInterface::class)
->disableOriginalConstructor() ->disableOriginalConstructor()
@ -121,16 +128,11 @@ class OrderTest extends \PHPUnit\Framework\TestCase
$mockPayment->expects($this->any())->method('getMethodInstance')->willReturn($mockPaymentMethod); $mockPayment->expects($this->any())->method('getMethodInstance')->willReturn($mockPaymentMethod);
$this->mockOrder->expects($this->any())->method('getAllItems')->willReturn([$mockItem]); $this->mockOrder->expects($this->any())->method('getAllItems')->willReturn([$mockItem]);
$this->mockOrder->expects($this->any())->method('getBillingAddress')->willReturn($mockBillingAddress);
$this->mockOrder->expects($this->any())->method('getShippingAddress')->willReturn($mockShippingAddress); $this->mockOrder->expects($this->any())->method('getShippingAddress')->willReturn($mockShippingAddress);
$this->mockOrder->expects($this->any())->method('getShippingMethod')->willReturn('flatrate_flatrate'); $this->mockOrder->expects($this->any())->method('getShippingMethod')->willReturn('flatrate_flatrate');
$this->mockOrder->expects($this->any())->method('getId')->willReturn(1); $this->mockOrder->expects($this->any())->method('getId')->willReturn(1);
$this->mockOrder->expects($this->any())->method('getRealOrderId')->willReturn('000000001'); $this->mockOrder->expects($this->any())->method('getRealOrderId')->willReturn('000000001');
$this->mockOrder->expects($this->any())->method('getCreatedAt')->willReturn(date('Y-m-d H:i:s')); $this->mockOrder->expects($this->any())->method('getCreatedAt')->willReturn(date('Y-m-d H:i:s'));
$this->mockOrder->expects($this->any())->method('getCustomerLastname')->willReturn('Test');
$this->mockOrder->expects($this->any())->method('getCustomerFirstname')->willReturn(date('Test'));
$this->mockOrder->expects($this->any())->method('getCustomerMiddlename')->willReturn(date('Test'));
$this->mockOrder->expects($this->any())->method('getCustomerEmail')->willReturn('test@mail.com');
$this->mockOrder->expects($this->any())->method('getStatus')->willReturn('processing'); $this->mockOrder->expects($this->any())->method('getStatus')->willReturn('processing');
$this->mockOrder->expects($this->any())->method('getShippingAmount')->willReturn(100); $this->mockOrder->expects($this->any())->method('getShippingAmount')->willReturn(100);
$this->mockOrder->expects($this->any())->method('getDiscountAmount')->willReturn(0); $this->mockOrder->expects($this->any())->method('getDiscountAmount')->willReturn(0);