3namespace Sale\Handlers\Delivery\YandexTaxi\Installer;
5use Bitrix\Main\Application;
7use Bitrix\Main\Localization\Loc;
9use Bitrix\Sale\Delivery\ExtraServices\Checkbox;
10use Bitrix\Sale\Delivery\ExtraServices\Enum;
11use Bitrix\Sale\Delivery\ExtraServices\Table;
12use Bitrix\Sale\Delivery\Restrictions\ByPublicMode;
13use Bitrix\Sale\Delivery\Services\Manager;
14use Bitrix\Sale\Internals\OrderPropsGroupTable;
15use Bitrix\Sale\Internals\OrderPropsRelationTable;
16use Bitrix\Sale\Internals\OrderPropsTable;
17use Bitrix\Sale\Internals\ServiceRestrictionTable;
18use Bitrix\Sale\PersonTypeTable;
19use Bitrix\Sale\Registry;
20use Sale\Handlers\Delivery\YandexTaxi\Api\Tariffs\Repository;
21use Sale\Handlers\Delivery\YandexTaxi\Common\OrderEntitiesCodeDictionary;
22use Sale\Handlers\Delivery\YandexTaxi\Common\TariffNameBuilder;
32 private $tariffsRepository;
35 private $tariffNameBuilder;
42 public function __construct(Repository $tariffsRepository, TariffNameBuilder $tariffNameBuilder)
44 $this->tariffsRepository = $tariffsRepository;
45 $this->tariffNameBuilder = $tariffNameBuilder;
52 public function install(
int $serviceId): Result
56 $orderPropsResult = $this->installOrderProperties();
57 if (!$orderPropsResult->isSuccess())
59 return $result->addErrors($orderPropsResult->getErrors());
61 $propertyIds = $orderPropsResult->getData()[
'PROPERTY_IDS'];
63 $tariffs = $this->tariffsRepository->getTariffs();
65 foreach ($tariffs as $tariff)
67 $installProfileResult = $this->installProfile($serviceId, $tariff, $profileSort);
68 if (!$installProfileResult->isSuccess())
70 return $result->addErrors($installProfileResult->getErrors());
74 $profileId = $installProfileResult->getData()[
'ID'];
76 $attachPropertiesResult = $this->attachOrderProperties($profileId, $propertyIds);
77 if (!$attachPropertiesResult->isSuccess())
79 return $result->addErrors($attachPropertiesResult->getErrors());
82 $extraServicesResult = $this->installExtraServices($profileId, $tariff);
83 if (!$extraServicesResult->isSuccess())
85 return $result->addErrors($extraServicesResult->getErrors());
89 $this->installRestriction($serviceId);
100 protected function installProfile(
int $serviceId,
array $tariff,
int $sort = 100): Result
104 $parentServiceFields = Manager::getById($serviceId);
105 if (!$parentServiceFields)
107 return $result->addError(
new Error(
'Parent service not found'));
114 mb_strtoupper($tariff[
'name'])
116 'NAME' => $this->tariffNameBuilder->getTariffName($tariff),
117 'DESCRIPTION' => Loc::getMessage(
119 'SALE_YANDEX_TAXI_TARIFF_%s_DESCRIPTION',
120 mb_strtoupper($tariff[
'name'])
123 'LOGOTIP' => \CFile::SaveFile(
124 \CFile::MakeFileArray(
126 '%s/bitrix/modules/sale/handlers/delivery/yandextaxi/logos/%s.png',
127 Application::getDocumentRoot(),
128 mb_strtolower($tariff[
'name'])
131 'sale/delivery/logotip'
133 'PARENT_ID' => $serviceId,
134 'CLASS_NAME' =>
'\Sale\Handlers\Delivery\YandextaxiProfile',
139 'PROFILE_TYPE' => $tariff[
'name'],
142 'XML_ID' => Manager::generateXmlId(),
143 'CURRENCY' => $parentServiceFields[
'CURRENCY'],
144 'ALLOW_EDIT_SHIPMENT' => $parentServiceFields[
'ALLOW_EDIT_SHIPMENT'],
145 'VAT_ID' => $parentServiceFields[
'VAT_ID'],
149 if (!$addResult->isSuccess())
151 return $result->addErrors($addResult->getErrors());
154 return $result->setData([
'ID' => $addResult->getId()]);
160 protected function installOrderProperties(): Result
167 $payerTypeGroupsMapping = [];
168 $payerTypes = PersonTypeTable::getList(
172 foreach ($payerTypes as $payerType)
177 'PERSON_TYPE_ID' => $payerType[
'ID'],
178 'CODE' =>
'DELIVERY_SERVICE',
185 $payerTypeGroupsMapping[$payerType[
'ID']] = $existingGroup[
'ID'];
191 'PERSON_TYPE_ID' => $payerType[
'ID'],
192 'NAME' => Loc::getMessage(
'SALE_YANDEX_TAXI_DELIVERY_PROP_GROUP_NAME'),
193 'CODE' =>
'DELIVERY_SERVICE',
196 if (!$persistResult->isSuccess())
198 return $result->addError(
new Error(
'Can not add property group'));
201 $payerTypeGroupsMapping[$payerType[
'ID']] = $persistResult->getId();
208 foreach ($payerTypes as $payerType)
212 'ATTRIBUTE' =>
'IS_ADDRESS_FROM',
213 'CODE' =>
'DELIVERY_SERVICE_ADDRESS_FROM',
214 'NAME' => Loc::getMessage(
'SALE_YANDEX_TAXI_PROP_FROM_NAME'),
221 'ATTRIBUTE' =>
'IS_ADDRESS_TO',
222 'CODE' =>
'DELIVERY_SERVICE_ADDRESS_TO',
223 'NAME' => Loc::getMessage(
'SALE_YANDEX_TAXI_PROP_TO_NAME'),
230 'CODE' => OrderEntitiesCodeDictionary::COMMENT_FOR_DRIVER_PROPERTY_CODE,
231 'NAME' => Loc::getMessage(
'SALE_YANDEX_TAXI_COMMENT_FOR_DRIVER'),
235 'SETTINGS' => [
'MULTILINE' =>
'Y'],
239 foreach ($properties as $property)
241 $payerTypeId = $payerType[
'ID'];
243 if (!isset($payerTypeGroupsMapping[$payerTypeId]))
245 return $result->addError(
new Error(
'Property group not found'));
248 $propertyGroupId = $payerTypeGroupsMapping[$payerTypeId];
251 'PERSON_TYPE_ID' => $payerTypeId,
252 'PROPS_GROUP_ID' => $propertyGroupId,
253 'TYPE' => $property[
'TYPE'],
256 if (isset($property[
'ATTRIBUTE']))
258 $filter[$property[
'ATTRIBUTE']] =
'Y';
262 $filter[
'CODE'] = $property[
'CODE'];
265 $existingProperty = OrderPropsTable::getList([
'filter' =>
$filter])->fetch();
268 'NAME' => $property[
'NAME'],
271 'IS_FILTERED' =>
'N',
272 'REQUIRED' => $property[
'REQUIRED'],
273 'MULTIPLE' => $property[
'MULTIPLE'],
274 'SETTINGS' => $property[
'SETTINGS'],
276 'DEFAULT_VALUE' =>
'',
280 if (isset($property[
'ATTRIBUTE']))
285 if ($existingProperty)
287 $persistResult = OrderPropsTable::update(
288 $existingProperty[
'ID'],
291 if (!$persistResult->isSuccess())
293 return $result->addError(
new Error(
'Property can not be installed'));
296 $propertyIds[] = $existingProperty[
'ID'];
300 $persistResult = OrderPropsTable::add(
304 'PERSON_TYPE_ID' => $payerTypeId,
305 'PROPS_GROUP_ID' => $propertyGroupId,
306 'CODE' => $property[
'CODE'],
307 'TYPE' => $property[
'TYPE'],
312 if (!$persistResult->isSuccess())
314 return $result->addError(
new Error(
'Property can not be installed'));
317 $propertyIds[] = $persistResult->getId();
324 'PROPERTY_IDS' => $propertyIds
334 protected function attachOrderProperties(
int $serviceId,
array $propertyIds): Result
338 foreach ($propertyIds as $propertyId)
341 'PROPERTY_ID' => $propertyId,
342 'ENTITY_TYPE' =>
'D',
343 'ENTITY_ID' => $serviceId,
346 $existingRecord = OrderPropsRelationTable::getList(
349 'PROPERTY_ID' => $propertyId,
350 'ENTITY_TYPE' =>
'D',
351 'ENTITY_ID' => $serviceId,
356 if (!$existingRecord)
358 $relationAddResult = OrderPropsRelationTable::add(
$fields);
359 if (!$relationAddResult->isSuccess())
361 $result->addErrors($relationAddResult->getErrors());
374 protected function installExtraServices(
int $serviceId,
array $tariff): Result
381 $addResult = Table::add(
385 'DELIVERY_ID' => $serviceId,
386 'CODE' => OrderEntitiesCodeDictionary::DOOR_DELIVERY_EXTRA_SERVICE_CODE,
387 'NAME' => Loc::getMessage(
'SALE_YANDEX_TAXI_TO_DOOR_DELIVERY'),
388 'CLASS_NAME' =>
'\\' . Checkbox::class,
390 'PARAMS' => [
'PRICE' => 0.00],
393 if (!$addResult->isSuccess())
395 return $result->addErrors($addResult->getErrors());
398 $listNullValue =
'null';
399 foreach ($tariff[
'supported_requirements'] as $supportedRequirement)
401 if ($supportedRequirement[
'type'] ===
'multi_select')
403 foreach ($supportedRequirement[
'options'] as
$option)
405 $addResult = Table::add(
409 'DELIVERY_ID' => $serviceId,
411 'NAME' => Loc::getMessage(
413 'SALE_YANDEX_TAXI_EXTRA_SERVICE_%s',
414 mb_strtoupper(
$option[
'value'])
417 'CLASS_NAME' =>
'\\' . Checkbox::class,
419 'PARAMS' => [
'PRICE' => 0.00],
422 if (!$addResult->isSuccess())
424 return $result->addErrors($addResult->getErrors());
428 elseif ($supportedRequirement[
'type'] ===
'select')
432 'TITLE' => Loc::getMessage(
'SALE_YANDEX_TAXI_EXTRA_SERVICE_LIST_NOT_SELECTED'),
434 'CODE' => $listNullValue,
438 foreach ($supportedRequirement[
'options'] as
$option)
442 $titleLang = Loc::getMessage(
444 'SALE_YANDEX_TAXI_EXTRA_SERVICE_%s_OPTION_%s',
445 mb_strtoupper($supportedRequirement[
'name']),
446 mb_strtoupper($value)
451 'TITLE' => $titleLang ?:
$value,
457 $addResult = Table::add(
461 'DELIVERY_ID' => $serviceId,
462 'CODE' => $supportedRequirement[
'name'],
463 'NAME' => Loc::getMessage(
465 'SALE_YANDEX_TAXI_EXTRA_SERVICE_%s',
466 mb_strtoupper($supportedRequirement[
'name'])
469 'CLASS_NAME' =>
'\\' . Enum::class,
470 'INIT_VALUE' => $listNullValue,
476 if (!$addResult->isSuccess())
478 return $result->addErrors($addResult->getErrors());
489 protected function installRestriction(
int $serviceId): void
491 ServiceRestrictionTable::add(
494 'SERVICE_ID' => $serviceId,
495 'PARAMS' => [
'PUBLIC_SHOW' =>
'N'],
496 'SERVICE_TYPE' =>
'0',
497 'CLASS_NAME' =>
'\\' . ByPublicMode::class
static getList(array $parameters=array())
const REGISTRY_TYPE_ORDER
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']