Spamworldpro Mini Shell
Spamworldpro


Server : Apache
System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64
User : corals ( 1002)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /home/corals/old/app/code/Kaliop/ProductGridSalesCount/Model/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/old/app/code/Kaliop/ProductGridSalesCount/Model/NumberOrderedCalculator.php
<?php
/**
 * Copyright (c) 2021 Kaliop Digital Commerce (https://digitalcommerce.kaliop.com) All Rights Reserved.
 * https://opensource.org/licenses/OSL-3.0  Open Software License (OSL 3.0)
 * Cnc
 * Krzysztof Majkowski <[email protected]>
 */

namespace Kaliop\ProductGridSalesCount\Model;

use Exception;
use Magento\Catalog\Model\Product;
use Magento\Catalog\Model\ResourceModel\Product\Action;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
use Magento\Framework\App\ResourceConnection;
use Magento\Framework\Exception\LocalizedException;
use Magento\GroupedProduct\Model\Product\Type\Grouped;
use Magento\GroupedProduct\Model\ResourceModel\Product\Link;
use Zend\Log\Logger;
use Zend\Log\Writer\Stream;

class NumberOrderedCalculator
{
    const LOG_FILE = 'numberordered.log';

    /**
     * @var ResourceConnection
     */
    private $connection;

    /**
     * @var Action
     */
    private $action;

    /**
     * @var \Magento\Eav\Model\Config
     */
    private $eavConfig;
    /**
     * @var CollectionFactory
     */
    private $collectionFactory;

    /**
     * Calculator constructor.
     * @param ResourceConnection $connection
     * @param Action $action
     * @param \Magento\Eav\Model\Config $eavConfig
     */
    public function __construct(
        ResourceConnection $connection,
        Action $action,
        \Magento\Eav\Model\Config $eavConfig,
        CollectionFactory $collectionFactory
    ) {
        $this->connection = $connection;
        $this->action = $action;
        $this->eavConfig = $eavConfig;
        $this->collectionFactory = $collectionFactory;
    }

    public function execute($ids = [])
    {
        $this->log('Calculation start');
        $this->storeData($this->collectData());
        $this->log('Calculation finished');
    }

    protected function collectData()
    {
        $data = [];
        $collection = $this->collectionFactory->create();
        $collection->addAttributeToFilter('type_id', 'grouped');

        /** @var Product $groupedProduct */
        foreach ($collection as $groupedProduct) {
            /** @var Grouped $instance */
            $instance = $groupedProduct->getTypeInstance();
            $children = $instance->getChildrenIds($groupedProduct->getId());
            $qty = 0;
            foreach ($children[Link::LINK_TYPE_GROUPED] as $id) {
                $qty += $this->getNumberOrdered($id);
            }
            $data[$groupedProduct->getId()] = $qty;
        }

        return $data;
    }

    /**
     * Save data.
     *
     * @param array $data
     */
    protected function storeData($data)
    {
        foreach ($data as $productId => $qty) {
            try {
                $this->action->updateAttributes(
                    [$productId],
                    ['cnc_number_ordered' => $qty],
                    0
                );
            } catch (Exception $e) {
                $this->log($e->getMessage());
                $this->log($e->getTraceAsString());
            }
        }
    }

    /**
     * @param int $productId
     * @return string
     * @throws LocalizedException
     */
    protected function getNumberOrdered(int $productId)
    {
        $attribute = $this->eavConfig->getAttribute(Product::ENTITY, 'cnc_number_ordered');
        $attributeId = $attribute->getId();
        $attributeTable = $attribute->getBackendTable();

        $sql = "SELECT value FROM {$attributeTable} WHERE attribute_id = {$attributeId} AND entity_id = {$productId} AND store_id = 0";
        return $this->connection->getConnection()->fetchOne($sql);
    }

    private function log($message)
    {
        $writer = new Stream(BP . '/var/log/' . self::LOG_FILE);
        $logger = new Logger();
        $logger->addWriter($writer);
        $logger->info($message);
    }
}

Spamworldpro Mini