![]() 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/Helper/ |
<?php /** * Copyright (c) 2020 Kaliop Digital Commerce (https://digitalcommerce.kaliop.com) All Rights Reserved. * https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) * Krzysztof Majkowski <[email protected]> */ declare(strict_types=1); namespace Cnc\SerialNumber\Helper; use Cnc\SerialNumber\Api\Data\SerialNumberInterface; use Cnc\SerialNumber\Api\IsSerialNumberEnabledForProductInterface; use Cnc\SerialNumber\Api\SerialNumberRepositoryInterface; use Cnc\SerialNumber\Model\Logger; use Cnc\SerialNumber\Model\SerialNumberFactory; use Cnc\SerialNumber\Model\Source\SerialNumber\Status; use Magento\Backend\Model\Auth\Session; use Magento\Framework\Api\SearchCriteriaBuilderFactory; use Magento\Framework\Exception\AlreadyExistsException; use Magento\Sales\Model\Order; class SerialNumber { /** * @var SearchCriteriaBuilderFactory */ private $searchCriteriaBuilderFactory; /** * @var SerialNumberRepositoryInterface */ private $serialNumberRepository; /** * @var SerialNumberFactory */ private $serialNumberFactory; /** * @var Index */ private $index; /** * @var Logger */ private $logger; /** * @var Session */ private $authSession; /** * @var IsSerialNumberEnabledForProductInterface */ private $isSerialNumberEnabledForProduct; /** * SerialNumber constructor. * @param SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory * @param SerialNumberRepositoryInterface $serialNumberRepository * @param SerialNumberFactory $serialNumberFactory * @param Index $index * @param Logger $logger * @param Session $authSession * @param IsSerialNumberEnabledForProductInterface $isSerialNumberEnabledForProduct */ public function __construct( SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory, SerialNumberRepositoryInterface $serialNumberRepository, SerialNumberFactory $serialNumberFactory, Index $index, Logger $logger, Session $authSession, IsSerialNumberEnabledForProductInterface $isSerialNumberEnabledForProduct ) { $this->searchCriteriaBuilderFactory = $searchCriteriaBuilderFactory; $this->serialNumberRepository = $serialNumberRepository; $this->logger = $logger; $this->authSession = $authSession; $this->serialNumberFactory = $serialNumberFactory; $this->index = $index; $this->isSerialNumberEnabledForProduct = $isSerialNumberEnabledForProduct; } /** * Set serial numbers as sold. * * @param string $sku * @param string $sourceCode * @param int $qty * @param Order $order * @return array * @throws AlreadyExistsException */ public function sellSerialNumber(string $sku, string $sourceCode, int $qty, Order $order) { if (!$this->isSerialNumberEnabledForProduct->execute($sku)) { return []; } $msg = 'selling serial number (sku, source_code, qty): [' . implode(',', [$sku, $sourceCode, $qty]) . ']'; $this->logger->log($msg); $searchCriteriaBuilder = $this->searchCriteriaBuilderFactory->create(); $searchCriteria = $searchCriteriaBuilder ->addFilter(SerialNumberInterface::SKU, $sku) ->addFilter(SerialNumberInterface::SOURCE_CODE, $sourceCode) ->addFilter(SerialNumberInterface::STATUS, Status::AVAILABLE) ->setPageSize($qty) ->create(); $items = $this->serialNumberRepository->getList($searchCriteria)->getItems(); $serialNumbers = []; foreach ($items as $serialNumber) { $serialNumber->setStatus(Status::SOLD); $serialNumber->setOrderIncrementId((string)$order->getIncrementId()); $serialNumber->setOrderCreatedAt((string)$order->getCreatedAt()); $this->serialNumberRepository->save($serialNumber); $serialNumbers []= $serialNumber->getSerialNumber(); $msg = 'sell serial number (sku, source_code, serial_number): [' . implode(', ', [$sku, $sourceCode, $serialNumber->getSerialNumber()]) . ']'; $this->logger->log($msg); } if (count($items) < $qty) { $this->logger->log('There was not enough serial numbers to sell'); } return $serialNumbers; } /** * Set serial numbers as canceled. * * @param array $serialNumbers * @param bool $returnObjects * @return array * @throws AlreadyExistsException */ public function cancelSerialNumbers(array $serialNumbers, bool $returnObjects = false) { $msg = 'canceling serial number (sku, source_code, qty): [' . implode(',', $serialNumbers) . ']'; $this->logger->log($msg); $searchCriteriaBuilder = $this->searchCriteriaBuilderFactory->create(); $searchCriteria = $searchCriteriaBuilder ->addFilter(SerialNumberInterface::SERIAL_NUMBER, $serialNumbers, 'in') ->create(); $items = $this->serialNumberRepository->getList($searchCriteria)->getItems(); $serialNumbers = []; foreach ($items as $serialNumber) { $serialNumber->setStatus(Status::CANCELED); $this->serialNumberRepository->save($serialNumber); $serialNumbers []= ($returnObjects ? $serialNumber : $serialNumber->getSerialNumber()); $msg = 'canceled serial number (serial_number): [' . $serialNumber->getSerialNumber() . ']'; $this->logger->log($msg); } return $serialNumbers; } /** * Create new serial numbers. * * @param int $productId * @param string $sku * @param int $qty * @throws AlreadyExistsException */ public function createSerialNumbers(int $productId, string $sku, string $sourceCode, int $qty) { if (!$this->isSerialNumberEnabledForProduct->execute($productId)) { return false; } $adminUserId = $this->getAdminUserId(); $lastIndex = $this->index->getLastIndex(); for ($i = 1; $i <= $qty; $i++) { $serialNumber = $this->serialNumberFactory->create(); $serialNumber ->setSerialNumber($productId . ($sourceCode == 'cnc_fr' ? 'FR' : 'US') . 'A' . ($lastIndex + $i)) ->setSourceCode($sourceCode) ->setSku($sku) ->setStatus(Status::AVAILABLE) ->setAdminUserId($adminUserId ?: 0); $this->serialNumberRepository->save($serialNumber); $message = 'creating serial number (s/n, source_code, sku, admin_user_id): [' . implode(', ', [ $productId . $sourceCode . ($lastIndex + $i), $sourceCode, $sku, $adminUserId ]) . ']'; $this->logger->log($message); } $this->index->increaseIndex((int) $qty); } /** * Block serial numbers. * * @param string $sku * @param string $sourceCode * @param int $qty * @throws AlreadyExistsException */ public function blockSerialNumbers(string $sku, string $sourceCode, int $qty) { if (!$this->isSerialNumberEnabledForProduct->execute($sku)) { return false; } $searchCriteriaBuilder = $this->searchCriteriaBuilderFactory->create(); $searchCriteria = $searchCriteriaBuilder ->addFilter(SerialNumberInterface::SKU, $sku) ->addFilter(SerialNumberInterface::SOURCE_CODE, $sourceCode) ->addFilter(SerialNumberInterface::STATUS, Status::AVAILABLE) ->setPageSize($qty) ->create(); $items = $this->serialNumberRepository->getList($searchCriteria)->getItems(); foreach ($items as $serialNumber) { $serialNumber->setStatus(Status::BLOCKED); $this->serialNumberRepository->save($serialNumber); $msg = 'blocking serial number (sku, source_code): [' . implode(',', [$sku, $sourceCode]) . ']'; $this->logger->log($msg); } } /** * Get admin user id. * * @return int */ private function getAdminUserId(): int { if ($this->authSession->getUser()) { return (int) $this->authSession->getUser()->getId(); } return 0; } }