diff --git a/CHANGELOG.md b/CHANGELOG.md index 467fbd13..0e3840bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,7 @@ -## 2023-08-31 v.6.4.4 +## 2023-09-01 v.6.4.5 +- Удалена поддержка API V4 + +## 2023-09-01 v.6.4.4 - Исправлены ошибки при работе с программой лояльности ## 2023-08-29 v.6.4.3 diff --git a/doc/Module settings/Customization.md b/doc/Module settings/Customization.md index bb442f85..d393c324 100644 --- a/doc/Module settings/Customization.md +++ b/doc/Module settings/Customization.md @@ -17,11 +17,8 @@ * RetailCrmCollector.php * RetailCrmUa.php * RetailCrmEvent.php -* RetailCrmHistory_v4.php * RetailCrmHistory_v5.php -* RetailCrmOrder_v4.php * RetailCrmOrder_v5.php -* ApiClient_v4.php * ApiClient_v5.php С версии 6.3.19 доступна кастомизация ICML, файлы которого расположены в модуле по пути `lib/icml`: diff --git a/intaro.retailcrm/RetailcrmClasspathBuilder.php b/intaro.retailcrm/RetailcrmClasspathBuilder.php index 23a4291f..31c2b90d 100644 --- a/intaro.retailcrm/RetailcrmClasspathBuilder.php +++ b/intaro.retailcrm/RetailcrmClasspathBuilder.php @@ -129,11 +129,8 @@ class RetailcrmClasspathBuilder */ protected static $ignoredClasses = [ 'classes' => [ - 'ApiClient_v4.php', 'ApiClient_v5.php', - 'RetailCrmOrder_v4.php', 'RetailCrmOrder_v5.php', - 'RetailCrmHistory_v4.php', 'RetailCrmHistory_v5.php', 'RetailCrmCart_v5.php', ], diff --git a/intaro.retailcrm/classes/general/ApiClient_v4.php b/intaro.retailcrm/classes/general/ApiClient_v4.php deleted file mode 100644 index 280950d9..00000000 --- a/intaro.retailcrm/classes/general/ApiClient_v4.php +++ /dev/null @@ -1,1838 +0,0 @@ -client = new Client($url, array('apiKey' => $apiKey)); - $this->siteCode = $site; - } - - /** - * Returns users list - * - * @param array $filter - * @param null $page - * @param null $limit - * - * @throws \RetailCrm\Exception\InvalidJsonException - * @throws \RetailCrm\Exception\CurlException - * @throws \InvalidArgumentException - * - * @return ApiResponse - */ - public function usersList(array $filter = array(), $page = null, $limit = null) - { - $parameters = array(); - - if (count($filter)) { - $parameters['filter'] = $filter; - } - if (null !== $page) { - $parameters['page'] = (int) $page; - } - if (null !== $limit) { - $parameters['limit'] = (int) $limit; - } - - return $this->client->makeRequest( - '/users', - Client::METHOD_GET, - $parameters - ); - } - - /** - * Get user groups - * - * @param null $page - * @param null $limit - * - * @throws \RetailCrm\Exception\InvalidJsonException - * @throws \RetailCrm\Exception\CurlException - * - * @return ApiResponse - */ - public function usersGroups($page = null, $limit = null) - { - $parameters = array(); - - if (null !== $page) { - $parameters['page'] = (int) $page; - } - if (null !== $limit) { - $parameters['limit'] = (int) $limit; - } - - return $this->client->makeRequest( - '/user-groups', - Client::METHOD_GET, - $parameters - ); - } - - /** - * Returns user data - * - * @param integer $id user ID - * - * @throws \RetailCrm\Exception\InvalidJsonException - * @throws \RetailCrm\Exception\CurlException - * @throws \InvalidArgumentException - * - * @return ApiResponse - */ - public function usersGet($id) - { - return $this->client->makeRequest("/users/$id", Client::METHOD_GET); - } - - /** - * Returns filtered orders list - * - * @param array $filter (default: array()) - * @param int $page (default: null) - * @param int $limit (default: null) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function ordersList(array $filter = array(), $page = null, $limit = null) - { - $parameters = array(); - - if (count($filter)) { - $parameters['filter'] = $filter; - } - if (null !== $page) { - $parameters['page'] = (int) $page; - } - if (null !== $limit) { - $parameters['limit'] = (int) $limit; - } - - return $this->client->makeRequest( - '/orders', - Client::METHOD_GET, - $parameters - ); - } - - /** - * Create a order - * - * @param array $order order data - * @param string $site (default: null) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function ordersCreate(array $order, $site = null) - { - if (!count($order)) { - throw new \InvalidArgumentException( - 'Parameter `order` must contains a data' - ); - } - - return $this->client->makeRequest( - '/orders/create', - Client::METHOD_POST, - $this->fillSite($site, array('order' => json_encode($order))) - ); - } - - /** - * Save order IDs' (id and externalId) association in the CRM - * - * @param array $ids order identificators - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function ordersFixExternalIds(array $ids) - { - if (! count($ids)) { - throw new \InvalidArgumentException( - 'Method parameter must contains at least one IDs pair' - ); - } - - return $this->client->makeRequest( - '/orders/fix-external-ids', - Client::METHOD_POST, - array('orders' => json_encode($ids) - ) - ); - } - - /** - * Returns statuses of the orders - * - * @param array $ids (default: array()) - * @param array $externalIds (default: array()) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function ordersStatuses(array $ids = array(), array $externalIds = array()) - { - $parameters = array(); - - if (count($ids)) { - $parameters['ids'] = $ids; - } - if (count($externalIds)) { - $parameters['externalIds'] = $externalIds; - } - - return $this->client->makeRequest( - '/orders/statuses', - Client::METHOD_GET, - $parameters - ); - } - - /** - * Upload array of the orders - * - * @param array $orders array of orders - * @param string $site (default: null) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function ordersUpload(array $orders, $site = null) - { - if (!count($orders)) { - throw new \InvalidArgumentException( - 'Parameter `orders` must contains array of the orders' - ); - } - - return $this->client->makeRequest( - '/orders/upload', - Client::METHOD_POST, - $this->fillSite($site, array('orders' => json_encode($orders))) - ); - } - - /** - * Get order by id or externalId - * - * @param string $id order identificator - * @param string $by (default: 'externalId') - * @param string $site (default: null) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function ordersGet($id, $by = 'externalId', $site = null) - { - $this->checkIdParameter($by); - - return $this->client->makeRequest( - "/orders/$id", - Client::METHOD_GET, - $this->fillSite($site, array('by' => $by)) - ); - } - - /** - * Edit a order - * - * @param array $order order data - * @param string $by (default: 'externalId') - * @param string $site (default: null) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function ordersEdit(array $order, $by = 'externalId', $site = null) - { - if (!count($order)) { - throw new \InvalidArgumentException( - 'Parameter `order` must contains a data' - ); - } - - $this->checkIdParameter($by); - - if (!array_key_exists($by, $order)) { - throw new \InvalidArgumentException( - sprintf('Order array must contain the "%s" parameter.', $by) - ); - } - - return $this->client->makeRequest( - sprintf('/orders/%s/edit', $order[$by]), - Client::METHOD_POST, - $this->fillSite( - $site, - array('order' => json_encode($order), 'by' => $by) - ) - ); - } - - /** - * Get orders history - * @param array $filter - * @param int $limit - * - * @return ApiResponse - */ - public function ordersHistory(array $filter = [], int $limit = 100) - { - return $this->client->makeRequest( - '/orders/history', - Client::METHOD_GET, - ['filter' => $filter, 'limit' => $limit] - ); - } - - /** - * Returns filtered customers list - * - * @param array $filter (default: array()) - * @param int $page (default: null) - * @param int $limit (default: null) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function customersList(array $filter = array(), $page = null, $limit = null) - { - $parameters = array(); - - if (count($filter)) { - $parameters['filter'] = $filter; - } - if (null !== $page) { - $parameters['page'] = (int) $page; - } - if (null !== $limit) { - $parameters['limit'] = (int) $limit; - } - - return $this->client->makeRequest( - '/customers', - Client::METHOD_GET, - $parameters - ); - } - - /** - * Create a customer - * - * @param array $customer customer data - * @param string $site (default: null) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function customersCreate(array $customer, $site = null) - { - if (! count($customer)) { - throw new \InvalidArgumentException( - 'Parameter `customer` must contains a data' - ); - } - - return $this->client->makeRequest( - '/customers/create', - Client::METHOD_POST, - $this->fillSite($site, array('customer' => json_encode($customer))) - ); - } - - /** - * Save customer IDs' (id and externalId) association in the CRM - * - * @param array $ids ids mapping - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function customersFixExternalIds(array $ids) - { - if (! count($ids)) { - throw new \InvalidArgumentException( - 'Method parameter must contains at least one IDs pair' - ); - } - - return $this->client->makeRequest( - '/customers/fix-external-ids', - Client::METHOD_POST, - array('customers' => json_encode($ids)) - ); - } - - /** - * Upload array of the customers - * - * @param array $customers array of customers - * @param string $site (default: null) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function customersUpload(array $customers, $site = null) - { - if (! count($customers)) { - throw new \InvalidArgumentException( - 'Parameter `customers` must contains array of the customers' - ); - } - - return $this->client->makeRequest( - '/customers/upload', - Client::METHOD_POST, - $this->fillSite($site, array('customers' => json_encode($customers))) - ); - } - - /** - * Get customer by id or externalId - * - * @param string $id customer identificator - * @param string $by (default: 'externalId') - * @param string $site (default: null) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function customersGet($id, $by = 'externalId', $site = null) - { - $this->checkIdParameter($by); - - return $this->client->makeRequest( - "/customers/$id", - Client::METHOD_GET, - $this->fillSite($site, array('by' => $by)) - ); - } - - /** - * Edit a customer - * - * @param array $customer customer data - * @param string $by (default: 'externalId') - * @param string $site (default: null) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function customersEdit(array $customer, $by = 'externalId', $site = null) - { - if (!count($customer)) { - throw new \InvalidArgumentException( - 'Parameter `customer` must contains a data' - ); - } - - $this->checkIdParameter($by); - - if (!array_key_exists($by, $customer)) { - throw new \InvalidArgumentException( - sprintf('Customer array must contain the "%s" parameter.', $by) - ); - } - - return $this->client->makeRequest( - sprintf('/customers/%s/edit', $customer[$by]), - Client::METHOD_POST, - $this->fillSite( - $site, - array('customer' => json_encode($customer), 'by' => $by) - ) - ); - } - - /** - * Get customers history - * - * @param array $filter - * @param int $limit - * - * @return ApiResponse - */ - public function customersHistory(array $filter = [], int $limit = 100) - { - return $this->client->makeRequest( - '/customers/history', - Client::METHOD_GET, - ['filter' => $filter, 'limit' => $limit] - ); - } - - /** - * Get orders assembly list - * - * @param array $filter (default: array()) - * @param int $page (default: null) - * @param int $limit (default: null) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function ordersPacksList(array $filter = array(), $page = null, $limit = null) - { - $parameters = array(); - - if (count($filter)) { - $parameters['filter'] = $filter; - } - if (null !== $page) { - $parameters['page'] = (int) $page; - } - if (null !== $limit) { - $parameters['limit'] = (int) $limit; - } - - return $this->client->makeRequest( - '/orders/packs', - Client::METHOD_GET, - $parameters - ); - } - - /** - * Create orders assembly - * - * @param array $pack pack data - * @param string $site (default: null) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function ordersPacksCreate(array $pack, $site = null) - { - if (!count($pack)) { - throw new \InvalidArgumentException( - 'Parameter `pack` must contains a data' - ); - } - - return $this->client->makeRequest( - '/orders/packs/create', - Client::METHOD_POST, - $this->fillSite($site, array('pack' => json_encode($pack))) - ); - } - - /** - * Get orders assembly history - * - * @param array $filter - * @param int $limit - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function ordersPacksHistory(array $filter = [], int $limit = 100) - { - return $this->client->makeRequest( - '/orders/packs/history', - Client::METHOD_GET, - ['filter' => $filter, 'limit' => $limit] - ); - } - - /** - * Get orders assembly by id - * - * @param string $id pack identificator - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function ordersPacksGet($id) - { - if (empty($id)) { - throw new \InvalidArgumentException('Parameter `id` must be set'); - } - - return $this->client->makeRequest( - "/orders/packs/$id", - Client::METHOD_GET - ); - } - - /** - * Delete orders assembly by id - * - * @param string $id pack identificator - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function ordersPacksDelete($id) - { - if (empty($id)) { - throw new \InvalidArgumentException('Parameter `id` must be set'); - } - - return $this->client->makeRequest( - sprintf('/orders/packs/%s/delete', $id), - Client::METHOD_POST - ); - } - - /** - * Edit orders assembly - * - * @param array $pack pack data - * @param string $site (default: null) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function ordersPacksEdit(array $pack, $site = null) - { - if (!count($pack) || empty($pack['id'])) { - throw new \InvalidArgumentException( - 'Parameter `pack` must contains a data & pack `id` must be set' - ); - } - - return $this->client->makeRequest( - sprintf('/orders/packs/%s/edit', $pack['id']), - Client::METHOD_POST, - $this->fillSite($site, array('pack' => json_encode($pack))) - ); - } - - /** - * Get purchace prices & stock balance - * - * @param array $filter (default: array()) - * @param int $page (default: null) - * @param int $limit (default: null) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function storeInventories(array $filter = array(), $page = null, $limit = null) - { - $parameters = array(); - - if (count($filter)) { - $parameters['filter'] = $filter; - } - if (null !== $page) { - $parameters['page'] = (int) $page; - } - if (null !== $limit) { - $parameters['limit'] = (int) $limit; - } - - return $this->client->makeRequest( - '/store/inventories', - Client::METHOD_GET, - $parameters - ); - } - - /** - * Get store settings - * - * @param string $code get settings code - * - * @return ApiResponse - * @throws \RetailCrm\Exception\InvalidJsonException - * @throws \RetailCrm\Exception\CurlException - * @throws \InvalidArgumentException - * - * @return ApiResponse - */ - public function storeSettingsGet($code) - { - if (empty($code)) { - throw new \InvalidArgumentException('Parameter `code` must be set'); - } - - return $this->client->makeRequest( - "/store/setting/$code", - Client::METHOD_GET - ); - } - - /** - * Edit store configuration - * - * @param array $configuration - * - * @throws \RetailCrm\Exception\InvalidJsonException - * @throws \RetailCrm\Exception\CurlException - * @throws \InvalidArgumentException - * - * @return ApiResponse - */ - public function storeSettingsEdit(array $configuration) - { - if (!count($configuration) || empty($configuration['code'])) { - throw new \InvalidArgumentException( - 'Parameter `configuration` must contains a data & configuration `code` must be set' - ); - } - - return $this->client->makeRequest( - sprintf('/store/setting/%s/edit', $configuration['code']), - Client::METHOD_POST, - array('configuration' => json_encode($configuration)) - ); - } - - /** - * Upload store inventories - * - * @param array $offers offers data - * @param string $site (default: null) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function storeInventoriesUpload(array $offers, $site = null) - { - if (!count($offers)) { - throw new \InvalidArgumentException( - 'Parameter `offers` must contains array of the offers' - ); - } - - return $this->client->makeRequest( - '/store/inventories/upload', - Client::METHOD_POST, - $this->fillSite($site, array('offers' => json_encode($offers))) - ); - } - - /** - * Upload store prices - * - * @param array $prices prices data - * @param string $site default: null) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function storePricesUpload(array $prices, $site = null) - { - if (!count($prices)) { - throw new \InvalidArgumentException( - 'Parameter `prices` must contains array of the prices' - ); - } - - return $this->client->makeRequest( - '/store/prices/upload', - Client::METHOD_POST, - $this->fillSite($site, array('prices' => json_encode($prices))) - ); - } - - /** - * Get products - * - * @param array $filter (default: array()) - * @param int $page (default: null) - * @param int $limit (default: null) - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function storeProducts(array $filter = array(), $page = null, $limit = null) - { - $parameters = array(); - - if (count($filter)) { - $parameters['filter'] = $filter; - } - if (null !== $page) { - $parameters['page'] = (int) $page; - } - if (null !== $limit) { - $parameters['limit'] = (int) $limit; - } - - return $this->client->makeRequest( - '/store/products', - Client::METHOD_GET, - $parameters - ); - } - - /** - * Get delivery settings - * - * @param string $code - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function deliverySettingsGet($code) - { - if (empty($code)) { - throw new \InvalidArgumentException('Parameter `code` must be set'); - } - - return $this->client->makeRequest( - "/delivery/generic/setting/$code", - Client::METHOD_GET - ); - } - - /** - * Edit delivery configuration - * - * @param array $configuration - * - * @throws \RetailCrm\Exception\InvalidJsonException - * @throws \RetailCrm\Exception\CurlException - * @throws \InvalidArgumentException - * - * @return ApiResponse - */ - public function deliverySettingsEdit(array $configuration) - { - if (!count($configuration) || empty($configuration['code'])) { - throw new \InvalidArgumentException( - 'Parameter `configuration` must contains a data & configuration `code` must be set' - ); - } - - return $this->client->makeRequest( - sprintf('/delivery/generic/setting/%s/edit', $configuration['code']), - Client::METHOD_POST, - array('configuration' => json_encode($configuration)) - ); - } - - /** - * Delivery tracking update - * - * @param string $code - * @param array $statusUpdate - * - * @throws \RetailCrm\Exception\InvalidJsonException - * @throws \RetailCrm\Exception\CurlException - * @throws \InvalidArgumentException - * - * @return ApiResponse - */ - public function deliveryTracking($code, array $statusUpdate) - { - if (empty($code)) { - throw new \InvalidArgumentException('Parameter `code` must be set'); - } - - if (!count($statusUpdate)) { - throw new \InvalidArgumentException( - 'Parameter `statusUpdate` must contains a data' - ); - } - - return $this->client->makeRequest( - sprintf('/delivery/generic/%s/tracking', $code), - Client::METHOD_POST, - array('statusUpdate' => json_encode($statusUpdate)) - ); - } - - /** - * Returns available county list - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function countriesList() - { - return $this->client->makeRequest( - '/reference/countries', - Client::METHOD_GET - ); - } - - /** - * Returns deliveryServices list - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function deliveryServicesList() - { - return $this->client->makeRequest( - '/reference/delivery-services', - Client::METHOD_GET - ); - } - - /** - * Edit deliveryService - * - * @param array $data delivery service data - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function deliveryServicesEdit(array $data) - { - if (!array_key_exists('code', $data)) { - throw new \InvalidArgumentException( - 'Data must contain "code" parameter.' - ); - } - - return $this->client->makeRequest( - sprintf('/reference/delivery-services/%s/edit', $data['code']), - Client::METHOD_POST, - array('deliveryService' => json_encode($data)) - ); - } - - /** - * Returns deliveryTypes list - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function deliveryTypesList() - { - return $this->client->makeRequest( - '/reference/delivery-types', - Client::METHOD_GET - ); - } - - /** - * Edit deliveryType - * - * @param array $data delivery type data - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function deliveryTypesEdit(array $data) - { - if (!array_key_exists('code', $data)) { - throw new \InvalidArgumentException( - 'Data must contain "code" parameter.' - ); - } - - return $this->client->makeRequest( - sprintf('/reference/delivery-types/%s/edit', $data['code']), - Client::METHOD_POST, - array('deliveryType' => json_encode($data)) - ); - } - - /** - * Returns orderMethods list - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function orderMethodsList() - { - return $this->client->makeRequest( - '/reference/order-methods', - Client::METHOD_GET - ); - } - - /** - * Edit orderMethod - * - * @param array $data order method data - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function orderMethodsEdit(array $data) - { - if (!array_key_exists('code', $data)) { - throw new \InvalidArgumentException( - 'Data must contain "code" parameter.' - ); - } - - return $this->client->makeRequest( - sprintf('/reference/order-methods/%s/edit', $data['code']), - Client::METHOD_POST, - array('orderMethod' => json_encode($data)) - ); - } - - /** - * Returns orderTypes list - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function orderTypesList() - { - return $this->client->makeRequest( - '/reference/order-types', - Client::METHOD_GET - ); - } - - /** - * Edit orderType - * - * @param array $data order type data - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function orderTypesEdit(array $data) - { - if (!array_key_exists('code', $data)) { - throw new \InvalidArgumentException( - 'Data must contain "code" parameter.' - ); - } - - return $this->client->makeRequest( - sprintf('/reference/order-types/%s/edit', $data['code']), - Client::METHOD_POST, - array('orderType' => json_encode($data)) - ); - } - - /** - * Returns paymentStatuses list - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function paymentStatusesList() - { - return $this->client->makeRequest( - '/reference/payment-statuses', - Client::METHOD_GET - ); - } - - /** - * Edit paymentStatus - * - * @param array $data payment status data - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function paymentStatusesEdit(array $data) - { - if (!array_key_exists('code', $data)) { - throw new \InvalidArgumentException( - 'Data must contain "code" parameter.' - ); - } - - return $this->client->makeRequest( - sprintf('/reference/payment-statuses/%s/edit', $data['code']), - Client::METHOD_POST, - array('paymentStatus' => json_encode($data)) - ); - } - - /** - * Returns paymentTypes list - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function paymentTypesList() - { - return $this->client->makeRequest( - '/reference/payment-types', - Client::METHOD_GET - ); - } - - /** - * Edit paymentType - * - * @param array $data payment type data - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function paymentTypesEdit(array $data) - { - if (!array_key_exists('code', $data)) { - throw new \InvalidArgumentException( - 'Data must contain "code" parameter.' - ); - } - - return $this->client->makeRequest( - sprintf('/reference/payment-types/%s/edit', $data['code']), - Client::METHOD_POST, - array('paymentType' => json_encode($data)) - ); - } - - /** - * Returns productStatuses list - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function productStatusesList() - { - return $this->client->makeRequest( - '/reference/product-statuses', - Client::METHOD_GET - ); - } - - /** - * Edit productStatus - * - * @param array $data product status data - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function productStatusesEdit(array $data) - { - if (!array_key_exists('code', $data)) { - throw new \InvalidArgumentException( - 'Data must contain "code" parameter.' - ); - } - - return $this->client->makeRequest( - sprintf('/reference/product-statuses/%s/edit', $data['code']), - Client::METHOD_POST, - array('productStatus' => json_encode($data)) - ); - } - - /** - * Returns sites list - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function sitesList() - { - return $this->client->makeRequest( - '/reference/sites', - Client::METHOD_GET - ); - } - - /** - * Edit site - * - * @param array $data site data - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function sitesEdit(array $data) - { - if (!array_key_exists('code', $data)) { - throw new \InvalidArgumentException( - 'Data must contain "code" parameter.' - ); - } - - return $this->client->makeRequest( - sprintf('/reference/sites/%s/edit', $data['code']), - Client::METHOD_POST, - array('site' => json_encode($data)) - ); - } - - /** - * Returns statusGroups list - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function statusGroupsList() - { - return $this->client->makeRequest( - '/reference/status-groups', - Client::METHOD_GET - ); - } - - /** - * Returns statuses list - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function statusesList() - { - return $this->client->makeRequest( - '/reference/statuses', - Client::METHOD_GET - ); - } - - /** - * Edit order status - * - * @param array $data status data - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function statusesEdit(array $data) - { - if (!array_key_exists('code', $data)) { - throw new \InvalidArgumentException( - 'Data must contain "code" parameter.' - ); - } - - return $this->client->makeRequest( - sprintf('/reference/statuses/%s/edit', $data['code']), - Client::METHOD_POST, - array('status' => json_encode($data)) - ); - } - - /** - * Returns stores list - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function storesList() - { - return $this->client->makeRequest( - '/reference/stores', - Client::METHOD_GET - ); - } - - /** - * Edit store - * - * @param array $data site data - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function storesEdit(array $data) - { - if (!array_key_exists('code', $data)) { - throw new \InvalidArgumentException( - 'Data must contain "code" parameter.' - ); - } - - if (!array_key_exists('name', $data)) { - throw new \InvalidArgumentException( - 'Data must contain "name" parameter.' - ); - } - - return $this->client->makeRequest( - sprintf('/reference/stores/%s/edit', $data['code']), - Client::METHOD_POST, - array('store' => json_encode($data)) - ); - } - - /** - * Get prices types - * - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function pricesTypes() - { - return $this->client->makeRequest( - '/reference/price-types', - Client::METHOD_GET - ); - } - - /** - * Edit price type - * - * @param array $data - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function pricesEdit(array $data) - { - if (!array_key_exists('code', $data)) { - throw new \InvalidArgumentException( - 'Data must contain "code" parameter.' - ); - } - - if (!array_key_exists('name', $data)) { - throw new \InvalidArgumentException( - 'Data must contain "name" parameter.' - ); - } - - return $this->client->makeRequest( - sprintf('/reference/price-types/%s/edit', $data['code']), - Client::METHOD_POST, - array('priceType' => json_encode($data)) - ); - } - - /** - * Get telephony settings - * - * @param string $code - * - * @throws \RetailCrm\Exception\InvalidJsonException - * @throws \RetailCrm\Exception\CurlException - * @throws \InvalidArgumentException - * - * @return ApiResponse - */ - public function telephonySettingsGet($code) - { - if (empty($code)) { - throw new \InvalidArgumentException('Parameter `code` must be set'); - } - - return $this->client->makeRequest( - "/telephony/setting/$code", - Client::METHOD_GET - ); - } - - /** - * Edit telephony settings - * - * @param string $code symbolic code - * @param string $clientId client id - * @param boolean $active telephony activity - * @param mixed $name service name - * @param mixed $makeCallUrl service init url - * @param mixed $image service logo url(svg file) - * - * @param array $additionalCodes - * @param array $externalPhones - * @param bool $allowEdit - * @param bool $inputEventSupported - * @param bool $outputEventSupported - * @param bool $hangupEventSupported - * @param bool $changeUserStatusUrl - * - * @return ApiResponse - */ - public function telephonySettingsEdit( - $code, - $clientId, - $active = false, - $name = false, - $makeCallUrl = false, - $image = false, - $additionalCodes = array(), - $externalPhones = array(), - $allowEdit = false, - $inputEventSupported = false, - $outputEventSupported = false, - $hangupEventSupported = false, - $changeUserStatusUrl = false - ) - { - if (!isset($code)) { - throw new \InvalidArgumentException('Code must be set'); - } - - $parameters['code'] = $code; - - if (!isset($clientId)) { - throw new \InvalidArgumentException('client id must be set'); - } - - $parameters['clientId'] = $clientId; - - if (!isset($active)) { - $parameters['active'] = false; - } else { - $parameters['active'] = $active; - } - - if (!isset($name)) { - throw new \InvalidArgumentException('name must be set'); - } - - if (isset($name)) { - $parameters['name'] = $name; - } - - if (isset($makeCallUrl)) { - $parameters['makeCallUrl'] = $makeCallUrl; - } - - if (isset($image)) { - $parameters['image'] = $image; - } - - if (isset($additionalCodes)) { - $parameters['additionalCodes'] = $additionalCodes; - } - - if (isset($externalPhones)) { - $parameters['externalPhones'] = $externalPhones; - } - - if (isset($allowEdit)) { - $parameters['allowEdit'] = $allowEdit; - } - - if (isset($inputEventSupported)) { - $parameters['inputEventSupported'] = $inputEventSupported; - } - - if (isset($outputEventSupported)) { - $parameters['outputEventSupported'] = $outputEventSupported; - } - - if (isset($hangupEventSupported)) { - $parameters['hangupEventSupported'] = $hangupEventSupported; - } - - if (isset($changeUserStatusUrl)) { - $parameters['changeUserStatusUrl'] = $changeUserStatusUrl; - } - - return $this->client->makeRequest( - "/telephony/setting/$code/edit", - Client::METHOD_POST, - array('configuration' => json_encode($parameters)) - ); - } - - /** - * Call event - * - * @param string $phone phone number - * @param string $type call type - * @param array $codes - * @param string $hangupStatus - * @param string $externalPhone - * @param array $webAnalyticsData - * - * @return ApiResponse - * @internal param string $code additional phone code - * @internal param string $status call status - * - */ - public function telephonyCallEvent( - $phone, - $type, - $codes, - $hangupStatus, - $externalPhone = null, - $webAnalyticsData = array() - ) - { - if (!isset($phone)) { - throw new \InvalidArgumentException('Phone number must be set'); - } - - if (!isset($type)) { - throw new \InvalidArgumentException('Type must be set (in|out|hangup)'); - } - - if (empty($codes)) { - throw new \InvalidArgumentException('Codes array must be set'); - } - - $parameters['phone'] = $phone; - $parameters['type'] = $type; - $parameters['codes'] = $codes; - $parameters['hangupStatus'] = $hangupStatus; - $parameters['callExternalId'] = $externalPhone; - $parameters['webAnalyticsData'] = $webAnalyticsData; - - - return $this->client->makeRequest( - '/telephony/call/event', - Client::METHOD_POST, - array('event' => json_encode($parameters)) - ); - } - - /** - * Upload calls - * - * @param array $calls calls data - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function telephonyCallsUpload(array $calls) - { - if (!count($calls)) { - throw new \InvalidArgumentException( - 'Parameter `calls` must contains array of the calls' - ); - } - - return $this->client->makeRequest( - '/telephony/calls/upload', - Client::METHOD_POST, - array('calls' => json_encode($calls)) - ); - } - - /** - * Get call manager - * - * @param string $phone phone number - * @param bool $details detailed information - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function telephonyCallManager($phone, $details) - { - if (!isset($phone)) { - throw new \InvalidArgumentException('Phone number must be set'); - } - - $parameters['phone'] = $phone; - $parameters['details'] = isset($details) ? $details : 0; - - return $this->client->makeRequest( - '/telephony/manager', - Client::METHOD_GET, - $parameters - ); - } - - /** - * Edit marketplace configuration - * - * @param array $configuration - * - * @throws \RetailCrm\Exception\InvalidJsonException - * @throws \RetailCrm\Exception\CurlException - * @throws \InvalidArgumentException - * - * @return ApiResponse - */ - public function marketplaceSettingsEdit(array $configuration) - { - if (!count($configuration) || empty($configuration['code'])) { - throw new \InvalidArgumentException( - 'Parameter `configuration` must contains a data & configuration `code` must be set' - ); - } - - return $this->client->makeRequest( - sprintf('/marketplace/external/setting/%s/edit', $configuration['code']), - Client::METHOD_POST, - array('configuration' => json_encode($configuration)) - ); - } - - /** - * Update CRM basic statistic - * - * @throws \InvalidArgumentException - * @throws \RetailCrm\Exception\CurlException - * @throws \RetailCrm\Exception\InvalidJsonException - * - * @return ApiResponse - */ - public function statisticUpdate() - { - return $this->client->makeRequest( - '/statistic/update', - Client::METHOD_GET - ); - } - - /** - * Return current site - * - * @return string - */ - public function getSite() - { - return $this->siteCode; - } - - /** - * Set site - * - * @param string $site site code - * - * @return void - */ - public function setSite($site) - { - $this->siteCode = $site; - } - - /** - * @return \RetailCrm\Response\ApiResponse - */ - public function getCredentials(): ApiResponse - { - return $this->client->makeRequest( - '/credentials', - Client::METHOD_GET - ); - } - - /** - * Check ID parameter - * - * @param string $by identify by - * - * @throws \InvalidArgumentException - * - * @return bool - */ - protected function checkIdParameter($by) - { - $allowedForBy = array( - 'externalId', - 'id' - ); - - if (!in_array($by, $allowedForBy, false)) { - throw new \InvalidArgumentException( - sprintf( - 'Value "%s" for "by" param is not valid. Allowed values are %s.', - $by, - implode(', ', $allowedForBy) - ) - ); - } - - return true; - } - - /** - * Fill params by site value - * - * @param string $site site code - * @param array $params input parameters - * - * @return array - */ - protected function fillSite($site, array $params) - { - if ($site) { - $params['site'] = $site; - } elseif ($this->siteCode) { - $params['site'] = $this->siteCode; - } - - return $params; - } -} diff --git a/intaro.retailcrm/classes/general/RCrmActions.php b/intaro.retailcrm/classes/general/RCrmActions.php index 8892ee0a..8157598d 100644 --- a/intaro.retailcrm/classes/general/RCrmActions.php +++ b/intaro.retailcrm/classes/general/RCrmActions.php @@ -468,30 +468,18 @@ class RCrmActions $code = $integrationCode . '-' . $clientId; - if ($api_version == 'v4') { - $configuration = array( - 'name' => GetMessage('API_MODULE_NAME'), - 'code' => $code, - 'logo' => $logo, - 'configurationUrl' => $accountUrl, - 'active' => $active - ); + $configuration = array( + 'clientId' => $clientId, + 'code' => $code, + 'integrationCode' => $integrationCode, + 'active' => $active, + 'name' => GetMessage('API_MODULE_NAME'), + 'logo' => $logo, + 'baseUrl' => $baseUrl, + 'accountUrl' => $accountUrl + ); - self::apiMethod($api, 'marketplaceSettingsEdit', __METHOD__, $configuration); - } else { - $configuration = array( - 'clientId' => $clientId, - 'code' => $code, - 'integrationCode' => $integrationCode, - 'active' => $active, - 'name' => GetMessage('API_MODULE_NAME'), - 'logo' => $logo, - 'baseUrl' => $baseUrl, - 'accountUrl' => $accountUrl - ); - - self::apiMethod($api, 'integrationModulesEdit', __METHOD__, $configuration); - } + self::apiMethod($api, 'integrationModulesEdit', __METHOD__, $configuration); } public static function apiMethod($api, $methodApi, $method, $params, $site = null) diff --git a/intaro.retailcrm/classes/general/history/RetailCrmHistory_v4.php b/intaro.retailcrm/classes/general/history/RetailCrmHistory_v4.php deleted file mode 100644 index ab2b754c..00000000 --- a/intaro.retailcrm/classes/general/history/RetailCrmHistory_v4.php +++ /dev/null @@ -1,1274 +0,0 @@ - 0) { - $historyFilter['sinceId'] = $historyStart; - } - - while (true) { - $customerHistory = RCrmActions::apiMethod($api, 'customersHistory', __METHOD__, $historyFilter); - - $customerH = isset($customerHistory['history']) ? $customerHistory['history'] : array(); - - Logger::getInstance()->write($customerH, 'customerHistory'); - - if (count($customerH) == 0) { - if ($customerHistory['history']['totalPageCount'] > $customerHistory['history']['currentPage']) { - $historyFilter['page'] = $customerHistory['history']['currentPage'] + 1; - - continue; - } - - return true; - } - - $customers = self::assemblyCustomer($customerH); - - $GLOBALS['RETAIL_CRM_HISTORY'] = true; - - $newUser = new CUser; - - foreach ($customers as $customer) { - if (function_exists('retailCrmBeforeCustomerSave')) { - $newResCustomer = retailCrmBeforeCustomerSave($customer); - if (is_array($newResCustomer) && !empty($newResCustomer)) { - $customer = $newResCustomer; - } elseif ($newResCustomer === false) { - RCrmActions::eventLog('RetailCrmHistory::customerHistory', 'retailCrmBeforeCustomerSave()', 'UserCrmId = ' . $customer['id'] . '. Sending canceled after retailCrmBeforeCustomerSave'); - - continue; - } - } - - if (isset($customer['deleted'])) { - continue; - } - - if (isset($customer['externalId']) && !is_numeric($customer['externalId'])) { - unset($customer['externalId']); - } - - if (!isset($customer['externalId'])) { - if (!isset($customer['id'])) { - continue; - } - - $registerNewUser = true; - if (!isset($customer['email']) || $customer['email'] == '') { - $login = $customer['email'] = uniqid('user_' . time()) . '@crm.com'; - } else { - $dbUser = CUser::GetList(($by = 'ID'), ($sort = 'ASC'), array('=EMAIL' => $customer['email'])); - switch ($dbUser->SelectedRowsCount()) { - case 0: - $login = $customer['email']; - break; - case 1: - $arUser = $dbUser->Fetch(); - $registeredUserID = $arUser['ID']; - $registerNewUser = false; - break; - default: - $login = uniqid('user_' . time()) . '@crm.com'; - break; - } - } - - if ($registerNewUser === true) { - $userPassword = uniqid(); - - $arFields = array( - "EMAIL" => $customer['email'], - "LOGIN" => $login, - "ACTIVE" => "Y", - "PASSWORD" => $userPassword, - "CONFIRM_PASSWORD" => $userPassword - ); - $registeredUserID = $newUser->Add($arFields); - if ($registeredUserID === false) { - RCrmActions::eventLog('RetailCrmHistory::customerHistory', 'CUser::Register', 'Error register user'); - continue; - } - - if(RCrmActions::apiMethod($api, 'customersFixExternalIds', __METHOD__, array(array('id' => $customer['id'], 'externalId' => $registeredUserID))) == false) { - continue; - } - - } - - $customer['externalId'] = $registeredUserID; - } - - if (isset($customer['externalId'])) { - $arUser = array(); - if (array_key_exists('firstName', $customer)) { - $arUser["NAME"] = $customer['firstName'] ? RCrmActions::fromJSON($customer['firstName']) : ''; - } - if (array_key_exists('lastName', $customer)) { - $arUser["LAST_NAME"] = $customer['lastName'] ? RCrmActions::fromJSON($customer['lastName']) : ''; - } - if (array_key_exists('patronymic', $customer)) { - $arUser["SECOND_NAME"] = $customer['patronymic'] ? RCrmActions::fromJSON($customer['patronymic']) : ''; - } - -// if (array_key_exists('email', $customer)) { -// $arUser["EMAIL"] = $customer['email'] ? RCrmActions::fromJSON($customer['email']) : ''; -// } - - if (isset($customer['phones'])) { - $user = CUser::GetList(($by="ID"), ($order="desc"), array('ID' => $customer['externalId']), array('FIELDS' => array('PERSONAL_PHONE', 'PERSONAL_MOBILE')))->fetch(); - foreach ($customer['phones'] as $phone) { - if (isset($phone['old_number']) && in_array($phone['old_number'], $user)) { - $key = array_search($phone['old_number'], $user); - if (isset($phone['number'])) { - $arUser[$key] = $phone['number']; - $user[$key] = $phone['number']; - } else { - $arUser[$key] = ''; - $user[$key] = ''; - } - } - if (isset($phone['number'])) { - if ((!isset($user['PERSONAL_PHONE']) || strlen($user['PERSONAL_PHONE']) == 0) && $user['PERSONAL_MOBILE'] != $phone['number']) { - $arUser['PERSONAL_PHONE'] = $phone['number']; - $user['PERSONAL_PHONE'] = $phone['number']; - continue; - } - if ((!isset($user['PERSONAL_MOBILE']) || strlen($user['PERSONAL_MOBILE']) == 0) && $user['PERSONAL_PHONE'] != $phone['number']) { - $arUser['PERSONAL_MOBILE'] = $phone['number']; - $user['PERSONAL_MOBILE'] = $phone['number']; - continue; - } - } - } - } - if (array_key_exists('index', $customer['address'])) { - $arUser["PERSONAL_ZIP"] = $customer['address']['index'] ? RCrmActions::fromJSON($customer['address']['index']) : ''; - } - if (array_key_exists('city', $customer['address'])) { - $arUser["PERSONAL_CITY"] = $customer['address']['city'] ? RCrmActions::fromJSON($customer['address']['city']) : ''; - } - - $u = $newUser->Update($customer['externalId'], $arUser); - if (!$u) { - RCrmActions::eventLog('RetailCrmHistory::customerHistory', 'Error update user', $newUser->LAST_ERROR); - } - - if (function_exists('retailCrmAfterCustomerSave')) { - retailCrmAfterCustomerSave($customer); - } - } - } - - $GLOBALS['RETAIL_CRM_HISTORY'] = false; - - //last id - $end = array_pop($customerH); - COption::SetOptionString(self::$MODULE_ID, self::$CRM_CUSTOMER_HISTORY, $end['id']); - - if ($customerHistory['pagination']['totalPageCount'] == 1) { - return true; - } - //new filter - $historyFilter['sinceId'] = $end['id']; - } - } - - public static function orderHistory() - { - global $USER; - if (is_object($USER) == false) { - $USER = new RetailUser; - } - if (!CModule::IncludeModule("iblock")) { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'iblock', 'module not found'); - - return false; - } - if (!CModule::IncludeModule("sale")) { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'sale', 'module not found'); - - return false; - } - if (!CModule::IncludeModule("catalog")) { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'catalog', 'module not found'); - - return false; - } - - $api_host = COption::GetOptionString(self::$MODULE_ID, self::$CRM_API_HOST_OPTION, 0); - $api_key = COption::GetOptionString(self::$MODULE_ID, self::$CRM_API_KEY_OPTION, 0); - - $optionsOrderTypes = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_ORDER_TYPES_ARR, 0)); - $optionsDelivTypes = array_flip(unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_DELIVERY_TYPES_ARR, 0))); - $optionsPayTypes = array_flip(unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_PAYMENT_TYPES, 0))); - $optionsPayStatuses = array_flip(unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_PAYMENT_STATUSES, 0))); // --statuses - $optionsPayment = array_flip(unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_PAYMENT, 0))); - $optionsOrderProps = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_ORDER_PROPS, 0)); - $optionsLegalDetails = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_LEGAL_DETAILS, 0)); - $optionsContragentType = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_CONTRAGENT_TYPE, 0)); - $optionsSitesList = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_SITES_LIST, 0)); - $optionsCustomFields = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_CUSTOM_FIELDS, 0)); - $optionsOrderNumbers = COption::GetOptionString(self::$MODULE_ID, self::$CRM_ORDER_NUMBERS, 0); - $optionsCanselOrder = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_CANSEL_ORDER, 0)); - - $api = new RetailCrm\ApiClient($api_host, $api_key); - - $historyFilter = array(); - $historyStart = COption::GetOptionString(self::$MODULE_ID, self::$CRM_ORDER_HISTORY); - if ($historyStart && $historyStart > 0) { - $historyFilter['sinceId'] = $historyStart; - } - - while (true) { - $orderHistory = RCrmActions::apiMethod($api, 'ordersHistory', __METHOD__, $historyFilter); - - $orderH = isset($orderHistory['history']) ? $orderHistory['history'] : array(); - - Logger::getInstance()->write($orderH, 'orderHistory'); - - if (count($orderH) == 0) { - if ($orderHistory['history']['totalPageCount'] > $orderHistory['history']['currentPage']) { - $historyFilter['page'] = $orderHistory['history']['currentPage'] + 1; - - continue; - } - - return true; - } - - $orders = self::assemblyOrder($orderH); - - $GLOBALS['RETAIL_CRM_HISTORY'] = true; - - //orders with changes - foreach ($orders as $order) { - if (function_exists('retailCrmBeforeOrderSave')) { - $newResOrder = retailCrmBeforeOrderSave($order); - if (is_array($newResOrder) && !empty($newResOrder)) { - $order = $newResOrder; - } elseif ($newResOrder === false) { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'retailCrmBeforeOrderSave()', 'OrderCrmId = ' . $order['id'] . '. Sending canceled after retailCrmBeforeOrderSave'); - - continue; - } - } - - Logger::getInstance()->write($order, 'assemblyOrderHistory'); - - if ($order['deleted']) { - continue; - } - - if (isset($order['customer']['externalId']) && !is_numeric($order['customer']['externalId'])) { - unset($order['customer']['externalId']); - } - - if (!isset($order['externalId'])) { - if (!isset($order['customer']['externalId'])) { - if (!isset($order['customer']['id'])) { - continue; - } - - $registerNewUser = true; - - if (!isset($order['customer']['email']) || $order['customer']['email'] == '') { - $login = $order['customer']['email'] = uniqid('user_' . time()) . '@crm.com'; - } else { - $dbUser = CUser::GetList(($by = 'ID'), ($sort = 'ASC'), array('=EMAIL' => $order['email'])); - switch ($dbUser->SelectedRowsCount()) { - case 0: - $login = $order['customer']['email']; - break; - case 1: - $arUser = $dbUser->Fetch(); - $registeredUserID = $arUser['ID']; - $registerNewUser = false; - break; - default: - $login = uniqid('user_' . time()) . '@crm.com'; - break; - } - } - - if ($registerNewUser === true) { - $userPassword = uniqid(); - - $newUser = new CUser; - $arFields = array( - "NAME" => RCrmActions::fromJSON($order['customer']['firstName']), - "LAST_NAME" => RCrmActions::fromJSON($order['customer']['lastName']), - "SECOND_NAME" => RCrmActions::fromJSON($order['customer']['patronymic']), - "EMAIL" => $order['customer']['email'], - "LOGIN" => $login, - "ACTIVE" => "Y", - "PASSWORD" => $userPassword, - "CONFIRM_PASSWORD" => $userPassword - ); - if ($order['customer']['phones'][0]) { - $arFields['PERSONAL_PHONE'] = $order['customer']['phones'][0]; - } - if ($order['customer']['phones'][1]) { - $arFields['PERSONAL_MOBILE'] = $order['customer']['phones'][1]; - } - - $registeredUserID = $newUser->Add($arFields); - - if ($registeredUserID === false) { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'CUser::Register', 'Error register user'); - - continue; - } - - if(RCrmActions::apiMethod($api, 'customersFixExternalIds', __METHOD__, array(array('id' => $order['customer']['id'], 'externalId' => $registeredUserID))) == false) { - continue; - } - } - - $order['customer']['externalId'] = $registeredUserID; - } - - if ($optionsSitesList) { - $site = array_search($order['site'], $optionsSitesList); - } else { - $site = CSite::GetDefSite(); - } - if (empty($site)) { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'Bitrix\Sale\Order::create', 'Site = ' . $order['site'] . ' not found in setting. Order crm id=' . $order['id']); - - continue; - } - - $newOrder = Bitrix\Sale\Order::create($site, $order['customer']['externalId']); - $newOrder->save(); - $externalId = $newOrder->getId(); - - if (isset($externalId)) { - if(RCrmActions::apiMethod($api, 'ordersFixExternalIds', __METHOD__, array(array('id' => $order['id'], 'externalId' => $externalId))) == false){ - continue; - } - } else { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'Bitrix\Sale\Order::create', 'Error order create'); - } - $order['externalId'] = $externalId; - } - - if (isset($order['externalId']) && $order['externalId']) { - $itemUpdate = false; - try { - $newOrder = Bitrix\Sale\Order::load($order['externalId']); - } catch (Bitrix\Main\ArgumentNullException $e) { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'Bitrix\Sale\Order::load', $e->getMessage() . ': ' . $order['externalId']); - continue; - } - - if (!$newOrder instanceof \Bitrix\Sale\Order) { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'Bitrix\Sale\Order::load', 'Error order load id=' . $order['externalId']); - continue; - } - - if ($optionsSitesList) { - $site = array_search($order['site'], $optionsSitesList); - } else { - $site = CSite::GetDefSite(); - } - if (empty($site)) { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'Bitrix\Sale\Order::edit', 'Site = ' . $order['site'] . ' not found in setting. Order id=' . $order['externalId']); - - continue; - } - - if ($optionsOrderNumbers == 'Y' && isset($order['number'])) { - $searchFilter = array( - 'filter' => array('ACCOUNT_NUMBER' => $order['number']), - 'select' => array('ID'), - ); - $searchOrder = \Bitrix\Sale\OrderTable::GetList($searchFilter)->fetch(); - if (!empty($searchOrder)) { - if ($searchOrder['ID'] != $order['externalId']) { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'setField("ACCOUNT_NUMBER")', 'Error order load id=' . $order['externalId']) . '. Number ' . $order['number'] . ' already exists'; - - continue; - } - } - - $newOrder->setField('ACCOUNT_NUMBER', $order['number']); - } - - $personType = $newOrder->getField('PERSON_TYPE_ID'); - if (isset($order['orderType']) && $order['orderType']) { - $nType = array(); - $tList = RCrmActions::OrderTypesList(array(array('LID' => $site))); - foreach($tList as $type){ - if (isset($optionsOrderTypes[$type['ID']])) { - $nType[$optionsOrderTypes[$type['ID']]] = $type['ID']; - } - } - $newOptionsOrderTypes = $nType; - - if ($newOptionsOrderTypes[$order['orderType']]) { - if ($personType != $newOptionsOrderTypes[$order['orderType']] && $personType != 0) { - $propsRemove = true; - } - $personType = $newOptionsOrderTypes[$order['orderType']]; - $newOrder->setField('PERSON_TYPE_ID', $personType); - } elseif ($personType == 0) { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'orderType not found', 'PERSON_TYPE_ID = 0'); - } - } - - //status - if ($optionsPayStatuses[$order['status']]) { - $newOrder->setField('STATUS_ID', $optionsPayStatuses[$order['status']]); - if (in_array($optionsPayStatuses[$order['status']], $optionsCanselOrder)) { - $newOrder->setFieldNoDemand('CANCELED', 'Y'); - } else { - $newOrder->setFieldNoDemand('CANCELED', 'N'); - } - } - - if (array_key_exists('statusComment', $order)) { - self::setProp($newOrder, RCrmActions::fromJSON($order['statusComment']), 'REASON_CANCELED'); - } - - //props - $propertyCollection = $newOrder->getPropertyCollection(); - $propertyCollectionArr = $propertyCollection->getArray(); - $nProps = array(); - foreach ($propertyCollectionArr['properties'] as $orderProp) { - if ($orderProp['ID'][0] == 'n') { - $orderProp['ID'] = substr($orderProp['ID'], 1); - $orderProp['ID'] = $propertyCollection->getItemById($orderProp['ID'])->getField('ORDER_PROPS_ID'); - } - $nProps[] = $orderProp; - } - $propertyCollectionArr['properties'] = $nProps; - - if ($propsRemove) {//delete props - foreach ($propertyCollectionArr['properties'] as $orderProp) { - $somePropValue = $propertyCollection->getItemByOrderPropertyId($orderProp['ID']); - self::setProp($somePropValue); - } - $orderCrm = RCrmActions::apiMethod($api, 'orderGet', __METHOD__, $order['id']); - - $orderDump = $order; - $order = $orderCrm['order']; - } - - $propsKey = array(); - foreach ($propertyCollectionArr['properties'] as $prop) { - $propsKey[$prop['CODE']]['ID'] = $prop['ID']; - $propsKey[$prop['CODE']]['TYPE'] = $prop['TYPE']; - } - //fio - if ($order['firstName'] || $order['lastName'] || $order['patronymic']) { - $fio = ''; - foreach ($propertyCollectionArr['properties'] as $prop) { - if (in_array($optionsOrderProps[$personType]['fio'], $prop)) { - $getFio = $newOrder->getPropertyCollection()->getItemByOrderPropertyId($prop['ID']); - if (method_exists($getFio, 'getValue')) { - $fio = $getFio->getValue(); - } - } - } - - $fio = RCrmActions::explodeFio($fio); - $newFio = array(); - if ($fio) { - $newFio[] = isset($order['lastName']) ? RCrmActions::fromJSON($order['lastName']) : (isset($fio['lastName']) ? $fio['lastName'] : ''); - $newFio[] = isset($order['firstName']) ? RCrmActions::fromJSON($order['firstName']) : (isset($fio['firstName']) ? $fio['firstName'] : ''); - $newFio[] = isset($order['patronymic']) ? RCrmActions::fromJSON($order['patronymic']) : (isset($fio['patronymic']) ? $fio['patronymic'] : ''); - $order['fio'] = trim(implode(' ', $newFio)); - } else { - $newFio[] = isset($order['lastName']) ? RCrmActions::fromJSON($order['lastName']) : ''; - $newFio[] = isset($order['firstName']) ? RCrmActions::fromJSON($order['firstName']) : ''; - $newFio[] = isset($order['patronymic']) ? RCrmActions::fromJSON($order['patronymic']) : ''; - $order['fio'] = trim(implode(' ', $newFio)); - } - } - - //optionsOrderProps - if ($optionsOrderProps[$personType]) { - foreach ($optionsOrderProps[$personType] as $key => $orderProp) { - if (array_key_exists($key, $order)) { - $somePropValue = $propertyCollection->getItemByOrderPropertyId($propsKey[$orderProp]['ID']); - if ($key == 'fio') { - self::setProp($somePropValue, $order[$key]); - } else { - self::setProp($somePropValue, RCrmActions::fromJSON($order[$key])); - } - } elseif (array_key_exists($key, $order['delivery']['address'])) { - if ($propsKey[$orderProp]['TYPE'] == 'LOCATION') { - $order['delivery']['address'][$key] = trim($order['delivery']['address'][$key]); - if(!empty($order['delivery']['address'][$key])){ - $parameters = array(); - $loc = explode('.', $order['delivery']['address'][$key]); - if (count($loc) == 1) { - $parameters['filter']['PHRASE'] = RCrmActions::fromJSON(trim($loc[0])); - } elseif (count($loc) == 2) { - $parameters['filter']['PHRASE'] = RCrmActions::fromJSON(trim($loc[1])); - } else{ - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'RetailCrmHistory::setProp', 'Error location. ' . $order['delivery']['address'][$key] . ' not found add in order id=' . $order['externalId']); - continue; - } - $parameters['filter']['NAME.LANGUAGE_ID'] = 'ru'; - $location = \Bitrix\Sale\Location\Search\Finder::find($parameters, array('USE_INDEX' => false, 'USE_ORM' => false))->fetch(); - - $somePropValue = $propertyCollection->getItemByOrderPropertyId($propsKey[$orderProp]['ID']); - self::setProp($somePropValue, $location['CODE']); - } else { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'RetailCrmHistory::setProp', 'Error location. ' . $order['delivery']['address'][$key] . ' is empty in order id=' . $order['externalId']); - - continue; - } - } else { - $somePropValue = $propertyCollection->getItemByOrderPropertyId($propsKey[$orderProp]['ID']); - self::setProp($somePropValue, RCrmActions::fromJSON($order['delivery']['address'][$key])); - } - } - } - } - - //optionsLegalDetails - if ($optionsLegalDetails[$personType]) { - foreach ($optionsLegalDetails[$personType] as $key => $orderProp) { - if (array_key_exists($key, $order)) { - $somePropValue = $propertyCollection->getItemByOrderPropertyId($propsKey[$orderProp]['ID']); - self::setProp($somePropValue, $order[$key]); - } - } - } - if ($propsRemove) { - $order = $orderDump; - } - - //paymentStatus - if ($optionsPayment[$order['paymentStatus']]) { - $newOrder->setFieldNoDemand('PAYED', $optionsPayment[$order['paymentStatus']]); - } - //comments - if (array_key_exists('customerComment', $order)) { - self::setProp($newOrder, RCrmActions::fromJSON($order['customerComment']), 'USER_DESCRIPTION'); - } - if (array_key_exists('managerComment', $order)) { - self::setProp($newOrder, RCrmActions::fromJSON($order['managerComment']), 'COMMENTS'); - } - - //items - $basket = $newOrder->getBasket(); - $fUserId = $basket->getFUserId(true); - - if ($fUserId === null) { - $fUserId = Bitrix\Sale\Fuser::getIdByUserId($order['customer']['externalId']); - $basket->setFUserId($fUserId); - } - - if (isset($order['items'])) { - $itemUpdate = true; - foreach ($order['items'] as $product) { - $item = self::getExistsItem($basket, 'catalog', $product['offer']['externalId']); - if (!$item) { - if($product['delete']){ - continue; - } - $item = $basket->createItem('catalog', $product['offer']['externalId']); - if ($item instanceof \Bitrix\Sale\BasketItem) { - $elem = self::getInfoElement($product['offer']['externalId']); - $item->setFields(array( - 'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(), - 'LID' => $site, - 'BASE_PRICE' => $product['initialPrice'], - 'NAME' => $product['offer']['name'] ? RCrmActions::fromJSON($product['offer']['name']) : $elem['NAME'], - 'DETAIL_PAGE_URL' => $elem['URL'] - )); - } else { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'createItem', 'Error item id=' . $product['offer']['externalId'] . ' add in order id=' . $order['externalId']); - continue; - } - } - if ($product['delete']) { - $item->delete(); - - continue; - } - - if ($product['quantity']) { - $item->setFieldNoDemand('QUANTITY', $product['quantity']); - } - - if (array_key_exists('discount', $product) || array_key_exists('discountPercent', $product)) { - if (!isset($orderCrm)) { - $orderCrm = RCrmActions::apiMethod($api, 'orderGet', __METHOD__, $order['id']); - } - if (isset($orderCrm['order']['items'])) { - foreach ($orderCrm['order']['items'] as $itemCrm) { - if ($itemCrm['offer']['externalId'] == $product['offer']['externalId']) { - $itemCost = $itemCrm['initialPrice'] - $itemCrm['discount'] - round(($itemCrm['initialPrice'] / 100 * $itemCrm['discountPercent']), 2); - break; - } - } - } - - if (isset($itemCost) && $itemCost >= 0) { - $item->setField('CUSTOM_PRICE', 'Y'); - $item->setField('PRICE', $itemCost); - $item->setField('DISCOUNT_NAME', ''); - $item->setField('DISCOUNT_VALUE', ''); - } - } - } - } - - $orderSumm = 0; - foreach ($basket as $item) { - $orderSumm += $item->getFinalPrice(); - } - - if (array_key_exists('cost', $order['delivery'])) { - $deliverySumm = $order['delivery']['cost']; - } else { - $deliverySumm = $newOrder->getDeliveryPrice(); - } - - $orderSumm += $deliverySumm; - - $newOrder->setField('PRICE', $orderSumm); - $order['summ'] = $orderSumm; - $newOrder->save(); - - //payment - if (array_key_exists('paymentType', $order)) { - self::paySystemUpdate($order, $optionsPayTypes, $newOrder->getField('ACCOUNT_NUMBER')); - } - - //delivery - if (array_key_exists('code', $order['delivery'])) { - $itemUpdate = true; - //delete empty - if (!isset($orderCrm)) { - $orderCrm = RCrmActions::apiMethod($api, 'orderGet', __METHOD__, $order['id']); - } - if ($orderCrm) { - self::shipmentUpdate($orderCrm['order'], $optionsDelivTypes, $newOrder->getField('ACCOUNT_NUMBER')); - } - } - if (isset($orderCrm)) { - unset($orderCrm); - } - - //delivery cost - if (array_key_exists('cost', $order['delivery'])) { - $shipment = Bitrix\Sale\Internals\ShipmentTable::getList(array( - 'filter' => array('ORDER_ID' => $order['externalId'], 'SYSTEM' => 'N'), - 'order' => array('ID') - ))->fetch(); - if ($shipment) { - Bitrix\Sale\Internals\ShipmentTable::update($shipment['ID'], array('BASE_PRICE_DELIVERY' => $order['delivery']['cost'], 'PRICE_DELIVERY' => $order['delivery']['cost'], 'CUSTOM_PRICE_DELIVERY' => 'Y')); - } - - Bitrix\Sale\OrderTable::update($order['externalId'], array('PRICE_DELIVERY' => $order['delivery']['cost'])); - } - - Bitrix\Sale\OrderTable::update($order['externalId'], array('MARKED' => 'N', 'EMP_MARKED_ID' => '', 'REASON_MARKED' => '')); - - if ($itemUpdate) { - self::updateShipmentItem($order['externalId']); - } - - if (function_exists('retailCrmAfterOrderSave')) { - retailCrmAfterOrderSave($order); - } - } - } - - $GLOBALS['RETAIL_CRM_HISTORY'] = false; - - //end id - $end = array_pop($orderH); - COption::SetOptionString(self::$MODULE_ID, self::$CRM_ORDER_HISTORY, $end['id']); - - if ($orderHistory['pagination']['totalPageCount'] == 1) { - return true; - } - //new filter - $historyFilter['sinceId'] = $end['id']; - } - } - - public static function assemblyCustomer($customerHistory) - { - $server = \Bitrix\Main\Context::getCurrent()->getServer()->getDocumentRoot(); - $fields = array(); - if (file_exists($server . '/bitrix/modules/intaro.retailcrm/classes/general/config/objects.xml')) { - $objects = simplexml_load_file($server . '/bitrix/modules/intaro.retailcrm/classes/general/config/objects.xml'); - foreach ($objects->fields->field as $object) { - $fields[(string) $object["group"]][(string) $object["id"]] = (string) $object; - } - } - $customers = array(); - foreach ($customerHistory as $change) { - $change['customer'] = self::removeEmpty($change['customer']); - if ($customers[$change['customer']['id']]) { - $customers[$change['customer']['id']] = array_merge($customers[$change['customer']['id']], $change['customer']); - } else { - $customers[$change['customer']['id']] = $change['customer']; - } - - if ($change['customer']['contragent']['contragentType']) { - $change['customer']['contragentType'] = self::newValue($change['customer']['contragent']['contragentType']); - unset($change['customer']['contragent']); - } - - if ($fields['customer'][$change['field']] == 'phones') { - $key = count($customers[$change['customer']['id']]['phones']); - if (isset($change['oldValue'])) { - $customers[$change['customer']['id']]['phones'][$key]['old_number'] = $change['oldValue']; - } - if (isset($change['newValue'])) { - $customers[$change['customer']['id']]['phones'][$key]['number'] = $change['newValue']; - } - } else { - if ($fields['customerAddress'][$change['field']]) { - $customers[$change['customer']['id']]['address'][$fields['customerAddress'][$change['field']]] = $change['newValue']; - } elseif ($fields['customerContragent'][$change['field']]) { - $customers[$change['customer']['id']]['contragent'][$fields['customerContragent'][$change['field']]] = $change['newValue']; - } elseif ($fields['customer'][$change['field']]) { - $customers[$change['customer']['id']][$fields['customer'][$change['field']]] = self::newValue($change['newValue']); - } - - if (isset($change['created'])) { - $customers[$change['customer']['id']]['create'] = 1; - } - - if (isset($change['deleted'])) { - $customers[$change['customer']['id']]['deleted'] = 1; - } - } - } - - return $customers; - } - - public static function assemblyOrder($orderHistory) - { - $server = \Bitrix\Main\Context::getCurrent()->getServer()->getDocumentRoot(); - if (file_exists($server . '/bitrix/modules/intaro.retailcrm/classes/general/config/objects.xml')) { - $objects = simplexml_load_file($server . '/bitrix/modules/intaro.retailcrm/classes/general/config/objects.xml'); - foreach ($objects->fields->field as $object) { - $fields[(string) $object["group"]][(string) $object["id"]] = (string) $object; - } - } - $orders = array(); - foreach ($orderHistory as $change) { - $change['order'] = self::removeEmpty($change['order']); - if ($change['order']['items']) { - $items = array(); - foreach ($change['order']['items'] as $item) { - if (isset($change['created'])) { - $item['create'] = 1; - } - $items[$item['id']] = $item; - } - $change['order']['items'] = $items; - } - - if (isset($change['order']['contragent']) && count($change['order']['contragent']) > 0) { - foreach ($change['order']['contragent'] as $name => $value) { - $change['order'][$name] = self::newValue($value); - } - unset($change['order']['contragent']); - } - - if ($orders[$change['order']['id']]) { - $orders[$change['order']['id']] = array_merge($orders[$change['order']['id']], $change['order']); - } else { - $orders[$change['order']['id']] = $change['order']; - } - - if ($change['item']) { - if ($orders[$change['order']['id']]['items'][$change['item']['id']]) { - $orders[$change['order']['id']]['items'][$change['item']['id']] = array_merge($orders[$change['order']['id']]['items'][$change['item']['id']], $change['item']); - } else { - $orders[$change['order']['id']]['items'][$change['item']['id']] = $change['item']; - } - - if (empty($change['oldValue']) && $change['field'] == 'order_product') { - $orders[$change['order']['id']]['items'][$change['item']['id']]['create'] = 1; - unset($orders[$change['order']['id']]['items'][$change['item']['id']]['delete']); - } - if (empty($change['newValue']) && $change['field'] == 'order_product') { - $orders[$change['order']['id']]['items'][$change['item']['id']]['delete'] = 1; - } - if (/*!$orders[$change['order']['id']]['items'][$change['item']['id']]['create'] && */$fields['item'][$change['field']]) { - $orders[$change['order']['id']]['items'][$change['item']['id']][$fields['item'][$change['field']]] = $change['newValue']; - } - } else { - if ($fields['delivery'][$change['field']] == 'service') { - $orders[$change['order']['id']]['delivery']['service']['code'] = self::newValue($change['newValue']); - } elseif ($fields['delivery'][$change['field']]) { - $orders[$change['order']['id']]['delivery'][$fields['delivery'][$change['field']]] = self::newValue($change['newValue']); - } elseif ($fields['orderAddress'][$change['field']]) { - $orders[$change['order']['id']]['delivery']['address'][$fields['orderAddress'][$change['field']]] = $change['newValue']; - } elseif ($fields['integrationDelivery'][$change['field']]) { - $orders[$change['order']['id']]['delivery']['service'][$fields['integrationDelivery'][$change['field']]] = self::newValue($change['newValue']); - } elseif ($fields['customerContragent'][$change['field']]) { - $orders[$change['order']['id']][$fields['customerContragent'][$change['field']]] = self::newValue($change['newValue']); - } elseif (strripos($change['field'], 'custom_') !== false) { - $orders[$change['order']['id']]['customFields'][str_replace('custom_', '', $change['field'])] = self::newValue($change['newValue']); - } elseif ($fields['order'][$change['field']]){ - $orders[$change['order']['id']][$fields['order'][$change['field']]] = self::newValue($change['newValue']); - } - - if (isset($change['created'])) { - $orders[$change['order']['id']]['create'] = 1; - } - - if (isset($change['deleted'])) { - $orders[$change['order']['id']]['deleted'] = 1; - } - } - } - - return $orders; - } - - public static function shipmentUpdate($orderCrm, $optionsDelivTypes, $accountNumber = '') - { - if (strlen($accountNumber) < 1) { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'shipmentUpdate', 'ACCOUNT_NUMBER not found'); - - return false; - } - - if (isset($orderCrm['delivery']['code'])) { - $crmCode = $orderCrm['delivery']['code']; - - if (isset($orderCrm['delivery']['data']['deliveryType'])) { - $crmService = $orderCrm['delivery']['data']['deliveryType']; - } elseif (isset($orderCrm['delivery']['service'])) { - $crmService = $orderCrm['delivery']['service']['code']; - } - - //select bitrix service code - $arDeliveryServiceAll = \Bitrix\Sale\Delivery\Services\Manager::getActiveList(); - foreach ($arDeliveryServiceAll as $arDeliveryService) { - $arDeliveryCode[$arDeliveryService['CODE']] = $arDeliveryService['ID']; - $arDeliveryID[$arDeliveryService['ID']] = $arDeliveryService; - if ($arDeliveryService['ID'] == $optionsDelivTypes[$crmCode]) { - $dCode = $arDeliveryService['CODE'] . ':' . $crmService; - } - } - //We will change delivery to this id - if ($crmService && $arDeliveryCode[$dCode]) { - $nowDelivery = $arDeliveryCode[$dCode]; - } elseif (!empty($optionsDelivTypes[$crmCode])) { - $nowDelivery = $optionsDelivTypes[$crmCode]; - } else { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'shipmentUpdate', 'Delivery ' . $crmCode . ' not found in options'); - - return false; - } - - //Find the current delivery in the order - $cnt = Bitrix\Sale\Internals\ShipmentTable::getCount(array('ORDER_ID' => $orderCrm['externalId'])); - if ($cnt > 0) {//update - $obDeliverys = \Bitrix\Sale\Internals\ShipmentTable::getList(array('filter' => array('ORDER_ID' => $orderCrm['externalId']), - 'order' => array('ID'))); - while ($arDelivery = $obDeliverys->fetch()) { - if ($arDelivery['DELIVERY_ID'] != $nowDelivery) { - \Bitrix\Sale\OrderTable::update($orderCrm['externalId'], array('DELIVERY_ID' => $nowDelivery)); - \Bitrix\Sale\Internals\ShipmentTable::update($arDelivery['ID'], array('DELIVERY_ID' => $nowDelivery, 'DELIVERY_NAME' => $arDeliveryID[$nowDelivery]['NAME'])); - } - } - if ($cnt == 1 && $arDelivery['DELIVERY_ID'] == 0) { - $shipment = Bitrix\Sale\Internals\ShipmentTable::add(array( - 'ORDER_ID' => $orderCrm['externalId'], - 'STATUS_ID' => 'DN', - 'PRICE_DELIVERY' => 0, - 'BASE_PRICE_DELIVERY' => 0, - 'CUSTOM_PRICE_DELIVERY' => 'N', - 'ALLOW_DELIVERY' => 'N', - 'DEDUCTED' => 'N', - 'RESERVED' => 'N', - 'DELIVERY_ID' => $nowDelivery, - 'DELIVERY_NAME' => $arDeliveryID[$nowDelivery]['NAME'], - 'CANCELED' => 'N', - 'MARKED' => 'N', - 'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(), - 'SYSTEM' => 'N', - 'ACCOUNT_NUMBER' => $accountNumber . '/2', - 'EXTERNAL_DELIVERY' => 'N', - 'UPDATED_1C' => 'N', - 'DATE_INSERT'=> new \Bitrix\Main\Type\DateTime() - )); - } - } else {//create - \Bitrix\Sale\OrderTable::update($orderCrm['externalId'], array('DELIVERY_ID' => $nowDelivery)); - $shipmentSystem = \Bitrix\Sale\Internals\ShipmentTable::add(array( - 'ORDER_ID' => $orderCrm['externalId'], - 'STATUS_ID' => 'DN', - 'CUSTOM_PRICE_DELIVERY' => 'N', - 'ALLOW_DELIVERY' => 'N', - 'DEDUCTED' => 'N', - 'RESERVED' => 'N', - 'DELIVERY_ID' => $nowDelivery, - 'DELIVERY_NAME' => $nowDelivery[$nowDelivery]['NAME'], - 'CANCELED' => 'N', - 'MARKED' => 'N', - 'SYSTEM' => 'Y', - 'ACCOUNT_NUMBER' => $accountNumber . '/1', - 'EXTERNAL_DELIVERY' => 'N', - 'UPDATED_1C' => 'N', - 'DATE_INSERT'=> new \Bitrix\Main\Type\DateTime() - )); - $shipment = Bitrix\Sale\Internals\ShipmentTable::add(array( - 'ORDER_ID' => $orderCrm['externalId'], - 'STATUS_ID' => 'DN', - 'PRICE_DELIVERY' => 0, - 'BASE_PRICE_DELIVERY' => 0, - 'CUSTOM_PRICE_DELIVERY' => 'N', - 'ALLOW_DELIVERY' => 'N', - 'DEDUCTED' => 'N', - 'RESERVED' => 'N', - 'DELIVERY_ID' => $nowDelivery, - 'DELIVERY_NAME' => $arDeliveryID[$nowDelivery]['NAME'], - 'CANCELED' => 'N', - 'MARKED' => 'N', - 'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(), - 'SYSTEM' => 'N', - 'ACCOUNT_NUMBER' => $accountNumber . '/2', - 'EXTERNAL_DELIVERY' => 'N', - 'UPDATED_1C' => 'N', - 'DATE_INSERT'=> new \Bitrix\Main\Type\DateTime() - )); - } - } else { - //search for the order on the delivery site and delete / replace with no delivery - $noOrderId = \Bitrix\Sale\Delivery\Services\EmptyDeliveryService::getEmptyDeliveryServiceId(); - \Bitrix\Sale\OrderTable::update($orderCrm['externalId'], array('DELIVERY_ID' => $noOrderId)); - $obDeliverys = Bitrix\Sale\Internals\ShipmentTable::getList(array('filter' => array('ORDER_ID' => $orderCrm['externalId']), - 'order' => array('ID'))); - $create = true; - while ($arDelivery = $obDeliverys->fetch()) { - \Bitrix\Sale\Internals\ShipmentTable::update($arDelivery['ID'], array('DELIVERY_ID' => $noOrderId, 'DELIVERY_NAME' => GetMessage('NO_DELIVERY'))); - $create = false; - } - if ($create) { - $shipmentSystem = \Bitrix\Sale\Internals\ShipmentTable::add(array( - 'ORDER_ID' => $orderCrm['externalId'], - 'STATUS_ID' => 'DN', - 'CUSTOM_PRICE_DELIVERY' => 'N', - 'ALLOW_DELIVERY' => 'N', - 'DEDUCTED' => 'N', - 'RESERVED' => 'N', - 'DELIVERY_ID' => $noOrderId, - 'DELIVERY_NAME' => GetMessage('NO_DELIVERY'), - 'CANCELED' => 'N', - 'MARKED' => 'N', - 'SYSTEM' => 'Y', - 'ACCOUNT_NUMBER' => $accountNumber . '/1', - 'EXTERNAL_DELIVERY' => 'N', - 'UPDATED_1C' => 'N', - 'DATE_INSERT'=> new \Bitrix\Main\Type\DateTime() - )); - $shipment = Bitrix\Sale\Internals\ShipmentTable::add(array( - 'ORDER_ID' => $orderCrm['externalId'], - 'STATUS_ID' => 'DN', - 'PRICE_DELIVERY' => 0, - 'BASE_PRICE_DELIVERY' => 0, - 'CUSTOM_PRICE_DELIVERY' => 'N', - 'ALLOW_DELIVERY' => 'N', - 'DEDUCTED' => 'N', - 'RESERVED' => 'N', - 'DELIVERY_ID' => $noOrderId, - 'DELIVERY_NAME' => GetMessage('NO_DELIVERY'), - 'CANCELED' => 'N', - 'MARKED' => 'N', - 'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(), - 'SYSTEM' => 'N', - 'ACCOUNT_NUMBER' => $accountNumber . '/2', - 'EXTERNAL_DELIVERY' => 'N', - 'UPDATED_1C' => 'N', - 'DATE_INSERT'=> new \Bitrix\Main\Type\DateTime() - )); - } - } - - return true; - } - - public static function updateShipmentItem($orderId) - { - $orderBasket = \Bitrix\Sale\Internals\BasketTable::getList(array( - 'filter' => array('ORDER_ID' => $orderId), - 'select' => array('ID', 'QUANTITY') - )); - - $basketItems = array(); - while ($basketItem = $orderBasket->fetch()) { - $basketItems[] = $basketItem; - $bItems[] = $basketItem['ID']; - } - - $obShipments = \Bitrix\Sale\Internals\ShipmentTable::getList(array( - 'filter' => array('ORDER_ID' => $orderId, 'SYSTEM' => 'N'), - 'select' => array('ID') - )); - - $shipmentItems = array(); - while ($arShipment = $obShipments->fetch()) { - $dlvBaslet = \Bitrix\Sale\Internals\ShipmentItemTable::getList(array( - 'order' => array('ORDER_DELIVERY_ID'), - 'filter' => array('ORDER_DELIVERY_ID' => $arShipment['ID']) - )); - $shipmentItems[$arShipment['ID']] = array(); - while ($item = $dlvBaslet->fetch()) { - $shipmentItems[$arShipment['ID']][] = $item; - } - } - - foreach ($basketItems as $basketItem) { - foreach ($shipmentItems as $key => $arShipmentItems) { - $found = false; - foreach ($arShipmentItems as $elShipmentItem) { - if (!in_array($elShipmentItem['BASKET_ID'], $bItems)) { - //delete the element - \Bitrix\Sale\Internals\ShipmentItemTable::delete($elShipmentItem['ID']); - } - if ($elShipmentItem['BASKET_ID'] == $basketItem['ID']) { - //found - $found = true; - //update quantity - if ($elShipmentItem['QUANTITY'] != $basketItem['QUANTITY']) { - \Bitrix\Sale\Internals\ShipmentItemTable::update($elShipmentItem['ID'], array('QUANTITY' => $basketItem['QUANTITY'])); - } - - } - } - if (!$found) { - //create - \Bitrix\Sale\Internals\ShipmentItemTable::add(array( - 'ORDER_DELIVERY_ID' => $key, - 'BASKET_ID' => $basketItem['ID'], - 'DATE_INSERT' => new \Bitrix\Main\Type\DateTime(), - 'QUANTITY' => $basketItem['QUANTITY'], - 'RESERVED_QUANTITY' => '0.00', - )); - } - } - } - } - - public static function paySystemUpdate($order, $optionsPayment, $accountNumber = '') - { - if (strlen($accountNumber) < 1) { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'paySystemUpdate', 'ACCOUNT_NUMBER not found'); - - return false; - } - - if (isset($order['paymentType'])) { - if ($optionsPayment[$order['paymentType']]) { - $paymentList = RCrmActions::PaymentList(); - $arPayments = array(); - $arPaymentsName = array(); - foreach ($paymentList as $payment) { - $arPayments[] = $payment['ID']; - $arPaymentsName[$payment['ID']] = $payment['NAME']; - } - - if (in_array($optionsPayment[$order['paymentType']], $arPayments)) { - \Bitrix\Sale\OrderTable::update($order['externalId'], array('PAY_SYSTEM_ID' => $optionsPayment[$order['paymentType']])); - $payment = \Bitrix\Sale\Internals\PaymentTable::getList(array( - 'filter' => array('ORDER_ID' => $order['externalId']), - 'order' => array('ID') - ))->fetch(); - if ($payment) {//update payment - \Bitrix\Sale\Internals\PaymentTable::update($payment['ID'], array('PAY_SYSTEM_ID' => $optionsPayment[$order['paymentType']], 'PAY_SYSTEM_NAME' => $arPaymentsName[$optionsPayment[$order['paymentType']]], 'SUM' => $order['summ'])); - } else { - \Bitrix\Sale\Internals\PaymentTable::add(array( - 'ORDER_ID' => $order['externalId'], - 'PAID' => 'N', - 'PAY_SYSTEM_ID' => $optionsPayment[$order['paymentType']], - 'SUM' => $order['summ'], - 'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(), - 'PAY_SYSTEM_NAME' => $arPaymentsName[$optionsPayment[$order['paymentType']]], - 'IS_RETURN' => 'N', - 'ACCOUNT_NUMBER' => $accountNumber . '/1', - 'PRICE_COD' => '0.00', - 'EXTERNAL_PAYMENT' => 'N', - 'UPDATED_1C' => 'N' - )); - } - } else { - RCrmActions::eventLog('RetailCrmHistory::paySystemUpdate', 'RCrmActions::PaymentList()', 'Error paySystem not found in order id=' . $order['externalId']); - } - } else { - RCrmActions::eventLog('RetailCrmHistory::paySystemUpdate', 'RCrmActions::PaymentList()', 'Error paySystem not found in option in order id=' . $order['externalId']);; - } - } else { - \Bitrix\Sale\OrderTable::update($order['externalId'], array('PAY_SYSTEM_ID' => '')); - $payment = \Bitrix\Sale\Payment::getList(array( - 'filter' => array('ORDER_ID' => $order['externalId']), - 'order' => array('ID') - ))->fetch(); - - if ($payment['ID']) { - \Bitrix\Sale\Internals\PaymentTable::delete($payment['ID']); - } - } - } - - public static function newValue($value) - { - if (array_key_exists('code', $value)) { - return $value['code']; - } else { - return $value; - } - } - - public static function removeEmpty($inputArray) - { - $outputArray = array(); - - if (!empty($inputArray)) { - foreach ($inputArray as $key => $element) { - if (!empty($element) || $element === 0 || $element === '0') { - if (is_array($element)) { - $element = self::removeEmpty($element); - } - - $outputArray[$key] = $element; - } - } - } - - return $outputArray; - } - - public static function setProp($obj, $value = '', $prop = '') - { - if (!isset($obj)) { - return false; - } - if ($prop && $value) { - $obj->setField($prop, $value); - } elseif ($value && !$prop) { - $obj->setValue($value); - } elseif (!$value && !$prop) { - $obj->delete(); - } - - return true; - } - - public static function getExistsItem($basket, $moduleId, $productId) - { - foreach ($basket as $basketItem) { - $itemExists = ($basketItem->getField('PRODUCT_ID') == $productId && $basketItem->getField('MODULE') == $moduleId); - - if ($itemExists) { - return $basketItem; - } - } - - return false; - } - - public static function getInfoElement($offerId) - { - $elementInfo = CIBlockElement::GetByID($offerId)->fetch(); - $url = CAllIBlock::ReplaceDetailUrl($elementInfo['DETAIL_PAGE_URL'], $elementInfo, false, 'E'); - - $info = array( - 'NAME' => $elementInfo['NAME'], - 'URL' => $url, - ); - - return $info; - } -} - -class RetailUser extends CUser -{ - public function GetID() - { - $rsUser = CUser::GetList(($by = 'ID'), ($order = 'DESC'), array('LOGIN' => 'retailcrm%')); - if ($arUser = $rsUser->Fetch()) { - return $arUser['ID']; - } else { - $retailUser = new CUser; - - $userPassword = uniqid(); - - $arFields = array( - "NAME" => 'retailcrm', - "LAST_NAME" => 'retailcrm', - "EMAIL" => 'retailcrm@retailcrm.com', - "LOGIN" => 'retailcrm', - "LID" => "ru", - "ACTIVE" => "Y", - "GROUP_ID" => array(2), - "PASSWORD" => $userPassword, - "CONFIRM_PASSWORD" => $userPassword - ); - $id = $retailUser->Add($arFields); - - if (!$id) { - return null; - } else { - return $id; - } - } - } -} diff --git a/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php b/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php index 3fe712e9..41e6f2d0 100644 --- a/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php +++ b/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php @@ -1042,7 +1042,7 @@ class RetailCrmHistory $vatRate = null; if (RetailcrmConfigProvider::getOrderVat() === 'Y') { - if ($product['vatRate'] === 0) { + if ($product['vatRate'] === 0 || $product['vatRate'] === 'none') { $vatRate = 0; } elseif($product['vatRate'] !== null) { $vatRate = $product['vatRate'] / 100; diff --git a/intaro.retailcrm/classes/general/order/RetailCrmOrder_v4.php b/intaro.retailcrm/classes/general/order/RetailCrmOrder_v4.php deleted file mode 100644 index 08feda80..00000000 --- a/intaro.retailcrm/classes/general/order/RetailCrmOrder_v4.php +++ /dev/null @@ -1,403 +0,0 @@ - $customer) - */ - public static function orderSend($arFields, $api, $arParams, $send = false, $site = null, $methodApi = 'ordersEdit') - { - if (!$api || empty($arParams)) { // add cond to check $arParams - return false; - } - - if (empty($arFields)) { - RCrmActions::eventLog('RetailCrmOrder::orderSend', 'empty($arFields)', 'incorrect order'); - return false; - } - - $currency = RetailcrmConfigProvider::getCurrencyOrDefault(); - $order = array( - 'number' => $arFields['NUMBER'], - 'externalId' => $arFields['ID'], - 'createdAt' => $arFields['DATE_INSERT'], - 'customer' => array('externalId' => $arFields['USER_ID']), - 'paymentType' => isset($arParams['optionsPayTypes'][$arFields['PAYMENTS'][0]]) ? - $arParams['optionsPayTypes'][$arFields['PAYMENTS'][0]] : '', - 'paymentStatus' => isset($arParams['optionsPayment'][$arFields['PAYED']]) ? - $arParams['optionsPayment'][$arFields['PAYED']] : '', - 'orderType' => isset($arParams['optionsOrderTypes'][$arFields['PERSON_TYPE_ID']]) ? - $arParams['optionsOrderTypes'][$arFields['PERSON_TYPE_ID']] : '', - 'status' => isset($arParams['optionsPayStatuses'][$arFields['STATUS_ID']]) ? - $arParams['optionsPayStatuses'][$arFields['STATUS_ID']] : '', - 'customerComment' => $arFields['USER_DESCRIPTION'], - 'managerComment' => $arFields['COMMENTS'], - 'delivery' => array( - 'cost' => $arFields['PRICE_DELIVERY'] - ), - ); - - if ($send && isset($_COOKIE['_rc']) && $_COOKIE['_rc'] != '') { - $order['customer']['browserId'] = $_COOKIE['_rc']; - } - - $order['contragent']['contragentType'] = $arParams['optionsContragentType'][$arFields['PERSON_TYPE_ID']]; - - //fields - foreach ($arFields['PROPS']['properties'] as $prop) { - if (!empty($arParams['optionsLegalDetails']) - && $search = array_search($prop['CODE'], $arParams['optionsLegalDetails'][$arFields['PERSON_TYPE_ID']]) - ) { - $order['contragent'][$search] = $prop['VALUE'][0];//legal order data - } elseif (!empty($arParams['optionsCustomFields']) - && $search = array_search($prop['CODE'], $arParams['optionsCustomFields'][$arFields['PERSON_TYPE_ID']]) - ) { - $order['customFields'][$search] = $prop['VALUE'][0];//custom properties - } elseif ($search = array_search($prop['CODE'], $arParams['optionsOrderProps'][$arFields['PERSON_TYPE_ID']])) {//other - if (in_array($search, array('fio', 'phone', 'email'))) {//fio, phone, email - if ($search == 'fio') { - $order = array_merge($order, RCrmActions::explodeFio($prop['VALUE'][0]));//add fio fields - } elseif ($search == 'email' && mb_strlen($prop['VALUE'][0]) > 100) { - continue; - } else { - $order[$search] = $prop['VALUE'][0];//phone, email - } - } else {//address - if ($prop['TYPE'] == 'LOCATION' && isset($prop['VALUE'][0]) && $prop['VALUE'][0] != '') { - $arLoc = \Bitrix\Sale\Location\LocationTable::getByCode($prop['VALUE'][0])->fetch(); - if ($arLoc) { - $server = \Bitrix\Main\Context::getCurrent()->getServer()->getDocumentRoot(); - $countrys = array(); - if (file_exists($server . '/bitrix/modules/intaro.retailcrm/classes/general/config/country.xml')) { - $countrysFile = simplexml_load_file($server . '/bitrix/modules/intaro.retailcrm/classes/general/config/country.xml'); - foreach ($countrysFile->country as $country) { - $countrys[RCrmActions::fromJSON((string) $country->name)] = (string) $country->alpha; - } - } - $location = \Bitrix\Sale\Location\Name\LocationTable::getList(array( - 'filter' => array('=LOCATION_ID' => $arLoc['CITY_ID'], 'LANGUAGE_ID' => 'ru') - ))->fetch(); - if (count($countrys) > 0) { - $countryOrder = \Bitrix\Sale\Location\Name\LocationTable::getList(array( - 'filter' => array('=LOCATION_ID' => $arLoc['COUNTRY_ID'], 'LANGUAGE_ID' => 'ru') - ))->fetch(); - if(isset($countrys[$countryOrder['NAME']])){ - $order['countryIso'] = $countrys[$countryOrder['NAME']]; - } - } - } - $prop['VALUE'][0] = $location['NAME']; - } - - $order['delivery']['address'][$search] = $prop['VALUE'][0]; - } - } - } - - //deliverys - if (array_key_exists($arFields['DELIVERYS'][0]['id'], $arParams['optionsDelivTypes'])) { - $order['delivery']['code'] = $arParams['optionsDelivTypes'][$arFields['DELIVERYS'][0]['id']]; - if (isset($arFields['DELIVERYS'][0]['service']) && $arFields['DELIVERYS'][0]['service'] != '') { - $order['delivery']['service']['code'] = $arFields['DELIVERYS'][0]['service']; - } - } - - //basket - foreach ($arFields['BASKET'] as $product) { - $item = array( - 'quantity' => $product['QUANTITY'], - 'offer' => array('externalId' => $product['PRODUCT_ID'], - 'xmlId' => $product['PRODUCT_XML_ID'] - ), - 'productName' => $product['NAME'] - ); - - $pp = CCatalogProduct::GetByID($product['PRODUCT_ID']); - if (is_null($pp['PURCHASING_PRICE']) == false) { - if ($pp['PURCHASING_CURRENCY'] && $currency != $pp['PURCHASING_CURRENCY']) { - $purchasePrice = CCurrencyRates::ConvertCurrency( - (double) $pp['PURCHASING_PRICE'], - $pp['PURCHASING_CURRENCY'], - $currency - ); - } else { - $purchasePrice = $pp['PURCHASING_PRICE']; - } - - $item['purchasePrice'] = $purchasePrice; - } - $item['discount'] = (double) $product['DISCOUNT_PRICE']; - $item['discountPercent'] = 0; - $item['initialPrice'] = (double) $product['PRICE'] + (double) $product['DISCOUNT_PRICE']; - - $order['items'][] = $item; - } - - //send - if (function_exists('retailCrmBeforeOrderSend')) { - $newResOrder = retailCrmBeforeOrderSend($order, $arFields); - if (is_array($newResOrder) && !empty($newResOrder)) { - $order = $newResOrder; - } elseif ($newResOrder === false) { - RCrmActions::eventLog('RetailCrmOrder::orderSend', 'retailCrmBeforeOrderSend()', 'OrderID = ' . $arFields['ID'] . '. Sending canceled after retailCrmBeforeOrderSend'); - - return false; - } - } - - $normalizer = new RestNormalizer(); - $order = $normalizer->normalize($order, 'orders'); - - Logger::getInstance()->write($order, 'orderSend'); - - if($send) { - if (!RCrmActions::apiMethod($api, $methodApi, __METHOD__, $order, $site)) { - return false; - } - } - - return $order; - } - - /** - * Mass order uploading, without repeating; always returns true, but writes error log - * - * @param int $pSize - * @param bool $failed -- flag to export failed orders - * @param bool $orderList - * - * @return boolean - * @throws \Bitrix\Main\ArgumentNullException - * @throws \Bitrix\Main\ObjectPropertyException - * @throws \Bitrix\Main\SystemException - * @throws \Bitrix\Main\ArgumentException - */ - public static function uploadOrders($pSize = 50, $failed = false, $orderList = false) - { - if (!RetailcrmDependencyLoader::loadDependencies()) { - return false; - } - - $resOrders = array(); - $resCustomers = array(); - $orderIds = array(); - - $lastUpOrderId = RetailcrmConfigProvider::getLastOrderId(); - $failedIds = RetailcrmConfigProvider::getFailedOrdersIds(); - - if ($failed == true && $failedIds !== false && count($failedIds) > 0) { - $orderIds = $failedIds; - } elseif ($orderList !== false && count($orderList) > 0) { - $orderIds = $orderList; - } else { - $dbOrder = \Bitrix\Sale\Internals\OrderTable::GetList(array( - 'order' => array("ID" => "ASC"), - 'filter' => array('>ID' => $lastUpOrderId), - 'limit' => $pSize, - 'select' => array('ID') - )); - while ($arOrder = $dbOrder->fetch()) { - $orderIds[] = $arOrder['ID']; - } - } - - if (count($orderIds)<=0) { - return false; - } - - $api_host = COption::GetOptionString(self::$MODULE_ID, self::$CRM_API_HOST_OPTION, 0); - $api_key = COption::GetOptionString(self::$MODULE_ID, self::$CRM_API_KEY_OPTION, 0); - - $optionsSitesList = RetailcrmConfigProvider::getSitesList(); - $optionsOrderTypes = RetailcrmConfigProvider::getOrderTypes(); - $optionsDelivTypes = RetailcrmConfigProvider::getDeliveryTypes(); - $optionsPayTypes = RetailcrmConfigProvider::getPaymentTypes(); - $optionsPayStatuses = RetailcrmConfigProvider::getPaymentStatuses(); // --statuses - $optionsPayment = RetailcrmConfigProvider::getPayment(); - $optionsOrderProps = RetailcrmConfigProvider::getOrderProps(); - $optionsLegalDetails = RetailcrmConfigProvider::getLegalDetails(); - $optionsContragentType = RetailcrmConfigProvider::getContragentTypes(); - $optionsCustomFields = RetailcrmConfigProvider::getCustomFields(); - - $api = new RetailCrm\ApiClient(RetailcrmConfigProvider::getApiUrl(), RetailcrmConfigProvider::getApiKey()); - - $arParams = array( - 'optionsOrderTypes' => $optionsOrderTypes, - 'optionsDelivTypes' => $optionsDelivTypes, - 'optionsPayTypes' => $optionsPayTypes, - 'optionsPayStatuses' => $optionsPayStatuses, - 'optionsPayment' => $optionsPayment, - 'optionsOrderProps' => $optionsOrderProps, - 'optionsLegalDetails' => $optionsLegalDetails, - 'optionsContragentType' => $optionsContragentType, - 'optionsSitesList' => $optionsSitesList, - 'optionsCustomFields' => $optionsCustomFields, - ); - - $recOrders = array(); - foreach ($orderIds as $orderId) { - $id = \Bitrix\Sale\Order::load($orderId); - if (!$id) { - continue; - } - $order = self::orderObjToArr($id); - $user = Bitrix\Main\UserTable::getById($order['USER_ID'])->fetch(); - - $site = count($optionsSitesList) > 1 ? $optionsSitesList[$order['LID']] : null; - - $arCustomers = RetailCrmUser::customerSend($user, $api, $optionsContragentType[$order['PERSON_TYPE_ID']], false, $site); - $arOrders = self::orderSend($order, $api, $arParams, false, $site); - - if (!$arCustomers || !$arOrders) { - continue; - } - - $resCustomers[$order['LID']][] = $arCustomers; - $resOrders[$order['LID']][] = $arOrders; - - $recOrders[] = $orderId; - } - - if (count($resOrders) > 0) { - foreach ($resCustomers as $key => $customerLoad) { - if ($optionsSitesList) { - if (array_key_exists($key, $optionsSitesList) && $optionsSitesList[$key] != null) { - $site = $optionsSitesList[$key]; - } else { - continue; - } - } elseif (!$optionsSitesList) { - $site == null; - } - if (RCrmActions::apiMethod($api, 'customersUpload', __METHOD__, $customerLoad, $site) === false) { - return false; - } - if (count($optionsSitesList) > 1) { - time_nanosleep(0, 250000000); - } - } - foreach ($resOrders as $key => $orderLoad) { - if ($optionsSitesList) { - if (array_key_exists($key, $optionsSitesList) && $optionsSitesList[$key] != null) { - $site = $optionsSitesList[$key]; - } else { - continue; - } - } elseif (!$optionsSitesList) { - $site == null; - } - if (RCrmActions::apiMethod($api, 'ordersUpload', __METHOD__, $orderLoad, $site) === false) { - return false; - } - if (count($optionsSitesList) > 1) { - time_nanosleep(0, 250000000); - } - } - if ($failed == true && $failedIds !== false && count($failedIds) > 0) { - COption::SetOptionString(self::$MODULE_ID, self::$CRM_ORDER_FAILED_IDS, serialize(array_diff($failedIds, $recOrders))); - } elseif ($lastUpOrderId < max($recOrders) && $orderList === false) { - COption::SetOptionString(self::$MODULE_ID, self::$CRM_ORDER_LAST_ID, max($recOrders)); - } - } - - return true; - } - - /** - * Returns true if provided order array is corporate order data. v4 doesn't have corporate orders. - * - * @param array|\ArrayAccess $order - * - * @return bool - */ - public static function isOrderCorporate($order) - { - return false; - } - - public static function orderObjToArr($obOrder) - { - $culture = new \Bitrix\Main\Context\Culture(array("FORMAT_DATETIME" => "Y-m-d HH:i:s")); - $arOrder = array( - 'ID' => $obOrder->getId(), - 'NUMBER' => $obOrder->getField('ACCOUNT_NUMBER'), - 'LID' => $obOrder->getSiteId(), - 'DATE_INSERT' => $obOrder->getDateInsert()->toString($culture), - 'STATUS_ID' => $obOrder->getField('STATUS_ID'), - 'USER_ID' => $obOrder->getUserId(), - 'PERSON_TYPE_ID' => $obOrder->getPersonTypeId(), - 'CURRENCY' => $obOrder->getCurrency(), - 'PAYMENTS' => $obOrder->getPaymentSystemId(), - 'PAYED' => $obOrder->isPaid() ? 'Y' : 'N', - 'DELIVERYS' => array(), - 'PRICE_DELIVERY' => $obOrder->getDeliveryPrice(), - 'PROPS' => $obOrder->getPropertyCollection()->getArray(), - 'DISCOUNTS' => $obOrder->getDiscount()->getApplyResult(), - 'BASKET' => array(), - 'USER_DESCRIPTION' => $obOrder->getField('USER_DESCRIPTION'), - 'COMMENTS' => $obOrder->getField('COMMENTS'), - 'REASON_CANCELED' => $obOrder->getField('REASON_CANCELED'), - ); - - $shipmentList = $obOrder->getShipmentCollection(); - foreach ($shipmentList as $shipmentData) { - if ($shipmentData->isSystem()) { - continue; - } - - if ($shipmentData->getDeliveryId()) { - $delivery = \Bitrix\Sale\Delivery\Services\Manager::getById($shipmentData->getDeliveryId()); - $siteDeliverys = RCrmActions::DeliveryList(); - foreach ($siteDeliverys as $siteDelivery) { - if ($siteDelivery['ID'] == $delivery['ID'] && $siteDelivery['PARENT_ID'] == 0) { - unset($delivery['PARENT_ID']); - } - } - if ($delivery['PARENT_ID']) { - $servise = explode(':', $delivery['CODE']); - $shipment = array('id' => $delivery['PARENT_ID'], 'service' => $servise[1]); - } else { - $shipment = array('id' => $delivery['ID']); - } - $arOrder['DELIVERYS'][] = $shipment; - } - } - - $basketItems = $obOrder->getBasket(); - foreach ($basketItems as $item) { - $arOrder['BASKET'][] = $item->getFields(); - } - - return $arOrder; - } -} diff --git a/intaro.retailcrm/description.ru b/intaro.retailcrm/description.ru index b5ba1fab..f2c60018 100644 --- a/intaro.retailcrm/description.ru +++ b/intaro.retailcrm/description.ru @@ -1 +1 @@ -- Исправлены ошибки при работе с программой лояльности \ No newline at end of file +- Удалена поддержка API V4 diff --git a/intaro.retailcrm/install/version.php b/intaro.retailcrm/install/version.php index 107fbc2b..5d14bc99 100644 --- a/intaro.retailcrm/install/version.php +++ b/intaro.retailcrm/install/version.php @@ -1,6 +1,6 @@ '6.4.4', - 'VERSION_DATE' => '2023-09-01 10:00:00' + 'VERSION' => '6.4.5', + 'VERSION_DATE' => '2023-09-01 10:30:00' ]; diff --git a/intaro.retailcrm/options.php b/intaro.retailcrm/options.php index ea77b462..d00bee64 100644 --- a/intaro.retailcrm/options.php +++ b/intaro.retailcrm/options.php @@ -576,9 +576,7 @@ if (isset($_POST['Update']) && ($_POST['Update'] === 'Y')) { $version = COption::GetOptionString($mid, $CRM_API_VERSION); if (htmlspecialchars(trim($_POST['api_version'])) != $version) { - if (htmlspecialchars(trim($_POST['api_version'])) === 'v4') { - $version = 'v4'; - } elseif (htmlspecialchars(trim($_POST['api_version'])) === 'v5') { + if (htmlspecialchars(trim($_POST['api_version'])) === 'v5') { $version = 'v5'; } else { LocalRedirect($uri); @@ -2295,13 +2293,15 @@ if (isset($_POST['Update']) && ($_POST['Update'] === 'Y')) { -