293 lines
16 KiB
PHP
Executable File
293 lines
16 KiB
PHP
Executable File
<?php
|
|
|
|
namespace App\Http\ViewComposers;
|
|
|
|
use App\Models\ConstructionWorkstation;
|
|
use App\Models\ControlEquipmentWorkstation;
|
|
use App\Models\Equipment;
|
|
use App\Models\EquipmentWorkHistory;
|
|
use App\Models\OrderEquipmentTasks;
|
|
use App\Models\QrcodesAssociatedEquipment;
|
|
use App\Models\User;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
use Illuminate\View\View;
|
|
|
|
class WorkstationComposer
|
|
{
|
|
public function compose(View $view)
|
|
{
|
|
//Recebe os dados do Ws pela sessao atual.
|
|
$userEmail = Auth::user()->email;
|
|
$receiveDataEmail = User::where('email', $userEmail)->first();
|
|
$receiveDataWs = ConstructionWorkstation::where('name_workstations', $receiveDataEmail->user_name)->first();
|
|
|
|
// 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;
|
|
});
|
|
|
|
$equipmentToReview = collect(); // Coleção para armazenar equipamentos para revisão
|
|
|
|
$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
|
|
//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
|
|
|
|
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
|
|
|
|
|
|
// 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 == 2) {
|
|
// $completedEquipments->push($equipment);
|
|
// $changeEquipmentStatus->equipment_status_project = 1;
|
|
// $changeEquipmentStatus->save();
|
|
// } elseif ($changeEquipmentStatus->equipment_status_project == 4) {
|
|
// $equipmentToReview->push($equipment);
|
|
// }
|
|
// }
|
|
|
|
// 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) {
|
|
$completedEquipments->push($equipment);
|
|
} elseif ($changeEquipmentStatus->equipment_status_project == 4) {
|
|
$equipmentToReview->push($equipment);
|
|
}
|
|
}
|
|
|
|
|
|
// Remover equipamentos concluídos da coleção original
|
|
$receiveAllEquipmentOfProject = $receiveAllEquipmentOfProject->reject(function ($equipment) use ($completedEquipments) {
|
|
return $completedEquipments->contains($equipment);
|
|
});
|
|
|
|
|
|
// Remover equipamentos a serem revisados da coleção original
|
|
$receiveAllEquipmentOfProject = $receiveAllEquipmentOfProject->reject(function ($equipment) use ($equipmentToReview) {
|
|
return $equipmentToReview->contains($equipment);
|
|
});
|
|
|
|
// if ($allTasksCompleted) {
|
|
// $completedEquipments->push($equipment);
|
|
|
|
// //Se o equipamento for verificado como concluido, altera o seu status na Obra, para o mesmo ser indicado como um equipamento pendente a aplovacao de Admin.
|
|
// $changeEquipmentStatus = EquipmentWorkHistory::where('equipmentWorkHistorys_id',$equipment->equipmentWorkHistoryId)->first();
|
|
// $changeEquipmentStatus->equipment_status_project = 1;
|
|
// $changeEquipmentStatus->save();
|
|
// }
|
|
}
|
|
|
|
// 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();
|
|
|
|
// 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,
|
|
'completedEquipments' => $completedEquipments,
|
|
'equipmentToReview' => $equipmentToReview,
|
|
'receiveDataWs' => $receiveDataWs,
|
|
]);
|
|
|
|
}
|
|
}
|