/home/brandsfa/public_html/app/Http/Controllers/RestAPI/v4/CartController.php
<?php
namespace App\Http\Controllers\RestAPI\v4;
use App\Http\Controllers\Controller;
use App\Models\Cart;
use App\Models\Color;
use App\Utils\CartManager;
use App\Utils\Helpers;
use App\Utils\OrderManager;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class CartController extends Controller
{
public function cart(Request $request)
{
$user = Helpers::get_customer($request);
$cart_query = Cart::with('product','seller.shop');
if($user == 'offline'){
$cart = $cart_query->where(['customer_id' => $request->guest_id, 'is_guest'=>1])->get()->toArray();
}else{
$cart = $cart_query->where(['customer_id' => $user->id, 'is_guest'=>'0'])->get()->toArray();
}
$items = [];
if($cart) {
foreach($cart as $key => $value){
if(!isset($value['product'])){
$cart_data = Cart::find($value['id']);
$cart_data->delete();
unset($cart[$key]);
}
}
foreach($cart as $data) {
$data['minimum_order_amount_info'] = OrderManager::minimum_order_amount_verify($request, $data['cart_group_id']);
$cart_group = Cart::where(['product_type'=>'physical'])->where('cart_group_id', $data['cart_group_id'])->get()->groupBy('cart_group_id');
if(isset($cart_group[$data['cart_group_id']])){
$data['free_delivery_order_amount'] = OrderManager::free_delivery_order_amount($data['cart_group_id']);
}else{
$data['free_delivery_order_amount'] = [
'status'=> 0,
'amount'=> 0,
'percentage'=> 0,
'shipping_cost_saved' => 0,
];
}
$colors = json_decode($data['product']['colors']);
$formatted_colors = [];
if(!empty($colors)){
$query_data = Color::whereIn('code', $colors)->pluck('name', 'code')->toArray();
foreach ($query_data as $key => $color) {
$formatted_colors[] = array(
'name' => $color,
'code' => $key,
);
}
}
$variants = is_array($data['product']['variation']) ? $data['product']['variation'] : json_decode($data['product']['variation']);
$data['product']['colors_formatted'] = $formatted_colors;
$data['product']['images'] = is_array($data['product']['images']) ? $data['product']['images'] : json_decode($data['product']['images']);
$data['product']['color_image'] = is_array($data['product']['color_image']) ? $data['product']['color_image'] : json_decode($data['product']['color_image']);
$data['product']['choice_options'] = is_array($data['product']['choice_options']) ? $data['product']['choice_options'] : json_decode($data['product']['choice_options']);
$data['variation'] = $variants;
$data['colors_formatted'] = $data['product']['colors_formatted'];
$data['images'] = $data['product']['images'];
$data['color_image'] = $data['product']['color_image'];
$data['choice_options'] = $data['product']['choice_options'];
$data['current_stock'] = $data['product']['current_stock'];
$data['tax'] = $data['product']['tax'];
$data['tax_type'] = $data['product']['tax_type'];
$data['tax_model'] = $data['product']['tax_model'];
$data['discount_type'] = 'flat';
$data['unit_price'] = $data['product']['unit_price'];
$data['minimum_order_qty'] = $data['product']['minimum_order_qty'];
if (isset($data['product']['variation']) && !empty($variants)) {
foreach ($variants as $var) {
if ($data['variant'] == $var->type) {
$selected_data = [
'id' => $data['product_id'],
'color' => $data['color'],
'quantity' => $data['quantity'],
'variant' => $data['variant'],
];
$data['product']['selected_data'] = !$data['choices'] ? array_merge($selected_data, get_object_vars($data['choices'])) : $selected_data;
}
}
$data['product']['variation'] = $variants;
}else{
$data['product']['selected_data'] = [
'id' => $data['product_id'],
'quantity' => $data['quantity'],
];
$data['product']['variation'] = [];
}
unset($data['product']['colors']);
$items[] = $data;
}
}
return response()->json($items, 200);
}
public function add_to_cart(Request $request)
{
$validator = Validator::make($request->all(), [
'id' => 'required',
'quantity' => 'required',
], [
'id.required' => 'Product ID is required'
]);
if ($validator->errors()->count() > 0) {
return response()->json(['errors' => Helpers::error_processor($validator)]);
}
$cart = CartManager::add_to_cart($request);
return response()->json($cart, 200);
}
public function update_cart(Request $request)
{
$validator = Validator::make($request->all(), [
'key' => 'required',
'quantity' => 'required',
], [
'key.required' => 'Cart key or ID is required'
]);
if ($validator->errors()->count() > 0) {
return response()->json(['errors' => Helpers::error_processor($validator)]);
}
$response = CartManager::update_cart_qty($request);
return response()->json($response);
}
public function remove_from_cart(Request $request)
{
$validator = Validator::make($request->all(), [
'key' => 'required'
], [
'key.required' => 'Cart key or ID is required'
]);
if ($validator->errors()->count() > 0) {
return response()->json(['errors' => Helpers::error_processor($validator)]);
}
$user = Helpers::get_customer($request);
Cart::where([
'id' => $request->key,
'customer_id' => ($user == 'offline' ? $request->guest_id : $user->id),
'is_guest' => ($user == 'offline' ? 1 : '0'),
])->delete();
return response()->json('Successfully removed');
}
public function remove_all_from_cart(Request $request)
{
$user = Helpers::get_customer($request);
Cart::where([
'customer_id'=> ($user == 'offline' ? $request->guest_id : $user->id),
'is_guest' => ($user == 'offline' ? 1 : '0'),
])->delete();
return response()->json('Successfully removed');
}
}