ReservationBuilder.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\InventoryReservations\Model;
  8. use Magento\Framework\ObjectManagerInterface;
  9. use Magento\Framework\Validation\ValidationException;
  10. use Magento\Framework\Validation\ValidationResult;
  11. use Magento\Framework\Validation\ValidationResultFactory;
  12. use Magento\InventoryReservationsApi\Model\ReservationInterface;
  13. use Magento\InventoryReservationsApi\Model\ReservationBuilderInterface;
  14. /**
  15. * @inheritdoc
  16. */
  17. class ReservationBuilder implements ReservationBuilderInterface
  18. {
  19. /**
  20. * @var int
  21. */
  22. private $stockId;
  23. /**
  24. * @var string
  25. */
  26. private $sku;
  27. /**
  28. * @var float
  29. */
  30. private $quantity;
  31. /**
  32. * @var string
  33. */
  34. private $metadata;
  35. /**
  36. * @var ObjectManagerInterface
  37. */
  38. private $objectManager;
  39. /**
  40. * @var SnakeToCamelCaseConverter
  41. */
  42. private $snakeToCamelCaseConverter;
  43. /**
  44. * @var ValidationResultFactory
  45. */
  46. private $validationResultFactory;
  47. /**
  48. * @param ObjectManagerInterface $objectManager
  49. * @param SnakeToCamelCaseConverter $snakeToCamelCaseConverter
  50. * @param ValidationResultFactory $validationResultFactory
  51. */
  52. public function __construct(
  53. ObjectManagerInterface $objectManager,
  54. SnakeToCamelCaseConverter $snakeToCamelCaseConverter,
  55. ValidationResultFactory $validationResultFactory
  56. ) {
  57. $this->objectManager = $objectManager;
  58. $this->snakeToCamelCaseConverter = $snakeToCamelCaseConverter;
  59. $this->validationResultFactory = $validationResultFactory;
  60. }
  61. /**
  62. * @inheritdoc
  63. */
  64. public function setStockId(int $stockId): ReservationBuilderInterface
  65. {
  66. $this->stockId = $stockId;
  67. return $this;
  68. }
  69. /**
  70. * @inheritdoc
  71. */
  72. public function setSku(string $sku): ReservationBuilderInterface
  73. {
  74. $this->sku = $sku;
  75. return $this;
  76. }
  77. /**
  78. * @inheritdoc
  79. */
  80. public function setQuantity(float $quantity): ReservationBuilderInterface
  81. {
  82. $this->quantity = $quantity;
  83. return $this;
  84. }
  85. /**
  86. * @inheritdoc
  87. */
  88. public function setMetadata(string $metadata = null): ReservationBuilderInterface
  89. {
  90. $this->metadata = $metadata;
  91. return $this;
  92. }
  93. /**
  94. * @inheritdoc
  95. */
  96. public function build(): ReservationInterface
  97. {
  98. /** @var ValidationResult $validationResult */
  99. $validationResult = $this->validate();
  100. if (!$validationResult->isValid()) {
  101. throw new ValidationException(__('Validation error'), null, 0, $validationResult);
  102. }
  103. $data = [
  104. ReservationInterface::RESERVATION_ID => null,
  105. ReservationInterface::STOCK_ID => $this->stockId,
  106. ReservationInterface::SKU => $this->sku,
  107. ReservationInterface::QUANTITY => $this->quantity,
  108. ReservationInterface::METADATA => $this->metadata,
  109. ];
  110. $arguments = $this->convertArrayKeysFromSnakeToCamelCase($data);
  111. $reservation = $this->objectManager->create(ReservationInterface::class, $arguments);
  112. $this->reset();
  113. return $reservation;
  114. }
  115. /**
  116. * @return ValidationResult
  117. */
  118. private function validate()
  119. {
  120. $errors = [];
  121. if (null === $this->stockId) {
  122. $errors[] = __('"%field" is expected to be a number.', ['field' => ReservationInterface::STOCK_ID]);
  123. }
  124. if (null === $this->sku || '' === trim($this->sku)) {
  125. $errors[] = __('"%field" can not be empty.', ['field' => ReservationInterface::SKU]);
  126. }
  127. if (null === $this->quantity) {
  128. $errors[] = __('"%field" can not be null.', ['field' => ReservationInterface::QUANTITY]);
  129. }
  130. return $this->validationResultFactory->create(['errors' => $errors]);
  131. }
  132. /**
  133. * Used to clean state after object creation
  134. * @return void
  135. */
  136. private function reset()
  137. {
  138. $this->stockId = null;
  139. $this->sku = null;
  140. $this->quantity = null;
  141. $this->metadata = null;
  142. }
  143. /**
  144. * Used to convert database field names (that use snake case) into constructor parameter names (that use camel case)
  145. * to avoid to define them twice in domain model interface.
  146. *
  147. * @param array $array
  148. * @return array
  149. */
  150. private function convertArrayKeysFromSnakeToCamelCase(array $array): array
  151. {
  152. $convertedArrayKeys = $this->snakeToCamelCaseConverter->convert(array_keys($array));
  153. return array_combine($convertedArrayKeys, array_values($array));
  154. }
  155. }