403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/yandex.market/lib/export/run/steps/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/yandex.market/lib/export/run/steps/promo.php
<?php

namespace Yandex\Market\Export\Run\Steps;

use Bitrix\Main;
use Yandex\Market;

class Promo extends Base
{
	protected $primaryPrefix;

    public function getName()
    {
        return Market\Export\Run\Manager::STEP_PROMO;
    }

    public function run($action, $offset = null)
    {
        $result = new Market\Result\Step();

        $setup = $this->getSetup();
        $context = $setup->getContext();
        $promoCollection = $setup->getPromoCollection();
        $promoCount = count($promoCollection);
        $promoIndex = 0;
        $readyCount = 0;
        $tagDescriptionList = null;
        $sourceValueList = [];
        $elementList = [];
        $flushLimit = $this->getFlushLimit();
        $promoChangedMap = null;

        $this->setRunAction($action);

        $result->setTotal($promoCount);
        $result->setTotalCount($promoCount);

        if ($action === 'change')
        {
        	$promoChangedMap = $this->getChangesMap($context);
        }

        /** @var Market\Export\Promo\Model $promo */
        foreach ($promoCollection as $promo)
        {
            $promoId = $promo->getInternalId();

            if ($offset !== null && $offset > $promoIndex)
            {
                // is out of offset
            }
            else if ($promoChangedMap !== null && !isset($promoChangedMap[$promoId]))
            {
                // is not changed
            }
            else if (!$promo->isActive() || !$promo->isActiveDate()) // is inactive
            {
                // nothing
            }
            else
            {
                if ($tagDescriptionList === null)
                {
                    $tagDescriptionList = $promo->getTagDescriptionList();
                }

                $promoFields = $this->getPromoFields($promo);
                $exportPromoProductList = $this->getExportPromoProductList($promo, $context);
                $exportPromoGiftList = null;

                if ($promo->isSupportGift())
                {
                    $exportPromoGiftList = $this->getExportPromoGiftList($promo, $context);
                }

                $elementList[$promoId] = $promoFields;

                $sourceValueList[$promoId] = [
                    'TYPE' => $promo->getPromoType(),
                    'PROMO' => $promoFields,
                    'PRODUCT' => [
                        'CONTENTS' => implode('', $exportPromoProductList)
                    ],
                    'GIFT' => [
                        'CONTENTS' => $exportPromoGiftList !== null ? implode('', $exportPromoGiftList) : null
                    ]
                ];
            }

            $promoIndex++;
            $readyCount++;

            $isTimeExpired = $this->getProcessor()->isTimeExpired();

            if (!empty($sourceValueList) && ($isTimeExpired || count($sourceValueList) >= $flushLimit))
            {
                $tagValuesList = $this->buildTagValuesList($tagDescriptionList, $sourceValueList, $context);

                $this->extendData($tagValuesList, $elementList, $context);
                $this->writeData($tagValuesList, $elementList, $context);

                $sourceValueList = [];
                $elementList = [];

                if ($isTimeExpired)
                {
                    $result->setOffset($readyCount);
                    break;
                }
            }
        }

        if (!empty($sourceValueList))
        {
            $tagValuesList = $this->buildTagValuesList($tagDescriptionList, $sourceValueList, $context);

			$this->extendData($tagValuesList, $elementList, $context);
            $this->writeData($tagValuesList, $elementList, $context);
        }

        $result->setProgress($readyCount);
        $result->setReadyCount($readyCount);

        return $result;
    }

    protected function useTagPathReverse()
    {
        return false;
    }

    public function isTypedTag()
    {
        return true;
    }

    public function getFormatTag(Market\Export\Xml\Format\Reference\Base $format, $type = null)
    {
        return $format->getPromo($type);
    }

    public function getFormatTagParentName(Market\Export\Xml\Format\Reference\Base $format)
    {
        return $format->getPromoParentName();
    }

    protected function getDataLogEntityType()
    {
        return Market\Logger\Table::ENTITY_TYPE_EXPORT_RUN_PROMO;
    }

    protected function getStorageDataClass()
    {
        return Market\Export\Run\Storage\PromoTable::class;
    }

    protected function getStorageRuntime()
    {
        return [
            new Main\Entity\ReferenceField('EXPORT_PROMO_PRODUCT', Market\Export\Run\Storage\PromoProductTable::class, [
                '=this.SETUP_ID' => 'ref.SETUP_ID',
                '=this.ELEMENT_ID' => 'ref.PROMO_ID'
            ]),
            new Main\Entity\ReferenceField('EXPORT_PROMO_GIFT', Market\Export\Run\Storage\PromoGiftTable::class, [
                '=this.SETUP_ID' => 'ref.SETUP_ID',
                '=this.ELEMENT_ID' => 'ref.PROMO_ID'
            ]),
        ];
    }

    protected function getChangesMap($context)
    {
	    $changes = $this->getChanges();
	    $isOnlyPromoChanged = false;
	    $changedMap = [];

	    if (isset($changes[Market\Export\Run\Manager::ENTITY_TYPE_PROMO])) // has only changes in promo
	    {
		    $isOnlyPromoChanged = (count($changes) === 1);
		    $changedMap += array_flip($changes[Market\Export\Run\Manager::ENTITY_TYPE_PROMO]);
	    }

	    if (!$isOnlyPromoChanged)
	    {
	    	$changedIds = $this->getStorageChangedIds($changes, $context);
		    $changedMap += array_flip($changedIds);
	    }

	    return $changedMap;
    }

    protected function getStorageChangedIds($changes, $context)
    {
	    $dataClass = $this->getStorageDataClass();
    	$changesFilter = $this->getStorageChangesFilter($changes, $context);
	    $result = [];

    	if ($dataClass && $changesFilter !== null)
	    {
		    $filter = [
		    	'=SETUP_ID' => $context['SETUP_ID'],
		    ];

		    if (!empty($changesFilter))
		    {
		    	$filter[] = $changesFilter;
		    }

		    $query = $dataClass::getList([
		    	'filter' => $filter,
			    'select' => [ 'ELEMENT_ID' ],
			    'group' => [ 'ELEMENT_ID' ],
			    'runtime' => $this->getStorageRuntime(),
		    ]);

		    while ($row = $query->fetch())
		    {
		    	$result[] = $row['ELEMENT_ID'];
		    }
	    }

    	return $result;
    }

	protected function getStorageChangesFilter($changes, $context)
    {
        $isNeedCheckProduct = false;
        $result = [];

        if (!empty($changes))
        {
            $ignoredTypeList = $this->getIgnoredTypeChanges();

            foreach ($changes as $changeType => $entityIds)
            {
                if (isset($ignoredTypeList[$changeType])) { continue; }

                switch ($changeType)
                {
                    case Market\Export\Run\Manager::ENTITY_TYPE_PROMO:
                        $result[] = [
                            '=ELEMENT_ID' => $entityIds
                        ];
                    break;

                    default:
                        $isNeedCheckProduct = true;
                    break;
                }
            }
        }

        if ($isNeedCheckProduct)
        {
            $result[] = [
                '>=EXPORT_PROMO_PRODUCT.TIMESTAMP_X' => $this->getParameter('initTimeUTC')
            ];

            $result[] = [
                '>=EXPORT_PROMO_GIFT.TIMESTAMP_X' => $this->getParameter('initTimeUTC')
            ];
        }

        if (empty($result))
        {
            $result = null;
        }
        else if (count($result) > 1)
        {
            $result['LOGIC'] = 'OR';
        }

        return $result;
    }

	protected function getIgnoredTypeChanges()
	{
		return [
			Market\Export\Run\Manager::ENTITY_TYPE_CURRENCY => true,
			Market\Export\Run\Manager::ENTITY_TYPE_COLLECTION => true,
		];
	}

    protected function getQueryExcludeFilterPrimary($queryContext)
    {
        return 0; // equal for all
    }

    /**
     * ������� ����������� �������� ������� �� promo
     *
     * @param Market\Export\Promo\Model $promo
     * @param $context
     *
     * @return array
     */
    protected function getExportPromoProductList(Market\Export\Promo\Model $promo, $context)
    {
        $result = [];

        $queryExportProductList = Market\Export\Run\Storage\PromoProductTable::getList([
            'filter' => [
                '=SETUP_ID' => $context['SETUP_ID'],
                '=PROMO_ID' => $promo->getId(),
                '=STATUS' => static::STORAGE_STATUS_SUCCESS
            ],
            'select' => [
                'ELEMENT_ID',
                'CONTENTS'
            ]
        ]);

        while ($exportProduct = $queryExportProductList->fetch())
        {
            $result[$exportProduct['ELEMENT_ID']] = $exportProduct['CONTENTS'];
        }

        return $result;
    }

    /**
     * ������� ���������� �������� �������� �� promo
     *
     * @param Market\Export\Promo\Model $promo
     * @param $context
     *
     * @return array
     *
     * @throws Main\ArgumentException
     * @throws Main\SystemException
     */
    protected function getExportPromoGiftList(Market\Export\Promo\Model $promo, $context)
    {
        $result = [];

        $queryExportProductList = Market\Export\Run\Storage\PromoGiftTable::getList([
            'filter' => [
                '=SETUP_ID' => $context['SETUP_ID'],
                '=PROMO_ID' => $promo->getId(),
                '=STATUS' => static::STORAGE_STATUS_SUCCESS,
                [
                    'LOGIC' => 'OR',
                    [ '=ELEMENT_TYPE' => Market\Export\PromoGift\Table::PROMO_GIFT_TYPE_OFFER ],
                    [
                        '=ELEMENT_TYPE' => Market\Export\PromoGift\Table::PROMO_GIFT_TYPE_GIFT,
                        '=GIFT_EXPORT.STATUS' => static::STORAGE_STATUS_SUCCESS
                    ]
                ]
            ],
            'select' => [
                'ELEMENT_ID',
                'CONTENTS'
            ],
            'runtime' => [
                new Main\Entity\ReferenceField('GIFT_EXPORT', Market\Export\Run\Storage\GiftTable::class, [
                    '=this.SETUP_ID' => 'ref.SETUP_ID',
                    '=this.ELEMENT_ID' => 'ref.ELEMENT_ID'
                ])
            ]
        ]);

        while ($exportProduct = $queryExportProductList->fetch())
        {
            $result[$exportProduct['ELEMENT_ID']] = $exportProduct['CONTENTS'];
        }

        return $result;
    }

    /**
     * ��������� ������� promo, ����� ����� ��������� ������� ����� � ����
     *
     * @return int
     */
    protected function getFlushLimit()
    {
        return (int)($this->getParameter('promoPageSize') ?: Market\Config::getOption('export_run_promo_page_size') ?: 20);
    }

    protected function isAllowDeleteParent()
    {
        return true;
    }

    protected function isAllowPublicDelete()
    {
        return true;
    }

    protected function getPromoFields(Market\Export\Promo\Model $promo)
    {
    	$result = $promo->getPromoFields();
    	$result['PRIMARY'] = $this->getPrimaryPrefix() . $result['ID'];

    	return $result;
    }

	protected function getPrimaryPrefix()
	{
		if ($this->primaryPrefix === null)
		{
			$this->primaryPrefix = (string)Market\Config::getOption('export_promo_id_prefix', '');
		}

		return $this->primaryPrefix;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit