MIF_E31210863/app/Http/Controllers/API/CartController.php

412 lines
12 KiB
PHP

<?php
namespace App\Http\Controllers\API;
use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use App\Http\Controllers\API\BaseController;
use App\Http\Resources\Item as ItemResource;
use App\Models\Review;
use GuzzleHttp\Exception\GuzzleException;
use PhpParser\Node\Stmt\TryCatch;
class CartController extends BaseController
{
public function index(Request $request,$sessionKey = null)
{
if ($sessionKey = $request->user()->id) {
$cart = \Cart::session($sessionKey)->getContent();
}else{
$cart = \Cart::getContent();
}
if ($sessionKey) {
$shipping_cost = \Cart::session($sessionKey)->getCondition('shipping_cost');
}
$shipping_cost = \Cart::getCondition('shipping_cost');
$condition = new \Darryldecode\Cart\CartCondition(
[
'name' => 'TAX 10%',
'type' => 'tax',
'target' => 'subtotal',
'value' => '10%',
]
);
if ($sessionKey) {
\Cart::session($sessionKey)->removeConditionsByType('tax');
\Cart::session($sessionKey)->condition($condition);
} else {
\Cart::removeConditionsByType('tax');
\Cart::condition($condition);
}
if ($sessionKey) {
$tax = \Cart::session($sessionKey)->getCondition('TAX 10%');
}
$tax = \Cart::getCondition('TAX 10%');
if ($sessionKey) {
$subTotal = \Cart::session($sessionKey)->getSubTotal();
}
$subTotal = \Cart::getSubTotal();
if ($sessionKey) {
$total = \Cart::session($sessionKey)->getTotal();
}
$total = \Cart::getTotal();
$carts = [
'item' => ItemResource::collection($cart),
'shipping_cost' => $shipping_cost,
'tax' => $tax,
'sub_total' => $subTotal,
'total' => $total,
];
return $this->responseOk($carts,200,'success');
}
public function store(Request $request, $sessionKey = 0)
{
$validator = Validator::make($request->all(), [
'slug' => 'required',
'qty' => 'required'
]);
if($validator->fails()){
return $this->responseError('add item failed !', 422, $validator->errors());
}
$params = $request->all();
$product = Product::where('slug',$params['slug'])->firstOrFail();
$carts = \Cart::getContent();
$itemQuantity = 0;
if ($carts) {
foreach ($carts as $cart) {
if ($cart->id == $product->id) {
$itemQuantity = $cart->quantity;
break;
}
}
}
$itemQuantity += $request->qty;
if ($product->quantity < $itemQuantity) {
// throw new \App\Exceptions\OutOfStockException('The product '. $product->sku .' is out of stock');
}
$item = [
'id' => md5($product->id),
'name' => $product->name,
'price' => $product->price,
'quantity' => $request->qty,
'associatedModel' => $product,
];
if ($sessionKey = $request->user()->id) {
\Cart::session($sessionKey)->add($item);
$carts = \Cart::getContent();
return $this->responseOk(true,200,'success');
}else{
\Cart::add($item);
return $this->responseOk(true, 200,'success');
}
return $this->responseError('add item failed !', 422);
}
public function update(Request $request, $id)
{
$params = $request->all();
$validator = Validator::make($params, [
'quantity' => 'required|numeric'
]);
if($validator->fails()){
return $this->responseError('update failed !', 422,$validator->errors());
}
$sessionKey = $request->user()->id;
if ($sessionKey) {
$carts = \Cart::session($sessionKey)->getContent();
}else{
$carts = \Cart::getContent();
}
$item = !(empty($carts[$id])) ? $carts[$id] : null;
if(!$item){
return $this->responseError('item not found !', 404);
}
if ($item->quantity < $params['quantity'] ) {
// throw new \App\Exceptions\OutOfStockException('The product '. $carts[$cartId]->associatedModel->sku .' is out of stock');
}
$cartUpdate = \Cart::update($id,[
'quantity' => [
'relative' => false,
'value' => $params['quantity'],
],
]);
return $this->responseOk($cartUpdate, 200,'the item has been updated !');
}
public function destroy(Request $request, $id)
{
$sessionKey = $request->user()->id;
if ($sessionKey) {
$carts = \Cart::session($sessionKey)->getContent();
}else{
$carts = \Cart::getContent();
}
$item = !(empty($carts[$id])) ? $carts[$id] : null;
if(!$item){
return $this->responseError('item not found !', 404);
}
if ($sessionKey) {
$cartDelete = \Cart::session($sessionKey)->remove($id);
return $this->responseOk($cartDelete, 200,'the item has been deleted !');
}else {
$cartDelete = \Cart::remove($id);
return $this->responseOk($cartDelete, 200,'the item has been deleted !');
}
$this->responseError('deleted item failed !', 400);
}
public function clear(Request $request){
$sessionKey = $request->user()->id;
if ($sessionKey) {
$cartDestroy = \Cart::session($sessionKey)->clear();
}
$cartDestroy = \Cart::clear();
if($cartDestroy){
return $this->responseOk($cartDestroy, 200, 'the item has been cleared !');
}
return $this->responseError('clear cart item failed !', 400);
}
public function shippingOptions(Request $request)
{
$parameter = $request->all();
$validator = Validator::make($parameter, [
'city_id' => 'required|numeric'
]);
$sessionKey = $request->user()->id;
if($validator->fails()){
return $this->responseError('get shipping options failed !', 422, $validator->errors());
}
if ($sessionKey) {
\Cart::session($sessionKey)->isEmpty();
} else {
\Cart::isEmpty();
}
try {
$totalWeight = 0;
if ($sessionKey) {
$items = \Cart::session($sessionKey)->getContent();
} else {
$items = \Cart::getContent();
}
foreach ($items as $item) {
$totalWeight += ($item->quantity * $item->associatedModel->weight);
}
$params = [
'origin' => env('RAJAONGKIR_ORIGIN'),
'destination' => $parameter['city_id'],
'weight' => $totalWeight,
];
$results = [];
foreach ($this->couriers as $code => $courier) {
$params['courier'] = $code;
$response = $this->rajaOngkirRequest('cost', $params, 'POST');
if (!empty($response['rajaongkir']['results'])) {
foreach ($response['rajaongkir']['results'] as $cost) {
if (!empty($cost['costs'])) {
foreach ($cost['costs'] as $costDetail) {
$serviceName = strtoupper($cost['code']) .' - '. $costDetail['service'];
$costAmount = $costDetail['cost'][0]['value'];
$etd = $costDetail['cost'][0]['etd'];
$result = [
'service' => $serviceName,
'cost' => $costAmount,
'etd' => $etd,
'courier' => $code,
];
$results[] = $result;
}
}
}
}
}
$response = [
'origin' => $params['origin'],
'destination' => $params ['destination'],
'weight' => $totalWeight,
'results' => $results,
];
return $this->responseOk($response, 200,'success !');
} catch (\GuzzleHttp\Exception\RequestException $err) {
return $this->responseError($err->getMessage(), 400);
}
return $this->responseError('get shipping options failed !', 400);
}
public function setShipping(Request $request)
{
$params = $request->all();
$validator = Validator::make($params, [
'city_id' => ['required', 'numeric'],
'shipping_service' => ['required', 'string'],
]);
if ($validator->fails()) {
return $this->responseError('Set shipping failed', 422, $validator->errors());
}
$sessionKey = $request->user()->id;
if ($sessionKey) {
\Cart::session($sessionKey)->removeConditionsByType('shipping');
}
\Cart::removeConditionsByType('shipping');
$shippingService = $request->get('shipping_service');
$destination = $request->get('city_id');
$totalWeight = 0;
if ($sessionKey) {
$items = \Cart::session($sessionKey)->getContent();
} else {
$items = \Cart::getContent();
}
foreach ($items as $item) {
$totalWeight += ($item->quantity * $item->associatedModel->weight);
}
$params = [
'origin' => env('RAJAONGKIR_ORIGIN'),
'destination' => $destination,
'weight' => $totalWeight,
];
$results = [];
foreach ($this->couriers as $code => $courier) {
$params['courier'] = $code;
$response = $this->rajaOngkirRequest('cost', $params, 'POST');
if (!empty($response['rajaongkir']['results'])) {
foreach ($response['rajaongkir']['results'] as $cost) {
if (!empty($cost['costs'])) {
foreach ($cost['costs'] as $costDetail) {
$serviceName = strtoupper($cost['code']) .' - '. $costDetail['service'];
$costAmount = $costDetail['cost'][0]['value'];
$etd = $costDetail['cost'][0]['etd'];
$result = [
'service' => $serviceName,
'cost' => $costAmount,
'etd' => $etd,
'courier' => $code,
];
$results[] = $result;
}
}
}
}
}
$shippingOptions = [
'origin' => $params['origin'],
'destination' => $destination,
'weight' => $totalWeight,
'results' => $results,
];
$selectedShipping = null;
if ($shippingOptions['results']) {
foreach ($shippingOptions['results'] as $shippingOption) {
if (str_replace(' ', '', $shippingOption['service']) == $shippingService) {
$selectedShipping = $shippingOption;
break;
}
}
}
$status = null;
$message = null;
$data = [];
if ($selectedShipping) {
$status = 200;
$message = 'Success set shipping cost';
$condition = new \Darryldecode\Cart\CartCondition(
[
'name' => 'shipping_cost',
'type' => 'shipping',
'target' => 'total',
'value' => '+'. $selectedShipping['cost'],
]
);
\Cart::condition($condition);
if ($sessionKey) {
$carts= \Cart::session($sessionKey)->getTotal();
}
$carts = \Cart::getTotal();
$data['total'] = number_format($carts);
return $this->responseOk($data, 200, 'success');
}
return $this->responseError('Failed to set shipping cost', 400);
}
}