StudentRequest.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. namespace App\Http\Requests;
  3. use App\Rules\AdultBirthDate;
  4. use App\ValueObjects\Cpf;
  5. use Carbon\Carbon;
  6. use Illuminate\Foundation\Http\FormRequest;
  7. use Illuminate\Validation\Rule;
  8. use Throwable;
  9. class StudentRequest extends FormRequest
  10. {
  11. protected function prepareForValidation(): void
  12. {
  13. $documentNumber = $this->input('document_number');
  14. if (is_string($documentNumber)) {
  15. $this->merge([
  16. 'document_number' => preg_replace('/\D/', '', $documentNumber),
  17. ]);
  18. }
  19. }
  20. public function rules(): array
  21. {
  22. $rules = [
  23. 'avatar' => 'sometimes|nullable|image',
  24. 'birth_date' => 'sometimes|nullable|date',
  25. 'document_number' => ['sometimes', 'nullable', 'string', 'max:20', Cpf::rule()],
  26. 'gender' => 'sometimes|nullable|string|in:no_preference,male,female,other',
  27. 'email' => 'sometimes|nullable|email',
  28. 'phone' => 'sometimes|nullable|string|max:20',
  29. 'postal_code' => 'sometimes|nullable|string|max:10',
  30. 'street' => 'sometimes|nullable|string|max:255',
  31. 'address_number' => 'sometimes|nullable|string|max:20',
  32. 'neighborhood' => 'sometimes|nullable|string|max:255',
  33. 'city_id' => 'sometimes|nullable|integer|exists:cities,id',
  34. 'state_id' => 'sometimes|nullable|integer|exists:states,id',
  35. 'complement' => 'sometimes|nullable|string|max:255',
  36. 'payer_name' => 'sometimes|nullable|string|max:255',
  37. 'how_did_you_know_us' => 'sometimes|nullable|string|in:referral,social_media,google,other',
  38. 'notes' => 'sometimes|nullable|string',
  39. ];
  40. if ($this->isMethod('post')) {
  41. $rules['name'] = 'required|string|max:255';
  42. $rules['birth_date'] = 'required|date';
  43. $rules['document_number'] = [
  44. 'sometimes',
  45. 'nullable',
  46. 'string',
  47. 'max:20',
  48. Cpf::rule(),
  49. Rule::unique('students', 'document_number'),
  50. ];
  51. $rules['email'] = 'sometimes|nullable|email|unique:students,email';
  52. $rules['responsible'] = [
  53. 'nullable',
  54. 'array',
  55. Rule::requiredIf(fn (): bool => $this->studentIsMinor()),
  56. ];
  57. $rules['responsible.name'] = 'required_with:responsible|string|max:255';
  58. $rules['responsible.birth_date'] = ['required_with:responsible', 'date', new AdultBirthDate];
  59. $rules['responsible.cpf'] = ['required_with:responsible', 'string', 'max:20', Cpf::rule()];
  60. $rules['responsible.gender'] = 'sometimes|nullable|string|in:no_preference,male,female,other';
  61. $rules['responsible.degree'] = 'required_with:responsible|string|max:255';
  62. $rules['responsible.email'] = 'required_with:responsible|email|max:255';
  63. $rules['responsible.phone'] = 'required_with:responsible|string|max:20';
  64. $rules['responsible.postal_code'] = 'required_with:responsible|string|max:10';
  65. $rules['responsible.street'] = 'required_with:responsible|string|max:255';
  66. $rules['responsible.address_number'] = 'sometimes|nullable|string|max:20';
  67. $rules['responsible.neighborhood'] = 'required_with:responsible|string|max:255';
  68. $rules['responsible.city_id'] = 'required_with:responsible|integer|exists:cities,id';
  69. $rules['responsible.state_id'] = 'required_with:responsible|integer|exists:states,id';
  70. $rules['responsible.complement'] = 'sometimes|nullable|string|max:255';
  71. $rules['responsible.notes'] = 'sometimes|nullable|string';
  72. } else {
  73. $rules['name'] = 'sometimes|string|max:255';
  74. $rules['document_number'] = [
  75. 'sometimes',
  76. 'nullable',
  77. 'string',
  78. 'max:20',
  79. Cpf::rule(),
  80. Rule::unique('students', 'document_number')->ignore($this->route('id')),
  81. ];
  82. }
  83. return $rules;
  84. }
  85. protected function studentIsMinor(): bool
  86. {
  87. $birthDate = $this->input('birth_date');
  88. if (!is_string($birthDate) || $birthDate === '') {
  89. return false;
  90. }
  91. try {
  92. return Carbon::parse($birthDate)->age < 18;
  93. } catch (Throwable) {
  94. return false;
  95. }
  96. }
  97. }