236 lines
7.8 KiB
PHP
236 lines
7.8 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\Database\Eloquent\Builder;
|
|
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)
|
|
{
|
|
$query = $this->sortOrders($request);
|
|
|
|
/** @var string $search Search field */
|
|
$search = $request->search;
|
|
if ($search) {
|
|
$this->searchQuery(
|
|
$query,
|
|
$search,
|
|
function (Builder $q) use ($search) {
|
|
$q->orWhereHas('timeslot.magasin', function (Builder $q) use ($search) {
|
|
$q->where('name', 'LIKE', "%{$search}%");
|
|
});
|
|
},
|
|
'reference'
|
|
);
|
|
}
|
|
$searchFields = \implode(', ', [
|
|
trans('Référence, Point de retrait'),
|
|
]);
|
|
|
|
// * Dates Filter
|
|
if (!empty($request->input('date-order-start'))) {
|
|
if (!empty($request->input('date-order-end'))) {
|
|
$query->whereBetween('date', [
|
|
$request->input('date-order-start'),
|
|
$request->input('date-order-end'),
|
|
]);
|
|
} else {
|
|
$query->where('date', $request->input('date-order-start'));
|
|
}
|
|
}
|
|
if (!empty($request->input('date-retrait-start'))) {
|
|
if (!empty($request->input('date-retrait-end'))) {
|
|
$query->whereHas('timeslot', function (Builder $q) use ($request) {
|
|
$q->whereBetween('day', [
|
|
$request->input('date-retrait-start'),
|
|
$request->input('date-retrait-end'),
|
|
]);
|
|
});
|
|
} else {
|
|
$query->whereHas('timeslot', function (Builder $q) use ($request) {
|
|
$q->where('day', $request->input('date-retrait-start'));
|
|
});
|
|
}
|
|
}
|
|
|
|
$orders = $query->paginate(10);
|
|
|
|
return view('bo.orders.index', compact('orders', 'searchFields'));
|
|
}
|
|
|
|
/**
|
|
* orders that ship today
|
|
*
|
|
* @param SortOrders $request
|
|
* @return \Illuminate\Contracts\View\View
|
|
*/
|
|
public function today(SortOrders $request)
|
|
{
|
|
$query = $this->sortOrders($request);
|
|
|
|
/** @var string $search Search field */
|
|
$search = $request->search;
|
|
if ($search) {
|
|
$this->searchQuery(
|
|
$query,
|
|
$search,
|
|
function (Builder $q) use ($search) {
|
|
$q->orWhereHas('timeslot.magasin', function (Builder $q) use ($search) {
|
|
$q->where('name', 'LIKE', "%{$search}%");
|
|
});
|
|
},
|
|
'reference'
|
|
);
|
|
}
|
|
$searchFields = \implode(', ', [
|
|
trans('Référence, Point de retrait'),
|
|
]);
|
|
|
|
// Filter today.
|
|
$today = CarbonImmutable::now()->startOfDay();
|
|
$query = $query->whereHas('timeslot', function ($q) use ($today) {
|
|
$q->where('day', $today);
|
|
});
|
|
|
|
$orders = $query->get();
|
|
return view('bo.orders.index', compact('orders', 'today', 'searchFields'));
|
|
}
|
|
|
|
/**
|
|
* Filter orders
|
|
*
|
|
* @param Request $request
|
|
* @return \Illuminate\Database\Eloquent\Builder
|
|
*/
|
|
protected function sortOrders(Request $request)
|
|
{
|
|
$query = Order::query();
|
|
|
|
|
|
if ($request->input('rst')) {
|
|
Session::remove('orders.sort_col');
|
|
Session::remove('orders.sort_way');
|
|
}
|
|
if ($request->input('sort_col')) {
|
|
Session::put('orders.sort_col', $request->input('sort_col'));
|
|
Session::save();
|
|
}
|
|
if ($request->input('sort_way')) {
|
|
Session::put('orders.sort_way', $request->input('sort_way'));
|
|
Session::save();
|
|
}
|
|
|
|
if (Session::has('orders.sort_col') and Session::has('orders.sort_way')) {
|
|
switch (Session::get('orders.sort_col')) {
|
|
case 'date':
|
|
$query = $query->orderBy('date', Session::get('orders.sort_way'));
|
|
break;
|
|
case 'status_id':
|
|
$query = $query->orderBy('status_id', Session::get('orders.sort_way'));
|
|
break;
|
|
case 'magasin_id':
|
|
$query = $query->select('orders.*');
|
|
$query = $query->leftJoin('timeslots', 'timeslots.order_id', '=', 'orders.id');
|
|
$query = $query->leftJoin('magasins', 'timeslots.magasin_id', '=', 'magasins.id');
|
|
$query = $query->orderBy('magasins.id', Session::get('orders.sort_way'));
|
|
break;
|
|
case 'date_retrait':
|
|
$query = $query->select('orders.*');
|
|
$query = $query->leftJoin('timeslots', 'timeslots.order_id', '=', 'orders.id');
|
|
$query = $query->orderBy('timeslots.day', Session::get('orders.sort_way'));
|
|
$query = $query->orderBy('timeslots.time', Session::get('orders.sort_way'));
|
|
break;
|
|
case 'customer_id':
|
|
$query = $query->orderBy('customer_id', Session::get('orders.sort_way'));
|
|
break;
|
|
} //end switch
|
|
} //end if
|
|
|
|
return $query;
|
|
}
|
|
|
|
/**
|
|
* 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'));
|
|
}
|
|
}
|