| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- <?php
- namespace App\Http\Requests\Concerns;
- use Illuminate\Validation\Validator;
- trait ValidatesProposalPricing
- {
- /**
- * Validation rules for a Pavão/Irrecusável pricing block (Matrícula, Aulas,
- * Materiais, Valor Total do Curso), nested under $prefix ("pavao"/"irrecusavel").
- */
- protected function proposalPricingRules(string $prefix, string $required, bool $withCondition = false): array
- {
- $rules = [
- $prefix => "$required|array",
- "$prefix.registration_value" => 'nullable|numeric|min:0',
- "$prefix.registration_included_in_course" => "$required|boolean",
- "$prefix.registration_installments_allowed" => "$required|boolean",
- "$prefix.registration_max_installments" => 'nullable|integer|min:1',
- "$prefix.classes_value" => 'nullable|numeric|min:0',
- "$prefix.classes_included_in_course" => "$required|boolean",
- "$prefix.classes_installments_allowed" => "$required|boolean",
- "$prefix.classes_max_installments" => 'nullable|integer|min:1',
- "$prefix.classes_discount_percentage" => 'nullable|numeric|min:0|max:100',
- "$prefix.materials" => 'nullable|array',
- "$prefix.materials.*.product_id" => "required_with:$prefix.materials|integer|exists:products,id",
- "$prefix.materials.*.quantity" => "required_with:$prefix.materials|integer|min:1",
- "$prefix.materials.*.price" => "required_with:$prefix.materials|numeric|min:0",
- "$prefix.materials_included_in_course" => "$required|boolean",
- "$prefix.materials_installments_allowed" => "$required|boolean",
- "$prefix.materials_max_installments" => 'nullable|integer|min:1',
- "$prefix.total_value" => 'nullable|numeric|min:0',
- "$prefix.total_max_installments" => 'nullable|integer|min:1',
- ];
- if ($withCondition) {
- $rules["$prefix.condition"] = 'nullable|string';
- }
- return $rules;
- }
- /**
- * For each pricing block present in the request, enforce that exactly one of
- * "included in course" / "allows installments" is selected per section.
- */
- protected function validateProposalPricingSections(Validator $validator, array $prefixes): void
- {
- $validator->after(function (Validator $validator) use ($prefixes) {
- foreach ($prefixes as $prefix) {
- if (!$this->has($prefix)) continue;
- foreach (['registration', 'classes', 'materials'] as $section) {
- $includedKey = "$prefix.{$section}_included_in_course";
- $installmentsKey = "$prefix.{$section}_installments_allowed";
- if (!$this->has($includedKey) && !$this->has($installmentsKey)) continue;
- $included = $this->boolean($includedKey);
- $installments = $this->boolean($installmentsKey);
- if ($included === $installments) {
- $validator->errors()->add(
- $includedKey,
- 'Selecione exatamente uma opção: incluso no valor do curso ou permite parcelar.'
- );
- }
- }
- }
- });
- }
- }
|