2020-09-25 12:17:29 +03:00
|
|
|
|
<?php
|
|
|
|
|
|
2022-03-02 15:40:53 +03:00
|
|
|
|
use Bitrix\Highloadblock as HL;
|
2021-09-08 10:05:09 +03:00
|
|
|
|
use Bitrix\Main;
|
2022-03-02 15:40:53 +03:00
|
|
|
|
use Bitrix\Main\Context;
|
|
|
|
|
use Bitrix\Main\EventManager;
|
|
|
|
|
use Bitrix\Main\Loader;
|
2024-10-23 17:05:39 +03:00
|
|
|
|
use Bitrix\Main\Config\Option;
|
2021-09-08 10:05:09 +03:00
|
|
|
|
use Bitrix\Main\Localization\Loc;
|
2022-03-02 15:40:53 +03:00
|
|
|
|
use Bitrix\Main\ORM\Fields\DatetimeField;
|
|
|
|
|
use Bitrix\Main\ORM\Fields\IntegerField;
|
|
|
|
|
use Bitrix\Main\ORM\Fields\StringField;
|
2021-09-08 10:05:09 +03:00
|
|
|
|
use Bitrix\Main\ORM\Objectify\EntityObject;
|
2022-03-02 15:40:53 +03:00
|
|
|
|
use Bitrix\Main\Type\DateTime;
|
|
|
|
|
use Bitrix\Main\UserConsent\Internals\AgreementTable;
|
|
|
|
|
use Bitrix\Sale\Internals\OrderPropsGroupTable;
|
|
|
|
|
use Bitrix\Sale\Internals\OrderPropsTable;
|
|
|
|
|
use Bitrix\Sale\Internals\PersonTypeTable;
|
2020-09-25 12:17:29 +03:00
|
|
|
|
|
2021-09-08 10:05:09 +03:00
|
|
|
|
/**
|
2022-03-02 15:40:53 +03:00
|
|
|
|
* Class ToModuleTable
|
|
|
|
|
*
|
|
|
|
|
* Fields:
|
|
|
|
|
* <ul>
|
|
|
|
|
* <li> ID int mandatory
|
|
|
|
|
* <li> TIMESTAMP_X datetime mandatory default 'CURRENT_TIMESTAMP'
|
|
|
|
|
* <li> SORT int optional default 100
|
|
|
|
|
* <li> FROM_MODULE_ID string(50) mandatory
|
|
|
|
|
* <li> MESSAGE_ID string(255) mandatory
|
|
|
|
|
* <li> TO_MODULE_ID string(50) mandatory
|
|
|
|
|
* <li> TO_PATH string(255) optional
|
|
|
|
|
* <li> TO_CLASS string(255) optional
|
|
|
|
|
* <li> TO_METHOD string(255) optional
|
|
|
|
|
* <li> TO_METHOD_ARG string(255) optional
|
|
|
|
|
* <li> VERSION int optional
|
|
|
|
|
* <li> UNIQUE_ID string(32) mandatory
|
|
|
|
|
* </ul>
|
|
|
|
|
*
|
|
|
|
|
* @package Bitrix\Module
|
|
|
|
|
**/
|
|
|
|
|
class ToModuleTable extends Main\Entity\DataManager
|
2021-09-08 10:05:09 +03:00
|
|
|
|
{
|
2022-03-02 15:40:53 +03:00
|
|
|
|
/**
|
|
|
|
|
* Returns DB table name for entity.
|
|
|
|
|
*
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public static function getTableName(): string
|
|
|
|
|
{
|
|
|
|
|
return 'b_module_to_module';
|
|
|
|
|
}
|
2020-09-25 12:17:29 +03:00
|
|
|
|
|
2022-03-02 15:40:53 +03:00
|
|
|
|
/**
|
|
|
|
|
* Returns entity map definition.
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
* @throws \Bitrix\Main\SystemException
|
|
|
|
|
*/
|
|
|
|
|
public static function getMap(): array
|
|
|
|
|
{
|
|
|
|
|
return [
|
|
|
|
|
new IntegerField(
|
|
|
|
|
'id',
|
2024-10-23 17:05:39 +03:00
|
|
|
|
['primary' => true, 'autocomplete' => true]
|
|
|
|
|
),
|
2022-03-02 15:40:53 +03:00
|
|
|
|
new DatetimeField('TIMESTAMP_X', ['required' => true]),
|
|
|
|
|
new IntegerField('sort'),
|
|
|
|
|
new StringField(
|
|
|
|
|
'from_module_id',
|
|
|
|
|
['required' => true, 'validation' => [__CLASS__, 'validateFromModuleId']]
|
|
|
|
|
),
|
|
|
|
|
new StringField(
|
|
|
|
|
'message_id',
|
|
|
|
|
['required' => true, 'validation' => [__CLASS__, 'validateMessageId']]
|
|
|
|
|
),
|
|
|
|
|
new StringField(
|
|
|
|
|
'to_module_id',
|
|
|
|
|
['required' => true, 'validation' => [__CLASS__, 'validateToModuleId']]
|
|
|
|
|
),
|
|
|
|
|
new StringField(
|
|
|
|
|
'to_path',
|
|
|
|
|
['validation' => [__CLASS__, 'validateToPath']]
|
|
|
|
|
),
|
|
|
|
|
new StringField(
|
|
|
|
|
'to_class',
|
|
|
|
|
['validation' => [__CLASS__, 'validateToClass']]
|
|
|
|
|
),
|
|
|
|
|
new StringField(
|
|
|
|
|
'to_method',
|
|
|
|
|
['validation' => [__CLASS__, 'validateToMethod']]
|
|
|
|
|
),
|
|
|
|
|
new StringField(
|
|
|
|
|
'to_method_arg',
|
|
|
|
|
['validation' => [__CLASS__, 'validateToMethodArg']]
|
|
|
|
|
),
|
|
|
|
|
new IntegerField('version'),
|
|
|
|
|
new StringField(
|
|
|
|
|
'unique_id',
|
|
|
|
|
['required' => true, 'validation' => [__CLASS__, 'validateUniqueId']]
|
|
|
|
|
),
|
|
|
|
|
];
|
|
|
|
|
}
|
2020-09-25 12:17:29 +03:00
|
|
|
|
|
2022-03-02 15:40:53 +03:00
|
|
|
|
/**
|
|
|
|
|
* Returns validators for FROM_MODULE_ID field.
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
* @throws \Bitrix\Main\ArgumentTypeException
|
|
|
|
|
*/
|
|
|
|
|
public static function validateFromModuleId(): array
|
|
|
|
|
{
|
|
|
|
|
return [
|
|
|
|
|
new Main\Entity\Validator\Length(null, 50),
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns validators for MESSAGE_ID field.
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
* @throws \Bitrix\Main\ArgumentTypeException
|
|
|
|
|
*/
|
|
|
|
|
public static function validateMessageId(): array
|
|
|
|
|
{
|
|
|
|
|
return [
|
|
|
|
|
new Main\Entity\Validator\Length(null, 255),
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns validators for TO_MODULE_ID field.
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
* @throws \Bitrix\Main\ArgumentTypeException
|
|
|
|
|
*/
|
|
|
|
|
public static function validateToModuleId(): array
|
|
|
|
|
{
|
|
|
|
|
return [
|
|
|
|
|
new Main\Entity\Validator\Length(null, 50),
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns validators for TO_PATH field.
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
* @throws \Bitrix\Main\ArgumentTypeException
|
|
|
|
|
*/
|
|
|
|
|
public static function validateToPath(): array
|
|
|
|
|
{
|
|
|
|
|
return [
|
|
|
|
|
new Main\Entity\Validator\Length(null, 255),
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns validators for TO_CLASS field.
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
* @throws \Bitrix\Main\ArgumentTypeException
|
|
|
|
|
*/
|
|
|
|
|
public static function validateToClass(): array
|
|
|
|
|
{
|
|
|
|
|
return [
|
|
|
|
|
new Main\Entity\Validator\Length(null, 255),
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns validators for TO_METHOD field.
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
* @throws \Bitrix\Main\ArgumentTypeException
|
|
|
|
|
*/
|
|
|
|
|
public static function validateToMethod(): array
|
|
|
|
|
{
|
|
|
|
|
return [
|
|
|
|
|
new Main\Entity\Validator\Length(null, 255),
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns validators for TO_METHOD_ARG field.
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
* @throws \Bitrix\Main\ArgumentTypeException
|
|
|
|
|
*/
|
|
|
|
|
public static function validateToMethodArg(): array
|
|
|
|
|
{
|
|
|
|
|
return [
|
|
|
|
|
new Main\Entity\Validator\Length(null, 255),
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns validators for UNIQUE_ID field.
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
* @throws \Bitrix\Main\ArgumentTypeException
|
|
|
|
|
*/
|
|
|
|
|
public static function validateUniqueId(): array
|
|
|
|
|
{
|
|
|
|
|
return [
|
|
|
|
|
new Main\Entity\Validator\Length(null, 32),
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-09-25 12:17:29 +03:00
|
|
|
|
|
2021-09-08 10:05:09 +03:00
|
|
|
|
class UpdaterRetailExportTable extends Main\Entity\DataManager
|
|
|
|
|
{
|
|
|
|
|
/**
|
|
|
|
|
* Returns DB table name for entity.
|
|
|
|
|
*
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public static function getTableName(): string
|
|
|
|
|
{
|
|
|
|
|
return 'b_catalog_export';
|
|
|
|
|
}
|
2022-03-02 15:40:53 +03:00
|
|
|
|
|
2021-09-08 10:05:09 +03:00
|
|
|
|
/**
|
|
|
|
|
* Returns entity map definition.
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
|
|
|
|
public static function getMap(): array
|
|
|
|
|
{
|
|
|
|
|
return [
|
|
|
|
|
'ID' => [
|
|
|
|
|
'data_type' => 'integer',
|
|
|
|
|
'primary' => true,
|
|
|
|
|
'autocomplete' => true,
|
|
|
|
|
'title' => Loc::getMessage('EXPORT_ENTITY_ID_FIELD'),
|
|
|
|
|
],
|
|
|
|
|
'FILE_NAME' => [
|
|
|
|
|
'data_type' => 'string',
|
|
|
|
|
'required' => true,
|
|
|
|
|
'validation' => [__CLASS__, 'validateFileName'],
|
|
|
|
|
'title' => Loc::getMessage('EXPORT_ENTITY_FILE_NAME_FIELD'),
|
|
|
|
|
],
|
|
|
|
|
'NAME' => [
|
|
|
|
|
'data_type' => 'string',
|
|
|
|
|
'required' => true,
|
|
|
|
|
'validation' => [__CLASS__, 'validateName'],
|
|
|
|
|
'title' => Loc::getMessage('EXPORT_ENTITY_NAME_FIELD'),
|
|
|
|
|
],
|
|
|
|
|
'DEFAULT_PROFILE' => [
|
|
|
|
|
'data_type' => 'boolean',
|
|
|
|
|
'values' => ['N', 'Y'],
|
|
|
|
|
'title' => Loc::getMessage('EXPORT_ENTITY_DEFAULT_PROFILE_FIELD'),
|
|
|
|
|
],
|
|
|
|
|
'IN_MENU' => [
|
|
|
|
|
'data_type' => 'boolean',
|
|
|
|
|
'values' => ['N', 'Y'],
|
|
|
|
|
'title' => Loc::getMessage('EXPORT_ENTITY_IN_MENU_FIELD'),
|
|
|
|
|
],
|
|
|
|
|
'IN_AGENT' => [
|
|
|
|
|
'data_type' => 'boolean',
|
|
|
|
|
'values' => ['N', 'Y'],
|
|
|
|
|
'title' => Loc::getMessage('EXPORT_ENTITY_IN_AGENT_FIELD'),
|
|
|
|
|
],
|
|
|
|
|
'IN_CRON' => [
|
|
|
|
|
'data_type' => 'boolean',
|
|
|
|
|
'values' => ['N', 'Y'],
|
|
|
|
|
'title' => Loc::getMessage('EXPORT_ENTITY_IN_CRON_FIELD'),
|
|
|
|
|
],
|
|
|
|
|
'SETUP_VARS' => [
|
|
|
|
|
'data_type' => 'text',
|
|
|
|
|
'title' => Loc::getMessage('EXPORT_ENTITY_SETUP_VARS_FIELD'),
|
|
|
|
|
],
|
|
|
|
|
'LAST_USE' => [
|
|
|
|
|
'data_type' => 'datetime',
|
|
|
|
|
'title' => Loc::getMessage('EXPORT_ENTITY_LAST_USE_FIELD'),
|
|
|
|
|
],
|
|
|
|
|
'IS_EXPORT' => [
|
|
|
|
|
'data_type' => 'boolean',
|
|
|
|
|
'values' => ['N', 'Y'],
|
|
|
|
|
'title' => Loc::getMessage('EXPORT_ENTITY_IS_EXPORT_FIELD'),
|
|
|
|
|
],
|
|
|
|
|
'NEED_EDIT' => [
|
|
|
|
|
'data_type' => 'boolean',
|
|
|
|
|
'values' => ['N', 'Y'],
|
|
|
|
|
'title' => Loc::getMessage('EXPORT_ENTITY_NEED_EDIT_FIELD'),
|
|
|
|
|
],
|
|
|
|
|
'TIMESTAMP_X' => [
|
|
|
|
|
'data_type' => 'datetime',
|
|
|
|
|
'title' => Loc::getMessage('EXPORT_ENTITY_TIMESTAMP_X_FIELD'),
|
|
|
|
|
],
|
|
|
|
|
'MODIFIED_BY' => [
|
|
|
|
|
'data_type' => 'integer',
|
|
|
|
|
'title' => Loc::getMessage('EXPORT_ENTITY_MODIFIED_BY_FIELD'),
|
|
|
|
|
],
|
|
|
|
|
'DATE_CREATE' => [
|
|
|
|
|
'data_type' => 'datetime',
|
|
|
|
|
'title' => Loc::getMessage('EXPORT_ENTITY_DATE_CREATE_FIELD'),
|
|
|
|
|
],
|
|
|
|
|
'CREATED_BY' => [
|
|
|
|
|
'data_type' => 'integer',
|
|
|
|
|
'title' => Loc::getMessage('EXPORT_ENTITY_CREATED_BY_FIELD'),
|
|
|
|
|
],
|
|
|
|
|
];
|
2020-09-25 12:17:29 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
2022-03-02 15:40:53 +03:00
|
|
|
|
|
|
|
|
|
class LoyaltyProgramUpdater
|
|
|
|
|
{
|
|
|
|
|
/**
|
|
|
|
|
* CamelCase в имени является требованием Bitrix. Изменить на lowerCamelCase нельзя
|
|
|
|
|
*/
|
|
|
|
|
public function CopyFiles(): self
|
|
|
|
|
{
|
|
|
|
|
$pathFrom = $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/intaro.retailcrm/install';
|
|
|
|
|
|
|
|
|
|
CopyDirFiles(
|
|
|
|
|
$pathFrom . '/export',
|
|
|
|
|
$_SERVER['DOCUMENT_ROOT'],
|
|
|
|
|
true,
|
|
|
|
|
true,
|
|
|
|
|
false
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$lpTemplateNames = [
|
|
|
|
|
'sale.order.ajax',
|
|
|
|
|
'sale.basket.basket',
|
|
|
|
|
'main.register',
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
foreach ($lpTemplateNames as $lpTemplateName) {
|
|
|
|
|
$lpTemplatePath = $_SERVER['DOCUMENT_ROOT']
|
|
|
|
|
. '/local/templates/.default/components/bitrix/' . $lpTemplateName . '/default_loyalty';
|
|
|
|
|
|
|
|
|
|
if (!file_exists($lpTemplatePath)) {
|
|
|
|
|
$pathFrom = $_SERVER['DOCUMENT_ROOT']
|
|
|
|
|
. '/bitrix/modules/intaro.retailcrm/install/export/local/components/intaro/'
|
|
|
|
|
. $lpTemplateName
|
|
|
|
|
. '/templates/.default';
|
|
|
|
|
|
|
|
|
|
CopyDirFiles(
|
|
|
|
|
$pathFrom,
|
|
|
|
|
$lpTemplatePath,
|
|
|
|
|
true,
|
|
|
|
|
true,
|
|
|
|
|
false
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @throws \Bitrix\Main\SystemException
|
|
|
|
|
* @throws \Bitrix\Main\ArgumentException
|
|
|
|
|
*/
|
|
|
|
|
public function tryReplaceExportVars(): self
|
|
|
|
|
{
|
|
|
|
|
/** @var EntityObject $exportSystem */
|
|
|
|
|
$exportSystem = UpdaterRetailExportTable::query()
|
|
|
|
|
->addSelect('*')
|
|
|
|
|
->where('FILE_NAME', 'retailcrm')
|
|
|
|
|
->fetchObject();
|
|
|
|
|
|
|
|
|
|
if ($exportSystem instanceof EntityObject) {
|
|
|
|
|
$replaceableVars = [
|
|
|
|
|
['search' => 'IBLOCK_EXPORT', 'replace' => 'iblockExport'],
|
|
|
|
|
['search' => 'IBLOCK_PROPERTY_SKU', 'replace' => 'iblockPropertySku'],
|
|
|
|
|
['search' => 'IBLOCK_PROPERTY_UNIT_SKU', 'replace' => 'iblockPropertyUnitSku'],
|
|
|
|
|
['search' => 'IBLOCK_PROPERTY_PRODUCT', 'replace' => 'iblockPropertyProduct'],
|
|
|
|
|
['search' => 'IBLOCK_PROPERTY_UNIT_PRODUCT', 'replace' => 'iblockPropertyUnitProduct'],
|
|
|
|
|
['search' => 'MAX_OFFERS_VALUE', 'replace' => 'maxOffersValue'],
|
|
|
|
|
];
|
|
|
|
|
$setupVars = $exportSystem->get('SETUP_VARS');
|
|
|
|
|
$newSetupVars = str_replace(
|
|
|
|
|
array_column($replaceableVars, 'search'),
|
|
|
|
|
array_column($replaceableVars, 'replace'),
|
|
|
|
|
$setupVars
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$exportSystem->set('SETUP_VARS', $newSetupVars);
|
|
|
|
|
$exportSystem->save();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function addLoyaltyProgramEvents(): self
|
|
|
|
|
{
|
|
|
|
|
$eventManager = EventManager::getInstance();
|
|
|
|
|
$eventsList = [
|
|
|
|
|
['EVENT_NAME' => 'OnSaleOrderSaved', 'FROM_MODULE' => 'sale'],
|
|
|
|
|
['EVENT_NAME' => 'OnSaleComponentOrderResultPrepared', 'FROM_MODULE' => 'sale'],
|
|
|
|
|
['EVENT_NAME' => 'OnAfterUserRegister', 'FROM_MODULE' => 'main'],
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
foreach ($eventsList as $event) {
|
|
|
|
|
$events = ToModuleTable::query()
|
|
|
|
|
->setSelect(['ID'])
|
|
|
|
|
->where([
|
|
|
|
|
['from_module_id', '=', $event['FROM_MODULE']],
|
|
|
|
|
['to_module_id', '=', 'intaro.retailcrm'],
|
|
|
|
|
['to_method', '=', $event['EVENT_NAME'] . 'Handler'],
|
|
|
|
|
['to_class', '=', 'Intaro\RetailCrm\Component\Handlers\EventsHandlers'],
|
|
|
|
|
])
|
2024-11-05 09:24:39 +03:00
|
|
|
|
->fetchCollection()
|
|
|
|
|
;
|
2022-03-02 15:40:53 +03:00
|
|
|
|
|
|
|
|
|
if (null === $events || 0 === count($events)) {
|
|
|
|
|
$eventManager->registerEventHandler(
|
|
|
|
|
$event['FROM_MODULE'],
|
|
|
|
|
$event['EVENT_NAME'],
|
|
|
|
|
'intaro.retailcrm',
|
|
|
|
|
'Intaro\RetailCrm\Component\Handlers\EventsHandlers',
|
|
|
|
|
$event['EVENT_NAME'] . 'Handler'
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function getLoyaltyHlFields(string $ufObject): array
|
|
|
|
|
{
|
|
|
|
|
return [
|
|
|
|
|
'UF_ORDER_ID' => [
|
|
|
|
|
'ENTITY_ID' => $ufObject,
|
|
|
|
|
'FIELD_NAME' => 'UF_ORDER_ID',
|
|
|
|
|
'USER_TYPE_ID' => 'integer',
|
|
|
|
|
'MANDATORY' => 'Y',
|
|
|
|
|
'EDIT_FORM_LABEL' => [
|
|
|
|
|
'ru' => 'ID заказа',
|
|
|
|
|
'en' => 'Order ID',
|
|
|
|
|
],
|
|
|
|
|
'LIST_COLUMN_LABEL' => [
|
|
|
|
|
'ru' => 'ID заказа',
|
|
|
|
|
'en' => 'Order ID',
|
|
|
|
|
],
|
|
|
|
|
'LIST_FILTER_LABEL' => [
|
|
|
|
|
'ru' => 'ID заказа',
|
|
|
|
|
'en' => 'Order ID',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
'UF_ITEM_ID' => [
|
|
|
|
|
'ENTITY_ID' => $ufObject,
|
|
|
|
|
'FIELD_NAME' => 'UF_ITEM_ID',
|
|
|
|
|
'USER_TYPE_ID' => 'integer',
|
|
|
|
|
'MANDATORY' => 'Y',
|
|
|
|
|
'EDIT_FORM_LABEL' => [
|
|
|
|
|
'ru' => 'ID товара',
|
|
|
|
|
'en' => 'Product ID',
|
|
|
|
|
],
|
|
|
|
|
'LIST_COLUMN_LABEL' => [
|
|
|
|
|
'ru' => 'ID товара',
|
|
|
|
|
'en' => 'Product ID',
|
|
|
|
|
],
|
|
|
|
|
'LIST_FILTER_LABEL' => [
|
|
|
|
|
'ru' => 'ID товара',
|
|
|
|
|
'en' => 'Product ID',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
'UF_ITEM_POS_ID' => [
|
|
|
|
|
'ENTITY_ID' => $ufObject,
|
|
|
|
|
'FIELD_NAME' => 'UF_ITEM_POS_ID',
|
|
|
|
|
'USER_TYPE_ID' => 'integer',
|
|
|
|
|
'MANDATORY' => 'Y',
|
|
|
|
|
'EDIT_FORM_LABEL' => [
|
|
|
|
|
'ru' => 'ID позиции в корзине',
|
|
|
|
|
'en' => 'Basket position ID',
|
|
|
|
|
],
|
|
|
|
|
'LIST_COLUMN_LABEL' => [
|
|
|
|
|
'ru' => 'ID позиции в корзине',
|
|
|
|
|
'en' => 'Basket position ID',
|
|
|
|
|
],
|
|
|
|
|
'LIST_FILTER_LABEL' => [
|
|
|
|
|
'ru' => 'ID позиции в корзине',
|
|
|
|
|
'en' => 'Basket position ID',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
'UF_NAME' => [
|
|
|
|
|
'ENTITY_ID' => $ufObject,
|
|
|
|
|
'FIELD_NAME' => 'UF_NAME',
|
|
|
|
|
'USER_TYPE_ID' => 'string',
|
|
|
|
|
'MANDATORY' => 'N',
|
|
|
|
|
'EDIT_FORM_LABEL' => [
|
|
|
|
|
'ru' => 'Название товара',
|
|
|
|
|
'en' => 'Product name',
|
|
|
|
|
],
|
|
|
|
|
'LIST_COLUMN_LABEL' => [
|
|
|
|
|
'ru' => 'Название товара',
|
|
|
|
|
'en' => 'Product name',
|
|
|
|
|
],
|
|
|
|
|
'LIST_FILTER_LABEL' => [
|
|
|
|
|
'ru' => 'Название товара',
|
|
|
|
|
'en' => 'Product name',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
'UF_DEF_DISCOUNT' => [
|
|
|
|
|
'ENTITY_ID' => $ufObject,
|
|
|
|
|
'FIELD_NAME' => 'UF_DEF_DISCOUNT',
|
|
|
|
|
'USER_TYPE_ID' => 'double',
|
|
|
|
|
'MANDATORY' => 'N',
|
|
|
|
|
'EDIT_FORM_LABEL' => [
|
|
|
|
|
'ru' => 'Скидка магазина',
|
|
|
|
|
'en' => 'Shop discount',
|
|
|
|
|
],
|
|
|
|
|
'LIST_COLUMN_LABEL' => [
|
|
|
|
|
'ru' => 'Скидка магазина',
|
|
|
|
|
'en' => 'Shop discount',
|
|
|
|
|
],
|
|
|
|
|
'LIST_FILTER_LABEL' => [
|
|
|
|
|
'ru' => 'Скидка магазина',
|
|
|
|
|
'en' => 'Shop discount',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
'UF_CHECK_ID' => [
|
|
|
|
|
'ENTITY_ID' => $ufObject,
|
|
|
|
|
'FIELD_NAME' => 'UF_CHECK_ID',
|
|
|
|
|
'USER_TYPE_ID' => 'string',
|
|
|
|
|
'MANDATORY' => 'N',
|
|
|
|
|
'EDIT_FORM_LABEL' => [
|
|
|
|
|
'ru' => 'ID проверочного кода',
|
|
|
|
|
'en' => 'Verification code ID',
|
|
|
|
|
],
|
|
|
|
|
'LIST_COLUMN_LABEL' => [
|
|
|
|
|
'ru' => 'ID проверочного кода',
|
|
|
|
|
'en' => 'Verification code ID',
|
|
|
|
|
],
|
|
|
|
|
'LIST_FILTER_LABEL' => [
|
|
|
|
|
'ru' => 'ID проверочного кода',
|
|
|
|
|
'en' => 'Verification code ID',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
'UF_IS_DEBITED' => [
|
|
|
|
|
'ENTITY_ID' => $ufObject,
|
|
|
|
|
'FIELD_NAME' => 'UF_IS_DEBITED',
|
|
|
|
|
'USER_TYPE_ID' => 'boolean',
|
|
|
|
|
'MANDATORY' => 'N',
|
|
|
|
|
'EDIT_FORM_LABEL' => [
|
|
|
|
|
'ru' => 'Списаны ли бонусы',
|
|
|
|
|
'en' => 'Is debited',
|
|
|
|
|
],
|
|
|
|
|
'LIST_COLUMN_LABEL' => [
|
|
|
|
|
'ru' => 'Списаны ли бонусы',
|
|
|
|
|
'en' => 'Is debited',
|
|
|
|
|
],
|
|
|
|
|
'LIST_FILTER_LABEL' => [
|
|
|
|
|
'ru' => 'Списаны ли бонусы',
|
|
|
|
|
'en' => 'Is debited',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
'UF_QUANTITY' => [
|
|
|
|
|
'ENTITY_ID' => $ufObject,
|
|
|
|
|
'FIELD_NAME' => 'UF_QUANTITY',
|
|
|
|
|
'USER_TYPE_ID' => 'integer',
|
|
|
|
|
'MANDATORY' => 'Y',
|
|
|
|
|
'EDIT_FORM_LABEL' => [
|
|
|
|
|
'ru' => 'Количество в корзине',
|
|
|
|
|
'en' => 'Quantity in the basket',
|
|
|
|
|
],
|
|
|
|
|
'LIST_COLUMN_LABEL' => [
|
|
|
|
|
'ru' => 'Количество в корзине',
|
|
|
|
|
'en' => 'Quantity in the basket',
|
|
|
|
|
],
|
|
|
|
|
'LIST_FILTER_LABEL' => [
|
|
|
|
|
'ru' => 'Количество в корзине',
|
|
|
|
|
'en' => 'Quantity in the basket',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
'UF_BONUS_COUNT' => [
|
|
|
|
|
'ENTITY_ID' => $ufObject,
|
|
|
|
|
'FIELD_NAME' => 'UF_BONUS_COUNT',
|
|
|
|
|
'USER_TYPE_ID' => 'integer',
|
|
|
|
|
'MANDATORY' => 'N',
|
|
|
|
|
'EDIT_FORM_LABEL' => [
|
|
|
|
|
'ru' => 'Количество списываемых бонусов в позиции',
|
|
|
|
|
'en' => 'Bonuses for writing off in position',
|
|
|
|
|
],
|
|
|
|
|
'LIST_COLUMN_LABEL' => [
|
|
|
|
|
'ru' => 'Количество списываемых бонусов в позиции',
|
|
|
|
|
'en' => 'Bonuses for writing off in position',
|
|
|
|
|
],
|
|
|
|
|
'LIST_FILTER_LABEL' => [
|
|
|
|
|
'ru' => 'Количество списываемых бонусов в позиции',
|
|
|
|
|
'en' => 'Bonuses for writing off in position',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
'UF_BONUS_COUNT_TOTAL' => [
|
|
|
|
|
'ENTITY_ID' => $ufObject,
|
|
|
|
|
'FIELD_NAME' => 'UF_BONUS_COUNT_TOTAL',
|
|
|
|
|
'USER_TYPE_ID' => 'integer',
|
|
|
|
|
'MANDATORY' => 'N',
|
|
|
|
|
'EDIT_FORM_LABEL' => [
|
|
|
|
|
'ru' => 'Количество списываемых бонусов в заказе',
|
|
|
|
|
'en' => 'Bonuses for writing off in order',
|
|
|
|
|
],
|
|
|
|
|
'LIST_COLUMN_LABEL' => [
|
|
|
|
|
'ru' => 'Количество списываемых бонусов в заказе',
|
|
|
|
|
'en' => 'Bonuses for writing off in order',
|
|
|
|
|
],
|
|
|
|
|
'LIST_FILTER_LABEL' => [
|
|
|
|
|
'ru' => 'Количество списываемых бонусов в заказе',
|
|
|
|
|
'en' => 'Bonuses for writing off in order',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @throws \Bitrix\Main\SystemException
|
|
|
|
|
* @throws \Exception
|
|
|
|
|
*/
|
|
|
|
|
public function createLoyaltyHlBlock(): self
|
|
|
|
|
{
|
|
|
|
|
$result = HL\HighloadBlockTable::add([
|
|
|
|
|
'NAME' => 'LoyaltyProgramRetailCRM',
|
|
|
|
|
'TABLE_NAME' => 'loyalty_program'
|
|
|
|
|
]);
|
2024-11-05 09:24:39 +03:00
|
|
|
|
|
2022-03-02 15:40:53 +03:00
|
|
|
|
$arLangs = [
|
|
|
|
|
'ru' => 'Программа лояльности',
|
|
|
|
|
'en' => 'Loyalty Program'
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
if ($result->isSuccess()) {
|
|
|
|
|
$hlId = $result->getId();
|
|
|
|
|
|
|
|
|
|
foreach ($arLangs as $langKey => $langVal) {
|
|
|
|
|
HL\HighloadBlockLangTable::add([
|
|
|
|
|
'ID' => $hlId,
|
|
|
|
|
'LID' => $langKey,
|
|
|
|
|
'NAME' => $langVal,
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
foreach ($result->getErrorMessages() as $message) {
|
|
|
|
|
AddMessage2Log($message, 'intaro.retailcrm');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!isset($hlId)) {
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$ufObject = 'HLBLOCK_' . $hlId;
|
|
|
|
|
$arCartFields = $this->getLoyaltyHlFields($ufObject);
|
|
|
|
|
|
|
|
|
|
foreach ($arCartFields as $arCartField) {
|
|
|
|
|
$obUserField = new CUserTypeEntity();
|
|
|
|
|
$obUserField->Add($arCartField);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* add LP Order Props
|
|
|
|
|
*
|
|
|
|
|
* @throws \Bitrix\Main\ArgumentException
|
|
|
|
|
* @throws \Bitrix\Main\ObjectPropertyException
|
|
|
|
|
* @throws \Bitrix\Main\SystemException
|
|
|
|
|
*/
|
|
|
|
|
public function addCustomersLoyaltyFields(): self
|
|
|
|
|
{
|
|
|
|
|
$persons = PersonTypeTable::query()
|
|
|
|
|
->setSelect(['ID'])
|
|
|
|
|
->where([])
|
2024-11-05 09:24:39 +03:00
|
|
|
|
->fetchCollection()
|
|
|
|
|
;
|
2022-03-02 15:40:53 +03:00
|
|
|
|
|
|
|
|
|
foreach ($persons as $person) {
|
|
|
|
|
$personId = $person->getID();
|
|
|
|
|
$groupId = $this->getGroupIdByPersonId($personId);
|
|
|
|
|
|
|
|
|
|
if (isset($groupId)) {
|
|
|
|
|
$this->addBonusFieldForLp($personId, $groupId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function getGroupIdByPersonId($personId): ?int
|
|
|
|
|
{
|
|
|
|
|
$lpOrderGroupName = [
|
2024-10-23 17:05:39 +03:00
|
|
|
|
'ru' => 'Программа лояльности',
|
|
|
|
|
'en' => 'Loyalty Program'
|
|
|
|
|
][Context::getCurrent()->getLanguage()] ?? 'Программа лояльности';
|
2022-03-02 15:40:53 +03:00
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
$lpGroup = OrderPropsGroupTable::query()
|
|
|
|
|
->setSelect(['ID'])
|
|
|
|
|
->where(
|
|
|
|
|
[
|
|
|
|
|
['PERSON_TYPE_ID', '=', $personId],
|
|
|
|
|
['NAME', '=', $lpOrderGroupName],
|
|
|
|
|
]
|
|
|
|
|
)
|
2024-11-05 09:24:39 +03:00
|
|
|
|
->fetch()
|
|
|
|
|
;
|
2022-03-02 15:40:53 +03:00
|
|
|
|
|
|
|
|
|
if (is_array($lpGroup)) {
|
|
|
|
|
return $lpGroup['ID'];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($lpGroup === false) {
|
|
|
|
|
return OrderPropsGroupTable::add([
|
|
|
|
|
'PERSON_TYPE_ID' => $personId,
|
|
|
|
|
'NAME' => $lpOrderGroupName,
|
|
|
|
|
])->getId();
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception $exception) {
|
|
|
|
|
AddMessage2Log($exception->getMessage());
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param int|string $personId
|
|
|
|
|
* @param int|string $groupId
|
|
|
|
|
*
|
|
|
|
|
* @throws \Bitrix\Main\ArgumentException
|
|
|
|
|
* @throws \Bitrix\Main\ObjectPropertyException
|
|
|
|
|
* @throws \Bitrix\Main\SystemException
|
|
|
|
|
*/
|
|
|
|
|
public function addBonusFieldForLp($personId, $groupId): void
|
|
|
|
|
{
|
|
|
|
|
$bonusProp = OrderPropsTable::query()
|
|
|
|
|
->setSelect(['ID'])
|
|
|
|
|
->where([
|
|
|
|
|
['PERSON_TYPE_ID', '=', $personId],
|
|
|
|
|
['PROPS_GROUP_ID', '=', $groupId],
|
|
|
|
|
])
|
2024-11-05 09:24:39 +03:00
|
|
|
|
->fetchObject()
|
|
|
|
|
;
|
2022-03-02 15:40:53 +03:00
|
|
|
|
|
|
|
|
|
if ($bonusProp === null) {
|
|
|
|
|
$lang = Context::getCurrent()->getLanguage();
|
|
|
|
|
$lpBonusInfo = [
|
|
|
|
|
'ru' => 'Бонусов начислено',
|
|
|
|
|
'en' => 'Bonus info'
|
|
|
|
|
][$lang];
|
|
|
|
|
$lpDiscountInfo = [
|
|
|
|
|
'ru' => 'Персональная скидка',
|
|
|
|
|
'en' => 'Personal discount'
|
|
|
|
|
][$lang];
|
|
|
|
|
|
|
|
|
|
$fields = [
|
|
|
|
|
[
|
|
|
|
|
'REQUIRED' => 'N',
|
|
|
|
|
'NAME' => $lpBonusInfo,
|
|
|
|
|
'TYPE' => 'TEXTAREA',
|
|
|
|
|
'CODE' => 'LP_BONUS_INFO',
|
|
|
|
|
'USER_PROPS' => 'Y',
|
|
|
|
|
'IS_LOCATION' => 'N',
|
|
|
|
|
'IS_LOCATION4TAX' => 'N',
|
|
|
|
|
'IS_EMAIL' => 'N',
|
|
|
|
|
'IS_PROFILE_NAME' => 'N',
|
|
|
|
|
'IS_PAYER' => 'N',
|
|
|
|
|
'IS_FILTERED' => 'Y',
|
|
|
|
|
'PERSON_TYPE_ID' => $personId,
|
|
|
|
|
'PROPS_GROUP_ID' => $groupId,
|
|
|
|
|
'DEFAULT_VALUE' => '',
|
|
|
|
|
'DESCRIPTION' => $lpBonusInfo,
|
|
|
|
|
'UTIL' => 'Y',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'REQUIRED' => 'N',
|
|
|
|
|
'NAME' => $lpDiscountInfo,
|
|
|
|
|
'TYPE' => 'TEXTAREA',
|
|
|
|
|
'CODE' => 'LP_DISCOUNT_INFO',
|
|
|
|
|
'USER_PROPS' => 'Y',
|
|
|
|
|
'IS_LOCATION' => 'N',
|
|
|
|
|
'IS_LOCATION4TAX' => 'N',
|
|
|
|
|
'IS_EMAIL' => 'N',
|
|
|
|
|
'IS_PROFILE_NAME' => 'N',
|
|
|
|
|
'IS_PAYER' => 'N',
|
|
|
|
|
'IS_FILTERED' => 'Y',
|
|
|
|
|
'PERSON_TYPE_ID' => $personId,
|
|
|
|
|
'PROPS_GROUP_ID' => $groupId,
|
|
|
|
|
'DEFAULT_VALUE' => '',
|
|
|
|
|
'DESCRIPTION' => $lpDiscountInfo,
|
|
|
|
|
'UTIL' => 'Y',
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
foreach ($fields as $field) {
|
|
|
|
|
CSaleOrderProps::Add($field);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Add USER fields for LP
|
|
|
|
|
*/
|
|
|
|
|
public function addLpUserFields(): self
|
|
|
|
|
{
|
|
|
|
|
$this->addCustomUserFields(
|
|
|
|
|
[
|
|
|
|
|
[
|
|
|
|
|
'name' => 'UF_CARD_NUM_INTARO',
|
|
|
|
|
'title' => 'Номер карты программы лояльности',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
'string'
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$this->addCustomUserFields(
|
|
|
|
|
[
|
|
|
|
|
[
|
|
|
|
|
'name' => 'UF_LP_ID_INTARO',
|
|
|
|
|
'title' => 'Номер аккаунта в программе лояльности',
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
'string',
|
|
|
|
|
['EDIT_IN_LIST' => 'N']
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$this->addCustomUserFields(
|
|
|
|
|
[
|
|
|
|
|
[
|
|
|
|
|
'name' => 'UF_REG_IN_PL_INTARO',
|
|
|
|
|
'title' => 'Зарегистрироваться в программе лояльности',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'name' => 'UF_AGREE_PL_INTARO',
|
|
|
|
|
'title' => 'Я согласен с условиями программы лояльности',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'name' => 'UF_PD_PROC_PL_INTARO',
|
|
|
|
|
'title' => 'Согласие на обработку персональных данных',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'name' => 'UF_EXT_REG_PL_INTARO',
|
|
|
|
|
'title' => 'Активность в программе лояльности',
|
|
|
|
|
],
|
|
|
|
|
]
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Добавление соглашений для формы регистрации
|
|
|
|
|
*
|
|
|
|
|
* @throws \Bitrix\Main\ArgumentException
|
|
|
|
|
* @throws \Bitrix\Main\ObjectPropertyException
|
|
|
|
|
* @throws \Bitrix\Main\SystemException
|
|
|
|
|
*/
|
|
|
|
|
public function addAgreement(): self
|
|
|
|
|
{
|
|
|
|
|
$isAgreementLoyaltyProgram = AgreementTable::query()
|
|
|
|
|
->setSelect(['ID'])
|
|
|
|
|
->where([
|
|
|
|
|
['CODE', '=', 'AGREEMENT_LOYALTY_PROGRAM_CODE']
|
|
|
|
|
])
|
|
|
|
|
->fetch();
|
|
|
|
|
|
|
|
|
|
if (!isset($isAgreementLoyaltyProgram['ID'])) {
|
|
|
|
|
/** @var EntityObject|null $agreementLoyaltyProgram */
|
|
|
|
|
$agreementLoyaltyProgram = AgreementTable::createObject();
|
|
|
|
|
$agreementLoyaltyProgram->setCode('AGREEMENT_LOYALTY_PROGRAM_CODE');
|
|
|
|
|
$agreementLoyaltyProgram->setDateInsert(new DateTime());
|
|
|
|
|
$agreementLoyaltyProgram->setActive('Y');
|
|
|
|
|
$agreementLoyaltyProgram->setName(GetMessage('AGREEMENT_LOYALTY_PROGRAM_TITLE'));
|
|
|
|
|
$agreementLoyaltyProgram->setType('C');
|
|
|
|
|
$agreementLoyaltyProgram->setAgreementText(GetMessage('AGREEMENT_LOYALTY_PROGRAM_TEXT'));
|
|
|
|
|
$agreementLoyaltyProgram->save();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$isAgreementPersonalProgram = AgreementTable::query()
|
|
|
|
|
->setSelect(['ID'])
|
|
|
|
|
->where([
|
|
|
|
|
['CODE', '=', 'AGREEMENT_PERSONAL_DATA_CODE']
|
|
|
|
|
])
|
2024-11-05 09:24:39 +03:00
|
|
|
|
->fetch()
|
|
|
|
|
;
|
2022-03-02 15:40:53 +03:00
|
|
|
|
|
|
|
|
|
if (!isset($isAgreementPersonalProgram['ID'])) {
|
|
|
|
|
/** @var EntityObject|null $agreementPersonalData */
|
|
|
|
|
$agreementPersonalData = AgreementTable::createObject();
|
|
|
|
|
$agreementPersonalData->setCode('AGREEMENT_PERSONAL_DATA_CODE');
|
|
|
|
|
$agreementPersonalData->setDateInsert(new DateTime());
|
|
|
|
|
$agreementPersonalData->setActive('Y');
|
|
|
|
|
$agreementPersonalData->setName(GetMessage('AGREEMENT_PERSONAL_DATA_TITLE'));
|
|
|
|
|
$agreementPersonalData->setType('C');
|
|
|
|
|
$agreementPersonalData->setAgreementText(GetMessage('AGREEMENT_PERSONAL_DATA_TEXT'));
|
|
|
|
|
$agreementPersonalData->save();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param array $fields
|
|
|
|
|
* @param string $filedType
|
|
|
|
|
* @param array $customProps
|
|
|
|
|
*/
|
|
|
|
|
public function addCustomUserFields($fields, string $filedType = 'boolean', array $customProps = []): void
|
|
|
|
|
{
|
|
|
|
|
foreach ($fields as $field) {
|
|
|
|
|
$arProps = [
|
|
|
|
|
'ENTITY_ID' => 'USER',
|
|
|
|
|
'FIELD_NAME' => $field['name'],
|
|
|
|
|
'USER_TYPE_ID' => $filedType,
|
|
|
|
|
'MULTIPLE' => 'N',
|
|
|
|
|
'MANDATORY' => 'N',
|
|
|
|
|
'EDIT_FORM_LABEL' => ['ru' => $field['title']],
|
|
|
|
|
|
|
|
|
|
];
|
|
|
|
|
$props = array_merge($arProps, $customProps);
|
|
|
|
|
$obUserField = new CUserTypeEntity();
|
|
|
|
|
$dbRes = CUserTypeEntity::GetList([], ['FIELD_NAME' => $field['name']])->fetch();
|
|
|
|
|
|
|
|
|
|
if (!$dbRes['ID']) {
|
|
|
|
|
$obUserField->Add($props);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-06-28 15:28:28 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function updateBonusInfoFieldForLp(): self
|
|
|
|
|
{
|
|
|
|
|
$bonusProps = CSaleOrderProps::GetList([], ['CODE' => 'LP_BONUS_INFO']);
|
|
|
|
|
$lang = Context::getCurrent()->getLanguage();
|
|
|
|
|
$lpBonusInfo = [
|
|
|
|
|
'ru' => 'Бонусов списано',
|
|
|
|
|
'en' => 'Bonuses charged'
|
|
|
|
|
][$lang];
|
|
|
|
|
$updateInfo = [
|
|
|
|
|
'NAME' => $lpBonusInfo,
|
|
|
|
|
'DESCRIPTION' => $lpBonusInfo,
|
|
|
|
|
];
|
|
|
|
|
|
2024-10-23 17:05:39 +03:00
|
|
|
|
while ($bonusProp = $bonusProps->Fetch()) {
|
2022-06-28 15:28:28 +03:00
|
|
|
|
CSaleOrderProps::Update($bonusProp['ID'], $updateInfo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Обновление типов полей с бонусами и перенос информации
|
|
|
|
|
*
|
|
|
|
|
* @throws Main\ArgumentException
|
|
|
|
|
* @throws Main\ObjectPropertyException
|
|
|
|
|
* @throws Main\SystemException
|
|
|
|
|
*/
|
|
|
|
|
public function updateBonusFieldsTypeInHl(): self
|
|
|
|
|
{
|
|
|
|
|
$hlblock = HL\HighloadBlockTable::query()
|
|
|
|
|
->addSelect('*')
|
|
|
|
|
->addFilter('NAME', 'LoyaltyProgramRetailCRM')
|
|
|
|
|
->exec()
|
|
|
|
|
->fetch();
|
|
|
|
|
|
|
|
|
|
if (isset($hlblock['ID'])) {
|
|
|
|
|
$ufObject = 'HLBLOCK_' . $hlblock['ID'];
|
|
|
|
|
$bonusCountField = CUserTypeEntity::GetList([], [
|
|
|
|
|
"ENTITY_ID" => $ufObject,
|
|
|
|
|
"FIELD_NAME" => 'UF_BONUS_COUNT',
|
|
|
|
|
])->fetch();
|
|
|
|
|
$bonusTotalCountField = CUserTypeEntity::GetList([], [
|
|
|
|
|
"ENTITY_ID" => $ufObject,
|
|
|
|
|
"FIELD_NAME" => 'UF_BONUS_COUNT_TOTAL',
|
|
|
|
|
])->fetch();
|
|
|
|
|
|
|
|
|
|
if ('integer' === $bonusCountField['USER_TYPE_ID'] && 'integer' === $bonusTotalCountField['USER_TYPE_ID']) {
|
|
|
|
|
$hlblockEntity = HL\HighloadBlockTable::compileEntity($hlblock);
|
|
|
|
|
$manager = $hlblockEntity->getDataClass();
|
|
|
|
|
|
|
|
|
|
$bonusHlblockData = $manager::query()
|
|
|
|
|
->setSelect(['ID', 'UF_BONUS_COUNT', 'UF_BONUS_COUNT_TOTAL'])
|
|
|
|
|
->setFilter(['!=UF_BONUS_COUNT' => 'NULL', 'LOGIC' => 'OR', '!=UF_BONUS_COUNT_TOTAL' => 'NULL'])
|
|
|
|
|
->fetchAll();
|
|
|
|
|
|
|
|
|
|
$obUserField = new CUserTypeEntity();
|
|
|
|
|
$obUserField->Delete($bonusCountField['ID']);
|
|
|
|
|
$obUserField->Delete($bonusTotalCountField['ID']);
|
|
|
|
|
|
|
|
|
|
$newBonusFields = $this->getNewBonusHlFields($ufObject);
|
|
|
|
|
|
|
|
|
|
foreach ($newBonusFields as $newBonusField) {
|
|
|
|
|
$obUserField->Add($newBonusField);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach ($bonusHlblockData as $field) {
|
|
|
|
|
$manager::update($field['ID'], ['fields' => [
|
|
|
|
|
'UF_BONUS_COUNT' => $field['UF_BONUS_COUNT'],
|
|
|
|
|
'UF_BONUS_COUNT_TOTAL' => $field['UF_BONUS_COUNT_TOTAL'],
|
|
|
|
|
],]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Обновление поля скидки по товару
|
|
|
|
|
*
|
|
|
|
|
* @throws Main\ArgumentException
|
|
|
|
|
* @throws Main\ObjectPropertyException
|
|
|
|
|
* @throws Main\SystemException
|
|
|
|
|
*/
|
|
|
|
|
public function updateDefDiscountFieldTypeInHl(): self
|
|
|
|
|
{
|
|
|
|
|
$hlblock = HL\HighloadBlockTable::query()
|
|
|
|
|
->addSelect('*')
|
|
|
|
|
->addFilter('NAME', 'LoyaltyProgramRetailCRM')
|
|
|
|
|
->exec()
|
|
|
|
|
->fetch();
|
|
|
|
|
|
|
|
|
|
if (isset($hlblock['ID'])) {
|
|
|
|
|
$ufObject = 'HLBLOCK_' . $hlblock['ID'];
|
|
|
|
|
$defDiscountField = CUserTypeEntity::GetList([], [
|
|
|
|
|
"ENTITY_ID" => $ufObject,
|
|
|
|
|
"FIELD_NAME" => 'UF_DEF_DISCOUNT',
|
|
|
|
|
])->fetch();
|
|
|
|
|
|
|
|
|
|
if (false !== $defDiscountField) {
|
|
|
|
|
$obUserField = new CUserTypeEntity();
|
|
|
|
|
$obUserField->Update($defDiscountField['ID'], [
|
|
|
|
|
'SETTINGS' => [
|
|
|
|
|
'PRECISION' => 2,
|
|
|
|
|
],
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function getNewBonusHlFields(string $ufObject): array
|
|
|
|
|
{
|
|
|
|
|
return [
|
|
|
|
|
'UF_BONUS_COUNT' => [
|
|
|
|
|
'ENTITY_ID' => $ufObject,
|
|
|
|
|
'FIELD_NAME' => 'UF_BONUS_COUNT',
|
|
|
|
|
'USER_TYPE_ID' => 'double',
|
|
|
|
|
'MANDATORY' => 'N',
|
|
|
|
|
'EDIT_FORM_LABEL' => [
|
|
|
|
|
'ru' => 'Количество списываемых бонусов в позиции',
|
|
|
|
|
'en' => 'Bonuses for writing off in position',
|
|
|
|
|
],
|
|
|
|
|
'LIST_COLUMN_LABEL' => [
|
|
|
|
|
'ru' => 'Количество списываемых бонусов в позиции',
|
|
|
|
|
'en' => 'Bonuses for writing off in position',
|
|
|
|
|
],
|
|
|
|
|
'LIST_FILTER_LABEL' => [
|
|
|
|
|
'ru' => 'Количество списываемых бонусов в позиции',
|
|
|
|
|
'en' => 'Bonuses for writing off in position',
|
|
|
|
|
],
|
|
|
|
|
'SETTINGS' => [
|
|
|
|
|
'PRECISION' => 2,
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
'UF_BONUS_COUNT_TOTAL' => [
|
|
|
|
|
'ENTITY_ID' => $ufObject,
|
|
|
|
|
'FIELD_NAME' => 'UF_BONUS_COUNT_TOTAL',
|
|
|
|
|
'USER_TYPE_ID' => 'double',
|
|
|
|
|
'MANDATORY' => 'N',
|
|
|
|
|
'EDIT_FORM_LABEL' => [
|
|
|
|
|
'ru' => 'Количество списываемых бонусов в заказе',
|
|
|
|
|
'en' => 'Bonuses for writing off in order',
|
|
|
|
|
],
|
|
|
|
|
'LIST_COLUMN_LABEL' => [
|
|
|
|
|
'ru' => 'Количество списываемых бонусов в заказе',
|
|
|
|
|
'en' => 'Bonuses for writing off in order',
|
|
|
|
|
],
|
|
|
|
|
'LIST_FILTER_LABEL' => [
|
|
|
|
|
'ru' => 'Количество списываемых бонусов в заказе',
|
|
|
|
|
'en' => 'Bonuses for writing off in order',
|
|
|
|
|
],
|
|
|
|
|
'SETTINGS' => [
|
|
|
|
|
'PRECISION' => 2,
|
|
|
|
|
],
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
}
|
2022-03-02 15:40:53 +03:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-22 13:09:20 +03:00
|
|
|
|
class UpdateSubscribe
|
|
|
|
|
{
|
|
|
|
|
public function CopyFiles(): self
|
|
|
|
|
{
|
|
|
|
|
$pathFrom = $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/intaro.retailcrm/install';
|
|
|
|
|
|
|
|
|
|
CopyDirFiles(
|
|
|
|
|
$pathFrom . '/export',
|
|
|
|
|
$_SERVER['DOCUMENT_ROOT'],
|
|
|
|
|
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) {
|
|
|
|
|
$templatePath = $_SERVER['DOCUMENT_ROOT']
|
2024-10-23 17:05:39 +03:00
|
|
|
|
. '/local/templates/.default/components/bitrix/' . $template['name'] . '/' . $directory;
|
2023-08-22 13:09:20 +03:00
|
|
|
|
|
|
|
|
|
if (!file_exists($templatePath)) {
|
|
|
|
|
$pathFrom = $_SERVER['DOCUMENT_ROOT']
|
|
|
|
|
. '/bitrix/modules/intaro.retailcrm/install/export/local/components/intaro/'
|
|
|
|
|
. $template['name']
|
2024-10-23 17:05:39 +03:00
|
|
|
|
. '/templates/' . $template['templateDirectory'];
|
2023-08-22 13:09:20 +03:00
|
|
|
|
|
|
|
|
|
CopyDirFiles(
|
|
|
|
|
$pathFrom,
|
|
|
|
|
$templatePath,
|
|
|
|
|
true,
|
|
|
|
|
true,
|
|
|
|
|
false
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function addEvent(): self
|
|
|
|
|
{
|
|
|
|
|
$eventManager = EventManager::getInstance();
|
|
|
|
|
|
|
|
|
|
$eventManager->unRegisterEventHandler(
|
|
|
|
|
'main',
|
|
|
|
|
'OnAfterUserRegister',
|
|
|
|
|
'intaro.retailcrm',
|
|
|
|
|
'Intaro\RetailCrm\Component\Handlers\EventsHandlers',
|
|
|
|
|
'OnAfterUserRegisterHandler'
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
RegisterModuleDependences('main', 'OnAfterUserRegister', 'intaro.retailcrm', 'RetailCrmEvent', 'OnAfterUserRegister');
|
|
|
|
|
RegisterModuleDependences('main', 'OnAfterUserAdd', 'intaro.retailcrm', 'RetailCrmEvent', 'OnAfterUserAdd');
|
|
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function addCustomUserField(): self
|
|
|
|
|
{
|
|
|
|
|
$arProps = [
|
|
|
|
|
'ENTITY_ID' => 'USER',
|
|
|
|
|
'FIELD_NAME' => 'UF_SUBSCRIBE_USER_EMAIL',
|
|
|
|
|
'USER_TYPE_ID' => 'boolean',
|
|
|
|
|
'MULTIPLE' => 'N',
|
|
|
|
|
'MANDATORY' => 'N',
|
|
|
|
|
'EDIT_FORM_LABEL' => ['ru' => 'Подписка на события'],
|
|
|
|
|
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
$props = array_merge($arProps, []);
|
|
|
|
|
$obUserField = new CUserTypeEntity();
|
|
|
|
|
$dbRes = CUserTypeEntity::GetList([], ['FIELD_NAME' => 'UF_SUBSCRIBE_USER_EMAIL'])->fetch();
|
|
|
|
|
|
|
|
|
|
if (!$dbRes['ID']) {
|
|
|
|
|
$obUserField->Add($props);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-02 15:40:53 +03:00
|
|
|
|
/**
|
|
|
|
|
* @throws \Bitrix\Main\ArgumentException
|
|
|
|
|
* @throws \Bitrix\Main\ObjectPropertyException
|
|
|
|
|
* @throws \Bitrix\Main\SystemException
|
|
|
|
|
* @throws \Bitrix\Main\LoaderException
|
|
|
|
|
*/
|
|
|
|
|
function update()
|
|
|
|
|
{
|
|
|
|
|
Loader::includeModule('sale');
|
|
|
|
|
Loader::includeModule('highloadblock');
|
2024-10-23 17:05:39 +03:00
|
|
|
|
$loyaltyEventClass = 'Intaro\RetailCrm\Component\Handlers\EventsHandlers';
|
2022-03-02 15:40:53 +03:00
|
|
|
|
|
2023-09-01 14:06:23 +03:00
|
|
|
|
COption::SetOptionString('intaro.retailcrm', 'api_version', 'v5');
|
2024-10-23 17:05:39 +03:00
|
|
|
|
RegisterModuleDependences('sale', 'OnSaleOrderSaved', 'intaro.retailcrm', 'RetailCrmEvent', 'orderSave', 99);
|
|
|
|
|
|
|
|
|
|
if (Option::get('intaro.retailcrm', 'loyalty_program_toggle') !== 'Y') {
|
|
|
|
|
UnRegisterModuleDependences('sale', 'OnSaleOrderSaved', 'intaro.retailcrm', $loyaltyEventClass, 'OnSaleOrderSavedHandler');
|
|
|
|
|
UnRegisterModuleDependences('sale', 'OnSaleComponentOrderResultPrepared', 'intaro.retailcrm', $loyaltyEventClass, 'OnSaleComponentOrderResultPreparedHandler');
|
|
|
|
|
}
|
2022-03-02 15:40:53 +03:00
|
|
|
|
}
|
|
|
|
|
|
2024-01-18 11:48:35 +03:00
|
|
|
|
function createCustomPropertyFile()
|
|
|
|
|
{
|
|
|
|
|
$path = $_SERVER['DOCUMENT_ROOT'] . '/local/';
|
|
|
|
|
|
|
|
|
|
CheckDirPath($path);
|
|
|
|
|
|
|
|
|
|
$file = new \Bitrix\Main\IO\File($path . 'icml_property_retailcrm.txt', $siteId = null);
|
|
|
|
|
|
|
|
|
|
if (!$file->isExists()) {
|
|
|
|
|
$file->putContents("");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2022-03-02 15:40:53 +03:00
|
|
|
|
try {
|
|
|
|
|
update();
|
|
|
|
|
} catch (Main\ObjectPropertyException | Main\ArgumentException | Main\SystemException $exception) {
|
|
|
|
|
return;
|
|
|
|
|
}
|