email; $receiveDataEmail = User::where('email', $userEmail)->first(); $receiveDataWs = ConstructionWorkstation::where('name_workstations', $receiveDataEmail->user_name)->first(); // Busca todos os equipamentos associados a um determinado projeto. // $receiveAllEquipmentOfProject = Equipment::where('company_projects_id', $receiveDataWs->company_projects_id) // ->whereDoesntHave('equipmentWorkHistory.controlEquipmentWorkstation', function ($query) use ($excludedEquipmentsQuery) { // //Quarto filtro : Com base na variavel $excludedEquipmentsQuery que serve para excluir equipamentos PSV, quando tem o @Corpo e @Obturador sendo feito em simultanio. // $query->whereIn('equipmentWorkHistorys_id', $excludedEquipmentsQuery); // // 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); // }); // // Terceiro filtro: Equipamentos com todas as colunas sao prenchidas como deve ser, signifca que e uma tarefa concluida(finalizada) e agora vai criar um novo dado na controlEquipmentWorkstation para a proxima tarefa. // $query->orWhereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { // $subQuery->whereNotNull('id_workstations') // ->where(function ($innerQuery) { // $innerQuery->whereNotNull('elemental_tasks_id') // ->whereNotNull('departure_date') // ->where('status', 1); // }); // }); // }) // // Adiciona condição para PSV (equipment_type_id = 3) // ->orWhere(function ($query) use ($receiveDataWs) { // // 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'); // }); // }); // }) // ->with([ // 'equipmentWorkHistory' => function ($query) use ($receiveDataWs) { // $query->where('company_projects_id', $receiveDataWs->company_projects_id) // ->select('equipment_id', 'equipmentWorkHistorys_id'); // } // ]) // ->get() // ->map(function ($equipment) { // if (!$equipment->equipmentWorkHistory->isEmpty()) { // $equipmentWorkHistory = $equipment->equipmentWorkHistory->first(); // $equipment->equipmentWorkHistoryId = $equipmentWorkHistory->equipmentWorkHistorys_id; // } else { // $equipment->equipmentWorkHistoryId = null; // } // return $equipment; // }); // 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 // 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 // if ($taskIds->isEmpty()) { // continue; // Se não houver tarefas, continua para o próximo equipamento // } // //ESTE Code ve quantas vezes ja foi realizada cada tarefa do equipamento atual, saber o code a baixo ver se falta muito ou ja esta quase a acaber // $workstationTaskCounts = ControlEquipmentWorkstation::whereIn('elemental_tasks_id', $taskIds) // ->select('elemental_tasks_id', DB::raw('count(*) as total')) // ->groupBy('elemental_tasks_id') // ->pluck('total', 'elemental_tasks_id'); // Contagem de tarefas nas estações de trabalho // // Verificar se todas as tarefas foram concluídas pelo menos uma vez // $allTasksCompleted = $taskIds->every(function ($taskId) use ($workstationTaskCounts) { // return isset ($workstationTaskCounts[$taskId]) && $workstationTaskCounts[$taskId] >= 1; // }); // if ($allTasksCompleted && $workstationTaskCounts->count() >= $taskIds->count()) { // $completedEquipments->push($equipment); // Adicionar equipamento à lista de concluídos // } // } // // Remover equipamentos concluídos da coleção original // $receiveAllEquipmentOfProject = $receiveAllEquipmentOfProject->reject(function ($equipment) use ($completedEquipments) { // return $completedEquipments->contains($equipment); // }); // $equipmentIds = $receiveAllEquipmentOfProject->pluck('equipment_id'); // $receiveQrcodeEquipmentsProject = QrcodesAssociatedEquipment::whereIn('equipment_id', $equipmentIds)->get(); // //VAMOS filtrar os valores recebidos e terar todas as correspondencias de Flange, ja nao e uma tag que nao vai entrar no percurso do Equipamento. // $filteredQrcodeEquipments = $receiveQrcodeEquipmentsProject->reject(function ($item) { // return strpos($item->component_tag, '@Flange') !== false; // }); // Este código identifica equipmentWorkHistorys_id que estão simultaneamente envolvidos em duas tarefas // (uma identificada por elemental_tasks_id = 9 e elemental_tasks_id = NULL), quando o departure_date é null) ou seja, ainda em progresso... // Agrupando-os por equipmentWorkHistorys_id e filtrando para garantir que existam exatamente dois tipos distintos de tarefas elementais para cada equipamento. $excludedEquipmentsQuery = ControlEquipmentWorkstation::select('equipmentWorkHistorys_id') ->whereNull('departure_date') ->where(function ($query) { $query->where('elemental_tasks_id', 9) ->orWhereNull('elemental_tasks_id'); }) ->groupBy('equipmentWorkHistorys_id') ->havingRaw('COUNT(DISTINCT elemental_tasks_id) = 2'); // Este código filtra equipamentos de um projeto específico, excluindo aqueles já entrados no (excludedEquipmentsQuery), $receiveAllEquipmentOfProject = Equipment::where('company_projects_id', $receiveDataWs->company_projects_id) ->whereDoesntHave('equipmentWorkHistory.controlEquipmentWorkstation', function ($query) use ($excludedEquipmentsQuery) { $query->whereIn('equipmentWorkHistorys_id', $excludedEquipmentsQuery); }) // Condicao 1 : Se todos esses campos foram confirmados como NULL e status = 0, signifca que e um control_equipment_workstation_id de um equipamento que foi limpo pelos metodos de fechar atividade do equipamento na Ws de forma nao convencional. pelo script do servidor ->orWhereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { $subQuery->whereNull('id_workstations') ->whereNull('elemental_tasks_id') ->whereNull('entry_date') ->where('status', 0); }) // Condicao 2 : Se os dados encontrados do equipamento tiverem com o departure_date principalmente diferente de NUll, signica que o ultima dado deste equipamento fez e concluiu uma de suas tarefas e agora precisa criar um dado novo. ->orWhereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { $subQuery->whereNotNull('id_workstations') ->where(function ($innerQuery) { $innerQuery->whereNotNull('elemental_tasks_id') ->whereNotNull('departure_date') ->where('status',1); // ->orWhere('elemental_tasks_id', 9); }); }) ->with([ 'equipmentWorkHistory' => function ($query) use ($receiveDataWs) { $query->where('company_projects_id', $receiveDataWs->company_projects_id) ->select('equipment_id', 'equipmentWorkHistorys_id'); } ]) ->get() ->map(function ($equipment) { $equipmentWorkHistory = $equipment->equipmentWorkHistory->first() ?? null; $equipment->equipmentWorkHistoryId = $equipmentWorkHistory?->equipmentWorkHistorys_id; return $equipment; }); $completedEquipments = collect(); // Coleção para armazenar equipamentos concluídos // 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 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 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(); if ($controlRecords->isEmpty()) { // Se não houver registros, considera como valor 0 (nenhuma tarefa ativa) $equipmentStatus[$equipment->equipment_id] = 0; } else { //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) { // Se tiver tarefa ativa para Obturador, valor = 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; } } } $workstationTaskCounts = ControlEquipmentWorkstation::whereIn('elemental_tasks_id', $taskIds) ->select('elemental_tasks_id', DB::raw('count(*) as total')) ->groupBy('elemental_tasks_id') ->pluck('total', 'elemental_tasks_id'); // Contagem de tarefas nas estações de trabalho // Verificar se todas as tarefas foram concluídas pelo menos uma vez $allTasksCompleted = $taskIds->every(function ($taskId) use ($workstationTaskCounts) { return isset ($workstationTaskCounts[$taskId]) && $workstationTaskCounts[$taskId] >= 1; }); if ($allTasksCompleted && $workstationTaskCounts->count() >= $taskIds->count()) { $completedEquipments->push($equipment); // Adicionar equipamento à lista de concluídos } } // Remover equipamentos concluídos da coleção original $receiveAllEquipmentOfProject = $receiveAllEquipmentOfProject->reject(function ($equipment) use ($completedEquipments) { return $completedEquipments->contains($equipment); }); $equipmentIds = array_keys($equipmentStatus); // Obtendo os registros QrcodesAssociatedEquipment para esses equipamentos $receiveQrcodeEquipmentsProject = QrcodesAssociatedEquipment::whereIn('equipment_id', $equipmentIds) ->get(); $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, 'completedEquipments' => $completedEquipments, 'receiveDataWs' => $receiveDataWs, ]); } }