ServicePackageRequest.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. namespace App\Http\Requests;
  3. use Illuminate\Foundation\Http\FormRequest;
  4. use Illuminate\Validation\Validator;
  5. class ServicePackageRequest extends FormRequest
  6. {
  7. public function authorize(): bool
  8. {
  9. return true;
  10. }
  11. public function rules(): array
  12. {
  13. $rules = [
  14. 'client_id' => ['sometimes', 'integer', 'exists:clients,id'],
  15. 'provider_id' => ['sometimes', 'integer', 'exists:providers,id'],
  16. 'address_id' => ['sometimes', 'integer', 'exists:addresses,id'],
  17. 'date' => ['nullable', 'date', 'after_or_equal:today'],
  18. 'dates' => ['nullable', 'array'],
  19. 'dates.*' => ['date', 'after_or_equal:today'],
  20. 'schedules' => ['nullable', 'array'],
  21. 'schedules.*.provider_id' => ['sometimes', 'integer', 'exists:providers,id'],
  22. 'schedules.*.date' => ['required', 'date', 'after_or_equal:today'],
  23. 'schedules.*.period_type' => ['required', 'in:2,4,6,8'],
  24. 'schedules.*.start_time' => ['required', 'date_format:H:i'],
  25. 'schedules.*.end_time' => ['required', 'date_format:H:i', 'after:schedules.*.start_time'],
  26. 'schedules.*.total_amount' => ['required', 'numeric', 'min:0'],
  27. 'schedules.*.offers_meal' => ['nullable', 'boolean'],
  28. 'offers_meal' => ['sometimes', 'nullable', 'boolean'],
  29. 'period_type' => ['sometimes', 'in:2,4,6,8'],
  30. 'start_time' => ['sometimes', 'date_format:H:i'],
  31. 'end_time' => ['sometimes', 'date_format:H:i', 'after:start_time'],
  32. 'total_amount' => ['sometimes', 'numeric', 'min:0'],
  33. 'schedule_type' => ['sometimes', 'in:default,custom'],
  34. ];
  35. if ($this->isMethod('POST')) {
  36. $rules['client_id'] = ['required', 'integer', 'exists:clients,id'];
  37. if ($this->hasSchedulePayload()) {
  38. $rules['provider_id'] = ['required_without:schedules', 'integer', 'exists:providers,id'];
  39. $rules['address_id'] = ['required', 'integer', 'exists:addresses,id'];
  40. $rules['date'] = ['required_without_all:dates,schedules', 'nullable', 'date', 'after_or_equal:today'];
  41. $rules['dates'] = ['nullable', 'array'];
  42. $rules['dates.*'] = ['date', 'after_or_equal:today'];
  43. $rules['schedules'] = ['nullable', 'array', 'min:1'];
  44. $rules['schedules.*.provider_id'] = ['required_without:provider_id', 'integer', 'exists:providers,id'];
  45. $rules['schedules.*.date'] = ['required', 'date', 'after_or_equal:today'];
  46. $rules['schedules.*.period_type'] = ['required', 'in:2,4,6,8'];
  47. $rules['schedules.*.start_time'] = ['required', 'date_format:H:i'];
  48. $rules['schedules.*.end_time'] = ['required', 'date_format:H:i', 'after:schedules.*.start_time'];
  49. $rules['schedules.*.total_amount'] = ['required', 'numeric', 'min:0'];
  50. $rules['period_type'] = ['required_without:schedules', 'in:2,4,6,8'];
  51. $rules['start_time'] = ['required_without:schedules', 'date_format:H:i'];
  52. $rules['end_time'] = ['required_without:schedules', 'date_format:H:i', 'after:start_time'];
  53. $rules['total_amount'] = ['required_without:schedules', 'numeric', 'min:0'];
  54. }
  55. }
  56. return $rules;
  57. }
  58. public function after(): array
  59. {
  60. return [function (Validator $validator): void {
  61. if (! $this->hasSchedulePayload()) {
  62. return;
  63. }
  64. $rootProviderId = $this->integer('provider_id') ?: null;
  65. $providerIds = collect($this->input('schedules', []))
  66. ->map(fn (array $schedule) => data_get($schedule, 'provider_id', $rootProviderId))
  67. ->when(
  68. ! $this->filled('schedules') && $rootProviderId,
  69. fn ($ids) => $ids->push($rootProviderId),
  70. )
  71. ->filter()
  72. ->unique()
  73. ->values();
  74. if ($providerIds->count() > 1) {
  75. $validator->errors()->add(
  76. 'schedules',
  77. __('messages.service_package_same_provider'),
  78. );
  79. }
  80. }];
  81. }
  82. private function hasSchedulePayload(): bool
  83. {
  84. return $this->filled('date')
  85. || $this->filled('dates')
  86. || $this->filled('schedules');
  87. }
  88. /**
  89. * Add custom messages when needed
  90. * public function messages(): array
  91. * {
  92. * return [
  93. * 'field.required' => __('message.algo'),
  94. * ];
  95. * }
  96. */
  97. }