email; $receiveDataEmail = User::where('email', $userEmail)->first(); $receiveDataWs = ConstructionWorkstation::where('name_workstations', $receiveDataEmail->user_name)->first(); $equipmentToReview = collect(); // Coleção para armazenar equipamentos para revisão $executionEquipment = collect();// Coleção para armazenar equipamentos Em execução $completedEquipments = collect(); // Coleção para armazenar equipamentos concluídos // Verifica equipamentos que tenho 2 dados com o departure_date = NULL e especificamente um dado tem o elemental_tasks_id = 9 e o outro igual a NULL. //Isto para ser possivel identificar equipamentos (psv-Provavelmente) que esta sendo feitas em simultanio suas pecas e nao deve ser diponivel ate uma de suas pecas tiverem deponivel. $excludedEquipmentsQuery = ControlEquipmentWorkstation::select('equipmentWorkHistorys_id') ->whereNull('departure_date') ->where('status', 1) ->groupBy('equipmentWorkHistorys_id') ->havingRaw('SUM(CASE WHEN elemental_tasks_id = 9 THEN 1 ELSE 0 END) = 1') // Assegura um registro com elemental_tasks_id = 9 ->havingRaw('SUM(CASE WHEN elemental_tasks_id IS NULL THEN 1 ELSE 0 END) = 1') // Assegura um registro com elemental_tasks_id NULL ->pluck('equipmentWorkHistorys_id'); // Obtém os IDs para exclusão //Onde estava o antigo Code // Busca todos os equipamentos associados a um determinado projeto. $receiveAllEquipmentOfProject = Equipment::where('company_projects_id', $receiveDataWs->company_projects_id) // Use whereDoesntHave para excluir os equipamentos cujos IDs de histórico estão no array excluído ->where(function ($query) use ($excludedEquipmentsQuery) { // Agrupa as condições para aplicar corretamente a lógica de exclusão e inclusão $query->whereDoesntHave('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) use ($excludedEquipmentsQuery) { // Exclui os equipamentos cujos IDs de histórico estão no array excluído $subQuery->whereIn('equipmentWorkHistorys_id', $excludedEquipmentsQuery); }) ->orWhere(function ($query) { // Aplica o segundo filtro somente aos equipamentos que não foram excluídos pelo primeiro //Libera novamente o equipamento ao concluir uma tarefa. $query->whereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { $subQuery->whereNotNull('id_workstations') ->whereNotNull('elemental_tasks_id') ->whereNotNull('departure_date') ->where('status', 1); }); // Verifica no sistema se for uma 'PSV' , mesmo apos entrar como @Corpo, ou pelo @Obutador deve deixar o outro disponivel. $query->whereHas('equipmentType', function ($typeQuery) { $typeQuery->where('equipment_type_id', 3); }) ->whereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { $subQuery->where('status', 1) ->whereNull('departure_date') ->where(function ($taskQuery) { $taskQuery->where('elemental_tasks_id', 9) ->orWhereNull('elemental_tasks_id'); }); }); }); // Primeiro filtro: Equipamentos sem ocorrência em ControlEquipmentWorkstation $query->whereDoesntHave('equipmentWorkHistory.controlEquipmentWorkstation'); // Segundo filtro: Equipamentos que ja tiverem um controlEquipmentWorkstation_ID criado uma dos Ws o fechou sem concluir por um metodo nao convencional e o script do servidor limpou o controlEquipmentWorkstation_ID $query->orWhereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { $subQuery->whereNull('id_workstations') ->whereNull('elemental_tasks_id') ->whereNull('departure_date') ->where('status', 0); }); }) ->with('equipmentWorkHistory') // Carrega o relacionamento equipmentWorkHistory a coleção de cada equipamento ->get() ->map(function ($equipment) { if (!$equipment->equipmentWorkHistory->isEmpty()) { $equipmentWorkHistory = $equipment->equipmentWorkHistory->first(); $equipment->equipmentWorkHistoryId = $equipmentWorkHistory->equipmentWorkHistorys_id; } else { $equipment->equipmentWorkHistoryId = null; } return $equipment; }); // Inicializa um array para armazenar o status de cada equipamento $equipmentStatus = []; foreach ($receiveAllEquipmentOfProject as $equipment) { // Agora 'equipmentWorkHistoryId' contém um único ID, então não usamos 'pluck' $workHistoryId = $equipment->equipmentWorkHistoryId; //// Obter ID do histórico de trabalho diretamente // Verifica se existe um workHistoryId antes de prosseguir //POREM POR NORMA, TODOS DEVEM TER if (is_null($workHistoryId)) { continue; // Se não houver histórico de trabalho, continua para o próximo equipamento } $taskIds = OrderEquipmentTasks::where('equipmentWorkHistorys_id', $workHistoryId) ->pluck('elemental_tasks_id'); // Obter IDs de tarefas elementares baseado em um único workHistoryId(recebe as tarefas para o equipamento atual) if ($taskIds->isEmpty()) { continue; // Se não houver tarefas, continua para o próximo equipamento } // Busca registros na ControlEquipmentWorkstation com base no equipmentWorkHistoryId $controlRecords = ControlEquipmentWorkstation::where('equipmentWorkHistorys_id', $workHistoryId)->get(); // Remover equipamentos concluídos da coleção original if ($controlRecords->isEmpty()) { // Se não houver registros, considera como valor 0 (nenhuma tarefa ativa) $equipmentStatus[$equipment->equipment_id] = 0; } else { //Caso ja tenha dados sobre o equipamento no control, significa que ja e um equipamento 'Em execução' //Ao colocar aqui a adicao a execução, ele apenas considera os equipamentos que estao em algum posto de trabalho, sem considerar as tarefas ja feitas. $executionEquipment->push($equipment); //Deve verificar se o departure_date e NULL e o id_workstations <> null, e status = 0 // $activeTasks = $controlRecords->whereNull('departure_date'); $activeTasks = $controlRecords->whereNull('departure_date') ->whereNotNull('id_workstations') ->where('status', '!=', 0); if ($activeTasks->isEmpty()) { // Se não houver tarefas ativas, considera como valor 0 (nenhuma tarefa ativa) $equipmentStatus[$equipment->equipment_id] = 0; } else { // Verifica as condições para determinar os valores 1 ou 2 $hasObturadorTask = $activeTasks->contains('elemental_tasks_id', 9); $hasCorpoTask = $activeTasks->contains('elemental_tasks_id', null); if ($hasObturadorTask) { // Verifica as condições para determinar os valores 1 ou 2 $equipmentStatus[$equipment->equipment_id] = 2; } elseif ($hasCorpoTask) { // Se tiver tarefa ativa para Corpo, valor = 1 $equipmentStatus[$equipment->equipment_id] = 1; } else { // Caso contrário, considera como 0 $equipmentStatus[$equipment->equipment_id] = 0; } } } // Vai verificar diretamente na base de dados , busca todos os dados do equipmentWorkHistorys_id, nesta obra e verificar com base na colecao recebida, se entre todos os seus valores, tem pelo menos um elemental_tasks_id, presente na variavel $taskIds $taskCountsInControlRecords = ControlEquipmentWorkstation::where('equipmentWorkHistorys_id', $workHistoryId) ->whereNotNull('departure_date') ->whereIn('elemental_tasks_id', $taskIds) ->groupBy('elemental_tasks_id') ->select('elemental_tasks_id', DB::raw('COUNT(*) as count')) ->pluck('count', 'elemental_tasks_id'); // Verifica se todas as tarefas foram concluídas pelo menos uma vez $allTasksCompleted = $taskIds->every(function ($taskId) use ($taskCountsInControlRecords) { return isset($taskCountsInControlRecords[$taskId]) && $taskCountsInControlRecords[$taskId] > 0; }); // $allTasksCompleted vai ter TRUE, apenas quando se verificar todos as tarefas foram feitas no equipamento. if ($allTasksCompleted) { $changeEquipmentStatus = EquipmentWorkHistory::where('equipmentWorkHistorys_id', $equipment->equipmentWorkHistoryId)->first(); if ($changeEquipmentStatus->equipment_status_project == 0) { $changeEquipmentStatus->equipment_status_project = 1; $changeEquipmentStatus->save(); } elseif ($changeEquipmentStatus->equipment_status_project == 2) { // Equipamento sera movido para $completedEquipments e removido de outros estados $completedEquipments->push($equipment); $executionEquipment = $executionEquipment->reject(function ($e) use ($equipment) { return $e->equipment_id == $equipment->equipment_id; }); $equipmentToReview = $equipmentToReview->reject(function ($e) use ($equipment) { return $e->equipment_id == $equipment->equipment_id; }); } elseif ($changeEquipmentStatus->equipment_status_project == 4) { //Equipamento sera movido para $equipmentToReview e removido de outros estados $equipmentToReview->push($equipment); $executionEquipment = $executionEquipment->reject(function ($e) use ($equipment) { return $e->equipment_id == $equipment->equipment_id; }); $completedEquipments = $completedEquipments->reject(function ($e) use ($equipment) { return $e->equipment_id == $equipment->equipment_id; }); } } } // Remover equipamentos já concluidos das coleções $receiveAllEquipmentOfProject = $receiveAllEquipmentOfProject->reject(function ($equipment) use ($completedEquipments, $equipmentToReview, $executionEquipment) { return $completedEquipments->contains($equipment) || $equipmentToReview->contains($equipment) || $executionEquipment->contains($equipment); }); $equipmentIds = array_keys($equipmentStatus); // Obtendo os registros QrcodesAssociatedEquipment para esses equipamentos $receiveQrcodeEquipmentsProject = QrcodesAssociatedEquipment::whereIn('equipment_id', $equipmentIds)->get(); // Extrai os IDs de equipamentos dos equipamentos completados $completedEquipmentIds = $completedEquipments->pluck('equipment_id')->toArray(); // Filtra a coleção $receiveQrcodeEquipmentsProject para excluir registros com equipment_id em $completedEquipmentIds $filteredQrcodeEquipments = $receiveQrcodeEquipmentsProject->reject(function ($qrcodeEquipment) use ($completedEquipmentIds) { return in_array($qrcodeEquipment->equipment_id, $completedEquipmentIds); }); // Se você desejar, pode reatribuir a coleção filtrada de volta à variável original $receiveQrcodeEquipmentsProject = $filteredQrcodeEquipments; $filteredQrcodeEquipments = $receiveQrcodeEquipmentsProject->filter(function ($qrcodeEquipment) use ($equipmentStatus) { // Exclui 'Flange' if (strpos($qrcodeEquipment->component_tag, '@Flange') !== false) { return false; } // Obtém o status do equipamento atual $equipmentId = $qrcodeEquipment->equipment_id; $status = $equipmentStatus[$equipmentId] ?? null; // Decide se 'Corpo' ou 'Obturador' deve ser excluído com base no status switch ($status) { case 1: // Exclui 'Corpo' se o status for 1 return strpos($qrcodeEquipment->component_tag, '@Corpo') === false; case 2: // Exclui 'Obturador' se o status for 2 return strpos($qrcodeEquipment->component_tag, '@Obturador') === false; case 0: // Mantém ambos se o status for 0 default: return true; } }); //Returning values of the queries to workstations layout $view->with([ 'receiveAllEquipmentOfProject' => $receiveAllEquipmentOfProject, // foi alterado para a variavel 'filteredQrcodeEquipments' pois nao tem a necessidade do utilizador selecionar 'Flange'(AINDA NAO !) 'receiveQrcodeEquipmentsProject' => $filteredQrcodeEquipments, 'executionEquipment' => $executionEquipment, 'completedEquipments' => $completedEquipments, 'equipmentToReview' => $equipmentToReview, 'receiveDataWs' => $receiveDataWs, ]); } }