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/Helper/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/old/app/code/Cnc/SerialNumber/Helper/SerialNumber.php
<?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;
    }
}

Spamworldpro Mini