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/cvetdv.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/cvetdv.ru/bitrix/modules/yandex.market/lib/export/run/steps/promogift.php
<?php

namespace Yandex\Market\Export\Run\Steps;

use Bitrix\Main;
use Yandex\Market;

class PromoGift extends Offer
{
    public function getName()
    {
        return Market\Export\Run\Manager::STEP_PROMO_GIFT;
    }

    public function isVirtual()
    {
        return true;
    }

    public function isTypedTag()
    {
        return true;
    }

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

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

    protected function useHashCollision()
    {
        return false;
    }

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

	protected function getDataLogEntityReference()
    {
        return [
            '=this.ENTITY_PARENT' => 'ref.SETUP_ID',
            '=this.ENTITY_ID_PART1' => 'ref.PROMO_ID',
            '=this.ENTITY_ID_PART2' => 'ref.ELEMENT_ID',
        ];
    }

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

	protected function getStoragePrimaryList()
    {
        return [
            'SETUP_ID',
            'PROMO_ID',
            'ELEMENT_ID'
        ];
    }

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

    protected function getExistDataStorageFilter(array $context)
    {
        return [
            '=SETUP_ID' => $context['SETUP_ID'],
            '=PROMO_ID' => $context['PROMO_ID'],
        ];
    }

    protected function getStorageAdditionalData($tagResult, $tagValues, $element, $context, $data)
    {
        return [
            'PROMO_ID' => $context['PROMO_ID'],
            'ELEMENT_TYPE' => $tagValues->getType(),
	        'PARENT_ID' => isset($element['PARENT_ID']) ? $element['PARENT_ID'] : '',
        ];
    }

    protected function getStorageReadyFilter($queryContext, $isNeedFull = false)
    {
        $filter = [
            '=SETUP_ID' => $queryContext['SETUP_ID']
        ];

        if (isset($queryContext['PROMO_ID']))
        {
            $filter['=PROMO_ID'] = $queryContext['PROMO_ID'];
        }

        if (!$isNeedFull)
        {
            switch ($this->getRunAction())
            {
                case 'change':
                case 'refresh':
                    $filter['>=TIMESTAMP_X'] = $this->getParameter('initTimeUTC');
                break;
            }
        }

        return $filter;
    }

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

        if (!empty($changes))
        {
            $isNeedCheckProduct = false;

            // self changes

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

                    case Market\Export\Run\Manager::ENTITY_TYPE_GIFT:
                    case Market\Export\Run\Manager::ENTITY_TYPE_OFFER:

                        if (!isset($context['OFFER_IBLOCK_ID']))
                        {
                            $result[] = [
                                '=ELEMENT_ID' => $entityIds
                            ];
                        }
                        else // convert product change to offer
                        {
                            $elementIdsMap = array_flip($entityIds);

                            $queryOffers = \CIBlockElement::GetList(
                                array(),
                                array(
                                    'IBLOCK_ID' => $context['OFFER_IBLOCK_ID'],
                                    '=PROPERTY_' . $context['OFFER_PROPERTY_ID'] => $entityIds
                                ),
                                false,
                                false,
                                array(
                                    'IBLOCK_ID',
                                    'ID',
                                    'PROPERTY_' . $context['OFFER_PROPERTY_ID']
                                )
                            );

                            while ($offer = $queryOffers->Fetch())
                            {
                                $offerId = (int)$offer['ID'];
                                $offerElementId = (int)$offer['PROPERTY_' . $context['OFFER_PROPERTY_ID'] . '_VALUE'];

                                if (isset($elementIdsMap[$offerElementId]))
                                {
                                    unset($elementIdsMap[$offerElementId]);
                                }

                                $elementIdsMap[$offerId] = true;
                            }

                            if (!empty($elementIdsMap))
                            {
                                $result[] = [
                                    '=ELEMENT_ID' => array_keys($elementIdsMap)
                                ];
                            }
                        }

                    break;

                    default:
                        $isNeedCheckProduct = true;
                    break;
                }
            }

            // offer changes

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

        if ($isNeedFull)
        {
            $result = [];
        }
        else 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 getIblockConfigList($isNeedAll = null)
    {
        $setup = $this->getSetup();
        $result = [];
        $promoChangedMap = null;
	    $iblockLinkCollection = $setup->getIblockLinkCollection();

        if ($this->getRunAction() === 'change')
        {
            $changes = $this->getChanges();

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

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

            if (
                ($promoChangedMap !== null && !isset($promoChangedMap[$promoId])) // has changes, but in other promo
                || !$promo->isActive()
                || !$promo->isActiveDate()
                || !$promo->isSupportGift()
            )
            {
                continue;
            }

            /** @var Market\Export\PromoGift\Model $promoGift */
            foreach ($promo->getGiftCollection() as $promoGift)
            {
	            $promoProductIblockId = $promoGift->getIblockId();
	            $iblockLink = $iblockLinkCollection->getByIblockId($promoProductIblockId);
	            $context = $promoGift->getContext();
	            $offerPrimarySource = $iblockLink !== null ? $this->getOfferPrimarySource($iblockLink, $context) : null;

                $iblockConfig = [
                    'ID' => $promoGift->getId(),
                    'EXPORT_ALL' => false,
                    'TAG_DESCRIPTION_LIST' => $promoGift->getTagDescriptionList($offerPrimarySource),
                    'FILTER_LIST' => [],
                    'CONTEXT' => $context,
                    'LIMIT' => $promo->getGiftLimit()
                ];
				$isFirstFilter = true;

                /** @var \Yandex\Market\Export\Filter\Model $filterModel */
                foreach ($promoGift->getFilterCollection() as $filterModel)
                {
                    $iblockConfig['FILTER_LIST'][] = [
                        'ID' => $filterModel->getInternalId(),
                        'FILTER' => $filterModel->getSourceFilter(),
                        'CONTEXT' => [ 'IGNORE_EXCLUDE' => $isFirstFilter ] // hasn't self context
                    ];

					$isFirstFilter = false;
                }

                $result[] = $iblockConfig;
            }
        }

        return $result;
    }

    protected function applyQueryFilterModifications($queryFilter, $queryContext)
	{
		return $queryFilter;
	}

	protected function processExportElementList(&$elementList, &$parentList, $context)
    {
        if (!$context['EXPORT_GIFT'])
        {
            $this->filterOnlyUsedElementList($elementList, $context);
        }

        $this->sortExportElementList($elementList);
    }

    /**
     * �������� ������ ���������, �� ����� � ������� ������
     *
     * @param $elementList array
     * @param $context array
     */
    protected function filterOnlyUsedElementList(&$elementList, $context)
    {
        $idList = array_keys($elementList);
        $usedIdMap = $this->getExistOfferList($idList, $context);

        foreach ($elementList as $elementId => $element)
        {
            if (!isset($usedIdMap[$elementId]))
            {
                unset($elementList[$elementId]);
            }
        }
    }

    protected function extractElementListValues($sourceSelect, $elementList, $parentList, $queryContext)
    {
        $result = parent::extractElementListValues($sourceSelect, $elementList, $parentList, $queryContext);

        if ($queryContext['EXPORT_GIFT'])
        {
	        $idList = array_keys($result);
	        $existIdMap = $this->getExistOfferList($idList, $queryContext);

	        foreach ($result as $elementId => &$sourceValues)
	        {
	            $sourceValues['TYPE'] = (
	                isset($existIdMap[$elementId])
	                    ? Market\Export\PromoGift\Table::PROMO_GIFT_TYPE_OFFER
	                    : Market\Export\PromoGift\Table::PROMO_GIFT_TYPE_GIFT
	            );
	        }
	        unset($sourceValues);
        }
        else
        {
	        foreach ($result as $elementId => &$sourceValues)
	        {
		        $sourceValues['TYPE'] = Market\Export\PromoGift\Table::PROMO_GIFT_TYPE_OFFER;
	        }
	        unset($sourceValues);
        }

        return $result;
    }

	protected function sortExportElementList(&$elementList)
	{
        $parentElementCount = [];
        $parentElementIndex = [];
        $isNeedSort = false;

        foreach ($elementList as $elementId => $element)
        {
            $elementParentIndex = 0;

            if (!isset($element['PARENT_ID']))
            {
                // nothing
            }
            else if (!isset($parentElementCount[$element['PARENT_ID']]))
            {
                $parentElementCount[$element['PARENT_ID']] = 0;
                $elementParentIndex = 0;
            }
            else
            {
                $isNeedSort = true;
                $elementParentIndex = ++$parentElementCount[$element['PARENT_ID']];
            }

            $parentElementIndex[$elementId] = $elementParentIndex;
        }

        if ($isNeedSort)
        {
            uksort($elementList, function($aId, $bId) use ($parentElementIndex) {
                $aParentIndex = $parentElementIndex[$aId];
                $bParentIndex = $parentElementIndex[$bId];

                if ($aParentIndex === $bParentIndex) { return 0; }

                return ($aParentIndex < $bParentIndex ? -1 : 1);
            });
        }
	}

	protected function getExistOfferList($elementIdList, $context)
	{
		$result = [];

		if (!empty($elementIdList))
		{
			$queryExistOfferList = Market\Export\Run\Storage\OfferTable::getList([
				'filter' => [
					'=SETUP_ID' => $context['SETUP_ID'],
					'=ELEMENT_ID' => $elementIdList,
					'=STATUS' => static::STORAGE_STATUS_SUCCESS
				],
				'select' => [
					'ELEMENT_ID'
				]
			]);

			while ($existOffer = $queryExistOfferList->fetch())
			{
				$result[$existOffer['ELEMENT_ID']] = true;
			}
		}

		return $result;
	}

    protected function writeDataLog($tagResultList, $context)
    {
        $newTagResultList = [];

        foreach ($tagResultList as $elementId => $tagResult)
        {
            $newTagResultList[$context['PROMO_ID'] . ':' . $elementId] = $tagResult;
        }

        parent::writeDataLog($newTagResultList, $context);
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit