<?php
use Bitrix\Main\Mail\Internal\EventTypeTable;
use Illuminate\Database\Migrations\Migration;
use App\BitrixCore;
/**
* Миграция для создания почтового шаблона для уведомления ответственного лица о необходимости установить ставку акциза за определенный год
*/
return new class extends Migration {
/**
* Шаг сортировки для создаваемого шаблона
*/
private const SORT_STEP = 100;
/**
* Общие поля почтового события
* @return array
*/
private function getGeneralFields(): array
{
return [
//'SORT' => 0, //поле определяется в методе getPreparedGeneralFields
'EVENT_NAME' => 'UPD_SET_EXCISE_RATE_FOR_NEXT_YEAR',
'EVENT_TYPE' => EventTypeTable::TYPE_EMAIL,
];
}
/**
* Общие поля почтового события вместе с рассчитанным полем SORT
* @return array
*/
private function getPreparedGeneralFields(): array
{
$fields = $this->getGeneralFields();
$fields['SORT'] = $this->getMaxSort() + self::SORT_STEP;
return $fields;
}
private function getLangFields(): array
{
return [
[
'NAME' => 'Требуется установить на сайте ставку акциза на #YEAR# год',
'DESCRIPTION' => '#EMAIL_TO# - Email получателя
#YEAR# - ID заказа
#LINK# - Ссылка на страницу редактирования ставок акциза',
'LID' => 'ru',
],
];
}
public function __construct()
{
BitrixCore::load();
}
public function up(): void
{
$this->addEvent();
}
public function down(): void
{
$this->deleteEvent();
}
/**
* Поля, почтового события привязанные к языку
* @return int
*/
private function getMaxSort(): int
{
$eventTypeObject = EventTypeTable::query()
->addSelect('SORT')
->where('EVENT_TYPE', EventTypeTable::TYPE_EMAIL)
->addOrder('SORT', 'DESC')
->setLimit(1)
->fetchObject();
return $eventTypeObject?->getId() ?? 0;
}
/**
* @return void
* @throws \Exception
*/
private function addEvent(): void
{
$generalFields = $this->getPreparedGeneralFields();
$langFiedsets = $this->getLangFields();
foreach ($langFiedsets as $langFiedset) {
$arFields = array_merge($generalFields, $langFiedset);
$result = EventTypeTable::add($arFields);
if (!$result->isSuccess()) {
throw new \RuntimeException(var_export($result->getErrorMessages(), true), 400);
}
}
}
private function deleteEvent(): void
{
$generalFields = $this->getGeneralFields();
$objs = EventTypeTable::query()
->addSelect('ID')
->where('EVENT_NAME', $generalFields['EVENT_NAME'])
->fetchCollection();
//Для одного названия типа события может быть возвращено несколько событий для каждой языковой версии. Я добавляю только русский, но в принципе может быть и еще
if (!$objs) {
throw new \RuntimeException('Не найден тип события ' . $generalFields['EVENT_NAME'], 400);
}
foreach ($objs as $obj) {
EventTypeTable::delete($obj->getId());
}
}
};