ldc-boutique-cnc-sable/app/Http/Controllers/Bo/OrdersController.php
2023-08-30 08:03:04 +00:00

173 lines
5.5 KiB
PHP

<?php
namespace App\Http\Controllers\Bo;
use App\Http\Controllers\Controller;
use App\Models\Order;
use App\Http\Requests\SortOrders;
use Illuminate\Support\Facades\Mail;
use App\Mail\OrderStatusMail;
use App\Models\Customers;
use Carbon\CarbonImmutable;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
class OrdersController extends Controller
{
/**
* Display a listing of the resource.
*
* @param \App\Http\Requests\SortOrders $request
* @return \Illuminate\Contracts\View\View
*/
public function index(SortOrders $request)
{
$orders = $this->filterOrders($request);
$orders = $orders->paginate(10);
return view('bo.orders.index', compact('orders'));
}
/**
* orders that ship today
*
* @param SortOrders $request
* @return \Illuminate\Contracts\View\View
*/
public function today(SortOrders $request)
{
$orders = $this->filterOrders($request);
// Filter today.
$today = CarbonImmutable::now()->startOfDay();
$orders = $orders->whereHas('timeslot', function ($q) use ($today) {
$q->where('day', $today);
});
$orders = $orders->get();
return view('bo.orders.index', compact('orders', 'today'));
}
/**
* Filter orders
*
* @param Request $request
* @return \Illuminate\Database\Eloquent\Builder
*/
protected function filterOrders(Request $request)
{
$orders = Order::query();
if ($request->rst) {
Session::remove('orders.sort_col');
Session::remove('orders.sort_way');
}
if ($request->sort_col) {
Session::put('orders.sort_col', $request->sort_col);
Session::save();
}
if ($request->sort_way) {
Session::put('orders.sort_way', $request->sort_way);
Session::save();
}
if (Session::has('orders.sort_col') and Session::has('orders.sort_way')) {
switch (Session::get('orders.sort_col')) {
case 'date':
$orders = $orders->orderBy('date', Session::get('orders.sort_way'));
break;
case 'status_id':
$orders = $orders->orderBy('status_id', Session::get('orders.sort_way'));
break;
case 'magasin_id':
$orders = $orders->select('orders.*');
$orders = $orders->leftJoin('timeslots', 'timeslots.order_id', '=', 'orders.id');
$orders = $orders->leftJoin('magasins', 'timeslots.magasin_id', '=', 'magasins.id');
$orders = $orders->orderBy('magasins.id', Session::get('orders.sort_way'));
break;
case 'date_retrait':
$orders = $orders->select('orders.*');
$orders = $orders->leftJoin('timeslots', 'timeslots.order_id', '=', 'orders.id');
$orders = $orders->orderBy('timeslots.day', Session::get('orders.sort_way'));
$orders = $orders->orderBy('timeslots.time', Session::get('orders.sort_way'));
break;
case 'customer_id':
$orders = $orders->orderBy('customer_id', Session::get('orders.sort_way'));
break;
}//end switch
}//end if
return $orders;
}
/**
* action de changement de statut vers l'avant
* envoi de mails transctionnels
*
* @param string $reference Reference de la commande.
* @return \Illuminate\Http\RedirectResponse
*/
public function changeStatus(string $reference)
{
$order = Order::where('reference', $reference)->first();
$order->status_id = $order->status_id + 1;
$order->save();
// Send confirm mail.
Mail::to($order->customer->email)->send(new OrderStatusMail($order));
return back()->with('success', "Changement de status enregistré pour la commande " . $order->reference . ".");
}
/**
* mise au statut annulé d'une commande
*
* @param string $reference
* @return \Illuminate\Http\RedirectResponse
*/
public function cancelOrder(string $reference)
{
$order = Order::where('reference', $reference)->first();
$order->status_id = 7;
$order->save();
return back()->with('success', "La commande " . $order->reference . " à été annulée.");
}
/**
* bo
* ajx : affichage d'infos sur un client
*
* @param integer $id
* @param string|null $mode
* @return \Illuminate\Contracts\View\View
*/
public function getCustomerInfo(int $id, string $mode = null)
{
$cust = Customers::findOrFail($id);
if (!is_null($mode)) {
if ($mode == "tippy") {
return view('bo.customer.tippy-card', compact('cust'));
}
if ($mode == "json") {
return $cust->apiData;
}
return view('bo.customer.info-card', compact('cust'));
}
return view('bo.customer.info-popup', compact('cust'));
}
/**
* bo : page détail commande
*
* @param string $reference
* @return \Illuminate\Contracts\View\View
*/
public function orderDetail(string $reference)
{
$order = Order::where('reference', '=', $reference)->firstOrFail();
return view('bo.orders.detail', compact('order'));
}
}