ldc-boutique-cnc/app/Http/Controllers/Bo/OrderController.php

158 lines
6.1 KiB
PHP
Raw Normal View History

2020-11-17 13:41:31 +01:00
<?php
namespace App\Http\Controllers\Bo;
use App\Enums\Order\DeliveryModeEnum;
use App\Enums\Order\DeliveryStatus;
use App\Enums\Order\PaymentModeEnum;
use App\Enums\Order\TransactionStatus;
use App\Enums\Order\TransactionType;
use App\Enums\Order\ValidationStatus;
2020-11-17 13:41:31 +01:00
use App\Http\Controllers\Controller;
use App\Http\Requests\Bo\Orders\ChangeOrderDeliveryStatusRequest;
2022-12-20 16:52:44 +01:00
use App\Http\Requests\Bo\Orders\ChangeOrderValidationStatusRequest;
2023-03-01 11:02:42 +01:00
use App\Models\Shop\Order;
2022-12-20 16:52:44 +01:00
use Illuminate\Database\Eloquent\Builder;
2021-03-29 15:10:07 +02:00
use Illuminate\Http\Request;
2022-12-20 16:52:44 +01:00
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
2020-11-17 13:41:31 +01:00
2022-10-03 17:13:44 +02:00
class OrderController extends Controller
2020-11-17 13:41:31 +01:00
{
2022-12-20 16:52:44 +01:00
/**
* If true the index action will only display today orders
* @var false
*/
private $indexModeTodayOnly = false;
2021-04-14 09:34:23 +02:00
/**
2022-09-03 16:56:16 +02:00
* Display a listing of the resource.
*
2022-10-03 17:13:44 +02:00
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
2021-04-14 09:34:23 +02:00
*/
2022-10-03 17:13:44 +02:00
public function index(Request $request)
{
2022-10-03 17:13:44 +02:00
/** @var \Illuminate\Database\Eloquent\Builder $orders */
$orders = Order::query();
if ($request->search) {
$this->searchQuery(
$orders,
$request->search,
null,
'label'
);
}
2022-10-03 17:13:44 +02:00
$this->sortQuery($orders);
2022-12-20 16:52:44 +01:00
$searchFields = trans('Réference');
if ($this->indexModeTodayOnly) {
$orders->whereHas('timeslot', function (Builder $q) {
$q->whereDate('slot', \now()->today());
});
}
2022-10-03 17:13:44 +02:00
$orders->orderBy('created_at', 'DESC');
$orders = $orders->paginate(10);
return view('back::pages.orders.index', compact('orders', 'searchFields'));
2022-10-03 17:13:44 +02:00
}
/**
2022-12-20 16:52:44 +01:00
* Display a listing of the resource.
2022-10-03 17:13:44 +02:00
*
2022-12-20 16:52:44 +01:00
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
2022-10-03 17:13:44 +02:00
*/
2022-12-20 16:52:44 +01:00
public function indexToday(Request $request)
2022-10-03 17:13:44 +02:00
{
2022-12-20 16:52:44 +01:00
$this->indexModeTodayOnly = true;
return $this->callAction('index', ['request' => $request]);
2022-10-03 17:13:44 +02:00
}
/**
2022-12-20 16:52:44 +01:00
* Display the specified resource.
2022-10-03 17:13:44 +02:00
*
2023-03-01 11:02:42 +01:00
* @param \App\Models\Shop\Order $order
2022-12-20 16:52:44 +01:00
* @return \Illuminate\Http\Response
* @phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClass
2022-10-03 17:13:44 +02:00
*/
2022-12-20 16:52:44 +01:00
public function show(Order $order)
2022-10-03 17:13:44 +02:00
{
2022-12-20 16:52:44 +01:00
// phpcs:enable
return view('back::pages.orders.show', compact('order'));
2020-11-17 13:41:31 +01:00
}
2022-09-03 16:56:16 +02:00
/**
2022-12-20 16:52:44 +01:00
* Mettre a jour le status de validation d'une commande
2022-09-03 16:56:16 +02:00
*
2022-12-20 16:52:44 +01:00
* @param \App\Http\Requests\Bo\Orders\ChangeOrderValidationStatusRequest $request
2023-03-01 11:02:42 +01:00
* @param \App\Models\Shop\Order $order
2022-09-03 16:56:16 +02:00
* @return \Illuminate\Http\RedirectResponse
2021-04-14 09:34:23 +02:00
*/
2022-12-20 16:52:44 +01:00
public function changeValidationStatus(ChangeOrderValidationStatusRequest $request, Order $order)
{
2022-12-20 16:52:44 +01:00
return DB::transaction(function () use ($request, $order) {
$order->validation_status = $request->validation_status;
switch ($request->validation_status) {
case ValidationStatus::validated()->value:
case ValidationStatus::cancelled()->value:
$order->saveOrFail();
2023-03-13 14:34:35 +01:00
return \back()->with('bo.success', trans(
':model a été mis à jour',
['model' => Str::singular(trans('models.classes.orders'))]
2022-12-20 16:52:44 +01:00
));
case ValidationStatus::pending()->value:
2023-03-13 14:34:35 +01:00
return \back()->with('bo.errors', \trans('Il faut choisir un statut pour cette commande.'));
2022-12-20 16:52:44 +01:00
default:
throw new \RuntimeException("Unhandled status `{$request->validation_status}`");
}
2022-12-20 16:52:44 +01:00
});
2021-04-13 17:21:39 +02:00
}
/**
* Mettre a jour le status de livraison d'une commande
*
* @param \App\Http\Requests\Bo\Orders\ChangeOrderDeliveryStatusRequest $request
2023-03-01 11:02:42 +01:00
* @param \App\Models\Shop\Order $order
* @return \Illuminate\Http\RedirectResponse
*/
public function changeDeliveryStatus(ChangeOrderDeliveryStatusRequest $request, Order $order)
{
return DB::transaction(function () use ($request, $order) {
$order->delivery_status = $request->delivery_status;
switch ($request->delivery_status) {
case DeliveryStatus::recovered()->value:
// * Déclarer la commande comme réglée si récupération à la boutique.
if ($order->deliveryMode->mode->equals(DeliveryModeEnum::inShop())) {
// ! There should be one and only one inShop transaction !
/** @var \App\Models\Payment\Transaction|null */
$inShopTransaction = $order->transactions()
->where('type', TransactionType::debit())
->where('payment_mode', PaymentModeEnum::inShop())
->latest()->first();
if (!$inShopTransaction) {
throw new \RuntimeException("There should one inshop transaction for order '{$order->id}'");
}
$inShopTransaction->status = TransactionStatus::validated();
$inShopTransaction->saveOrFail();
}
// Fall through.
case DeliveryStatus::preparation()->value:
case DeliveryStatus::ready()->value:
$order->saveOrFail();
2023-03-13 14:34:35 +01:00
return \back()->with('bo.success', trans(
':model a été mis à jour',
['model' => Str::singular(trans('models.classes.orders'))]
));
case DeliveryStatus::pending()->value:
2023-03-13 14:34:35 +01:00
return \back()->with('bo.errors', \trans('Il faut choisir un statut pour cette commande.'));
default:
throw new \RuntimeException("Unhandled status `{$request->delivery_status}`");
}//end switch
});
}
2020-11-17 13:41:31 +01:00
}