public function createOrder(User $user, Seller $seller, Collection $cartItems, Address $address = null, PaymentMethod $paymentMethod = null, $shippingOptions = []) { if ($address) { $address->setFeeType($seller); } // prepare order item models $orderItems = collect([]); foreach ($cartItems as $cartItem) { $orderItems->push($this->getOrderItemRepository()->getNew(compact('address', 'cartItem') + ['shippingOption' => $shippingOptions[$cartItem->id] ?? null])); $product = $cartItem->getProduct(); $variant = $cartItem->getVariant(); if (!is_null($product->stock)) { $product->stock = $product->stock - $cartItem->quantity; $product->save(); } if ($variant and !is_null($variant->stock)) { $variant->stock = $variant->stock - $cartItem->quantity; $variant->save(); } $this->getCartItemRepository()->delete($cartItem); } // prepare the order model $order = $this->getOrderRepository()->getNew(compact('seller', 'user', 'orderItems', 'address', 'paymentMethod')); // associate and persist list($saved, $order) = $this->getOrderRepository()->save($order); if ($saved) { foreach ($orderItems as $orderItem) { /** @var OrderItem $orderItem */ $this->getOrderItemRepository()->save($orderItem->setOrder($order)); } } return $order; }
private function checkProductHasNoValidShippingPlanForAddress($product) { if (!$this->address) { return true; } $this->address->setFeeType($this->seller); $shippingPlans = $this->shippingPlanRepository->findWhereProduct($product); foreach ($shippingPlans as $shippingPlan) { foreach ($shippingPlan->shippingOptions as $option) { if (isset($option->{$this->address->getFeeType()}) and $option->{$this->address->getFeeType()}) { return false; } } } return true; }