ValidatesProposalPricing.php 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <?php
  2. namespace App\Http\Requests\Concerns;
  3. use Illuminate\Validation\Validator;
  4. trait ValidatesProposalPricing
  5. {
  6. /**
  7. * Validation rules for a Pavão/Irrecusável pricing block (Matrícula, Aulas,
  8. * Materiais, Valor Total do Curso), nested under $prefix ("pavao"/"irrecusavel").
  9. */
  10. protected function proposalPricingRules(string $prefix, string $required, bool $withCondition = false): array
  11. {
  12. $rules = [
  13. $prefix => "$required|array",
  14. "$prefix.registration_value" => 'nullable|numeric|min:0',
  15. "$prefix.registration_included_in_course" => "$required|boolean",
  16. "$prefix.registration_installments_allowed" => "$required|boolean",
  17. "$prefix.registration_max_installments" => 'nullable|integer|min:1',
  18. "$prefix.classes_value" => 'nullable|numeric|min:0',
  19. "$prefix.classes_included_in_course" => "$required|boolean",
  20. "$prefix.classes_installments_allowed" => "$required|boolean",
  21. "$prefix.classes_max_installments" => 'nullable|integer|min:1',
  22. "$prefix.classes_discount_percentage" => 'nullable|numeric|min:0|max:100',
  23. "$prefix.materials" => 'nullable|array',
  24. "$prefix.materials.*.product_id" => "required_with:$prefix.materials|integer|exists:products,id",
  25. "$prefix.materials.*.quantity" => "required_with:$prefix.materials|integer|min:1",
  26. "$prefix.materials.*.price" => "required_with:$prefix.materials|numeric|min:0",
  27. "$prefix.materials_included_in_course" => "$required|boolean",
  28. "$prefix.materials_installments_allowed" => "$required|boolean",
  29. "$prefix.materials_max_installments" => 'nullable|integer|min:1',
  30. "$prefix.total_value" => 'nullable|numeric|min:0',
  31. "$prefix.total_max_installments" => 'nullable|integer|min:1',
  32. ];
  33. if ($withCondition) {
  34. $rules["$prefix.condition"] = 'nullable|string';
  35. }
  36. return $rules;
  37. }
  38. /**
  39. * For each pricing block present in the request, enforce that exactly one of
  40. * "included in course" / "allows installments" is selected per section.
  41. */
  42. protected function validateProposalPricingSections(Validator $validator, array $prefixes): void
  43. {
  44. $validator->after(function (Validator $validator) use ($prefixes) {
  45. foreach ($prefixes as $prefix) {
  46. if (!$this->has($prefix)) continue;
  47. foreach (['registration', 'classes', 'materials'] as $section) {
  48. $includedKey = "$prefix.{$section}_included_in_course";
  49. $installmentsKey = "$prefix.{$section}_installments_allowed";
  50. if (!$this->has($includedKey) && !$this->has($installmentsKey)) continue;
  51. $included = $this->boolean($includedKey);
  52. $installments = $this->boolean($installmentsKey);
  53. if ($included === $installments) {
  54. $validator->errors()->add(
  55. $includedKey,
  56. 'Selecione exatamente uma opção: incluso no valor do curso ou permite parcelar.'
  57. );
  58. }
  59. }
  60. }
  61. });
  62. }
  63. }