- Order can be cancelled even if payed - Moved specific TS definitions on bo directory - Minicrud fix prepended slash - Vue component Order Prepare - Validate Basket Item format on server side (ToolboxHelper) - Fixed transaction without webhooks - Added Order preparation steps - Stripe Order refund - Add preventLazyLoad to AppServiceProvider (partial strict mode)
99 lines
3.3 KiB
PHP
99 lines
3.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Requests\Bo;
|
|
|
|
use App\Lib\Helpers\ToolboxHelper;
|
|
use Illuminate\Foundation\Http\FormRequest;
|
|
use Illuminate\Validation\ValidationException;
|
|
|
|
class PrepareOrderRequest extends FormRequest
|
|
{
|
|
/**
|
|
* Order baskter items keyed by id
|
|
*
|
|
* @var \Illuminate\Support\Collection<integer,object>
|
|
*/
|
|
private $basketItems;
|
|
/**
|
|
* Determine if the user is authorized to make this request.
|
|
*
|
|
* @return boolean
|
|
*/
|
|
public function authorize(): bool
|
|
{
|
|
return \auth('backend')->check();
|
|
}
|
|
|
|
/**
|
|
* Prepare the data for validation.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function prepareForValidation(): void
|
|
{
|
|
$this->basketItems = collect($this->order->basket)->keyBy(function (object $basketItem) {
|
|
if (!ToolboxHelper::basketObjectIsValid($basketItem)) {
|
|
throw ValidationException::withMessages([
|
|
'error' => \trans('Cannot validate basket item')
|
|
]);
|
|
}
|
|
return $basketItem->id;
|
|
});
|
|
$this->merge([
|
|
'willNeedCompleteRefund' => !collect($this->items)->reduce(function (?int $carry, $item) {
|
|
return $carry + \is_numeric($item) ? \intval($item) : 0;
|
|
}),
|
|
'willNeedRefund' => collect($this->items)->reduce(function (?int $carry, $item) {
|
|
return $carry + $item;
|
|
}) !== $this->basketItems->sum('qty')
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Get the validation rules that apply to the request.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function rules()
|
|
{
|
|
return [
|
|
'willNeedCompleteRefund' => 'required|boolean',
|
|
'willNeedRefund' => 'required|boolean',
|
|
'items' => 'required|array',
|
|
'items.*' => [
|
|
// ! Submited Items must be in the basket.
|
|
// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
|
|
'required', 'numeric', function ($attribute, $value, $fail) {
|
|
$itemId = \intval(\str_replace('items.', '', $attribute));
|
|
$basketItemKey = $this->basketItems->search(function (object $basketItem) use ($itemId) {
|
|
return $basketItem->id === $itemId && $itemId !== 0;
|
|
});
|
|
if (!$basketItemKey) {
|
|
$fail(":attribute id '{$itemId}' ne se trouve pas dans le panier de la commande");
|
|
return;
|
|
}
|
|
/** @var object $basketItem */
|
|
$basketItem = $this->basketItems->get($basketItemKey);
|
|
if ($basketItem->qty < \intval($value)) {
|
|
// phpcs:ignore Generic.Files.LineLength.TooLong
|
|
$fail(":attribute référence '{$basketItem->options->reference}' ne peut contenir plus d'éléments que ce que le client à commandé");
|
|
return;
|
|
}
|
|
}
|
|
]
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Get custom attributes for validator errors.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function attributes(): array
|
|
{
|
|
return [
|
|
'items' => trans('produits'),
|
|
'items.*' => trans('produit')
|
|
];
|
|
}
|
|
}
|