FranchiseeDashboardController.php 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Controllers\Concerns\ResolvesActiveUnit;
  4. use App\Models\Student;
  5. use App\Models\StudentContract;
  6. use Illuminate\Http\JsonResponse;
  7. class FranchiseeDashboardController extends Controller
  8. {
  9. use ResolvesActiveUnit;
  10. public function summary(): JsonResponse
  11. {
  12. $unitId = $this->activeUnitId();
  13. abort_if(! $unitId, 404, 'Unidade não encontrada.');
  14. $students = Student::where('unit_id', $unitId)->get(['id', 'name', 'birth_date', 'created_at']);
  15. $contracts = StudentContract::latestVersion()->where('unit_id', $unitId)->get(['id', 'status']);
  16. $unit = \App\Models\Unit::find($unitId);
  17. $studentsByStatus = Student::where('unit_id', $unitId)->get(['status']);
  18. return $this->successResponse(payload: [
  19. 'students_count' => $students->count(),
  20. 'students_by_status' => [
  21. 'lead' => $studentsByStatus->where('status', Student::STATUS_LEAD)->count(),
  22. 'active' => $studentsByStatus->where('status', Student::STATUS_ACTIVE)->count(),
  23. 'ex_student' => $studentsByStatus->where('status', Student::STATUS_EX_STUDENT)->count(),
  24. 'locked' => $studentsByStatus->where('status', Student::STATUS_LOCKED)->count(),
  25. ],
  26. 'unit_config' => [
  27. 'active_students_min' => $unit->active_students_min ?? 30,
  28. 'active_students_medium' => $unit->active_students_medium ?? 50,
  29. 'active_students_max' => $unit->active_students_max ?? 80,
  30. ],
  31. 'contracts' => [
  32. 'active' => $contracts->where('status', 'active')->count(),
  33. 'frozen' => $contracts->where('status', 'frozen')->count(),
  34. 'cancelled' => $contracts->where('status', 'cancelled')->count(),
  35. ],
  36. 'birthdays' => $students
  37. ->filter(fn (Student $student) => $student->birth_date?->month === now()->month)
  38. ->map(fn (Student $student) => [
  39. 'day' => $student->birth_date->day,
  40. 'name' => $student->name,
  41. ])
  42. ->sortBy('day')
  43. ->values(),
  44. 'enrollments' => $students->map(fn (Student $student) => [
  45. 'created_at' => $student->created_at?->toISOString(),
  46. ])->values(),
  47. ]);
  48. }
  49. }