File manager - Edit - /var/www/html/spdc/api/app/Http/Services/ScaleService.php
Back
<?php namespace App\Http\Services; use App\Models\Scale; use App\Enums\ScaleType; use App\Models\ScaleTeam; use App\Models\Department; use Illuminate\Support\Arr; use Illuminate\Http\Request; use App\Models\ScaleFunction; use App\Models\ScaleExtraHour; use Illuminate\Support\Carbon; use App\Enums\WarningScaleType; use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\DB; use App\Http\Requests\ScaleRequest; use App\Classes\BaseServiceResponse; use App\Http\Resources\ScaleCollection; use App\Http\Requests\WarningScaleRequest; use App\Http\Resources\ScaleWithAgendaResource; class ScaleService extends BaseService { public function index(Request $request): BaseServiceResponse { $query = Scale::query(); if ($request->has('warning')) { $query = $query->where('warning', $request->warning); } if ($request->has('month')) { $query = $query->where('month', $request->month); } if ($request->has('year')) { $query = $query->where('year', $request->year); } if ($request->has('department_id')) { $query = $query->where('department_id', $request->department_id); } if ($request->has('finished')) { $query = $query->where('finished', $request->finished); } $scales = $query->paginate(); return $this->response( new ScaleCollection($scales) ); } public function store(ScaleRequest $request): BaseServiceResponse { /** * Aqui será gerada uma previsão da escala. A escala poderá ser alterada até ser finalizada. */ /** * Mano, a parada é o seguinte, se já tiver uma escala gerada para esse mês nesse ano, independente de estar finalizada ou não, não pode gerar uma nova, se quiser alterar, utilizar a rota de update (y) */ $exists = Scale::where('warning', $request->warning) ->where('month', $request->month) ->where('year', $request->year) ->where('department_id', $request->department_id) ->exists(); if ($exists) { return $this->response([], JsonResponse::HTTP_BAD_REQUEST, 'Esse departamento já possui escala neste mês neste ano.'); } /** * Se for uma escala de equipe, tem que ter no MÍNIMO 3 equipes e se for individual, tem que ter no MÍNIMO 3 pessoas, por que? Porque elas tem que ter um descanso de 24h antes de serem escaladas novamente. */ $scaleType = Department::findOrFail($request->department_id)?->scale_type; if (!$this->isAValidAmountOfUsersAndTeams($scaleType, $request->members)) { return $this->response([], JsonResponse::HTTP_BAD_REQUEST, 'Não possui a quantidade mínima de usuários ou times. Quantidade mínima: 3.'); } try { DB::beginTransaction(); $scale = Scale::create($request->all()); $members = treatArrayInput($request->members); /** * Gerando a escala padrão */ if ($scaleType === ScaleType::EQUIPE->value) { /** * salvando as funções existentes nessa escala */ if (!$this->generateTeamScale($scale, $members, $request->month, $request->year)) { return $this->response([], JsonResponse::HTTP_BAD_REQUEST, 'Houve um erro ao gerar a escala. Contate o suporte.'); } } elseif ($scaleType === ScaleType::INDIVIDUAL->value) { if (!$this->generateIndividualScale($scale, $members, $request->month, $request->year)) { return $this->response([], JsonResponse::HTTP_BAD_REQUEST, 'Houve um erro ao gerar a escala. Contate o suporte.'); } } DB::commit(); } catch (\Exception $e) { DB::rollBack(); return $this->response([], JsonResponse::HTTP_BAD_REQUEST, 'Houve um erro ao gerar a escala. Contate o suporte.'); } return $this->response( new ScaleWithAgendaResource($scale->load(['days.members.teams', 'days.extraHours', 'department'])), JsonResponse::HTTP_CREATED ); } public function storeWarning(WarningScaleRequest $request): BaseServiceResponse { $exists = Scale::where('warning', true) ->where('month', $request->month) ->where('year', $request->year) ->where('department_id', $request->department_id) ->exists(); if ($exists) { return $this->response([], JsonResponse::HTTP_BAD_REQUEST, 'Esse departamento já possui escala neste mês neste ano.'); } $scale = Scale::create($request->all()); $scaleType = Department::findOrFail($request->department_id)?->scale_type; try { DB::beginTransaction(); $calendar = $request->calendar; foreach ($calendar as $data) { $scaleDay = $scale->days()->create([ 'day' => $data['day'] ]); $scaleMember = $scaleDay->members()->create([ 'user_id' => $data['user_id'], ]); if (isset($data['scale_function_id'])) { $randomTeam = ScaleTeam::get()->random(); $scaleMember->teams()->attach($randomTeam->id, ['scale_function_id' => $data['scale_function_id']]); } } DB::commit(); } catch (\Exception $e) { DB::rollBack(); return $this->response([], JsonResponse::HTTP_BAD_REQUEST, 'Houve um erro ao gerar a escala. Contate o suporte.'); } return $this->response( new ScaleWithAgendaResource($scale->load(['days.members.teams', 'days.extraHours', 'department'])), JsonResponse::HTTP_CREATED ); } public function updateWarning(WarningScaleRequest $request, Scale $scale): BaseServiceResponse { $scale->fill($request->all())->save(); try { DB::beginTransaction(); $calendar = $request->calendar; if ($scale->days()->delete()) { foreach ($calendar as $data) { $scaleDay = $scale->days()->create([ 'day' => $data['day'] ]); $scaleMember = $scaleDay->members()->create([ 'user_id' => $data['user_id'], ]); if (isset($data['scale_function_id'])) { $randomTeam = ScaleTeam::get()->random(); $scaleMember->teams()->attach($randomTeam->id, ['scale_function_id' => $data['scale_function_id']]); } } } DB::commit(); } catch (\Exception $e) { DB::rollBack(); return $this->response([], JsonResponse::HTTP_BAD_REQUEST, 'Houve um erro ao gerar a escala. Contate o suporte.'); } return $this->response( new ScaleWithAgendaResource($scale->load(['days.members.teams', 'days.extraHours', 'department'])), JsonResponse::HTTP_CREATED ); } public function show(Scale $scale): BaseServiceResponse { return $this->response( new ScaleWithAgendaResource($scale->load(['days.members.teams', 'days.extraHours', 'department'])), JsonResponse::HTTP_OK ); } public function update(ScaleRequest $request, Scale $scale): BaseServiceResponse { /** * Poderá ser alterado: * - Alterar o dia que uma equipe foi escala * - Alterar um agente de um equipe e passar para outra * - Antes de salvar as alterações, verificar: * - Os usuários estão aptos a serem escalados no dia? * * Usuários aptos: * - Não trabalhou os últimos 2 dias seguidos; */ /** * Não permitir alterações em escalas finalizadas */ if ($scale->finished === true) { return $this->response([], JsonResponse::HTTP_BAD_REQUEST, 'Esta escala já foi finalizada e não pode mais ser alterada.'); } $calendar = treatArrayInput($request->calendar); /** * Escala de equipe */ if ($scale->department->scale_type === ScaleType::EQUIPE->value) { /** * Excluir todos os dados */ if ($scale->days()->delete()) { foreach($calendar as $day => $data) { $agents = treatArrayInput($data['agents']); $teamId = $data['team']['id']; foreach($agents as $agent) { /** * verificando se o usuário pode ser escalada nesse dia */ if ($this->isUserAvaliable($data['day'], $scale->month, $scale->year, $agent['user']['id'])) { /** * Verificar se o time já tem alguém escalado para a função */ if ( ($scale->days()->exists() && $this->isFunctionAvaliable($scale, $data['day'], $agent['function']['id'])) || !$scale->days()->exists() ) { $scaleDay = $scale->days()->create([ 'day' => $data['day'] ]); $scaleMember = $scaleDay->members()->create([ 'user_id' => $agent['user']['id'], ]); $scaleMember->teams()->attach($teamId, ['scale_function_id' => $agent['function']['id']]); } } } } } } elseif ($scale->department->scale_type === ScaleType::INDIVIDUAL->value) { /** * Excluir todos os dados */ if ($scale->days()->delete()) { foreach($calendar as $day => $data) { $agents = treatArrayInput($data['agents']); foreach($agents as $agent) { /** * verificando se o usuário pode ser escalada nesse dia */ if ($this->isUserAvaliable($data['day'], $scale->month, $scale->year, $agent['user']['id'])) { $scaleDay = $scale->days()->create([ 'day' => $data['day'] ]); $scaleDay->members()->create([ 'user_id' => $agent['user']['id'], ]); } } } } } $scale->fill($request->all()); $scale->save(); return $this->response( new ScaleWithAgendaResource($scale->load(['days.members.teams', 'days.extraHours', 'department'])), JsonResponse::HTTP_OK ); } public function destroyMany(Request $request): BaseServiceResponse { Scale::destroy(treatArrayInput($request->scales)); return $this->response( null, JsonResponse::HTTP_NO_CONTENT ); } public function finish(Scale $scale): BaseServiceResponse { /** * Quando a escala for finalizada, registrar as horas extras, se for uma escala regular */ $scale->fill(['finished' => true])->save(); if ($scale->warning === true) { return $this->response( new ScaleWithAgendaResource($scale->load(['days.members.teams', 'days.extraHours', 'department'])), JsonResponse::HTTP_OK ); } /** * registrar horas extras disponíveis */ $functions = $scale->days() ->with('members.teams') // Carrega os membros e as equipes relacionadas ->get() ->pluck('members.*.teams.*.pivot.scale_function_id') ->flatten() ->unique() ->toArray(); $teams = $scale->days() ->with('members.teams') // Carrega os membros e as equipes relacionadas ->get() ->pluck('members.*.teams.*.id') ->flatten() ->unique() ->toArray(); foreach($scale->days as $day) { if ($scale->department->scale_type === ScaleType::EQUIPE->value) { foreach($functions as $function) { foreach($teams as $team) { $availableExtraHour = !$day->members()->whereHas('teams', function ($query) use ($function, $team) { $query->where('scale_team_scale_member.scale_function_id', $function); $query->where('scale_team_scale_member.scale_team_id', $team); })->exists(); if ($availableExtraHour) { ScaleExtraHour::create([ 'scale_day_id' => $day->id, 'scale_function_id' => $function, 'scale_team_id' => $team, 'available' => true ]); } } } } elseif ($scale->department->scale_type === ScaleType::INDIVIDUAL->value) { $availableExtraHour = !$day->members()->exists(); if ($availableExtraHour) { ScaleExtraHour::create([ 'scale_day_id' => $day->id, 'available' => true ]); } } } return $this->response( new ScaleWithAgendaResource($scale->load(['days.members.teams', 'days.extraHours', 'department'])), JsonResponse::HTTP_OK ); } public function suggestWarningScale(Scale $scale): BaseServiceResponse { if (Scale::where('warning', true)->where('month', $scale->month)->where('year', $scale->year)->where('department_id', $scale->department_id)->where('finished', true)->exists()) { return $this->response([], JsonResponse::HTTP_BAD_REQUEST, 'Esta escala já possui uma escala de sobraviso finalizada.'); } $warningScaleType = $scale->department->warning_scale_type; $scaleType = $scale->department->scale_type; if ($warningScaleType !== WarningScaleType::SEMANAL->value || $scaleType !== ScaleType::EQUIPE->value) { return $this->response([], JsonResponse::HTTP_BAD_REQUEST, 'A escala precisa ser de equipe e semanal para utilizar este recurso.'); } $daysOfMonth = Carbon::create($scale->year, $scale->month, 1)->daysInMonth; // if ($warningScaleType === WarningScaleType::SEMANAL->value) { // if ($scaleType === ScaleType::EQUIPE->value) { $functions = $scale->days() ->with('members.teams') // Carrega os membros e as equipes relacionadas ->get() ->pluck('members.*.teams.*.pivot.scale_function_id') ->flatten() ->unique() ->toArray(); $warningScalePreview = []; $optionsByFunction = []; foreach($scale->days as $day) { foreach($functions as $function) { /** * pegar a primeira pessoa disponível para a função * adicionar essa pessoa a um array de controle para saber que ela já foi escalada em um dia */ $dude = $day->members()->whereHas('teams', function ($query) use ($function) { $query->where('scale_team_scale_member.scale_function_id', $function); })->first()?->user_id; if (!isset($optionsByFunction[$function])) { $optionsByFunction[$function][] = $dude; } elseif (!in_array($dude, $optionsByFunction[$function])) { $optionsByFunction[$function][] = $dude; } } } $week = 1; foreach($scale->days as $day) { if ($day->day === 1 || $day->day % 7 === 0) { if ($day->day % 7 === 0) { $week++; } foreach($functions as $function) { $index = random_int(0, count($optionsByFunction[$function]) - 1); $warningScalePreview[$week][] = [ $function => $optionsByFunction[$function][$index] ]; } } } Scale::where('warning', true)->where('month', $scale->month)->where('year', $scale->year)->where('department_id', $scale->department_id)->where('finished', false)->delete(); /** * criando a escala */ $warningScale = Scale::create([ 'warning' => true, 'month' => $scale->month, 'year' => $scale->year, 'department_id' => $scale->department_id, 'finished' => false ]); $day = 1; foreach ($warningScalePreview as $week => $data) { for ($day; $day <= $daysOfMonth; $day++) { $warningScaleDay = $warningScale->days()->create([ 'day' => $day, ]); foreach($data as $agents) { foreach($agents as $function => $userId) { // dd($function, $userId); if (isset($userId)) { $warningScaleMember = $warningScaleDay->members()->create([ 'user_id' => $userId, ]); $team = $scale->days()->whereHas('members', function ($query) use ($userId) { $query->where('user_id', $userId); }) ->with('members.teams') ->first(); $teamId = $team->members[0]->teams[0]->id; $warningScaleMember->teams()->attach($teamId, ['scale_function_id' => $function]); } } } if ($day % 7 === 0) { $day++; break; } } } // } // elseif ($scaleType === ScaleType::INDIVIDUAL->value) { // } // } // elseif ($warningScaleType === WarningScaleType::DIARIO->value) { // } return $this->response( new ScaleWithAgendaResource($warningScale->load(['days.members.teams', 'days.extraHours', 'department'])) ); } public function myAgenda(Request $request): BaseServiceResponse { $scales = Scale::with(['days.members'])->where('finished', true)->where('month', $request->month) ->where('year', $request->year) ->get(); $user = $request->user; $users = $scales->pluck('days.*.members.*.user_id') ->flatten() ->unique() ->toArray(); sort($users); $filters = ''; for($i = 0; $i < count($users); $i++) { if ($i == 0) { $filters = "?like[$i]=id," . $users[$i]; } else { $filters .= "&like[$i]=id," . $users[$i]; } } $url = env('AUTH_SERVICE_URL') . '/api/user' . $filters . '&without_paginate=1'; $usersResponse = authServiceClient('get', $url, null, [ 'Authorization' => 'Bearer ' . authLogin()['access_token'] ]); if ($usersResponse->successful()) { $usersInfo = $usersResponse->json()['data']; } // dd($usersInfo, $users); $data = []; foreach($scales as $scale) { foreach($scale->days as $day) { if (count($day->members) > 0) { foreach($day->members as $member) { if ($member?->teams()->exists()) { $scaleFunctionId = $member?->teams()->pluck('scale_team_scale_member.scale_function_id')->toArray()[0]; if (isset($scaleFunctionId)) { $scaleFunction = ScaleFunction::findOrFail($scaleFunctionId); } } if ($member?->teams()->exists()) { $scaleTeamId = $member?->teams()->pluck('scale_team_scale_member.scale_team_id')->toArray()[0]; if (isset($scaleTeamId)) { $scaleTeam = ScaleTeam::findOrFail($scaleTeamId); } } $userData = Arr::first($usersInfo, function (array $user, int $key) use ($member) { return $user['id'] == $member['user_id']; }); if (isset($userData)) { $data[$day->day][] = [ 'scale_day_id' => $day->id, 'scale_member_id' => $member?->id, 'scale_function_id' => isset($scaleFunctionId) ? $scaleFunctionId : null, 'scale_team_id' => isset($scaleTeamId) ? $scaleTeamId : null, 'name' => $userData['name'], 'departament' => $scale->department->name, 'function' => isset($scaleFunction) ? $scaleFunction->name : null, 'team' => isset($scaleTeam) ? $scaleTeam->name : null, 'day' => $day->day, 'warning' => $scale->warning, 'owner' => $user['id'] === $userData['id'] ]; } } } } } return $this->response($data); } private function generateTeamScale(Scale $scale, array $members, int|string $currentMonth, int|string $currentYear): bool { try { DB::beginTransaction(); $currentMonth = intval($currentMonth); $currentYear = intval($currentYear); $scaleType = $scale->department->scale_type; $anyScaleInThisMonth = Scale::where('month', $currentMonth)->where('year', $currentYear)->get(); $availableCheckByDay = []; $daysOfMonth = Carbon::create($currentYear, $currentMonth, 1)->daysInMonth; $teams = array_unique(getItemsByKey($members, 'scale_team_id')); $teamsCounter = count($teams); $availableCheckByDay = $this->generateAvaliableByDayList($members, $daysOfMonth, $currentMonth, $currentYear, $scaleType); $scalePreview = []; // verificar por dia qual equipe tem mais pessoas disponiveis e atribuir a equipe com mais pessoas disponiveis para aquele dia /** * mainAvaliableList: lista principal para distribuir as equipes por dia * secondAvaliableList: lista secundária, com as equipes que podem ser escalas no dia, porém, não são a prioridade * Ex.: * - Temos 5 equipes: A,B,C,D,E * - A equipe A pode ser escalada no dia 1 e também no dia 2, pois é permitido trabalhar 48h seguidas, porém, como há outras equipes que podem assumir o dia 2, ela é retirada da lista principal e passa a constar na lista secundária, para ser escalada para o dia 2 somente se não houver outra equipe disponível. */ $mainAvaliableList = $availableCheckByDay; $secondAvaliableList = []; for($day = 1; $day <= $daysOfMonth; $day++) { $teamMostAvailable = 0; $currentTeam = null; /** mainAvaliableList logic */ foreach($mainAvaliableList as $scaleTeamId => $days) { if (isset($mainAvaliableList[$scaleTeamId][$day])) { $availableUserCount = count($mainAvaliableList[$scaleTeamId][$day]); if ($availableUserCount > $teamMostAvailable) { $teamMostAvailable = $availableUserCount; $currentTeam = $scaleTeamId; } } } $daysOff = $teamsCounter > 2 ? $teamsCounter : 3; if (!is_null($currentTeam)) { $scalePreview[$day] = $currentTeam; for ($i = 1; $i < $daysOff; $i++) { if (isset($mainAvaliableList[$currentTeam][$day + $i])) { if ($daysOff - $i > 2) { $secondAvaliableList[$currentTeam][$day + $i] = $mainAvaliableList[$currentTeam][$day + $i]; } unset($mainAvaliableList[$currentTeam][$day + $i]); } } } /** $secondAvaliableList logic */ if (is_null($currentTeam)) { foreach($secondAvaliableList as $scaleTeamId => $days) { if (isset($secondAvaliableList[$scaleTeamId][$day])) { $availableUserCount = count($secondAvaliableList[$scaleTeamId][$day]); if ($availableUserCount > $teamMostAvailable) { $teamMostAvailable = $availableUserCount; $currentTeam = $scaleTeamId; } } } } if (!is_null($currentTeam)) { $scalePreview[$day] = $currentTeam; for ($i = 1; $i < $daysOff; $i++) { if (isset($secondAvaliableList[$currentTeam][$day + $i])) { unset($secondAvaliableList[$currentTeam][$day + $i]); } } } } /** * montar a escala */ foreach($scalePreview as $day => $team) { $scaleDay = $scale->days()->create([ 'day' => $day ]); if (isset($availableCheckByDay[$team][$day])) { foreach($availableCheckByDay[$team][$day] as $userId) { $scaleMember = $scaleDay->members()->create([ 'user_id' => $userId, ]); $userInfo = Arr::first($members, function ($member, int $key) use ($userId) { return $member['user_id'] == $userId; }); $scaleMember->teams()->attach($team, ['scale_function_id' => $userInfo['scale_function_id']]); } } } DB::commit(); } catch (\Exception $e) { DB::rollBack(); return false; } return true; } private function generateIndividualScale(Scale $scale, array $members, int|string $currentMonth, int|string $currentYear): bool { try { DB::beginTransaction(); $currentMonth = intval($currentMonth); $currentYear = intval($currentYear); $scaleType = $scale->department->scale_type; /** * se o mês for 1, o mês anterior será o mês 12 do ano anterior */ /** * se o mês for 1, o mês anterior será o mês 12 do ano anterior */ $anyScaleInThisMonth = Scale::where('month', $currentMonth)->where('year', $currentYear)->get(); $daysOfMonth = Carbon::create($currentYear, $currentMonth, 1)->daysInMonth; $availableCheckByDay = $this->generateAvaliableByDayList($members, $daysOfMonth, $currentMonth, $currentYear, $scaleType); $scalePreview = []; // verificar o usuário disponível no dia e escalar ele $mainAvaliableList = $availableCheckByDay; for($day = 1; $day <= $daysOfMonth; $day++) { foreach($mainAvaliableList as $dayKey => $users) { if ($dayKey == $day) { foreach($users as $key => $user) { if (!isset($scalePreview[$day])) { $scalePreview[$day] = $user; $daysOff = count($users) > 2 ? count($users) : 3; for ($i = 1; $i < $daysOff; $i++) { if (isset($mainAvaliableList[$day + $i][$key])) { unset($mainAvaliableList[$day + $i][$key]); } } } } } } } /** * montar a escala */ foreach($scalePreview as $day => $userId) { $scaleDay = $scale->days()->create([ 'day' => $day ]); $scaleMember = $scaleDay->members()->create([ 'user_id' => $userId, ]); } DB::commit(); } catch (\Exception $e) { DB::rollBack(); return false; } return true; } private function checkIfAUserIsAlreadyScheduleInADay($scales, $day, $userId): bool { if (count($scales) > 0) { foreach($scales as $anyScale) { $anyScaleDay = $anyScale->days()->where('day', $day)->first(); if ($anyScaleDay?->members()->where('user_id', $userId)->exists()) { return true; } } } return false; } private function isAValidAmountOfUsersAndTeams($scaleType, $members): bool { if ($scaleType === ScaleType::EQUIPE->value) { $teams = array_unique(getItemsByKey(treatArrayInput($members), 'scale_team_id')); if (count($teams) < 3) { return false; } return true; } elseif ($scaleType === ScaleType::INDIVIDUAL->value) { $users = array_unique(getItemsByKey(treatArrayInput($members), 'user_id')); if (count($users) < 3) { return false; } return true; } else { return false; } } private function generateAvaliableByDayList(array $members, int $daysOfMonth, $currentMonth, $currentYear, $scaleType): array { $availableByDayList = []; foreach($members as $member) { // verificar se houve escala no mês anterior for($day = 1; $day <= $daysOfMonth; $day++) { if (isset($member['user_id'])) { // verificando se o user_id existe, caso não exista, será tratado depois como hora extra disponível if ($this->isUserAvaliable($day, $currentMonth, $currentYear, $member['user_id'])) { if ($scaleType === ScaleType::EQUIPE->value) { $availableByDayList[$member['scale_team_id']][$day][] = $member['user_id']; } elseif ($scaleType === ScaleType::INDIVIDUAL->value) { $availableByDayList[$day][] = $member['user_id']; } } } } } return $availableByDayList; } public function isUserAvaliable(int $day, int $currentMonth, int $currentYear, string $userId): bool { $previousMonth = $currentMonth == 1 ? 12 : $currentMonth - 1; $previousYear = $currentYear - 1; $previousScale = Scale::where('month', $previousMonth); if ($currentMonth == 1) { $previousScale = $previousScale->where('year', $previousYear); } else { $previousScale = $previousScale->where('year', $currentYear); } $previousScale = $previousScale->first(); if (isset($previousScale)) { // se tiver escala anterior if ($currentMonth === 1) { $daysOfLastMonth = Carbon::create($previousYear, $previousMonth, 1)->daysInMonth; } else { $daysOfLastMonth = Carbon::create($currentYear, $previousMonth, 1)->daysInMonth; } } /** * Se houver escalas de outros departamentos já geradas para o mês atual, verificar se o usuário está escalado no dia em questão. * Se tiver escalado, esquece, não vai entrar nesse dia nessa nova escala não :p */ $anyScaleInThisMonth = Scale::where('month', $currentMonth)->where('year', $currentYear)->get(); $notScheduledForToday = !$this->checkIfAUserIsAlreadyScheduleInADay($anyScaleInThisMonth, $day, $userId); if (isset($previousScale)) { // se tiver escala anterior $last24h = $day == 1 ? $daysOfLastMonth : $day - 1; $last48h = $day == 1 ? $daysOfLastMonth - 1 : $day - 2; } if ($notScheduledForToday) { if ($day === 1 && isset($previousScale)) { /** * Se tiver escala anterior e essa for a verificação do dia 01 do mês corrente, verificar o usuário trabalhou nos últimos dias seguidos do último mês. */ /** * Verificando se o usuário trabalhou 2 seguidos. */ $doesNotWorkedFollowed48hHours = !$previousScale->days() ->whereRelation('members', 'scale_members.user_id', $userId) ->where('scale_days.day', $last24h) ->where('scale_days.day', $last48h) ->exists(); /** * Se o usuário não estiver em outra escala de outro departamento e não trabalhou nas últimas 48h consecutivas, ele está apto para ser escalado no dia em questão. */ if ($doesNotWorkedFollowed48hHours) { return true; } } elseif ($day === 2 && isset($previousScale)) { /** * Se tiver escala anterior e essa for a verificação do dia 02 do mês corrente, verificar: * - se o usuário trabalhou no último dia do mês anterior E se o usuário está escalado na escala de outro setor no dia 01: totalizando 48h consecutivas de trabalho. */ $doesNotWorkedTwoDaysAgo = !$previousScale->days() ->whereRelation('members', 'scale_members.user_id', $userId) ->where('scale_days.day', $last48h) ->exists(); if($doesNotWorkedTwoDaysAgo) { return true; } else { if ($currentMonth == 1) { $scalesFromPreviousDay = Scale::where('month', $previousMonth)->where('year', $previousYear)->get(); } else { $scalesFromPreviousDay = Scale::where('month', $previousMonth)->where('year', $currentYear)->get(); } $notScheduleForDayBefore = !$this->checkIfAUserIsAlreadyScheduleInADay($scalesFromPreviousDay, $day, $userId); if ($notScheduleForDayBefore) { return true; } } } else { return true; } } return false; } private function isFunctionAvaliable(Scale $scale, int $day, string $functionId): bool { return $scale->days()->where('day', $day)->whereHas('members', function ($query) use ($functionId) { $query->whereHas('teams', function ($query) use ($functionId) { $query->where('scale_team_scale_member.scale_function_id', $functionId); }); }) ->exists(); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings