From ae766763b25723de037a3a1c22bdcd934c656d29 Mon Sep 17 00:00:00 2001 From: Oliver Davies Date: Mon, 8 Jun 2020 19:33:49 +0100 Subject: [PATCH] Allow for easily sending multiple order items This allows for the sending of multiple items in a single order, by adding a new `OrderItem` class and moving all of the order item specific fields from the `Order` to an individual item. These can then be assigned to an order using the `withOrderItems()` method as an array of order items. Fixes #19 --- src/Glassboxx/Request/OrderRequest.php | 47 ++++++++++++------- .../Request/OrderRequestInterface.php | 2 + src/Glassboxx/ValueObject/Order.php | 22 +-------- src/Glassboxx/ValueObject/OrderInterface.php | 8 +--- src/Glassboxx/ValueObject/OrderItem.php | 30 ++++++++++++ .../ValueObject/OrderItemInterface.php | 10 ++++ tests/Glassboxx/Request/OrderRequestTest.php | 12 +++++ tests/Glassboxx/TestCase.php | 2 - tests/Glassboxx/ValueObject/OrderTest.php | 6 +-- 9 files changed, 86 insertions(+), 53 deletions(-) create mode 100644 src/Glassboxx/ValueObject/OrderItem.php create mode 100644 src/Glassboxx/ValueObject/OrderItemInterface.php diff --git a/src/Glassboxx/Request/OrderRequest.php b/src/Glassboxx/Request/OrderRequest.php index 428ece2..a9d5762 100644 --- a/src/Glassboxx/Request/OrderRequest.php +++ b/src/Glassboxx/Request/OrderRequest.php @@ -8,6 +8,7 @@ use Opdavies\Glassboxx\Enum\InteractionType; use Opdavies\Glassboxx\Traits\UsesAuthTokenTrait; use Opdavies\Glassboxx\Traits\UsesCreatedAtTrait; use Opdavies\Glassboxx\ValueObject\OrderInterface; +use Opdavies\Glassboxx\ValueObject\OrderItem; use RuntimeException; class OrderRequest extends AbstractRequest implements OrderRequestInterface @@ -18,6 +19,9 @@ class OrderRequest extends AbstractRequest implements OrderRequestInterface /** @var OrderInterface|null */ private $order; + /** @var OrderItem[] */ + private $orderItems = []; + public function forOrder(OrderInterface $order): AbstractRequest { $this->order = $order; @@ -25,6 +29,13 @@ class OrderRequest extends AbstractRequest implements OrderRequestInterface return $this; } + public function withOrderItems(array $orderItems): AbstractRequest + { + $this->orderItems = $orderItems; + + return $this; + } + public function execute(): string { if (!$this->config) { @@ -39,24 +50,24 @@ class OrderRequest extends AbstractRequest implements OrderRequestInterface throw new RuntimeException('There is no customer'); } - $body = [ - 'items' => [ - [ - 'created_at' => $this->getCreatedAtDate(), - 'currency_code' => $this->order->getCurrencyCode(), - 'customer_email' => $this->order->getCustomer()->getEmailAddress(), - 'customer_firstname' => $this->order->getCustomer()->getFirstName(), - 'customer_lastname' => $this->order->getCustomer()->getLastName(), - 'discount_amount' => 0, - 'duration_for_loan' => 0, - 'hostname' => $this->config->getVendorId(), - 'original_order_number' => $this->order->getOrderNumber(), - 'price_incl_tax' => $this->order->getPrice(), - 'sku' => $this->order->getSku(), - 'type_of_interaction' => InteractionType::PURCHASE, - ], - ], - ]; + $body = []; + + foreach ($this->orderItems as $orderItem) { + $body['items'][] = [ + 'created_at' => $this->getCreatedAtDate(), + 'currency_code' => $this->order->getCurrencyCode(), + 'customer_email' => $this->order->getCustomer()->getEmailAddress(), + 'customer_firstname' => $this->order->getCustomer()->getFirstName(), + 'customer_lastname' => $this->order->getCustomer()->getLastName(), + 'discount_amount' => 0, + 'duration_for_loan' => 0, + 'hostname' => $this->config->getVendorId(), + 'original_order_number' => $this->order->getOrderNumber(), + 'price_incl_tax' => $orderItem->getPrice(), + 'sku' => $orderItem->getSku(), + 'type_of_interaction' => InteractionType::PURCHASE, + ]; + } $response = $this->client->request( 'POST', diff --git a/src/Glassboxx/Request/OrderRequestInterface.php b/src/Glassboxx/Request/OrderRequestInterface.php index 6a55a76..200c867 100644 --- a/src/Glassboxx/Request/OrderRequestInterface.php +++ b/src/Glassboxx/Request/OrderRequestInterface.php @@ -12,5 +12,7 @@ interface OrderRequestInterface public function forOrder(OrderInterface $order): AbstractRequest; + public function withOrderItems(array $orderItems): AbstractRequest; + public function execute(): string; } diff --git a/src/Glassboxx/ValueObject/Order.php b/src/Glassboxx/ValueObject/Order.php index c8e821d..504a58d 100644 --- a/src/Glassboxx/ValueObject/Order.php +++ b/src/Glassboxx/ValueObject/Order.php @@ -9,30 +9,20 @@ final class Order implements OrderInterface /** @var CustomerInterface */ private $customer; - /** @var string */ - private $sku; - /** @var string */ private $orderNumber; /** @var string */ private $currencyCode; - /** @var float */ - private $price; - public function __construct( CustomerInterface $customer, - string $sku, string $orderNumber, - string $currencyCode, - float $price + string $currencyCode ) { $this->customer = $customer; - $this->sku = $sku; $this->orderNumber = $orderNumber; $this->currencyCode = $currencyCode; - $this->price = $price; } public function getCurrencyCode(): string @@ -49,14 +39,4 @@ final class Order implements OrderInterface { return $this->orderNumber; } - - public function getPrice(): float - { - return $this->price; - } - - public function getSku(): string - { - return $this->sku; - } } diff --git a/src/Glassboxx/ValueObject/OrderInterface.php b/src/Glassboxx/ValueObject/OrderInterface.php index 8fa4d85..3b51671 100644 --- a/src/Glassboxx/ValueObject/OrderInterface.php +++ b/src/Glassboxx/ValueObject/OrderInterface.php @@ -6,10 +6,8 @@ interface OrderInterface { public function __construct( CustomerInterface $customer, - string $sku, string $orderNumber, - string $currencyCode, - float $price + string $currencyCode ); public function getCurrencyCode(): string; @@ -17,8 +15,4 @@ interface OrderInterface public function getCustomer(): CustomerInterface; public function getOrderNumber(): string; - - public function getPrice(): float; - - public function getSku(): string; } diff --git a/src/Glassboxx/ValueObject/OrderItem.php b/src/Glassboxx/ValueObject/OrderItem.php new file mode 100644 index 0000000..8ec451a --- /dev/null +++ b/src/Glassboxx/ValueObject/OrderItem.php @@ -0,0 +1,30 @@ +price = $price; + $this->sku = $sku; + } + + public function getPrice(): float + { + return $this->price; + } + + public function getSku(): string + { + return $this->sku; + } +} diff --git a/src/Glassboxx/ValueObject/OrderItemInterface.php b/src/Glassboxx/ValueObject/OrderItemInterface.php new file mode 100644 index 0000000..5091064 --- /dev/null +++ b/src/Glassboxx/ValueObject/OrderItemInterface.php @@ -0,0 +1,10 @@ +forOrder($this->getMockOrder()) + ->withOrderItems([$this->getMockOrderItem()]) ->withAuthToken($authTokenRequest->getToken()) ->withConfig($this->config) ->setCreatedDate('2020-06-04 12:00:00'); @@ -63,4 +65,14 @@ final class OrderRequestTest extends TestCase // A successful response returns the original body. $this->assertSame(json_encode($body), $request->execute()); } + + private function getMockOrderItem(): OrderItemInterface + { + $orderItem = $this->getMockBuilder(OrderItemInterface::class) + ->getMock(); + $orderItem->method('getPrice')->willReturn(7.99); + $orderItem->method('getSku')->willReturn('this-is-the-first-sku'); + + return $orderItem; + } } diff --git a/tests/Glassboxx/TestCase.php b/tests/Glassboxx/TestCase.php index 463dd1b..897ed35 100644 --- a/tests/Glassboxx/TestCase.php +++ b/tests/Glassboxx/TestCase.php @@ -60,8 +60,6 @@ class TestCase extends \PHPUnit\Framework\TestCase $order->method('getCurrencyCode')->willReturn('GBP'); $order->method('getCustomer')->willReturn($this->getMockCustomer()); $order->method('getOrderNumber')->willReturn('abc123'); - $order->method('getPrice')->willReturn(7.99); - $order->method('getSku')->willReturn('this-is-the-first-sku'); return $order; } diff --git a/tests/Glassboxx/ValueObject/OrderTest.php b/tests/Glassboxx/ValueObject/OrderTest.php index bf561e5..06388c6 100644 --- a/tests/Glassboxx/ValueObject/OrderTest.php +++ b/tests/Glassboxx/ValueObject/OrderTest.php @@ -19,16 +19,12 @@ class OrderTest extends TestCase $order = new Order( $customer, - 'this-is-the-sku', '123', - 'GBP', - 10.00 + 'GBP' ); $this->assertSame('GBP', $order->getCurrencyCode()); $this->assertSame($customer, $order->getCustomer()); $this->assertSame('123', $order->getOrderNumber()); - $this->assertSame(10.0, $order->getPrice()); - $this->assertSame('this-is-the-sku', $order->getSku()); } }