| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- <?php
- /**
- * This file is part of the Klarna KP module
- *
- * (c) Klarna Bank AB (publ)
- *
- * For the full copyright and license information, please view the NOTICE
- * and LICENSE files that were distributed with this source code.
- */
- namespace Klarna\Kp\Model;
- use Klarna\Kp\Api\CreditApiInterface;
- use Klarna\Kp\Api\QuoteInterface;
- use Klarna\Kp\Api\QuoteRepositoryInterface;
- use Klarna\Kp\Model\ResourceModel\Quote as QuoteResource;
- use Magento\Framework\Exception\CouldNotSaveException;
- use Magento\Framework\Exception\NoSuchEntityException;
- use Magento\Quote\Api\Data\CartInterface as MageQuoteInterface;
- /**
- * Class QuoteRepository
- *
- * @package Klarna\Kp\Model
- */
- class QuoteRepository implements QuoteRepositoryInterface
- {
- /**
- * @var QuoteFactory
- */
- private $quoteFactory;
- /**
- * @var QuoteResource
- */
- private $resourceModel;
- /**
- * Holds a cache of instances to avoid unnecessary db and API calls
- *
- * @var array
- */
- private $instancesById = [];
- /**
- * Holds a cache of instances to avoid unnecessary db and API calls
- *
- * @var array
- */
- private $instances = [];
- /**
- * @var CreditApiInterface
- */
- private $api;
- /**
- * QuoteRepository constructor.
- *
- * @param QuoteFactory $quoteFactory
- * @param QuoteResource $resourceModel
- * @param CreditApiInterface $api
- * @codeCoverageIgnore
- */
- public function __construct(
- QuoteFactory $quoteFactory,
- QuoteResource $resourceModel,
- CreditApiInterface $api
- ) {
- $this->quoteFactory = $quoteFactory;
- $this->resourceModel = $resourceModel;
- $this->api = $api;
- }
- /**
- * Get quote by Magento quote
- *
- * @param MageQuoteInterface $mageQuote
- * @return QuoteInterface
- * @throws \Magento\Framework\Exception\NoSuchEntityException
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- public function getActiveByQuote(MageQuoteInterface $mageQuote)
- {
- $quoteId = $this->resourceModel->getActiveByQuote($mageQuote);
- if (!$quoteId) {
- throw NoSuchEntityException::singleField('quote_id', $mageQuote->getId());
- }
- return $this->loadQuote('load', 'payments_quote_id', $quoteId);
- }
- /**
- * Load quote with different methods
- *
- * @param string $loadMethod
- * @param string $loadField
- * @param int $identifier
- * @throws NoSuchEntityException
- * @return QuoteInterface
- */
- public function loadQuote($loadMethod, $loadField, $identifier)
- {
- /** @var QuoteInterface $quote */
- $quote = $this->quoteFactory->create();
- $quote->$loadMethod($identifier, $loadField);
- if (!$quote->getId()) {
- throw NoSuchEntityException::singleField($loadField, $identifier);
- }
- return $quote;
- }
- /**
- * Delete quote by ID
- *
- * @param int $id
- * @return void
- * @throws \Magento\Framework\Exception\NoSuchEntityException
- */
- public function deleteById($id)
- {
- $this->delete($this->getById($id));
- }
- /**
- * Delete quote
- *
- * @param QuoteInterface $quote
- * @return void
- */
- public function delete(QuoteInterface $quote)
- {
- $quoteId = $quote->getId();
- $sessionId = $quote->getSessionId();
- $authToken = $quote->getAuthorizationToken();
- if ($authToken) { // Only need to call cancel if the Authorization Token is set
- $this->api->cancelOrder($authToken, $sessionId);
- }
- $this->resourceModel->delete($quote);
- unset($this->instances[$sessionId]);
- unset($this->instancesById[$quoteId]);
- }
- /**
- * Get quote by ID
- *
- * @param int $quoteId
- * @param bool $forceReload
- * @return QuoteInterface
- * @throws \Magento\Framework\Exception\NoSuchEntityException
- */
- public function getById($quoteId, $forceReload = false)
- {
- if (!isset($this->instancesById[$quoteId]) || $forceReload) {
- /** @var QuoteInterface $quote */
- $quote = $this->loadQuote('load', 'payments_quote_id', $quoteId);
- $this->cacheInstance($quote);
- }
- return $this->instancesById[$quoteId];
- }
- /**
- * Cache instance locally in memory to avoid additional DB calls
- *
- * @param QuoteInterface $quote
- */
- private function cacheInstance(QuoteInterface $quote)
- {
- $this->instancesById[$quote->getId()] = $quote;
- $this->instances[$quote->getSessionId()] = $quote;
- }
- /**
- * Mark quote as inactive and cancel it with API
- *
- * @param QuoteInterface $quote
- */
- public function markInactive(QuoteInterface $quote)
- {
- $quote->setIsActive(0);
- $this->save($quote);
- if ($quote->getAuthorizationToken()) {
- $this->api->cancelOrder($quote->getAuthorizationToken(), $quote->getSessionId());
- }
- }
- /**
- * Save Klarna Quote
- *
- * @param QuoteInterface $quote
- * @return \Klarna\Kp\Api\QuoteInterface
- * @throws CouldNotSaveException
- */
- public function save(QuoteInterface $quote)
- {
- try {
- return $this->resourceModel->save($quote);
- } catch (\Exception $e) {
- throw new CouldNotSaveException(__($e->getMessage()));
- }
- }
- /**
- * Load quote by session_id
- *
- * @param string $sessionId
- * @param bool $forceReload
- * @return QuoteInterface
- * @throws \Magento\Framework\Exception\NoSuchEntityException
- */
- public function getBySessionId($sessionId, $forceReload = false)
- {
- if ($forceReload || !isset($this->instances[$sessionId])) {
- $quote = $this->loadQuote('load', 'session_id', $sessionId);
- $this->cacheInstance($quote);
- }
- return $this->instances[$sessionId];
- }
- }
|