diff --git a/retailcrm/lib/RetailcrmAddressBuilder.php b/retailcrm/lib/RetailcrmAddressBuilder.php
index f914692..5308e24 100644
--- a/retailcrm/lib/RetailcrmAddressBuilder.php
+++ b/retailcrm/lib/RetailcrmAddressBuilder.php
@@ -52,6 +52,12 @@ class RetailcrmAddressBuilder extends RetailcrmAbstractDataBuilder
*/
const MODE_ORDER_DELIVERY = 2;
+
+ /**
+ * Divider for order delivery addressline1 and addressline 2
+ */
+ const ADDRESS_LINE_DIVIDER = '||';
+
/**
* @var Address|\AddressCore
*/
@@ -243,7 +249,11 @@ class RetailcrmAddressBuilder extends RetailcrmAbstractDataBuilder
'index' => $this->address->postcode,
'city' => $this->address->city,
'countryIso' => Country::getIsoById($this->address->id_country),
- 'text' => sprintf("%s %s", $this->address->address1, $this->address->address2),
+ 'text' => (empty($this->address->address2) ? $this->address->address1 :
+ implode(self::ADDRESS_LINE_DIVIDER, [
+ $this->address->address1,
+ $this->address->address2,
+ ])),
'region' => $state
));
}
diff --git a/retailcrm/lib/RetailcrmCustomerAddressBuilder.php b/retailcrm/lib/RetailcrmCustomerAddressBuilder.php
index 637f855..b1b2503 100644
--- a/retailcrm/lib/RetailcrmCustomerAddressBuilder.php
+++ b/retailcrm/lib/RetailcrmCustomerAddressBuilder.php
@@ -1,4 +1,5 @@
customerAddress->id_customer = $this->idCustomer;
- $this->customerAddress->alias = !empty($this->alias) ? $this->alias : 'default';
- $this->customerAddress->lastname = $this->lastName;
- $this->customerAddress->firstname = $this->firstName;
- $this->customerAddress->address1 = isset($this->dataCrm['text']) ? $this->dataCrm['text'] : '--';
- $this->customerAddress->id_country = isset($this->dataCrm['countryIso'])
- ? Country::getByIso($this->dataCrm['countryIso'])
- : Configuration::get('PS_COUNTRY_DEFAULT');
+ $this->setAddressField('alias', $this->alias, 'default');
+ $this->setAddressField('lastname', $this->lastName, '');
+ $this->setAddressField('firstname', $this->firstName, '');
+
+ $addressLine = $this->buildAddressLine();
+ $this->setAddressField('address1', $addressLine[0], '--');
+ $this->setAddressField('address2', $addressLine[1], '');
+
+ $countryIso = isset($this->dataCrm['countryIso']) ? Country::getByIso($this->dataCrm['countryIso']) : null;
+ $this->setAddressField('id_country', $countryIso, Configuration::get('PS_COUNTRY_DEFAULT'));
+
+ if (isset($this->dataCrm['city'])) {
+ $this->setAddressField('city', $this->dataCrm['city'], '--');
+ }
+ if (isset($this->dataCrm['index'])) {
+ $this->setAddressField('postcode', $this->dataCrm['index'], '');
+ }
if (isset($this->dataCrm['region'])) {
$state = State::getIdByName($this->dataCrm['region']);
@@ -186,9 +197,7 @@ class RetailcrmCustomerAddressBuilder extends RetailcrmAbstractBuilder implement
}
}
- $this->customerAddress->city = isset($this->dataCrm['city']) ? $this->dataCrm['city'] : '--';
- $this->customerAddress->postcode = isset($this->dataCrm['index']) ? $this->dataCrm['index'] : '';
- $this->customerAddress->phone = !empty($this->phone) ? $this->phone : '';
+ $this->setAddressField('phone', $this->phone, '');
$this->customerAddress = RetailcrmTools::filter(
'RetailcrmFilterSaveCustomerAddress',
@@ -199,5 +208,35 @@ class RetailcrmCustomerAddressBuilder extends RetailcrmAbstractBuilder implement
return $this;
}
+
+ private function setAddressField($field, $value, $default = null)
+ {
+ if (!property_exists($this->customerAddress, $field)) {
+ throw new InvalidArgumentException("Property $field not exist in the object");
+ }
+
+ if ($value !== null) {
+ $this->customerAddress->$field = $value;
+ } elseif (empty($this->customerAddress->$field)) {
+ $this->customerAddress->$field = $default;
+ }
+ }
+
+ private function buildAddressLine()
+ {
+ $addressLine = [
+ null,
+ null
+ ];
+
+ if (isset($this->dataCrm['text'])) {
+ $addressLine = explode(RetailcrmAddressBuilder::ADDRESS_LINE_DIVIDER, $this->dataCrm['text'], 2);
+ if (count($addressLine) == 1) {
+ $addressLine[] = null;
+ }
+ }
+
+ return $addressLine;
+ }
}
diff --git a/retailcrm/lib/RetailcrmHistory.php b/retailcrm/lib/RetailcrmHistory.php
index 7010abc..c00cbb3 100644
--- a/retailcrm/lib/RetailcrmHistory.php
+++ b/retailcrm/lib/RetailcrmHistory.php
@@ -234,6 +234,7 @@ class RetailcrmHistory
if (isset($order_history['deleted']) && $order_history['deleted'] == true) {
continue;
}
+ $infoOrder = null;
if (!array_key_exists('externalId', $order_history)) {
@@ -324,7 +325,6 @@ class RetailcrmHistory
}
}
- $address = new Address();
$customer = null;
$customerId = null;
@@ -380,10 +380,7 @@ class RetailcrmHistory
->build();
$customer = $customerBuilder->getData()->getCustomer();
-
- if (!empty($address)) {
- $address = $customerBuilder->getData()->getCustomerAddress();
- }
+ $address = $customerBuilder->getData()->getCustomerAddress();
}
if (empty($customer->id) && !empty($customer->email)) {
@@ -764,33 +761,56 @@ class RetailcrmHistory
/*
* check delivery changes
*/
- if (isset($order['status']) && isset($order['delivery'])) {
- if ($order['status'] == 'new') {
- $customerData = self::$api->customersGet($orderToUpdate->id_customer, 'externalId');
- $customerForAddress = $customerData['customer'];
+ if (isset($order['delivery'])
+ || isset($order['firstName'])
+ || isset($order['lastName'])
+ || isset($order['phone'])
+ ) {
+ $addressBuilder = new RetailcrmCustomerAddressBuilder();
- $customerBuilder = new RetailcrmCustomerBuilder();
-
- if (isset($customerData['customer']['address'])) {
- $customerForAddress['address'] = array_replace(
- $customerData['customer']['address'],
- $order['delivery']['address']
- );
- } else {
- $customerForAddress['address'] = $order['delivery']['address'];
+ $orderAddressCrm = [];
+ // TODO: check changed fields and skip getCRMOrder() if it's possible
+ // It is possible if there are valid address in the database
+ // and if there's no address1 & address2 changed (text, street, building, etc...)
+ if (isset($order['delivery']['address'])) {
+ $orderAddressCrm = $order['delivery']['address'];
+ // get full order address
+ $infoOrder = self::getCRMOrder($order['externalId']);
+ if (isset($infoOrder['delivery']['address'])) {
+ $orderAddressCrm = $infoOrder['delivery']['address'];
}
+ }
- $customerBuilder
- ->setDataCrm($customerForAddress)
- ->build();
+ $address = $addressBuilder
+ ->setCustomerAddress(new Address($orderToUpdate->id_address_delivery))
+ ->setIdCustomer($orderToUpdate->id_customer)
+ ->setDataCrm($orderAddressCrm)
+ ->setFirstName(isset($order['firstName']) ? $order['firstName'] : null)
+ ->setLastName(isset($order['lastName']) ? $order['lastName'] : null)
+ ->setPhone(isset($order['phone']) ? $order['phone'] : null)
+ ->build()
+ ->getData();
- $address = $customerBuilder->getData()->getCustomerAddress();
- if (!is_null($address)) {
- $address->id = $orderToUpdate->id_address_delivery;
-
- $address->update();
+ $validate = $address->validateFields(false, true);
+ if ($validate === true) {
+ // Modifying an address in order creates another address
+ // instead of changing the original one. This issue has been fixed in PS 1.7.7
+ if (version_compare(_PS_VERSION_, '1.7.7', '<')) {
+ $address->id = null;
+ $address->add();
+ $orderToUpdate->id_address_delivery = $address->id;
$orderToUpdate->update();
+ } else {
+ $address->id = $orderToUpdate->id_address_delivery;
+ $address->update();
}
+ } else {
+ RetailcrmLogger::writeCaller(__METHOD__, sprintf(
+ 'Error validating address for order %s: %s',
+ $orderToUpdate->id,
+ $validate
+ )
+ );
}
}
@@ -900,7 +920,9 @@ class RetailcrmHistory
if (isset($order['items']) || isset($order['delivery']['cost'])) {
// get full order
- $infoOrder = self::getCRMOrder($order['externalId']);
+ if (empty($infoOrder)) {
+ $infoOrder = self::getCRMOrder($order['externalId']);
+ }
// items
if (isset($order['items']) && is_array($order['items'])) {
@@ -1304,11 +1326,11 @@ class RetailcrmHistory
}
}
- if (!empty($crmOrder) && !empty($crmOrder['delivery']) && !empty($crmOrder['delivery']['address'])) {
- $data->setCrmOrderShippingAddress($crmOrder['delivery']['address']);
- }
-
if ($data->feasible()) {
+ if (!empty($crmOrder) && !empty($crmOrder['delivery']) && !empty($crmOrder['delivery']['address'])) {
+ $data->setCrmOrderShippingAddress($crmOrder['delivery']['address']);
+ }
+
try {
$result = $switcher->setData($data)
->build()
diff --git a/retailcrm/lib/RetailcrmOrderBuilder.php b/retailcrm/lib/RetailcrmOrderBuilder.php
index 5572c2f..ff350be 100644
--- a/retailcrm/lib/RetailcrmOrderBuilder.php
+++ b/retailcrm/lib/RetailcrmOrderBuilder.php
@@ -256,14 +256,16 @@ class RetailcrmOrderBuilder
$customer = $this->createdCustomer;
} else {
$crmCustomer = RetailcrmTools::mergeCustomerAddress($customer, $this->buildRegularAddress());
- if (isset($crmCustomer['tags'])) {
- unset($crmCustomer['tags']);
- }
+ if (!RetailcrmTools::isEqualCustomerAddress($customer, $crmCustomer)) {
+ if (isset($crmCustomer['tags'])) {
+ unset($crmCustomer['tags']);
+ }
- $response = $this->api->customersEdit($crmCustomer);
+ $response = $this->api->customersEdit($crmCustomer);
- if ($response instanceof RetailcrmApiResponse && $response->isSuccessful()) {
- $customer = $crmCustomer;
+ if ($response instanceof RetailcrmApiResponse && $response->isSuccessful()) {
+ $customer = $crmCustomer;
+ }
}
}
@@ -901,16 +903,14 @@ class RetailcrmOrderBuilder
}
if (isset($payment[$paymentType]) && !empty($payment[$paymentType])) {
- $order_payment = array(
- 'externalId' => $order->id . '#' . $order->reference,
- 'amount' => round($order->total_paid_real, 2),
- 'status' => ((round($order->total_paid_real, 2) > 0) ? 'paid' : null),
- 'type' => $payment[$paymentType]
+ $crmOrder['payments'] = array(
+ array(
+ 'externalId' => $order->id . '#' . $order->reference,
+ 'amount' => round($order->total_paid_real, 2),
+ 'status' => ((round($order->total_paid_real, 2) > 0) ? 'paid' : null),
+ 'type' => $payment[$paymentType]
+ )
);
- }
-
- if (isset($order_payment)) {
- $crmOrder['payments'][] = $order_payment;
} else {
$crmOrder['payments'] = array();
}
diff --git a/retailcrm/lib/RetailcrmTools.php b/retailcrm/lib/RetailcrmTools.php
index 8505dee..95b4205 100644
--- a/retailcrm/lib/RetailcrmTools.php
+++ b/retailcrm/lib/RetailcrmTools.php
@@ -484,6 +484,49 @@ class RetailcrmTools
return array_merge($customer, $address, array('phones' => $customerPhones));
}
+ /**
+ * Compare 'address' and 'phones' fields from crm customer info arrays
+ * @param $customer1
+ * @param $customer2
+ * @return bool true if addresses are equal, false otherwise
+ */
+ public static function isEqualCustomerAddress($customer1, $customer2)
+ {
+ $customer1Phones = isset($customer1['phones']) ? $customer1['phones'] : array();
+ $customer2Phones = isset($customer2['phones']) ? $customer2['phones'] : array();
+
+ $squashedCustomer1Phones = array_filter(array_map(function ($val) {
+ return isset($val['number']) ? $val['number'] : null;
+ }, $customer1Phones));
+ $squashedCustomer2Phones = array_filter(array_map(function ($val) {
+ return isset($val['number']) ? $val['number'] : null;
+ }, $customer2Phones));
+
+ if (count($squashedCustomer1Phones) !== count($squashedCustomer2Phones)
+ || !empty(array_diff_assoc($squashedCustomer1Phones, $squashedCustomer2Phones))
+ ) {
+ return false;
+ }
+
+ $customer1Address = isset($customer1['address']) ? $customer1['address'] : array();
+ $customer2Address = isset($customer2['address']) ? $customer2['address'] : array();
+
+ if (isset($customer1Address['id'])) {
+ unset($customer1Address['id']);
+ }
+ if (isset($customer2Address['id'])) {
+ unset($customer2Address['id']);
+ }
+
+ if (count($customer1Address) !== count($customer2Address)
+ || !empty(array_diff_assoc($customer2Address, $customer1Address))
+ ) {
+ return false;
+ }
+
+ return true;
+ }
+
/**
* http_response_code polyfill
*
diff --git a/retailcrm/retailcrm.php b/retailcrm/retailcrm.php
index bd4b3a9..22312e5 100644
--- a/retailcrm/retailcrm.php
+++ b/retailcrm/retailcrm.php
@@ -656,21 +656,6 @@ class RetailCRM extends Module
public function hookActionOrderEdited($params)
{
if ($this->api) {
- $order = array(
- 'externalId' => $params['order']->id,
- 'firstName' => $params['customer']->firstname,
- 'lastName' => $params['customer']->lastname,
- 'email' => $params['customer']->email,
- 'createdAt' => RetailcrmTools::verifyDate($params['order']->date_add, 'Y-m-d H:i:s')
- ? $params['order']->date_add : date('Y-m-d H:i:s'),
- 'delivery' => array('cost' => $params['order']->total_shipping),
- 'discountManualAmount' => round($params['order']->total_discounts, 2)
- );
-
- if (((float) $order['discountManualAmount']) > ((float) $params['order']->total_paid)) {
- $order['discountManualAmount'] = $params['order']->total_paid;
- }
-
try {
$orderdb = new Order($params['order']->id);
} catch (PrestaShopDatabaseException $exception) {
@@ -681,7 +666,7 @@ class RetailCRM extends Module
RetailcrmLogger::writeNoCaller($exception->getTraceAsString());
}
- $orderCrm = $this->api->ordersGet($order['externalId']);
+ $orderCrm = $this->api->ordersGet($params['order']->id);
if (!($orderCrm instanceof RetailcrmApiResponse) || !$orderCrm->isSuccessful()) {
/** @var Order|\OrderCore $order */
@@ -698,6 +683,21 @@ class RetailCRM extends Module
return false;
}
+ $order = array(
+ 'externalId' => $params['order']->id,
+ 'firstName' => $params['customer']->firstname,
+ 'lastName' => $params['customer']->lastname,
+ 'email' => $params['customer']->email,
+ 'createdAt' => RetailcrmTools::verifyDate($params['order']->date_add, 'Y-m-d H:i:s')
+ ? $params['order']->date_add : date('Y-m-d H:i:s'),
+ 'delivery' => array('cost' => $params['order']->total_shipping),
+ 'discountManualAmount' => round($params['order']->total_discounts, 2)
+ );
+
+ if (((float) $order['discountManualAmount']) > ((float) $params['order']->total_paid)) {
+ $order['discountManualAmount'] = $params['order']->total_paid;
+ }
+
$comment = $orderdb->getFirstMessage();
if ($comment !== false) {
diff --git a/tests/RetailcrmCustomerAddressBuilderTest.php b/tests/RetailcrmCustomerAddressBuilderTest.php
index c660099..91afa51 100644
--- a/tests/RetailcrmCustomerAddressBuilderTest.php
+++ b/tests/RetailcrmCustomerAddressBuilderTest.php
@@ -53,6 +53,34 @@ class RetailcrmCustomerAddressBuilderTest extends RetailcrmTestCase
$this->assertEquals('+7999999999', $addressResult->phone);
}
+ public function testAddressOverriding()
+ {
+ $this->customerAddress = new RetailcrmCustomerAddressBuilder();
+ $this->customerAddress
+ ->setDataCrm($this->getDataBuilder())
+ ->setFirstName('Test')
+ ->setLastName('Test2')
+ ->setPhone('+7999999999')
+ ->build();
+ $addressResult = $this->customerAddress->getData();
+
+ $this->customerAddress
+ ->setCustomerAddress($addressResult)
+ ->setDataCrm($this->getDataBuilderOverride())
+ ->setFirstName('Test override')
+ ->setPhone('+7111111111')
+ ->build();
+
+ $addressResultOverridden = $this->customerAddress->getData();
+ $this->assertEquals('Test override', $addressResultOverridden->firstname);
+ $this->assertEquals('Test2', $addressResultOverridden->lastname);
+ $this->assertEquals(Country::getByIso('RU'), $addressResultOverridden->id_country);
+ $this->assertEquals('г. Москва Override', $addressResultOverridden->city);
+ $this->assertEquals(State::getIdByName('Moscow'), $addressResultOverridden->id_state);
+ $this->assertEquals('444444', $addressResultOverridden->postcode);
+ $this->assertEquals('+7111111111', $addressResultOverridden->phone);
+ }
+
private function getDataBuilder() {
return array(
'id' => 9718,
@@ -63,5 +91,14 @@ class RetailcrmCustomerAddressBuilderTest extends RetailcrmTestCase
'text' => 'MAY'
);
}
+
+ private function getDataBuilderOverride()
+ {
+ return array(
+ 'id' => 9718,
+ 'city' => 'г. Москва Override',
+ 'index' => '444444',
+ );
+ }
}
diff --git a/tests/lib/RetailcrmAddressBuilderTest.php b/tests/lib/RetailcrmAddressBuilderTest.php
index 5cdba27..58bd9d1 100644
--- a/tests/lib/RetailcrmAddressBuilderTest.php
+++ b/tests/lib/RetailcrmAddressBuilderTest.php
@@ -99,6 +99,32 @@ class RetailcrmAddressBuilderTest extends RetailcrmTestCase
$this->assertFieldsNotEmpty($result['delivery']['address'], array('countryIso'));
}
+ /**
+ * @dataProvider getAddressLines
+ */
+ public function testAddressLineConcatenation($addressLine1, $addressLine2, $addressText)
+ {
+ $address = $this->address;
+ $address->address1 = $addressLine1;
+ $address->address2 = $addressLine2;
+
+ $builder = new RetailcrmAddressBuilder();
+ $result = $builder
+ ->setMode(RetailcrmAddressBuilder::MODE_ORDER_DELIVERY)
+ ->setAddress($this->address)
+ ->setIsMain(true)
+ ->setWithExternalId(true)
+ ->setExternalIdSuffix('suffix')
+ ->build()
+ ->getDataArray();
+
+ $this->assertNotEmpty($result);
+ $this->assertArrayHasKey('delivery', $result);
+ $this->assertArrayHasKey('address', $result['delivery']);
+ $this->assertArrayHasKey('text', $result['delivery']['address']);
+ $this->assertEquals($result['delivery']['address']['text'], $addressText);
+ }
+
/**
* Asserts address fields
*
@@ -112,6 +138,27 @@ class RetailcrmAddressBuilderTest extends RetailcrmTestCase
}
}
+ public function getAddressLines()
+ {
+ return array(
+ array(
+ 'addressline 1',
+ 'addressline 2',
+ 'addressline 1' . RetailcrmAddressBuilder::ADDRESS_LINE_DIVIDER . 'addressline 2'
+ ),
+ array(
+ 'addressline 1',
+ '',
+ 'addressline 1'
+ ),
+ array(
+ '',
+ 'addressline 2',
+ RetailcrmAddressBuilder::ADDRESS_LINE_DIVIDER . 'addressline 2'
+ ),
+ );
+ }
+
/**
* Returns address fields names
*
diff --git a/tests/lib/RetailcrmHistoryTest.php b/tests/lib/RetailcrmHistoryTest.php
index 849b3d2..f37d65b 100644
--- a/tests/lib/RetailcrmHistoryTest.php
+++ b/tests/lib/RetailcrmHistoryTest.php
@@ -84,7 +84,7 @@ class RetailcrmHistoryTest extends RetailcrmTestCase
$this->assertEquals(true, RetailcrmHistory::customersHistory());
}
- public function orderCreate($apiMock)
+ private function orderCreate($apiMock)
{
RetailcrmHistory::$default_lang = (int)Configuration::get('PS_LANG_DEFAULT');
RetailcrmHistory::$api = $apiMock;
@@ -100,7 +100,7 @@ class RetailcrmHistoryTest extends RetailcrmTestCase
$this->assertInstanceOf('Order', $order);
}
- public function switchCustomer()
+ private function switchCustomer()
{
RetailcrmHistory::$default_lang = (int)Configuration::get('PS_LANG_DEFAULT');
RetailcrmHistory::$api = $this->apiMock;
@@ -276,6 +276,116 @@ class RetailcrmHistoryTest extends RetailcrmTestCase
RetailcrmHistory::ordersHistory();
}
+
+ public function testOrderAddressUpdate()
+ {
+ $orderId = RetailcrmTestHelper::getMaxOrderId();
+ $crmOrder = $this->getApiOrderAddressUpdate($orderId);
+
+ $this->apiMock->expects($this->any())
+ ->method('ordersHistory')
+ ->willReturn(
+ new RetailcrmApiResponse(
+ '200',
+ json_encode(
+ $this->getHistoryAddressUpdated($orderId)
+ )
+ )
+ );
+
+ $this->apiMock->expects($this->any())
+ ->method('ordersGet')
+ ->willReturn(
+ new RetailcrmApiResponse(
+ '200',
+ json_encode(
+ array(
+ 'order' => $crmOrder
+ )
+ )
+ )
+ );
+
+ RetailcrmHistory::$default_lang = (int)Configuration::get('PS_LANG_DEFAULT');
+ RetailcrmHistory::$api = $this->apiMock;
+
+ $order = new Order($orderId);
+ $idAddress = $order->id_address_delivery;
+
+ RetailcrmHistory::ordersHistory();
+
+ $orderAfter = new Order($orderId);
+ $idAddressAfter = $orderAfter->id_address_delivery;
+
+ if (version_compare(_PS_VERSION_, '1.7.7', '<')) {
+ $this->assertNotEquals($idAddress, $idAddressAfter);
+ }
+
+ $builder = new RetailcrmAddressBuilder();
+ $result = $builder
+ ->setMode(RetailcrmAddressBuilder::MODE_ORDER_DELIVERY)
+ ->setAddressId($idAddressAfter)
+ ->build()
+ ->getDataArray();
+
+ $this->assertEquals($crmOrder['delivery']['address']['countryIso'], $result['countryIso']);
+ unset($crmOrder['delivery']['address']['countryIso']);
+
+ $this->assertEquals($crmOrder['delivery']['address'], $result['delivery']['address']);
+ }
+
+
+ public function testOrderNameUpdate()
+ {
+ $orderId = RetailcrmTestHelper::getMaxOrderId();
+ $crmOrder = $this->getApiOrderNameAndPhoneUpdate($orderId);
+
+ $this->apiMock->expects($this->any())
+ ->method('ordersHistory')
+ ->willReturn(
+ new RetailcrmApiResponse(
+ '200',
+ json_encode(
+ $this->getHistoryNameAndPhoneUpdated($orderId)
+ )
+ )
+ );
+
+ $this->apiMock->expects($this->any())
+ ->method('ordersGet')
+ ->willReturn(
+ new RetailcrmApiResponse(
+ '200',
+ json_encode(
+ array(
+ 'order' => $crmOrder
+ )
+ )
+ )
+ );
+
+ RetailcrmHistory::$default_lang = (int)Configuration::get('PS_LANG_DEFAULT');
+ RetailcrmHistory::$api = $this->apiMock;
+
+ $order = new Order($orderId);
+ $idAddress = $order->id_address_delivery;
+
+ RetailcrmHistory::ordersHistory();
+
+ $orderAfter = new Order($orderId);
+ $idAddressAfter = $orderAfter->id_address_delivery;
+ $addressAfter = new Address($idAddressAfter);
+
+ if (version_compare(_PS_VERSION_, '1.7.7', '<')) {
+ $this->assertNotEquals($idAddress, $idAddressAfter);
+ }
+
+ $this->assertEquals($crmOrder['firstName'], $addressAfter->firstname);
+ $this->assertEquals($crmOrder['lastName'], $addressAfter->lastname);
+ $this->assertEquals($crmOrder['phone'], $addressAfter->phone);
+ }
+
+
private function getHistoryExistOrder()
{
return array(
@@ -394,7 +504,7 @@ class RetailcrmHistoryTest extends RetailcrmTestCase
'id_customer' => 2222,
'index' => '111111',
'countryIso' => 'RU',
- 'region' => 'Test region',
+ 'region' => 'Moscow',
'city' => 'Test',
'text' => 'Test text address'
),
@@ -426,7 +536,7 @@ class RetailcrmHistoryTest extends RetailcrmTestCase
'id_customer' => 2222,
'index' => '111111',
'countryIso' => 'RU',
- 'region' => 'Test region',
+ 'region' => 'Moscow',
'city' => 'Test',
'text' => 'Test text address'
)
@@ -513,7 +623,7 @@ class RetailcrmHistoryTest extends RetailcrmTestCase
'id_customer' => 2222,
'index' => '111111',
'countryIso' => 'RU',
- 'region' => 'Test region',
+ 'region' => 'Moscow',
'city' => 'Test',
'text' => 'Test text address'
),
@@ -554,7 +664,7 @@ class RetailcrmHistoryTest extends RetailcrmTestCase
'id_customer' => 2222,
'index' => '111111',
'countryIso' => 'RU',
- 'region' => 'Test region',
+ 'region' => 'Moscow',
'city' => 'Test',
'text' => 'Test text address'
)
@@ -570,7 +680,7 @@ class RetailcrmHistoryTest extends RetailcrmTestCase
'id_customer' => 2222,
'index' => '111111',
'countryIso' => 'RU',
- 'region' => 'Test region',
+ 'region' => 'Moscow',
'city' => 'Test',
'text' => 'Test text address'
)
@@ -761,5 +871,121 @@ class RetailcrmHistoryTest extends RetailcrmTestCase
)
);
}
+
+ private function getHistoryAddressUpdated($orderId)
+ {
+ return array(
+ 'success' => true,
+ 'history' => array(
+ array(
+ 'id' => 19752,
+ 'createdAt' => '2018-01-01 00:00:00',
+ 'source' => 'api',
+ 'field' => 'delivery_address.city',
+ 'apiKey' => array('current' => false),
+ 'oldValue' => 'Order City old',
+ 'newValue' => 'Order City new',
+ 'order' => array(
+ 'id' => 6025,
+ 'externalId' => (string)$orderId,
+ 'site' => '127.0.0.1:8000',
+ 'status' => 'new'
+ )
+ ),
+ array(
+ 'id' => 19753,
+ 'createdAt' => '2018-01-01 00:00:00',
+ 'source' => 'api',
+ 'field' => 'delivery_address.index',
+ 'apiKey' => array('current' => false),
+ 'oldValue' => '111',
+ 'newValue' => '222',
+ 'order' => array(
+ 'id' => 6025,
+ 'externalId' => (string)$orderId,
+ 'site' => '127.0.0.1:8000',
+ 'status' => 'new'
+ )
+ )
+ ),
+ 'pagination' => array(
+ 'limit' => 20,
+ 'totalCount' => 2,
+ 'currentPage' => 1,
+ 'totalPageCount' => 1
+ )
+ );
+ }
+
+
+ private function getHistoryNameAndPhoneUpdated($orderId)
+ {
+ return array(
+ 'success' => true,
+ 'history' => array(
+ array(
+ 'id' => 19752,
+ 'createdAt' => '2018-01-01 00:00:00',
+ 'source' => 'api',
+ 'field' => 'first_name',
+ 'apiKey' => array('current' => false),
+ 'oldValue' => 'name old',
+ 'newValue' => 'name new',
+ 'order' => array(
+ 'id' => 6025,
+ 'externalId' => (string)$orderId,
+ 'site' => '127.0.0.1:8000',
+ 'status' => 'new'
+ )
+ ),
+ array(
+ 'id' => 19753,
+ 'createdAt' => '2018-01-01 00:00:00',
+ 'source' => 'api',
+ 'field' => 'phone',
+ 'apiKey' => array('current' => false),
+ 'oldValue' => '111',
+ 'newValue' => '222222',
+ 'order' => array(
+ 'id' => 6025,
+ 'externalId' => (string)$orderId,
+ 'site' => '127.0.0.1:8000',
+ 'status' => 'new'
+ )
+ )
+ ),
+ 'pagination' => array(
+ 'limit' => 20,
+ 'totalCount' => 2,
+ 'currentPage' => 1,
+ 'totalPageCount' => 1
+ )
+ );
+ }
+
+ private function getApiOrderAddressUpdate($orderId)
+ {
+ $order = $this->getApiOrder();
+
+ $order['externalId'] = (string)$orderId;
+ $order['delivery']['address']['region'] = 'Buenos Aires'; // todo to get real state id
+ $order['delivery']['address']['city'] = 'Order City new';
+ $order['delivery']['address']['index'] = '222';
+ unset($order['delivery']['address']['id_customer']);
+
+ return $order;
+ }
+
+
+ private function getApiOrderNameAndPhoneUpdate($orderId)
+ {
+ $order = $this->getApiOrder();
+
+ $order['externalId'] = (string)$orderId;
+ $order['firstName'] = 'name new';
+ $order['phone'] = '222222';
+
+ return $order;
+ }
}
diff --git a/tests/lib/RetailcrmToolsTest.php b/tests/lib/RetailcrmToolsTest.php
new file mode 100644
index 0000000..1396468
--- /dev/null
+++ b/tests/lib/RetailcrmToolsTest.php
@@ -0,0 +1,201 @@
+assertEquals($result, RetailcrmTools::isEqualCustomerAddress($address1, $address2));
+ }
+
+ public function equalCustomerAddresses()
+ {
+ return [
+ 'Equal addresses' => [
+ [
+ 'phones' => [
+ ['number' => '111']
+ ],
+ 'address' => [
+ 'index' => '398055',
+ 'city' => 'Order City here',
+ 'text' => 'Address line 1 (client Address 2)',
+ ]
+ ],
+ [
+ 'phones' => [
+ ['number' => '111']
+ ],
+ 'address' => [
+ 'index' => '398055',
+ 'city' => 'Order City here',
+ 'text' => 'Address line 1 (client Address 2)',
+ ]
+ ],
+ true
+ ],
+ 'Changed phone' => [
+ [
+ 'phones' => [
+ ['number' => '222']
+ ],
+ 'address' => [
+ 'index' => '398055',
+ 'city' => 'Order City here',
+ 'text' => 'Address line 1 (client Address 2)',
+ ]
+ ],
+ [
+ 'phones' => [
+ ['number' => '111']
+ ],
+ 'address' => [
+ 'index' => '398055',
+ 'city' => 'Order City here',
+ 'text' => 'Address line 1 (client Address 2)',
+ ]
+ ],
+ false
+ ],
+ 'Changed index' => [
+ [
+ 'phones' => [
+ ['number' => '111']
+ ],
+ 'address' => [
+ 'index' => '222',
+ 'city' => 'Order City here',
+ 'text' => 'Address line 1 (client Address 2)',
+ ]
+ ],
+ [
+ 'phones' => [
+ ['number' => '111']
+ ],
+ 'address' => [
+ 'index' => '398055',
+ 'city' => 'Order City here',
+ 'text' => 'Address line 1 (client Address 2)',
+ ]
+ ],
+ false
+ ],
+ 'Reduced address' => [
+ [
+ 'phones' => [
+ ['number' => '111']
+ ],
+ 'address' => [
+ 'index' => '398055',
+ 'city' => 'Order City here',
+ 'text' => 'Address line 1 (client Address 2)',
+ ]
+ ],
+ [
+ 'phones' => [
+ ['number' => '111']
+ ],
+ 'address' => [
+ 'index' => '398055',
+ ]
+ ],
+ false
+ ],
+ 'Expanded address' => [
+ [
+ 'phones' => [
+ ['number' => '111']
+ ],
+ 'address' => [
+ 'text' => 'Address line 1 (client Address 2)',
+ ]
+ ],
+ [
+ 'phones' => [
+ ['number' => '111']
+ ],
+ 'address' => [
+ 'index' => '398055',
+ 'city' => 'Order City here',
+ 'text' => 'Address line 1 (client Address 2)',
+ ]
+ ],
+ false
+ ],
+ 'Reduced phone' => [
+ [
+ 'phones' => [
+ ['number' => '111',],
+ ['number' => '222',]
+ ],
+ 'address' => [
+ 'index' => '398055',
+ 'city' => 'Order City here',
+ 'text' => 'Address line 1 (client Address 2)',
+ ]
+ ],
+ [
+ 'phones' => [
+ ['number' => '111']
+ ],
+ 'address' => [
+ 'index' => '398055',
+ 'city' => 'Order City here',
+ 'text' => 'Address line 1 (client Address 2)',
+ ]
+ ],
+ false
+ ],
+ 'Expanded phone' => [
+ [
+ 'phones' => [
+ ['number' => '111',],
+ ],
+ 'address' => [
+ 'index' => '398055',
+ 'city' => 'Order City here',
+ 'text' => 'Address line 1 (client Address 2)',
+ ]
+ ],
+ [
+ 'phones' => [
+ ['number' => '222'],
+ ['number' => '111']
+ ],
+ 'address' => [
+ 'index' => '398055',
+ 'city' => 'Order City here',
+ 'text' => 'Address line 1 (client Address 2)',
+ ]
+ ],
+ false
+ ],
+ 'Replaced field' => [
+ [
+ 'phones' => [
+ ['number' => '111',],
+ ],
+ 'address' => [
+ 'index' => '398055',
+ 'city' => 'Order City here',
+ 'text' => 'Address line 1 (client Address 2)',
+ ]
+ ],
+ [
+ 'phones' => [
+ ['number' => '111']
+ ],
+ 'address' => [
+ 'index' => '398055',
+ 'city' => 'Order City here',
+ 'region' => 'Region',
+ ]
+ ],
+ false
+ ],
+ ];
+ }
+}
\ No newline at end of file