commit1dc4e29c69Author: ncoronel <ncoronel@quo.ar> Date: Wed Aug 19 13:58:03 2026 -0300 refactor(reservations): unify expiration command commit093e894cc3Author: ncoronel <ncoronel@quo.ar> Date: Wed Aug 19 13:48:09 2026 -0300 feat(cart): expire abandoned stock reservations commitfdf0f3328fAuthor: ncoronel <ncoronel@quo.ar> Date: Wed Aug 19 12:53:12 2026 -0300 refactor(stock): implement expiration for stock reservations and add configuration commit8d6bcdcc43Author: ncoronel <ncoronel@quo.ar> Date: Wed Aug 19 12:38:21 2026 -0300 refactor(cart): invalidate payment on actual changes commit3206e293ebAuthor: ncoronel <ncoronel@quo.ar> Date: Wed Aug 19 12:24:48 2026 -0300 refactor(cart): own checkout item editing commitaed99bd05eAuthor: ncoronel <ncoronel@quo.ar> Date: Wed Aug 19 12:14:57 2026 -0300 refactor(checkout): remove legacy purchase item reservations commitf1649e0e4bAuthor: ncoronel <ncoronel@quo.ar> Date: Wed Aug 19 12:06:29 2026 -0300 refactor(checkout): materialize purchase items on confirmation commite6c4b40a37Author: ncoronel <ncoronel@quo.ar> Date: Wed Aug 19 12:06:19 2026 -0300 feat(inventory): add traceable cart stock reservations
121 lines
3.9 KiB
PHP
121 lines
3.9 KiB
PHP
<?php
|
|
|
|
namespace App\Domains\Cart\Controllers;
|
|
|
|
use App\Domains\Cart\Models\Cart;
|
|
use App\Domains\Cart\Models\CartItem;
|
|
use App\Domains\Cart\Requests\AddCartItemRequest;
|
|
use App\Domains\Cart\Requests\UpdateCartItemQuantityRequest;
|
|
use App\Domains\Cart\Resources\CartResource;
|
|
use App\Domains\Cart\Services\CartService;
|
|
use App\Domains\Tenant\Models\Tenant;
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
|
|
class CartController extends Controller
|
|
{
|
|
public function __construct(
|
|
protected CartService $cartService,
|
|
) {}
|
|
|
|
public function show(Request $request, Tenant $tenant): CartResource
|
|
{
|
|
return CartResource::make($this->cartService->show($tenant, $request));
|
|
}
|
|
|
|
public function addItem(AddCartItemRequest $request, Tenant $tenant): JsonResponse
|
|
{
|
|
$result = $this->cartService->addItem(
|
|
$tenant,
|
|
$request,
|
|
(int) $request->validated('catalog_item_id'),
|
|
$request->validated('variant_id') !== null
|
|
? (int) $request->validated('variant_id')
|
|
: null,
|
|
(int) $request->validated('cantidad'),
|
|
);
|
|
|
|
$response = CartResource::make($result['cart'])
|
|
->additional([
|
|
'code' => 'cart.item_added',
|
|
'message' => __('api.cart.item_added'),
|
|
])
|
|
->response();
|
|
|
|
if ($result['guest_token'] !== null) {
|
|
$response->withCookie($this->cartService->makeGuestTokenCookie($result['guest_token']));
|
|
}
|
|
|
|
return $response;
|
|
}
|
|
|
|
public function updateItemQuantity(
|
|
UpdateCartItemQuantityRequest $request,
|
|
Tenant $tenant,
|
|
CartItem $cartItem,
|
|
): CartResource {
|
|
$updatesVariant = $request->exists('variant_id');
|
|
|
|
return CartResource::make(
|
|
$this->cartService->updateItem(
|
|
$tenant,
|
|
$request,
|
|
$cartItem->getKey(),
|
|
(int) $request->validated('cantidad'),
|
|
$updatesVariant
|
|
? ($request->validated('variant_id') !== null
|
|
? (int) $request->validated('variant_id')
|
|
: null)
|
|
: $cartItem->variant_id,
|
|
$updatesVariant,
|
|
)
|
|
)->additional([
|
|
'code' => $updatesVariant ? 'cart.item_updated' : 'cart.quantity_updated',
|
|
'message' => $updatesVariant
|
|
? __('api.cart.item_updated')
|
|
: __('api.cart.quantity_updated'),
|
|
]);
|
|
}
|
|
|
|
public function updateCheckoutItem(
|
|
UpdateCartItemQuantityRequest $request,
|
|
Tenant $tenant,
|
|
Cart $cart,
|
|
CartItem $cartItem,
|
|
): CartResource {
|
|
$updatesVariant = $request->exists('variant_id');
|
|
|
|
return CartResource::make(
|
|
$this->cartService->updateCheckoutItem(
|
|
$tenant,
|
|
$request,
|
|
$cart,
|
|
$cartItem->getKey(),
|
|
(int) $request->validated('cantidad'),
|
|
$updatesVariant
|
|
? ($request->validated('variant_id') !== null
|
|
? (int) $request->validated('variant_id')
|
|
: null)
|
|
: $cartItem->variant_id,
|
|
$updatesVariant,
|
|
),
|
|
)->additional([
|
|
'code' => $updatesVariant ? 'cart.item_updated' : 'cart.quantity_updated',
|
|
'message' => $updatesVariant
|
|
? __('api.cart.item_updated')
|
|
: __('api.cart.quantity_updated'),
|
|
]);
|
|
}
|
|
|
|
public function removeItem(Request $request, Tenant $tenant, CartItem $cartItem): CartResource
|
|
{
|
|
return CartResource::make(
|
|
$this->cartService->removeItem($tenant, $request, $cartItem->getKey())
|
|
)->additional([
|
|
'code' => 'cart.item_removed',
|
|
'message' => __('api.cart.item_removed'),
|
|
]);
|
|
}
|
|
}
|