![]() 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/ |
<?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; } }