diff --git a/packages/Sarga/API/Http/Controllers/Carts.php b/packages/Sarga/API/Http/Controllers/Carts.php index f9c44a391..4ec49900d 100644 --- a/packages/Sarga/API/Http/Controllers/Carts.php +++ b/packages/Sarga/API/Http/Controllers/Carts.php @@ -25,12 +25,13 @@ class Carts extends CartController 'data' => $cart ? new CartResource($cart) : null, ]); } + /** * Add item to the cart. * - * @param \Illuminate\Http\Request $request - * @param \Webkul\Customer\Repositories\WishlistRepository $wishlistRepository - * @param int $productId + * @param \Illuminate\Http\Request $request + * @param \Webkul\Customer\Repositories\WishlistRepository $wishlistRepository + * @param int $productId * @return \Illuminate\Http\Response */ public function add(Request $request, WishlistRepository $wishlistRepository, int $productId) @@ -57,7 +58,7 @@ class Carts extends CartController $cart = Cart::getCart(); return response([ - 'data' => $cart ? new CartResource($cart) : null, + 'data' => $cart ? new CartResource($cart) : null, 'message' => __('rest-api::app.checkout.cart.item.success'), ]); } catch (Exception $e) { @@ -70,8 +71,8 @@ class Carts extends CartController /** * Update the cart. * - * @param \Illuminate\Http\Request $request - * @param \Webkul\Checkout\Repositories\CartItemRepository $cartItemRepository + * @param \Illuminate\Http\Request $request + * @param \Webkul\Checkout\Repositories\CartItemRepository $cartItemRepository * @return \Illuminate\Http\Response */ public function update(Request $request, CartItemRepository $cartItemRepository) @@ -103,14 +104,15 @@ class Carts extends CartController $cart = Cart::getCart(); return response([ - 'data' => $cart ? new CartResource($cart) : null, + 'data' => $cart ? new CartResource($cart) : null, 'message' => __('rest-api::app.checkout.cart.quantity.success'), ]); } + /** * Remove item from the cart. * - * @param int $cartItemId + * @param int $cartItemId * @return \Illuminate\Http\Response */ public function removeItem($cartItemId) @@ -126,16 +128,18 @@ class Carts extends CartController $cart = Cart::getCart(); return response([ - 'data' => $cart ? new CartResource($cart) : null, + 'data' => $cart ? new CartResource($cart) : null, 'message' => __('rest-api::app.checkout.cart.item.success'), ]); } + /** * Empty the cart. * * @return \Illuminate\Http\Response */ - function empty() { + function empty() + { Event::dispatch('checkout.cart.delete.before'); Cart::deActivateCart(); @@ -145,14 +149,15 @@ class Carts extends CartController $cart = Cart::getCart(); return response([ - 'data' => $cart ? new CartResource($cart) : null, + 'data' => $cart ? new CartResource($cart) : null, 'message' => __('rest-api::app.checkout.cart.item.success-remove'), ]); } + /** * Move cart item to wishlist. * - * @param int $id + * @param int $id * @return \Illuminate\Http\Response */ public function moveToWishlist($cartItemId) @@ -168,8 +173,59 @@ class Carts extends CartController $cart = Cart::getCart(); return response([ - 'data' => $cart ? new CartResource($cart) : null, + 'data' => $cart ? new CartResource($cart) : null, 'message' => __('rest-api::app.checkout.cart.move-wishlist.success'), ]); } + + /** + * Apply the coupon code. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function applyCoupon(Request $request) + { + $couponCode = $request->code; + + try { + if (strlen($couponCode)) { + Cart::setCouponCode($couponCode)->collectTotals(); + + if (Cart::getCart()->coupon_code == $couponCode) { + return response([ + 'message' => __('rest-api::app.checkout.cart.coupon.success'), + 'cart' => new CartResource(Cart::getCart()) + ]); + } + } + + return response([ + 'message' => __('rest-api::app.checkout.cart.coupon.invalid'), + ], 400); + } catch (\Exception $e) { + report($e); + + return response([ + 'message' => __('rest-api::app.checkout.cart.coupon.apply-issue'), + ], 400); + + } + } + + /** + * Remove the coupon code. + * + * @return \Illuminate\Http\Response + */ + public function removeCoupon() + { + Cart::removeCouponCode()->collectTotals(); + + return response([ + 'message' => __('rest-api::app.checkout.cart.coupon.remove'), + 'cart' => new CartResource(Cart::getCart()) + ]); + + } } \ No newline at end of file diff --git a/packages/Sarga/API/Http/Controllers/Checkout.php b/packages/Sarga/API/Http/Controllers/Checkout.php index cf65cbb19..a888688af 100644 --- a/packages/Sarga/API/Http/Controllers/Checkout.php +++ b/packages/Sarga/API/Http/Controllers/Checkout.php @@ -3,18 +3,15 @@ namespace Sarga\API\Http\Controllers; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Config; use Illuminate\Support\Str; use Sarga\API\Http\Resources\Checkout\CartResource; -use Sarga\API\Http\Resources\Checkout\CartShippingRateResource; use Sarga\API\Http\Resources\Checkout\PickupAddress; use Webkul\Checkout\Facades\Cart; -use Webkul\Checkout\Http\Requests\CustomerAddressForm; use Webkul\Payment\Facades\Payment; use Webkul\RestApi\Http\Controllers\V1\Shop\Customer\CheckoutController; -use Webkul\RestApi\Http\Resources\V1\Shop\Sales\OrderResource; use Webkul\Sales\Repositories\OrderRepository; use Webkul\Shipping\Facades\Shipping; +use Sarga\API\Http\Resources\Sales\Order as OrderResource; class Checkout extends CheckoutController { @@ -58,7 +55,7 @@ class Checkout extends CheckoutController } $shippingMethod = $request->get('shipping_method'); - if (Cart::hasError() || ! Cart::saveCustomerAddress($data) + if (Cart::hasError() || ! Cart::saveCustomerAddress($data) || ! Shipping::collectRates() || ! $shippingMethod || ! Cart::saveShippingMethod($shippingMethod)) { return response(['message'=>'error. wrong shipment method or address'],400); @@ -75,7 +72,31 @@ class Checkout extends CheckoutController ]); } + /** + * Save payment method. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function savePayment(Request $request) + { + $payment = $request->get('payment'); + if (Cart::hasError() || ! $payment || ! Cart::savePaymentMethod($payment)) { + return response([ + 'success' => false, + 'message' => 'Payment unsuccessfull' + + ],400); + } + Cart::collectTotals(); + return response([ + 'data' => [ + 'cart' => new CartResource(Cart::getCart()), + ], + 'message' => 'Payment method saved successfully.', + ]); + } /** * Check for minimum order. * @@ -95,5 +116,71 @@ class Checkout extends CheckoutController 'message' => ! $status ? __('rest-api::app.checkout.minimum-order-message', ['amount' => core()->currency($minimumOrderAmount)]) : 'Success', ]); } + /** + * Save order. + * + * @param \Webkul\Sales\Repositories\OrderRepository $orderRepository + * @return \Illuminate\Http\Response + */ + public function saveOrder(OrderRepository $orderRepository) + { + if (Cart::hasError()) { + abort(400); + } + Cart::collectTotals(); + + $this->validateOrder(); + + $cart = Cart::getCart(); + + if ($redirectUrl = Payment::getRedirectUrl($cart)) { + return response([ + 'redirect_url' => $redirectUrl, + ]); + } + + $order = $orderRepository->create(Cart::prepareDataForOrder()); + + Cart::deActivateCart(); + + return response([ + 'data' => [ + 'order' => new OrderResource($order), + ], + 'message' => 'Order saved successfully.', + ]); + } + + /** + * Validate order before creation. + * + * @return void|\Exception + */ + protected function validateOrder() + { + $cart = Cart::getCart(); + + $minimumOrderAmount = core()->getConfigData('sales.orderSettings.minimum-order.minimum_order_amount') ?? 0; + + if (! $cart->checkMinimumOrder()) { + throw new \Exception(__('rest-api::app.checkout.minimum-order-message', ['amount' => core()->currency($minimumOrderAmount)])); + } + + if ($cart->haveStockableItems() && ! $cart->shipping_address) { + throw new \Exception(__('rest-api::app.checkout.check-shipping-address')); + } + + if (! $cart->billing_address) { + throw new \Exception(__('rest-api::app.checkout.check-billing-address')); + } + + if ($cart->haveStockableItems() && ! $cart->selected_shipping_rate) { + throw new \Exception(__('rest-api::app.checkout.specify-shipping-method')); + } + + if (! $cart->payment) { + throw new \Exception(__('rest-api::app.checkout.specify-payment-method')); + } + } } \ No newline at end of file diff --git a/packages/Sarga/API/Http/Resources/Checkout/CartResource.php b/packages/Sarga/API/Http/Resources/Checkout/CartResource.php index 20e999997..10568a3d5 100644 --- a/packages/Sarga/API/Http/Resources/Checkout/CartResource.php +++ b/packages/Sarga/API/Http/Resources/Checkout/CartResource.php @@ -45,7 +45,6 @@ class CartResource extends JsonResource 'formatted_discount' => core()->formatPrice($this->base_discount_amount, $this->cart_currency_code), 'checkout_method' => $this->checkout_method, 'vendors' => $this->groupByVendors($this->items), - 'selected_shipping_rate' => new CartShippingRateResource($this->selected_shipping_rate), 'payment' => new CartPaymentResource($this->payment), 'billing_address' => new AddressResource($this->billing_address), 'shipping_address' => new AddressResource($this->shipping_address), diff --git a/packages/Sarga/API/Http/Resources/Sales/Order.php b/packages/Sarga/API/Http/Resources/Sales/Order.php new file mode 100644 index 000000000..d0c83e8a3 --- /dev/null +++ b/packages/Sarga/API/Http/Resources/Sales/Order.php @@ -0,0 +1,77 @@ + $this->id, + 'increment_id' => $this->increment_id, + 'status' => $this->status, + 'status_label' => $this->status_label, + 'customer_first_name' => $this->customer_first_name, + 'customer_last_name' => $this->customer_last_name, + 'shipping_method' => $this->shipping_method, + 'shipping_title' => $this->shipping_title, + 'payment_title' => core()->getConfigData('sales.paymentmethods.' . $this->payment->method . '.title'), + 'shipping_description' => $this->shipping_description, + 'coupon_code' => $this->coupon_code, + 'total_item_count' => $this->total_item_count, + 'total_qty_ordered' => $this->total_qty_ordered, + 'grand_total' => $this->grand_total, + 'formated_grand_total' => core()->formatPrice($this->base_grand_total, $this->order_currency_code), + 'grand_total_invoiced' => $this->grand_total_invoiced, + 'formated_grand_total_invoiced' => core()->formatPrice($this->base_grand_total_invoiced, $this->order_currency_code), + 'grand_total_refunded' => $this->grand_total_refunded, + 'formated_grand_total_refunded' => core()->formatPrice($this->base_grand_total_refunded, $this->order_currency_code), + 'sub_total' => $this->sub_total, + 'formated_sub_total' => core()->formatPrice($this->base_sub_total, $this->order_currency_code), + 'sub_total_invoiced' => $this->sub_total_invoiced, + 'formated_sub_total_invoiced' => core()->formatPrice($this->base_sub_total_invoiced, $this->order_currency_code), + 'sub_total_refunded' => $this->sub_total_refunded, + 'discount_percent' => $this->discount_percent, + 'discount_amount' => $this->discount_amount, + 'formated_discount_amount' => core()->formatPrice($this->base_discount_amount, $this->order_currency_code), + 'discount_invoiced' => $this->discount_invoiced, + 'formated_discount_invoiced' => core()->formatPrice($this->base_discount_invoiced, $this->order_currency_code), + 'discount_refunded' => $this->discount_refunded, + 'formated_discount_refunded' => core()->formatPrice($this->base_discount_refunded, $this->order_currency_code), + 'tax_amount' => $this->tax_amount, + 'formated_tax_amount' => core()->formatPrice($this->base_tax_amount, $this->order_currency_code), + 'tax_amount_invoiced' => $this->tax_amount_invoiced, + 'formated_tax_amount_invoiced' => core()->formatPrice($this->base_tax_amount_invoiced, $this->order_currency_code), + 'tax_amount_refunded' => $this->tax_amount_refunded, + 'formated_tax_amount_refunded' => core()->formatPrice($this->base_tax_amount_refunded, $this->order_currency_code), + 'shipping_amount' => $this->shipping_amount, + 'formated_shipping_amount' => core()->formatPrice($this->base_shipping_amount, $this->order_currency_code), + 'shipping_invoiced' => $this->shipping_invoiced, + 'formated_shipping_invoiced' => core()->formatPrice($this->base_shipping_invoiced, $this->order_currency_code), + 'shipping_refunded' => $this->shipping_refunded, + 'formated_shipping_refunded' => core()->formatPrice($this->base_shipping_refunded, $this->order_currency_code), + 'customer' => $this->when($this->customer_id, new CustomerResource($this->customer)), + 'shipping_address' => new OrderAddressResource($this->shipping_address), + 'billing_address' => new OrderAddressResource($this->billing_address), + 'items' => OrderItemResource::collection($this->items), + 'invoices' => InvoiceResource::collection($this->invoices), + 'shipments' => ShipmentResource::collection($this->shipments), + 'updated_at' => $this->updated_at, + 'created_at' => $this->created_at, + ]; + } +} \ No newline at end of file