Добавление предачи информации о корзинах в систему (#284)
This commit is contained in:
parent
9c5ce1e53b
commit
cf6729cbdc
@ -1,3 +1,6 @@
|
|||||||
|
## 2023-04-06 v.6.3.0
|
||||||
|
- Добавлен функционал передачи данных о содержимом корзины в систему
|
||||||
|
|
||||||
## 2023-03-30 v.6.2.4
|
## 2023-03-30 v.6.2.4
|
||||||
- Добавлен функционал слияния дублей пользователей по истории
|
- Добавлен функционал слияния дублей пользователей по истории
|
||||||
|
|
||||||
|
@ -103,7 +103,8 @@ class RetailcrmClasspathBuilder
|
|||||||
protected static $versionedClasses = [
|
protected static $versionedClasses = [
|
||||||
'RetailCrm\ApiClient' => ['ApiClient.php', 'ApiClient_%s.php'],
|
'RetailCrm\ApiClient' => ['ApiClient.php', 'ApiClient_%s.php'],
|
||||||
'RetailCrmOrder' => ['RetailCrmOrder.php', 'RetailCrmOrder_%s.php'],
|
'RetailCrmOrder' => ['RetailCrmOrder.php', 'RetailCrmOrder_%s.php'],
|
||||||
'RetailCrmHistory' => ['RetailCrmHistory.php', 'RetailCrmHistory_%s.php']
|
'RetailCrmHistory' => ['RetailCrmHistory.php', 'RetailCrmHistory_%s.php'],
|
||||||
|
'RetailCrmCart' => ['RetailCrmCart.php', 'RetailCrmCart_%s.php']
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -116,6 +117,7 @@ class RetailcrmClasspathBuilder
|
|||||||
'RetailCrmOrder_v5.php',
|
'RetailCrmOrder_v5.php',
|
||||||
'RetailCrmHistory_v4.php',
|
'RetailCrmHistory_v4.php',
|
||||||
'RetailCrmHistory_v5.php',
|
'RetailCrmHistory_v5.php',
|
||||||
|
'RetailCrmCart_v5.php',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
namespace RetailCrm;
|
namespace RetailCrm;
|
||||||
|
|
||||||
use InvalidArgumentException;
|
use InvalidArgumentException;
|
||||||
|
use RetailCrm\Exception\CurlException;
|
||||||
use RetailCrm\Http\Client;
|
use RetailCrm\Http\Client;
|
||||||
use RetailCrm\Response\ApiResponse;
|
use RetailCrm\Response\ApiResponse;
|
||||||
|
|
||||||
@ -3127,4 +3128,54 @@ class ApiClient
|
|||||||
$request
|
$request
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $customerId
|
||||||
|
* @param string $site
|
||||||
|
* @param string $by
|
||||||
|
*
|
||||||
|
* @return ApiResponse
|
||||||
|
*/
|
||||||
|
public function cartGet(int $customerId, string $site, string $by = 'externalId'): ApiResponse
|
||||||
|
{
|
||||||
|
$this->checkIdParameter($by);
|
||||||
|
|
||||||
|
return $this->client->makeRequest(
|
||||||
|
'/customer-interaction/' . $site . '/cart/' . $customerId,
|
||||||
|
Client::METHOD_GET,
|
||||||
|
$this->fillSite($site, ['by' => $by])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $cart
|
||||||
|
* @param string $site
|
||||||
|
* @throws CurlException
|
||||||
|
*
|
||||||
|
* @return ApiResponse
|
||||||
|
*/
|
||||||
|
public function cartSet(array $cart, string $site): ApiResponse
|
||||||
|
{
|
||||||
|
return $this->client->makeRequest(
|
||||||
|
'/customer-interaction/' . $site . '/cart/set',
|
||||||
|
Client::METHOD_POST,
|
||||||
|
['cart' => json_encode($cart)]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $cart
|
||||||
|
* @param string $site
|
||||||
|
* @throws CurlException
|
||||||
|
*
|
||||||
|
* @return ApiResponse
|
||||||
|
*/
|
||||||
|
public function cartClear(array $cart, string $site): ApiResponse
|
||||||
|
{
|
||||||
|
return $this->client->makeRequest(
|
||||||
|
'/customer-interaction/' . $site . '/cart/clear',
|
||||||
|
Client::METHOD_POST,
|
||||||
|
['cart' => json_encode($cart)]
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -485,6 +485,11 @@ class RCrmActions
|
|||||||
return self::proxy($api, 'ordersPaymentEdit', $method, [$params, 'externalId', $site]);
|
return self::proxy($api, 'ordersPaymentEdit', $method, [$params, 'externalId', $site]);
|
||||||
case 'customersCorporateEdit':
|
case 'customersCorporateEdit':
|
||||||
return self::proxy($api, 'customersCorporateEdit', $method, [$params, 'externalId', $site]);
|
return self::proxy($api, 'customersCorporateEdit', $method, [$params, 'externalId', $site]);
|
||||||
|
case 'cartGet':
|
||||||
|
return self::proxy($api, $methodApi, $method, [$params, $site, 'externalId']);
|
||||||
|
case 'cartSet':
|
||||||
|
case 'cartClear':
|
||||||
|
return self::proxy($api, $methodApi, $method, [$params, $site]);
|
||||||
default:
|
default:
|
||||||
return self::proxy($api, $methodApi, $method, array($params, $site));
|
return self::proxy($api, $methodApi, $method, array($params, $site));
|
||||||
}
|
}
|
||||||
|
129
intaro.retailcrm/classes/general/cart/RetailCrmCart_v5.php
Normal file
129
intaro.retailcrm/classes/general/cart/RetailCrmCart_v5.php
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Bitrix\Main\Context\Culture;
|
||||||
|
use Bitrix\Sale\Basket;
|
||||||
|
|
||||||
|
IncludeModuleLangFile(__FILE__);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class RetailCrmCart
|
||||||
|
*/
|
||||||
|
class RetailCrmCart
|
||||||
|
{
|
||||||
|
private static string $dateFormat = "Y-m-d H:i:sP";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $arBasket
|
||||||
|
* @throws \Bitrix\Main\ArgumentException
|
||||||
|
* @throws \Bitrix\Main\ObjectPropertyException
|
||||||
|
* @throws \Bitrix\Main\SystemException
|
||||||
|
*
|
||||||
|
* @return array|null
|
||||||
|
*/
|
||||||
|
public static function handlerCart(array $arBasket)
|
||||||
|
{
|
||||||
|
$api = new RetailCrm\ApiClient(RetailcrmConfigProvider::getApiUrl(), RetailcrmConfigProvider::getApiKey());
|
||||||
|
$optionsSitesList = RetailcrmConfigProvider::getSitesList();
|
||||||
|
|
||||||
|
if ($optionsSitesList) {
|
||||||
|
if (array_key_exists($arBasket['LID'], $optionsSitesList) && $optionsSitesList[$arBasket['LID']] !== null) {
|
||||||
|
$site = $optionsSitesList[$arBasket['LID']];
|
||||||
|
|
||||||
|
$api->setSite($site);
|
||||||
|
} else {
|
||||||
|
RCrmActions::eventLog(
|
||||||
|
'RetailCrmCart::handlerCart',
|
||||||
|
'RetailcrmConfigProvider::getSitesList',
|
||||||
|
'Error set site'
|
||||||
|
);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$site = RetailcrmConfigProvider::getSitesAvailable();
|
||||||
|
}
|
||||||
|
|
||||||
|
$crmBasket = RCrmActions::apiMethod($api, 'cartGet', __METHOD__, $arBasket['USER_ID'], $site);
|
||||||
|
|
||||||
|
if (empty($arBasket['BASKET'])) {
|
||||||
|
if (!empty($crmBasket['cart']['items'])) {
|
||||||
|
return RCrmActions::apiMethod(
|
||||||
|
$api,
|
||||||
|
'cartClear',
|
||||||
|
__METHOD__,
|
||||||
|
[
|
||||||
|
'clearedAt' => date(self::$dateFormat),
|
||||||
|
'customer' => [
|
||||||
|
'externalId' => $arBasket['USER_ID']
|
||||||
|
]
|
||||||
|
],
|
||||||
|
$site
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$date = 'createdAt';
|
||||||
|
$items = [];
|
||||||
|
|
||||||
|
foreach ($arBasket['BASKET'] as $itemBitrix) {
|
||||||
|
$item['quantity'] = $itemBitrix['QUANTITY'];
|
||||||
|
$item['price'] = $itemBitrix['PRICE'];
|
||||||
|
$item['createdAt'] = $itemBitrix['DATE_INSERT']->format(self::$dateFormat);
|
||||||
|
$item['updateAt'] = $itemBitrix['DATE_UPDATE']->format(self::$dateFormat);
|
||||||
|
$item['offer']['externalId'] = $itemBitrix['PRODUCT_ID'];
|
||||||
|
$items[] = $item;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($crmBasket['cart']['items'])) {
|
||||||
|
$date = 'updatedAt';
|
||||||
|
}
|
||||||
|
|
||||||
|
return RCrmActions::apiMethod(
|
||||||
|
$api,
|
||||||
|
'cartSet',
|
||||||
|
__METHOD__,
|
||||||
|
[
|
||||||
|
'customer' => [
|
||||||
|
'externalId' => $arBasket['USER_ID'],
|
||||||
|
'site' => $site,
|
||||||
|
$date => date(self::$dateFormat),
|
||||||
|
],
|
||||||
|
'items' => $items,
|
||||||
|
],
|
||||||
|
$site
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws \Bitrix\Main\SystemException
|
||||||
|
*
|
||||||
|
* @return array|null
|
||||||
|
*/
|
||||||
|
public static function getBasketArray($event): ?array
|
||||||
|
{
|
||||||
|
if ($event instanceof Basket) {
|
||||||
|
$obBasket = $event;
|
||||||
|
} elseif ($event instanceof Event) {
|
||||||
|
$obBasket = $event->getParameter('ENTITY');
|
||||||
|
} else {
|
||||||
|
RCrmActions::eventLog('RetailCrmEvent::onChangeBasket', 'getBasketArray', 'event error');
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$arBasket = [
|
||||||
|
'LID' => $obBasket->getSiteId(),
|
||||||
|
];
|
||||||
|
|
||||||
|
$items = $obBasket->getBasket();
|
||||||
|
|
||||||
|
foreach ($items as $item) {
|
||||||
|
$arBasket['BASKET'][] = $item->getFields();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $arBasket;
|
||||||
|
}
|
||||||
|
}
|
@ -98,6 +98,28 @@ class RetailCrmEvent
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* событие изменения корзины
|
||||||
|
*
|
||||||
|
* @param object $event
|
||||||
|
*/
|
||||||
|
public static function onChangeBasket($event)
|
||||||
|
{
|
||||||
|
$id = \Bitrix\Main\Engine\CurrentUser::get()->getId();
|
||||||
|
|
||||||
|
if ($id) {
|
||||||
|
$arBasket = RetailCrmCart::getBasketArray($event);
|
||||||
|
|
||||||
|
if ($arBasket === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$arBasket['USER_ID'] = $id;
|
||||||
|
|
||||||
|
RetailCrmCart::handlerCart($arBasket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $event
|
* @param $event
|
||||||
*
|
*
|
||||||
|
@ -400,6 +400,22 @@ class RetailCrmOrder
|
|||||||
|
|
||||||
if ($send) {
|
if ($send) {
|
||||||
if ($methodApi === 'ordersCreate') {
|
if ($methodApi === 'ordersCreate') {
|
||||||
|
if (isset($arParams['customerCorporate']) && !empty($order['contact']['externalId'])) {
|
||||||
|
$externalId = $order['contact']['externalId'];
|
||||||
|
} else {
|
||||||
|
$externalId = $order['customer']['externalId'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($site === null) {
|
||||||
|
$site = RetailcrmConfigProvider::getSitesAvailable();
|
||||||
|
}
|
||||||
|
|
||||||
|
$crmBasket = RCrmActions::apiMethod($api, 'cartGet', __METHOD__, $externalId, $site);
|
||||||
|
|
||||||
|
if (!empty($crmBasket['cart'])) {
|
||||||
|
$order['isFromCart'] = true;
|
||||||
|
}
|
||||||
|
|
||||||
return $client->createOrder($order, $site);
|
return $client->createOrder($order, $site);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
- Добавлен функционал слияния дублей пользователей по истории
|
- Добавлен функционал передачи данных о содержимом корзины в систему
|
||||||
|
@ -155,6 +155,7 @@ class intaro_retailcrm extends CModule
|
|||||||
include($this->INSTALL_PATH . '/../lib/component/apiclient/traits/customerscorporatetrait.php');
|
include($this->INSTALL_PATH . '/../lib/component/apiclient/traits/customerscorporatetrait.php');
|
||||||
include($this->INSTALL_PATH . '/../lib/component/apiclient/traits/loyaltytrait.php');
|
include($this->INSTALL_PATH . '/../lib/component/apiclient/traits/loyaltytrait.php');
|
||||||
include($this->INSTALL_PATH . '/../lib/component/apiclient/traits/ordertrait.php');
|
include($this->INSTALL_PATH . '/../lib/component/apiclient/traits/ordertrait.php');
|
||||||
|
include($this->INSTALL_PATH . '/../lib/component/apiclient/traits/carttrait.php');
|
||||||
include($this->INSTALL_PATH . '/../classes/general/Http/Client.php');
|
include($this->INSTALL_PATH . '/../classes/general/Http/Client.php');
|
||||||
include($this->INSTALL_PATH . '/../classes/general/Response/ApiResponse.php');
|
include($this->INSTALL_PATH . '/../classes/general/Response/ApiResponse.php');
|
||||||
include($this->INSTALL_PATH . '/../classes/general/RCrmActions.php');
|
include($this->INSTALL_PATH . '/../classes/general/RCrmActions.php');
|
||||||
@ -197,6 +198,7 @@ class intaro_retailcrm extends CModule
|
|||||||
include($this->INSTALL_PATH . '/../classes/general/ApiClient_v5.php');
|
include($this->INSTALL_PATH . '/../classes/general/ApiClient_v5.php');
|
||||||
include($this->INSTALL_PATH . '/../classes/general/order/RetailCrmOrder_v5.php');
|
include($this->INSTALL_PATH . '/../classes/general/order/RetailCrmOrder_v5.php');
|
||||||
include($this->INSTALL_PATH . '/../classes/general/history/RetailCrmHistory_v5.php');
|
include($this->INSTALL_PATH . '/../classes/general/history/RetailCrmHistory_v5.php');
|
||||||
|
include($this->INSTALL_PATH . '/../classes/general/cart/RetailCrmCart_v5.php');
|
||||||
|
|
||||||
$step = (int) $_REQUEST['step'];
|
$step = (int) $_REQUEST['step'];
|
||||||
|
|
||||||
@ -1212,6 +1214,7 @@ class intaro_retailcrm extends CModule
|
|||||||
require_once($this->INSTALL_PATH . '/../classes/general/order/RetailCrmOrder_v5.php');
|
require_once($this->INSTALL_PATH . '/../classes/general/order/RetailCrmOrder_v5.php');
|
||||||
require_once($this->INSTALL_PATH . '/../classes/general/history/RetailCrmHistory_v5.php');
|
require_once($this->INSTALL_PATH . '/../classes/general/history/RetailCrmHistory_v5.php');
|
||||||
require_once($this->INSTALL_PATH . '/../lib/component/constants.php');
|
require_once($this->INSTALL_PATH . '/../lib/component/constants.php');
|
||||||
|
require_once($this->INSTALL_PATH . '/../classes/general/cart/RetailCrmCart_v5.php');
|
||||||
|
|
||||||
$retail_crm_api = new ApiClient($api_host, $api_key);
|
$retail_crm_api = new ApiClient($api_host, $api_key);
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
$arModuleVersion = [
|
$arModuleVersion = [
|
||||||
'VERSION' => '6.2.4',
|
'VERSION' => '6.3.0',
|
||||||
'VERSION_DATE' => '2023-03-30 18:00:00'
|
'VERSION_DATE' => '2023-04-06 17:00:00'
|
||||||
];
|
];
|
||||||
|
@ -102,6 +102,9 @@ $MESS ['UNIVERSAL_ANALYTICS'] = 'Включить интеграцию с UA';
|
|||||||
$MESS ['ID_UA'] = 'Идентификатор отслеживания:';
|
$MESS ['ID_UA'] = 'Идентификатор отслеживания:';
|
||||||
$MESS ['INDEX_UA'] = 'Индекс пользовательского параметра:';
|
$MESS ['INDEX_UA'] = 'Индекс пользовательского параметра:';
|
||||||
|
|
||||||
|
$MESS ['CART'] = 'Передавать состав корзины в систему';
|
||||||
|
$MESS ['CART_DESCRIPTION'] = 'При включенной опции, данные о составе корзины передаются в карточку клиента в системе';
|
||||||
|
|
||||||
$MESS ['API_NOT_FOUND'] = 'Неверная версия API';
|
$MESS ['API_NOT_FOUND'] = 'Неверная версия API';
|
||||||
$MESS ['API_NOT_WORK'] = 'Выбранная версия API не поддерживается';
|
$MESS ['API_NOT_WORK'] = 'Выбранная версия API не поддерживается';
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
namespace Intaro\RetailCrm\Component\ApiClient;
|
namespace Intaro\RetailCrm\Component\ApiClient;
|
||||||
|
|
||||||
use Intaro\RetailCrm\Component\ApiClient\Traits\BaseClientTrait;
|
use Intaro\RetailCrm\Component\ApiClient\Traits\BaseClientTrait;
|
||||||
|
use Intaro\RetailCrm\Component\ApiClient\Traits\CartTrait;
|
||||||
use Intaro\RetailCrm\Component\ApiClient\Traits\CustomersCorporateTrait;
|
use Intaro\RetailCrm\Component\ApiClient\Traits\CustomersCorporateTrait;
|
||||||
use Intaro\RetailCrm\Component\ApiClient\Traits\CustomersTrait;
|
use Intaro\RetailCrm\Component\ApiClient\Traits\CustomersTrait;
|
||||||
use Intaro\RetailCrm\Component\ApiClient\Traits\LoyaltyTrait;
|
use Intaro\RetailCrm\Component\ApiClient\Traits\LoyaltyTrait;
|
||||||
@ -102,6 +103,9 @@ use RetailCrm\Response\ApiResponse;
|
|||||||
* @method ApiResponse statisticUpdate()
|
* @method ApiResponse statisticUpdate()
|
||||||
* @method ApiResponse getSite()
|
* @method ApiResponse getSite()
|
||||||
* @method ApiResponse setSite($site)
|
* @method ApiResponse setSite($site)
|
||||||
|
* @method ApiResponse cartGet(int $id, string $site, string $by = 'externalId')
|
||||||
|
* @method ApiResponse cartSet(array $cart, string $site)
|
||||||
|
* @method ApiResponse cartClear(array $cart, string $site)
|
||||||
*/
|
*/
|
||||||
class ClientAdapter
|
class ClientAdapter
|
||||||
{
|
{
|
||||||
@ -110,6 +114,7 @@ class ClientAdapter
|
|||||||
use CustomersCorporateTrait;
|
use CustomersCorporateTrait;
|
||||||
use LoyaltyTrait;
|
use LoyaltyTrait;
|
||||||
use OrderTrait;
|
use OrderTrait;
|
||||||
|
use CartTrait;
|
||||||
|
|
||||||
/** @var string */
|
/** @var string */
|
||||||
public const ID = 'id';
|
public const ID = 'id';
|
||||||
|
@ -0,0 +1,70 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* PHP version 8.0
|
||||||
|
*
|
||||||
|
* @category Integration
|
||||||
|
* @package Intaro\RetailCrm\Component\ApiClient
|
||||||
|
* @author RetailCRM <integration@retailcrm.ru>
|
||||||
|
* @license MIT
|
||||||
|
* @link http://retailcrm.ru
|
||||||
|
* @see http://retailcrm.ru/docs
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Intaro\RetailCrm\Component\ApiClient\Traits;
|
||||||
|
|
||||||
|
use Intaro\RetailCrm\Component\Json\Deserializer;
|
||||||
|
use Intaro\RetailCrm\Model\Api\Response\Cart\CartGetResponse;
|
||||||
|
use Intaro\RetailCrm\Model\Api\Response\Cart\CartResponse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trait CartTrait
|
||||||
|
* @package Intaro\RetailCrm\Component\ApiClient\Traits
|
||||||
|
*/
|
||||||
|
trait CartTrait
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Получение текущей корзины клиента
|
||||||
|
*
|
||||||
|
* @param int $id
|
||||||
|
* @param string $site
|
||||||
|
* @param string $by
|
||||||
|
*
|
||||||
|
* @return CartGetResponse|null
|
||||||
|
*/
|
||||||
|
public function cartGet(int $id, string $site, string $by = 'externalId'): ?CartGetResponse
|
||||||
|
{
|
||||||
|
$response = $this->client->cartGet($id, $site, $by);
|
||||||
|
|
||||||
|
return Deserializer::deserializeArray($response->getResponseBody(), CartGetResponse::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Создание или перезапись данных корзины
|
||||||
|
*
|
||||||
|
* @param array $cart
|
||||||
|
* @param string $site
|
||||||
|
*
|
||||||
|
* @return CartResponse|null
|
||||||
|
*/
|
||||||
|
public function cartSet(array $cart, string $site): ?CartResponse
|
||||||
|
{
|
||||||
|
$response = $this->client->cartSet($cart, $site);
|
||||||
|
|
||||||
|
return Deserializer::deserializeArray($response->getResponseBody(), CartResponse::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Очистка текущей корзины клиента
|
||||||
|
*
|
||||||
|
* @param array $cart
|
||||||
|
* @param string $site
|
||||||
|
*
|
||||||
|
* @return CartResponse|null
|
||||||
|
*/
|
||||||
|
public function cartClear(array $cart, string $site): ?CartResponse
|
||||||
|
{
|
||||||
|
$response = $this->client->cartClear($cart, $site);
|
||||||
|
|
||||||
|
return Deserializer::deserializeArray($response->getResponseBody(), CartResponse::class);
|
||||||
|
}
|
||||||
|
}
|
@ -1052,6 +1052,14 @@ class ConfigProvider
|
|||||||
COption::SetOptionString(Constants::MODULE_ID, Constants::CRM_DISCOUNT_ROUND, $discount_round);
|
COption::SetOptionString(Constants::MODULE_ID, Constants::CRM_DISCOUNT_ROUND, $discount_round);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setCart($optionCart)
|
||||||
|
{
|
||||||
|
COption::SetOptionString(Constants::MODULE_ID, Constants::CART, $optionCart);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $version
|
* @param string $version
|
||||||
*
|
*
|
||||||
|
@ -95,6 +95,7 @@ class Constants
|
|||||||
public const LOYALTY_FIELDS = 'loyalty_fields';
|
public const LOYALTY_FIELDS = 'loyalty_fields';
|
||||||
public const AGREEMENT_PERSONAL_DATA_CODE = 'AGREEMENT_PERSONAL_DATA_CODE';
|
public const AGREEMENT_PERSONAL_DATA_CODE = 'AGREEMENT_PERSONAL_DATA_CODE';
|
||||||
public const AGREEMENT_LOYALTY_PROGRAM_CODE = 'AGREEMENT_LOYALTY_PROGRAM_CODE';
|
public const AGREEMENT_LOYALTY_PROGRAM_CODE = 'AGREEMENT_LOYALTY_PROGRAM_CODE';
|
||||||
|
public const CART = 'cart';
|
||||||
public const LP_EVENTS = [
|
public const LP_EVENTS = [
|
||||||
['EVENT_NAME' => 'OnSaleOrderSaved', 'FROM_MODULE' => 'sale'],
|
['EVENT_NAME' => 'OnSaleOrderSaved', 'FROM_MODULE' => 'sale'],
|
||||||
['EVENT_NAME' => 'OnSaleComponentOrderResultPrepared', 'FROM_MODULE' => 'sale'],
|
['EVENT_NAME' => 'OnSaleComponentOrderResultPrepared', 'FROM_MODULE' => 'sale'],
|
||||||
|
85
intaro.retailcrm/lib/model/api/cart/cart.php
Normal file
85
intaro.retailcrm/lib/model/api/cart/cart.php
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHP version 8.0
|
||||||
|
*
|
||||||
|
* @category Integration
|
||||||
|
* @package Intaro\RetailCrm\Model\Api
|
||||||
|
* @author RetailCRM <integration@retailcrm.ru>
|
||||||
|
* @license MIT
|
||||||
|
* @link http://retailcrm.ru
|
||||||
|
* @see http://retailcrm.ru/docs
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Intaro\RetailCrm\Model\Api\Cart;
|
||||||
|
|
||||||
|
use Intaro\RetailCrm\Component\Json\Mapping;
|
||||||
|
use Intaro\RetailCrm\Model\Api\AbstractApiModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Cart
|
||||||
|
*
|
||||||
|
* @package Intaro\RetailCrm\Model\Api\Cart
|
||||||
|
*/
|
||||||
|
class Cart extends AbstractApiModel
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Внешний ID корзины
|
||||||
|
*
|
||||||
|
* @var string $externalId
|
||||||
|
*
|
||||||
|
* @Mapping\Type("string")
|
||||||
|
* @Mapping\SerializedName("externalId")
|
||||||
|
*/
|
||||||
|
public $externalId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Дата создания
|
||||||
|
*
|
||||||
|
* @var \DateTime $createdAt
|
||||||
|
*
|
||||||
|
* @Mapping\Type("DateTime<'Y-m-d H:i:s'>")
|
||||||
|
* @Mapping\SerializedName("createdAt")
|
||||||
|
*/
|
||||||
|
public $createdAt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Дата последнего обновления корзины
|
||||||
|
*
|
||||||
|
* @var \DateTime $updatedAt
|
||||||
|
*
|
||||||
|
* @Mapping\Type("DateTime<'Y-m-d H:i:s'>")
|
||||||
|
* @Mapping\SerializedName("updatedAt")
|
||||||
|
*/
|
||||||
|
public $updatedAt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Дата становления брошенной корзиной
|
||||||
|
*
|
||||||
|
* @var \DateTime $droppedAt
|
||||||
|
*
|
||||||
|
* @Mapping\Type("DateTime<'Y-m-d H:i:s'>")
|
||||||
|
* @Mapping\SerializedName("droppedAt")
|
||||||
|
*/
|
||||||
|
public $droppedAt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ссылка
|
||||||
|
*
|
||||||
|
* @var string $link
|
||||||
|
*
|
||||||
|
* @Mapping\Type("string")
|
||||||
|
* @Mapping\SerializedName("link")
|
||||||
|
*/
|
||||||
|
public $link;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Элементы корзины
|
||||||
|
*
|
||||||
|
* @var array $items
|
||||||
|
*
|
||||||
|
* @Mapping\Type("array<Intaro\RetailCrm\Model\Api\Cart\CartItem>")
|
||||||
|
* @Mapping\SerializedName("items")
|
||||||
|
*/
|
||||||
|
public $items;
|
||||||
|
}
|
85
intaro.retailcrm/lib/model/api/cart/cartitem.php
Normal file
85
intaro.retailcrm/lib/model/api/cart/cartitem.php
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHP version 8.0
|
||||||
|
*
|
||||||
|
* @category Integration
|
||||||
|
* @package Intaro\RetailCrm\Model\Api
|
||||||
|
* @author RetailCRM <integration@retailcrm.ru>
|
||||||
|
* @license MIT
|
||||||
|
* @link http://retailcrm.ru
|
||||||
|
* @see http://retailcrm.ru/docs
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Intaro\RetailCrm\Model\Api\Cart;
|
||||||
|
|
||||||
|
use Intaro\RetailCrm\Component\Json\Mapping;
|
||||||
|
use Intaro\RetailCrm\Model\Api\AbstractApiModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class CartItem
|
||||||
|
*
|
||||||
|
* @package Intaro\RetailCrm\Model\Api\Cart
|
||||||
|
*/
|
||||||
|
class CartItem extends AbstractApiModel
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* ID элемента корзины
|
||||||
|
*
|
||||||
|
* @var int $id
|
||||||
|
*
|
||||||
|
* @Mapping\Type("integer")
|
||||||
|
* @Mapping\SerializedName("id")
|
||||||
|
*/
|
||||||
|
public $id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Количество
|
||||||
|
*
|
||||||
|
* @var $quantity
|
||||||
|
*
|
||||||
|
* @Mapping\Type("float")
|
||||||
|
* @Mapping\SerializedName("quantity")
|
||||||
|
*/
|
||||||
|
public $quantity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Цена
|
||||||
|
*
|
||||||
|
* @var float $price
|
||||||
|
*
|
||||||
|
* @Mapping\Type("float")
|
||||||
|
* @Mapping\SerializedName("price")
|
||||||
|
*/
|
||||||
|
public $price;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Дата добавления в корзину
|
||||||
|
*
|
||||||
|
* @var \DateTime $createdAt
|
||||||
|
*
|
||||||
|
* @Mapping\Type("DateTime<'Y-m-d H:i:s'>")
|
||||||
|
* @Mapping\SerializedName("createdAt")
|
||||||
|
*/
|
||||||
|
public $createdAt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Дата обновления элемента корзины
|
||||||
|
*
|
||||||
|
* @var \DateTime $updatedAt
|
||||||
|
*
|
||||||
|
* @Mapping\Type("DateTime<'Y-m-d H:i:s'>")
|
||||||
|
* @Mapping\SerializedName("updatedAt")
|
||||||
|
*/
|
||||||
|
public $updatedAt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Торговое предложение
|
||||||
|
*
|
||||||
|
* @var array $offer
|
||||||
|
*
|
||||||
|
* @Mapping\Type("array")
|
||||||
|
* @Mapping\SerializedName("offer")
|
||||||
|
*/
|
||||||
|
public $offer;
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHP version 8.0
|
||||||
|
*
|
||||||
|
* @category Integration
|
||||||
|
* @package Intaro\RetailCrm\Model\Api\Response
|
||||||
|
* @author RetailCRM <integration@retailcrm.ru>
|
||||||
|
* @license MIT
|
||||||
|
* @link http://retailcrm.ru
|
||||||
|
* @see http://retailcrm.ru/docs
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Intaro\RetailCrm\Model\Api\Response\Cart;
|
||||||
|
|
||||||
|
use Intaro\RetailCrm\Model\Api\Cart\Cart;
|
||||||
|
use Intaro\RetailCrm\Model\Api\Response\AbstractApiResponseModel;
|
||||||
|
use Intaro\RetailCrm\Component\Json\Mapping;
|
||||||
|
|
||||||
|
class CartGetResponse extends AbstractApiResponseModel
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Результат запроса (успешный/неуспешный)
|
||||||
|
*
|
||||||
|
* @var bool $success
|
||||||
|
*
|
||||||
|
* @Mapping\Type("boolean")
|
||||||
|
* @Mapping\SerializedName("success")
|
||||||
|
*/
|
||||||
|
public $success;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Cart $cart
|
||||||
|
*
|
||||||
|
* @Mapping\Type("Intaro\RetailCrm\Model\Api\Cart\Cart")
|
||||||
|
* @Mapping\SerializedName("cart")
|
||||||
|
*/
|
||||||
|
public $cart;
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHP version 8.0
|
||||||
|
*
|
||||||
|
* @category Integration
|
||||||
|
* @package Intaro\RetailCrm\Model\Api\Response
|
||||||
|
* @author RetailCRM <integration@retailcrm.ru>
|
||||||
|
* @license MIT
|
||||||
|
* @link http://retailcrm.ru
|
||||||
|
* @see http://retailcrm.ru/docs
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Intaro\RetailCrm\Model\Api\Response\Cart;
|
||||||
|
|
||||||
|
use Intaro\RetailCrm\Component\Json\Mapping;
|
||||||
|
use Intaro\RetailCrm\Model\Api\Response\AbstractApiResponseModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class CartResponse
|
||||||
|
* @package Intaro\RetailCrm\Model\Api\Response
|
||||||
|
*/
|
||||||
|
class CartResponse extends AbstractApiResponseModel
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var bool
|
||||||
|
*
|
||||||
|
* @Mapping\Type("bool")
|
||||||
|
* @Mapping\SerializedName("success")
|
||||||
|
*/
|
||||||
|
public $success;
|
||||||
|
}
|
@ -62,6 +62,7 @@ $CRM_ADDRESS_OPTIONS = 'address_options';
|
|||||||
$CRM_DIMENSIONS = 'order_dimensions';
|
$CRM_DIMENSIONS = 'order_dimensions';
|
||||||
$PROTOCOL = 'protocol';
|
$PROTOCOL = 'protocol';
|
||||||
$CRM_PURCHASE_PRICE_NULL = 'purchasePrice_null';
|
$CRM_PURCHASE_PRICE_NULL = 'purchasePrice_null';
|
||||||
|
$CRM_CART = 'cart';
|
||||||
|
|
||||||
if (!CModule::IncludeModule('intaro.retailcrm') || !CModule::IncludeModule('sale') || !CModule::IncludeModule('iblock') || !CModule::IncludeModule('catalog')) {
|
if (!CModule::IncludeModule('intaro.retailcrm') || !CModule::IncludeModule('sale') || !CModule::IncludeModule('iblock') || !CModule::IncludeModule('catalog')) {
|
||||||
return;
|
return;
|
||||||
@ -319,6 +320,20 @@ if (isset($_POST['Update']) && ($_POST['Update'] === 'Y')) {
|
|||||||
RegisterModuleDependences('sale', 'OnSaleOrderDeleted', $mid, 'RetailCrmEvent', "orderDelete");
|
RegisterModuleDependences('sale', 'OnSaleOrderDeleted', $mid, 'RetailCrmEvent', "orderDelete");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$optionCart = COption::GetOptionString($mid, $CRM_CART, 'N');
|
||||||
|
|
||||||
|
$cart = htmlspecialchars(trim($_POST['cart']));
|
||||||
|
|
||||||
|
if ($cart != $optionCart) {
|
||||||
|
if ($cart === 'Y') {
|
||||||
|
$optionCart = 'Y';
|
||||||
|
RegisterModuleDependences('sale', 'OnSaleBasketSaved', $mid, 'RetailCrmEvent', 'onChangeBasket');
|
||||||
|
} else {
|
||||||
|
$optionCart = 'N';
|
||||||
|
UnRegisterModuleDependences('sale', 'OnSaleBasketSaved', $mid, 'RetailCrmEvent', 'onChangeBasket');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$orderPropsArr = [];
|
$orderPropsArr = [];
|
||||||
foreach ($orderTypesList as $orderType) {
|
foreach ($orderTypesList as $orderType) {
|
||||||
$propsCount = 0;
|
$propsCount = 0;
|
||||||
@ -757,6 +772,7 @@ if (isset($_POST['Update']) && ($_POST['Update'] === 'Y')) {
|
|||||||
);
|
);
|
||||||
RetailcrmConfigProvider::setSendPaymentAmount($sendPaymentAmount);
|
RetailcrmConfigProvider::setSendPaymentAmount($sendPaymentAmount);
|
||||||
RetailCrmConfigProvider::setDiscountRound($discount_round);
|
RetailCrmConfigProvider::setDiscountRound($discount_round);
|
||||||
|
RetailcrmConfigProvider::setCart($optionCart);
|
||||||
COption::SetOptionString(
|
COption::SetOptionString(
|
||||||
$mid,
|
$mid,
|
||||||
$CRM_PURCHASE_PRICE_NULL,
|
$CRM_PURCHASE_PRICE_NULL,
|
||||||
@ -924,6 +940,8 @@ if (isset($_POST['Update']) && ($_POST['Update'] === 'Y')) {
|
|||||||
$optionsOrderDimensions = COption::GetOptionString($mid, $CRM_DIMENSIONS, 'N');
|
$optionsOrderDimensions = COption::GetOptionString($mid, $CRM_DIMENSIONS, 'N');
|
||||||
$addressOptions = unserialize(COption::GetOptionString($mid, $CRM_ADDRESS_OPTIONS, 0));
|
$addressOptions = unserialize(COption::GetOptionString($mid, $CRM_ADDRESS_OPTIONS, 0));
|
||||||
|
|
||||||
|
$optionCart = COption::GetOptionString($mid, $CRM_CART, 'N');
|
||||||
|
|
||||||
//loyalty program options
|
//loyalty program options
|
||||||
$loyaltyProgramToggle = ConfigProvider::getLoyaltyProgramStatus();
|
$loyaltyProgramToggle = ConfigProvider::getLoyaltyProgramStatus();
|
||||||
|
|
||||||
@ -1176,6 +1194,16 @@ if (isset($_POST['Update']) && ($_POST['Update'] === 'Y')) {
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('.r-ac-button label').change(function() {
|
||||||
|
if ($(this).find('input').is(':checked') === true) {
|
||||||
|
$('tr.r-ac').show('slow');
|
||||||
|
} else if ($(this).find('input').is(':checked') === false) {
|
||||||
|
$('tr.r-ac').hide('slow');
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
})
|
||||||
|
|
||||||
$('.r-cc-button label').change(function() {
|
$('.r-cc-button label').change(function() {
|
||||||
if ($(this).find('input').is(':checked') === true) {
|
if ($(this).find('input').is(':checked') === true) {
|
||||||
$('tr.r-cc').show('slow');
|
$('tr.r-cc').show('slow');
|
||||||
@ -2328,6 +2356,22 @@ if (isset($_POST['Update']) && ($_POST['Update'] === 'Y')) {
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
|
<tr class="heading r-ac-button">
|
||||||
|
<td colspan="2" class="option-other-heading">
|
||||||
|
<b>
|
||||||
|
<label><input class="addr" type="checkbox" name="cart" value="Y" <?php if ($optionCart === 'Y') echo "checked"; ?>><?php echo GetMessage('CART'); ?></label>
|
||||||
|
</b>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr class="r-ac" <?php if ($optionCart !== 'Y') {
|
||||||
|
echo 'style="display: none;"';
|
||||||
|
} ?>>
|
||||||
|
<td class="option-head" colspan="2">
|
||||||
|
<b><?php echo GetMessage('CART_DESCRIPTION'); ?></b>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
<tr class="heading r-cc-button">
|
<tr class="heading r-cc-button">
|
||||||
<td colspan="2" class="option-other-heading">
|
<td colspan="2" class="option-other-heading">
|
||||||
<b>
|
<b>
|
||||||
|
@ -168,6 +168,60 @@ class RetailCrmEventTest extends PHPUnit\Framework\TestCase
|
|||||||
$this->assertEquals(true, $GLOBALS['ORDER_DELETE_USER_ADMIN']);
|
$this->assertEquals(true, $GLOBALS['ORDER_DELETE_USER_ADMIN']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @runInSeparateProcess
|
||||||
|
* @preserveGlobalState disabled
|
||||||
|
*/
|
||||||
|
public function testSetBasket(): void
|
||||||
|
{
|
||||||
|
$arBasket = $this->getBasket();
|
||||||
|
$crmBasket = $this->getCrmCart();
|
||||||
|
|
||||||
|
$actionsMock = Mockery::mock('alias:' . RCrmActions::class);
|
||||||
|
|
||||||
|
$actionsMock->shouldReceive('apiMethod')->withAnyArgs()->andReturn($crmBasket, ['success' => true]);
|
||||||
|
|
||||||
|
$result = RetailCrmCart::handlerCart($arBasket);
|
||||||
|
|
||||||
|
self::assertTrue($result['success']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @runInSeparateProcess
|
||||||
|
* @preserveGlobalState disabled
|
||||||
|
*/
|
||||||
|
public function testClearBasket(): void
|
||||||
|
{
|
||||||
|
$arBasket = ['LID' => 's1', 'USER_ID' => '1'];
|
||||||
|
$crmBasket = $this->getCrmCart();
|
||||||
|
|
||||||
|
$actionsMock = Mockery::mock('alias:' . RCrmActions::class);
|
||||||
|
|
||||||
|
$actionsMock->shouldReceive('apiMethod')->withAnyArgs()->andReturn($crmBasket, ['success' => true]);
|
||||||
|
|
||||||
|
$result = RetailCrmCart::handlerCart($arBasket);
|
||||||
|
|
||||||
|
self::assertTrue($result['success']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @runInSeparateProcess
|
||||||
|
* @preserveGlobalState disabled
|
||||||
|
*/
|
||||||
|
public function testIgnoreChangeBasket()
|
||||||
|
{
|
||||||
|
$arBasket = ['LID' => 's1', 'USER_ID' => '1'];
|
||||||
|
$crmBasket = [];
|
||||||
|
|
||||||
|
$actionsMock = Mockery::mock('alias:' . RCrmActions::class);
|
||||||
|
|
||||||
|
$actionsMock->shouldReceive('apiMethod')->withAnyArgs()->andReturn($crmBasket);
|
||||||
|
|
||||||
|
$result = RetailCrmCart::handlerCart($arBasket);
|
||||||
|
|
||||||
|
self::assertNull($result);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
@ -238,4 +292,43 @@ class RetailCrmEventTest extends PHPUnit\Framework\TestCase
|
|||||||
$GLOBALS['RETAILCRM_ORDER_OLD_EVENT'] = true;
|
$GLOBALS['RETAILCRM_ORDER_OLD_EVENT'] = true;
|
||||||
$GLOBALS['RETAILCRM_ORDER_DELETE'] = false;
|
$GLOBALS['RETAILCRM_ORDER_DELETE'] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getBasket(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'LID' => 's1',
|
||||||
|
'USER_ID' => '1',
|
||||||
|
'BASKET' => [
|
||||||
|
[
|
||||||
|
'QUANTITY' => 2,
|
||||||
|
'PRICE' => 100,
|
||||||
|
'DATE_INSERT' => new DateTime('now'),
|
||||||
|
'DATE_UPDATE' => new DateTime('now'),
|
||||||
|
'PRODUCT_ID' => '10'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'QUANTITY' => 1,
|
||||||
|
'PRICE' => 300,
|
||||||
|
'DATE_INSERT' => new DateTime('now'),
|
||||||
|
'DATE_UPDATE' => new DateTime('now'),
|
||||||
|
'PRODUCT_ID' => '2'
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getCrmCart(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'cart' => [
|
||||||
|
'items' => 'items'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user