ldc-boutique-cnc/app/Http/Requests/Bo/PrepareOrderRequest.php
Jérémy Munsch f371cd118d
Step 2
- 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)
2023-03-15 17:51:01 +01:00

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')
];
}
}