diff --git a/src/Stache/Repositories/OrderRepository.php b/src/Stache/Repositories/OrderRepository.php index 5b362738..5a792c94 100644 --- a/src/Stache/Repositories/OrderRepository.php +++ b/src/Stache/Repositories/OrderRepository.php @@ -6,6 +6,7 @@ use DuncanMcClean\Cargo\Contracts\Orders\Order; use DuncanMcClean\Cargo\Contracts\Orders\OrderRepository as RepositoryContract; use DuncanMcClean\Cargo\Contracts\Orders\QueryBuilder; +use DuncanMcClean\Cargo\Customers\GuestCustomer; use DuncanMcClean\Cargo\Exceptions\OrderNotFound; use DuncanMcClean\Cargo\Orders\Blueprint; use Illuminate\Support\Carbon; @@ -57,6 +58,18 @@ public function make(): Order public function makeFromCart(Cart $cart): Order { + $data = $cart->data(); + + if ($cart->customer() && ! $cart->customer() instanceof GuestCustomer) { + $hasExistingOrders = $this->query() + ->where('customer', $cart->customer()->getKey()) + ->exists(); + + if (! $hasExistingOrders) { + $data->put('new_customer', true); + } + } + return self::make() ->cart($cart->id()) ->site($cart->site()) @@ -67,7 +80,7 @@ public function makeFromCart(Cart $cart): Order ->discountTotal($cart->discountTotal()) ->taxTotal($cart->taxTotal()) ->shippingTotal($cart->shippingTotal()) - ->data($cart->data()->toArray()); + ->data($data->toArray()); } public function save(Order $order): void diff --git a/tests/Orders/MakeOrderFromCartTest.php b/tests/Orders/MakeOrderFromCartTest.php index e76b89ef..32be68e5 100644 --- a/tests/Orders/MakeOrderFromCartTest.php +++ b/tests/Orders/MakeOrderFromCartTest.php @@ -7,6 +7,7 @@ use PHPUnit\Framework\Attributes\Test; use Statamic\Facades\Collection; use Statamic\Facades\Entry; +use Statamic\Facades\User; use Statamic\Testing\Concerns\PreventsSavingStacheItemsToDisk; use Tests\TestCase; @@ -68,4 +69,31 @@ public function it_can_make_an_order_from_a_cart() 'status' => 'payment_pending', ], $order->fileData()); } + + #[Test] + public function it_adds_the_new_customer_flag_when_its_the_customers_first_order() + { + $user = User::make()->id('user-123')->email('first.time@example.com')->save(); + + $cart = Cart::make()->customer($user); + + $order = Order::makeFromCart($cart); + + $this->assertEquals('user-123', $order->customer()->id()); + $this->assertEquals(true, $order->get('new_customer')); + } + + #[Test] + public function it_doesnt_add_the_new_customer_flag_when_the_customer_has_past_orders() + { + $user = User::make()->id('user-123')->email('first.time@example.com')->save(); + Order::make()->customer($user)->save(); + + $cart = Cart::make()->customer($user); + + $order = Order::makeFromCart($cart); + + $this->assertEquals('user-123', $order->customer()->id()); + $this->assertNull($order->get('new_customer')); + } }