UpdatingService.php 3.76 KB
Newer Older
Ketan's avatar
Ketan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Signifyd\Model\CaseServices;

use Magento\Framework\Api\SimpleDataObjectConverter;
use Magento\Framework\Exception\LocalizedException;
use Magento\Signifyd\Api\CaseRepositoryInterface;
use Magento\Signifyd\Api\Data\CaseInterface;
use Magento\Signifyd\Model\CommentsHistoryUpdater;
use Magento\Signifyd\Model\MessageGenerators\GeneratorInterface;
use Magento\Signifyd\Model\OrderStateService;
use Magento\Signifyd\Model\SalesOrderGrid\OrderGridUpdater;

/**
 * Performs Signifyd case entity updating operations.
 */
class UpdatingService implements UpdatingServiceInterface
{
    /**
     * @var GeneratorInterface
     */
    private $messageGenerator;

    /**
     * @var CaseRepositoryInterface
     */
    private $caseRepository;

    /**
     * @var CommentsHistoryUpdater
     */
    private $commentsHistoryUpdater;

    /**
     * @var \Magento\Signifyd\Model\SalesOrderGrid\OrderGridUpdater
     */
    private $orderGridUpdater;

    /**
     * @var OrderStateService
     */
    private $orderStateService;

    /**
     * UpdatingService constructor.
     *
     * @param GeneratorInterface $messageGenerator
     * @param CaseRepositoryInterface $caseRepository
     * @param CommentsHistoryUpdater $commentsHistoryUpdater
     * @param \Magento\Signifyd\Model\SalesOrderGrid\OrderGridUpdater $orderGridUpdater
     * @param OrderStateService $orderStateService
     */
    public function __construct(
        GeneratorInterface $messageGenerator,
        CaseRepositoryInterface $caseRepository,
        CommentsHistoryUpdater $commentsHistoryUpdater,
        OrderGridUpdater $orderGridUpdater,
        OrderStateService $orderStateService
    ) {
        $this->messageGenerator = $messageGenerator;
        $this->caseRepository = $caseRepository;
        $this->commentsHistoryUpdater = $commentsHistoryUpdater;
        $this->orderGridUpdater = $orderGridUpdater;
        $this->orderStateService = $orderStateService;
    }

    /**
     * Updates Signifyd Case entity by received data.
     *
     * @param CaseInterface $case
     * @param array $data
     * @return void
     * @throws LocalizedException
     */
    public function update(CaseInterface $case, array $data)
    {
        if (empty($case->getEntityId()) || empty($case->getCaseId())) {
            throw new LocalizedException(__('The case entity should not be empty.'));
        }

        try {
            $previousDisposition = $case->getGuaranteeDisposition();
            $this->setCaseData($case, $data);
            $orderHistoryComment = $this->messageGenerator->generate($data);
            $case = $this->caseRepository->save($case);
            $this->orderGridUpdater->update($case->getOrderId());
            $this->commentsHistoryUpdater->addComment($case, $orderHistoryComment);
            if ($case->getGuaranteeDisposition() !== $previousDisposition) {
                $this->orderStateService->updateByCase($case);
            }
        } catch (\Exception $e) {
            throw new LocalizedException(__('Cannot update Case entity.'), $e);
        }
    }

    /**
     * Sets data to case entity.
     *
     * @param CaseInterface $case
     * @param array $data
     * @return void
     */
    private function setCaseData(CaseInterface $case, array $data)
    {
        // list of keys which should not be replaced, like order id
        $notResolvedKeys = [
            'orderId'
        ];
        foreach ($data as $key => $value) {
            $methodName = 'set' . SimpleDataObjectConverter::snakeCaseToUpperCamelCase($key);
            if (!in_array($key, $notResolvedKeys) && method_exists($case, $methodName)) {
                call_user_func([$case, $methodName], $value);
            }
        }
    }
}