Миграции Bitrix Phinx. Добавить тип почтового события

<?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());
        }
    }
};

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *