Files
elcaribe/app/Http/Controllers/Api/V2/OrderController.php
2023-08-07 15:52:04 -04:00

258 lines
10 KiB
PHP

<?php
namespace App\Http\Controllers\Api\V2;
use App\Models\Address;
use Illuminate\Http\Request;
use App\Models\Order;
use App\Models\Cart;
use App\Models\Product;
use App\Models\OrderDetail;
use App\Models\Coupon;
use App\Models\CouponUsage;
use App\Models\BusinessSetting;
use App\Models\User;
use DB;
use \App\Utility\NotificationUtility;
use App\Models\CombinedOrder;
use App\Http\Controllers\AffiliateController;
class OrderController extends Controller
{
public function store(Request $request, $set_paid = false)
{
if (get_setting('minimum_order_amount_check') == 1) {
$subtotal = 0;
foreach (Cart::where('user_id', auth()->user()->id)->get() as $key => $cartItem) {
$product = Product::find($cartItem['product_id']);
$subtotal += cart_product_price($cartItem, $product, false, false) * $cartItem['quantity'];
}
if ($subtotal < get_setting('minimum_order_amount')) {
return $this->failed("You order amount is less then the minimum order amount");
}
}
$cartItems = Cart::where('user_id', auth()->user()->id)->get();
if ($cartItems->isEmpty()) {
return response()->json([
'combined_order_id' => 0,
'result' => false,
'message' => translate('Cart is Empty')
]);
}
$user = User::find(auth()->user()->id);
$address = Address::where('id', $cartItems->first()->address_id)->first();
$shippingAddress = [];
if ($address != null) {
$shippingAddress['name'] = $user->name;
$shippingAddress['email'] = $user->email;
$shippingAddress['address'] = $address->address;
$shippingAddress['country'] = $address->country->name;
$shippingAddress['state'] = $address->state->name;
$shippingAddress['city'] = $address->city->name;
$shippingAddress['postal_code'] = $address->postal_code;
$shippingAddress['phone'] = $address->phone;
if ($address->latitude || $address->longitude) {
$shippingAddress['lat_lang'] = $address->latitude . ',' . $address->longitude;
}
}
$combined_order = new CombinedOrder;
$combined_order->user_id = $user->id;
$combined_order->shipping_address = json_encode($shippingAddress);
$combined_order->save();
$seller_products = array();
foreach ($cartItems as $cartItem) {
$product_ids = array();
$product = Product::find($cartItem['product_id']);
if (isset($seller_products[$product->user_id])) {
$product_ids = $seller_products[$product->user_id];
}
array_push($product_ids, $cartItem);
$seller_products[$product->user_id] = $product_ids;
}
foreach ($seller_products as $seller_product) {
$order = new Order;
$order->combined_order_id = $combined_order->id;
$order->user_id = $user->id;
$order->shipping_address = $combined_order->shipping_address;
// $order->shipping_type = $cartItems->first()->shipping_type;
// if ($cartItems->first()->shipping_type == 'pickup_point') {
// $order->pickup_point_id = $cartItems->first()->pickup_point;
// }
$order->order_from = 'app';
$order->payment_type = $request->payment_type;
$order->delivery_viewed = '0';
$order->payment_status_viewed = '0';
$order->code = date('Ymd-His') . rand(10, 99);
$order->date = strtotime('now');
if ($set_paid) {
$order->payment_status = 'paid';
} else {
$order->payment_status = 'unpaid';
}
$order->save();
$subtotal = 0;
$tax = 0;
$shipping = 0;
$coupon_discount = 0;
//Order Details Storing
foreach ($seller_product as $cartItem) {
$product = Product::find($cartItem['product_id']);
$subtotal += cart_product_price($cartItem, $product, false, false) * $cartItem['quantity'];
$tax += cart_product_tax($cartItem, $product, false) * $cartItem['quantity'];
$coupon_discount += $cartItem['discount'];
$product_variation = $cartItem['variation'];
$product_stock = $product->stocks->where('variant', $product_variation)->first();
if ($product->digital != 1 && $cartItem['quantity'] > $product_stock->qty) {
$order->delete();
$combined_order->delete();
return response()->json([
'combined_order_id' => 0,
'result' => false,
'message' => translate('The requested quantity is not available for ') . $product->name
]);
} elseif ($product->digital != 1) {
$product_stock->qty -= $cartItem['quantity'];
$product_stock->save();
}
$order_detail = new OrderDetail;
$order_detail->order_id = $order->id;
$order_detail->seller_id = $product->user_id;
$order_detail->product_id = $product->id;
$order_detail->variation = $product_variation;
$order_detail->price = cart_product_price($cartItem, $product, false, false) * $cartItem['quantity'];
$order_detail->tax = cart_product_tax($cartItem, $product, false) * $cartItem['quantity'];
$order_detail->shipping_type = $cartItem['shipping_type'];
$order_detail->product_referral_code = $cartItem['product_referral_code'];
$order_detail->shipping_cost = $cartItem['shipping_cost'];
$shipping += $order_detail->shipping_cost;
// if ($cartItem['shipping_type'] == 'pickup_point') {
// $order_detail->pickup_point_id = $cartItem['pickup_point'];
// }
//End of storing shipping cost
if (addon_is_activated('club_point')) {
$order_detail->earn_point = $product->earn_point;
}
$order_detail->quantity = $cartItem['quantity'];
$order_detail->save();
$product->num_of_sale = $product->num_of_sale + $cartItem['quantity'];
$product->save();
$order->seller_id = $product->user_id;
//======== Added By Kiron ==========
$order->shipping_type = $cartItem['shipping_type'];
if ($cartItem['shipping_type'] == 'pickup_point') {
$order->pickup_point_id = $cartItem['pickup_point'];
}
if ($cartItem['shipping_type'] == 'carrier') {
$order->carrier_id = $cartItem['carrier_id'];
}
if ($product->added_by == 'seller' && $product->user->seller != null) {
$seller = $product->user->seller;
$seller->num_of_sale += $cartItem['quantity'];
$seller->save();
}
if (addon_is_activated('affiliate_system')) {
if ($order_detail->product_referral_code) {
$referred_by_user = User::where('referral_code', $order_detail->product_referral_code)->first();
$affiliateController = new AffiliateController;
$affiliateController->processAffiliateStats($referred_by_user->id, 0, $order_detail->quantity, 0, 0);
}
}
}
$order->grand_total = $subtotal + $tax + $shipping;
if ($seller_product[0]->coupon_code != null) {
// if (Session::has('club_point')) {
// $order->club_point = Session::get('club_point');
// }
$order->coupon_discount = $coupon_discount;
$order->grand_total -= $coupon_discount;
$coupon_usage = new CouponUsage;
$coupon_usage->user_id = $user->id;
$coupon_usage->coupon_id = Coupon::where('code', $seller_product[0]->coupon_code)->first()->id;
$coupon_usage->save();
}
$combined_order->grand_total += $order->grand_total;
if (strpos($request->payment_type, "manual_payment_") !== false) { // if payment type like manual_payment_1 or manual_payment_25 etc)
$order->manual_payment = 1;
$order->save();
}
$order->save();
}
$combined_order->save();
Cart::where('user_id', auth()->user()->id)->delete();
if (
$request->payment_type == 'cash_on_delivery'
|| $request->payment_type == 'wallet'
|| strpos($request->payment_type, "manual_payment_") !== false // if payment type like manual_payment_1 or manual_payment_25 etc
) {
NotificationUtility::sendOrderPlacedNotification($order);
}
return response()->json([
'combined_order_id' => $combined_order->id,
'result' => true,
'message' => translate('Your order has been placed successfully')
]);
}
public function order_cancel($id)
{
$order = Order::where('id', $id)->where('user_id', auth()->user()->id)->first();
if ($order && ($order->delivery_status == 'pending' && $order->payment_status == 'unpaid')) {
$order->delivery_status = 'cancelled';
$order->save();
foreach ($order->orderDetails as $key => $orderDetail) {
$orderDetail->delivery_status = 'cancelled';
$orderDetail->save();
product_restock($orderDetail);
}
return $this->success(translate('Order has been canceled successfully'));
} else {
return $this->failed(translate('Something went wrong'));
}
}
}