1
0
mirror of synced 2025-02-22 09:53:13 +03:00

Improved the create/update method when registering customers

This commit is contained in:
Dima Uryvskiy 2022-01-14 12:52:13 +03:00 committed by GitHub
parent 05a0f64a13
commit 6cbb10e0ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 239 additions and 85 deletions

View File

@ -83,7 +83,6 @@ if (!class_exists('WC_Retailcrm_Base')) {
add_action('wp_ajax_generate_icml', array($this, 'generate_icml')); add_action('wp_ajax_generate_icml', array($this, 'generate_icml'));
add_action('wp_ajax_upload_selected_orders', array($this, 'upload_selected_orders')); add_action('wp_ajax_upload_selected_orders', array($this, 'upload_selected_orders'));
add_action('admin_print_footer_scripts', array($this, 'ajax_generate_icml'), 99); add_action('admin_print_footer_scripts', array($this, 'ajax_generate_icml'), 99);
add_action('woocommerce_created_customer', array($this, 'create_customer'), 10, 1);
add_action('woocommerce_update_customer', array($this, 'update_customer'), 10, 1); add_action('woocommerce_update_customer', array($this, 'update_customer'), 10, 1);
add_action('user_register', array($this, 'create_customer'), 10, 2); add_action('user_register', array($this, 'create_customer'), 10, 2);
add_action('profile_update', array($this, 'update_customer'), 10, 2); add_action('profile_update', array($this, 'update_customer'), 10, 2);
@ -267,63 +266,26 @@ if (!class_exists('WC_Retailcrm_Base')) {
/** /**
* Create customer in retailCRM * Create customer in retailCRM
* *
* @param int $customer_id
*
* @codeCoverageIgnore There is a task for analysis * @codeCoverageIgnore There is a task for analysis
*
* @param int $customerId
*
* @return void * @return void
* @throws \Exception * @throws Exception
*/ */
public function create_customer($customer_id) public function create_customer($customerId)
{ {
if (WC_Retailcrm_Plugin::history_running() === true) { if (WC_Retailcrm_Plugin::history_running() === true) {
return; return;
} }
$client = $this->getApiClient(); if (empty($customerId)) {
WC_Retailcrm_Logger::add('Error: Customer externalId is empty');
if (empty($client)) {
return; return;
} }
$wcCustomer = new WC_Customer($customer_id); $this->customers->registerCustomer($customerId);
$email = $wcCustomer->get_billing_email();
if (empty($email)) {
$email = $wcCustomer->get_email();
}
if (empty($email)) {
return;
} else {
$wcCustomer->set_billing_email($email);
$wcCustomer->save();
}
$response = $client->customersList(array('email' => $email));
if (
!empty($response)
&& $response->isSuccessful()
&& isset($response['customers'])
&& count($response['customers']) > 0
) {
$customers = $response['customers'];
$customer = reset($customers);
if (isset($customer['id'])) {
$this->customers->updateCustomerById($customer_id, $customer['id']);
$builder = new WC_Retailcrm_WC_Customer_Builder();
$builder
->setWcCustomer($wcCustomer)
->setPhones(isset($customer['phones']) ? $customer['phones'] : array())
->setAddress(isset($customer['address']) ? $customer['address'] : false)
->build()
->getResult()
->save();
}
} else {
$this->customers->createCustomer($customer_id);
}
} }
/** /**
@ -331,23 +293,28 @@ if (!class_exists('WC_Retailcrm_Base')) {
* *
* @codeCoverageIgnore Check in another tests * @codeCoverageIgnore Check in another tests
* *
* @param int $customer_id * @param int $customerId
*
* @return void
* @throws Exception
*/ */
public function update_customer($customer_id) public function update_customer($customerId)
{ {
if (WC_Retailcrm_Plugin::history_running() === true) { if (WC_Retailcrm_Plugin::history_running() === true) {
return; return;
} }
if (empty($customer_id)) { if (empty($customerId)) {
WC_Retailcrm_Logger::add('Error: Customer externalId is empty');
return; return;
} }
$this->customers->updateCustomer($customer_id); $this->customers->updateCustomer($customerId);
} }
/** /**
* Create order in retailCRM from admin panel * Create order in RetailCRM from admin panel
* *
* @codeCoverageIgnore Check in another tests * @codeCoverageIgnore Check in another tests
* *

View File

@ -18,25 +18,25 @@ if (!class_exists('WC_Retailcrm_Customers')) :
protected $retailcrm; protected $retailcrm;
/** @var array */ /** @var array */
protected $retailcrm_settings = array(); protected $retailcrm_settings = [];
/** @var WC_Retailcrm_Customer_Address */ /** @var WC_Retailcrm_Customer_Address */
protected $customer_address; protected $customer_address;
/** @var array */ /** @var array */
private $customer = array(); private $customer = [];
/** @var array */ /** @var array */
private $customerCorporate = array(); private $customerCorporate = [];
/** @var array */ /** @var array */
private $customerCorporateCompany = array(); private $customerCorporateCompany = [];
/** @var array */ /** @var array */
private $customerCorporateAddress = array(); private $customerCorporateAddress = [];
/**@var array */ /**@var array */
private $customFields = array(); private $customFields = [];
/** /**
* WC_Retailcrm_Customers constructor. * WC_Retailcrm_Customers constructor.
@ -80,6 +80,64 @@ if (!class_exists('WC_Retailcrm_Customers')) :
return $this->retailcrm->getCorporateEnabled(); return $this->retailcrm->getCorporateEnabled();
} }
/**
* Customer can registration on site, we need:
* 1. Check by email if the customer already exists in CRM - then update the customer details.
* 2. If the customer is not in CRM, then create a new customer.
*
* @param int $customerId
*
* @return void|null
* @throws Exception
*/
public function registerCustomer($customerId)
{
if (!$this->retailcrm instanceof WC_Retailcrm_Proxy) {
return null;
}
$wcCustomer = new WC_Customer($customerId);
$email = $wcCustomer->get_billing_email();
if (empty($email)) {
$email = $wcCustomer->get_email();
}
if (empty($email)) {
WC_Retailcrm_Logger::add('Error: Customer email is empty, externalId: ' . $wcCustomer->get_id());
return null;
} else {
$wcCustomer->set_billing_email($email);
$wcCustomer->save();
}
$response = $this->retailcrm->customersList(['email' => $email]);
if ($response->isSuccessful() && !empty($response['customers'])) {
$customers = $response['customers'];
$customer = reset($customers);
if (isset($customer['id'])) {
$this->updateCustomerById($customerId, $customer['id']);
$builder = new WC_Retailcrm_WC_Customer_Builder();
$builder
->setWcCustomer($wcCustomer)
->setPhones(isset($customer['phones']) ? $customer['phones'] : array())
->setAddress(isset($customer['address']) ? $customer['address'] : false)
->build()
->getResult()
->save();
WC_Retailcrm_Logger::add('Customer was edited, externalId: ' . $wcCustomer->get_id());
}
} else {
$this->createCustomer($customerId);
WC_Retailcrm_Logger::add('Customer was created, externalId: ' . $wcCustomer->get_id());
}
}
/** /**
* Create customer in CRM * Create customer in CRM
* *
@ -119,18 +177,18 @@ if (!class_exists('WC_Retailcrm_Customers')) :
/** /**
* Update customer in CRM * Update customer in CRM
* *
* @param $customer_id * @param $customerId
* *
* @return void|\WC_Customer * @return void|\WC_Customer
* @throws \Exception * @throws \Exception
*/ */
public function updateCustomer($customer_id) public function updateCustomer($customerId)
{ {
if (!$this->retailcrm instanceof WC_Retailcrm_Proxy) { if (!$this->retailcrm instanceof WC_Retailcrm_Proxy) {
return; return;
} }
$customer = $this->wcCustomerGet($customer_id); $customer = $this->wcCustomerGet($customerId);
if ($this->isCustomer($customer)) { if ($this->isCustomer($customer)) {
$this->processCustomer($customer); $this->processCustomer($customer);
@ -143,19 +201,19 @@ if (!class_exists('WC_Retailcrm_Customers')) :
/** /**
* Update customer in CRM by ID * Update customer in CRM by ID
* *
* @param int $customer_id * @param int $customerId
* @param int|string $crmCustomerId * @param int|string $crmCustomerId
* *
* @return void|\WC_Customer * @return void|\WC_Customer
* @throws \Exception * @throws \Exception
*/ */
public function updateCustomerById($customer_id, $crmCustomerId) public function updateCustomerById($customerId, $crmCustomerId)
{ {
if (!$this->retailcrm instanceof WC_Retailcrm_Proxy) { if (!$this->retailcrm instanceof WC_Retailcrm_Proxy) {
return; return;
} }
$customer = $this->wcCustomerGet($customer_id); $customer = $this->wcCustomerGet($customerId);
if ($this->isCustomer($customer)) { if ($this->isCustomer($customer)) {
$this->processCustomer($customer); $this->processCustomer($customer);

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* PHP version 5.6 * PHP version 5.6
* *
@ -173,23 +174,23 @@ class WC_Retailcrm_WC_Customer_Builder extends WC_Retailcrm_Abstract_Builder
$this->customer->set_billing_state(self::arrayValue( $this->customer->set_billing_state(self::arrayValue(
$address, $address,
'region', 'region',
$this->customer->get_billing_state()) $this->customer->get_billing_state()
); ));
$this->customer->set_billing_postcode(self::arrayValue( $this->customer->set_billing_postcode(self::arrayValue(
$address, $address,
'index', 'index',
$this->customer->get_billing_postcode()) $this->customer->get_billing_postcode()
); ));
$this->customer->set_billing_country(self::arrayValue( $this->customer->set_billing_country(self::arrayValue(
$address, $address,
'country', 'country',
$this->customer->get_billing_country()) $this->customer->get_billing_country()
); ));
$this->customer->set_billing_city(self::arrayValue( $this->customer->set_billing_city(self::arrayValue(
$address, $address,
'city', 'city',
$this->customer->get_billing_city()) $this->customer->get_billing_city()
); ));
} }
return $this; return $this;
@ -206,7 +207,7 @@ class WC_Retailcrm_WC_Customer_Builder extends WC_Retailcrm_Abstract_Builder
/** /**
* Throws an exception if internal state is not ready for data building. * Throws an exception if internal state is not ready for data building.
* *
* @throws \RuntimeException * @throws RuntimeException
*/ */
private function checkBuilderValidity() private function checkBuilderValidity()
{ {

View File

@ -15,19 +15,63 @@ namespace datasets;
*/ */
class DataCustomersRetailCrm class DataCustomersRetailCrm
{ {
public static function getCustomerAddress() public static function getCustomerAddress() {
{ return [
return array(
'success' => true, 'success' => true,
'addresses' => array ( 'addresses' => [
'id' => 3503, 'id' => 3503,
'index' => 144566, 'index' => 144566,
'countryIso' => 'ES', 'countryIso' => 'ES',
'region' => 'Region', 'region' => 'Region',
'city' => 'City', 'city' => 'City',
'text' => 'street Test 777', 'text' => 'street Test 777',
) ]
); ];
}
public static function getEmptyCustomersList() {
return [
'success' => true,
'pagination' => [
'limit' => 20,
'totalCount' => 0,
'currentPage' => 1,
'totalPageCount' => 0
],
'customers' => [],
];
}
public static function getCustomersList() {
return [
'success' => true,
'pagination' => [
'limit' => 20,
'totalCount' => 0,
'currentPage' => 1,
'totalPageCount' => 0
],
'customers' => [
[
'type' => 'customer',
'id' => 4228,
'externalId' => 2,
'isContact' => false,
'email' => 'madrid@mail.es',
'phones' => [['number' => '+3456234235']],
'addresses' => [
'id' => 3503,
'index' => 144566,
'countryIso' => 'ES',
'region' => 'Region',
'city' => 'City',
'text' => 'street Test 777',
]
]
]
];
} }
} }

View File

@ -45,7 +45,8 @@ class WC_Retailcrm_Customers_Test extends WC_Retailcrm_Test_Case_Helper
'customersCorporateAddressesCreate', 'customersCorporateAddressesCreate',
'customersCorporateCompaniesCreate', 'customersCorporateCompaniesCreate',
'getSingleSiteForKey', 'getSingleSiteForKey',
'customersCorporateAddresses' 'customersCorporateAddresses',
'customersList'
)) ))
->getMock(); ->getMock();
@ -115,6 +116,37 @@ class WC_Retailcrm_Customers_Test extends WC_Retailcrm_Test_Case_Helper
} }
} }
/**
* @param $retailcrm
*
* @dataProvider dataProviderApiClient
*/
public function test_create_customer_registration($retailcrm)
{
if ($retailcrm) {
$this->buildResponseCustomersList($retailcrm, DataCustomersRetailCrm::getEmptyCustomersList());
}
$retailcrmCustomer = $this->getRetailcrmCustomer($retailcrm);
$id = $retailcrmCustomer->registerCustomer($this->customer->get_id());
$customer = $retailcrmCustomer->getCustomer();
if ($retailcrm) {
$this->assertArrayHasKey('firstName', $customer);
$this->assertArrayHasKey('createdAt', $customer);
$this->assertArrayHasKey('email', $customer);
$this->assertNotEmpty($customer['externalId']);
$this->assertNotEmpty($customer['createdAt']);
$this->assertNotEmpty($customer['firstName']);
$this->assertNotEmpty($customer['email']);
$this->assertEquals($customer['firstName'], $this->customer->get_first_name());
$this->assertEquals($customer['email'], $this->customer->get_email());
} else {
$this->assertEquals(null, $id);
$this->assertEquals(array(), $customer);
}
}
public function test_create_customer_empty_data() public function test_create_customer_empty_data()
{ {
$retailcrmCustomer = $this->getRetailcrmCustomer($this->apiMock); $retailcrmCustomer = $this->getRetailcrmCustomer($this->apiMock);
@ -130,6 +162,37 @@ class WC_Retailcrm_Customers_Test extends WC_Retailcrm_Test_Case_Helper
* *
* @dataProvider dataProviderApiClient * @dataProvider dataProviderApiClient
*/ */
public function test_update_customer_registration($retailcrm)
{
if ($retailcrm) {
$this->buildResponseCustomersList($retailcrm, DataCustomersRetailCrm::getCustomersList());
}
$retailcrmCustomer = $this->getRetailcrmCustomer($retailcrm);
$wcCustomer = $retailcrmCustomer->registerCustomer($this->customer->get_id());
$customer = $retailcrmCustomer->getCustomer();
if ($retailcrm) {
$this->assertArrayHasKey('externalId', $customer);
$this->assertArrayHasKey('firstName', $customer);
$this->assertArrayHasKey('createdAt', $customer);
$this->assertArrayHasKey('email', $customer);
$this->assertNotEmpty($customer['externalId']);
$this->assertNotEmpty($customer['createdAt']);
$this->assertNotEmpty($customer['firstName']);
$this->assertNotEmpty($customer['email']);
} else {
$this->assertEquals(null, $wcCustomer);
$this->assertEquals(array(), $customer);
}
}
/**
* @param $retailcrm
*
* @dataProvider dataProviderApiClient
* @throws Exception
*/
public function test_update_customer($retailcrm) public function test_update_customer($retailcrm)
{ {
$retailcrmCustomer = $this->getRetailcrmCustomer($retailcrm); $retailcrmCustomer = $this->getRetailcrmCustomer($retailcrm);
@ -280,4 +343,25 @@ class WC_Retailcrm_Customers_Test extends WC_Retailcrm_Test_Case_Helper
new WC_Retailcrm_Customer_Address() new WC_Retailcrm_Customer_Address()
); );
} }
/**
* @param $retailcrm
* @param $response
*
* @return void
*/
private function buildResponseCustomersList($retailcrm, $response)
{
// Mock response for get customers list
$responseCustomersList = $this->getMockBuilder('\WC_Retailcrm_Response_Helper')
->disableOriginalConstructor()
->setMethods(array('isSuccessful'))
->getMock();
$this->setMockResponse($responseCustomersList, 'isSuccessful', true);
$responseCustomersList->setResponse($response);
//Set responseCustomersList mock for apiMock
$this->setMockResponse($retailcrm, 'customersList', $responseCustomersList);
}
} }