1
0
Fork 0
mirror of synced 2025-04-10 04:31:04 +00:00

Compare commits

...

63 commits

Author SHA1 Message Date
ellynoize
e61259ded9
Исправлена передача габаритов при выгрузке заказов по агенту (#388) 2025-03-26 15:53:37 +03:00
ellynoize
0359315c79
Исправлена передача некорректного статуса оплаты для отмененных заказов (#387) 2025-03-26 15:45:25 +03:00
Kocmonavtik
08ff21ce04
Исправление обновления модуля (#385) 2025-03-05 10:33:10 +03:00
ellynoize
de7ecd4100
Исправлена ошибка экспорта дополнительных свойств товаров (#386) 2025-03-03 12:58:48 +03:00
ellynoize
54692c50d4
Исправлена ошибка установки модуля на PHP 8.0 2025-02-04 09:07:06 +03:00
ellynoize
61044988d5
Передача нулевой закупочной стоимости в экспорте каталога (#382) 2025-01-30 09:20:26 +03:00
ellynoize
7a36fa5de7
Исправлена ошибка редактирования интеграционных доставок (#381) 2025-01-28 11:47:01 +03:00
ellynoize
8cf4420592
Исправлено некорректное удаление признака применения промокода (#380) 2025-01-28 10:45:49 +03:00
Kocmonavtik
84c7d10146
Исправлены ошибки при обновлении модуля (#379) 2025-01-15 10:24:03 +03:00
ellynoize
8c38d21477
Исправлена выгрузка архива заказов при установке модуля (#378) 2025-01-14 15:05:46 +03:00
Kocmonavtik
115cf33423
Исправление API методов по работе с пользовательскими полями (#377) 2024-12-17 15:11:37 +03:00
Kocmonavtik
3162031b65
Динамическое добавление свойств в ICML (#375) 2024-12-10 14:33:00 +03:00
Aleksei Novikov
1ec3bccd0c
Исправлена поломка заказов с промокодом Maxma при включенной передаче корзины в CRM (#376) 2024-12-09 12:48:35 +03:00
ellynoize
41257b9d7c
Исправлена выгрузка заказов через агент (#372) 2024-11-05 12:42:39 +03:00
Kocmonavtik
b68779a054
Исправлена подписка модуля на событие сохранения заказа (#371) 2024-11-05 09:24:39 +03:00
ellynoize
d25c7fc484
Передача профилей модуля Почты России (#370) 2024-10-28 11:21:46 +03:00
ellynoize
317a30b682
Бамп версии модуля (#369) 2024-10-24 10:33:08 +03:00
ellynoize
534757e6c6
Исправлена подписка на событие сохранения заказа (#368) 2024-10-23 17:05:39 +03:00
ellynoize
7e260a2d22
Исправлена ошибка агента выгрузки изменений при наличии у заказа клиента без магазина (#367) 2024-10-22 09:42:58 +03:00
ellynoize
6fb061e6cc
Добавлена передача дополнительных параметров в GET запросах (#366) 2024-10-14 16:59:41 +03:00
ellynoize
a77b29cd49
Исправлена подписка на событие при обновлении (#365) 2024-10-03 12:46:41 +03:00
ellynoize
c1deb9e91e
Добавлено логирование ответа от API при неудачном создании заказа (#364) 2024-09-24 14:12:33 +03:00
ellynoize
1d2a87f277
Добавление передачи контрагентов с типом ИП (#363) 2024-09-23 13:21:59 +03:00
ellynoize
74833ed2db
Перенос подписки на событие сохрания заказа в установку модуля (#362) 2024-09-23 09:46:10 +03:00
alexxmoree
8eab4864c5
Исправление возврата статуса заказа на предыдущий (#361) 2024-09-11 12:41:17 +03:00
Rinacoder
169509c263
Исправлена передача изменений по клиентам, отсутствующим в Bitrix (#360) 2024-09-06 15:10:19 +03:00
Kocmonavtik
1b64044013
Исправлено удаление модуля (#359) 2024-09-02 09:12:05 +03:00
Uryvskiy Dima
a83ff3cc6b
Улучшена генерация каталога с маркированными товарами (#357) 2024-08-12 11:58:24 +03:00
Kocmonavtik
6a6a4545b8
Добавление переводов для программы лояльности (#356) 2024-08-08 09:47:15 +03:00
Uryvskiy Dima
10745c4c8d
Исправлена ошибка с присвоением externalId при добавлении товара в заказ как разные товарные позиции из CRM (#355) 2024-08-06 11:17:14 +03:00
Kocmonavtik
ebb32869aa
Добавлена передача скидок на торговые позиции в брошенных корзинах (#353) 2024-07-18 14:14:36 +03:00
Uryvskiy Dima
3e3e37b297
Добавлена передача поля link при выгрузке брошенных корзин (#352) 2024-07-15 17:24:27 +03:00
Kocmonavtik
1ab3dacaf7
ref #93680 Рефакторинг настроек и установки модуля, добавление переводов в настройках модуля (#351) 2024-06-21 11:37:07 +03:00
roadmoore
0550d8ffba
Исправление работы программы лояльности при использования опции "Подтверждение списания по смс" (#350) 2024-06-18 09:21:06 +03:00
Kocmonavtik
51f8c98010
ref #95555 Добавлена возможность исправления даты регистрации клиентов в системе (#349) 2024-06-06 18:17:43 +03:00
Uryvskiy Dima
ee6d654d8c
ref #73933 Добавлена передача признака маркировки товара в ICML каталоге (#348) 2024-06-04 12:05:51 +03:00
Kocmonavtik
453bc495c0
ref #88907 Доработка аннотаций в модуле (#346) 2024-04-29 11:44:31 +03:00
Kocmonavtik
1eabbe323b
ref #95225 Добавлена передача услуг через ICML каталог (#345) 2024-04-24 09:48:51 +03:00
Xyslik
c1f59ead7f
#95443 Исправляем работу кнопки "Выгрузка служб доставок" (#344) 2024-04-22 09:24:27 +03:00
Kocmonavtik
cbddd69001
Исправление присваивания номера заказа к платежу при синхронизации с CRM (#343) 2024-04-03 10:59:10 +03:00
Kocmonavtik
7f69ebfa1f
ref #93089 Исправлена ошибка подстановки домена при генерации каталога (#342) 2024-04-01 09:34:11 +03:00
Kocmonavtik
830fe34e3e
ref #94529 Исправление ошибки дублирования скидок (#341) 2024-04-01 09:04:43 +03:00
Kocmonavtik
85749c8602
Обновление версии модуля (#340) 2024-03-18 14:25:20 +03:00
Kocmonavtik
d298cffb22
ref# 94173 Доработка вывода ошибок при установке и настройке модуля. (#339) 2024-03-18 14:00:13 +03:00
Kocmonavtik
50997b729f
Исправление проверки ФИО при отправке заказа в систему (#338) 2024-03-01 14:04:26 +03:00
Kocmonavtik
4f07b9a16b
ref #94088 (#336) 2024-02-05 10:53:22 +03:00
Kocmonavtik
ad04daa904
ref #92904 Передача данных интегрированных оплат (#335) 2024-01-24 15:01:13 +03:00
Kocmonavtik
b8ac495a37
ref #93387 Экспорт дополнительных свойств товаров через конфигурируемый файл (#334) 2024-01-18 11:48:35 +03:00
Kocmonavtik
d9cdfced49
ref #92570 Исправление вывода справочников при установке модуля (#333) 2024-01-15 12:27:40 +03:00
Kocmonavtik
a66ec1d663
ref #93511 Исправление передачи адреса доставки (#332) 2024-01-09 10:44:17 +03:00
MichaelTkach94
46570494a3
Исправлен баг с двойной сериализацией при получении списка пользователей (#331) 2023-12-28 11:35:36 +03:00
Uryvskiy Dima
62b165f5de
ref #93164 Не выгружать на сайт 1C-Bitrix заказы с определенным способом оформления (#330) 2023-12-21 17:24:46 +03:00
Kocmonavtik
3d3326018a
ref #92774 Исправлено отображение настройки пользовательских полей (#329) 2023-12-21 15:09:31 +03:00
Kocmonavtik
6d479ae441
ref #92774 Поддержка пользовательских полей (#323) 2023-12-19 17:13:31 +03:00
Uryvskiy Dima
e918317f6a
ref #93307 Исправлена ошибка с получением данных программы лояльности администратора при изменении заказа в админке (#327) 2023-12-13 17:22:33 +03:00
Uryvskiy Dima
992162c01e
ref #93434 Исправлена критическая ошибка при переходе в настройки модуля (#326) 2023-12-12 16:51:15 +03:00
Uryvskiy Dima
d47852dc31
Добавил описание изменений для релиза (#325) 2023-12-08 17:10:13 +03:00
Uryvskiy Dima
18a10bf916
Исправлена ошибка при передаче подписки на рекламно-информационные рассылки (#324) 2023-12-08 12:27:10 +03:00
Kocmonavtik
748ebdf4a3
ref #92358 Передача трек номера из системы (#321) 2023-10-26 14:36:22 +03:00
Uryvskiy Dima
693031012d
ref #91901 Исправлена ошибка при деактивации модуля (#319) 2023-10-24 12:53:02 +03:00
Uryvskiy Dima
a0005e1ff8
ref #92177 Добавлена передача адреса пункта самовывоза в заказе из Bitrix в CRM (#317) 2023-10-18 16:16:35 +03:00
Uryvskiy Dima
7b7371e37f
ref #92205 Добавил описание изменений для релиза 2023-10-16 10:15:44 +03:00
Uryvskiy Dima
7404105dec
ref #92205 Изменена логика передачи адреса доставки в заказе из Bitrix в CRM (#315) 2023-10-13 12:49:09 +03:00
344 changed files with 5753 additions and 3147 deletions

View file

@ -20,11 +20,11 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
php-version: ['7.4', '8.0']
php-version: ['8.1']
bitrix-edition: ['small_business_encode', 'business_encode']
services:
mysql:
image: mysql:5.7
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: ${{ env.DB_BITRIX_PASS }}
MYSQL_DATABASE: bitrix
@ -49,7 +49,7 @@ jobs:
run: composer validate
- name: Cache Composer packages
id: composer-cache
uses: actions/cache@v2
uses: actions/cache@v3
with:
path: vendor
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
@ -68,10 +68,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup PHP 7.2
- name: Setup PHP 8.1
uses: shivammathur/setup-php@v2
with:
php-version: 7.2
php-version: 8.1
ini-values: short_open_tag=On, mbstring.func_overload=2, mbstring.internal_encoding="UTF-8"
- name: Build release
run: |

View file

@ -1,3 +1,182 @@
## 2025-03-26 v6.6.11
- Исправлена передача габаритов при выгрузке заказов по агенту
## 2025-03-25 v6.6.10
- Исправлено некорректное изменение статуса оплаты отмененных заказов
## 2025-03-04 v6.6.9
- Исправлено обновление модуля
## 2025-03-03 v6.6.8
- Исправлена ошибка экспорта дополнительных свойств товаров
## 2025-02-04 v6.6.7
- Исправлена ошибка установки модуля на PHP 8.0
## 2025-01-29 v6.6.6
- Поддержка нулевой закупочной стоимости при генерации каталога
## 2025-01-28 v6.6.5
- Исправлена ошибка редактирования интеграционных доставок при активации опции передачи статусов интеграционных оплат
## 2025-01-27 v6.6.4
- Исправлено некорректное удаление признака применения промокода при изменении состава заказа в CRM
## 2025-01-14 v6.6.3
- Исправлены ошибки при обновлении модуля
## 2025-01-14 v6.6.2
- Исправлена выгрузка архива заказов при установке модуля
## 2024-12-17 v6.6.1
- Исправлены API методы по взаимодействию с пользовательскими полями и справочниками
## 2024-12-09 v6.6.0
- Добавлено динамическое изменение свойств товаров при настройке экспорта
## 2024-12-08 v6.5.39
- Исправлена поломка заказов с промокодом Maxma при включенной передаче корзины в CRM
## 2024-10-31 v6.5.38
- Исправлена выгрузка заказов через агент
## 2024-10-30 v6.5.37
- Исправлена подписка модуля на событие сохранения заказа
## 2024-10-24 v6.5.36
- Добавлена передача профилей доставки Официального модуля Почты России
## 2024-10-22 v6.5.35
- Исправлена подписка модуля на событие сохранения заказа
## 2024-10-21 v6.5.34
- Исправлена ошибка агента выгрузки изменений при наличии у заказа клиента без магазина
## 2024-10-14 v6.5.33
- Добавлена передача дополнительных параметров в GET запросах
## 2024-10-03 v6.5.32
- Исправлена подписка на событие создания заказа при обновлении
## 2024-09-23 v6.5.31
- Добавлено логирование ответа от API при неудачном создании заказа
## 2024-09-23 v6.5.30
- Добавлена передача контрагентов с типом ИП
## 2024-09-19 v6.5.29
- Исправлена подписка модуля на событие сохранения заказа
## 2024-09-11 v6.5.28
- Исправлен возврат на предыдущий статус в заказе Bitrix
## 2024-09-02 v.6.5.27
- Исправлена передача изменений по клиентам, отсутствующим в Bitrix
## 2024-08-26 v.6.5.26
- Исправлено удаление модуля
## 2024-08-12 v.6.5.25
- Улучшена генерация каталога с маркированными товарами
## 2024-08-06 v.6.5.24
- Добавлены переводы текста в программе лояльности
- Установка функционала программы лоялности перенесена в настройки модуля
## 2024-08-06 v.6.5.23
- Исправлена ошибка с присвоением externalId при добавлении товара в заказ как разные товарные позиции из CRM
## 2024-07-18 v.6.5.22
- Добавлена передача скидок на торговые позиции в брошенных корзинах
## 2024-07-15 v.6.5.21
- Добавлена передача поля link при выгрузке брошенных корзин
## 2024-06-20 v.6.5.20
- Рефакторинг настроек модуля
## 2024-06-14 v.6.5.19
- Исправление работы программы лояльности при использовании подтверждения списание бонусов по SMS
## 2024-06-05 v.6.5.18
- Добавлена возможность исправления даты регистрации клиентов в CRM
## 2024-06-04 v.6.5.17
- Добавлена передача признака маркировки товара в ICML каталоге
## 2024-04-27 v.6.5.16
- Обновлены аннотации в коде модуля
## 2024-04-23 v.6.5.15
- Добавлена передача услуг через ICML каталог
## 2024-04-18 v.6.5.14
- Исправление работы кнопки "Выгрузка служб доставок"
## 2024-04-03 v.6.5.13
- Исправление присваивания номера заказа к платежу при синхронизации с CRM
## 2024-03-28 v.6.5.12
- Исправлена подстановка домена при генерации каталога
## 2024-03-28 v.6.5.11
- Исправлена ошибка дублирования скидок
## 2024-03-18 v.6.5.10
- Добавлена валидация прав API ключа
## 2024-03-01 v.6.5.9
- Исправлена проверка ФИО при отправке заказа в систему
## 2024-02-05 v.6.5.8
- Удалена возможность выбора свойств с множественным выбором в настройках экспорта каталога
## 2024-01-22 v.6.5.7
- Доработана передача данных интеграционных оплат в систему
## 2024-01-12 v.6.5.6
- Добавлена передача дополнительных свойств товаров через конфигурируемый файл
## 2024-01-09 v.6.5.5
- Исправлен вывод справочников при установке модуля
## 2023-12-29 v.6.5.4
- Исправлена передача адреса доставки
## 2023-12-27 v.6.5.3
- Исправлена ошибка с двойной сериализацией при получении списка пользователей
## 2023-12-21 v.6.5.2
- Добавлена функциональность, позволяющая выгружать из CRM в Bitrix заказы с определенным способом оформления
## 2023-12-19 v.6.5.1
- Исправлено отображение настройки пользовательских полей
## 2023-12-18 v.6.5.0
- Добавлена поддержка функционала пользовательских полей
## 2023-12-13 v.6.4.13
- Исправлена ошибка с получением данных программы лояльности администратора при изменении заказа в админке
## 2023-12-12 v.6.4.12
- Исправлена критическая ошибка при переходе в настройки модуля
## 2023-12-08 v.6.4.11
- Исправлена ошибка при передаче подписки на рекламно-информационные рассылки
## 2023-10-25 v.6.4.10
- Добавлена передача трек-номера в заказе из CRM в Bitrix
## 2023-10-24 v.6.4.9
- Исправлена ошибка при деактивации модуля
## 2023-10-17 v.6.4.8
- Добавлена передача адреса пункта самовывоза в заказе из Bitrix в CRM
## 2023-10-10 v.6.4.7
- Изменена логика передачи адреса доставки в заказе из Bitrix в CRM
## 2023-09-07 v.6.4.6
- Исправлена передача ФИО покупателя в заказе
@ -8,7 +187,7 @@
- Исправлены ошибки при работе с программой лояльности
## 2023-08-29 v.6.4.3
- Добавлена валидация валют при установке и настройке модуля
- Добавлена валидация валют при настройке модуля
## 2023-08-23 v.6.4.2
- Исправлена ошибка создания заказов для корпоративных клиентов при использовании функционала брошенных корзин
@ -29,7 +208,7 @@
- Исправлена передача брошенных корзин
## 2023-07-04 v.6.3.17
- Добавлен функционал передачи примененного купона в заказе Битрикс в пользовательское поле заказа CRM
- Добавлен функционал передачи примененного купона в заказе Bitrix в пользовательское поле заказа CRM
## 2023-06-30 v.6.3.16
- Добавлена передача НДС товаров

View file

@ -1,7 +1,7 @@
[![Build Status](https://github.com/retailcrm/bitrix-module/workflows/ci/badge.svg)](https://github.com/retailcrm/bitrix-module/actions)
[![GitHub release](https://img.shields.io/github/release/retailcrm/bitrix-module.svg?logo=github)](https://github.com/retailcrm/bitrix-module/releases)
[![Coverage](https://img.shields.io/codecov/c/gh/retailcrm/bitrix-module/master.svg?logo=codecov)](https://codecov.io/gh/retailcrm/bitrix-module)
[![PHP version](https://img.shields.io/badge/PHP->=7.4-blue.svg?logo=php)](https://php.net/)
[![PHP version](https://img.shields.io/badge/PHP->=8.0-blue.svg?logo=php)](https://php.net/)
Bitrix module
=============

View file

@ -1,7 +1,19 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* Class AbstractBuilder
*
* @category RetailCRM
* @package RetailCRM
*/
abstract class AbstractBuilder
{

View file

@ -1,7 +1,19 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* Class AddressBuilder
*
* @category RetailCRM
* @package RetailCRM
*/
class AddressBuilder extends AbstractBuilder implements RetailcrmBuilderInterface
{

View file

@ -1,12 +1,12 @@
<?php
/**
* PHP version 5.3
*
* API client class
*
* @category RetailCRM
* @package RetailCRM
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
namespace RetailCrm;
@ -17,12 +17,10 @@ use RetailCrm\Http\Client;
use RetailCrm\Response\ApiResponse;
/**
* PHP version 5.3
*
* API client class
*
* @category RetailCRM
* @package RetailCRM
* @package RetailCRM
*/
class ApiClient
{
@ -1510,7 +1508,7 @@ class ApiClient
}
return $this->client->makeRequest(
"/custom-fields/$entity/edit/{$customField['code']}",
"/custom-fields/$entity/{$customField['code']}/edit",
Client::METHOD_POST,
array('customField' => json_encode($customField))
);
@ -1593,7 +1591,7 @@ class ApiClient
}
return $this->client->makeRequest(
"/custom-fields/dictionaries/{$customDictionary['code']}/create",
"/custom-fields/dictionaries/create",
Client::METHOD_POST,
array('customDictionary' => json_encode($customDictionary))
);

View file

@ -1,7 +1,19 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* Class CorporateCustomerBuilder
*
* @category RetailCRM
* @package RetailCRM
*/
class CorporateCustomerBuilder extends AbstractBuilder implements RetailcrmBuilderInterface
{

View file

@ -1,7 +1,19 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* Class CustomerBuilder
*
* @category RetailCRM
* @package RetailCRM
*/
class CustomerBuilder extends AbstractBuilder implements RetailcrmBuilderInterface
{
@ -209,6 +221,36 @@ class CustomerBuilder extends AbstractBuilder implements RetailcrmBuilderInterfa
$this->customer->setSubscribe('N');
}
}
if (empty($this->dataCrm['externalId'])
&& (empty($this->dataCrm['firstName'])
|| empty($this->dataCrm['email']))
) {
$api = new RetailCrm\ApiClient(RetailcrmConfigProvider::getApiUrl(), RetailcrmConfigProvider::getApiKey());
$customerResponse = RCrmActions::apiMethod($api, 'customersGetById', __METHOD__, $this->dataCrm['id']);
if ($customerResponse instanceof RetailCrm\Response\ApiResponse
&& $customerResponse->isSuccessful()
&& !empty($customerResponse['customer'])
) {
$crmCustomer = $customerResponse['customer'];
if (empty($this->dataCrm['email'])
&& !empty($crmCustomer['email'])
) {
$email = $crmCustomer['email'];
$this->customer->setEmail($this->fromJSON($email));
$this->customer->setLogin($email);
}
if (empty($this->dataCrm['firstName'])
&& !empty($crmCustomer['firstName'])
) {
$this->customer->setName($this->fromJSON($crmCustomer['firstName']));
}
}
}
}
public function buildPassword()

View file

@ -1,7 +1,22 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\Exception
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
namespace RetailCrm\Exception;
/**
* Class CurlException
*
* @category RetailCRM
* @package RetailCRM\Exception
*/
class CurlException extends \RuntimeException
{
}

View file

@ -1,7 +1,22 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\Exception
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
namespace RetailCrm\Exception;
/**
* Class InvalidJsonException
*
* @category RetailCRM
* @package RetailCRM\Exception
*/
class InvalidJsonException extends \DomainException
{
}

View file

@ -1,27 +1,26 @@
<?php
/**
* PHP version 5.3
*
* HTTP client
*
* @category RetailCRM
* @package RetailCRM
* @package RetailCRM\Http
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
namespace RetailCrm\Http;
use Intaro\RetailCrm\Component\Constants;
use RetailCrm\Exception\CurlException;
use RetailCrm\Exception\InvalidJsonException;
use RetailCrm\Response\ApiResponse;
/**
* PHP version 5.3
*
* HTTP client
* Class Client
*
* @category RetailCRM
* @package RetailCRM
* @package RetailCRM\Http
*/
class Client
{
@ -40,7 +39,7 @@ class Client
*
* @throws \InvalidArgumentException
*/
public function __construct($url, array $defaultParameters = array())
public function __construct($url, array $defaultParameters = [])
{
if (false === stripos($url, 'https://')) {
throw new \InvalidArgumentException(
@ -51,7 +50,7 @@ class Client
$this->url = $url;
$this->defaultParameters = $defaultParameters;
$this->retry = 0;
$this->curlErrors = array(
$this->curlErrors = [
CURLE_COULDNT_RESOLVE_PROXY,
CURLE_COULDNT_RESOLVE_HOST,
CURLE_COULDNT_CONNECT,
@ -59,8 +58,8 @@ class Client
CURLE_HTTP_POST_ERROR,
CURLE_SSL_CONNECT_ERROR,
CURLE_SEND_ERROR,
CURLE_RECV_ERROR
);
CURLE_RECV_ERROR,
];
}
/**
@ -81,9 +80,9 @@ class Client
public function makeRequest(
$path,
$method,
array $parameters = array()
array $parameters = []
) {
$allowedMethods = array(self::METHOD_GET, self::METHOD_POST);
$allowedMethods = [self::METHOD_GET, self::METHOD_POST];
if (!in_array($method, $allowedMethods, false)) {
throw new \InvalidArgumentException(
@ -95,7 +94,14 @@ class Client
);
}
$parameters = array_merge($this->defaultParameters, $parameters);
$parameters = self::METHOD_GET === $method
? array_merge($this->defaultParameters, $parameters, [
'cms_source' => 'Bitrix',
'cms_version' => SM_VERSION,
'php_version' => function_exists('phpversion') ? phpversion() : '',
'module_version' => Constants::MODULE_VERSION,
])
: $parameters = array_merge($this->defaultParameters, $parameters);
$url = $this->url . $path;
@ -124,7 +130,8 @@ class Client
curl_close($curlHandler);
if ($errno
if (
$errno
&& in_array($errno, $this->curlErrors, false)
&& $this->retry < 3
) {

View file

@ -1,7 +1,19 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* Class Logger
*
* @category RetailCRM
* @package RetailCRM
*/
class Logger
{

View file

@ -1,7 +1,19 @@
<?php
/**
* Class BaseModel
* @category RetailCRM
* @package RetailCRM\Model
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* Class BaseModel
*
* @category RetailCRM
* @package RetailCRM\Model
*/
abstract class BaseModel
{

View file

@ -1,7 +1,19 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\Model
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* Class BuyerProfile
*
* @category RetailCRM
* @package RetailCRM\Model
*/
class BuyerProfile extends BaseModel
{

View file

@ -1,7 +1,19 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\Model
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* Class Customer
*
* @category RetailCRM
* @package RetailCRM\Model
*/
class Customer extends BaseModel
{

View file

@ -1,7 +1,19 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\Model
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* Class CustomerAddress
*
* @category RetailCRM
* @package RetailCRM\Model
*/
class CustomerAddress extends BaseModel
{

View file

@ -1,7 +1,19 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\Model
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* Class CustomerContragent
*
* @category RetailCRM
* @package RetailCRM\Model
*/
class CustomerContragent extends BaseModel
{

View file

@ -1,51 +1,57 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
use Bitrix\Sale\PersonType;
use Intaro\RetailCrm\Component\ServiceLocator;
use Bitrix\Sale\Delivery\Services\EmptyDeliveryService;
use Bitrix\Sale\Internals\OrderPropsTable;
use Bitrix\Sale\Internals\StatusTable;
use Bitrix\Sale\PaySystem\Manager;
use Intaro\RetailCrm\Service\Utils;
use RetailCrm\Exception\CurlException;
use RetailCrm\Exception\InvalidJsonException;
use Intaro\RetailCrm\Service\ManagerService;
use Bitrix\Main\UserFieldTable;
use Bitrix\Main\UserFieldLangTable;
use Bitrix\Sale\Internals\SiteCurrencyTable;
IncludeModuleLangFile(__FILE__);
require_once __DIR__ . '/../../lib/component/servicelocator.php';
require_once __DIR__ . '/../../lib/service/utils.php';
/**
* class RCrmActions
*
* @category RetailCRM
* @package RetailCRM
*/
class RCrmActions
{
public static $MODULE_ID = 'intaro.retailcrm';
public static $CRM_ORDER_FAILED_IDS = 'order_failed_ids';
public static $CRM_API_VERSION = 'api_version';
public const CANCEL_PROPERTY_CODE = 'INTAROCRM_IS_CANCELED';
public static function getCurrencySites(): array
{
global $DB;
$sites = self::getSitesList();
$sitesLID = [];
$baseCurrency = CCurrency::GetBaseCurrency();
$sitesCurrency = [];
foreach ($sites as $site) {
$sitesLID[] = $site['LID'];
}
$siteCurrency = SiteCurrencyTable::getCurrency($site['LID']);
$currencies = $DB->Query(
"SELECT DISTINCT site.SMN_SITE_ID, hook_data.VALUE
FROM `b_landing_site` site
LEFT JOIN `b_landing_hook_data` hook_data on site.ID = hook_data.ENTITY_ID
WHERE site.SMN_SITE_ID IN ('" . implode("', '", $sitesLID) . "')
AND hook_data.CODE = 'CURRENCY_ID';
"
);
while ($currencySite = $currencies->Fetch()) {
if (!empty($currencySite['SMN_SITE_ID'])) {
$sitesCurrency[$currencySite['SMN_SITE_ID']] = $currencySite['VALUE'];
}
$sitesCurrency[$site['LID']] = !empty($siteCurrency['CURRENCY'])
? $siteCurrency['CURRENCY']
: $baseCurrency;
}
return $sitesCurrency;
@ -68,17 +74,21 @@ class RCrmActions
public static function OrderTypesList($arSites)
{
$orderTypesList = array();
$orderTypesList = [];
foreach ($arSites as $site) {
$personTypes = \Bitrix\Sale\PersonType::load($site['LID']);
$bitrixOrderTypesList = array();
$personTypes = PersonType::load($site['LID']);
$bitrixOrderTypesList = [];
foreach ($personTypes as $personType) {
if (!array_key_exists($personType['ID'], $orderTypesList)) {
$bitrixOrderTypesList[$personType['ID']] = $personType;
}
asort($bitrixOrderTypesList);
}
$orderTypesList = $orderTypesList + $bitrixOrderTypesList;
$orderTypesList += $bitrixOrderTypesList;
}
return $orderTypesList;
@ -86,10 +96,11 @@ class RCrmActions
public static function DeliveryList()
{
$bitrixDeliveryTypesList = array();
$bitrixDeliveryTypesList = [];
$arDeliveryServiceAll = \Bitrix\Sale\Delivery\Services\Manager::getActiveList();
$noOrderId = EmptyDeliveryService::getEmptyDeliveryServiceId();
$groups = array();
$groups = [];
foreach ($arDeliveryServiceAll as $arDeliveryService) {
if ($arDeliveryService['CLASS_NAME'] == '\Bitrix\Sale\Delivery\Services\Group') {
$groups[] = $arDeliveryService['ID'];
@ -112,11 +123,9 @@ class RCrmActions
public static function PaymentList()
{
$bitrixPaymentTypesList = array();
$dbPaymentAll = Manager::getList(array(
'select' => array('ID', 'NAME'),
'filter' => array('ACTIVE' => 'Y')
));
$bitrixPaymentTypesList = [];
$dbPaymentAll = Manager::getList(['select' => ['ID', 'NAME'], 'filter' => ['ACTIVE' => 'Y']]);
while ($payment = $dbPaymentAll->fetch()) {
$bitrixPaymentTypesList[] = $payment;
}
@ -126,16 +135,14 @@ class RCrmActions
public static function StatusesList()
{
$bitrixPaymentStatusesList = array();
$obStatuses = StatusTable::getList(array(
'filter' => array('TYPE' => 'O', '=Bitrix\Sale\Internals\StatusLangTable:STATUS.LID' => LANGUAGE_ID),
'select' => array('ID', 'NAME' => 'Bitrix\Sale\Internals\StatusLangTable:STATUS.NAME')
));
$bitrixPaymentStatusesList = [];
$obStatuses = StatusTable::getList([
'filter' => ['TYPE' => 'O', '=Bitrix\Sale\Internals\StatusLangTable:STATUS.LID' => LANGUAGE_ID],
'select' => ['ID', 'NAME' => 'Bitrix\Sale\Internals\StatusLangTable:STATUS.NAME'],
]);
while ($arStatus = $obStatuses->fetch()) {
$bitrixPaymentStatusesList[$arStatus['ID']] = array(
'ID' => $arStatus['ID'],
'NAME' => $arStatus['NAME'],
);
$bitrixPaymentStatusesList[$arStatus['ID']] = ['ID' => $arStatus['ID'], 'NAME' => $arStatus['NAME']];
}
return $bitrixPaymentStatusesList;
@ -143,11 +150,33 @@ class RCrmActions
public static function OrderPropsList()
{
$bitrixPropsList = array();
$arPropsAll = OrderPropsTable::getList(array(
'select' => array('*'),
'filter' => array('CODE' => '_%')
));
$bitrixPropsList = [];
$arPropsAll = OrderPropsTable::getList([
'select' => ['*'],
'filter' => [
['CODE' => '_%'],
['!=TYPE' => 'LOCATION']
]
]);
while ($prop = $arPropsAll->Fetch()) {
$bitrixPropsList[$prop['PERSON_TYPE_ID']][] = $prop;
}
return $bitrixPropsList;
}
public static function getLocationProps()
{
$bitrixPropsList = [];
$arPropsAll = OrderPropsTable::getList([
'select' => ['*'],
'filter' => [
['CODE' => '_%'],
['TYPE' => 'LOCATION']
]
]);
while ($prop = $arPropsAll->Fetch()) {
$bitrixPropsList[$prop['PERSON_TYPE_ID']][] = $prop;
}
@ -157,14 +186,8 @@ class RCrmActions
public static function PricesExportList()
{
$catalogExportPrices = array();
$dbPriceType = CCatalogGroup::GetList(
array(),
array(),
false,
false,
array('ID', 'NAME', 'NAME_LANG')
);
$catalogExportPrices = [];
$dbPriceType = CCatalogGroup::GetList([], [], false, false, ['ID', 'NAME', 'NAME_LANG']);
while ($arPriceType = $dbPriceType->Fetch())
{
@ -176,8 +199,9 @@ class RCrmActions
public static function StoresExportList()
{
$catalogExportStores = array();
$dbStores = CCatalogStore::GetList(array(), array('ACTIVE' => 'Y'), false, false, array('ID', 'TITLE'));
$catalogExportStores = [];
$dbStores = CCatalogStore::GetList([], ['ACTIVE' => 'Y'], false, false, ['ID', 'TITLE']);
while ($stores = $dbStores->Fetch()) {
$catalogExportStores[] = $stores;
}
@ -187,18 +211,19 @@ class RCrmActions
public static function IblocksExportList()
{
$catalogExportIblocks = array();
$dbIblocks = CIBlock::GetList(array('IBLOCK_TYPE' => 'ASC', 'NAME' => 'ASC'), array('CHECK_PERMISSIONS' => 'Y', 'MIN_PERMISSION' => 'W'));
$catalogExportIblocks = [];
$dbIblocks = CIBlock::GetList(['IBLOCK_TYPE' => 'ASC', 'NAME' => 'ASC'], ['CHECK_PERMISSIONS' => 'Y', 'MIN_PERMISSION' => 'W']);
while ($iblock = $dbIblocks->Fetch()) {
if ($arCatalog = CCatalog::GetByIDExt($iblock['ID'])) {
if($arCatalog['CATALOG_TYPE'] == 'D' || $arCatalog['CATALOG_TYPE'] == 'X' || $arCatalog['CATALOG_TYPE'] == 'P') {
$catalogExportIblocks[$iblock['ID']] = array(
$catalogExportIblocks[$iblock['ID']] = [
'ID' => $iblock['ID'],
'IBLOCK_TYPE_ID' => $iblock['IBLOCK_TYPE_ID'],
'LID' => $iblock['LID'],
'CODE' => $iblock['CODE'],
'NAME' => $iblock['NAME'],
);
];
if ($arCatalog['CATALOG_TYPE'] == 'X' || $arCatalog['CATALOG_TYPE'] == 'P') {
$iblockOffer = CCatalogSKU::GetInfoByProductIBlock($iblock['ID']);
@ -241,8 +266,8 @@ class RCrmActions
if (is_array($failedIds) && !empty($failedIds)) {
RetailCrmOrder::uploadOrders(50, true);
}
return;
return 'RCrmActions::uploadOrdersAgent();';
}
/**
@ -265,7 +290,6 @@ class RCrmActions
RetailCrmHistory::customerHistory();
RetailCrmHistory::orderHistory();
self::uploadOrdersAgent();
} catch (\Throwable $exception) {
Logger::getInstance()->write(
'Fail orderAgent:' . PHP_EOL .
@ -289,8 +313,9 @@ class RCrmActions
*/
public static function clearArr(array $arr): array
{
/** @var \Intaro\RetailCrm\Service\Utils $utils */
$utils = ServiceLocator::getOrCreate(\Intaro\RetailCrm\Service\Utils::class);
/** @var Utils $utils */
$utils = ServiceLocator::getOrCreate(Utils::class);
return $utils->clearArray($arr);
}
@ -302,8 +327,9 @@ class RCrmActions
*/
public static function toJSON($str)
{
/** @var \Intaro\RetailCrm\Service\Utils $utils */
$utils = ServiceLocator::getOrCreate(\Intaro\RetailCrm\Service\Utils::class);
/** @var Utils $utils */
$utils = ServiceLocator::getOrCreate(Utils::class);
return $utils->toUTF8($str);
}
@ -319,8 +345,9 @@ class RCrmActions
return '';
}
/** @var \Intaro\RetailCrm\Service\Utils $utils */
$utils = ServiceLocator::getOrCreate(\Intaro\RetailCrm\Service\Utils::class);
/** @var Utils $utils */
$utils = ServiceLocator::getOrCreate(Utils::class);
return $utils->fromUTF8($str);
}
@ -451,7 +478,189 @@ class RCrmActions
return $result;
}
public static function sendConfiguration($api, $api_version, $active = true)
public static function customOrderPropList()
{
$typeMatched = [
'STRING' => 'STRING',
'NUMBER' => 'NUMERIC',
'Y/N' => 'BOOLEAN',
'DATE' => 'DATE'
];
//Базовые свойства заказа и используемые свойства в функционале модуля
$bannedCodeList = [
'FIO',
'EMAIL',
'PHONE',
'ZIP',
'CITY',
'LOCATION',
'ADDRESS',
'COMPANY',
'COMPANY_ADR',
'INN',
'KPP',
'CONTACT_PERSON',
'FAX',
'LP_BONUS_INFO',
'LP_DISCOUNT_INFO',
''
];
$listPersons = PersonType::getList([
'select' => ['ID', 'NAME'],
'filter' => ['ENTITY_REGISTRY_TYPE' => 'ORDER']
])->fetchAll();
$persons = [];
foreach ($listPersons as $person) {
$persons[$person['ID']] = $person['NAME'];
}
$propsList = OrderPropsTable::getList([
'select' => ['ID', 'CODE', 'NAME', 'PERSON_TYPE_ID', 'TYPE'],
'filter' => [
['!=CODE' => $bannedCodeList],
['?TYPE' => 'STRING | NUMBER | Y/N | DATE'],
['MULTIPLE' => 'N'],
['ACTIVE' => 'Y']
]
])->fetchAll();
$resultList = [];
foreach ($propsList as $prop) {
$type = $typeMatched[$prop['TYPE']] ?? $prop['TYPE'];
$key = $prop['ID'] . '#' . $prop['CODE'];
$resultList[$type . '_TYPE'][$key] = $prop['NAME'] . ' (' . $persons[$prop['PERSON_TYPE_ID']] . ')';
}
ksort($resultList);
return $resultList;
}
public static function customUserFieldList()
{
$typeMatched = [
'string' => 'STRING',
'double' => 'NUMERIC',
'boolean' => 'BOOLEAN',
'date' => 'DATE',
'integer' => 'INTEGER'
];
$userFields = UserFieldTable::getList([
'select' => ['ID', 'FIELD_NAME', 'USER_TYPE_ID'],
'filter' => [
['ENTITY_ID' => 'USER'],
['?FIELD_NAME' => '~%INTARO%'],
['!=FIELD_NAME' => 'UF_SUBSCRIBE_USER_EMAIL'],
['!=USER_TYPE_ID' => 'datetime'],
['?USER_TYPE_ID' => 'string | date | integer | double | boolean'],
['MULTIPLE' => 'N'],
]
])->fetchAll();
$resultList = [];
foreach ($userFields as $userField) {
$label = UserFieldLangTable::getList([
'select' => ['EDIT_FORM_LABEL'],
'filter' => [
["USER_FIELD_ID" => $userField['ID']],
['LANGUAGE_ID' => LANGUAGE_ID]
]
])->fetch();
$type = $typeMatched[$userField['USER_TYPE_ID']] ?? $userField['USER_TYPE_ID'];
$resultList[$type . '_TYPE'][$userField['FIELD_NAME']] = $label['EDIT_FORM_LABEL'];
}
ksort($resultList);
return $resultList;
}
public static function getTypeUserField()
{
$userFields = UserFieldTable::getList([
'select' => ['FIELD_NAME', 'USER_TYPE_ID'],
'filter' => [
['ENTITY_ID' => 'USER'],
['?FIELD_NAME' => '~%INTARO%'],
['!=FIELD_NAME' => 'UF_SUBSCRIBE_USER_EMAIL'],
['?USER_TYPE_ID' => 'string | date | datetime | integer | double | boolean'],
['MULTIPLE' => 'N'],
]
])->fetchAll();
$result = [];
foreach ($userFields as $userField) {
$result[$userField['FIELD_NAME']] = $userField['USER_TYPE_ID'];
}
return $result;
}
public static function convertCmsFieldToCrmValue($value, $type)
{
$result = $value;
switch ($type) {
case 'boolean':
$result = $value === '1' ? 1 : 0;
break;
case 'Y/N':
$result = $result === 'Y' ? 1 : 0;
break;
case 'STRING':
case 'string':
$result = strlen($value) <= 500 ? $value : '';
break;
case 'datetime':
$result = date('Y-m-d', strtotime($value));
break;
}
return $result;
}
public static function convertCrmValueToCmsField($crmValue, $type)
{
$result = $crmValue;
switch ($type) {
case 'Y/N':
case 'boolean':
$result = $crmValue == 1 ? 'Y' : 'N';
break;
case 'DATE':
case 'date':
if (empty($crmValue)) {
return '';
}
try {
$result = date('d.m.Y', strtotime($crmValue));
} catch (\Exception $exception) {
$result = '';
}
break;
case 'STRING':
case 'string':
case 'text':
$result = strlen($crmValue) <= 500 ? $crmValue : '';
break;
}
return $result;
}
public static function sendConfiguration($api, $active = true)
{
$scheme = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
$baseUrl = $scheme . $_SERVER['HTTP_HOST'];
@ -463,12 +672,13 @@ class RCrmActions
if (!$clientId) {
$clientId = uniqid();
COption::SetOptionString(self::$MODULE_ID, 'client_id', $clientId);
}
$code = $integrationCode . '-' . $clientId;
$configuration = array(
$configuration = [
'clientId' => $clientId,
'code' => $code,
'integrationCode' => $integrationCode,
@ -477,7 +687,7 @@ class RCrmActions
'logo' => $logo,
'baseUrl' => $baseUrl,
'accountUrl' => $accountUrl
);
];
self::apiMethod($api, 'integrationModulesEdit', __METHOD__, $configuration);
}
@ -521,14 +731,14 @@ class RCrmActions
case 'cartClear':
return self::proxy($api, $methodApi, $method, [$params, $site]);
default:
return self::proxy($api, $methodApi, $method, array($params, $site));
return self::proxy($api, $methodApi, $method, [$params, $site]);
}
}
private static function proxy($api, $methodApi, $method, $params) {
$version = COption::GetOptionString(self::$MODULE_ID, self::$CRM_API_VERSION, 0);
try {
$result = call_user_func_array(array($api, $methodApi), $params);
$result = call_user_func_array([$api, $methodApi], $params);
if (!$result) {
$err = new RuntimeException(
@ -549,21 +759,21 @@ class RCrmActions
|| $methodApi == 'customersGet'
|| $methodApi == 'customersCorporateGet'
) {
Logger::getInstance()->write(array(
Logger::getInstance()->write([
'api' => $version,
'methodApi' => $methodApi,
'errorMsg' => !empty($result['errorMsg']) ? $result['errorMsg'] : '',
'errors' => !empty($result['errors']) ? $result['errors'] : '',
'params' => $params
), 'apiErrors');
], 'apiErrors');
} elseif ($methodApi == 'customersUpload' || $methodApi == 'ordersUpload') {
Logger::getInstance()->write(array(
Logger::getInstance()->write([
'api' => $version,
'methodApi' => $methodApi,
'errorMsg' => !empty($result['errorMsg']) ? $result['errorMsg'] : '',
'errors' => !empty($result['errors']) ? $result['errors'] : '',
'params' => $params
), 'uploadApiErrors');
], 'uploadApiErrors');
} elseif ($methodApi == 'cartGet') {
Logger::getInstance()->write(
[
@ -582,13 +792,13 @@ class RCrmActions
!empty($result['errorMsg']) ? $result['errorMsg'] : ''
);
Logger::getInstance()->write(array(
Logger::getInstance()->write([
'api' => $version,
'methodApi' => $methodApi,
'errorMsg' => !empty($result['errorMsg']) ? $result['errorMsg'] : '',
'errors' => !empty($result['errors']) ? $result['errors'] : '',
'params' => $params,
), 'apiErrors');
], 'apiErrors');
}
if (function_exists('retailCrmApiResult')) {
@ -669,13 +879,13 @@ class RCrmActions
$exception->getCode() . ': ' . $exception->getMessage()
);
Logger::getInstance()->write(array(
Logger::getInstance()->write([
'api' => $version,
'methodApi' => $methodApi,
'errorMsg' => $exception->getMessage(),
'errors' => $exception->getCode(),
'params' => $params
), 'apiErrors');
], 'apiErrors');
if (function_exists('retailCrmApiResult')) {
retailCrmApiResult($methodApi, false, $apiResultExceptionName);

View file

@ -1,12 +1,12 @@
<?php
/**
* PHP version 5.3
*
* Response from RetailCRM API
*
* @category RetailCRM
* @package RetailCRM
* @package RetailCRM\Response
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
namespace RetailCrm\Response;
@ -15,12 +15,10 @@ use InvalidArgumentException;
use RetailCrm\Exception\InvalidJsonException;
/**
* PHP version 5.3
*
* Response from RetailCRM API
* Class ApiResponse
*
* @category RetailCRM
* @package RetailCRM
* @package RetailCRM\Response
*/
class ApiResponse implements \ArrayAccess
{

View file

@ -1,13 +1,25 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* RestNormalizer - The main class
*
* @category RetailCRM
* @package RetailCRM
*/
class RestNormalizer
{
public $clear = true;
private $validation = array();
private $originalValidation = array();
private $validation = [];
private $originalValidation = [];
private $server;
/**
@ -55,9 +67,11 @@ class RestNormalizer
$file = $server . $file;
if (is_null($file) || is_file($file) === false
|| json_decode(file_get_contents($file)) === null
|| $this->parseConfig($file) === false) {
RCrmActions::eventLog('RestNormalizer', 'intaro.retailcrm', 'Incorrect file normalize.');
return false;
|| $this->parseConfig($file) === false
) {
RCrmActions::eventLog('RestNormalizer', 'intaro.retailcrm', 'Incorrect file normalize.');
return false;
}
if (is_string($data)) {
@ -72,6 +86,7 @@ class RestNormalizer
if (!is_array($data) || count($data) < 1) {
RCrmActions::eventLog('RestNormalizer', 'intaro.retailcrm', 'Incorrect data array.');
return false;
}
@ -88,7 +103,7 @@ class RestNormalizer
*/
final private function formatting($data, $skip = false)
{
$formatted = array();
$formatted = [];
foreach ($data as $code => $value) {
if (isset($this->validation[ $code ]) && $this->validation[ $code ]['type'] == 'skip') {
@ -99,13 +114,15 @@ class RestNormalizer
$formatted[ $code ] = $this->formatting($value, true);
}
if (empty($formatted[$code])) {
//Удаление пустых переменных, кроме значений равных 0
if (empty($formatted[$code]) && $formatted[$code] !== 0 && $formatted[$code] !== 0.0) {
if ($this->clear === true) {
unset($formatted[ $code ]);
}
if (isset($this->validation[ $code ]['required']) && $this->validation[ $code ]['required'] === true) {
$formatted = array();
$formatted = [];
break;
}
}
@ -174,7 +191,8 @@ class RestNormalizer
$data = trim((string) $data);
if (isset($validation['default']) && is_string($validation['default']) && trim($validation['default']) != ''
&& ($data == '' || is_string($data) === false)) {
&& ($data == '' || is_string($data) === false)
) {
$data = trim($validation['default']);
} elseif ($data == '' || is_string($data) === false) {
return null;
@ -302,7 +320,8 @@ class RestNormalizer
} elseif (isset($validation['default']) && in_array($validation['default'], $validation['values']) === false) {
return null;
} elseif (in_array($data, $validation['values']) === false
&& isset($validation['default']) && in_array($validation['default'], $validation['values'])) {
&& isset($validation['default']) && in_array($validation['default'], $validation['values'])
) {
$data = $validation['default'];
} elseif (in_array($data, $validation['values']) === false) {
return null;
@ -327,10 +346,13 @@ class RestNormalizer
if (is_array($value)) {
$value = array_diff($value, array('', NULL));
}
$data[$APPLICATION->ConvertCharset($code, SITE_CHARSET, 'utf-8')] = is_array($value)
? $this->multiConvert($value)
: $APPLICATION->ConvertCharset($value, SITE_CHARSET, 'utf-8');
? $this->multiConvert($value)
: $APPLICATION->ConvertCharset($value, SITE_CHARSET, 'utf-8')
;
}
return $data;
} else {
return $APPLICATION->ConvertCharset($data, SITE_CHARSET, 'utf-8');

View file

@ -1,7 +1,22 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
IncludeModuleLangFile(__FILE__);
/**
* Interface RetailcrmBuilderInterface
*
* @category RetailCRM
* @package RetailCRM
*/
interface RetailcrmBuilderInterface
{
/**

View file

@ -1,12 +1,19 @@
<?php
/**
* PHP version 5.3
*
* @category RetailCRM
* @package RetailCRM
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* RetailcrmConfigProvider class
*
* @category RetailCRM
* @package RetailCRM
* @package RetailCRM
*/
use Intaro\RetailCrm\Component\ConfigProvider;

View file

@ -1,12 +1,19 @@
<?php
/**
* PHP version 5.3
*
* @category RetailCRM
* @package RetailCRM
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* RetailcrmConstants
*
* @category RetailCRM
* @package RetailCRM
* @package RetailCRM
*/
use Intaro\RetailCrm\Component\Constants;

View file

@ -1,12 +1,19 @@
<?php
/**
* PHP version 5.3
*
* @category RetailCRM
* @package RetailCRM
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* RetailcrmDependencyLoader class
*
* @category RetailCRM
* @package RetailCRM
* @package RetailCRM
*/
IncludeModuleLangFile(__FILE__);

View file

@ -1,13 +1,27 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\Cart
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
use Bitrix\Main\Context\Culture;
use Bitrix\Sale\Basket;
use Bitrix\Sale\Discount\Context\Fuser;
use Bitrix\Sale\Discount;
IncludeModuleLangFile(__FILE__);
/**
* Class RetailCrmCart
*
* @category RetailCRM
* @package RetailCRM\Cart
*/
class RetailCrmCart
{
@ -93,6 +107,7 @@ class RetailCrmCart
$date => date(self::$dateFormat),
'droppedAt' => date(self::$dateFormat),
'items' => $items,
'link' => static::generateCartLink(),
],
$site
);
@ -115,16 +130,39 @@ class RetailCrmCart
return null;
}
$arBasket = [
'LID' => $obBasket->getSiteId(),
];
$items = $obBasket->getBasket();
$arBasket = ['LID' => $obBasket->getSiteId()];
foreach ($items as $item) {
$arBasket['BASKET'][] = $item->getFields();
if (count($items) !== 0) {
$fUser = new Fuser($obBasket->getFUserId());
$discounts = Discount::buildFromBasket($obBasket, $fUser);
$discounts->calculate();
$resultBasket = $discounts->getApplyResult(true);
$basketItems = $resultBasket['PRICES']['BASKET'] ?? [];
foreach ($items as $item) {
$itemFields = $item->getFields()->getValues();
if (isset($basketItems[(int) $itemFields['ID']])) {
$itemFields['PRICE'] = $basketItems[(int) $itemFields['ID']]['PRICE'];
}
$arBasket['BASKET'][] = $itemFields;
}
}
return $arBasket;
}
public static function generateCartLink()
{
return sprintf(
'%s://%s/personal/cart',
!empty($_SERVER['HTTPS']) ? 'https' : 'http',
$_SERVER['HTTP_HOST']
);
}
}

View file

@ -1,7 +1,19 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\Collector
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* Class RetailCrmCollector
*
* @category RetailCRM
* @package RetailCRM\Collector
*/
class RetailCrmCollector
{

View file

@ -449,7 +449,7 @@
"type": "double",
"default": 0,
"min": 0,
"decimals": 1
"decimals": 2
},
"code": {
"type": "string"

View file

@ -1,7 +1,19 @@
<?php
/**
* class RetailCrmOnlineConsultant
* @category RetailCRM
* @package RetailCRM\Consultant
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* Class RetailCrmOnlineConsultant
*
* @category RetailCRM
* @package RetailCRM\Consultant
*/
class RetailCrmOnlineConsultant
{

View file

@ -1,6 +1,17 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\Events
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
use Bitrix\Main\Context\Culture;
use Bitrix\Main\Engine\CurrentUser;
use Intaro\RetailCrm\Component\Constants;
use Intaro\RetailCrm\Component\ServiceLocator;
use Intaro\RetailCrm\Repository\UserRepository;
use Intaro\RetailCrm\Service\CustomerService;
@ -16,6 +27,9 @@ use Intaro\RetailCrm\Model\Api\Response\OrdersEditResponse;
/**
* Class RetailCrmEvent
*
* @category RetailCRM
* @package RetailCRM\Events
*/
class RetailCrmEvent
{
@ -100,8 +114,6 @@ class RetailCrmEvent
public static function orderDelete($event)
{
$GLOBALS['RETAILCRM_ORDER_DELETE'] = true;
return;
}
/**
@ -117,7 +129,7 @@ class RetailCrmEvent
return;
}
$id = \Bitrix\Main\Engine\CurrentUser::get()->getId();
$id = CurrentUser::get()->getId();
if ($id) {
$arBasket = RetailCrmCart::getBasketArray($event);
@ -175,6 +187,7 @@ class RetailCrmEvent
'optionsContragentType' => $optionsContragentType,
'optionsSitesList' => $optionsSitesList,
'optionsCustomFields' => $optionsCustomFields,
'customOrderProps' => RetailcrmConfigProvider::getMatchedOrderProps(),
]);
//many sites?
@ -211,7 +224,7 @@ class RetailCrmEvent
//TODO эта управляющая конструкция по функционалу дублирует RetailCrmOrder::createCustomerForOrder.
// Необходимо устранить дублирование, вынеся логику в обособленный класс-сервис
if ('Y' === $optionCorpClient && $optionsContragentType[$arOrder['PERSON_TYPE_ID']] === 'legal-entity') {
if ('Y' === $optionCorpClient && in_array($optionsContragentType[$arOrder['PERSON_TYPE_ID']], ['legal-entity', 'enterpreneur'])) {
//corparate cliente
$nickName = '';
$address = '';
@ -287,7 +300,7 @@ class RetailCrmEvent
$userCrm = RCrmActions::apiMethod($api, 'customersGet', __METHOD__, $arOrder['USER_ID'], $site);
if (!isset($userCrm['customer'])) {
$arUser = UserTable::getById($arOrder['USER_ID'])->fetch();
$arUser = CUser::GetByID($arOrder['USER_ID'])->Fetch();
if (!empty($address)) {
$arUser['PERSONAL_STREET'] = $address;
@ -412,7 +425,8 @@ class RetailCrmEvent
$userCrm = RCrmActions::apiMethod($api, 'customersGet', __METHOD__, $arOrder['USER_ID'], $site);
if (!isset($userCrm['customer'])) {
$arUser = Bitrix\Main\UserTable::getById($arOrder['USER_ID'])->fetch();
$arUser = CUser::GetByID($arOrder['USER_ID'])->Fetch();
$resultUser = RetailCrmUser::customerSend(
$arUser,
$api,
@ -429,7 +443,7 @@ class RetailCrmEvent
);
return null;
}http://localhost/personal/cart/
}
}
}
@ -522,18 +536,13 @@ class RetailCrmEvent
}
if (!empty($arPayment['PAY_SYSTEM_ID']) && isset($optionsPaymentTypes[$arPayment['PAY_SYSTEM_ID']])) {
$paymentToCrm = [
'type' => $optionsPaymentTypes[$arPayment['PAY_SYSTEM_ID']],
];
$paymentToCrm = [];
if (!empty($arPayment['ID'])) {
$paymentToCrm['externalId'] = RCrmActions::generatePaymentExternalId($arPayment['ID']);
}
$isIntegrationPayment
= RetailCrmService::isIntegrationPayment($arPayment['PAY_SYSTEM_ID'] ?? null);
if (!empty($arPayment['DATE_PAID']) && !$isIntegrationPayment) {
if (!empty($arPayment['DATE_PAID'])) {
if (is_object($arPayment['DATE_PAID'])) {
$culture = new Culture(['FORMAT_DATETIME' => 'YYYY-MM-DD HH:MI:SS']);
$paymentToCrm['paidAt'] = $arPayment['DATE_PAID']->toString($culture);
@ -542,7 +551,7 @@ class RetailCrmEvent
}
}
if (!empty($optionsPayStatuses[$arPayment['PAID']]) && !$isIntegrationPayment) {
if (!empty($optionsPayStatuses[$arPayment['PAID']])) {
$paymentToCrm['status'] = $optionsPayStatuses[$arPayment['PAID']];
}
@ -553,6 +562,8 @@ class RetailCrmEvent
if (RetailcrmConfigProvider::shouldSendPaymentAmount()) {
$paymentToCrm['amount'] = $arPayment['SUM'];
}
$paymentToCrm = RetailCrmService::preparePayment($paymentToCrm, $arPayment, $optionsPaymentTypes);
} else {
RCrmActions::eventLog('RetailCrmEvent::paymentSave', 'payments', 'OrderID = ' . $arPayment['ID'] . '. Payment not found.');
return false;

View file

@ -1,4 +1,10 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\History
*/
define("NO_KEEP_STATISTIC", true);
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');
$GLOBALS['APPLICATION']->RestartBuffer();
@ -28,4 +34,4 @@ if (CModule::IncludeModule($moduleId) && $idOrderCRM && $idOrderCRM > 0) {
COption::RemoveOption($moduleId, $historyTime);
}
}
}

View file

@ -1,5 +1,14 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\History
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
use Bitrix\Main\ArgumentException;
use Bitrix\Main\ArgumentNullException;
use Bitrix\Main\ArgumentOutOfRangeException;
@ -25,6 +34,13 @@ use Intaro\RetailCrm\Component\Handlers\EventsHandlers;
use RetailCrm\Response\ApiResponse;
IncludeModuleLangFile(__FILE__);
/**
* Class RetailCrmHistory
*
* @category RetailCRM
* @package RetailCRM\History
*/
class RetailCrmHistory
{
public static $MODULE_ID = 'intaro.retailcrm';
@ -34,7 +50,7 @@ class RetailCrmHistory
public static $CRM_DELIVERY_TYPES_ARR = 'deliv_types_arr';
public static $CRM_PAYMENT_TYPES = 'pay_types_arr';
public static $CRM_PAYMENT_STATUSES = 'pay_statuses_arr';
public static $CRM_PAYMENT = 'payment_arr'; //order payment Y/N
public static $CRM_PAYMENT = 'payment_arr';
public static $CRM_ORDER_LAST_ID = 'order_last_id';
public static $CRM_SITES_LIST = 'sites_list';
public static $CRM_ORDER_PROPS = 'order_props';
@ -49,9 +65,10 @@ class RetailCrmHistory
public static $CRM_CANSEL_ORDER = 'cansel_order';
public static $CRM_CURRENCY = 'currency';
public static $CRM_DISCOUNT_ROUND = 'discount_round';
public static $CUSTOM_FIELDS_IS_ACTIVE = 'N';
const PAGE_LIMIT = 25;
const CANCEL_PROPERTY_CODE = 'INTAROCRM_IS_CANCELED';
private static $optionsPayment = [];
public static function customerHistory()
{
@ -64,6 +81,21 @@ class RetailCrmHistory
$historyStart = RetailcrmConfigProvider::getCustomersHistorySinceId();
$api = new RetailCrm\ApiClient(RetailcrmConfigProvider::getApiUrl(), RetailcrmConfigProvider::getApiKey());
$matchedCustomFields = RetailcrmConfigProvider::getMatchedUserFields();
$matchedCustomFields = is_array($matchedCustomFields) ? array_flip($matchedCustomFields) : [];
if (method_exists(RCrmActions::class, 'getTypeUserField')
&& method_exists(RCrmActions::class, 'convertCrmValueToCmsField')
) {
self::$CUSTOM_FIELDS_IS_ACTIVE = RetailcrmConfigProvider::getCustomFieldsStatus();
}
$customUserFieldTypes = [];
if (self::$CUSTOM_FIELDS_IS_ACTIVE === 'Y') {
$customUserFieldTypes = RCrmActions::getTypeUserField();
}
if ($historyStart && $historyStart > 0) {
$historyFilter['sinceId'] = $historyStart;
}
@ -125,6 +157,8 @@ class RetailCrmHistory
$customerBuilder->setDataCrm($customer)->build();
$customFields = self::getCustomUserFields($customer, $matchedCustomFields, $customUserFieldTypes);
if (!isset($customer['externalId'])) {
if (!isset($customer['id'])) {
continue;
@ -156,7 +190,7 @@ class RetailCrmHistory
if ($registerNewUser === true) {
$customerBuilder->buildPassword();
$registeredUserID = $newUser->Add(self::getDataUser($customerBuilder));
$registeredUserID = $newUser->Add(self::getDataUser($customerBuilder, $customFields));
if ($registeredUserID === false) {
RCrmActions::eventLog(
@ -191,16 +225,18 @@ class RetailCrmHistory
CUser::GetList(
($by = "ID"),
($order = "desc"),
array('ID' => $customer['externalId']),
array('FIELDS' => array('PERSONAL_PHONE', 'PERSONAL_MOBILE'))
['ID' => $customer['externalId']],
['FIELDS' => ['PERSONAL_PHONE', 'PERSONAL_MOBILE']]
)->fetch()
);
}
$customerArray = $customerBuilder->getCustomer()->getObjectToArray();
$u = $newUser->Update($customer['externalId'], self::convertBooleanFields($customerArray));
$customerArray = array_merge($customerArray, $customFields);
if (!$u) {
$queryUpdate = $newUser->Update($customer['externalId'], self::convertBooleanFields($customerArray));
if (!$queryUpdate) {
RCrmActions::eventLog(
'RetailCrmHistory::customerHistory',
'Error update user',
@ -262,12 +298,49 @@ class RetailCrmHistory
$contragentTypes = array_flip(RetailcrmConfigProvider::getContragentTypes());
$shipmentDeducted = RetailcrmConfigProvider::getShipmentDeducted();
$optionsPayment = [
'payTypes' => array_flip(RetailcrmConfigProvider::getPaymentTypes()),
'paymentList' => array_flip(RetailcrmConfigProvider::getPayment()),
];
if (RetailcrmConfigProvider::getSyncIntegrationPayment() === 'Y') {
$substitutedPayment = RetailcrmConfigProvider::getSubstitutionPaymentList();
foreach ($substitutedPayment as $origCode => $subsCode) {
if (isset($optionsPayment['payTypes'][$origCode])) {
$optionsPayment['payTypes'][$subsCode] = $optionsPayment['payTypes'][$origCode];
}
}
}
self::$optionsPayment = $optionsPayment;
unset($optionsPayment);
$matchedCustomUserFields = RetailcrmConfigProvider::getMatchedUserFields() ?? [];
$matchedCustomUserFields = is_array($matchedCustomUserFields) ? array_flip($matchedCustomUserFields) : [];
$matchedCustomOrderFields = RetailcrmConfigProvider::getMatchedOrderProps() ?? [];
$matchedCustomOrderFields = is_array($matchedCustomOrderFields) ? array_flip($matchedCustomOrderFields) : [];
if (method_exists(RCrmActions::class, 'getTypeUserField')
&& method_exists(RCrmActions::class, 'convertCrmValueToCmsField')
) {
self::$CUSTOM_FIELDS_IS_ACTIVE = RetailcrmConfigProvider::getCustomFieldsStatus();
}
$customUserFieldTypes = [];
if (self::$CUSTOM_FIELDS_IS_ACTIVE === 'Y') {
$customUserFieldTypes = RCrmActions::getTypeUserField();
}
$api = new RetailCrm\ApiClient(RetailcrmConfigProvider::getApiUrl(), RetailcrmConfigProvider::getApiKey());
$page = 1;
/* @var OrderLoyaltyDataService $orderLoyaltyDataService */
$orderLoyaltyDataService = ServiceLocator::get(OrderLoyaltyDataService::class);
$historyFilter = array();
$historyFilter = [];
$historyStart = COption::GetOptionString(self::$MODULE_ID, self::$CRM_ORDER_HISTORY);
if ($historyStart && $historyStart > 0) {
@ -344,7 +417,7 @@ class RetailCrmHistory
$corporateCustomerBuilder = new CorporateCustomerBuilder();
$corporateContact = array();
$corporateContact = [];
$orderCustomerExtId = $order['customer']['externalId'] ?? null;
$corporateCustomerBuilder->setOrderCustomerExtId($orderCustomerExtId)
->setContragentTypes($contragentTypes)
@ -395,6 +468,16 @@ class RetailCrmHistory
}
if (!isset($order['externalId'])) {
if (ConfigProvider::useCrmOrderMethods() === 'Y') {
$orderMethods = ConfigProvider::getCrmOrderMethods();
// 1. Клиент активировал опцию, но не выбрал способы оформления - пропускаем все заказы.
// 2. Если способа оформления заказа нет в выбранном в настройках списке - пропускаем заказ.
if ($orderMethods === [] || !in_array($order['orderMethod'], $orderMethods, true)) {
continue;
}
}
if (empty($orderCustomerExtId)) {
if (!isset($order['customer']['id'])
|| (RetailCrmOrder::isOrderCorporate($order)
@ -460,6 +543,9 @@ class RetailCrmHistory
$newUser = new CUser();
$customerArray = $corporateCustomerBuilder->getCustomer()->getObjectToArray();
$customFields = self::getCustomUserFields($userData, $matchedCustomUserFields, $customUserFieldTypes);
$customerArray = array_merge($customerArray, $customFields);
if (!array_key_exists('UF_SUBSCRIBE_USER_EMAIL', $customerArray)) {
$customerArray['UF_SUBSCRIBE_USER_EMAIL'] = 'Y';
}
@ -480,10 +566,10 @@ class RetailCrmHistory
$api,
'customersFixExternalIds',
__METHOD__,
array(array(
[[
'id' => $order['customer']['id'],
'externalId' => $registeredUserID
))) == false
]]) == false
) {
continue;
}
@ -493,21 +579,21 @@ class RetailCrmHistory
$corporateCustomerBuilder->setOrderCustomerExtId($orderCustomerExtId);
}
$buyerProfileToAppend = array();
$buyerProfileToAppend = [];
if (RetailCrmOrder::isOrderCorporate($order) && !empty($order['company'])) {
$buyerProfile = $corporateCustomerBuilder->getBuyerProfile()->getObjectToArray();
$buyerProfileToAppend = OrderUserProperties::getList(array(
$buyerProfileToAppend = OrderUserProperties::getList([
"filter" => $buyerProfile
))->fetch();
])->fetch();
if (empty($buyerProfileToAppend)) {
$buyerProfileInstance = new CSaleOrderUserProps();
if ($buyerProfileInstance->Add($buyerProfile)) {
$buyerProfileToAppend = OrderUserProperties::getList(array(
$buyerProfileToAppend = OrderUserProperties::getList([
"filter" => $buyerProfile
))->fetch();
])->fetch();
}
}
}
@ -586,7 +672,7 @@ class RetailCrmHistory
$personType = $newOrder->getField('PERSON_TYPE_ID');
if (RetailCrmOrder::isOrderCorporate($order)
|| (!empty($order['contragentType']) && $order['contragentType'] == 'legal-entity')
|| (!empty($order['contragentType']) && in_array($order['contragentType'], ['legal-entity', 'enterpreneur']))
) {
$personType = $contragentTypes['legal-entity'];
$newOrder->setField('PERSON_TYPE_ID', $personType);
@ -594,8 +680,8 @@ class RetailCrmHistory
$propsRemove = true;
} else {
if (isset($order['orderType']) && $order['orderType']) {
$nType = array();
$tList = RCrmActions::OrderTypesList(array(array('LID' => $site)));
$nType = [];
$tList = RCrmActions::OrderTypesList([['LID' => $site]]);
foreach ($tList as $type) {
if (isset($optionsOrderTypes[$type['ID']])) {
@ -648,7 +734,7 @@ class RetailCrmHistory
//props
$propertyCollection = $newOrder->getPropertyCollection();
$propertyCollectionArr = $propertyCollection->getArray();
$nProps = array();
$nProps = [];
foreach ($propertyCollectionArr['properties'] as $orderProp) {
if ($orderProp['ID'][0] == 'n') {
@ -665,7 +751,7 @@ class RetailCrmHistory
$nProps[] = $orderProp;
}
$orderDump = array();
$orderDump = [];
$propertyCollectionArr['properties'] = $nProps;
if ($propsRemove) {//delete props
@ -682,7 +768,7 @@ class RetailCrmHistory
$order = $orderCrm['order'];
}
$propsKey = array();
$propsKey = [];
foreach ($propertyCollectionArr['properties'] as $prop) {
if ($prop['PROPS_GROUP_ID'] != 0) {
@ -706,7 +792,7 @@ class RetailCrmHistory
}
$fio = RCrmActions::explodeFio($fio);
$newFio = array();
$newFio = [];
if ($fio) {
$newFio[] = isset($order['lastName'])
@ -743,59 +829,93 @@ class RetailCrmHistory
} else {
self::setProp($somePropValue, RCrmActions::fromJSON($order[$key]));
}
} elseif (is_array($order['delivery']['address']) && array_key_exists($key, $order['delivery']['address'])) {
if ($propsKey[$orderProp]['TYPE'] == 'LOCATION') {
} elseif ($propsKey[$orderProp]['TYPE'] === 'LOCATION'
&& (
isset($order['delivery']['address']['city'])
|| isset($order['delivery']['address']['region'])
)
) {
try {
$parameters = [
'filter' => [
'NAME.LANGUAGE_ID' => 'ru'
],
'limit' => 1,
'select' => ['*']
];
if (!empty($order['delivery']['address'][$key])) {
$parameters['filter']['NAME.LANGUAGE_ID'] = 'ru';
$parameters['limit'] = 1;
$parameters['select'] = array('*');
$somePropValue = $propertyCollection
->getItemByOrderPropertyId($propsKey[$orderProp]['ID'])
;
// if address have a dot
$loc = explode('.', $order['delivery']['address'][$key]);
if (count($loc) == 1) {
$codeLocation = $somePropValue->getValue();
$subParameters = $parameters;
$subParameters['filter']['=CODE'] = RCrmActions::fromJSON($codeLocation);
$subLocation = Finder::find($subParameters)->fetch();
if (!isset($order['delivery']['address']['city'])) {
$parameters['filter']['=ID'] = RCrmActions::fromJSON($subLocation['CITY_ID']);
} else { // В системе город пишется с префиксом (г. Москва)
$loc = explode('.', $order['delivery']['address']['city']);
if (count($loc) === 1) {
$parameters['filter']['=NAME.NAME'] = RCrmActions::fromJSON(trim($loc[0]));
} else {
$parameters['filter']['=NAME.NAME'] = RCrmActions::fromJSON(trim($loc[1]));
}
}
$location = Finder::find(
$parameters
)->fetch();
if (!isset($order['delivery']['address']['region'])) {
$parameters['filter']['=PARENT.ID'] = RCrmActions::fromJSON($subLocation['REGION_ID']);
} else {
$parameters['filter']['PARENT.NAME.NAME'] = RCrmActions::fromJSON(trim($order['delivery']['address']['region']));
}
$location = Finder::find($parameters)->fetch();
//При существовании района в локации, фильтр по региону изменяется
if (empty($location)) {
if (!isset($order['delivery']['address']['region'])) {
$parameters['filter']['=PARENT.PARENT.ID'] = RCrmActions::fromJSON($subLocation['REGION_ID']);
unset($parameters['filter']['=PARENT.ID']);
} else {
$parameters['filter']['PARENT.PARENT.NAME.NAME'] = RCrmActions::fromJSON(trim($order['delivery']['address']['region']));
unset($parameters['filter']['PARENT.NAME.NAME']);
}
$location = Finder::find($parameters)->fetch();
}
if (!empty($location)) {
$somePropValue = $propertyCollection
->getItemByOrderPropertyId($propsKey[$orderProp]['ID'])
;
try {
self::setProp($somePropValue, $location['CODE']);
} catch (ArgumentException $argumentException) {
RCrmActions::eventLog(
'RetailCrmHistory::orderHistory',
'RetailCrmHistory::setProp',
'Location parameter is incorrect in order number=' . $order['number']
);
}
self::setProp($somePropValue, $location['CODE']);
} else {
if (isset($order['externalId'])) {
$message = 'ExternalId: ' . $order['externalId'];
} else {
$message = 'CRM id: ' . $order['id'];
}
RCrmActions::eventLog(
'RetailCrmHistory::orderHistory',
'RetailCrmHistory::setProp',
sprintf(
'Error location. %s is empty in order number=%s',
$order['delivery']['address'][$key],
$order['number']
)
'Ошибка обновления локации в заказе. ' . $message
);
}
} else {
$somePropValue = $propertyCollection
->getItemByOrderPropertyId($propsKey[$orderProp]['ID']);
self::setProp(
$somePropValue,
RCrmActions::fromJSON($order['delivery']['address'][$key])
} catch (\Exception $exception) {
RCrmActions::eventLog(
'RetailCrmHistory::orderHistory',
'RetailCrmHistory::setProp',
'Error when updating a location. Order: '
. $order['number'] . ' message:' . $exception->getMessage()
);
}
} elseif (is_array($order['delivery']['address']) && array_key_exists($key, $order['delivery']['address'])) {
$somePropValue = $propertyCollection
->getItemByOrderPropertyId($propsKey[$orderProp]['ID']);
self::setProp(
$somePropValue,
RCrmActions::fromJSON($order['delivery']['address'][$key])
);
}
}
}
@ -895,6 +1015,14 @@ class RetailCrmHistory
$order['site']
);
if (!$response) {
Logger::getInstance()->write(
sprintf('Заказ %s не выгружен. Не удалось получить клиента', $order['id']),
'orderAgent'
);
continue;
}
$newUser = new CUser();
$customerBuilder = new CustomerBuilder();
$customerBuilder->setDataCrm($response['customer'])->build();
@ -926,7 +1054,8 @@ class RetailCrmHistory
}
if ($registerNewUser === true) {
$registeredUserID = $newUser->Add(self::getDataUser($customerBuilder));
$customFields = self::getCustomUserFields($response['customer'], $matchedCustomUserFields, $customUserFieldTypes);
$registeredUserID = $newUser->Add(self::getDataUser($customerBuilder, $customFields));
if ($registeredUserID === false) {
RCrmActions::eventLog(
@ -942,10 +1071,10 @@ class RetailCrmHistory
$api,
'customersFixExternalIds',
__METHOD__,
array(array(
[[
'id' => $response['customer']['id'],
'externalId' => $registeredUserID
))
]]
) == false
) {
continue;
@ -970,7 +1099,7 @@ class RetailCrmHistory
$duplicateItems = [];
foreach ($orderTemp['items'] as $item) {
$duplicateItems[$item['id']]['externalId'] += $item['offer']['externalId'];
$duplicateItems[$item['id']]['externalId'] = $item['offer']['externalId'];
$duplicateItems[$item['id']]['quantity'] += $item['quantity'];
$duplicateItems[$item['id']]['discountTotal'] +=
$item['quantity'] * $item['discountTotal'];
@ -1097,7 +1226,6 @@ class RetailCrmHistory
}
if (array_key_exists('discountTotal_sum', $collectItems[$product['offer']['externalId']])) {
$item->setField('CUSTOM_PRICE', 'Y');
$item->setField('DISCOUNT_NAME', '');
$item->setField('DISCOUNT_VALUE', '');
@ -1111,6 +1239,7 @@ class RetailCrmHistory
$price = self::truncate($price, 2);
}
$item->markFieldCustom('PRICE');
$item->setField('PRICE', $price);
}
@ -1140,6 +1269,12 @@ class RetailCrmHistory
}
}
self::orderSave($newOrder);
if ($optionsOrderNumbers === 'Y' && isset($order['number'])) {
$newOrder->setField('ACCOUNT_NUMBER', $order['number']);
}
$orderSumm = 0;
foreach ($basket as $item) {
@ -1157,12 +1292,13 @@ class RetailCrmHistory
$order['summ'] = $orderSumm;
//payment
$newHistoryPayments = array();
$newHistoryPayments = [];
if (array_key_exists('payments', $order)) {
if (!isset($orderCrm)) {
$orderCrm = RCrmActions::apiMethod($api, 'orderGet', __METHOD__, $order['id']);
}
if ($orderCrm) {
self::paymentsUpdate($newOrder, $orderCrm['order'], $newHistoryPayments);
}
@ -1217,13 +1353,28 @@ class RetailCrmHistory
}
$newOrder->setField('PRICE', $orderSumm);
self::orderSave($newOrder);
if ($optionsOrderNumbers === 'Y' && isset($order['number'])) {
$newOrder->setField('ACCOUNT_NUMBER', $order['number']);
self::orderSave($newOrder);
if (self::$CUSTOM_FIELDS_IS_ACTIVE === 'Y' && !empty($matchedCustomOrderFields)) {
foreach ($order['customFields'] as $code => $value) {
if (isset($matchedCustomOrderFields[$code])) {
$arrayIdentifier = explode('#', $matchedCustomOrderFields[$code], 2);
$property = $propertyCollection->getItemByOrderPropertyId($arrayIdentifier[0]);
$value = RCrmActions::convertCrmValueToCmsField($value, $property->getType());
$queryResult = $property->setField('VALUE', $value);
if (!$queryResult->isSuccess()) {
RCrmActions::eventLog(
'RetailCrmHistory::orderHistory',
'CustomOrderPropSave',
'Error when saving a property: ' . $arrayIdentifier[1]
);
}
}
}
}
self::orderSave($newOrder);
//items loyalty info to HL
if (!empty($editBasketInfo)) {
$newBasket = $newOrder->getBasket();
@ -1283,7 +1434,7 @@ class RetailCrmHistory
);
if ($paymentId) {
PaymentTable::update($paymentId, array('XML_ID' => ''));
PaymentTable::update($paymentId, ['XML_ID' => '']);
}
}
}
@ -1296,7 +1447,7 @@ class RetailCrmHistory
$api,
'ordersFixExternalIds',
__METHOD__,
array(array('id' => $order['id'], 'externalId' => $newOrder->getId()))) == false
[['id' => $order['id'], 'externalId' => $newOrder->getId()]]) == false
) {
continue;
}
@ -1350,12 +1501,15 @@ class RetailCrmHistory
*/
public static function search_array_by_value($array, $value)
{
$results = array();
$results = [];
if (is_array($array)) {
$found = array_search($value,$array);
$found = array_search($value, $array);
if ($found) {
$results[] = $found;
}
foreach ($array as $subarray)
$results = array_merge($results, static::search_array_by_value($subarray, $value));
}
@ -1366,14 +1520,14 @@ class RetailCrmHistory
{
$customerHistory = self::filterHistory($customerHistory, 'customer');
$server = Context::getCurrent()->getServer()->getDocumentRoot();
$fields = array();
$fields = [];
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();
$customers = [];
foreach ($customerHistory as $change) {
$change['customer'] = self::removeEmpty($change['customer']);
if ($customers[$change['customer']['id']]) {
@ -1449,10 +1603,11 @@ class RetailCrmHistory
}
}
$orders = array();
$orders = [];
foreach ($orderHistory as $change) {
$change['order'] = self::removeEmpty($change['order']);
unset($change['order']['status']);
if ($change['order']['items']) {
$items = [];
@ -1487,7 +1642,7 @@ class RetailCrmHistory
}
if ($change['order']['payments']) {
$payments = array();
$payments = [];
foreach ($change['order']['payments'] as $payment) {
$payments[$payment['id']] = $payment;
}
@ -1700,7 +1855,7 @@ class RetailCrmHistory
$services = $service->getProfilesList();
if (!array_key_exists($serviceCode, $services)) {
$serviceCode = strtoupper($serviceCode);
$serviceCode = str_replace(array('-'), "_", $serviceCode);
$serviceCode = str_replace('-', "_", $serviceCode);
}
}
@ -1722,28 +1877,30 @@ class RetailCrmHistory
$shipmentColl = $bitrixOrder->getShipmentCollection();
if ($delivery) {
$baseFields = [
'BASE_PRICE_DELIVERY' => $crmOrder['delivery']['cost'],
'PRICE_DELIVERY' => $crmOrder['delivery']['cost'],
'CURRENCY' => $bitrixOrder->getCurrency(),
'DELIVERY_NAME' => $delivery->getName(),
'CUSTOM_PRICE_DELIVERY' => 'Y',
];
if (RetailcrmConfigProvider::getTrackNumberStatus() === 'Y') {
$baseFields['TRACKING_NUMBER'] = $crmOrder['delivery']['data']['trackNumber'] ?? '';
}
//В коллекции всегда есть одна скрытая системная доставка, к которой относятся нераспределенные товары
//Поэтому, если есть только системная доставка, то нужно создать новую
if (!$update || $shipmentColl->count() === 1) {
$shipment = $shipmentColl->createItem($delivery);
$shipment->setFields([
'BASE_PRICE_DELIVERY' => $crmOrder['delivery']['cost'],
'PRICE_DELIVERY' => $crmOrder['delivery']['cost'],
'CURRENCY' => $bitrixOrder->getCurrency(),
'DELIVERY_NAME' => $delivery->getName(),
'CUSTOM_PRICE_DELIVERY' => 'Y'
]);
$shipment->setFields($baseFields);
} else {
$baseFields['DELIVERY_ID'] = $deliveryId;
foreach ($shipmentColl as $shipment) {
if (!$shipment->isSystem()) {
$shipment->setFields([
'BASE_PRICE_DELIVERY' => $crmOrder['delivery']['cost'],
'PRICE_DELIVERY' => $crmOrder['delivery']['cost'],
'CURRENCY' => $bitrixOrder->getCurrency(),
'DELIVERY_ID' => $deliveryId,
'DELIVERY_NAME' => $delivery->getName(),
'CUSTOM_PRICE_DELIVERY' => 'Y'
]);
$shipment->setFields($baseFields);
}
}
}
@ -1830,16 +1987,19 @@ class RetailCrmHistory
*
* @return void
*/
public static function paymentsUpdate($order, $paymentsCrm, &$newHistoryPayments = array())
public static function paymentsUpdate($order, $paymentsCrm, &$newHistoryPayments = [])
{
$optionsPayTypes = array_flip(unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_PAYMENT_TYPES, 0)));
$optionsPayment = array_flip(unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_PAYMENT, 0)));
$optionsPayTypes = self::$optionsPayment['payTypes'];
$optionsPayment = self::$optionsPayment['paymentList'];
$allPaymentSystems = RCrmActions::PaymentList();
foreach ($allPaymentSystems as $allPaymentSystem) {
$arPaySysmems[$allPaymentSystem['ID']] = $allPaymentSystem['NAME'];
}
$paymentsList = array();
$paymentsList = [];
$paymentColl = $order->getPaymentCollection();
foreach ($paymentColl as $paymentData) {
$data = $paymentData->getFields()->getValues();
$paymentsList[$data['ID']] = $paymentData;
@ -1847,6 +2007,7 @@ class RetailCrmHistory
//data from crm
$paySumm = 0;
foreach ($paymentsCrm['payments'] as $paymentCrm) {
if (isset($paymentCrm['externalId']) && !empty($paymentCrm['externalId'])) {
//find the payment
@ -1855,10 +2016,12 @@ class RetailCrmHistory
//update data
if ($nowPayment instanceof Payment) {
$nowPayment->setField('SUM', $paymentCrm['amount']);
if ($optionsPayTypes[$paymentCrm['type']] != $nowPayment->getField('PAY_SYSTEM_ID')) {
$nowPayment->setField('PAY_SYSTEM_ID', $optionsPayTypes[$paymentCrm['type']]);
$nowPayment->setField('PAY_SYSTEM_NAME', $arPaySysmems[$optionsPayTypes[$paymentCrm['type']]]);
}
if (isset($optionsPayment[$paymentCrm['status']])) {
$nowPayment->setField('PAID', $optionsPayment[$paymentCrm['status']]);
}
@ -1878,6 +2041,7 @@ class RetailCrmHistory
$newPayment->setField('EXTERNAL_PAYMENT', 'N');
$newPayment->setField('UPDATED_1C', 'N');
$newPayment->setField('XML_ID', $paymentCrm['id']);
$newPayment->setField('ACCOUNT_NUMBER', $order->getField('ACCOUNT_NUMBER'));
$newPaymentId = $newPayment->getId();
@ -1890,6 +2054,7 @@ class RetailCrmHistory
$paySumm += $paymentCrm['amount'];
}
}
foreach ($paymentsList as $payment) {
if ($payment->isPaid()) {
$payment->setPaid("N");
@ -1897,7 +2062,7 @@ class RetailCrmHistory
$payment->delete();
}
if ($paymentsCrm['totalSumm'] == $paySumm) {
if ($paymentsCrm['totalSumm'] == $paySumm && $order->getField('CANCELED') !== 'Y') {
$order->setFieldNoDemand('PAYED', 'Y');
} else {
$order->setFieldNoDemand('PAYED', 'N');
@ -1915,7 +2080,7 @@ class RetailCrmHistory
public static function removeEmpty($inputArray)
{
$outputArray = array();
$outputArray = [];
if (!empty($inputArray)) {
foreach ($inputArray as $key => $element) {
@ -1995,18 +2160,20 @@ class RetailCrmHistory
$url = CAllIBlock::ReplaceDetailUrl($elementInfo['DETAIL_PAGE_URL'], $elementInfo, false, 'E');
$catalog = CCatalogProduct::GetByID($offerId);
$info = array(
$info = [
'NAME' => $elementInfo['NAME'],
'URL' => $url,
'DIMENSIONS' => serialize(array(
'WIDTH' => $catalog['WIDTH'],
'HEIGHT' => $catalog['HEIGHT'],
'LENGTH' => $catalog['LENGTH'],
)),
'DIMENSIONS' => serialize(
[
'WIDTH' => $catalog['WIDTH'],
'HEIGHT' => $catalog['HEIGHT'],
'LENGTH' => $catalog['LENGTH'],
]
),
'WEIGHT' => $catalog['WEIGHT'],
'XML_ID' => $elementInfo["XML_ID"],
'IBLOCK_XML_ID' => $elementInfo["IBLOCK_EXTERNAL_ID"]
);
];
return $info;
}
@ -2112,7 +2279,7 @@ class RetailCrmHistory
* @param $customerBuilder
* @return array
*/
private static function getDataUser($customerBuilder)
private static function getDataUser($customerBuilder, $customFields)
{
$customerArray = $customerBuilder->getCustomer()->getObjectToArray();
@ -2120,6 +2287,27 @@ class RetailCrmHistory
$customerArray['UF_SUBSCRIBE_USER_EMAIL'] = 'Y';
}
$customerArray = array_merge($customerArray, $customFields);
return self::convertBooleanFields($customerArray);
}
private static function getCustomUserFields($customer, $matchedCustomFields, $customUserFieldTypes)
{
$customFields = [];
if (self::$CUSTOM_FIELDS_IS_ACTIVE === 'Y'
&& isset($customer['customFields'])
&& is_array($customer['customFields'])
) {
foreach ($customer['customFields'] as $code => $value) {
if (isset($matchedCustomFields[$code]) && !empty($customUserFieldTypes[$matchedCustomFields[$code]])) {
$type = $customUserFieldTypes[$matchedCustomFields[$code]];
$customFields[$matchedCustomFields[$code]] = RCrmActions::convertCrmValueToCmsField($value, $type);
}
}
}
return $customFields;
}
}

View file

@ -1,7 +1,19 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\History
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* Class RetailUser
*
* @category RetailCRM
* @package RetailCRM\History
*/
class RetailUser extends CUser
{

View file

@ -1,5 +1,21 @@
<?php
IncludeModuleLangFile(__FILE__);
/**
* @category RetailCRM
* @package RetailCRM\Inventories
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* Class RetailCrmInventories
*
* @category RetailCRM
* @package RetailCRM\Inventories
*/
class RetailCrmInventories
{
public static $pageSize = 500;
@ -151,4 +167,4 @@ class RetailCrmInventories
return $val;
}
}
}

View file

@ -1,6 +1,16 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\Order
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
use Bitrix\Main\Context;
use Bitrix\Main\Type\DateTime;
use Bitrix\Main\Context\Culture;
use Bitrix\Main\UserTable;
use Bitrix\Sale\Delivery\Services\Manager;
@ -8,6 +18,8 @@ use Bitrix\Sale\Internals\Fields;
use Bitrix\Sale\Internals\OrderTable;
use Bitrix\Sale\Location\LocationTable;
use Bitrix\Sale\Order;
use Intaro\RetailCrm\Component\ApiClient\ClientAdapter;
use Intaro\RetailCrm\Component\Constants;
use Intaro\RetailCrm\Component\Factory\ClientFactory;
use Intaro\RetailCrm\Component\ServiceLocator;
use Intaro\RetailCrm\Service\LoyaltyService;
@ -15,7 +27,6 @@ use RetailCrm\ApiClient;
use Intaro\RetailCrm\Service\ManagerService;
use Intaro\RetailCrm\Service\LoyaltyAccountService;
use RetailCrm\Response\ApiResponse;
use \Bitrix\Sale\Location\Name\LocationTable as LocationTableName;
use Intaro\RetailCrm\Component\ConfigProvider;
use Intaro\RetailCrm\Model\Api\Response\OrdersCreateResponse;
@ -23,6 +34,9 @@ IncludeModuleLangFile(__FILE__);
/**
* Class RetailCrmOrder
*
* @category RetailCRM
* @package RetailCRM\Order
*/
class RetailCrmOrder
{
@ -121,17 +135,25 @@ class RetailCrmOrder
$order['contragent']['contragentType'] = $arParams['optionsContragentType'][$arOrder['PERSON_TYPE_ID']];
//fields
$countryList = BitrixOrderService::getCountryList();
$isSendCustomFields = 'N';
if (method_exists(RCrmActions::class, 'convertCmsFieldToCrmValue')) {
$isSendCustomFields = RetailcrmConfigProvider::getCustomFieldsStatus();
}
//Order fields
foreach ($arOrder['PROPS']['properties'] as $prop) {
if (!empty($arParams['optionsLegalDetails'])
&& is_array($arParams['optionsLegalDetails'][$arOrder['PERSON_TYPE_ID']])
&& $search = array_search($prop['CODE'], $arParams['optionsLegalDetails'][$arOrder['PERSON_TYPE_ID']])
) {
$order['contragent'][$search] = $prop['VALUE'][0];//legal order data
} elseif (!empty($arParams['optionsCustomFields'])
&& $search = array_search($prop['CODE'], $arParams['optionsCustomFields'][$arOrder['PERSON_TYPE_ID']])
} elseif ($isSendCustomFields === 'Y'
&& !empty($arParams['customOrderProps'])
&& isset($arParams['customOrderProps'][$prop['ID'] . '#' . $prop['CODE']])
) {
$order['customFields'][$search] = $prop['VALUE'][0];//custom properties
$order['customFields'][$arParams['customOrderProps'][$prop['ID'] . '#' . $prop['CODE']]] = RCrmActions::convertCmsFieldToCrmValue($prop['VALUE'][0], $prop['TYPE']);
} elseif (is_array($arParams['optionsOrderProps'][$arOrder['PERSON_TYPE_ID']])
&& $search = array_search($prop['CODE'], $arParams['optionsOrderProps'][$arOrder['PERSON_TYPE_ID']])) {//other
if (in_array($search, ['fio', 'phone', 'email'])) {//fio, phone, email
@ -147,34 +169,21 @@ class RetailCrmOrder
$order[$search] = $prop['VALUE'][0];//phone, email
}
} else {//address
} else {
if ($prop['TYPE'] === 'LOCATION' && isset($prop['VALUE'][0]) && $prop['VALUE'][0] != '') {
$arLoc = LocationTable::getByCode($prop['VALUE'][0])->fetch();
if ($arLoc) {
$server = Context::getCurrent()->getServer()->getDocumentRoot();
$countrys = [];
$deliveryLocation = CSaleLocation::GetByID($arLoc['ID']);
$order['delivery']['address']['region'] = $deliveryLocation['REGION_NAME'] ?? '';
$city = $deliveryLocation['CITY_NAME'] ?? null;
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 = LocationTableName::getList([
'filter' => ['=LOCATION_ID' => $arLoc['CITY_ID'], 'LANGUAGE_ID' => 'ru']
])->fetch();
if (count($countrys) > 0) {
$countryOrder = LocationTableName::getList([
'filter' => ['=LOCATION_ID' => $arLoc['COUNTRY_ID'], 'LANGUAGE_ID' => 'ru']
])->fetch();
if(isset($countrys[$countryOrder['NAME']])){
$order['countryIso'] = $countrys[$countryOrder['NAME']];
}
if (count($countryList) > 0 && isset($countryList[$deliveryLocation['COUNTRY_NAME']])) {
$order['countryIso'] = $countryList[$deliveryLocation['COUNTRY_NAME']];
}
}
$prop['VALUE'][0] = $location['NAME'];
$prop['VALUE'][0] = null;
}
if (!empty($prop['VALUE'][0])) {
@ -184,7 +193,23 @@ class RetailCrmOrder
}
}
//deliverys
//Перезапись города при его наличии в свойстве типа LOCATION
if (isset($city)) {
$order['delivery']['address']['city'] = $city;
}
// Пункт самовывоза
$pickupPointAddress = '';
if (RetailcrmConfigProvider::needSendPickupPointAddress() === 'Y') {
$pickupPointAddress = BitrixOrderService::getPickupPointAddress($arOrder);
}
if ($pickupPointAddress !== '') {
$order['delivery']['address']['text'] = $pickupPointAddress;
}
//Deliverys
if (array_key_exists($arOrder['DELIVERYS'][0]['id'], $arParams['optionsDelivTypes'])) {
$order['delivery']['code'] = $arParams['optionsDelivTypes'][$arOrder['DELIVERYS'][0]['id']];
@ -316,6 +341,8 @@ class RetailCrmOrder
} elseif ($product['BASE_PRICE'] >= $product['PRICE']) {
$item['discountManualAmount'] = self::getDiscountManualAmount($product);
$item['initialPrice'] = (double) $product['BASE_PRICE'];
$order['discountManualAmount'] = 0;
$order['discountManualPercent'] = 0;
} else {
$item['discountManualAmount'] = 0;
$item['initialPrice'] = $product['PRICE'];
@ -331,7 +358,7 @@ class RetailCrmOrder
$order['items'][] = $item;
if ($send && $dimensionsSetting === 'Y') {
if ($dimensionsSetting === 'Y') {
$dimensions = RCrmActions::unserializeArrayRecursive($product['DIMENSIONS']);
if ($dimensions !== false) {
@ -343,7 +370,7 @@ class RetailCrmOrder
}
}
if ($send && $dimensionsSetting === 'Y') {
if ($dimensionsSetting === 'Y') {
$order['width'] = $width;
$order['height'] = $height;
$order['length'] = $length;
@ -354,30 +381,27 @@ class RetailCrmOrder
$payments = [];
foreach ($arOrder['PAYMENTS'] as $payment) {
$isIntegrationPayment = RetailCrmService::isIntegrationPayment($payment['PAY_SYSTEM_ID'] ?? null);
if (!empty($payment['PAY_SYSTEM_ID']) && isset($arParams['optionsPayTypes'][$payment['PAY_SYSTEM_ID']])) {
$pm = [
'type' => $arParams['optionsPayTypes'][$payment['PAY_SYSTEM_ID']]
];
$crmPayment = [];
if (!empty($payment['DATE_PAID'])) {
$crmPayment['paidAt'] = new \DateTime($payment['DATE_PAID']);
}
if (!empty($arParams['optionsPayment'][$payment['PAID']])) {
$crmPayment['status'] = $arParams['optionsPayment'][$payment['PAID']];
}
if (!empty($payment['ID'])) {
$pm['externalId'] = RCrmActions::generatePaymentExternalId($payment['ID']);
}
if (!empty($payment['DATE_PAID']) && !$isIntegrationPayment) {
$pm['paidAt'] = new \DateTime($payment['DATE_PAID']);
}
if (!empty($arParams['optionsPayment'][$payment['PAID']]) && !$isIntegrationPayment) {
$pm['status'] = $arParams['optionsPayment'][$payment['PAID']];
$crmPayment['externalId'] = RCrmActions::generatePaymentExternalId($payment['ID']);
}
if (RetailcrmConfigProvider::shouldSendPaymentAmount()) {
$pm['amount'] = $payment['SUM'];
$crmPayment['amount'] = $payment['SUM'];
}
$payments[] = $pm;
$crmPayment = RetailCrmService::preparePayment($crmPayment, $payment, $arParams['optionsPayTypes']);
$payments[] = $crmPayment;
} else {
RCrmActions::eventLog(
'RetailCrmOrder::orderSend',
@ -406,7 +430,7 @@ class RetailCrmOrder
return false;
}
}
if ('ordersEdit' === $methodApi) {
$order = RetailCrmService::unsetIntegrationDeliveryFields($order);
}
@ -416,20 +440,21 @@ class RetailCrmOrder
Logger::getInstance()->write($order, 'orderSend');
/** @var \Intaro\RetailCrm\Component\ApiClient\ClientAdapter $client */
/** @var ClientAdapter $client */
$client = ClientFactory::createClientAdapter();
$userId = $arOrder['USER_ID'];
$arUser = UserTable::getById($userId)->fetch();
// Check and set privilegeType
$order['privilegeType'] = LoyaltyAccountService::getPrivilegeType($client, $arParams);
$order['privilegeType'] = LoyaltyAccountService::getPrivilegeType($client, $userId, $arParams);
$arUser = UserTable::getById($arOrder['USER_ID'])->fetch();
$fioCrm = [$order['firstName'] ?? null, $order['lastName'] ?? null, $order['patronymic'] ?? null];
if (in_array($arUser['NAME'], $fioCrm)) {
if (!empty($arUser['NAME']) && in_array($arUser['NAME'], $fioCrm)) {
$order['firstName'] = $arUser['NAME'];
}
if (in_array($arUser['LAST_NAME'], $fioCrm)) {
if (!empty($arUser['LAST_NAME']) && in_array($arUser['LAST_NAME'], $fioCrm)) {
$order['lastName'] = $arUser['LAST_NAME'];
}
@ -448,6 +473,17 @@ class RetailCrmOrder
$crmBasket = RCrmActions::apiMethod($api, 'cartGet', __METHOD__, $externalId, $site);
$orderResponse = $client->createOrder($order, $site);
if ($orderResponse instanceof OrdersCreateResponse && !$orderResponse->success) {
Logger::getInstance()->write([
'methodApi' => 'orderCreate',
'errorMsg' => $orderResponse->errorMsg ?? '',
'errors' => $orderResponse->errors ?? '',
'params' => ['number' => $order['number'], 'externalId' => $order['externalId']]
], 'apiErrors');
}
if (!empty($crmBasket['cart']) && $orderResponse instanceof OrdersCreateResponse && !empty($orderResponse->id) ) {
RCrmActions::apiMethod(
$api,
@ -501,9 +537,11 @@ class RetailCrmOrder
$resCustomersAdded = [];
$resCustomersCorporate = [];
$orderIds = [];
$orderUpdateIds = [];
$lastUpOrderId = RetailcrmConfigProvider::getLastOrderId();
$failedIds = RetailcrmConfigProvider::getFailedOrdersIds();
$uploadMethod = RetailcrmConfigProvider::getOrderDischarge();
if ($failed == true && $failedIds !== false && count($failedIds) > 0) {
$orderIds = $failedIds;
@ -522,6 +560,22 @@ class RetailCrmOrder
}
}
if((int)$uploadMethod === 0) {
$dateOfLastUpdate = RetailcrmConfigProvider::getLastOrderUpdate();
$dbOrderUpdate = OrderTable::GetList([
'order' => ['ID' => 'ASC'],
'filter' => ['>DATE_UPDATE' => DateTime::createFromTimestamp(strtotime($dateOfLastUpdate))],
'limit' => $pSize,
'select' => ['ID'],
]);
while ($arOrderUpdate = $dbOrderUpdate->fetch()) {
$orderUpdateIds[] = $arOrderUpdate['ID'];
}
}
$orderIds = array_unique(array_merge($orderIds, $orderUpdateIds));
if (count($orderIds) <= 0) {
return false;
}
@ -549,9 +603,11 @@ class RetailCrmOrder
'optionsContragentType' => $optionsContragentType,
'optionsSitesList' => RetailcrmConfigProvider::getSitesList(),
'optionsCustomFields' => $optionsCustomFields,
'customOrderProps' => RetailcrmConfigProvider::getMatchedOrderProps(),
];
$recOrders = [];
$maxUpdateDate = $dateOfLastUpdate;
foreach ($orderIds as $orderId) {
$bitrixOrder = Order::load($orderId);
@ -562,6 +618,8 @@ class RetailCrmOrder
$arCustomer = [];
$arCustomerCorporate = [];
$methodApi = 'ordersCreate';
$order = self::orderObjToArr($bitrixOrder);
$site = self::getCrmShopCodeByLid($order['LID'], $arParams['optionsSitesList']);
@ -579,14 +637,30 @@ class RetailCrmOrder
continue;
}
self::createCustomerForOrder($api, $arCustomer, $arCustomerCorporate,$arParams, $order, $site);
if((int)$uploadMethod === 0) {
$orderCrm = RCrmActions::apiMethod($api, 'ordersGet', __METHOD__, $orderId, $site);
if (isset($orderCrm['order'])) {
$methodApi = 'ordersEdit';
$arParams['crmOrder'] = $orderCrm['order'];
}
}
if (isset($order['RESPONSIBLE_ID']) && !empty($order['RESPONSIBLE_ID'])) {
$managerService = ManagerService::getInstance();
$arParams['managerId'] = $managerService->getManagerCrmId((int) $order['RESPONSIBLE_ID']);
}
$arOrders = self::orderSend($order, $api, $arParams, false, $site,'ordersCreate');
if ($methodApi === 'ordersEdit') {
$updateDate = $bitrixOrder->getField('DATE_UPDATE')->format("Y-m-d H:i:s");
$maxUpdateDate = $updateDate > $maxUpdateDate ? $updateDate : $maxUpdateDate;
self::orderSend($order, $api, $arParams, true, $site);
continue;
}
self::createCustomerForOrder($api, $arCustomer, $arCustomerCorporate,$arParams, $order, $site);
$arOrders = self::orderSend($order, $api, $arParams, false, $site, $methodApi);
if (!$arCustomer || !$arOrders) {
continue;
@ -608,6 +682,8 @@ class RetailCrmOrder
$recOrders[] = $orderId;
}
RetailcrmConfigProvider::setLastOrderUpdate($maxUpdateDate);
if (count($ordersPack) > 0) {
if (false === RetailCrmOrder::uploadCustomersList($resCustomers, $api, $arParams['optionsSitesList'])) {
return false;
@ -689,7 +765,7 @@ class RetailCrmOrder
if (
'Y' === RetailcrmConfigProvider::getCorporateClientStatus()
&& $optionsContragentType[$order['PERSON_TYPE_ID']] === 'legal-entity'
&& in_array($optionsContragentType[$order['PERSON_TYPE_ID']], ['legal-entity', 'enterpreneur'])
) {
// TODO check if order is corporate, and if it IS - make corporate order
$arCustomer = RetailCrmUser::customerSend(
@ -703,7 +779,7 @@ class RetailCrmOrder
$arCustomerCorporate = RetailCrmCorporateClient::clientSend(
$order,
$api,
'legal-entity',
$optionsContragentType[$order['PERSON_TYPE_ID']],
false,
true,
$site
@ -749,7 +825,7 @@ class RetailCrmOrder
if (
isset($orderData['contragent']['contragentType'])
&& $orderData['contragent']['contragentType'] === 'legal-entity'
&& in_array($orderData['contragent']['contragentType'], ['legal-entity', 'enterpreneur'])
&& !empty($customerLegalName)
) {
if (isset($cachedCorporateIds[$customerLegalName])) {
@ -959,7 +1035,9 @@ class RetailCrmOrder
}
if ($delivery['PARENT_ID']) {
$service = explode(':', $delivery['CODE']);
$shipment = ['id' => $delivery['PARENT_ID'], 'service' => $service[1]];
$shipment = $delivery['CLASS_NAME'] === '\Sale\Handlers\Delivery\RussianpostProfile'
? ['id' => $delivery['PARENT_ID'], 'service' => 'bitrix-' . $delivery['ID']]
: ['id' => $delivery['PARENT_ID'], 'service' => $service[1]];
} else {
$shipment = ['id' => $delivery['ID']];
}

View file

@ -1,5 +1,22 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\Prices
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
IncludeModuleLangFile(__FILE__);
/**
* Class RetailCrmPrices
*
* @category RetailCRM
* @package RetailCRM\Prices
*/
class RetailCrmPrices
{
public static $MODULE_ID = 'intaro.retailcrm';
@ -150,4 +167,4 @@ class RetailCrmPrices
return 'RetailCrmPrices::pricesUpload();';
}
}
}

View file

@ -0,0 +1,65 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\Service
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
use Bitrix\Sale\Order;
use Bitrix\Main\Context;
use Bitrix\Catalog\StoreTable;
/**
* Class BitrixOrderService
*
* @category RetailCRM
* @package RetailCRM\Service
*/
class BitrixOrderService
{
public static function getCountryList()
{
$server = Context::getCurrent()->getServer()->getDocumentRoot();
$countryList = [];
if (file_exists($server . '/bitrix/modules/intaro.retailcrm/classes/general/config/country.xml')) {
$countryFile = simplexml_load_file($server . '/bitrix/modules/intaro.retailcrm/classes/general/config/country.xml');
foreach ($countryFile->country as $country) {
$countryList[RCrmActions::fromJSON((string) $country->name)] = (string) $country->alpha;
}
}
return $countryList;
}
public static function getPickupPointAddress($arOrder)
{
$address = '';
$orderInfo = Order::load($arOrder['ID']);
foreach ($orderInfo->getShipmentCollection() as $store) {
$storeId = $store->getStoreId();
if ($storeId) {
$arStore = StoreTable::getRow([
'filter' => [
'ID' => $storeId,
]
]);
if (!empty($arStore['ADDRESS'])) {
$address = GetMessage('PICKUP_POINT') . $arStore['ADDRESS'];
break;
}
}
}
return $address;
}
}

View file

@ -1,7 +1,21 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\Service
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
use Intaro\RetailCrm\Component\Constants;
/**
* Class RetailCrmService
*
* @category RetailCRM
* @package RetailCRM\Service
*/
class RetailCrmService
{
@ -141,11 +155,11 @@ class RetailCrmService
}
if (empty($type['sites'])) {
$result[] = $type;
$result[$type['code']] = $type;
} else {
foreach ($type['sites'] as $site) {
if (!empty($availableSites[$site])) {
$result[] = $type;
$result[$type['code']] = $type;
break;
}
}
@ -178,4 +192,29 @@ class RetailCrmService
);
}
}
/**
* @param array $crmPayment
* @param array $bitrixPayment
* @param array $optionsPaymentTypes
* @return array mixed
*/
public static function preparePayment($crmPayment, $bitrixPayment, $optionsPaymentTypes)
{
$isIntegrationPayment = self::isIntegrationPayment($bitrixPayment['PAY_SYSTEM_ID'] ?? null);
if ($isIntegrationPayment && RetailcrmConfigProvider::getSyncIntegrationPayment() === 'Y') {
$crmPayment['type'] = $optionsPaymentTypes[$bitrixPayment['PAY_SYSTEM_ID']] .
Constants::CRM_PART_SUBSTITUTED_PAYMENT_CODE;
} else {
$crmPayment['type'] = $optionsPaymentTypes[$bitrixPayment['PAY_SYSTEM_ID']];
if ($isIntegrationPayment) {
unset($crmPayment['paidAt'], $crmPayment['status']);
}
}
return $crmPayment;
}
}

View file

@ -1,4 +1,20 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\Ua
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
/**
* Class RetailCrmUa
*
* @category RetailCRM
* @package RetailCRM\Ua
*/
class RetailCrmUa
{
public static $MODULE_ID = 'intaro.retailcrm';
@ -82,4 +98,4 @@ class RetailCrmUa
$APPLICATION->AddHeadString($ua);
}
}
}
}

View file

@ -1,10 +1,26 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\User
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
use Bitrix\Main\UserTable;
use RetailCrm\ApiClient;
use RetailCrm\Response\ApiResponse;
IncludeModuleLangFile(__FILE__);
/**
* Class RetailCrmCorporateClient
*
* @category RetailCRM
* @package RetailCRM\User
*/
class RetailCrmCorporateClient
{
const CORP_PREFIX = 'corp';

View file

@ -1,5 +1,24 @@
<?php
/**
* @category RetailCRM
* @package RetailCRM\User
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
IncludeModuleLangFile(__FILE__);
use Bitrix\Main\UserTable;
/**
* Class RetailCrmUser
*
* @category RetailCRM
* @package RetailCRM\User
*/
class RetailCrmUser
{
@ -29,6 +48,10 @@ class RetailCrmUser
$customer['createdAt'] = new \DateTime($arFields['DATE_REGISTER']);
$customer['contragent'] = ['contragentType' => $contragentType];
if (RetailcrmConfigProvider::getCustomFieldsStatus() === 'Y') {
$customer['customFields'] = self::getCustomFields($arFields);
}
if ($send && isset($_COOKIE['_rc']) && $_COOKIE['_rc'] != '') {
$customer['browserId'] = $_COOKIE['_rc'];
}
@ -48,8 +71,9 @@ class RetailCrmUser
$normalizer = new RestNormalizer();
$customer = $normalizer->normalize($customer, 'customers');
if (empty($arFields['UF_SUBSCRIBE_USER_EMAIL'])) {
$customer['subscribed'] = false;
if (array_key_exists('UF_SUBSCRIBE_USER_EMAIL', $arFields)) {
// UF_SUBSCRIBE_USER_EMAIL = '1' or '0'
$customer['subscribed'] = (bool) $arFields['UF_SUBSCRIBE_USER_EMAIL'];
}
Logger::getInstance()->write($customer, 'customerSend');
@ -74,6 +98,10 @@ class RetailCrmUser
$customer = self::getSimpleCustomer($arFields);
$found = false;
if (RetailcrmConfigProvider::getCustomFieldsStatus() === 'Y') {
$customer['customFields'] = self::getCustomFields($arFields);
}
if (count($optionsSitesList) > 0) {
foreach ($optionsSitesList as $site) {
$userCrm = RCrmActions::apiMethod($api, 'customersGet', __METHOD__, $arFields['ID'], $site);
@ -150,4 +178,90 @@ class RetailCrmUser
return $customer;
}
private static function getCustomFields(array $arFields)
{
if (!method_exists(RCrmActions::class, 'getTypeUserField')
|| !method_exists(RCrmActions::class, 'convertCmsFieldToCrmValue')
) {
return [];
}
$customUserFields = RetailcrmConfigProvider::getMatchedUserFields();
$typeList = RCrmActions::getTypeUserField();
$result = [];
foreach ($customUserFields as $code => $codeCrm) {
if (isset($arFields[$code])) {
$type = $typeList[$code] ?? '';
$result[$codeCrm] = RCrmActions::convertCmsFieldToCrmValue($arFields[$code], $type);
}
}
return $result;
}
public static function fixDateCustomer(): void
{
CAgent::RemoveAgent("RetailCrmUser::fixDateCustomer();", RetailcrmConstants::MODULE_ID);
COption::SetOptionString(RetailcrmConstants::MODULE_ID, RetailcrmConstants::OPTION_FIX_DATE_CUSTOMER, 'Y');
$startId = COption::GetOptionInt(RetailcrmConstants::MODULE_ID, RetailcrmConstants::OPTION_FIX_DATE_CUSTOMER_LAST_ID, 0);
$api = new RetailCrm\ApiClient(RetailcrmConfigProvider::getApiUrl(), RetailcrmConfigProvider::getApiKey());
$optionsSitesList = RetailcrmConfigProvider::getSitesList();
$limit = 50;
$offset = 0;
while(true) {
try {
$usersResult = UserTable::getList([
'select' => ['ID', 'DATE_REGISTER', 'LID'],
'filter' => ['>ID' => $startId],
'order' => ['ID'],
'limit' => $limit,
'offset' => $offset,
]);
} catch (\Throwable $exception) {
Logger::getInstance()->write($exception->getMessage(), 'fixDateCustomers');
break;
}
$users = $usersResult->fetchAll();
if ($users === []) {
break;
}
foreach ($users as $user) {
$site = null;
if ($optionsSitesList) {
if (isset($user['LID']) && array_key_exists($user['LID'], $optionsSitesList) && $optionsSitesList[$user['LID']] !== null) {
$site = $optionsSitesList[$user['LID']];
} else {
continue;
}
}
$customer['externalId'] = $user['ID'];
try {
$date = new \DateTime($user['DATE_REGISTER']);
$customer['createdAt'] = $date->format('Y-m-d H:i:s');
RCrmActions::apiMethod($api, 'customersEdit', __METHOD__, $customer, $site);
} catch (\Throwable $exception) {
Logger::getInstance()->write($exception->getMessage(), 'fixDateCustomers');
continue;
}
time_nanosleep(0, 250000000);
}
COption::SetOptionInt(RetailcrmConstants::MODULE_ID, RetailcrmConstants::OPTION_FIX_DATE_CUSTOMER_LAST_ID, end($users)['ID']);
$offset += $limit;
}
}
}

View file

@ -1 +1 @@
- Исправлена передача ФИО покупателя в заказе
- Исправлена передача габаритов при выгрузке заказов по агенту

View file

@ -6,6 +6,7 @@ use Intaro\RetailCrm\Model\Bitrix\Xml\XmlSetup;
use Intaro\RetailCrm\Model\Bitrix\Xml\XmlSetupProps;
use Intaro\RetailCrm\Model\Bitrix\Xml\XmlSetupPropsCategories;
use Intaro\RetailCrm\Repository\CatalogRepository;
use Intaro\RetailCrm\Icml\SettingsService;
/** @var $SETUP_FILE_NAME */
@ -37,17 +38,8 @@ if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/bitrix/php_interface/retailcrm/exp
}
}
$iblockProperties = [
'article' => 'article',
'manufacturer' => 'manufacturer',
'color' => 'color',
'weight' => 'weight',
'size' => 'size',
'length' => 'length',
'width' => 'width',
'height' => 'height',
];
global $PROFILE_ID;
$settingService = SettingsService::getInstance([], '', $PROFILE_ID ?? $profile_id);
$iblockPropertySku = [];
$iblockPropertySkuHl = [];
$iblockPropertyUnitSku = [];
@ -55,7 +47,7 @@ if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/bitrix/php_interface/retailcrm/exp
$iblockPropertyProductHl = [];
$iblockPropertyUnitProduct = [];
foreach ($iblockProperties as $prop) {
foreach (array_keys($settingService->actualPropList) as $prop) {
$skuUnitProps = ('iblockPropertyUnitSku_' . $prop);
$skuUnitProps = $$skuUnitProps;

View file

@ -26,7 +26,8 @@ CModule::IncludeModule('intaro.retailcrm');
//TODO заменить вызов на сервис-локатор, когда он приедет
$settingsService = SettingsService::getInstance(
$arOldSetupVars ?? [],
$ACTION
$ACTION,
$PROFILE_ID
);
$isSetupModulePage = $settingsService->isSetupModulePage();
@ -49,7 +50,6 @@ __IncludeLang(GetLangFileName(
$basePriceId = RetailcrmConfigProvider::getCrmBasePrice($_REQUEST['PROFILE_ID']);
$priceTypes = $settingsService->priceTypes;
$iblockFieldsName = $settingsService->getIblockFieldsNames();
$iblockPropertiesHint = $settingsService->getHintProps();
$units = $settingsService->getUnitsNames();
$hintUnit = $settingsService->getHintUnit();
@ -63,7 +63,6 @@ if (($ACTION === 'EXPORT' || $ACTION === 'EXPORT_EDIT' || $ACTION === 'EXPORT_CO
$SETUP_FILE_NAME = $settingsService->setupFileName;
$SETUP_PROFILE_NAME = $settingsService->setupProfileName;
$iblockProperties = $settingsService->getIblockPropsPreset();
$loadPurchasePrice = $settingsService->loadPurchasePrice;
$iblockExport = $settingsService->iblockExport;
$loadNonActivity = $settingsService->loadNonActivity;
@ -112,7 +111,7 @@ if ($STEP === 1) {
}
</style>
<form method="post" action="<?=$APPLICATION->GetCurPage()?>">
<form method="post" id="submit-form" action="<?=$APPLICATION->GetCurPage()?>">
<?php
if ($ACTION === 'EXPORT_EDIT' || $ACTION === 'EXPORT_COPY') {
?>
@ -192,8 +191,7 @@ if ($STEP === 1) {
<tbody>
<?php
foreach ($settingsService->getIblockPropsNames() as $propertyKey => $property) {
$productSelected = false; ?>
foreach ($settingsService->defaultPropList as $propertyKey => $property) { ?>
<tr class="adm-list-table-row">
<td class="adm-list-table-cell">
@ -217,14 +215,14 @@ if ($STEP === 1) {
if ($keyField === $propertyKey) { ?>
<option value="<?=$field['CODE']?>"
<?php
$productSelected = $settingsService->isOptionSelected(
$isSelected = $settingsService->isOptionSelected(
$field,
$arIBlock['OLD_PROPERTY_PRODUCT_SELECT'],
$propertyKey
);
?>
<?= $productSelected ? ' selected' : ''?>
<?= $isSelected ? ' selected' : ''?>
>
<?=$field['name']?>
</option>
@ -243,7 +241,7 @@ if ($STEP === 1) {
<?php
echo $settingsService->getOptionClass($prop, true);
$productSelected = $settingsService->isOptionSelected(
$isSelected = $settingsService->isOptionSelected(
$prop,
$arIBlock['OLD_PROPERTY_PRODUCT_SELECT'],
$propertyKey
@ -253,7 +251,7 @@ if ($STEP === 1) {
= $settingsService->getHlTableName($prop)
?? $productHlTableName;
echo $productSelected ? ' selected' : '';
echo $isSelected ? ' selected' : '';
?>
>
<?=$prop['NAME']?>
@ -378,19 +376,18 @@ if ($STEP === 1) {
<option value="<?=$prop['CODE']?>"
<?php
echo $settingsService->getOptionClass($prop, false);
if (!$productSelected) {
$isSelected = $settingsService->isOptionSelected(
$prop,
$arIBlock['OLD_PROPERTY_SKU_SELECT'],
$propertyKey
);
$skuHlTableName
= $settingsService->getHlTableName($prop)
?? $skuHlTableName;
$isSelected = $settingsService->isOptionSelected(
$prop,
$arIBlock['OLD_PROPERTY_SKU_SELECT'],
$propertyKey
);
echo $isSelected ? ' selected' : '';
}
$skuHlTableName
= $settingsService->getHlTableName($prop)
?? $skuHlTableName;
echo $isSelected ? ' selected' : '';
?>
>
<?=$prop['NAME']?>
@ -475,9 +472,97 @@ if ($STEP === 1) {
</tr>
<?php
} ?>
<?php
$catalogId = $arIBlock['ID'];
$catalogCustomProps = $settingsService->customPropList[$catalogId];
if (!empty($catalogCustomProps)) {
foreach ($catalogCustomProps as $catalogCustomPropCode => $catalogCustomPropValue) { ?>
<tr class="adm-list-table-row custom-property-row">
<td class="adm-list-table-cell custom-property-title">
<?=htmlspecialcharsex($catalogCustomPropValue)?>
</td>
<td class="adm-list-table-cell">
<select
name="iblockPropertyProduct_<?=$catalogCustomPropCode?>[<?= $catalogId ?>]"
id="iblockPropertyProduct_<?=$catalogCustomPropCode . $catalogId ?>"
class="property-export"
data-type="<?= $catalogCustomPropCode ?>"
onchange="propertyChange(this)"
style="width: 200px">
<option value=""></option>
<?php foreach ($arIBlock['PROPERTIES_PRODUCT'] as $prop) {
$productHlTableName = ''; ?>
<option value="<?=$prop['CODE']?>"
<?php
echo $settingsService->getOptionClass($prop, true);
$isSelected = $settingsService->isOptionSelected(
$prop,
$arIBlock['OLD_PROPERTY_PRODUCT_SELECT'],
$catalogCustomPropCode
);
$productHlTableName
= $settingsService->getHlTableName($prop)
?? $productHlTableName;
echo $isSelected ? ' selected' : '';
?>
>
<?=$prop['NAME']?>
</option>
<?php } ?>
</select>
</td>
<?php if ($arIBlock['PROPERTIES_SKU'] !== null) { ?>
<td class="adm-list-table-cell">
<select
name="iblockPropertySku_<?=$catalogCustomPropCode?>[<?= $catalogId ?>]"
id="iblockPropertySku_<?=$catalogCustomPropCode . $catalogId ?>"
class="property-export"
data-type="<?= $catalogCustomPropCode ?>"
onchange="propertyChange(this)"
style="width: 200px">
<option value=""></option>
<?php foreach ($arIBlock['PROPERTIES_SKU'] as $prop) {
$skuHlTableName = ''; ?>
<option value="<?=$prop['CODE']?>"
<?php
echo $settingsService->getOptionClass($prop, false);
$isSelected = $settingsService->isOptionSelected(
$prop,
$arIBlock['OLD_PROPERTY_SKU_SELECT'],
$catalogCustomPropCode
);
$skuHlTableName
= $settingsService->getHlTableName($prop)
?? $skuHlTableName;
echo $isSelected ? ' selected' : '';
?>
>
<?=$prop['NAME']?>
</option>
<?php } ?>
</select>
<button id="delete-custom-row" class="adm-btn-save" type="button" style="margin-left: 10px"><?= GetMessage('DELETE_PROPERTY');?></button>
</td>
<?php } ?>
</tr>
<?php }
}
?>
</tbody>
</table>
<br>
<button class="adm-btn-save add-custom-row" type="button" style="margin-top: 20px;"><?= GetMessage('ADD_PROPERTY');?></button>
<br>
</div>
</div>
@ -486,6 +571,20 @@ if ($STEP === 1) {
</div>
<input type="hidden" name="count_checked" id="count_checked" value="<?=$intCountChecked?>">
<br>
<template id="custom-property-template-row">
<tr class="adm-list-table-row custom-property-row">
<td class="adm-list-table-cell">
<input type="text" title="Название нового свойства" name="custom-property-title" style="width: 200px">
</td>
<td class="adm-list-table-cell">
<select name="iblockPropertyProduct_" id="iblockPropertyProduct_" class="property-export" onchange="propertyChange(this)" style="width: 200px"></select>
</td>
<td class="adm-list-table-cell">
<select name="iblockPropertySku_" id="iiblockPropertySku_" class="property-export" onchange="propertyChange(this)" style="width: 200px"></select>
<button id="delete-new-custom-row" class="adm-btn-save" type="button" style="margin-left: 10px"><?= GetMessage('DELETE_PROPERTY');?></button>
</td>
</tr>
</template>
<h3><?=GetMessage('SETTINGS_EXPORT')?></h3>
<span class="text"><?=GetMessage('FILENAME')?><br><br></span>
<input type="text" name="SETUP_FILE_NAME" value="<?=htmlspecialcharsbx(strlen($SETUP_FILE_NAME) > 0 ?
@ -568,7 +667,7 @@ if ($STEP === 1) {
<input type="hidden" name="STEP" value="<?=$STEP + 1?>">
<input type="hidden" name="SETUP_FIELDS_LIST" value="<?=
$settingsService->getSetupFieldsString(
$iblockProperties ?? [],
array_keys($settingsService->actualPropList) ?? [],
$hlblockModule === true,
$hlBlockList ?? []
)
@ -579,8 +678,109 @@ if ($STEP === 1) {
</form>
<?php CJSCore::Init(['jquery']);?>
<?php CUtil::InitJSCore(['intaro_custom_props']); ?>
<script type="text/javascript">
BX.ready(function() {
if (typeof createCustomPropsRaw !== 'function') {
$('.add-custom-row').hide();
}
});
$('.add-custom-row').click(function () {
if (typeof createCustomPropsRaw === 'function') {
createCustomPropsRaw($(this));
}
});
$(document).on('click', '#delete-new-custom-row', function () {
if (typeof deleteCustomPropRow === 'function') {
deleteCustomPropRow($(this));
}
});
$(document).on('click', '#delete-custom-row', function () {
let buttonElem = $(this);
if (typeof addCustomPropToDelete === 'function' && typeof deleteCustomPropRow === 'function') {
addCustomPropToDelete(buttonElem);
deleteCustomPropRow(buttonElem);
}
});
$(document).on('blur', 'input[name="custom-property-title"]', function () {
if (typeof getUniquePropertyCode === 'function' && typeof addCustomPropCodeToSelectAttributes === 'function') {
let inputElem = $(this);
let newPropertyTitle = inputElem.val();
if (!newPropertyTitle) {
return;
}
let newPropertyCode = getUniquePropertyCode(newPropertyTitle);
addCustomPropCodeToSelectAttributes(newPropertyCode, inputElem);
}
});
$('#submit-form').submit(function (formEvent) {
if (typeof setCustomProperties !== "function") {
return;
}
formEvent.preventDefault();
let savePromise = null;
let deletePromise = null;
let formElem = formEvent.currentTarget;
let profileId = $($('input[name="PROFILE_ID"]')).val();
setCustomProperties();
if (Object.keys(customProps).length > 0) {
savePromise = BX.ajax.runAction('intaro:retailcrm.api.customexportprops.save', {
json: {
properties: customProps,
profileId: profileId
},
}).then(addParamsToSetupFieldsList());
}
if (Object.keys(customPropsToDelete).length > 0) {
deletePromise = BX.ajax.runAction('intaro:retailcrm.api.customexportprops.delete', {
json: {
properties: customPropsToDelete,
profileId: profileId
},
}).then(deleteParamsFromSetupFieldsList());
}
const promises = [savePromise, deletePromise].filter(Boolean);
if (promises.length > 0) {
Promise.all(promises)
.finally(() => {
formElem.submit();
});
} else {
formElem.submit();
}
});
const setupFieldsListElement = $('input[name="SETUP_FIELDS_LIST"]');
let customProps = {};
let customPropsToDelete = {};
const setupFieldsParamsToFill = [
'iblockPropertySku_',
'iblockPropertyUnitSku_',
'iblockPropertyProduct_',
'iblockPropertyUnitProduct_',
'highloadblockb_hlsys_marking_code_group_',
'highloadblock_productb_hlsys_marking_code_group_',
'highloadblockeshop_color_reference_',
'highloadblock_producteshop_color_reference_',
'highloadblockeshop_brand_reference_',
'highloadblock_producteshop_brand_reference_'
];
function checkLoadStatus(object)
{
if (object.checked) {

View file

@ -50,6 +50,10 @@ $arJsConfig = [
'js' => '/bitrix/js/intaro/sms.js',
'rel' => [],
],
'intaro_custom_props' => [
'js' => '/bitrix/js/intaro/export/custom-props-export.js',
'rel' => [],
],
];
foreach ($arJsConfig as $ext => $arExt) {

View file

@ -0,0 +1,228 @@
function deleteCustomPropRow(deleteButton)
{
deleteButton.closest('tr').remove();
}
function addCustomPropToDelete(deleteButton)
{
let deletedPropTitle = deleteButton.closest('td').siblings().filter('.custom-property-title').text().trim();
let deletedPropCode = deleteButton.siblings().filter('select').first().data('type');
let customPropCatalogId = deleteButton.closest('.iblockExportTable').data('type');
let values = {
'code': deletedPropCode,
'title': deletedPropTitle,
};
if (customPropsToDelete.hasOwnProperty(customPropCatalogId)) {
customPropsToDelete[customPropCatalogId].push(values);
} else {
customPropsToDelete[customPropCatalogId] = [values];
}
}
function addCustomPropCodeToSelectAttributes(customPropCode, customPropTitleElem)
{
let selectElements = customPropTitleElem.closest('.custom-property-row').find('td select');
let catalogId = customPropTitleElem.closest('.iblockExportTable').data('type');
selectElements.each(function (index, element) {
let selectElem = $(element);
let newSelectIdValue = selectElem.attr('id').match(/^[^_]*_/)[0] + customPropCode + catalogId;
let newSelectNameValue = selectElem.attr('name').match(/^[^_]*_/)[0] + customPropCode + `[${catalogId}]`;
selectElem.attr('id', newSelectIdValue);
selectElem.attr('name', newSelectNameValue);
selectElem.data('type', customPropCode);
triggerSelectChange(selectElem);
});
}
function triggerSelectChange(selectElem)
{
if (selectElem.val().length > 0) {
selectElem.trigger('change', [self]);
}
}
function setCustomProperties()
{
let customPropertiesRows = $('.custom-property-row');
if (customPropertiesRows.length === 0) {
return;
}
let customPropertyCatalogId;
let customPropertyTitle = '';
let customPropertyCode = '';
let productPropertyMatch = '';
let offerPropertyMatch = '';
let catalogIds = [];
customPropertiesRows.each(function (index, propertyRow) {
let propertyRowObj = $(propertyRow);
customPropertyCatalogId = propertyRowObj.closest('.iblockExportTable').data('type');
customPropertyTitle = propertyRowObj.find('input[name="custom-property-title"]').val();
if (!customPropertyTitle) {
return true;
}
customPropertyCode = getUniquePropertyCode(customPropertyTitle);
productPropertyMatch = propertyRowObj.find('select[name=custom-product-property-select]').val();
offerPropertyMatch = propertyRowObj.find('select[name=custom-offer-property-select]').val();
let values = {
'title': customPropertyTitle,
'code': customPropertyCode,
'productProperty': productPropertyMatch,
'offerProperty': offerPropertyMatch
};
if (catalogIds.indexOf(customPropertyCatalogId) === -1) {
customProps[customPropertyCatalogId] = [values];
} else {
customProps[customPropertyCatalogId].push(values);
}
catalogIds.push(customPropertyCatalogId);
});
}
function getUniquePropertyCode(customPropertyTitle)
{
let uniqueValue = transliterate(customPropertyTitle).replace(/ /g, '_');
let counter = 0;
const setupFieldsListValues = setupFieldsListElement.val().split(',');
while (setupFieldsListValues.includes(uniqueValue)) {
uniqueValue = `${customPropertyTitle}${++counter}`;
}
return uniqueValue;
}
function addParamsToSetupFieldsList()
{
let newParams = '';
if (Object.keys(customProps).length === 0) {
return;
}
for (let propertiesByCatalogId of Object.values(customProps)) {
propertiesByCatalogId.forEach(function (values) {
setupFieldsParamsToFill.forEach(function (param) {
newParams += ',' + param + values.code;
});
});
}
let newValue = setupFieldsListElement.val() + newParams;
setupFieldsListElement.val(newValue);
return true;
}
function deleteParamsFromSetupFieldsList()
{
let setupFields = setupFieldsListElement.val();
if (Object.keys(customPropsToDelete).length === 0) {
return;
}
for (let propsByCatalogId of Object.values(customPropsToDelete)) {
propsByCatalogId.forEach(function (propValues) {
setupFieldsParamsToFill.forEach(function (param) {
let paramToDelete = ',' + param + propValues.code;
setupFields = setupFields.replace(paramToDelete, '');
});
});
}
setupFieldsListElement.val(setupFields);
return true;
}
function createCustomPropsRaw(addRowButton)
{
let templateRow = $($('#custom-property-template-row').html());
let templateSelectElements = templateRow.find('select');
let prevTableRow = $(addRowButton).prev('table').find('tbody tr:last-child');
let lastRawSelectElements = prevTableRow.find('td select');
lastRawSelectElements.each(function (index, element) {
let selectElement = $(element);
let templateSelectElement = templateSelectElements[index];
fillTemplateSelect(selectElement, templateSelectElement);
prevTableRow.after(templateRow);
});
}
function fillTemplateSelect(sourceSelectElement, templateSelectElement)
{
let selectOptions = sourceSelectElement.find('option');
selectOptions.each(function (index, element) {
let optionElem = $(element);
let value = $(optionElem).val();
let text = $(optionElem).text();
$('<option>', { value: value, text: text }).appendTo(templateSelectElement);
});
}
function transliterate(titleToTransliterate)
{
const hasCyrillicChars = /[\u0400-\u04FF]/.test(titleToTransliterate);
if (!hasCyrillicChars) {
return titleToTransliterate;
}
translitedText = '';
for (var i = 0; i < titleToTransliterate.length; i++) {
switch (titleToTransliterate[i]) {
case 'а': case 'А': translitedText += 'a'; break;
case 'б': case 'Б': translitedText += 'b'; break;
case 'в': case 'В': translitedText += 'v'; break;
case 'г': case 'Г': translitedText += 'g'; break;
case 'д': case 'Д': translitedText += 'd'; break;
case 'е': case 'Е': translitedText += 'e'; break;
case 'ё': case 'Ё': translitedText += 'yo'; break;
case 'ж': case 'Ж': translitedText += 'zh'; break;
case 'з': case 'З': translitedText += 'z'; break;
case 'и': case 'И': translitedText += 'i'; break;
case 'й': case 'Й': translitedText += 'y'; break;
case 'к': case 'К': translitedText += 'k'; break;
case 'л': case 'Л': translitedText += 'l'; break;
case 'м': case 'М': translitedText += 'm'; break;
case 'н': case 'Н': translitedText += 'n'; break;
case 'о': case 'О': translitedText += 'o'; break;
case 'п': case 'П': translitedText += 'p'; break;
case 'р': case 'Р': translitedText += 'r'; break;
case 'с': case 'С': translitedText += 's'; break;
case 'т': case 'Т': translitedText += 't'; break;
case 'у': case 'У': translitedText += 'u'; break;
case 'ф': case 'Ф': translitedText += 'f'; break;
case 'х': case 'Х': translitedText += 'h'; break;
case 'ц': case 'Ц': translitedText += 'c'; break;
case 'ч': case 'Ч': translitedText += 'ch'; break;
case 'ш': case 'Ш': translitedText += 'sh'; break;
case 'щ': case 'Щ': translitedText += 'sch'; break;
case 'ъ': case 'Ъ': translitedText += ''; break;
case 'ы': case 'Ы': translitedText += 'y'; break;
case 'ь': case 'Ь': translitedText += ''; break;
case 'э': case 'Э': translitedText += 'e'; break;
case 'ю': case 'Ю': translitedText += 'yu'; break;
case 'я': case 'Я': translitedText += 'ya'; break;
default: translitedText += titleToTransliterate[i]; break;
}
}
return translitedText;
}

View file

@ -0,0 +1,2 @@
<?php
$MESS ['USER_PROPERTY_NAME'] = "Name of the custom property block";

View file

@ -0,0 +1,29 @@
<?php
$MESS["main_register_sms"] = "Confirmation code from SMS:";
$MESS["PERSONAL_PHONE"] = "Phone";
$MESS["main_register_sms_send"] = "Send";
$MESS["UF_REG_IN_PL_INTARO"] = "Register in loyalty program";
$MESS["UF_AGREE_PL_INTARO"] = "loyalty programs:";
$MESS["I_AM_AGREE"] = "I agree to the terms and conditions";
$MESS["UF_PD_PROC_PL_INTARO"] = "personal data processing:";
$MESS["LP_CARD_NUMBER"] = "Loyalty program card number";
$MESS["SEND"] = "Send";
$MESS["TRY_AGAIN"] = "Try Again";
$MESS["VERIFICATION_CODE"] = "Confirmation Code";
$MESS["SEND_VERIFICATION_CODE"] = "Send confirmation code";
$MESS["REG_LP_MESSAGE"] = "Enter your phone number and loyalty program card number to complete your loyalty program registration.";
$MESS["YES"] = "Yes";
$MESS["BONUS_CARD_NUMBER"] = "Loyalty card number (if any):";
$MESS["SUCCESS_PL_REG"] = "You have successfully registered in the loyalty program.";
$MESS["LP_FIELDS_NOT_EXIST"] = "PL module installation error. UF fields for USER are missing.";
$MESS["REG_LP_ERROR"] = "Error of registration in the Loyalty Program";
$MESS["REGISTER_CONTINUE"] = "Fill out the form to complete your registration in the loyalty program.";
$MESS["UF_CARD_NUM_INTARO"] = "Loyalty card number (if any)";
$MESS["REGISTER_LP_TITLE"] = "Registration in the loyalty program";
$MESS["NOT_AUTHORIZED"] = "You are not logged in. To register, please follow the <a href=\"./lp-register\">link</a>";
$MESS["LP_NOT_ACTIVE"] = "Loyalty program is not active at the moment";
$MESS["SEC"] = "seconds";
$MESS["RESEND_SMS"] = "Send sms again";
$MESS["RESEND_POSSIBLE"] = "It is possible to resend sms via";
$MESS["LOYALTY_CONNECTION_ERROR"] = "There are problems connecting to the remote server. Try reloading the page.";
$MESS ["NO_VALID_EMAIL"] = "Check that your email is filled in correctly";

View file

@ -26,3 +26,4 @@ $MESS["SEC"] = "сек.";
$MESS["RESEND_SMS"] = "Отправить смс повторно";
$MESS["RESEND_POSSIBLE"] = "Повторная отправка смс возможна через";
$MESS["LOYALTY_CONNECTION_ERROR"] = "Возникли проблемы с подключением к удаленному серверу. Попробуйте перезагрузить страницу.";
$MESS ["NO_VALID_EMAIL"] = "Проверьте правильность заполнения email";

View file

@ -67,7 +67,7 @@ function activateAccount() {
)
if (emailViolation) {
$('#errMsg').text('Проверьте правильность заполнения email')
$('#errMsg').text(BX.message("NO_VALID_EMAIL"));
return;
}

View file

@ -0,0 +1,4 @@
<?php
$MESS ['COMP_MAIN_USER_SCORE_TITLE'] = "Personal cabinet of the RetailCRM loyalty program";
$MESS ['COMP_MAIN_USER_SCORE_DESCR'] = "Personal cabinet of the RetailCRM loyalty program participant";
$MESS ['MAIN_USER_GROUP_NAME'] = "User";

View file

@ -0,0 +1,11 @@
<?php
$MESS ['NOT_AUTHORIZED'] = 'You are not authorized on the site';
$MESS['YES'] = 'Yes';
$MESS['NO'] = 'No';
$MESS['CARD_NOT_LINKED'] = 'Card is not linked';
$MESS['TOP_LEVEL'] = 'you have reached the highest privilege level!';
$MESS['ERRORS'] = 'An error has been detected: ';
$MESS['LP_NOT_ACTUAL'] = 'Your membership ID was not detected in the loyalty program.';
$MESS['LOYALTY_CONNECTION_ERROR'] = 'There was a problem connecting to the remote server. Please reload the page.';
$MESS['MODULE_NOT_INSTALL'] = 'Loyalty program is unavailable. Probably, the module of integration with RetailCRM is not installed';

View file

@ -0,0 +1,2 @@
<?php
$MESS ['USER_PROPERTY_NAME'] = "Name of the custom property block";

View file

@ -0,0 +1,43 @@
<?php
$MESS['main_register_sms'] = 'Confirmation code from SMS:';
$MESS['PERSONAL_PHONE'] = 'Phone';
$MESS['main_register_sms_send'] = 'Send';
$MESS['UF_REG_IN_PL_INTARO'] = 'Register in loyalty program';
$MESS['UF_AGREE_PL_INTARO'] = 'loyalty program:';
$MESS['I_AM_AGREE'] = 'I agree to the terms and conditions';
$MESS['UF_PD_PROC_PL_INTARO'] = 'processing of personal data:';
$MESS['LP_CARD_NUMBER'] = 'Loyalty program card number';
$MESS['SEND'] = 'Send';
$MESS['VERIFICATION_CODE'] = 'Confirmation Code';
$MESS['SEND_VERIFICATION_CODE'] = 'Send Confirmation Code';
$MESS['REG_LP_MESSAGE'] = 'Enter your phone number and loyalty program card number to complete your loyalty program registration';
$MESS['YES'] = 'Yes';
$MESS['BONUS_CARD_NUMBER'] = 'Loyalty card number (if any):';
$MESS['SUCCESS_PL_REG'] = 'You have successfully registered in the loyalty program.';
$MESS['LP_FIELDS_NOT_EXIST'] = 'PL module installation error. UF fields for USER are missing';
$MESS['REG_LP_ERROR'] = 'Error of registration in the Loyalty Program';
$MESS['REGISTER_CONTINUE'] = 'Fill in the form to complete registration in the Loyalty Program.';
$MESS['UF_CARD_NUM_INTARO'] = 'Loyalty card number (if any)';
$MESS['REGISTER_LP_TITLE'] = 'Registration in the loyalty program';
$MESS['LOYALTY_LEVEL_ID'] = 'Participation ID';
$MESS['ACTIVE'] = 'Account Activity';
$MESS['LOYALTY_LEVEL_NAME'] = 'Current level name:';
$MESS['ORDERS_SUM'] = 'All-time purchase amount:';
$MESS['NEXT_LEVEL_SUM'] = 'Amount of purchases required to advance to the next level:';
$MESS['BONUS_COUNT'] = 'Bonuses on account:';
$MESS['CARD'] = 'Bonus card number:';
$MESS['PHONE'] = 'Phone number assigned:';
$MESS['REGISTER_DATE'] = 'Registration date:';
$MESS['LOYALTY_LEVEL_TYPE'] = 'Current level rules:';
$MESS['BONUS_PERCENT'] = 'Cashback from value';
$MESS['BONUS_CONVERTING'] = '1 bonus is awarded for every';
$MESS['PERSONAL_DISCOUNT'] = 'personalized discount';
$MESS['EACH_RUB'] = 'purchase rubles';
$MESS['SIMPLE_PRODUCTS'] = 'Common items:';
$MESS['SALE_PRODUCTS'] = 'Promotional items:';
$MESS['REMAINING_SUM'] = 'Amount remaining before moving to the next level:';
$MESS['ACTIVATE'] = 'Activate';
$MESS['STATUS'] = 'Participation Status';
$MESS['STATUS_NOT_CONFIRMED'] = 'not confirmed';
$MESS['STATUS_DEACTIVATED'] = 'deactivated';
$MESS['STATUS_ACTIVE'] = 'active';

View file

@ -0,0 +1,3 @@
<?
$MESS ['USER_PROPERTY_NAME'] = "Name of the custom property block";
?>

View file

@ -0,0 +1,3 @@
<?php
$MESS ['INTARO_NOT_INSTALLED'] = "Integration module with RetailCRM is not installed";

View file

@ -0,0 +1,85 @@
<?php
$MESS["AUTH_REGISTER"] = "Registration";
$MESS["REGISTER_CAPTCHA_TITLE"] = "Protection against automatic registration";
$MESS["REGISTER_CAPTCHA_PROMT"] = "Enter the word in the picture";
$MESS["AUTH_REQ"] = "Required fields.";
$MESS["USER_DONT_KNOW"] = "(unknown)";
$MESS["USER_MALE"] = "Male";
$MESS["USER_FEMALE"] = "Female";
$MESS["REGISTER_FIELD_LOGIN"] = "Login (min. 3 characters)";
$MESS["REGISTER_FIELD_EMAIL"] = "Email";
$MESS["REGISTER_FIELD_PASSWORD"] = "Password";
$MESS["REGISTER_FIELD_CONFIRM_PASSWORD"] = "Confirm Password";
$MESS["REGISTER_FIELD_TITLE"] = "Address";
$MESS["REGISTER_FIELD_NAME"] = "Name";
$MESS["REGISTER_FIELD_SECOND_NAME"] = "Patronymic";
$MESS["REGISTER_FIELD_LAST_NAME"] = "Last Name";
$MESS["REGISTER_FIELD_AUTO_TIME_ZONE"] = "Time Zone";
$MESS["REGISTER_FIELD_PERSONAL_PROFESSION"] = "Profession";
$MESS["REGISTER_FIELD_PERSONAL_WWW"] = "WWW page";
$MESS["REGISTER_FIELD_PERSONAL_ICQ"] = "ICQ";
$MESS["REGISTER_FIELD_PERSONAL_GENDER"] = "gender";
$MESS["REGISTER_FIELD_PERSONAL_BIRTHDAY"] = "Date of birth";
$MESS["REGISTER_FIELD_PERSONAL_PHOTO"] = "Photo";
$MESS["REGISTER_FIELD_PERSONAL_PHONE"] = "Phone";
$MESS["PERSONAL_PHONE"] = "Phone";
$MESS["REGISTER_FIELD_PERSONAL_FAX"] = "Fax";
$MESS["REGISTER_FIELD_PERSONAL_MOBILE"] = "Mobile";
$MESS["REGISTER_FIELD_PERSONAL_PAGER"] = "Pager";
$MESS["REGISTER_FIELD_PERSONAL_STREET"] = "Street, house";
$MESS["REGISTER_FIELD_PERSONAL_MAILBOX"] = "Mailbox";
$MESS["REGISTER_FIELD_PERSONAL_CITY"] = "City";
$MESS["REGISTER_FIELD_PERSONAL_STATE"] = "Region / Province";
$MESS["REGISTER_FIELD_PERSONAL_ZIP"] = "Zip Code";
$MESS["REGISTER_FIELD_PERSONAL_COUNTRY"] = "Country";
$MESS["REGISTER_FIELD_PERSONAL_NOTES"] = "Additional Notes";
$MESS["REGISTER_FIELD_WORK_COMPANY"] = "Company Name";
$MESS["REGISTER_FIELD_WORK_DEPARTMENT"] = "Department / Division";
$MESS["REGISTER_FIELD_WORK_POSITION"] = "Position";
$MESS["REGISTER_FIELD_WORK_WWW"] = "WWW page (job)";
$MESS["REGISTER_FIELD_WORK_PHONE"] = "Phone (job)";
$MESS["REGISTER_FIELD_WORK_FAX"] = "Fax (job)";
$MESS["REGISTER_FIELD_WORK_PAGER"] = "Pager (job)";
$MESS["REGISTER_FIELD_WORK_STREET"] = "Street, house (job)";
$MESS["REGISTER_FIELD_WORK_MAILBOX"] = "Mailbox (job)";
$MESS["REGISTER_FIELD_WORK_CITY"] = "City (job)";
$MESS["REGISTER_FIELD_WORK_STATE"] = "Region / Region (job)";
$MESS["REGISTER_FIELD_WORK_ZIP"] = "Postal code (job)";
$MESS["REGISTER_FIELD_WORK_COUNTRY"] = "Country (job)";
$MESS["REGISTER_FIELD_WORK_PROFILE"] = "Line of Business";
$MESS["REGISTER_FIELD_WORK_LOGO"] = "Company Logo";
$MESS["REGISTER_FIELD_WORK_NOTES"] = "Additional notes (job)";
$MESS["REGISTER_FIELD_PHONE_NUMBER"] = "Phone Number";
$MESS["REGISTER_EMAIL_WILL_BE_SENT"] = "A registration confirmation request will be sent to the email specified in the form.";
$MESS["MAIN_REGISTER_AUTH"] = "You are registered on the site and successfully authorized.";
$MESS["main_profile_time_zones_auto"] = "Automatically detect the time zone:";
$MESS["main_profile_time_zones_auto_def"] = "(default)";
$MESS["main_profile_time_zones_auto_yes"] = "Yes, detect by browser.";
$MESS["main_profile_time_zones_auto_no"] = "No, select from list";
$MESS["main_profile_time_zones_zones"] = "Time zone:";
$MESS["AUTH_SECURE_NOTE"] = "Before submitting the form, the password will be encrypted in the browser. This will prevent the password from being transmitted in the clear.";
$MESS["AUTH_NONSECURE_NOTE"] = "The password will be sent in plaintext. Enable JavaScript in your browser to encrypt the password before sending it.";
$MESS["main_register_sms"] = "Confirmation code from SMS:";
$MESS["main_register_sms_send"] = "Send";
$MESS["UF_REG_IN_PL_INTARO"] = "Register in loyalty program.";
$MESS["UF_AGREE_PL_INTARO"] = "loyalty programs:";
$MESS["I_AM_AGREE"] = "I agree to the terms and conditions";
$MESS["UF_PD_PROC_PL_INTARO"] = "personal data processing:";
$MESS["LP_CARD_NUMBER"] = "Loyalty program card number";
$MESS["SEND"] = "Send";
$MESS["VERIFICATION_CODE"] = "Confirmation Code";
$MESS["SEND_VERIFICATION_CODE"] = "Send confirmation code";
$MESS["REG_LP_MESSAGE"] = "Enter your phone number and loyalty program card number to complete your loyalty program registration.";
$MESS["YES"] = "Yes";
$MESS["BONUS_CARD_NUMBER"] = "Loyalty card number (if any):";
$MESS["SUCCESS_PL_REG"] = "You have successfully registered in the loyalty program.";
$MESS["LP_FIELDS_NOT_EXIST"] = "Ошибка установки модуля ПЛ. Отсутствуют UF поля для USER";
$MESS["REG_LP_ERROR"] = "Ошибка регистрации в Программе лояльности";
$MESS["REGISTER_CONTINUE"] = "Для завершения регистрации в программе лояльности заполните форму.";
$MESS["UF_CARD_NUM_INTARO"] = "Loyalty card number (if any).";
$MESS["SEC"] = "sec.";
$MESS["RESEND_SMS"] = "Resend SMS";
$MESS["RESEND_POSSIBLE"] = "It is possible to resend sms in";
$MESS["LOYALTY_CONNECTION_ERROR"] = "There are problems with connection to the remote server. Try reloading the page.";
$MESS['SUBSCRIBE_EMAIL'] = "I agree to receive promotional and informational emails.";
$MESS['NO_VALID_EMAIL'] = "Check if your email is filled in correctly";

View file

@ -82,3 +82,4 @@ $MESS["RESEND_SMS"] = "Отправить смс повторно";
$MESS["RESEND_POSSIBLE"] = "Повторная отправка смс возможна через";
$MESS["LOYALTY_CONNECTION_ERROR"] = "Возникли проблемы с подключением к удаленному серверу. Попробуйте перезагрузить страницу.";
$MESS["SUBSCRIBE_EMAIL"] = "Согласен на рекламно-информационные рассылки";
$MESS['NO_VALID_EMAIL'] = "Проверьте правильность заполнения email";

View file

@ -55,7 +55,7 @@ function activateAccount() {
)
if (emailViolation) {
$('#errMsg').text('Проверьте правильность заполнения email')
$('#errMsg').text(BX.message("NO_VALID_EMAIL"));
return;
}

View file

@ -0,0 +1,8 @@
<?php
$MESS['COUNT_FOR_WRITE_OFF'] = 'How many bonuses to spend?';
$MESS['VALIDATE_BONUS_ERROR'] = 'Invalid value entered';
$MESS['DATA_PROCESSING'] = 'Information processing';
$MESS['YOU_CANT_SPEND_MORE'] = 'You cant spend more ';
$MESS['BONUSES'] = 'bonuses';
$MESS ['INTARO_NOT_INSTALLED'] = "Integration module with RetailCRM is not installed";

View file

@ -1,138 +1,158 @@
<?
$MESS["ADDITIONAL_PROPS_DEFAULT"] = "Additional properties";
$MESS["ADD_DEFAULT"] = "Add";
$MESS["AUTH_BLOCK_NAME_DEFAULT"] = "Log in";
$MESS["AUTH_REFERENCE_1_DEFAULT"] = "Fields marked with \"*\" are required.";
$MESS["AUTH_REFERENCE_2_DEFAULT"] = "You will receive the notification message upon completing the registration.";
$MESS["AUTH_REFERENCE_3_DEFAULT"] = "Your personal information acquired upon registration, placing of an order, or by any other means will never be rented, sold or transferred to third parties unless required by legal authorities or court decision..";
$MESS["BACK_DEFAULT"] = "Back";
$MESS["BASKET_BLOCK_NAME_DEFAULT"] = "Shopping cart";
$MESS["BUYER_BLOCK_NAME_DEFAULT"] = "Customer";
$MESS["CAPTCHA_REGF_PROMT"] = "Type the characters you see on the picture";
$MESS["CAPTCHA_REGF_TITLE"] = "CAPTCHA";
$MESS["COUPON_DEFAULT"] = "Coupon";
$MESS["DELIVERY_BLOCK_NAME_DEFAULT"] = "Delivery";
$MESS["DELIVERY_CALC_ERROR_TEXT_DEFAULT"] = "Continue checkout. Our sales representative will contact you with delivery details.";
$MESS["DELIVERY_CALC_ERROR_TITLE_DEFAULT"] = "Cannot calculate delivery price.";
$MESS["ECONOMY_DEFAULT"] = "Save";
$MESS["EDIT_DEFAULT"] = "change";
$MESS["EMPTY_BASKET_HINT"] = "#A1#Click here#A2# to continue shopping";
$MESS["EMPTY_BASKET_TITLE"] = "Your cart is empty";
$MESS["FAIL_PRELOAD_TEXT_DEFAULT"] = "You previously shopped with us and we remember you, so we have taken the liberty to fill in the fields for you.<br />
Check the order information thoroughly and edit your order if required. Once you see everything is good, click \"#ORDER_BUTTON#\".
";
$MESS["FURTHER_DEFAULT"] = "Next";
$MESS["INNER_PS_BALANCE_DEFAULT"] = "Your balance:";
$MESS["NAV_BACK_DEFAULT"] = "Back";
$MESS["NAV_FORWARD_DEFAULT"] = "Next";
$MESS["NEAREST_PICKUP_LIST_DEFAULT"] = "Nearest locations:";
$MESS["ORDER_DEFAULT"] = "Checkout";
$MESS["ORDER_DESC_DEFAULT"] = "Order comments:";
$MESS["PAYMENT_BLOCK_NAME_DEFAULT"] = "Payment";
$MESS["PAY_SYSTEM_PAYABLE_ERROR_DEFAULT"] = "You'll be able to pay for the order after we verify that the items you have ordered are in stock. Once your order is fulfilled, you'll receive an email with payment instructions. You'll be able to complete the purchase inside your customer account.";
$MESS["PERIOD_DEFAULT"] = "Delivery time";
$MESS["PERSON_TYPE_DEFAULT"] = "Payer type";
$MESS["PICKUP_LIST_DEFAULT"] = "Pick-up locations:";
$MESS["PRICE_DEFAULT"] = "Price";
$MESS["PRICE_FREE_DEFAULT"] = "free";
$MESS["REGION_BLOCK_NAME_DEFAULT"] = "Delivery area";
$MESS["REGION_REFERENCE_DEFAULT"] = "Select your city from the list. If you cannot find your city, select \"other location\" and enter your city in the \"City\" field.";
$MESS["REGISTRATION_REFERENCE_DEFAULT"] = "Please register for better shopping experience and to keep your order history.";
$MESS["REG_BLOCK_NAME_DEFAULT"] = "Register";
$MESS["SALE_SADC_TRANSIT"] = "Delivery time";
$MESS["SELECT_FILE_DEFAULT"] = "Select";
$MESS["SELECT_PICKUP_DEFAULT"] = "Select";
$MESS["SELECT_PROFILE_DEFAULT"] = "Select profile";
$MESS["SOA_BAD_EXTENSION"] = "Invalid file type";
$MESS["SOA_DELIVERY"] = "Delivery service";
$MESS["SOA_DELIVERY_SELECT_ERROR"] = "Delivery service not selected";
$MESS["SOA_DISTANCE_KM"] = "km";
$MESS["SOA_DO_SOC_SERV"] = "Social login";
$MESS["SOA_ERROR_ORDER"] = "Error creating the order.";
$MESS["SOA_ERROR_ORDER_LOST"] = "Order no. #ORDER_ID# cannot be found.";
$MESS["SOA_ERROR_ORDER_LOST1"] = "Please contact the store administration or try again.";
$MESS["SOA_FIELD"] = "Field";
$MESS["SOA_INVALID_EMAIL"] = "E-mail is incorrect";
$MESS["SOA_INVALID_PATTERN"] = "does not match the pattern";
$MESS["SOA_LESS"] = "at least";
$MESS["SOA_LOCATION_NOT_FOUND"] = "Location was not found";
$MESS["SOA_LOCATION_NOT_FOUND_PROMPT"] = "Click #ANCHOR#add location#ANCHOR_END# so we know where you want to have your order shipped to";
$MESS["SOA_MAP_COORDS"] = "Map coordinates";
$MESS["SOA_MAX_LENGTH"] = "Max. field length";
$MESS["SOA_MAX_SIZE"] = "Max. file size exceeded";
$MESS["SOA_MAX_VALUE"] = "Max. field value";
$MESS["SOA_MIN_LENGTH"] = "Min. field length";
$MESS["SOA_MIN_VALUE"] = "Min. field value";
$MESS["SOA_MORE"] = "less than";
$MESS["SOA_NO"] = "no";
$MESS["SOA_NOT_CALCULATED"] = "not calculated";
$MESS["SOA_NOT_FOUND"] = "Not found";
$MESS["SOA_NOT_NUMERIC"] = "numbers only";
$MESS["SOA_NOT_SELECTED"] = "not selected";
$MESS["SOA_NOT_SELECTED_ALT"] = "Make location more specific if required";
$MESS["SOA_NOT_SPECIFIED"] = "not specified";
$MESS["SOA_NO_JS"] = "The ordering process requires that JavaScript is enabled on your system. JavaScript is disabled or not supported by your browser. Please change the browser settings and <a href=\"\">try again</a>.";
$MESS["SOA_NUM_STEP"] = "doesn't match";
$MESS["SOA_ORDER_COMPLETE"] = "Order has been completed";
$MESS["SOA_ORDER_PROPS"] = "Order properties";
$MESS["SOA_ORDER_PS_ERROR"] = "The selected payment method failed. Please contact the site administrator or select another method.";
$MESS["SOA_ORDER_SUC"] = "Your order <b>##ORDER_ID#</b> of #ORDER_DATE# has been created successfully.";
$MESS["SOA_ORDER_SUC1"] = "You can track your order in your <a href=\"#LINK#\">personal account</a>. You will be asked to enter your login and password to access your account.";
$MESS["SOA_OTHER_LOCATION"] = "Other location";
$MESS["SOA_PAY"] = "Order payment";
$MESS["SOA_PAYMENT_SUC"] = "Payment <b>##PAYMENT_ID#</b>";
$MESS["SOA_PAYSYSTEM_PRICE"] = "Extra COD:";
$MESS["SOA_PAY_ACCOUNT3"] = "You have sufficient credit to pay the order in full.";
$MESS["SOA_PAY_LINK"] = "If you don't see any payment information, click here: <a href=\"#LINK#\" target=\"_blank\">Pay and place order</a>.";
$MESS["SOA_PAY_PDF"] = "Click <a href=\"#LINK#\" target=\"_blank\">Download invoice</a> to get the invoice in PDF format.";
$MESS["SOA_PAY_SYSTEM"] = "Payment system";
$MESS["SOA_PICKUP_ADDRESS"] = "Address";
$MESS["SOA_PICKUP_DESC"] = "Description";
$MESS["SOA_PICKUP_EMAIL"] = "E-Mail";
$MESS["SOA_PICKUP_PHONE"] = "Phone";
$MESS["SOA_PICKUP_STORE"] = "Warehouse";
$MESS["SOA_PICKUP_WORK"] = "Business hours";
$MESS["SOA_PROP_NEW_PROFILE"] = "New profile";
$MESS["SOA_PS_SELECT_ERROR"] = "Payment system not selected";
$MESS["SOA_REQUIRED"] = "this field is required";
$MESS["SOA_SUM_DELIVERY"] = "Delivery:";
$MESS["SOA_SUM_DISCOUNT"] = "Discount";
$MESS["SOA_SUM_IT"] = "Total:";
$MESS["SOA_SUM_LEFT_TO_PAY"] = "Amount payable:";
$MESS["SOA_SUM_NAME"] = "Name";
$MESS["SOA_SUM_PAYED"] = "Paid:";
$MESS["SOA_SUM_PRICE"] = "Price";
$MESS["SOA_SUM_QUANTITY"] = "Quantity";
$MESS["SOA_SUM_SUMMARY"] = "Total price:";
$MESS["SOA_SUM_VAT"] = "Tax:";
$MESS["SOA_SUM_WEIGHT"] = "Weight";
$MESS["SOA_SUM_WEIGHT_SUM"] = "Total weight:";
$MESS["SOA_SYMBOLS"] = "symbols";
$MESS["SOA_YES"] = "yes";
$MESS["STOF_AUTH_REQUEST"] = "Please log in.";
$MESS["STOF_DO_AUTHORIZE"] = "Log in";
$MESS["STOF_DO_REGISTER"] = "Register";
$MESS["STOF_EMAIL"] = "E-mail";
$MESS["STOF_ENTER"] = "Log in";
$MESS["STOF_FORGET_PASSWORD"] = "Forgot your password?";
$MESS["STOF_LASTNAME"] = "Last name";
$MESS["SOA_NO"] = "no";
$MESS["SOA_DO_SOC_SERV"] = "Sign in with social media";
$MESS["SOA_NOT_FOUND"] = "Not Found";
$MESS["SOA_NOT_SPECIFIED"] = "not specified";
$MESS["SOA_NOT_SELECTED"] = "not selected";
$MESS["SOA_NOT_CALCULATED"] = "not calculated";
$MESS["SOA_PS_SELECT_ERROR"] = "Payment system not selected";
$MESS["SOA_DELIVERY_SELECT_ERROR"] = "Delivery service not selected";
$MESS["SOA_PICKUP_PHONE"] = "Phone";
$MESS["SOA_PICKUP_ADDRESS"] = "Address";
$MESS["SOA_PICKUP_WORK"] = "Work Mode";
$MESS["SOA_PICKUP_STORE"] = "Warehouse";
$MESS["SOA_PICKUP_EMAIL"] = "Email";
$MESS["SOA_PICKUP_DESC"] = "Description";
$MESS["SOA_MAP_COORDS"] = "Map coordinates";
$MESS["SOA_DISTANCE_KM"] = "km";
$MESS["SOA_ORDER_PROPS"] = "Order Properties";
$MESS["SOA_FIELD"] = "Field";
$MESS["SOA_REQUIRED"] = "required";
$MESS["SOA_INVALID_EMAIL"] = "Invalid e-mail entered";
$MESS["SOA_MIN_LENGTH"] = "Minimum field length";
$MESS["SOA_MAX_LENGTH"] = "Maximum field length";
$MESS["SOA_NOT_NUMERIC"] = "must be numeric";
$MESS["SOA_MIN_VALUE"] = "Minimum field value";
$MESS["SOA_MAX_VALUE"] = "Maximum field value";
$MESS["SOA_NUM_STEP"] = "does not match the step";
$MESS["SOA_LESS"] = "not less than";
$MESS["SOA_MORE"] = "not more than";
$MESS["SOA_SYMBOLS"] = "characters";
$MESS["SOA_INVALID_PATTERN"] = "does not match the template";
$MESS["SOA_PROP_NEW_PROFILE"] = "New Profile";
$MESS["SOA_PAY_SYSTEM"] = "Payment System";
$MESS["SOA_PAY_ACCOUNT3"] = "Funds are sufficient for full payment of the order.";
$MESS["SOA_DELIVERY"] = "Delivery service";
$MESS["SOA_ORDER_SUC"] = "Your order <b>№#ORDER_ID#</b> from #ORDER_DATE# has been successfully created.";
$MESS["SOA_PAYMENT_SUC"] = "Your payment number: <b>№#PAYMENT_ID#</b>";
$MESS["SOA_ORDER_SUC1"] = "You can follow the fulfillment of your order in <a href=\"#LINK#\">personalized section of the site</a>. Please note that you will need to enter your site user login and password to access this section.";
$MESS["SOA_PAY"] = "Order payment";
$MESS["SOA_PAY_LINK"] = "If the payment information window does not open automatically, click on the link <a href=\"#LINK#\" target=\"_blank\">Pay order</a>.";
$MESS["SOA_PAY_PDF"] = "To download the invoice in pdf format, click on the link <a href=\"#LINK#\" target=\"_blank\">Download Invoice</a>.";
$MESS["SOA_ERROR_ORDER"] = "Order formation error";
$MESS["SOA_ERROR_ORDER_LOST"] = "Order №#ORDER_ID# not found.";
$MESS["SOA_ERROR_ORDER_LOST1"] = "Please contact the administration of the online store or try to place your order again.";
$MESS["SOA_SUM_NAME"] = "Name";
$MESS["SOA_SUM_DISCOUNT"] = "Discount";
$MESS["SOA_SUM_WEIGHT"] = "Weight";
$MESS["SOA_SUM_QUANTITY"] = "Quantity";
$MESS["SOA_SUM_PRICE"] = "Price";
$MESS["SOA_SUM_WEIGHT_SUM"] = "Total weight:";
$MESS["SOA_SUM_SUMMARY"] = "Items per:";
$MESS["SOA_SUM_VAT"] = "VAT:";
$MESS["SOA_SUM_DELIVERY"] = "Shipping:";
$MESS["SOA_SUM_IT"] = "Total:";
$MESS["SOA_SUM_PAYED"] = "Paid:";
$MESS["SOA_SUM_LEFT_TO_PAY"] = "Remaining to be paid:";
$MESS["SOA_ORDER_COMPLETE"] = "Order formed.";
$MESS["CAPTCHA_REGF_TITLE"] = "Automatic Registration Protection";
$MESS["CAPTCHA_REGF_PROMT"] = "Enter the word in the picture";
$MESS["STOF_LOGIN"] = "Login";
$MESS["STOF_MY_PASSWORD"] = "Your login and password";
$MESS["STOF_NAME"] = "First name";
$MESS["STOF_NEXT_STEP"] = "Continue checkout";
$MESS["STOF_PASSWORD"] = "Password";
$MESS["STOF_PHONE"] = "Phone number";
$MESS["STOF_REMEMBER"] = "Remember me";
$MESS["STOF_ENTER"] = "Login";
$MESS["STOF_REGISTER"] = "Register";
$MESS["STOF_REG_HINT"] = "Please register for better shopping experience and to keep your order history.";
$MESS["STOF_REG_REQUEST"] = "Please register.";
$MESS["STOF_REG_SMS_REQUEST"] = "A confirmation code has been sent to your phone";
$MESS["STOF_REMEMBER"] = "Remember Me";
$MESS["STOF_RE_PASSWORD"] = "Repeat password";
$MESS["STOF_DO_AUTHORIZE"] = "Authorize";
$MESS["STOF_DO_REGISTER"] = "Register";
$MESS["STOF_AUTH_REQUEST"] = "Please Authorize";
$MESS["STOF_REG_REQUEST"] = "Please register";
$MESS["STOF_PHONE"] = "Phone number";
$MESS["STOF_REG_SMS_REQUEST"] = "An SMS with a confirmation code was sent to your number";
$MESS["STOF_SMS_CODE"] = "Confirmation code from SMS";
$MESS["STOF_SEND"] = "Send";
$MESS["STOF_SMS_CODE"] = "SMS confirmation code";
$MESS["STOF_REG_HINT"] = "If this is your first time on the site and you want us to remember you and keep all your orders,
please fill out the registration form.";
$MESS["STOF_FORGET_PASSWORD"] = "Forgot your password?";
$MESS["STOF_NEXT_STEP"] = "Continue Checkout";
$MESS["STOF_NAME"] = "First Name";
$MESS["STOF_LASTNAME"] = "Last Name";
$MESS["STOF_EMAIL"] = "E-mail";
$MESS["STOF_MY_PASSWORD"] = "Set login and password";
$MESS["STOF_RE_PASSWORD"] = "Repeat password";
$MESS["STOF_SYS_PASSWORD"] = "Generate login and password";
$MESS["SUCCESS_PRELOAD_TEXT_DEFAULT"] = "You previously shopped with us and we remember you, so we have taken the liberty to fill in the fields for you.<br />
If the information is correct, click \"#ORDER_BUTTON#\".
$MESS["SALE_SADC_TRANSIT"] = "Delivery time";
$MESS["SOA_NO_JS"] = "JavaScript must be enabled to place an order. It appears that JavaScript is either not supported by your browser or is disabled. Change your browser settings and then <a href=\"\">try again</a>.";
$MESS["SOA_PAYSYSTEM_PRICE"] = "Optional cash on delivery:";
$MESS["SOA_OTHER_LOCATION"] = "Other Location";
$MESS["SOA_LOCATION_NOT_FOUND"] = "Location not found";
$MESS["SOA_LOCATION_NOT_FOUND_PROMPT"] = "#ANCHOR#Select a location from the list#ANCHOR_END#, to let us know where to deliver your order.";
$MESS["SOA_NOT_SELECTED_ALT"] = "If you need to specify the location";
$MESS["SOA_ORDER_PS_ERROR"] = "Error of selected payment method. Please contact Site Administration or select another payment method.";
$MESS["AUTH_BLOCK_NAME_DEFAULT"] = "Authorization";
$MESS["REG_BLOCK_NAME_DEFAULT"] = "Registration";
$MESS["BASKET_BLOCK_NAME_DEFAULT"] = "Items in the order";
$MESS["REGION_BLOCK_NAME_DEFAULT"] = "Delivery Region";
$MESS["PAYMENT_BLOCK_NAME_DEFAULT"] = "Payment";
$MESS["DELIVERY_BLOCK_NAME_DEFAULT"] = "Delivery";
$MESS["BUYER_BLOCK_NAME_DEFAULT"] = "Buyer";
$MESS["BACK_DEFAULT"] = "Back";
$MESS["FURTHER_DEFAULT"] = "Next";
$MESS["EDIT_DEFAULT"] = "change";
$MESS["ORDER_DEFAULT"] = "Checkout";
$MESS["ADD_DEFAULT"] = "Add";
$MESS["PRICE_DEFAULT"] = "Price";
$MESS["PERIOD_DEFAULT"] = "Delivery time";
$MESS["NAV_BACK_DEFAULT"] = "Back";
$MESS["NAV_FORWARD_DEFAULT"] = "Forward";
$MESS["PRICE_FREE_DEFAULT"] = "free";
$MESS["ECONOMY_DEFAULT"] = "Economy";
$MESS["REGISTRATION_REFERENCE_DEFAULT"] = "If this is your first time on the site and you want us to remember you and keep all your orders, please fill out the registration form.";
$MESS["AUTH_REFERENCE_1_DEFAULT"] = "Required fields are marked with an \"asterisk\" (*).";
$MESS["AUTH_REFERENCE_2_DEFAULT"] = "After registration, you will receive an informational letter.";
$MESS["AUTH_REFERENCE_3_DEFAULT"] = "Personal information, received by the online store during registration or otherwise, will not be transferred to third organizations and persons without the permission of users, except in situations where required by law or court order.";
$MESS["ADDITIONAL_PROPS_DEFAULT"] = "Additional properties.";
$MESS["USE_COUPON_DEFAULT"] = "Apply Coupon";
$MESS["COUPON_DEFAULT"] = "Coupon";
$MESS["PERSON_TYPE_DEFAULT"] = "Payer Type";
$MESS["SELECT_PROFILE_DEFAULT"] = "Select a profile";
$MESS["REGION_REFERENCE_DEFAULT"] = 'Select your city from the list. If you dont find your city, select \"other location\", and put the city in the field \"City\"';
$MESS["PICKUP_LIST_DEFAULT"] = "Pickup locations:";
$MESS["NEAREST_PICKUP_LIST_DEFAULT"] = "Nearest locations:";
$MESS["SELECT_PICKUP_DEFAULT"] = "Select";
$MESS["INNER_PS_BALANCE_DEFAULT"] = "In your user account:";
$MESS["ORDER_DESC_DEFAULT"] = "Order Comments:";
$MESS["SELECT_FILE_DEFAULT"] = "Select";
$MESS["SUCCESS_PRELOAD_TEXT_DEFAULT"] = "You ordered from our online store, so we filled in all the data automatically.<br />
If everything is filled in correctly, press the button \"#ORDER_BUTTON#\".
";
$MESS["USE_COUPON_DEFAULT"] = "Apply coupon";
?>
$MESS["FAIL_PRELOAD_TEXT_DEFAULT"] = "You ordered from our online store, so we filled in all the data automatically.<br />
Pay attention to the detailed block with information about the order. Here you can make the necessary changes or
leave it as it is and click the button \"#ORDER_BUTTON#\".
";
$MESS["DELIVERY_CALC_ERROR_TITLE_DEFAULT"] = "Failed to calculate the shipping cost.";
$MESS["DELIVERY_CALC_ERROR_TEXT_DEFAULT"] = "You can continue placing your order, and later the store manager will contact you and clarify the delivery information.";
$MESS["EMPTY_BASKET_TITLE"] = "Your cart is empty";
$MESS["EMPTY_BASKET_HINT"] = "#A1#Click here#A2#, to continue shopping";
$MESS["SOA_BAD_EXTENSION"] = "Invalid file type";
$MESS["SOA_MAX_SIZE"] = "Maximum file size exceeded";
$MESS["PAY_SYSTEM_PAYABLE_ERROR_DEFAULT"] = "You will be able to pay for your order after the manager checks the availability of a full set of goods in stock. Immediately after checking you will receive an email with payment instructions. You will be able to pay for the order in the personal section of the site.";
$MESS["BONUS_PAYMENT"] = 'Pay with bonuses';
$MESS["HOW_MANY_BONUSES_TO_SPEND"] = 'How many bonuses to spend?';
$MESS["BONUS_TOTAL"] = 'Total bonuses:';
$MESS["YOU_CAN_SPEND"] = 'You can spend:';
$MESS["CHARGE_RATE"] = "Bonus rate: 1 bonus = %s %s";
$MESS["RUB"] = "rub.";
$MESS["CALCULATION_ERROR"] = 'Failed to calculate the number of available bonuses.';
$MESS["CONFIRM_MESSAGE"] = 'To complete the bonus debiting procedure, enter your verification code';
$MESS["SEND"] = 'Send';
$MESS["RESEND_POSSIBLE"] = "It is possible to resend sms through";
$MESS["RESEND_SMS"] = "Send sms again";
$MESS["BONUS_SUCCESS"] = "Bonuses have been successfully debited";
$MESS["BONUS_ERROR"] = "Error of bonus debiting";
$MESS["LOYALTY_CONNECTION_ERROR"] = "There were problems with connection to the remote server.
Loyalty program discounts were not applied. Try reloading the page.";
$MESS["PAYMENT_IN_BONUSES"] = 'Payment with bonuses:';
$MESS["PERSONAL_DISCOUNT"] = 'Personal discount: ';
$MESS["COMMON_DISCOUNT"] = 'Regular discount: ';
$MESS["WILL_CREDITED_BONUSES"] = 'Bonuses to be credited: ';

View file

@ -152,4 +152,7 @@ $MESS["BONUS_SUCCESS"] = "Бонусы успешно списаны";
$MESS["BONUS_ERROR"] = "Ошибка списания бонусов";
$MESS["LOYALTY_CONNECTION_ERROR"] = "Возникли проблемы с подключением к удаленному серверу.
Скидки программы лояльности не были применены. Попробуйте перезагрузить страницу.";
$MESS["PAYMENT_IN_BONUSES"] = 'Оплата бонусами:';
$MESS["PERSONAL_DISCOUNT"] = 'Персональная скидка: ';
$MESS["COMMON_DISCOUNT"] = 'Обычная скидка: ';
$MESS["WILL_CREDITED_BONUSES"] = "Будет начислено бонусов: ";

View file

@ -8324,25 +8324,25 @@ BX.namespace('BX.Sale.OrderAjaxComponent');
if (this.loyaltyDiscount !== undefined && this.loyaltyDiscount > 0) {
let loyaltyDiscount = this.bonusCurrency
.replace('#', this.loyaltyDiscount.toString());
this.totalInfoBlockNode.appendChild(this.createTotalUnit("Персональная скидка: ", loyaltyDiscount));
this.totalInfoBlockNode.appendChild(this.createTotalUnit(BX.message("PERSONAL_DISCOUNT"), loyaltyDiscount));
}
if (this.bitrixDiscount !== undefined && this.bitrixDiscount > 0) {
let defaultDiscount = this.bonusCurrency
.replace('#', this.bitrixDiscount.toString());
this.totalInfoBlockNode.appendChild(this.createTotalUnit("Обычная скидка: ", defaultDiscount));
this.totalInfoBlockNode.appendChild(this.createTotalUnit(BX.message("COMMON_DISCOUNT"), defaultDiscount));
}
if (this.result.TOTAL.BONUS_PAYMENT !== undefined && this.result.TOTAL.BONUS_PAYMENT > 0) {
let bonusPayment = this.bonusCurrency
.replace('#', this.result.TOTAL.BONUS_PAYMENT.toString());
this.totalInfoBlockNode.appendChild(this.createTotalUnit('Оплата бонусами:', bonusPayment));
this.totalInfoBlockNode.appendChild(this.createTotalUnit(BX.message("PAYMENT_IN_BONUSES"), bonusPayment));
}
if (this.result.TOTAL.WILL_BE_CREDITED !== undefined && this.result.TOTAL.WILL_BE_CREDITED > 0) {
this.totalInfoBlockNode.appendChild(this.createTotalUnit('Будет начислено бонусов: ', String(this.result.TOTAL.WILL_BE_CREDITED), {highlighted: true}));
this.totalInfoBlockNode.appendChild(this.createTotalUnit(BX.message("WILL_CREDITED_BONUSES"), String(this.result.TOTAL.WILL_BE_CREDITED), {highlighted: true}));
} else if (this.willBeCredited > 0) {
this.totalInfoBlockNode.appendChild(this.createTotalUnit('Будет начислено бонусов:', this.willBeCredited, {highlighted: true}));
this.totalInfoBlockNode.appendChild(this.createTotalUnit(BX.message("WILL_CREDITED_BONUSES"), this.willBeCredited, {highlighted: true}));
}
}
@ -8386,4 +8386,4 @@ BX.namespace('BX.Sale.OrderAjaxComponent');
this.editMobileTotalBlock();
};
})();
})();

View file

@ -1,6 +1,6 @@
<?php
require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php');
$APPLICATION->SetTitle('Регистрация');
$APPLICATION->SetTitle(GetMessage('REGISTER_LOYALTY'));
?>
<?php $APPLICATION->IncludeComponent(

View file

@ -0,0 +1,2 @@
<?php
$MESS['REGISTER_LOYALTY'] = "Registration";

View file

@ -0,0 +1,2 @@
<?php
$MESS['REGISTER_LOYALTY'] = "Регистрация";

View file

@ -1,6 +1,6 @@
<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");
$APPLICATION->SetTitle("Бонусный счет");
$APPLICATION->SetTitle(GetMessage('BONUS_ACCOUNT'));
?>
<?php $APPLICATION->IncludeComponent(
@ -10,4 +10,4 @@ $APPLICATION->SetTitle("Бонусный счет");
);
?>
<?php require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/footer.php"); ?>
<?php require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/footer.php"); ?>

View file

@ -0,0 +1,2 @@
<?php
$MESS['BONUS_ACCOUNT'] = "Bonus account";

View file

@ -0,0 +1,2 @@
<?php
$MESS['BONUS_ACCOUNT'] = "Бонусный счет";

View file

@ -1,6 +1,6 @@
<?php
require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php');
$APPLICATION->SetTitle('Регистрация');
$APPLICATION->SetTitle(GetMessage('REGISTER'));
?>
<?php $APPLICATION->IncludeComponent(

View file

@ -0,0 +1,2 @@
<?php
$MESS['REGISTER'] = "Registration";

View file

@ -0,0 +1,2 @@
<?php
$MESS['REGISTER'] = "Регистрация";

View file

@ -14,22 +14,24 @@ use Bitrix\Sale\Delivery\Services\Manager;
use Bitrix\Sale\EventActions;
use Bitrix\Sale\Internals\OrderTable;
use Intaro\RetailCrm\Component\ConfigProvider;
use Intaro\RetailCrm\Component\Installer\InstallerTrait;
use Intaro\RetailCrm\Service\OrderLoyaltyDataService;
use Intaro\RetailCrm\Vendor\Symfony\Component\Process\PhpExecutableFinder;
use Intaro\RetailCrm\Component\Constants;
use Intaro\RetailCrm\Service\CurrencyService;
use RetailCrm\ApiClient;
use RetailCrm\Exception\CurlException;
use RetailCrm\Http\Client;
use RetailCrm\Response\ApiResponse;
use Intaro\RetailCrm\Component\Advanced\InstallerTrait;
use Intaro\RetailCrm\Component\Advanced\LoyaltyInstaller;
Loader::IncludeModule('highloadblock');
IncludeModuleLangFile(__FILE__);
if (class_exists('intaro_retailcrm')) {
return false;
}
include (__DIR__ . '/../lib/component/installer/installertrait.php');
require_once(__DIR__ . '/../lib/component/advanced/installertrait.php');
class intaro_retailcrm extends CModule
{
@ -42,61 +44,21 @@ class intaro_retailcrm extends CModule
public $MODULE_VERSION_DATE;
public $MODULE_NAME;
public $MODULE_DESCRIPTION;
public $MODULE_GROUP_RIGHTS = 'N';
public $PARTNER_NAME;
public $PARTNER_URI;
public $RETAIL_CRM_API;
public $RETAIL_CRM_EXPORT = 'retailcrm';
public $CRM_API_HOST_OPTION = 'api_host';
public $CRM_API_KEY_OPTION = 'api_key';
public $CRM_SITES_LIST = 'sites_list';
public $CRM_ORDER_TYPES_ARR = 'order_types_arr';
public $CRM_DELIVERY_TYPES_ARR = 'deliv_types_arr';
public $CRM_DELIVERY_SERVICES_ARR = 'deliv_services_arr';
public $CRM_INTEGRATION_DELIVERY = 'integration_delivery';
public $CRM_PAYMENT_TYPES = 'pay_types_arr';
public $CRM_PAYMENT_STATUSES = 'pay_statuses_arr';
public $CRM_PAYMENT = 'payment_arr';
public $CRM_INTEGRATION_PAYMENT = 'integration_payment';
public $CRM_ORDER_LAST_ID = 'order_last_id';
public $CRM_ORDER_PROPS = 'order_props';
public $CRM_LEGAL_DETAILS = 'legal_details';
public $CRM_CUSTOM_FIELDS = 'custom_fields';
public $CRM_CONTRAGENT_TYPE = 'contragent_type';
public $CRM_ORDER_DISCHARGE = 'order_discharge';
public $CRM_ORDER_FAILED_IDS = 'order_failed_ids';
public $CRM_ORDER_HISTORY = 'order_history';
public $CRM_CUSTOMER_HISTORY = 'customer_history';
public $CRM_CATALOG_BASE_PRICE = 'catalog_base_price';
public $CRM_ORDER_NUMBERS = 'order_numbers';
public $CRM_CANSEL_ORDER = 'cansel_order';
public $CRM_CURRENCY = 'currency';
public $CRM_ADDRESS_OPTIONS = 'address_options';
public $CRM_INVENTORIES_UPLOAD = 'inventories_upload';
public $CRM_STORES = 'stores';
public $CRM_SHOPS = 'shops';
public $CRM_IBLOCKS_INVENTORIES = 'iblocks_inventories';
public $CRM_PRICES_UPLOAD = 'prices_upload';
public $CRM_PRICES = 'prices';
public $CRM_PRICE_SHOPS = 'price_shops';
public $CRM_IBLOCKS_PRICES = 'iblock_prices';
public $CRM_COLLECTOR = 'collector';
public $CRM_COLL_KEY = 'coll_key';
public $CRM_UA = 'ua';
public $CRM_UA_KEYS = 'ua_keys';
public $CRM_API_VERSION = 'api_version';
public $HISTORY_TIME = 'history_time';
public $CLIENT_ID = 'client_id';
public $PROTOCOL = 'protocol';
public $INSTALL_PATH;
public function __construct()
{
$arModuleVersion = [];
$path = str_replace("\\", '/', __FILE__);
$path = substr($path, 0, strlen($path) - strlen('/index.php'));
$arModuleVersion = [];
$path = str_replace("\\", '/', __FILE__);
$path = substr($path, 0, strlen($path) - strlen('/index.php'));
$this->INSTALL_PATH = $path;
include($path . '/version.php');
$this->MODULE_VERSION = $arModuleVersion['VERSION'];
$this->MODULE_VERSION_DATE = $arModuleVersion['VERSION_DATE'];
$this->MODULE_NAME = GetMessage('RETAIL_MODULE_NAME');
@ -126,6 +88,18 @@ class intaro_retailcrm extends CModule
*/
function DoInstall()
{
try {
require_once('install_deps.php');
} catch (Error $exception) {
RCrmActions::eventLog(
'RetailCRM module install error',
'intaro.retailcrm',
$exception->getCode() . ': ' . $exception->getMessage()
);
return false;
}
global $APPLICATION, $step, $arResult;
if (!in_array('curl', get_loaded_extensions(), true)) {
@ -151,56 +125,6 @@ class intaro_retailcrm extends CModule
return false;
}
include($this->INSTALL_PATH . '/../lib/component/apiclient/traits/baseclienttrait.php');
include($this->INSTALL_PATH . '/../lib/component/apiclient/traits/customerstrait.php');
include($this->INSTALL_PATH . '/../lib/component/apiclient/traits/customerscorporatetrait.php');
include($this->INSTALL_PATH . '/../lib/component/apiclient/traits/loyaltytrait.php');
include($this->INSTALL_PATH . '/../lib/component/apiclient/traits/ordertrait.php');
include($this->INSTALL_PATH . '/../lib/component/apiclient/traits/carttrait.php');
include($this->INSTALL_PATH . '/../classes/general/Http/Client.php');
include($this->INSTALL_PATH . '/../classes/general/Response/ApiResponse.php');
include($this->INSTALL_PATH . '/../classes/general/RCrmActions.php');
include($this->INSTALL_PATH . '/../classes/general/user/RetailCrmUser.php');
include($this->INSTALL_PATH . '/../classes/general/events/RetailCrmEvent.php');
require_once $this->INSTALL_PATH . '/../classes/general/RetailcrmConfigProvider.php';
include($this->INSTALL_PATH . '/../lib/model/bitrix/xml/offerparam.php');
include($this->INSTALL_PATH . '/../lib/icml/settingsservice.php');
include($this->INSTALL_PATH . '/../lib/component/agent.php');
include($this->INSTALL_PATH . '/../lib/model/bitrix/xml/selectparams.php');
include($this->INSTALL_PATH . '/../lib/model/bitrix/xml/unit.php');
include($this->INSTALL_PATH . '/../lib/model/bitrix/xml/xmlcategory.php');
include($this->INSTALL_PATH . '/../lib/model/bitrix/xml/xmldata.php');
include($this->INSTALL_PATH . '/../lib/model/bitrix/xml/xmloffer.php');
include($this->INSTALL_PATH . '/../lib/model/bitrix/xml/xmlsetup.php');
include($this->INSTALL_PATH . '/../lib/model/bitrix/xml/xmlsetupprops.php');
include($this->INSTALL_PATH . '/../lib/model/bitrix/xml/xmlsetuppropscategories.php');
include($this->INSTALL_PATH . '/../lib/icml/icmldirector.php');
include($this->INSTALL_PATH . '/../lib/icml/icmlwriter.php');
include($this->INSTALL_PATH . '/../lib/icml/queryparamsmolder.php');
include($this->INSTALL_PATH . '/../lib/icml/xmlcategorydirector.php');
include($this->INSTALL_PATH . '/../lib/icml/xmlcategoryfactory.php');
include($this->INSTALL_PATH . '/../lib/icml/xmlofferdirector.php');
include($this->INSTALL_PATH . '/../lib/icml/xmlofferbuilder.php');
include($this->INSTALL_PATH . '/../lib/icml/utils/icmlutils.php');
include($this->INSTALL_PATH . '/../lib/repository/catalogrepository.php');
include($this->INSTALL_PATH . '/../lib/repository/filerepository.php');
include($this->INSTALL_PATH . '/../lib/repository/hlrepository.php');
include($this->INSTALL_PATH . '/../lib/repository/measurerepository.php');
include($this->INSTALL_PATH . '/../lib/repository/siterepository.php');
include($this->INSTALL_PATH . '/../lib/service/hl.php');
include($this->INSTALL_PATH . '/../lib/model/bitrix/orm/catalogiblockinfo.php');
include($this->INSTALL_PATH . '/../lib/model/bitrix/orm/iblockcatalog.php');
include($this->INSTALL_PATH . '/../classes/general/Exception/InvalidJsonException.php');
include($this->INSTALL_PATH . '/../classes/general/Exception/CurlException.php');
include($this->INSTALL_PATH . '/../classes/general/RestNormalizer.php');
include($this->INSTALL_PATH . '/../classes/general/Logger.php');
include($this->INSTALL_PATH . '/../classes/general/services/RetailCrmService.php');
$version = COption::GetOptionString($this->MODULE_ID, $this->CRM_API_VERSION, 0);
include($this->INSTALL_PATH . '/../classes/general/ApiClient_v5.php');
include($this->INSTALL_PATH . '/../classes/general/order/RetailCrmOrder_v5.php');
include($this->INSTALL_PATH . '/../classes/general/history/RetailCrmHistory_v5.php');
include($this->INSTALL_PATH . '/../classes/general/cart/RetailCrmCart_v5.php');
$step = (int) $_REQUEST['step'];
if (file_exists($this->INSTALL_PATH . '/../classes/general/config/options.xml')) {
@ -216,9 +140,7 @@ class intaro_retailcrm extends CModule
$type['NAME'] = $APPLICATION->ConvertCharset((string)$field, 'utf-8', SITE_CHARSET);
$type['ID'] = (string)$field['id'];
if ($field['group'] == 'custom') {
$arResult['customFields'][] = $type;
} elseif (!$field['group']) {
if (!$field['group']) {
$arResult['orderProps'][] = $type;
} else {
$groups = explode(',', (string) $field['group']);
@ -231,30 +153,8 @@ class intaro_retailcrm extends CModule
}
}
include($this->INSTALL_PATH . '/../lib/model/bitrix/abstractmodelproxy.php');
include($this->INSTALL_PATH . '/../lib/model/bitrix/orderprops.php');
include($this->INSTALL_PATH . '/../lib/model/bitrix/tomodule.php');
include($this->INSTALL_PATH . '/../lib/repository/abstractrepository.php');
include($this->INSTALL_PATH . '/../lib/repository/orderpropsrepository.php');
include($this->INSTALL_PATH . '/../lib/repository/persontyperepository.php');
include($this->INSTALL_PATH . '/../lib/repository/tomodulerepository.php');
include($this->INSTALL_PATH . '/../lib/model/bitrix/orm/tomodule.php');
include($this->INSTALL_PATH . '/../lib/model/bitrix/agreement.php');
include($this->INSTALL_PATH . '/../lib/component/constants.php');
include($this->INSTALL_PATH . '/../lib/repository/agreementrepository.php');
include($this->INSTALL_PATH . '/../lib/service/orderloyaltydataservice.php');
include($this->INSTALL_PATH . '/../lib/component/factory/clientfactory.php');
include($this->INSTALL_PATH . '/../lib/component/apiclient/clientadapter.php');
$this->CopyFiles();
$this->addEvents();
$this->addAgreement();
$this->addUserFields();
OrderLoyaltyDataService::createLoyaltyHlBlock();
$service = new OrderLoyaltyDataService();
$service->addCustomersLoyaltyFields();
$this->installExport();
$this->subscriptionSetup();
if ($step == 11) {
$arResult['arSites'] = RCrmActions::getSitesList();
@ -275,10 +175,10 @@ class intaro_retailcrm extends CModule
$arResult['errCode'] = 'ERR_CATALOG';
}
if ($api_host = COption::GetOptionString($this->OLD_MODULE_ID, $this->CRM_API_HOST_OPTION, 0)) {
if ($api_host = COption::GetOptionString($this->OLD_MODULE_ID, Constants::CRM_API_HOST_OPTION , 0)) {
$arResult['API_HOST'] = $api_host;
}
if ($api_key = COption::GetOptionString($this->OLD_MODULE_ID, $this->CRM_API_KEY_OPTION, 0)) {
if ($api_key = COption::GetOptionString($this->OLD_MODULE_ID, Constants::CRM_API_KEY_OPTION, 0)) {
$arResult['API_KEY'] = $api_key;
}
@ -307,14 +207,16 @@ class intaro_retailcrm extends CModule
return false;
}
$api_host = htmlspecialchars(trim($_POST[$this->CRM_API_HOST_OPTION]));
$api_key = htmlspecialchars(trim($_POST[$this->CRM_API_KEY_OPTION]));
$api_host = htmlspecialchars(trim($_POST[Constants::CRM_API_HOST_OPTION]));
$api_key = htmlspecialchars(trim($_POST[Constants::CRM_API_KEY_OPTION]));
// form correct url
$api_host = parse_url($api_host);
if ($api_host['scheme'] !== 'https') {
$api_host['scheme'] = 'https';
}
$api_host = $api_host['scheme'] . '://' . $api_host['host'];
if (!$api_host || !$api_key) {
@ -339,10 +241,10 @@ class intaro_retailcrm extends CModule
return false;
}
COption::SetOptionString($this->MODULE_ID, $this->CRM_API_HOST_OPTION, $api_host);
COption::SetOptionString($this->MODULE_ID, $this->CRM_API_KEY_OPTION, $api_key);
COption::SetOptionString($this->MODULE_ID, Constants::CRM_API_HOST_OPTION, $api_host);
COption::SetOptionString($this->MODULE_ID, Constants::CRM_API_KEY_OPTION, $api_key);
if ($sites_list = COption::GetOptionString($this->OLD_MODULE_ID, $this->CRM_SITES_LIST, 0)) {
if ($sites_list = COption::GetOptionString($this->OLD_MODULE_ID, Constants::CRM_SITES_LIST, 0)) {
$arResult['SITES_LIST'] = unserialize($sites_list);
}
@ -371,19 +273,24 @@ class intaro_retailcrm extends CModule
$arResult['arSites'] = RCrmActions::getSitesList();
if (count($arResult['arSites']) > 1) {
$api_host = COption::GetOptionString($this->MODULE_ID, $this->CRM_API_HOST_OPTION, 0);
$api_key = COption::GetOptionString($this->MODULE_ID, $this->CRM_API_KEY_OPTION, 0);
$api_host = COption::GetOptionString($this->MODULE_ID, Constants::CRM_API_HOST_OPTION, 0);
$api_key = COption::GetOptionString($this->MODULE_ID, Constants::CRM_API_KEY_OPTION, 0);
$isEmptySites = true;
foreach ($arResult['arSites'] as $site) {
$siteCode[$site['LID']] = null;
if ($_POST['sites-id-' . $site['LID']] && !empty($_POST['sites-id-' . $site['LID']])) {
$siteCode[$site['LID']] = htmlspecialchars(trim($_POST['sites-id-' . $site['LID']]));
} else {
$siteCode[$site['LID']] = null;
$isEmptySites = false;
}
}
if ($isEmptySites) {
$arResult['errCode'] = 'ERR_EMPTY_SITES_LIST';
}
$arResult['arCurrencySites'] = RCrmActions::getCurrencySites();
$bitrixBaseCurrency = CCurrency::GetBaseCurrency();
$result = $this->getReferenceShops($api_host, $api_key);
if (isset($result['errCode'])) {
@ -393,18 +300,12 @@ class intaro_retailcrm extends CModule
}
foreach ($arResult['arSites'] as $bitrixSite) {
$currentCurrency = $bitrixBaseCurrency;
$LID = $bitrixSite['LID'];
$LID = $bitrixSite['LID'] ?? null;
$cmsCurrency = $arResult['arCurrencySites'][$LID] ?? null;
if (isset($arResult['arCurrencySites'][$LID])) {
$currentCurrency = $arResult['arCurrencySites'][$LID];
}
if (
isset($arResult['sitesList'][$siteCode[$LID]])
&& $currentCurrency !== $arResult['sitesList'][$siteCode[$LID]]['currency'])
{
$arResult['errCode'] = 'ERR_CURRENCY_SITES';
if (isset($arResult['sitesList'][$siteCode[$LID]])) {
$crmCurrency = $arResult['sitesList'][$siteCode[$LID]]['currency'] ?? null;
$arResult['errCode'] = CurrencyService::validateCurrency($cmsCurrency, $crmCurrency);
}
}
@ -412,7 +313,7 @@ class intaro_retailcrm extends CModule
$arResult['errCode'] = 'ERR_FIELDS_API_HOST';
}
if (isset($arResult['errCode'])) {
if (!empty($arResult['errCode'])) {
$APPLICATION->IncludeAdminFile(
GetMessage('MODULE_INSTALL_TITLE'), $this->INSTALL_PATH . '/step11.php'
);
@ -421,10 +322,10 @@ class intaro_retailcrm extends CModule
}
$this->RETAIL_CRM_API = new ApiClient($api_host, $api_key);
COption::SetOptionString($this->MODULE_ID, $this->CRM_SITES_LIST, serialize($siteCode));
COption::SetOptionString($this->MODULE_ID, Constants::CRM_SITES_LIST, serialize($siteCode));
} else {
$api_host = htmlspecialchars(trim($_POST[$this->CRM_API_HOST_OPTION]));
$api_key = htmlspecialchars(trim($_POST[$this->CRM_API_KEY_OPTION]));
$api_host = htmlspecialchars(trim($_POST[Constants::CRM_API_HOST_OPTION]));
$api_key = htmlspecialchars(trim($_POST[Constants::CRM_API_KEY_OPTION]));
// form correct url
$api_host = parse_url($api_host);
@ -456,13 +357,39 @@ class intaro_retailcrm extends CModule
}
$this->RETAIL_CRM_API = new ApiClient($api_host, $api_key);
COption::SetOptionString($this->MODULE_ID, $this->CRM_API_HOST_OPTION, $api_host);
COption::SetOptionString($this->MODULE_ID, $this->CRM_API_KEY_OPTION, $api_key);
COption::SetOptionString($this->MODULE_ID, $this->CRM_SITES_LIST, serialize([]));
COption::SetOptionString($this->MODULE_ID, Constants::CRM_API_HOST_OPTION, $api_host);
COption::SetOptionString($this->MODULE_ID, Constants::CRM_API_KEY_OPTION, $api_key);
COption::SetOptionString($this->MODULE_ID, Constants::CRM_SITES_LIST, serialize([]));
try {
$credentials = $this->RETAIL_CRM_API->getCredentials();
COption::SetOptionString(
$this->MODULE_ID,
Constants::SITES_AVAILABLE,
$credentials->sitesAvailable[0] ?? ''
);
} catch (ArgumentOutOfRangeException | CurlException $exception) {
$arResult['errCode'] = 'ERR_GET_SITE_CRM';
$APPLICATION->IncludeAdminFile(
GetMessage('MODULE_INSTALL_TITLE'), $this->INSTALL_PATH . '/step1.php'
);
return false;
}
}
//prepare crm lists
try {
$credentials = $this->RETAIL_CRM_API->getCredentials()->getResponseBody();
$residualRight = array_diff(Constants::REQUIRED_API_SCOPES, $credentials['scopes']);
if (count($residualRight) !== 0) {
throw new \InvalidArgumentException(sprintf(GetMessage('ERR_403'), implode(', ', $residualRight)));
}
$arResult['orderTypesList'] = $this->RETAIL_CRM_API->orderTypesList()->orderTypes;
$arResult['deliveryTypesList'] = $this->RETAIL_CRM_API->deliveryTypesList()->deliveryTypes;
$arResult['deliveryServicesList'] = $this->RETAIL_CRM_API->deliveryServicesList()->deliveryServices;
@ -476,7 +403,8 @@ class intaro_retailcrm extends CModule
$e->getCode() . ': ' . $e->getMessage()
);
} catch (\InvalidArgumentException $e) {
$arResult['errCode'] = 'ERR_METHOD_NOT_FOUND';
$arResult['errCode'] = $e->getMessage();
$APPLICATION->IncludeAdminFile(
GetMessage('MODULE_INSTALL_TITLE'), $this->INSTALL_PATH . '/step1.php'
);
@ -524,19 +452,19 @@ class intaro_retailcrm extends CModule
//bitrix statusesList --statuses
$arResult['bitrixStatusesList'] = RCrmActions::StatusesList();
if ($order_types = COption::GetOptionString($this->OLD_MODULE_ID, $this->CRM_ORDER_TYPES_ARR, 0)) {
if ($order_types = COption::GetOptionString($this->OLD_MODULE_ID, Constants::CRM_ORDER_TYPES_ARR, 0)) {
$arResult['ORDER_TYPES'] = array_flip(unserialize($order_types));
}
if ($delivery_types = COption::GetOptionString($this->OLD_MODULE_ID, $this->CRM_DELIVERY_TYPES_ARR, 0)) {
if ($delivery_types = COption::GetOptionString($this->OLD_MODULE_ID, Constants::CRM_DELIVERY_TYPES_ARR, 0)) {
$arResult['DELIVERY_TYPES'] = array_flip(unserialize($delivery_types));
}
if ($payment_types = COption::GetOptionString($this->OLD_MODULE_ID, $this->CRM_PAYMENT_TYPES, 0)) {
if ($payment_types = COption::GetOptionString($this->OLD_MODULE_ID, Constants::CRM_PAYMENT_TYPES, 0)) {
$arResult['PAYMENT_TYPES'] = array_flip(unserialize($payment_types));
}
if ($payment_statuses = COption::GetOptionString($this->OLD_MODULE_ID, $this->CRM_PAYMENT_STATUSES, 0)) {
if ($payment_statuses = COption::GetOptionString($this->OLD_MODULE_ID, Constants::CRM_PAYMENT_STATUSES, 0)) {
$arResult['PAYMENT_STATUSES'] = array_flip(unserialize($payment_statuses));
}
if ($payment = COption::GetOptionString($this->OLD_MODULE_ID, $this->CRM_PAYMENT, 0)) {
if ($payment = COption::GetOptionString($this->OLD_MODULE_ID, Constants::CRM_PAYMENT, 0)) {
$arResult['PAYMENT'] = array_flip(unserialize($payment));
}
@ -555,10 +483,28 @@ class intaro_retailcrm extends CModule
}
// api load
$api_host = COption::GetOptionString($this->MODULE_ID, $this->CRM_API_HOST_OPTION, 0);
$api_key = COption::GetOptionString($this->MODULE_ID, $this->CRM_API_KEY_OPTION, 0);
$api_host = COption::GetOptionString($this->MODULE_ID, Constants::CRM_API_HOST_OPTION, 0);
$api_key = COption::GetOptionString($this->MODULE_ID, Constants::CRM_API_KEY_OPTION, 0);
$this->RETAIL_CRM_API = new ApiClient($api_host, $api_key);
$useCrmOrderMethods = htmlspecialchars(trim($_POST['use_crm_order_methods'])) === 'Y' ? 'Y' : 'N';
$crmOrderMethod = [];
if ($useCrmOrderMethods === 'Y') {
$crmOrderMethod = $_POST['crm_order_methods'];
}
COption::SetOptionString(
$this->MODULE_ID,
Constants::USE_CRM_ORDER_METHODS,
$useCrmOrderMethods
);
COption::SetOptionString(
$this->MODULE_ID,
Constants::CRM_ORDER_METHODS,
serialize(RCrmActions::clearArr(is_array($crmOrderMethod) ? $crmOrderMethod : []))
);
//bitrix orderTypesList
$arResult['arSites'] = RCrmActions::getSitesList();
$arResult['bitrixOrderTypesList'] = RCrmActions::OrderTypesList($arResult['arSites']);
@ -647,20 +593,21 @@ class intaro_retailcrm extends CModule
//new page
//form orderProps
$arResult['arProp'] = RCrmActions::OrderPropsList();
$arResult['locationProp'] = RCrmActions::getLocationProps();
$request = Application::getInstance()->getContext()->getRequest();
if ($request->isHttps() === true) {
COption::SetOptionString($this->MODULE_ID, $this->PROTOCOL, 'https://');
COption::SetOptionString($this->MODULE_ID, Constants::PROTOCOL, 'https://');
} else {
COption::SetOptionString($this->MODULE_ID, $this->PROTOCOL, 'http://');
COption::SetOptionString($this->MODULE_ID, Constants::PROTOCOL, 'http://');
}
// Set order types
if (!empty($orderTypesArr)) {
COption::SetOptionString(
$this->MODULE_ID,
$this->CRM_ORDER_TYPES_ARR,
Constants::CRM_ORDER_TYPES_ARR,
serialize(RCrmActions::clearArr($orderTypesArr)
)
);
@ -670,7 +617,7 @@ class intaro_retailcrm extends CModule
if (!empty($deliveryTypesArr)) {
COption::SetOptionString(
$this->MODULE_ID,
$this->CRM_DELIVERY_TYPES_ARR,
Constants::CRM_DELIVERY_TYPES_ARR,
serialize(RCrmActions::clearArr($deliveryTypesArr)
)
);
@ -680,7 +627,7 @@ class intaro_retailcrm extends CModule
if (!empty($paymentTypesArr)) {
COption::SetOptionString(
$this->MODULE_ID,
$this->CRM_PAYMENT_TYPES,
Constants::CRM_PAYMENT_TYPES,
serialize(RCrmActions::clearArr($paymentTypesArr)
)
);
@ -690,7 +637,7 @@ class intaro_retailcrm extends CModule
if (!empty($paymentStatusesArr)) {
COption::SetOptionString(
$this->MODULE_ID,
$this->CRM_PAYMENT_STATUSES,
Constants::CRM_PAYMENT_STATUSES,
serialize(RCrmActions::clearArr($paymentStatusesArr)
)
);
@ -700,36 +647,33 @@ class intaro_retailcrm extends CModule
if (!empty($paymentArr)) {
COption::SetOptionString(
$this->MODULE_ID,
$this->CRM_PAYMENT,
Constants::CRM_PAYMENT,
serialize(RCrmActions::clearArr($paymentArr)
)
);
}
COption::SetOptionString($this->MODULE_ID, $this->CRM_ORDER_LAST_ID, 0);
COption::SetOptionString($this->MODULE_ID, $this->CRM_ORDER_DISCHARGE, 1);
COption::SetOptionString($this->MODULE_ID, $this->CRM_ORDER_FAILED_IDS, serialize([]));
COption::SetOptionString($this->MODULE_ID, Constants::CRM_ORDER_LAST_ID, 0);
COption::SetOptionString($this->MODULE_ID, Constants::CRM_ORDER_DISCHARGE, 1);
COption::SetOptionString($this->MODULE_ID, Constants::CRM_ORDER_FAILED_IDS, serialize([]));
// Set cansel order
if (!empty($canselOrderArr)) {
COption::SetOptionString(
$this->MODULE_ID,
$this->CRM_CANSEL_ORDER,
Constants::CRM_CANCEL_ORDER,
serialize(RCrmActions::clearArr($canselOrderArr)
)
);
}
if ($orderProps = COption::GetOptionString($this->OLD_MODULE_ID, $this->CRM_ORDER_PROPS, 0)) {
if ($orderProps = COption::GetOptionString($this->OLD_MODULE_ID, Constants::CRM_ORDER_PROPS, 0)) {
$arResult['ORDER_PROPS'] = unserialize($orderProps);
}
if ($customFields = COption::GetOptionString($this->OLD_MODULE_ID, $this->CRM_CUSTOM_FIELDS, 0)) {
$arResult['CUSTOM_FIELDS'] = unserialize($customFields);
}
if ($legalDetails = COption::GetOptionString($this->OLD_MODULE_ID, $this->CRM_LEGAL_DETAILS, 0)) {
if ($legalDetails = COption::GetOptionString($this->OLD_MODULE_ID, Constants::CRM_LEGAL_DETAILS, 0)) {
$arResult['LEGAL_DETAILS'] = unserialize($legalDetails);
}
if ($contragentType = COption::GetOptionString($this->OLD_MODULE_ID, $this->CRM_CONTRAGENT_TYPE, 0)) {
if ($contragentType = COption::GetOptionString($this->OLD_MODULE_ID, Constants::CRM_CONTRAGENT_TYPE, 0)) {
$arResult['CONTRAGENT_TYPES'] = unserialize($contragentType);
}
@ -757,7 +701,7 @@ class intaro_retailcrm extends CModule
$this->loadDeps();
RetailCrmOrder::uploadOrders(); // each 50
$lastUpOrderId = COption::GetOptionString($this->MODULE_ID, $this->CRM_ORDER_LAST_ID, 0);
$lastUpOrderId = COption::GetOptionString($this->MODULE_ID, Constants::CRM_ORDER_LAST_ID, 0);
$countLeft = (int) OrderTable::getCount(['>ID' => $lastUpOrderId]);
$countAll = (int) OrderTable::getCount();
@ -792,8 +736,11 @@ class intaro_retailcrm extends CModule
$orderTypesList = RCrmActions::OrderTypesList(RCrmActions::getSitesList());
$orderTypesArr = [];
$addressDetailOptions = [];
foreach ($orderTypesList as $orderType) {
$orderTypesArr[$orderType['ID']] = htmlspecialchars(trim($_POST['order-type-' . $orderType['ID']]));
$addressDetailOptions[$orderType['ID']] = $_POST['address-detail-' . $orderType['ID']];
}
$orderPropsArr = [];
@ -820,25 +767,16 @@ class intaro_retailcrm extends CModule
$legalDetailsArr[$orderType['ID']] = $_legalDetailsArr;
}
$customFieldsArr = [];
foreach ($orderTypesList as $orderType) {
$_customFieldsArr = [];
foreach ($arResult['customFields'] as $custom) {
$_customFieldsArr[$custom['ID']] = htmlspecialchars(trim($_POST['custom-fields-' . $custom['ID'] . '-' . $orderType['ID']]));
}
$customFieldsArr[$orderType['ID']] = $_customFieldsArr;
}
//contragents type list
$contragentTypeArr = [];
foreach ($orderTypesList as $orderType) {
$contragentTypeArr[$orderType['ID']] = htmlspecialchars(trim($_POST['contragent-type-' . $orderType['ID']]));
}
COption::SetOptionString($this->MODULE_ID, $this->CRM_ORDER_PROPS, serialize(RCrmActions::clearArr($orderPropsArr)));
COption::SetOptionString($this->MODULE_ID, $this->CRM_CUSTOM_FIELDS, serialize(RCrmActions::clearArr($customFieldsArr)));
COption::SetOptionString($this->MODULE_ID, $this->CRM_LEGAL_DETAILS, serialize(RCrmActions::clearArr($legalDetailsArr)));
COption::SetOptionString($this->MODULE_ID, $this->CRM_CONTRAGENT_TYPE, serialize(RCrmActions::clearArr($contragentTypeArr)));
COption::SetOptionString($this->MODULE_ID, Constants::CRM_ADDRESS_OPTIONS, serialize($addressDetailOptions));
COption::SetOptionString($this->MODULE_ID, Constants::CRM_ORDER_PROPS, serialize(RCrmActions::clearArr($orderPropsArr)));
COption::SetOptionString($this->MODULE_ID, Constants::CRM_LEGAL_DETAILS, serialize(RCrmActions::clearArr($legalDetailsArr)));
COption::SetOptionString($this->MODULE_ID, Constants::CRM_CONTRAGENT_TYPE, serialize(RCrmActions::clearArr($contragentTypeArr)));
$APPLICATION->IncludeAdminFile(
GetMessage('MODULE_INSTALL_TITLE'), $this->INSTALL_PATH . '/step4.php'
@ -876,12 +814,12 @@ class intaro_retailcrm extends CModule
$arResult['errCode'] = 'ERR_SALE';
}
$api_host = COption::GetOptionString($this->MODULE_ID, $this->CRM_API_HOST_OPTION, 0);
$api_key = COption::GetOptionString($this->MODULE_ID, $this->CRM_API_KEY_OPTION, 0);
$api_host = COption::GetOptionString($this->MODULE_ID, Constants::CRM_API_HOST_OPTION, 0);
$api_key = COption::GetOptionString($this->MODULE_ID, Constants::CRM_API_KEY_OPTION, 0);
$api = new ApiClient($api_host, $api_key);
$customerH = $this->historyLoad($api, 'customersHistory');
COption::SetOptionString($this->MODULE_ID, $this->CRM_CUSTOMER_HISTORY, $customerH);
COption::SetOptionString($this->MODULE_ID, Constants::CRM_CUSTOMERS_HISTORY_SINCE_ID, $customerH);
//new data
if ($historyDate = COption::GetOptionString($this->OLD_MODULE_ID, 'order_history_date', 0)) {
@ -910,10 +848,10 @@ class intaro_retailcrm extends CModule
$orderH = $this->historyLoad($api, 'ordersHistory');
}
COption::SetOptionString($this->MODULE_ID, $this->CRM_ORDER_HISTORY, $orderH);
COption::SetOptionString($this->MODULE_ID, Constants::CRM_ORDER_HISTORY, $orderH);
if ($orderLastId = COption::GetOptionString($this->OLD_MODULE_ID, $this->CRM_ORDER_LAST_ID, 0)) {
COption::SetOptionString($this->MODULE_ID, $this->CRM_ORDER_LAST_ID, $orderLastId);
if ($orderLastId = COption::GetOptionString($this->OLD_MODULE_ID, Constants::CRM_ORDER_LAST_ID, 0)) {
COption::SetOptionString($this->MODULE_ID, Constants::CRM_ORDER_LAST_ID, $orderLastId);
} else {
$dbOrder = OrderTable::GetList([
'order' => ['ID' => 'DESC'],
@ -922,14 +860,14 @@ class intaro_retailcrm extends CModule
]);
$arOrder = $dbOrder->fetch();
if (!empty($arOrder['ID'])) {
COption::SetOptionString($this->MODULE_ID, $this->CRM_ORDER_LAST_ID, $arOrder['ID']);
COption::SetOptionString($this->MODULE_ID, Constants::CRM_ORDER_LAST_ID, $arOrder['ID']);
} else {
COption::SetOptionString($this->MODULE_ID, $this->CRM_ORDER_LAST_ID, 0);
COption::SetOptionString($this->MODULE_ID, Constants::CRM_ORDER_LAST_ID, 0);
}
}
if ($orderFailedIds = COption::GetOptionString($this->OLD_MODULE_ID, $this->CRM_ORDER_FAILED_IDS, 0)) {
COption::SetOptionString($this->MODULE_ID, $this->CRM_ORDER_FAILED_IDS, $orderFailedIds);
if ($orderFailedIds = COption::GetOptionString($this->OLD_MODULE_ID, Constants::CRM_ORDER_FAILED_IDS, 0)) {
COption::SetOptionString($this->MODULE_ID, Constants::CRM_ORDER_FAILED_IDS, $orderFailedIds);
}
$arResult['PRICE_TYPES'] = [];
@ -1100,13 +1038,13 @@ class intaro_retailcrm extends CModule
RegisterModuleDependences('sale', 'OnSalePaymentEntityDeleted', $this->MODULE_ID, 'RetailCrmEvent', 'paymentDelete');
RegisterModuleDependences('main', 'OnAfterUserRegister', $this->MODULE_ID, 'RetailCrmEvent', 'OnAfterUserRegister');
RegisterModuleDependences('main', 'OnAfterUserAdd', $this->MODULE_ID, 'RetailCrmEvent', 'OnAfterUserAdd');
RegisterModuleDependences('sale', 'OnSaleOrderSaved', $this->MODULE_ID, 'RetailCrmEvent', 'orderSave', 99);
COption::SetOptionString($this->MODULE_ID, $this->CRM_CATALOG_BASE_PRICE, htmlspecialchars(trim($_POST['price-types'])));
COption::SetOptionString($this->MODULE_ID, $this->CRM_INVENTORIES_UPLOAD, 'N');
COption::SetOptionString($this->MODULE_ID, $this->CRM_PRICES_UPLOAD, 'N');
COption::SetOptionString($this->MODULE_ID, $this->CRM_COLLECTOR, 'N');
COption::SetOptionString($this->MODULE_ID, $this->CRM_UA, 'N');
COption::SetOptionString($this->MODULE_ID, Constants::CRM_CATALOG_BASE_PRICE, htmlspecialchars(trim($_POST['price-types'])));
COption::SetOptionString($this->MODULE_ID, Constants::CRM_INVENTORIES_UPLOAD, 'N');
COption::SetOptionString($this->MODULE_ID, Constants::CRM_PRICES_UPLOAD, 'N');
COption::SetOptionString($this->MODULE_ID, Constants::CRM_COLLECTOR, 'N');
COption::SetOptionString($this->MODULE_ID, Constants::CRM_UA, 'N');
//agent
$dateAgent = new DateTime();
@ -1117,16 +1055,14 @@ class intaro_retailcrm extends CModule
'RCrmActions::orderAgent();',
$this->MODULE_ID,
'N',
600, // interval - 10 mins
600, // interval - 10 min
$dateAgent->format('d.m.Y H:i:s'), // date of first check
'Y', // agent is active
$dateAgent->format('d.m.Y H:i:s'), // date of first start
30
);
$this->CopyFiles();
COption::RemoveOption($this->MODULE_ID, $this->CRM_CATALOG_BASE_PRICE);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_CATALOG_BASE_PRICE);
if (
file_exists($_SERVER['DOCUMENT_ROOT']
@ -1179,7 +1115,7 @@ class intaro_retailcrm extends CModule
COption::SetOptionString(
$this->MODULE_ID,
$this->CRM_CATALOG_BASE_PRICE . '_' . $profileId,
Constants::CRM_CATALOG_BASE_PRICE . '_' . $profileId,
htmlspecialchars(trim($_POST['price-types']))
);
@ -1201,12 +1137,11 @@ class intaro_retailcrm extends CModule
CCatalogExport::PreGenerateExport($profileId);
}
$api_host = COption::GetOptionString($this->MODULE_ID, $this->CRM_API_HOST_OPTION, 0);
$api_key = COption::GetOptionString($this->MODULE_ID, $this->CRM_API_KEY_OPTION, 0);
$api_version = COption::GetOptionString($this->MODULE_ID, $this->CRM_API_VERSION, 0);
$api_host = COption::GetOptionString($this->MODULE_ID, Constants::CRM_API_HOST_OPTION, 0);
$api_key = COption::GetOptionString($this->MODULE_ID, Constants::CRM_API_KEY_OPTION, 0);
$this->RETAIL_CRM_API = new ApiClient($api_host, $api_key);
RCrmActions::sendConfiguration($this->RETAIL_CRM_API, $api_version);
RCrmActions::sendConfiguration($this->RETAIL_CRM_API);
$APPLICATION->IncludeAdminFile(
GetMessage('MODULE_INSTALL_TITLE'), $this->INSTALL_PATH . '/step6.php'
@ -1218,10 +1153,6 @@ class intaro_retailcrm extends CModule
{
global $APPLICATION;
$api_host = COption::GetOptionString($this->MODULE_ID, $this->CRM_API_HOST_OPTION, 0);
$api_key = COption::GetOptionString($this->MODULE_ID, $this->CRM_API_KEY_OPTION, 0);
$api_version = COption::GetOptionString($this->MODULE_ID, $this->CRM_API_VERSION, 0);
require_once($this->INSTALL_PATH . '/../classes/general/Http/Client.php');
require_once($this->INSTALL_PATH . '/../classes/general/Response/ApiResponse.php');
require_once($this->INSTALL_PATH . '/../classes/general/Exception/InvalidJsonException.php');
@ -1233,62 +1164,63 @@ class intaro_retailcrm extends CModule
require_once($this->INSTALL_PATH . '/../classes/general/history/RetailCrmHistory_v5.php');
require_once($this->INSTALL_PATH . '/../lib/component/constants.php');
require_once($this->INSTALL_PATH . '/../classes/general/cart/RetailCrmCart_v5.php');
require_once($this->INSTALL_PATH . '/../lib/component/advanced/loyaltyinstaller.php');
$retail_crm_api = new ApiClient($api_host, $api_key);
$api_host = COption::GetOptionString($this->MODULE_ID, Constants::CRM_API_HOST_OPTION, 0);
$api_key = COption::GetOptionString($this->MODULE_ID, Constants::CRM_API_KEY_OPTION, 0);
RCrmActions::sendConfiguration(new ApiClient($api_host, $api_key), false);
CAgent::RemoveAgent('RCrmActions::orderAgent();', $this->MODULE_ID);
CAgent::RemoveAgent('RetailCrmInventories::inventoriesUpload();', $this->MODULE_ID);
CAgent::RemoveAgent('RetailCrmPrices::pricesUpload();', $this->MODULE_ID);
COption::RemoveOption($this->MODULE_ID, $this->CRM_API_HOST_OPTION);
COption::RemoveOption($this->MODULE_ID, $this->CRM_API_KEY_OPTION);
COption::RemoveOption($this->MODULE_ID, $this->CRM_DELIVERY_TYPES_ARR);
COption::RemoveOption($this->MODULE_ID, $this->CRM_INTEGRATION_DELIVERY);
COption::RemoveOption($this->MODULE_ID, $this->CRM_PAYMENT_TYPES);
COption::RemoveOption($this->MODULE_ID, $this->CRM_PAYMENT_STATUSES);
COption::RemoveOption($this->MODULE_ID, $this->CRM_PAYMENT);
COption::RemoveOption($this->MODULE_ID, $this->CRM_INTEGRATION_PAYMENT);
COption::RemoveOption($this->MODULE_ID, $this->CRM_ORDER_LAST_ID);
COption::RemoveOption($this->MODULE_ID, $this->CRM_ORDER_PROPS);
COption::RemoveOption($this->MODULE_ID, $this->CRM_ORDER_TYPES_ARR);
COption::RemoveOption($this->MODULE_ID, $this->CRM_LEGAL_DETAILS);
COption::RemoveOption($this->MODULE_ID, $this->CRM_CONTRAGENT_TYPE);
COption::RemoveOption($this->MODULE_ID, $this->CRM_CUSTOM_FIELDS);
COption::RemoveOption($this->MODULE_ID, $this->CRM_SITES_LIST);
COption::RemoveOption($this->MODULE_ID, $this->CRM_ORDER_DISCHARGE);
COption::RemoveOption($this->MODULE_ID, $this->CRM_ORDER_FAILED_IDS);
COption::RemoveOption($this->MODULE_ID, $this->CRM_CUSTOMER_HISTORY);
COption::RemoveOption($this->MODULE_ID, $this->CRM_ORDER_HISTORY);
COption::RemoveOption($this->MODULE_ID, $this->CRM_CATALOG_BASE_PRICE);
COption::RemoveOption($this->MODULE_ID, $this->CRM_CURRENCY);
COption::RemoveOption($this->MODULE_ID, $this->CRM_ADDRESS_OPTIONS);
COption::RemoveOption($this->MODULE_ID, $this->CRM_ORDER_NUMBERS);
COption::RemoveOption($this->MODULE_ID, $this->CRM_CANSEL_ORDER);
COption::RemoveOption($this->MODULE_ID, $this->CRM_INVENTORIES_UPLOAD);
COption::RemoveOption($this->MODULE_ID, $this->CRM_STORES);
COption::RemoveOption($this->MODULE_ID, $this->CRM_SHOPS);
COption::RemoveOption($this->MODULE_ID, $this->CRM_IBLOCKS_INVENTORIES);
COption::RemoveOption($this->MODULE_ID, $this->CRM_PRICES_UPLOAD);
COption::RemoveOption($this->MODULE_ID, $this->CRM_PRICES);
COption::RemoveOption($this->MODULE_ID, $this->CRM_PRICE_SHOPS);
COption::RemoveOption($this->MODULE_ID, $this->CRM_IBLOCKS_PRICES);
COption::RemoveOption($this->MODULE_ID, $this->CRM_COLLECTOR);
COption::RemoveOption($this->MODULE_ID, $this->CRM_COLL_KEY);
COption::RemoveOption($this->MODULE_ID, $this->CRM_UA);
COption::RemoveOption($this->MODULE_ID, $this->CRM_UA_KEYS);
COption::RemoveOption($this->MODULE_ID, $this->CRM_API_VERSION);
COption::RemoveOption($this->MODULE_ID, $this->HISTORY_TIME);
COption::RemoveOption($this->MODULE_ID, $this->CLIENT_ID);
COption::RemoveOption($this->MODULE_ID, $this->PROTOCOL);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_API_HOST_OPTION);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_API_KEY_OPTION);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_DELIVERY_TYPES_ARR);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_INTEGRATION_DELIVERY);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_PAYMENT_TYPES);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_PAYMENT_STATUSES);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_PAYMENT);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_INTEGRATION_PAYMENT);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_ORDER_LAST_ID);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_ORDER_PROPS);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_ORDER_TYPES_ARR);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_LEGAL_DETAILS);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_CONTRAGENT_TYPE);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_SITES_LIST);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_ORDER_DISCHARGE);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_ORDER_FAILED_IDS);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_CUSTOMERS_HISTORY_SINCE_ID);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_ORDER_HISTORY);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_CATALOG_BASE_PRICE);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_CURRENCY);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_ADDRESS_OPTIONS);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_ORDER_NUMBERS);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_CANCEL_ORDER);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_INVENTORIES_UPLOAD);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_STORES);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_SHOPS);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_IBLOCKS_INVENTORIES);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_PRICES_UPLOAD);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_PRICES);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_PRICE_SHOPS);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_IBLOCKS_PRICES);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_COLLECTOR);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_COLL_KEY);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_UA);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_UA_KEYS);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_API_VERSION);
COption::RemoveOption($this->MODULE_ID, Constants::HISTORY_TIME);
COption::RemoveOption($this->MODULE_ID, Constants::CLIENT_ID);
COption::RemoveOption($this->MODULE_ID, Constants::PROTOCOL);
COption::RemoveOption($this->MODULE_ID, Constants::MATCHED_CUSTOM_PROPS);
COption::RemoveOption($this->MODULE_ID, Constants::MATCHED_CUSTOM_USER_FIELDS);
COption::RemoveOption($this->MODULE_ID, Constants::CRM_ORDER_METHODS);
COption::RemoveOption($this->MODULE_ID, Constants::USE_CRM_ORDER_METHODS);
if (CModule::IncludeModule('sale')) {
UnRegisterModuleDependences(
'sale',
EventActions::EVENT_ON_ORDER_SAVED,
$this->MODULE_ID,
'RetailCrmEvent',
'orderSave'
);
UnRegisterModuleDependences('sale', 'OnSaleOrderSaved', $this->MODULE_ID, 'RetailCrmEvent', 'orderSave');
}
UnRegisterModuleDependences('sale', 'OnOrderUpdate', $this->MODULE_ID, 'RetailCrmEvent', 'onUpdateOrder');
@ -1316,10 +1248,10 @@ class intaro_retailcrm extends CModule
}
}
RCrmActions::sendConfiguration($retail_crm_api, $api_version, false);
$this->deleteFiles();
$this->deleteLPEvents();
$loyalty = new LoyaltyInstaller();
$loyalty->deleteLPEvents();
UnRegisterModule($this->MODULE_ID);
@ -1463,12 +1395,15 @@ class intaro_retailcrm extends CModule
{
global $APPLICATION;
$client = new Client($api_host . '/api/'.self::V5, ['apiKey' => $api_key]);
$client = new Client($api_host . '/api', ['apiKey' => $api_key]);
$result = [];
try {
$result = $client->makeRequest('/reference/sites', 'GET');
$credentials = $client->makeRequest('/credentials', 'GET')->getResponseBody();
$residualRight = array_diff(Constants::REQUIRED_API_SCOPES, $credentials['scopes']);
$siteResponse = $client->makeRequest('/v5/reference/sites', 'GET');
$bitrixSites = RCrmActions::getSitesList();
$bitrixBaseCurrency = CCurrency::GetBaseCurrency();
$currencySites = RCrmActions::getCurrencySites();
} catch (CurlException $e) {
RCrmActions::eventLog(
@ -1476,47 +1411,44 @@ class intaro_retailcrm extends CModule
$e->getCode() . ': ' . $e->getMessage()
);
$res['errCode'] = 'ERR_' . $e->getCode();
$result['errCode'] = 'ERR_' . $e->getCode();
return $res;
return $result;
}
//Проверка, что был получен корректный ответ
if (isset($result) && $result->getStatusCode() == 200) {
//Проверка количества магазинов, доступных по апи
if (count($bitrixSites) === 1 && count($result->sites) > 1) {
$res['errCode'] = 'ERR_COUNT_SITES';
// Проверка, что был получен корректный ответ
if (isset($siteResponse) && $siteResponse->getStatusCode() === 200 && count($residualRight) === 0) {
$sites = $siteResponse->sites ?? null;
if ($sites === null) {
$result['errCode'] = 'UNKNOWN_ERROR';
}
if (!isset($res['errCode']) && count($bitrixSites) === 1 ) {
$currentCurrency = $bitrixBaseCurrency;
$LID = $bitrixSites[0]['LID'];
if (isset($currencySites[$LID])) {
$currentCurrency = $currencySites[$LID];
}
$crmSite = reset($result->sites);
if ($currentCurrency !== $crmSite['currency']) {
$res['errCode'] = 'ERR_CURRENCY_SITES';
}
//Проверка количества магазинов, доступных по API
if (count($bitrixSites) === 1 && count($sites) > 1) {
$result['errCode'] = 'ERR_COUNT_SITES';
}
if (!isset($res)) {
if (!isset($result['errCode']) && count($bitrixSites) === 1 ) {
$LID = $bitrixSites[0]['LID'] ?? null;
$cmsCurrency = $currencySites[$LID] ?? null;
$crmSiteData = reset($sites);
$crmCurrency = $crmSiteData['currency'] ?? null;
$result['errCode'] = CurrencyService::validateCurrency($cmsCurrency, $crmCurrency);
}
if (empty($result['errCode'])) {
ConfigProvider::setApiVersion(self::V5);
$res['sitesList'] = $APPLICATION->ConvertCharsetArray(
$result->sites,
'utf-8',
SITE_CHARSET
);
$result['sitesList'] = $APPLICATION->ConvertCharsetArray($sites, 'utf-8', SITE_CHARSET);
}
} else {
$res['errCode'] = 'ERR_METHOD_NOT_FOUND';
$result['errCode'] = sprintf(GetMessage('ERR_403'), implode(', ', $residualRight));
}
return $res;
return $result;
}
/**

View file

@ -0,0 +1,70 @@
<?php
require_once($this->INSTALL_PATH . '/../lib/component/apiclient/traits/baseclienttrait.php');
require_once($this->INSTALL_PATH . '/../lib/component/apiclient/traits/customerstrait.php');
require_once($this->INSTALL_PATH . '/../lib/component/apiclient/traits/customerscorporatetrait.php');
require_once($this->INSTALL_PATH . '/../lib/component/apiclient/traits/loyaltytrait.php');
require_once($this->INSTALL_PATH . '/../lib/component/apiclient/traits/ordertrait.php');
require_once($this->INSTALL_PATH . '/../lib/component/apiclient/traits/carttrait.php');
require_once($this->INSTALL_PATH . '/../classes/general/Http/Client.php');
require_once($this->INSTALL_PATH . '/../classes/general/Response/ApiResponse.php');
require_once($this->INSTALL_PATH . '/../classes/general/RCrmActions.php');
require_once($this->INSTALL_PATH . '/../classes/general/user/RetailCrmUser.php');
require_once($this->INSTALL_PATH . '/../classes/general/events/RetailCrmEvent.php');
require_once $this->INSTALL_PATH . '/../classes/general/RetailcrmConfigProvider.php';
require_once($this->INSTALL_PATH . '/../lib/model/bitrix/xml/offerparam.php');
require_once($this->INSTALL_PATH . '/../lib/icml/settingsservice.php');
require_once($this->INSTALL_PATH . '/../lib/component/agent.php');
require_once($this->INSTALL_PATH . '/../lib/model/bitrix/xml/selectparams.php');
require_once($this->INSTALL_PATH . '/../lib/model/bitrix/xml/unit.php');
require_once($this->INSTALL_PATH . '/../lib/model/bitrix/xml/xmlcategory.php');
require_once($this->INSTALL_PATH . '/../lib/model/bitrix/xml/xmldata.php');
require_once($this->INSTALL_PATH . '/../lib/model/bitrix/xml/xmloffer.php');
require_once($this->INSTALL_PATH . '/../lib/model/bitrix/xml/xmlsetup.php');
require_once($this->INSTALL_PATH . '/../lib/model/bitrix/xml/xmlsetupprops.php');
require_once($this->INSTALL_PATH . '/../lib/model/bitrix/xml/xmlsetuppropscategories.php');
require_once($this->INSTALL_PATH . '/../lib/icml/icmldirector.php');
require_once($this->INSTALL_PATH . '/../lib/icml/icmlwriter.php');
require_once($this->INSTALL_PATH . '/../lib/icml/queryparamsmolder.php');
require_once($this->INSTALL_PATH . '/../lib/icml/xmlcategorydirector.php');
require_once($this->INSTALL_PATH . '/../lib/icml/xmlcategoryfactory.php');
require_once($this->INSTALL_PATH . '/../lib/icml/xmlofferdirector.php');
require_once($this->INSTALL_PATH . '/../lib/icml/xmlofferbuilder.php');
require_once($this->INSTALL_PATH . '/../lib/repository/catalogrepository.php');
require_once($this->INSTALL_PATH . '/../lib/repository/filerepository.php');
require_once($this->INSTALL_PATH . '/../lib/repository/hlrepository.php');
require_once($this->INSTALL_PATH . '/../lib/repository/measurerepository.php');
require_once($this->INSTALL_PATH . '/../lib/repository/siterepository.php');
require_once($this->INSTALL_PATH . '/../lib/service/hl.php');
require_once($this->INSTALL_PATH . '/../lib/model/bitrix/orm/catalogiblockinfo.php');
require_once($this->INSTALL_PATH . '/../lib/model/bitrix/orm/iblockcatalog.php');
require_once($this->INSTALL_PATH . '/../classes/general/Exception/InvalidJsonException.php');
require_once($this->INSTALL_PATH . '/../classes/general/Exception/CurlException.php');
require_once($this->INSTALL_PATH . '/../classes/general/RestNormalizer.php');
require_once($this->INSTALL_PATH . '/../classes/general/Logger.php');
require_once($this->INSTALL_PATH . '/../classes/general/services/RetailCrmService.php');
require_once($this->INSTALL_PATH . '/../lib/component/constants.php');
require_once($this->INSTALL_PATH . '/../classes/general/ApiClient_v5.php');
require_once($this->INSTALL_PATH . '/../classes/general/order/RetailCrmOrder_v5.php');
require_once($this->INSTALL_PATH . '/../classes/general/history/RetailCrmHistory_v5.php');
require_once($this->INSTALL_PATH . '/../classes/general/cart/RetailCrmCart_v5.php');
require_once($this->INSTALL_PATH . '/../lib/service/managerservice.php');
require_once($this->INSTALL_PATH . '/../lib/service/loyaltyservice.php');
require_once($this->INSTALL_PATH . '/../lib/service/loyaltyaccountservice.php');
require_once($this->INSTALL_PATH . '/../lib/repository/managerrepository.php');
require_once($this->INSTALL_PATH . '/../classes/general/services/BitrixOrderService.php');
require_once($this->INSTALL_PATH . '/../lib/model/bitrix/abstractmodelproxy.php');
require_once($this->INSTALL_PATH . '/../lib/model/bitrix/orderprops.php');
require_once($this->INSTALL_PATH . '/../lib/model/bitrix/tomodule.php');
require_once($this->INSTALL_PATH . '/../lib/repository/abstractrepository.php');
require_once($this->INSTALL_PATH . '/../lib/repository/orderpropsrepository.php');
require_once($this->INSTALL_PATH . '/../lib/repository/persontyperepository.php');
require_once($this->INSTALL_PATH . '/../lib/repository/tomodulerepository.php');
require_once($this->INSTALL_PATH . '/../lib/model/bitrix/orm/tomodule.php');
require_once($this->INSTALL_PATH . '/../lib/model/bitrix/agreement.php');
require_once($this->INSTALL_PATH . '/../lib/repository/agreementrepository.php');
require_once($this->INSTALL_PATH . '/../lib/service/orderloyaltydataservice.php');
require_once($this->INSTALL_PATH . '/../lib/service/currencyservice.php');
require_once($this->INSTALL_PATH . '/../lib/component/factory/clientfactory.php');
require_once($this->INSTALL_PATH . '/../lib/component/apiclient/clientadapter.php');
require_once($this->INSTALL_PATH . '/../lib/component/advanced/loyaltyinstaller.php');

View file

@ -1,15 +1,21 @@
<?php
IncludeModuleLangFile(__FILE__);
<?php
if(isset($arResult['errCode']) && $arResult['errCode'])
echo CAdminMessage::ShowMessage(GetMessage($arResult['errCode']));
use Intaro\RetailCrm\Component\Constants;
$MODULE_ID = 'intaro.retailcrm';
$CRM_API_HOST_OPTION = 'api_host';
$CRM_API_KEY_OPTION = 'api_key';
IncludeModuleLangFile(__FILE__);
$arResult['API_HOST'] = COption::GetOptionString($MODULE_ID, $CRM_API_HOST_OPTION);
$arResult['API_KEY'] = COption::GetOptionString($MODULE_ID, $CRM_API_KEY_OPTION);
if (isset($arResult['errCode']) && $arResult['errCode']) {
$message = GetMessage($arResult['errCode']);
if ($message) {
echo CAdminMessage::ShowMessage($message);
} else {
echo CAdminMessage::ShowMessage(['MESSAGE' => $arResult['errCode'], 'HTML' => true]);
}
}
$arResult['API_HOST'] = COption::GetOptionString(Constants::MODULE_ID, Constants::CRM_API_HOST_OPTION);
$arResult['API_KEY'] = COption::GetOptionString(Constants::MODULE_ID, Constants::CRM_API_KEY_OPTION);
?>
<div class="adm-detail-content-item-block">
@ -53,4 +59,4 @@ $arResult['API_KEY'] = COption::GetOptionString($MODULE_ID, $CRM_API_KEY_OPTION)
</div>
</div>
</form>
</div>
</div>

View file

@ -1,28 +1,20 @@
<?php
use Intaro\RetailCrm\Component\ConfigProvider;
use Intaro\RetailCrm\Component\Constants;
use RetailCrm\ApiClient;
/** @var $APPLICATION */
IncludeModuleLangFile(__FILE__);
$MODULE_ID = 'intaro.retailcrm';
$CRM_API_HOST_OPTION = 'api_host';
$CRM_API_KEY_OPTION = 'api_key';
$CRM_SITES_LIST= 'sites_list';
$CRM_PAYMENT_TYPES = 'pay_types_arr';
$CRM_DELIVERY_TYPES_ARR = 'deliv_types_arr';
$CRM_PAYMENT_TYPES = 'pay_types_arr';
$CRM_PAYMENT_STATUSES = 'pay_statuses_arr';
$CRM_PAYMENT = 'payment_arr';
$CRM_ORDER_TYPES_ARR = 'order_types_arr';
$api_host = COption::GetOptionString($MODULE_ID, $CRM_API_HOST_OPTION, 0);
$api_key = COption::GetOptionString($MODULE_ID, $CRM_API_KEY_OPTION, 0);
$api_host = COption::GetOptionString(Constants::MODULE_ID, Constants::CRM_API_HOST_OPTION, 0);
$api_key = COption::GetOptionString(Constants::MODULE_ID, Constants::CRM_API_KEY_OPTION, 0);
$arResult['arSites'] = RCrmActions::getSitesList();
$RETAIL_CRM_API = new ApiClient($api_host, $api_key);
COption::SetOptionString($MODULE_ID, $CRM_API_HOST_OPTION, $api_host);
COption::SetOptionString($MODULE_ID, $CRM_API_KEY_OPTION, $api_key);
COption::SetOptionString(Constants::MODULE_ID, Constants::CRM_API_HOST_OPTION, $api_host);
COption::SetOptionString(Constants::MODULE_ID, Constants::CRM_API_KEY_OPTION, $api_key);
$availableSites = RetailcrmConfigProvider::getSitesList();
@ -34,15 +26,15 @@ if (!empty($availableSites)) {
}
if (count($arResult['arSites']) === 1) {
COption::SetOptionString($MODULE_ID, $CRM_SITES_LIST, serialize([]));
COption::SetOptionString(Constants::MODULE_ID, Constants::CRM_SITES_LIST, serialize([]));
}
if (!isset($arResult['PAYMENT'])) {
$arResult['PAYMENT'] = unserialize(COption::GetOptionString($MODULE_ID, $CRM_PAYMENT, 0));
$arResult['PAYMENT'] = unserialize(COption::GetOptionString(Constants::MODULE_ID, Constants::CRM_PAYMENT, 0));
}
if (!isset($arResult['ORDER_TYPES'])) {
$arResult['ORDER_TYPES'] = unserialize(COption::GetOptionString($MODULE_ID, $CRM_ORDER_TYPES_ARR, 0));
$arResult['ORDER_TYPES'] = unserialize(COption::GetOptionString(Constants::MODULE_ID, Constants::CRM_ORDER_TYPES_ARR, 0));
}
if (!isset($arResult['paymentTypesList'])) {
@ -51,7 +43,7 @@ if (!isset($arResult['paymentTypesList'])) {
$availableSites,
$RETAIL_CRM_API->paymentTypesList()->paymentTypes
);
$arResult['PAYMENT_TYPES'] = unserialize(COption::GetOptionString($MODULE_ID, $CRM_PAYMENT_TYPES, 0));
$arResult['PAYMENT_TYPES'] = unserialize(COption::GetOptionString(Constants::MODULE_ID, Constants::CRM_PAYMENT_TYPES, 0));
}
if (!isset($arResult['bitrixStatusesList'])) {
@ -67,7 +59,7 @@ if (!isset($arResult['orderTypesList'])) {
if (!isset($arResult['paymentStatusesList'])) {
$arResult['paymentStatusesList'] = $RETAIL_CRM_API->paymentStatusesList()->paymentStatuses;
$arResult['PAYMENT_STATUSES'] = unserialize(COption::GetOptionString($MODULE_ID, $CRM_PAYMENT_STATUSES, 0));
$arResult['PAYMENT_STATUSES'] = unserialize(COption::GetOptionString(Constants::MODULE_ID, Constants::CRM_PAYMENT_STATUSES, 0));
}
if (!isset($arResult['bitrixDeliveryTypesList'])) {
@ -76,7 +68,7 @@ if (!isset($arResult['bitrixDeliveryTypesList'])) {
$availableSites,
$RETAIL_CRM_API->deliveryTypesList()->deliveryTypes
);
$arResult['DELIVERY_TYPES'] = unserialize(COption::GetOptionString($MODULE_ID, $CRM_DELIVERY_TYPES_ARR, 0));
$arResult['DELIVERY_TYPES'] = unserialize(COption::GetOptionString(Constants::MODULE_ID, Constants::CRM_DELIVERY_TYPES_ARR, 0));
}
//bitrix pyament Y/N
@ -132,6 +124,23 @@ if (isset($arResult['PAYMENT'])) {
'N' => 'not-paid',
];
}
$orderMethods = [];
$getOrderMethods = $RETAIL_CRM_API->orderMethodsList();
if ($getOrderMethods !== null && $getOrderMethods->isSuccessful()) {
foreach ($getOrderMethods->orderMethods as $method) {
if (!$method['active']) {
continue;
}
$orderMethods[$method['code']] = $method['name'];
}
}
$arResult['orderMethods'] = $orderMethods;
$crmOrderMethods = ConfigProvider::getCrmOrderMethods();
$useCrmOrderMethods = ConfigProvider::useCrmOrderMethods();
?>
<style type="text/css">
@ -145,6 +154,10 @@ if (isset($arResult['PAYMENT'])) {
<?php CJSCore::Init(['jquery']);?>
<script type="text/javascript">
function switchCrmOrderMethods() {
$('#crm_order_methods').toggle(500);
}
$(document).ready(function() {
$('input[name="update"]').on('click', function() {
$('input[name="step"]').val(2);
@ -381,6 +394,32 @@ if (isset($arResult['PAYMENT'])) {
</td>
</tr>
<?php endforeach; ?>
<tr class="heading">
<td colspan="2"><b><?php echo GetMessage('CRM_ORDER_METHODS'); ?></b></td>
</tr>
<tr>
<td colspan="2" style="text-align: center!important;">
<label><input class="addr" type="checkbox" name="use_crm_order_methods" value="Y" onclick="switchCrmOrderMethods();" <?php if ($useCrmOrderMethods === 'Y') {
echo "checked";
} ?>><?php echo GetMessage('CRM_ORDER_METHODS_OPTION'); ?></label>
</td>
</tr>
<tr id="crm_order_methods" style="display:<?php echo $useCrmOrderMethods !== 'Y' ? 'none' : '';?>">
<td colspan="2" style="text-align: center!important;">
<br><br>
<select multiple size="<?php echo count($arResult['orderMethods']);?>" name="crm_order_methods[]">
<?php foreach ($arResult['orderMethods'] as $key => $name): ?>
<option value="<?php echo $key;?>"<?php if (is_array($crmOrderMethods) && in_array($key, $crmOrderMethods)) {
echo 'selected';
} ?>>
<?php echo $name;?>
</option>
<?php endforeach;?>
</select>
</td>
</tr>
</tbody>
</table>
<br />

View file

@ -1,5 +1,6 @@
<?php
use Intaro\RetailCrm\Component\Constants;
use RetailCrm\ApiClient;
/** @var $APPLICATION */
@ -10,37 +11,31 @@ if (!check_bitrix_sessid()) {
IncludeModuleLangFile(__FILE__);
$MODULE_ID = 'intaro.retailcrm';
$CRM_API_HOST_OPTION = 'api_host';
$CRM_API_KEY_OPTION = 'api_key';
$CRM_SITES_LIST= 'sites_list';
$CRM_ORDER_PROPS = 'order_props';
$CRM_CONTRAGENT_TYPE = 'contragent_type';
$CRM_LEGAL_DETAILS = 'legal_details';
$api_host = COption::GetOptionString($MODULE_ID, $CRM_API_HOST_OPTION, 0);
$api_key = COption::GetOptionString($MODULE_ID, $CRM_API_KEY_OPTION, 0);
$api_host = COption::GetOptionString(Constants::MODULE_ID, Constants::CRM_API_HOST_OPTION, 0);
$api_key = COption::GetOptionString(Constants::MODULE_ID, Constants::CRM_API_KEY_OPTION, 0);
$arResult['arSites'] = RCrmActions::getSitesList();
$RETAIL_CRM_API = new ApiClient($api_host, $api_key);
COption::SetOptionString($MODULE_ID, $CRM_API_HOST_OPTION, $api_host);
COption::SetOptionString($MODULE_ID, $CRM_API_KEY_OPTION, $api_key);
COption::SetOptionString(Constants::MODULE_ID, Constants::CRM_API_HOST_OPTION, $api_host);
COption::SetOptionString(Constants::MODULE_ID, Constants::CRM_API_KEY_OPTION, $api_key);
if (count($arResult['arSites']) === 1) {
COption::SetOptionString($MODULE_ID, $CRM_SITES_LIST, serialize([]));
COption::SetOptionString(Constants::MODULE_ID, Constants::CRM_SITES_LIST, serialize([]));
}
if (!isset($arResult['bitrixOrderTypesList'])) {
$arResult['bitrixOrderTypesList'] = RCrmActions::OrderTypesList($arResult['arSites']);
$arResult['arProp'] = RCrmActions::OrderPropsList();
$arResult['ORDER_PROPS'] = unserialize(COption::GetOptionString($MODULE_ID, $CRM_ORDER_PROPS, 0));
$arResult['locationProp'] = RCrmActions::getLocationProps();
$arResult['ORDER_PROPS'] = unserialize(COption::GetOptionString(Constants::MODULE_ID, Constants::CRM_ORDER_PROPS, 0));
}
if (!isset($arResult['LEGAL_DETAILS'])) {
$arResult['LEGAL_DETAILS'] = unserialize(COption::GetOptionString($MODULE_ID, $CRM_LEGAL_DETAILS, 0));
$arResult['LEGAL_DETAILS'] = unserialize(COption::GetOptionString(Constants::MODULE_ID, Constants::CRM_LEGAL_DETAILS, 0));
}
if (!isset($arResult['CONTRAGENT_TYPES'])) {
$arResult['CONTRAGENT_TYPES'] = unserialize(COption::GetOptionString($MODULE_ID, $CRM_CONTRAGENT_TYPE, 0));
$arResult['CONTRAGENT_TYPES'] = unserialize(COption::GetOptionString(Constants::MODULE_ID, Constants::CRM_CONTRAGENT_TYPE, 0));
if ($arResult['CONTRAGENT_TYPES'] === false) {
foreach ($arResult['contragentType'] as $crmContrAgentType) {
@ -80,9 +75,43 @@ if (isset($arResult['ORDER_PROPS'])) {
<?php CJSCore::Init(['jquery']);?>
<script type="text/javascript">
function updateAddressList()
{
splitName = $(this).attr('name').split('-');
orderType = splitName[2];
if (parseInt($(this).val()) === 1) {
let locationElement = document.getElementById('locationElement-' + orderType);
let replacedSelect = document.getElementsByName('order-prop-text-' + orderType);
let replacedElement = replacedSelect[0].parentNode.parentNode;
let addedLocation = locationElement.cloneNode(true);
addedLocation.querySelector(`select`).setAttribute("name", 'order-prop-text-' + orderType);
addedLocation.removeAttribute("hidden");
addedLocation.removeAttribute("id");
replacedElement.replaceWith(addedLocation);
$('tr.address-detail-' + orderType).show('slow');
} else if (parseInt($(this).val()) === 0) {
let locationElement = document.getElementById('textAddressElement-' + orderType);
let replacedSelect = document.getElementsByName('order-prop-text-' + orderType);
let replacedElement = replacedSelect[0].parentNode.parentNode;
let addedLocation = locationElement.cloneNode(true);
addedLocation.querySelector(`select`).setAttribute("name", 'order-prop-text-' + orderType);
addedLocation.removeAttribute("hidden");
addedLocation.removeAttribute("id");
replacedElement.replaceWith(addedLocation);
$('tr.address-detail-' + orderType).hide('slow');
}
}
$(document).ready(function() {
const individual = $("[name='contragent-type-1']").val();
const legalEntity = $("[name='contragent-type-2']").val();
$('input:checked[name^="address-detail-"]').each(updateAddressList);
if (legalEntity !== 'individual') {
$('tr.legal-detail-2').each(function(){
@ -102,15 +131,7 @@ if (isset($arResult['ORDER_PROPS'])) {
});
}
$('input.addr').change(function(){
const splitName = $(this).attr('name').split('-');
const orderType = splitName[2];
if(parseInt($(this).val()) === 1)
$('tr.address-detail-' + orderType).show('slow');
else if(parseInt($(this).val()) === 0)
$('tr.address-detail-' + orderType).hide('slow');
});
$('input[name^="address-detail-"]').change(updateAddressList);
$('tr.contragent-type select').change(function(){
const splitName = $(this).attr('name').split('-');
@ -223,39 +244,40 @@ if (isset($arResult['ORDER_PROPS'])) {
</tr>
<?php $countProps++; endforeach; ?>
<?if (isset($arResult['customFields']) && count($arResult['customFields']) > 0):?>
<tr class="heading custom-detail-title">
<td colspan="2" style="background-color: transparent;">
<b>
<?=GetMessage('ORDER_CUSTOM'); ?>
</b>
</td>
</tr>
<?foreach($arResult['customFields'] as $customFields):?>
<tr class="custom-detail-<?=$customFields['ID'];?>">
<td width="50%" class="" name="">
<?=$customFields['NAME']; ?>
</td>
<td width="50%" class="">
<select name="custom-fields-<?=$customFields['ID'] . '-' . $bitrixOrderType['ID']?>" class="typeselect">
<option value=""></option>
<?foreach ($arResult['arProp'][$bitrixOrderType['ID']] as $arProp):?>
<option value="<?=$arProp['CODE']?>"
<?= (isset($arResult['CUSTOM_FIELDS'][$bitrixOrderType['ID']][$customFields['ID']])
&& $arResult['CUSTOM_FIELDS'][$bitrixOrderType['ID']][$customFields['ID']]
=== $arProp['CODE'])
? 'selected'
: ''
?>>
<?=$arProp['NAME']?>
</option>
<?php endforeach;?>
</select>
</td>
</tr>
<?php endforeach;?>
<?php endif;?>
<tr id="<?php echo 'locationElement-' . $bitrixOrderType['ID']; ?>" hidden="hidden">
<td class="adm-detail-content-cell-l" width="50%" name="text"><?php echo GetMessage('LOCATION_LABEL'); ?></td>
<td class="adm-detail-content-cell-r" width="50%">
<select class="typeselect">
<option value=""></option>
<?php foreach ($arResult['locationProp'][$bitrixOrderType['ID']] as $arProp): ?>
<option value="<?php echo $arProp['CODE']; ?>"
<?php if ($defaultOrderProps[$bitrixOrderType['ID']]['text'] === $arProp['CODE']) {
echo 'selected';
} ?>
>
<?php echo $arProp['NAME'];?>
</option>
<?php endforeach;?>
</select>
</td>
</tr>
<tr id="<?php echo 'textAddressElement-' . $bitrixOrderType['ID']; ?>" hidden="hidden">
<td class="adm-detail-content-cell-l" width="50%" name="text"><?php echo GetMessage('TEXT_ADDRESS_LABEL'); ?></td>
<td class="adm-detail-content-cell-r" width="50%">
<select class="typeselect">
<option value=""></option>
<?php foreach ($arResult['arProp'][$bitrixOrderType['ID']] as $arProp): ?>
<option value="<?php echo $arProp['CODE']; ?>"
<?php if ($defaultOrderProps[$bitrixOrderType['ID']]['text'] === $arProp['CODE']) {
echo 'selected';
} ?>
>
<?php echo $arProp['NAME']; ?>
</option>
<?php endforeach; ?>
</select>
</td>
</tr>
<tr class="heading legal-detail-title-<?= $bitrixOrderType['ID']?>" style="display:none">
<td colspan="2" style="background-color: transparent;">
<b>

View file

@ -1,6 +1,6 @@
<?php
$arModuleVersion = [
'VERSION' => '6.4.6',
'VERSION_DATE' => '2023-09-07 16:30:00'
'VERSION' => '6.6.11',
'VERSION_DATE' => '2025-03-26 16:00:00'
];

View file

@ -1,4 +0,0 @@
<?php
$MESS["NO_DELIVERY"] = "No delivery";
$MESS["PRICE_TYPE"] = "RetailCRM price";

View file

@ -0,0 +1,3 @@
<?php
$MESS["PICKUP_POINT"] = "Pick-up point: ";

View file

@ -46,3 +46,6 @@ $MESS["UNIT_MEASUREMENT_KG"] = "kg";
$MESS['BASE_PRICE'] = 'Base price';
$MESS['WAIT'] = 'Loading...';
$MESS["OFFERS_VALUE"] = "Maximum number of trade offers for a product";
$MESS["LOAD_NON_ACTIVITY"] = "Unload inactive products, services and trade offers";
$MESS["ADD_PROPERTY"] = "Add property";
$MESS["DELETE_PROPERTY"] = "Delete";

View file

@ -17,3 +17,5 @@ $MESS ['ERR_ARTICLE_IBLOCK'] = 'Articles are not set';
$MESS ['DATE_TIMEZONE_ERR'] = 'Timezone is not specified in php settings.';
$MESS ['SALE_VERSION_ERR'] = '\'Online-store\' module version must be higher than 16.';
$MESS['UF_SUBSCRIBE_USER_EMAIL_TITLE'] = 'Agree to receive promotional newsletters';
$MESS ['CRM_SITES_ERROR'] = 'Failed to get list of CRM stores, please try another API key or contact RetailCRM support.';
$MESS ['ERR_403'] = '<a target="_blank" href="https://docs.retailcrm.ru/Users/Integration/SiteModules/1CBitrix/CreatingOnlineStore1CBitrix">Insufficient permissions for API key. The module must be added for it to work correctly: %s</a>';

View file

@ -11,7 +11,8 @@ $MESS ['ERR_403'] = 'Wrong apiKey.';
$MESS ['ERR_0'] = 'Server connection timeout error.';
$MESS ['ERR_FIELDS_API_HOST'] = 'Fields are filled incorrectly.';
$MESS ['ERR_METHOD_NOT_FOUND'] = 'Check availability of API methods for current key.';
//$MESS ['URL_NOT_FOUND'] = 'One or more sites have empty "server URL" field.';
$MESS ['ERR_EMPTY_SITES_LIST'] = 'At least 1 store must be matched';
$MESS ['ERR_GET_SITE_CRM'] = 'Failed to retrieve CRM store';
$MESS ['INFO_1'] = 'Enter the address of RetailCRM instance (for example, https://demo.retailcrm.ru) and API key.';
$MESS ['INFO_2'] = 'API key can be generated when the store is registered in RetailCRM (Administration > Integration).';
$MESS ['INFO_3'] = 'Store code in 1C-Bitrix must correspond with the store code in RetailCRM (Administration > Stores).';
@ -19,3 +20,5 @@ $MESS ['ERR_COUNT_SITES'] = 'The API Key you entered relates to more than one st
Change the access settings for the API key, it should work with only one store in CRM';
$MESS ['ERR_CURRENCY_SITES'] = 'The currency of the site differs from the currency of the store in CRM.
For the integration to work correctly, the currencies in CRM and CMS must match';
$MESS ['ERR_CMS_CURRENCY'] = 'Failed to get Bitrix site currency';
$MESS ['ERR_CRM_CURRENCY'] = 'Failed to get CRM store currency';

View file

@ -8,7 +8,10 @@ $MESS ['ERR_6'] = 'CRM address may be incorrect.';
$MESS ['ERR_403'] = 'Wrong apiKey.';
$MESS ['ERR_0'] = 'Server connection timeout error.';
$MESS ['ERR_FIELDS_API_HOST'] = 'Fields are filled incorrectly.';
$MESS ['ERR_EMPTY_SITES_LIST'] = 'At least 1 store must be matched';
$MESS ['INFO_1'] = 'Set the correspondence between 1C-Bitrix and RetailCRM stores.';
$MESS ['INFO_2'] = 'All your stores in RetailCRM must have a common API key!';
$MESS ['ERR_CURRENCY_SITES'] = 'The currency of the site differs from the currency of the store in CRM.
For the integration to work correctly, the currencies in CRM and CMS must match';
$MESS ['ERR_CMS_CURRENCY'] = 'Failed to get Bitrix site currency';
$MESS ['ERR_CRM_CURRENCY'] = 'Failed to get CRM store currency';

View file

@ -22,3 +22,5 @@ $MESS ['DELIV_TYPES_EXPORT_F'] = 'Set the correspondence between 1C-Bitrix and R
$MESS ['STATUS_NOT_SETTINGS'] ='Cannot find suitable statuses in Bitrix';
$MESS ['INTEGRATIONS'] = ' (integration)';
$MESS ['INTEGRATION_PAYMENT_LIST'] = 'The status will not be transferred for integration payments';
$MESS ['CRM_ORDER_METHODS'] = 'Transfer of orders from CRM to Bitrix';
$MESS ['CRM_ORDER_METHODS_OPTION'] = 'Upload orders using selected methods from RetailCRM';

View file

@ -27,3 +27,6 @@ $MESS ['BLOCK'] = 'Block';
$MESS ['HOUSE'] = 'House';
$MESS ['ADDRESS_SHORT'] = 'Short address';
$MESS ['ADDRESS_FULL'] = 'Detailed address';
$MESS ['LOCATION_LABEL'] = 'Location';
$MESS ['TEXT_ADDRESS_LABEL'] = 'Address (line)';

View file

@ -12,6 +12,8 @@ $MESS ['DELIVERY_TYPES_LIST'] = 'Delivery types';
$MESS ['PAYMENT_TYPES_LIST'] = 'Payment types';
$MESS ['PAYMENT_STATUS_LIST'] = 'Statuses';
$MESS ['ORDER_TYPES_LIST'] = 'Order types';
$MESS ['CRM_ORDER_METHODS'] = 'Transfer of orders from CRM to Bitrix';
$MESS ['CRM_ORDER_METHODS_OPTION'] = 'Upload orders using selected methods from RetailCRM';
$MESS ['CONTRAGENTS_TYPES_LIST'] = 'Contragent type';
$MESS ['PAYMENT_LIST'] = 'Payment';
$MESS ['PAYMENT_Y'] = 'Paid';
@ -21,12 +23,15 @@ $MESS ['ORDER_CUSTOM'] = 'Custom fields';
$MESS ['COUPON_CUSTOM_FIELD'] = 'Select a custom field in the CRM to transfer the applied coupon in the Bitrix order';
$MESS ['SELECT_VALUE'] = '-- Select a value --';
$MESS ['ORDER_UPLOAD'] = 'Re-upload orders';
$MESS ['LP_WARNING'] = 'Loyalty program of RetailCRM is available only with the “Uploading orders by event” options active';
$MESS ['ORDER_NUMBER'] = 'Order numbers: ';
$MESS ['ORDER_UPLOAD_INFO'] = 'Click "Start uploading" to upload all the orders . Or list the required order IDs separated by commas, intervals or dashes. For example: 1, 3, 5-10, 12, 13... etc.';
$MESS ['ICRM_OPTIONS_SUBMIT_TITLE'] = 'Save settings';
$MESS ['ICRM_OPTIONS_SUBMIT_VALUE'] = 'Save';
$MESS ['ERR_403_LABEL'] = 'The module must be added for it to work correctly: %s';
$MESS ['ERR_404'] = 'CRM address may be incorrect.';
$MESS ['ERR_403'] = 'Wrong apiKey.';
$MESS ['ERR_403'] = '<a target="_blank" href="https://docs.retailcrm.ru/Users/Integration/SiteModules/1CBitrix/CreatingOnlineStore1CBitrix">Insufficient permissions for API key. %s</a>';
$MESS ['ERR_403_CUSTOM'] = 'Not enough permissions for API key!';
$MESS ['ERR_JSON'] = 'Invalid data was received from CRM, check data books settings';
$MESS ['ERR_0'] = 'Server connection timeout error.';
$MESS ['ICRM_OPTIONS_OK'] = 'Changes are successfully saved.';
@ -37,6 +42,7 @@ $MESS ['ICRM_OPTIONS_ORDER_DISCHARGE_TAB'] = 'Orders uploading mode';
$MESS ['ORDER_DISCH'] = 'Orders uploading mode';
$MESS ['DISCHARGE_AGENT'] = 'Upload orders using agent';
$MESS ['DISCHARGE_EVENTS'] = 'Upload orders by events';
$MESS ['DISCHARGE_WITHOUT_UPDATE'] = 'Upload orders by agent (without update)';
$MESS ['INFO_2'] = ' Set the correspondence between 1C-Bitrix and RetailCRM order fields.';
$MESS ['ORDER_PROPS'] = 'Correspondence settings between RetailCRM order fields and 1C-Bitrix order properties';
$MESS ['FIO'] = 'Full name';
@ -68,6 +74,8 @@ $MESS ['ORDER_NUMBERS'] = 'Transferring order numbers to the store for orders cr
$MESS ['ORDER_VAT'] = 'Transfer VAT of goods';
$MESS ['CRM_API_VERSION'] = 'API version';
$MESS ['CURRENCY'] = 'Currency set in the order when uploading from CRM';
$MESS ['SEND_PICKUP_POINT_ADDRESS'] = 'Transfer the pick-up point';
$MESS ['SEND_PICKUP_POINT_ADDRESS_WARNING'] = 'Important! The address of the pick-up point is correctly transmitted with one shipment added in the 1C-Bitrix order. If you have more than one shipment added, only the first one will be transmitted.';
$MESS ['ORDER_DIMENSIONS'] = 'Send dimensions and weight of the products in the order';
$MESS ['SEND_PAYMENT_AMOUNT'] = 'Send payment amount in the order';
$MESS ['INVENTORIES_UPLOAD'] = 'Enable leftovers uploading by warehouse';
@ -103,10 +111,54 @@ $MESS ['INTEGRATIONS'] = ' (integration)';
$MESS ['ERR_COUNT_SITES'] = 'The API Key you entered relates to more than one store.
Change the access settings for the API key, it should work with only one store in CRM';
$MESS ['ERR_CURRENCY_SITES'] = 'The currency of the site differs from the currency of the store in CRM.
For the integration to work correctly, the currencies in CRM and CMS must match';
For the integration to work correctly, the currencies in CRM and CMS must match #NAME#';
$MESS ['ERR_CMS_CURRENCY'] = 'Failed to get Bitrix site currency';
$MESS ['ERR_CRM_CURRENCY'] = 'Failed to get CRM store currency';
$MESS ['CRM_STORE'] = 'CRM store: ';
$MESS ['ACTIVITY_SETTINGS'] = 'Module activity settings';
$MESS ['DEACTIVATE_MODULE'] = 'Deactivate the module';
$MESS ['WRONG_CREDENTIALS'] = 'Enter the address and authorization key of the CRM system';
$MESS ['Wrong "apiKey" value.'] = 'Invalid authorization key';
$MESS ['ORDER_TRACK_NUMBER'] = 'Receive track number';
$MESS ['CUSTOM_FIELDS_TITLE'] = 'User fields';
$MESS ['CUSTOM_FIELDS_CAPTION'] = 'Matching user fields';
$MESS ['CUSTOM_FIELDS_TOGGLE_MSG'] = 'Activate synchronization of user fields';
$MESS ['CUSTOM_FIELDS_ORDER_LABEL'] = 'Custom order fields';
$MESS ['CUSTOM_FIELDS_USER_LABEL'] = 'User custom fields';
$MESS ['INTEGER_TYPE'] = 'An integer';
$MESS ['STRING_TYPE'] = 'Line/Text';
$MESS ['NUMERIC_TYPE'] = 'Number';
$MESS ['BOOLEAN_TYPE'] = 'Check box (yes/no)';
$MESS ['DATE_TYPE'] = 'Date';
$MESS ['NOTATION_CUSTOM_FIELDS'] = 'Before enabling this functionality, make sure that you do not have customized files for working with orders and customers associated with older versions of the module.';
$MESS ['NOTATION_MATCHED_CUSTOM_FIELDS'] = 'For correct data exchange, the types of matched fields must be the same!';
$MESS ['ADD_LABEL'] = 'Add';
$MESS ['DELETE_MATCHED'] = 'Delete';
$MESS ['LOCATION_LABEL'] = 'Location';
$MESS ['TEXT_ADDRESS_LABEL'] = 'Address (line)';
$MESS ['SYNC_INTEGRATION_PAYMENT'] = 'Activate transfer of integration payment statuses';
$MESS ['DESCRIPTION_AUTO_PAYMENT_TYPE'] = 'Automatically created payment type for integration substitution (Bitrix)';
$MESS ['NO_INTEGRATION_PAYMENT'] = '(Non-integrated)';
$MESS ['ERR_CHECK_JOURNAL'] = 'Error while saving. Details in the event log';
$MESS ['ERROR_LINK_INTEGRATION_PAYMENT'] = 'Error in comparing integration payments';
$MESS ['ERROR_UPDATE_PAYMENT_TYPES_DELIVERY'] = 'Error when updating payment methods for deliveries';
$MESS ['INTEGRATION_PAYMENT_LABEL'] = 'When correlating CMS and CRM integration payments, a regular payment is created on the system side to which orders will be linked. <br> If you have integration deliveries in your CRM, then you need to enable the new payment method in the integration settings';
$MESS ['NEED_PERMISSIONS_REFERENCE_LABEL'] = 'For this option to work correctly, the api key needs access to receive and edit reference book';
$MESS ['FIX_UPLOAD_CUSTOMER_HEADER'] = 'Fix customer registration date in CRM';
$MESS ['FIX_UPLOAD_CUSTOMER_BUTTON_LABEL'] = 'Correct customer registration date in CRM';
$MESS ['FIX_UPLOAD_CUSTOMER_INFO'] = 'When you press this button, an agent will be created to launch the script. Please note that the script execution time may vary depending on the number of clients in the database. To minimize possible disruptions to the script operation, it is recommended to launch it at night time. This script can only be launched once';
$MESS ['FIX_UPLOAD_CUSTOMER_AFTER_SUBMIT'] = 'The agent has been created and will be launched soon';
$MESS ['FIX_UPLOAD_CUSTOMER_AFTER_SUBMIT_ERROR'] = 'An error occurred while adding an agent';
$MESS ['ICRM_OPTIONS_GENERAL_CAPTION'] = 'Setting up connection to the RetailCRM system';
$MESS ['ICRM_OPTIONS_CATALOG_CAPTION'] = 'Comparison of RetailCRM and Bitrix system directories';
$MESS ['ICRM_OPTIONS_ORDER_PROPS_CAPTION'] = 'Comparison of order fields of RetailCRM and Bitrix systems';
$MESS ['ICRM_OPTIONS_LOYALTY_PROGRAM_CAPTION'] = 'Setting up work with the loyalty program';
$MESS ['ICRM_OPTIONS_OTHER_CAPTION'] = 'Setting up additional options for integration with the RetailCRM system';

View file

@ -1,4 +0,0 @@
<?php
$MESS["NO_DELIVERY"] = "Без доставки";
$MESS["PRICE_TYPE"] = "Цена RetailCRM";

View file

@ -0,0 +1,3 @@
<?php
$MESS["PICKUP_POINT"] = "Пункт самовывоза: ";

View file

@ -7,7 +7,7 @@ $MESS["CATALOG"] = "Каталог";
$MESS["EXPORT2INTAROCML"] = "Выгрузить в ICML";
$MESS["FILENAME"] = "Укажите имя файла данных:";
$MESS["LOAD_PURCHASE_PRICE"] = "Выгружать закупочную цену";
$MESS["LOAD_NON_ACTIVITY"] = "Выгружать неактивные товары и торговые предложения";
$MESS["LOAD_NON_ACTIVITY"] = "Выгружать неактивные товары, услуги и торговые предложения";
$MESS["PROPERTY"] = "Свойство, содержащее артикул товара";
$MESS["ALL_CATALOG"] = "Все каталоги";
$MESS["EXPORT"] = "Экспортировать";
@ -47,3 +47,5 @@ $MESS["UNIT_MEASUREMENT_KG"] = "кг.";
$MESS['BASE_PRICE'] = 'Базовая цена';
$MESS['WAIT'] = 'Загрузка...';
$MESS["OFFERS_VALUE"] = "Максимальное количество торговых предложений у товара";
$MESS["ADD_PROPERTY"] = "Добавить свойство";
$MESS["DELETE_PROPERTY"] = "Удалить";

View file

@ -16,6 +16,7 @@ $MESS ['DATE_TIMEZONE_ERR'] = 'Не указана временная зона
$MESS ['SALE_VERSION_ERR'] = 'Версия модуля \'Интернет-магазин\' должна быть выше 16.';
$MESS ['AGREEMENT_LOYALTY_PROGRAM_TEXT'] = 'Вставить текст Правил программы лояльности';
$MESS ['AGREEMENT_PERSONAL_DATA_TEXT'] = 'Вставить текст соглашения на обработку персональных данных';
$MESS ['CRM_SITES_ERROR'] = 'Не удалось получить список магазинов CRM, попробуйте другой ключ API или обратитесь в службу поддержки RetailCRM.';
$MESS ['RETAIL_MODULE_NAME'] = 'RetailCRM';
$MESS ['MODULE_DESCRIPTION'] = 'Модуль интеграции с RetailCRM - специализированной CRM для e-commerce';
@ -55,4 +56,4 @@ $MESS ['UF_LP_ID_INTARO_TITLE'] = 'Номер аккаунта в програм
$MESS['IBLOCK_NOT_SELECTED'] = 'Не выбрано ни одного инфоблока для экспорта';
$MESS['TARGET_DIR_DOESNT_EXIST'] = 'Целевая директория не существует';
$MESS['UF_SUBSCRIBE_USER_EMAIL_TITLE'] = 'Согласен на рекламно-информационные рассылки';
$MESS ['ERR_403'] = '<a target="_blank" href="https://docs.retailcrm.ru/Users/Integration/SiteModules/1CBitrix/CreatingOnlineStore1CBitrix">Недостаточно прав для API ключа. Для корректной работы модуля необходимо добавить: %s</a>';

View file

@ -11,11 +11,14 @@ $MESS ['ERR_403'] = 'Неверный apiKey.';
$MESS ['ERR_0'] = 'Превышено время ожидания ответа от сервера.';
$MESS ['ERR_FIELDS_API_HOST'] = 'Неверно заполнены поля.';
$MESS ['ERR_METHOD_NOT_FOUND'] = 'Проверьте доступность методов API по текущему ключу.';
$MESS ['ERR_EMPTY_SITES_LIST'] = 'Необходимо соотнести по крайней мере 1 магазин';
$MESS ['ERR_COUNT_SITES'] = 'Введенный вами API Ключ относится более чем к одному магазину.
Измените настройки доступа для API ключа, он должен работать только с одним магазином в CRM';
$MESS ['ERR_CURRENCY_SITES'] = 'Валюта сайта отличается от валюты магазина в CRM.
Для корректной работы интеграции, валюты в CRM и CMS должны совпадать';
//$MESS ['URL_NOT_FOUND'] = 'В настройках одного или нескольких сайтов не заполнено поле "URL сервера".';
$MESS ['ERR_CMS_CURRENCY'] = 'Не удалось получить валюту сайта Bitrix';
$MESS ['ERR_CRM_CURRENCY'] = 'Не удалось получить валюту магазина CRM';
$MESS ['ERR_GET_SITE_CRM'] = 'Не удалось получить магазин CRM';
$MESS ['INFO_1'] = 'Введите адрес экземпляра RetailCRM (например, https://demo.retailcrm.ru) и API-ключ.';
$MESS ['INFO_2'] = 'API-ключ можно сгенерировать при регистрации магазина в RetailCRM (Администрирование > Интеграция).';
$MESS ['INFO_3'] = 'Код сайта в 1С-Битрикс должен совпадать с кодом сайта в RetailCRM (Администрирование > Магазины).';

View file

@ -8,7 +8,10 @@ $MESS ['ERR_6'] = 'Возможно неверно введен адрес Retai
$MESS ['ERR_403'] = 'Неверный apiKey.';
$MESS ['ERR_0'] = 'Превышено время ожидания ответа от сервера.';
$MESS ['ERR_FIELDS_API_HOST'] = 'Неверно заполнены поля.';
$MESS ['ERR_EMPTY_SITES_LIST'] = 'Необходимо соотнести по крайней мере 1 магазин';
$MESS ['INFO_1'] = 'Задайте соответствия между Вашими магазинами в 1С-Битрикс и RetailCRM.';
$MESS ['INFO_2'] = 'У всех Ваших магазинов в RetailCRM должен быть общий API-ключ!';
$MESS ['ERR_CURRENCY_SITES'] = 'Валюта сайта отличается от валюты магазина в CRM.
Для корректной работы интеграции, валюты в CRM и CMS должны совпадать';
Для корректной работы интеграции, валюты в CRM и CMS должны совпадать';
$MESS ['ERR_CMS_CURRENCY'] = 'Не удалось получить валюту сайта Bitrix';
$MESS ['ERR_CRM_CURRENCY'] = 'Не удалось получить валюту магазина CRM';

View file

@ -22,3 +22,5 @@ $MESS ['DELIV_TYPES_EXPORT_F'] = 'Настроить соответствие д
$MESS ['STATUS_NOT_SETTINGS'] ='Не найдены подходящие статусы в Битрикс';
$MESS ['INTEGRATIONS'] = ' (интеграционная)';
$MESS ['INTEGRATION_PAYMENT_LIST'] = 'Для интеграционных оплат статус не передаётся';
$MESS ['CRM_ORDER_METHODS'] = 'Передача заказов из CRM в Битрикс';
$MESS ['CRM_ORDER_METHODS_OPTION'] = 'Выгружать из RetailCRM заказы оформленные выбранными способами';

View file

@ -28,3 +28,6 @@ $MESS ['BLOCK'] = 'Подъезд';
$MESS ['HOUSE'] = 'Строение / корпус';
$MESS ['ADDRESS_SHORT'] = 'Краткий адрес';
$MESS ['ADDRESS_FULL'] = 'Детальный адрес';
$MESS ['LOCATION_LABEL'] = 'Местоположение (LOCATION)';
$MESS ['TEXT_ADDRESS_LABEL'] = 'Адрес (строкой)';

View file

@ -8,11 +8,21 @@ $MESS ['ICRM_API_HOST'] = 'Адрес RetailCRM:';
$MESS ['ICRM_API_KEY'] = 'Ключ авторизации:';
$MESS ['ICRM_SITES'] = 'Активные сайты';
$MESS ['ICRM_OPTIONS_GENERAL_CAPTION'] = 'Настройка подключения к системе RetailCRM';
$MESS ['ICRM_OPTIONS_CATALOG_CAPTION'] = 'Сопоставление справочников системы RetailCRM и Bitrix';
$MESS ['ICRM_OPTIONS_ORDER_PROPS_CAPTION'] = 'Сопоставление полей заказа системы RetailCRM и Bitrix';
$MESS ['ICRM_OPTIONS_LOYALTY_PROGRAM_CAPTION'] = 'Настройка работы с программой лояльности';
$MESS ['ICRM_OPTIONS_OTHER_CAPTION'] = 'Настройка дополнительных опций интеграции c системой RetailCRM';
$MESS ['ICRM_OPTIONS_CATALOG_TAB'] = 'Настройка справочников';
$MESS ['DELIVERY_TYPES_LIST'] = 'Способы доставки';
$MESS ['PAYMENT_TYPES_LIST'] = 'Способы оплаты';
$MESS ['PAYMENT_STATUS_LIST'] = 'Статусы';
$MESS ['ORDER_TYPES_LIST'] = 'Типы заказа';
$MESS ['CRM_ORDER_METHODS'] = 'Передача заказов из CRM в Битрикс';
$MESS ['LP_WARNING'] = 'Программа лояльности RetailCRM доступна только при активной опции "Выгрузка заказов по событию"';
$MESS ['CRM_ORDER_METHODS_OPTION'] = 'Выгружать из RetailCRM заказы оформленные выбранными способами';
$MESS ['CONTRAGENTS_TYPES_LIST'] = 'Тип контрагента';
$MESS ['PAYMENT_LIST'] = 'Оплата';
$MESS ['PAYMENT_Y'] = 'Оплачен';
@ -31,12 +41,17 @@ $MESS ['ERR_COUNT_SITES'] = 'Введенный вами API Ключ относ
Измените настройки доступа для API ключа, он должен работать только с одним магазином в CRM';
$MESS ['ERR_CURRENCY_SITES'] = 'Валюта сайта отличается от валюты магазина в CRM.
Для корректной работы интеграции, валюты в CRM и CMS должны совпадать';
$MESS ['ERR_CMS_CURRENCY'] = 'Не удалось получить валюту сайта Bitrix';
$MESS ['ERR_CRM_CURRENCY'] = 'Не удалось получить валюту магазина CRM';
$MESS ['CRM_STORE'] = 'CRM магазин: ';
$MESS ['ICRM_OPTIONS_SUBMIT_TITLE'] = 'Сохранить настройки';
$MESS ['ICRM_OPTIONS_SUBMIT_VALUE'] = 'Сохранить';
$MESS ['ERR_403_LABEL'] = 'Для корректной работы модуля необходимо добавить: %s';
$MESS ['ERR_404'] = 'Возможно не верно введен адрес CRM.';
$MESS ['ERR_403'] = 'Неверный apiKey.';
$MESS ['ERR_403'] = '<a target="_blank" href="https://docs.retailcrm.ru/Users/Integration/SiteModules/1CBitrix/CreatingOnlineStore1CBitrix">Недостаточно прав для API ключа. %s</a>';
$MESS ['ERR_403_CUSTOM'] = 'Недостаточно прав для API ключа!';
$MESS ['ERR_JSON'] = 'Получены некорректные данные из CRM, проверьте данные справочников в настройках';
$MESS ['ERR_0'] = 'Превышено время ожидания ответа от сервера.';
$MESS ['ICRM_OPTIONS_OK'] = 'Изменения успешно сохранены.';
@ -48,7 +63,7 @@ $MESS ['ICRM_OPTIONS_ORDER_DISCHARGE_TAB'] = 'Режим выгрузки зак
$MESS ['ORDER_DISCH'] = 'Режим выгрузки заказов';
$MESS ['DISCHARGE_AGENT'] = 'Выгрузка заказов с помощью агента';
$MESS ['DISCHARGE_EVENTS'] = 'Выгрузка заказов по событию';
$MESS ['DISCHARGE_WITHOUT_UPDATE'] = 'Выгрузка заказов по агенту (только создание заказов)';
$MESS ['INFO_2'] = ' Задайте соответствие между полями заказа 1C-Битрикс и RetailCRM.';
$MESS ['ORDER_PROPS'] = 'Настройки соответствия полей заказа RetailCRM свойствам заказа 1С-Битрикс';
@ -89,6 +104,8 @@ $MESS ['ORDER_VAT'] = 'Передавать НДС товаров';
$MESS ['CRM_API_VERSION'] = 'Версия API клиента';
$MESS ['CURRENCY'] = 'Валюта, устанавливаемая в заказе при выгрузке из CRM';
$MESS ['ORDER_DIMENSIONS'] = 'Передавать габариты и вес товаров в заказе';
$MESS ['SEND_PICKUP_POINT_ADDRESS'] = 'Передавать пункт самовывоза';
$MESS ['SEND_PICKUP_POINT_ADDRESS_WARNING'] = 'Важно! Адрес пункта самовывоза корректно передается при одной добавленной отгрузке в заказе 1C-Bitrix. Если у вас добавлено более одной отгрузки, будет передана только первая.';
$MESS ['SEND_PAYMENT_AMOUNT'] = 'Передавать сумму оплаты в заказе';
$MESS ['INVENTORIES_UPLOAD'] = 'Включить выгрузку остатков в разрезе складов';
@ -169,3 +186,38 @@ $MESS ['DEACTIVATE_MODULE'] = 'Деактивировать модуль';
$MESS ['WRONG_CREDENTIALS'] = 'Введите адрес и ключ авторизации CRM системы';
$MESS ['Wrong "apiKey" value.'] = 'Недействительный ключ авторизации';
$MESS ['ORDER_TRACK_NUMBER'] = 'Получать трек-номер';
$MESS ['CUSTOM_FIELDS_TITLE'] = 'Пользовательские поля';
$MESS ['CUSTOM_FIELDS_CAPTION'] = 'Сопоставление пользовательских полей';
$MESS ['CUSTOM_FIELDS_TOGGLE_MSG'] = 'Активировать синхронизацию пользовательских полей';
$MESS ['CUSTOM_FIELDS_ORDER_LABEL'] = 'Пользовательские поля заказа';
$MESS ['CUSTOM_FIELDS_USER_LABEL'] = 'Пользовательские поля клиента';
$MESS ['INTEGER_TYPE'] = 'Целое число';
$MESS ['STRING_TYPE'] = 'Строка/Текст';
$MESS ['NUMERIC_TYPE'] = 'Число';
$MESS ['BOOLEAN_TYPE'] = 'Флажок (да/нет)';
$MESS ['DATE_TYPE'] = 'Дата';
$MESS ['NOTATION_CUSTOM_FIELDS'] = 'Перед подключением данного функционала, убедитесь, что у вас нет кастомизированных файлов по работе с заказами и клиентами, связанных со старыми версиями модуля.';
$MESS ['NOTATION_MATCHED_CUSTOM_FIELDS'] = 'Для корректного обмена данными типы сопоставляемых полей должны быть одинаковыми!';
$MESS ['ADD_LABEL'] = 'Добавить';
$MESS ['DELETE_MATCHED'] = 'Удалить';
$MESS ['LOCATION_LABEL'] = 'Местоположение (LOCATION)';
$MESS ['TEXT_ADDRESS_LABEL'] = 'Адрес (строкой)';
$MESS ['SYNC_INTEGRATION_PAYMENT'] = 'Активировать передачу статусов интеграционных оплат';
$MESS ['DESCRIPTION_AUTO_PAYMENT_TYPE'] = 'Автоматически созданный тип оплаты для подмены интеграционной (Bitrix)';
$MESS ['NO_INTEGRATION_PAYMENT'] = '(Не интеграционная)';
$MESS ['ERR_CHECK_JOURNAL'] = 'Ошибка при сохранении. Подробности в журнале событий';
$MESS ['ERROR_LINK_INTEGRATION_PAYMENT'] = 'Ошибка при сопоставлении интеграционных оплат';
$MESS ['ERROR_UPDATE_PAYMENT_TYPES_DELIVERY'] = 'Ошибка при обновлении способов оплаты для доставок';
$MESS ['INTEGRATION_PAYMENT_LABEL'] = 'При сопоставлении интеграционных оплат CRM, на стороне системы создаётся обычная оплата, к которой будут привязываться заказы. <br> Если в вашей CRM используются интеграционные доставки, новый способ оплаты необходимо вручную активировать в настройках интеграций.';
$MESS ['NEED_PERMISSIONS_REFERENCE_LABEL'] = 'Для корректной работы опции апи-ключу необходимы доступы на получение и редактирование справочников';
$MESS ['FIX_UPLOAD_CUSTOMER_HEADER'] = 'Исправление даты регистрации клиентов в CRM';
$MESS ['FIX_UPLOAD_CUSTOMER_BUTTON_LABEL'] = 'Исправить дату регистрации клиентов в CRM';
$MESS ['FIX_UPLOAD_CUSTOMER_INFO'] = 'При нажатии на эту кнопку будет создан агент для запуска скрипта. Обратите внимание, что время выполнения скрипта может варьироваться в зависимости от количества клиентов в базе данных. Для минимизации возможных нарушений в работе скрипта рекомендуется запускать его в ночное время. Этот скрипт может быть запущен только один раз.';
$MESS ['FIX_UPLOAD_CUSTOMER_AFTER_SUBMIT'] = 'Агент создан и запустится в ближайшее время';
$MESS ['FIX_UPLOAD_CUSTOMER_AFTER_SUBMIT_ERROR'] = 'Возникла ошибка при добавлении агента';

View file

@ -0,0 +1,113 @@
<?php
namespace Intaro\RetailCrm\Component\Advanced;
use Bitrix\Main\ArgumentException;
use Bitrix\Main\EventManager;
use Bitrix\Main\ObjectPropertyException;
use Bitrix\Main\SystemException;
use Bitrix\Main\Type\DateTime;
use CUserTypeEntity;
use Intaro\RetailCrm\Component\Constants;
trait InstallerTrait
{
public function installExport()
{
$pathFrom = $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/' . Constants::MODULE_ID . '/install';
CopyDirFiles(
$pathFrom . '/export/bitrix/php_interface/include/catalog_export',
$_SERVER['DOCUMENT_ROOT'] . '/bitrix/php_interface/include/catalog_export',
true,
true,
false
);
$pathFrom = $_SERVER['DOCUMENT_ROOT'] .
'/bitrix/modules/' .
Constants::MODULE_ID .
'/install/export/bitrix/js/intaro/export'
;
CopyDirFiles(
$pathFrom,
$_SERVER['DOCUMENT_ROOT'] . '/bitrix/js/intaro/export/',
true,
true,
false
);
}
public function subscriptionSetup()
{
$pathFrom = $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/' . Constants::MODULE_ID . '/install';
CopyDirFiles(
$pathFrom . '/export/sub-register',
$_SERVER['DOCUMENT_ROOT'] . '/sub-register',
true,
true,
false
);
$templateNames = [
'default_subscribe' => [
0 => [
'name' => 'sale.personal.section',
'templateDirectory' => '.default'
],
1 => [
'name' => 'main.register',
'templateDirectory' => '.default_subscribe'
]
]
];
foreach ($templateNames as $directory => $templates) {
foreach ($templates as $template) {
$this->copy($directory, $template);
}
}
$property = [
'ENTITY_ID' => 'USER',
'FIELD_NAME' => 'UF_SUBSCRIBE_USER_EMAIL',
'USER_TYPE_ID' => 'boolean',
'MULTIPLE' => 'N',
'MANDATORY' => 'N',
'EDIT_FORM_LABEL' => ['ru' => GetMessage('UF_SUBSCRIBE_USER_EMAIL_TITLE')],
];
$obUserField = new CUserTypeEntity();
$dbRes = CUserTypeEntity::GetList([], ['FIELD_NAME' => 'UF_SUBSCRIBE_USER_EMAIL'])->fetch();
if (!$dbRes['ID']) {
$obUserField->Add($property);
}
}
private function copy($directory, $template): void
{
$templatePath = $_SERVER['DOCUMENT_ROOT']
. '/local/templates/.default/components/bitrix/' . $template['name'] . '/'. $directory
;
if (!file_exists($templatePath)) {
$pathFrom = $_SERVER['DOCUMENT_ROOT']
. '/bitrix/modules/intaro.retailcrm/install/export/local/components/intaro/'
. $template['name']
. '/templates/' . $template['templateDirectory']
;
CopyDirFiles(
$pathFrom,
$templatePath,
true,
true,
false
);
}
}
}

View file

@ -1,6 +1,6 @@
<?php
namespace Intaro\RetailCrm\Component\Installer;
namespace Intaro\RetailCrm\Component\Advanced;
use Bitrix\Main\ArgumentException;
use Bitrix\Main\EventManager;
@ -17,7 +17,7 @@ use RCrmActions;
IncludeModuleLangFile(__FILE__);
trait InstallerTrait
class LoyaltyInstaller
{
/**
* Создание событий для программы лояльности
@ -67,7 +67,7 @@ trait InstallerTrait
CopyDirFiles(
$pathFrom . '/export',
$_SERVER['DOCUMENT_ROOT'],
true,
false,
true,
false
);
@ -86,17 +86,6 @@ trait InstallerTrait
'name' => 'main.register',
'templateDirectory' => '.default'
],
],
'default_subscribe' => [
0 => [
'name' => 'sale.personal.section',
'templateDirectory' => '.default'
],
1 => [
'name' => 'main.register',
'templateDirectory' => '.default_subscribe'
]
]
];
@ -108,7 +97,7 @@ trait InstallerTrait
}
/**
* Добавление полей пользователя для ПЛ и подписки
* Добавление полей пользователя для ПЛ
*/
public function addUserFields(): void
{
@ -150,10 +139,6 @@ trait InstallerTrait
[
'name' => 'UF_EXT_REG_PL_INTARO',
'title' => GetMessage('UF_EXT_REG_PL_INTARO_TITLE'),
],
[
'name' => 'UF_SUBSCRIBE_USER_EMAIL',
'title' => GetMessage('UF_SUBSCRIBE_USER_EMAIL_TITLE')
]
]
);
@ -176,9 +161,10 @@ trait InstallerTrait
'EDIT_FORM_LABEL' => ['ru' => $filed['title']],
];
$props = array_merge($arProps, $customProps);
$obUserField = new CUserTypeEntity();
$dbRes = CUserTypeEntity::GetList([], ['FIELD_NAME' => $filed['name']])->fetch();
$dbRes = CUserTypeEntity::GetList([], ['FIELD_NAME' => $filed['name']])->fetch();
if (!$dbRes['ID']) {
$obUserField->Add($props);
@ -235,7 +221,7 @@ trait InstallerTrait
/**
* delete loyalty program events handlers
*/
private function deleteLPEvents(): void
public function deleteLPEvents(): void
{
$eventManager = EventManager::getInstance();
@ -243,7 +229,7 @@ trait InstallerTrait
$eventManager->unRegisterEventHandler(
$event['FROM_MODULE'],
$event['EVENT_NAME'],
$this->MODULE_ID,
Constants::MODULE_ID,
EventsHandlers::class,
$event['EVENT_NAME'].'Handler'
);
@ -266,10 +252,10 @@ trait InstallerTrait
CopyDirFiles(
$pathFrom,
$templatePath,
true,
false,
true,
false
);
}
}
}
}

View file

@ -1,8 +1,6 @@
<?php
/**
* PHP version 7.1
*
* @category Integration
* @package Intaro\RetailCrm\Component\ApiClient
* @author RetailCRM <integration@retailcrm.ru>

View file

@ -1,8 +1,6 @@
<?php
/**
* PHP version 7.1
*
* @category Integration
* @package Intaro\RetailCrm\Component\ApiClient
* @author RetailCRM <integration@retailcrm.ru>

View file

@ -1,7 +1,5 @@
<?php
/**
* PHP version 8.0
*
* @category Integration
* @package Intaro\RetailCrm\Component\ApiClient
* @author RetailCRM <integration@retailcrm.ru>

Some files were not shown because too many files have changed in this diff Show more