ldc-boutique-cnc/app/Http/Controllers/Controller.php

240 lines
8.8 KiB
PHP
Raw Normal View History

2020-10-30 17:26:00 +01:00
<?php
namespace App\Http\Controllers;
use App\Enums\Order\TransactionType;
use App\Models\Payment\Transaction;
2023-03-01 11:02:42 +01:00
use App\Models\Shop\DeliveryMode;
use App\Models\Shop\Order;
2023-03-01 11:02:42 +01:00
use App\Models\Shop\PaymentMode;
2022-11-28 16:56:39 +01:00
use Gloudemans\Shoppingcart\Cart;
use Gloudemans\Shoppingcart\CartItem;
2022-10-03 17:13:44 +02:00
use Illuminate\Database\Eloquent\Builder;
2020-10-30 17:26:00 +01:00
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
2023-02-28 17:30:30 +01:00
use Illuminate\Http\Request;
2020-10-30 17:26:00 +01:00
use Illuminate\Routing\Controller as BaseController;
2022-10-03 17:13:44 +02:00
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Str;
use Symfony\Component\HttpFoundation\Response;
2020-10-30 17:26:00 +01:00
class Controller extends BaseController
{
2022-08-25 12:26:43 +02:00
use AuthorizesRequests;
use DispatchesJobs;
use ValidatesRequests;
2022-10-03 17:13:44 +02:00
2023-04-25 21:52:27 +02:00
/**
* Cart item options skel
*
* @var string[]
*/
protected $cartItemOptionsSkel = [
'virtual' => false,
'reference' => '',
'slug' => '',
'picture' => '',
'sell_unit' => '',
'weight_with_unit' => '',
// * Prix ttc du produit
'price_ttc' => 0,
// * Prix ttc du produit remisé
'undiscounted_price_ttc' => 0,
'tax_rate' => 0,
'discount_type' => null,
'discount_rate' => 0,
];
/**
* Controller
*
* @return void
*/
public function __construct()
{
2023-02-28 17:30:30 +01:00
$this->middleware(function (Request $request, callable $next) {
$reponse = $next($request);
if (\request()->routeIs('bo.*') and !\request()->ajax()) {
2023-03-17 17:32:18 +01:00
if (!DeliveryMode::getCached()->where('status', true)->count()) {
2023-03-13 13:32:00 +01:00
Session::flash('bo.warning', trans('Aucun mode de livraison n\'est disponible'));
}
2023-03-17 17:32:18 +01:00
if (!PaymentMode::getCached()->where('status', true)->count()) {
2023-03-13 13:32:00 +01:00
Session::flash('bo.warning', trans('Aucun mode de paiement n\'est disponible'));
}
}
return $reponse;
});
}
2022-10-03 17:13:44 +02:00
/**
* Build Search query on specified fields
* splitting search into words or using whole sentence
*
* @param \Illuminate\Database\Eloquent\Builder $query The eloquent query builder.
* @param string $search The query string.
* @param callable $searchQuery The query string.
* @param string ...$fields Either a simple array or a string
* in case of a string the two fields
* would be concatenate to make the search.
* @return \Illuminate\Database\Eloquent\Builder
2022-10-03 17:13:44 +02:00
*/
protected function searchQuery(
Builder $query,
string $search,
callable $searchQuery = null,
string ...$fields
): Builder {
if (count($fields)) {
// Search using words.
$words = explode(' ', $search);
$query->where(function ($query) use ($searchQuery, $words, $search, $fields) {
foreach ($words as $word) {
if (!strlen($word)) {
continue;
}
$this->searchOnFields($query, $word, $fields);
} //end foreach
// Search whole using whole sentence.
$this->searchOnFields($query, $search, $fields);
if ($searchQuery) {
$searchQuery($query);
}
});
} //end if
return $query;
}
/**
* Build query search on all fields
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $search
* @param array $fields
* @return \Illuminate\Database\Eloquent\Builder
2022-10-03 17:13:44 +02:00
*/
private function searchOnFields(Builder $query, string $search, array $fields): Builder
{
$table = $query->getModel()->getTable();
foreach ($fields as $f) {
$f = str_replace('?', '\?', $f);
if (is_array($f)) {
$query->orWhereRaw(
sprintf("UPPER(CONCAT(%s)) LIKE UPPER(?)", collect($f)->map(function ($q) use ($table) {
return "`$table`.`$q`";
})->implode(', \' \', ')),
['%' . filter_var($search, FILTER_SANITIZE_STRING) . '%']
);
} else {
$query->orWhereRaw(
"UPPER(`$table`.`$f`) LIKE UPPER(?)",
['%' . filter_var($search, FILTER_SANITIZE_STRING) . '%']
);
}
}
return $query;
}
/**
* Sort columns with a query
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param array $ignore
* @return \Illuminate\Database\Eloquent\Builder
2022-10-03 17:13:44 +02:00
*/
protected function sortQuery(Builder $query, array $ignore = []): Builder
{
$rName = request()->route()->getName();
$table = $query->getModel()->getTable();
if (request()->sort_col) {
Session::put("$rName.sort_col", request()->sort_col);
2023-02-06 14:00:33 +01:00
Session::put("$rName.sorted", true);
2022-10-03 17:13:44 +02:00
}
if (request()->sort_way) {
Session::put("$rName.sort_way", request()->sort_way);
2023-02-06 14:00:33 +01:00
Session::put("$rName.sorted", true);
2022-10-03 17:13:44 +02:00
}
if (request()->rst) {
2023-02-06 14:00:33 +01:00
Session::remove("$rName.sorted");
2022-10-03 17:13:44 +02:00
Session::remove("$rName.sort_col");
Session::remove("$rName.sort_way");
}
if (request()->sort_col and request()->sort_way and Schema::hasColumn($table, request()->sort_col)) {
if (
!isset($ignore) or
(isset($ignore) and !in_array(request()->sort_col, $ignore))
) {
$query = $query->orderBy(\sprintf("$table.%s", request()->sort_col), request()->sort_way);
}
} elseif (Schema::hasColumn($table, 'order')) {
$query = $query->orderBy('order', 'ASC');
Session::put("$rName.sort_col", 'order');
Session::put("$rName.sort_way", 'asc');
}
return $query;
}
2022-11-28 16:56:39 +01:00
2022-11-30 16:36:27 +01:00
/**
* Filter basket items to keep only the orderable ones
*
* ! Assert Model found, status true and orderable true.
*
* @param \Gloudemans\Shoppingcart\Cart $basket
* @param array<string> $messages Will be filled with messages on warnings.
* @return \Gloudemans\Shoppingcart\Cart
*/
protected function filterBasketKeepOnlyOrderableItems(Cart $basket, array &$messages = []): Cart
{
\collect($basket->content())->each(function (CartItem $item) use (&$basket, &$messages) {
2023-03-01 11:02:42 +01:00
/** @var \App\Models\Merchandise\Product|null */
2022-11-30 16:36:27 +01:00
$product = $item->model;
if (!$product or (!$product and (!$product->status or !$product->orderable))) {
2022-11-30 16:36:27 +01:00
$basket->remove($item->rowId);
$messages[] = \trans(
'Le produit :name a été retiré du panier car il n\'est plus disponible',
[
'name' => $item->name
]
);
}
});
return $basket;
}
/**
* Generate and download transaction invoice
*
* ! Appliable for both Fo and Bo controllers
*
* @param \App\Models\Shop\Order $order
* @param \App\Models\Payment\Transaction $transaction
* @return \Symfony\Component\HttpFoundation\Response
*/
public function downloadTransactionInvoice(Order $order, Transaction $transaction): Response
{
$this->authorize('download', $transaction);
$title = trans('Commande du :date - :orderRef - :transRef', [
'date' => $transaction->created_at->isoFormat('DD\/MM\/YYYY'),
'orderRef' => $order->reference,
'transRef' => $transaction->reference,
]);
$sluggedTitle = Str::slug(\implode(' ', [
config('app.name'),
$transaction->type->equals(TransactionType::debit()) ? trans('Facture') : trans('Avoir'),
$transaction->created_at->isoFormat('YYYY-MM-DD'),
]));
return \response()->streamDownload(function () use ($transaction, $title) {
echo $transaction->generateInvoice($title)->output();
}, "{$sluggedTitle}.pdf", [
'Cache-Control' => 'public, must-revalidate, max-age=0',
'Content-Description' => 'File Transfer',
'Content-Type' => 'application/pdf',
'Expires' => 'Sat, 26 Jul 1997 05:00:00 GMT',
'Last-Modified' => gmdate('D, d M Y H:i:s') . ' GMT',
// For glory.
'X-Generator' => 'mPDF'
]);
}
2020-10-30 17:26:00 +01:00
}