diff --git a/app/Http/Controllers/CreateProjectController copy.php b/app/Http/Controllers/CreateProjectController copy.php index 625beaa8..0f9e1384 100755 --- a/app/Http/Controllers/CreateProjectController copy.php +++ b/app/Http/Controllers/CreateProjectController copy.php @@ -464,7 +464,7 @@ public function EditEquipmentsProjects(Request $request) } // Retorna uma resposta - return redirect()->route('articulated_2', ['id' => $request->numberProject]) + return redirect()->route('articulated_2', ['projectID' => $request->numberProject]) ->with('success', 'Equipamento ' . $equipment->equipment_tag . ' Editado com Sucesso!!!') ->with('taskExecutionOrders', $taskExecutionOrders); } @@ -755,7 +755,7 @@ public function createEquipmentManual(Request $request) ]); if ($existingEquipment) { - return redirect()->route('articulated_2', ['id' => $request->numberProject]) + return redirect()->route('articulated_2', ['projectID' => $request->numberProject]) ->with('danger', 'Equipamento ja Existe !!') ->with('listEquipmentsProjects', $listEquipmentsProjects); } @@ -854,7 +854,7 @@ public function createEquipmentManual(Request $request) } // O $request->numberProject e sempre necessario retornar para indicar a obra que se esta modificando... - return redirect()->route('articulated_2', ['id' => $request->numberProject]) + return redirect()->route('articulated_2', ['projectID' => $request->numberProject]) ->with('success', 'Equipamento criado com sucesso') ->with('listEquipmentsProjects', $listEquipmentsProjects); } @@ -1055,12 +1055,12 @@ public function processStep2(Request $request) // $pendingEquipments = session('pendingEquipments'); if ($countPendingEquipments != 0) { // return redirect()->route('articulated_2')->with('Danger', 'Equipamentos Pendentes')->with('listValves', $listValves)->with('pendingEquipments', $pendingEquipments); - return redirect()->route('articulated_2', ['id' => $request->numberProject]) + return redirect()->route('articulated_2', ['projectID' => $request->numberProject]) ->with('danger', 'Equipamentos Pendentes criados : ' . $countPendingEquipments) ->with('pendingEquipments', $pendingEquipments); // ->with('success', 'Equipamentos Criados :' . count($listValves)) } - return redirect()->route('articulated_2', ['id' => $request->numberProject]) + return redirect()->route('articulated_2', ['projectID' => $request->numberProject]) ->with('success', 'Equipamentos Criados :' . $countNewEquipment); } diff --git a/app/Http/Controllers/CreateProjectController.php b/app/Http/Controllers/CreateProjectController.php index 3b0bbcbe..66acecdc 100755 --- a/app/Http/Controllers/CreateProjectController.php +++ b/app/Http/Controllers/CreateProjectController.php @@ -5,6 +5,7 @@ use App\Models\AssociationCompanyUser; use App\Models\Company; use App\Models\EquipmentWorkHistory; +use App\Models\ProjectExcelLog; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use PhpOffice\PhpSpreadsheet\IOFactory; @@ -36,7 +37,7 @@ // use DataTables; - +public function EditprocessStep1(Request $request) class CreateProjectController extends Controller { public function changeStateProject($projectId) @@ -948,6 +949,15 @@ public function showStep2($company_projects_id) $pendingEquipments = PendingEquipment::where('pending_company_projects_id', $numberProject)->get(); + // $receiveAllLogsProject = ProjectExcelLog::where('company_projects_id', $company_projects_id)->get(); + + $receiveAllLogsProject = ProjectExcelLog::where('company_projects_id', $company_projects_id) + ->get() + ->groupBy('excel_name') + ->map(function ($group) { + return $group->sortByDesc('project_excel_logs_id')->first(); + }); + if (!$pendingEquipments->isEmpty()) { // Retornamos para a view 'step' => 2 indicando conclusao da primeira parte, $numberProject para associacao de equipamentos a esta obra, alem de todos os equipamentos e fabricao ja existente com base na Instalação que se iniciou a obra. return view('projectsClients/articulated_2', ['step' => 2, 'numberProject' => $numberProject]) @@ -958,7 +968,8 @@ public function showStep2($company_projects_id) ->with('checkEquipments', $checkEquipments) ->with('checkUnits', $checkUnits) ->with('receiveNumberProject', $project) - ->with('groupedArrayForPendingEquipments', $groupedArrayForPendingEquipments); + ->with('groupedArrayForPendingEquipments', $groupedArrayForPendingEquipments) + ->with('receiveAllLogsProject', $receiveAllLogsProject); } return view('projectsClients/articulated_2', ['step' => 2, 'numberProject' => $numberProject]) ->with('listEquipmentsProjects', $listEquipmentsProjects) @@ -1119,16 +1130,20 @@ public function processStep2(Request $request) { // Valide e processe os dados do formulário $file = $request->file('documento'); + // Criar o array para adicionar o HashMap + $uniqueRowsHashmap = []; // Recebe a id do Projecto criado $company_projects_id = $request->numberProject; + // Recebe mais detalhes da Obra Atual. + $detailsCompanyProject = CompanyProject::where('company_projects_id', $company_projects_id)->first(); // Inicializa o contador para ispt_number $isptNumber = 1; - // Recebe o valor do campo 'chooseIfSelectOrCreateEquipments' do formulário - $chooseAction = $request->input('chooseIfSelectOrCreateEquipments'); - // Certifique-se de que um arquivo foi enviado + // Confirma que o arquivo foi enviado,ou seja sua existencia. + // Antes de verificar o documento excel, deve ter uma forma de confirmar o mesmo como arquivo legitivo para criar dados de acordo com o nosso template. if ($file) { + //Busca o nome do arquivo xslx. $originalFileName = $file->getClientOriginalName(); // Carregue o arquivo Excel @@ -1146,28 +1161,56 @@ public function processStep2(Request $request) // Recebo os nomes das colunas do execel dependendo da linguagem selecionada $columnRealNames = $data[5]; + // Inicialização do hashmap para rastrear as linhas únicas + $uniqueRowsHashmap = []; $equipmentPendingLogs = []; - $ignoredLines = []; + // $ignoredLines = []; + // $duplicateLines = []; - // Comece a partir da sexta linha do template os dados dos Equipamentos - for ($i = 6; $i < count($data); $i++) { - $dataLines = $data[$i]; + // Separa o nome do arquivo para obter o tipo de documento e a data-hora + $parts = explode('_', $originalFileName); + $documentType = $parts[2]; // 98 + $timestamp = $parts[3]; // 2024-01-14_14-33 - // Verifica se a coluna 'fábrica' (primeiro campo) está vazia - if (empty($dataLines[0])) { - // Se a coluna 'fábrica' estiver vazia, pule para a próxima linha - continue; - } - $emptyFields = []; + function normalize($value) + { + // Remove espaços em branco no início e no fim da string + $trimmed = trim($value); + // Remove espaços em branco no meio da string + $noInnerSpaces = str_replace(' ', '', $trimmed); + // Converte a string para minúsculas + $lowercase = strtolower($noInnerSpaces); + return $lowercase; + } + + // Busca o ID de todas as unidades referentes à Instalação da Obra e coloca em um array + $allUnitsOnThePlantOfProject = Unit::where('plant_id', $detailsCompanyProject->plant_id) + ->pluck('unit_id') + ->toArray(); + + // Busca os equipamentos com base nos IDs das unidades encontradas + $equipments = Equipment::select('equipment_id', 'unit_id', 'equipment_tag') // Substitua 'equipment_id', 'equipment_tag' pelos nomes corretos das colunas, se necessário + ->whereIn('unit_id', $allUnitsOnThePlantOfProject) + ->get()->keyBy(function ($item) { + return normalize($item->unit->unit_name) . '-' . normalize($item->equipment_tag); // Cria uma chave única com 'unit_id-tag' para fácil comparação + }); + + // Verifica se já existem registros com o mesmo 'equipment_id' e 'company_projects_id' + $existingRecords = EquipmentWorkHistory::where('company_projects_id', $company_projects_id) + ->orderBy('ispt_number', 'desc') // Ordena de forma decrescente + ->first(); // Pega o primeiro resultado, que seria o maior número + + if ($existingRecords) { + // Se existirem registros, o próximo número será o maior número existente + 1 + $isptNumber = $existingRecords->ispt_number + 1; + } else { + // Se não existirem registros, começa com 1 + $isptNumber = 1; + } + + foreach ($data as $i => $dataLines) { - // Verifica se os 5 primeiros campos essenciais estão preenchidos - for ($j = 0; $j < 5; $j++) { - if (empty($dataLines[$j])) { - // Adiciona o índice do campo vazio ao array $camposVazios - $emptyFields[] = $columnRealNames[$j]; // ou simplesmente $j se não tiver o nome da coluna - } - } @@ -1179,75 +1222,135 @@ public function processStep2(Request $request) return !empty ($chave); }, ARRAY_FILTER_USE_KEY); + // Verifica se a coluna 'fábrica' (primeiro campo) está vazia + if (empty($dataLines[0])) { + // Se a coluna 'fábrica' estiver vazia, pule para a próxima linha + + continue; + } + + // Recebe os detalhes da Unit recebida nesta linha do excel. + // Deve verificar a Plant tambem, pois pode ter outra plante com esse mesmo nome de fabrica. + //Nunca vai ser null ou diferente pois tem um code acima que se essa coluna for null faz um continue na linha atual XD + $detailsUnit = Unit::where('unit_name', $datas['unit']) + ->where('plant_id', $detailsCompanyProject->plant_id) + ->first(); + //Indentifica qual o tipo de equipamento selecionado de acordo com a tabela EquipmentType $equipmentType = EquipmentType::where('equipment_type_name', $datas['equipment_type_name'])->first(); - $checkFactory = Unit::where('unit_name', $datas['unit'])->first(); + //-------- Linhas Ignoradas + // Começa a contagem das linhas do excel a partir de 7 linha + if ($i < 6) { + continue; + } + // Contador para campos não vazios + $nonEmptyFieldsCount = 0; + // Array para rastrear campos não preenchidos + $missingFields = []; - // Antes de criar o novo equipamento, verifique se já existe um equipamento - // com o mesmo factory_id e tag. - $existingEquipment = Equipment::where('unit_id', $checkFactory->unit_id) - ->where('equipment_tag', $datas['equipment_tag']) - ->first(); + // Verifica se os 5 primeiros campos estão preenchidos e conta os não vazios + for ($j = 0; $j < 5; $j++) { + if (!empty($dataLines[$j])) { + $nonEmptyFieldsCount++; + } else { + $missingFields[] = $columnRealNames[$j]; // Assume-se que $columnRealNames mapeia corretamente para os nomes dos campos + } + } - //Nesta para vamos separar como tratar os equipamentos que existem, dependendo do tipo de select que o utilizador utilizou + // Registra a linha como ignorada se menos de 2 campos estiverem preenchidos ou se houver campos não preenchidos + if ($nonEmptyFieldsCount > 2 && $nonEmptyFieldsCount < 5) { + $equipmentPendingLogs[] = [ + 'typePendingLog' => 0 , + 'line' => $i + 1, + 'reason' => implode(', ', $missingFields), // Converte o array de campos faltantes para uma string + ]; + continue; // Pula para a próxima linha + } - if ($chooseAction == 'selectEquipments') { - if ($existingEquipment) { + //-------- Linhas Repetidas no Execel + $normalizedField1 = normalize($dataLines[0]); + $normalizedField2 = normalize($dataLines[1]); + $key = $normalizedField1 . '-' . $normalizedField2; - $foundInExcel = false; - $rowExcelDuplicated = null; + // Verifica duplicatas no Excel + if (!array_key_exists($key, $uniqueRowsHashmap)) { + $uniqueRowsHashmap[$key] = $i; + } else { + $duplicateLines[] = $i; // Linha duplicada no Excel + $equipmentPendingLogs[] = [ + 'typePendingLog' => 1, + 'duplicate_line' => $i + 1, + 'original_line' => $uniqueRowsHashmap[$key] + 1, + 'reason' => 'Duplicata no Excel referente aos campos: ' . $columnRealNames[0] . ' e ' . $columnRealNames[1] . '.' + ]; - // Verificar duplicatas no Excel - for ($j = 6; $j < $i; $j++) { - if ($data[$j][0] === $datas['unit'] && $data[$j][1] === $datas['equipment_tag'] && $data[$j][4] === $datas['equipment_description']) { - $foundInExcel = true; - $rowExcelDuplicated = $j; - break; - } - } + $pendingEquipament = new PendingEquipment; - // Associar o equipamento encontrado ao projeto - $existingEquipment->company_projects_id = $company_projects_id; - $existingEquipment->save(); + // Defina os atributos do pendingEquipament conforme necessário. + $pendingEquipament->pending_equipment_unit_id = $detailsUnit->unit_id; + $pendingEquipament->pending_equipment_type_id = $equipmentType->equipment_type_id; + $pendingEquipament->pending_equipment_tag = $datas['equipment_tag']; + $pendingEquipament->pending_equipment_description = $datas['equipment_description']; + $pendingEquipament->pending_equipment_serial_number = $datas['serial_number']; + $pendingEquipament->pending_equipment_brand = $datas['model']; + $pendingEquipament->pending_company_projects_id = $company_projects_id; + $pendingEquipament->save(); + // Incremente o contador de PendingEquipments + $countPendingEquipments++; + + continue; // Pula a próxima verificação para duplicatas identificadas no Excel + } + + + //--------- Linhas associada a equipamentos da base de dados. + // Verifica duplicatas na base de dados + if (isset($equipments[$key])) { + $duplicateLines[] = $i; // Linha duplicada na base de dados + $equipmentPendingLogs[] = [ + 'typePendingLog' => 2, + 'line' => $i + 1, + 'equipment_id' => $equipments[$key]->equipment_id, // Adiciona o ID do equipamento + 'equipment_tag' => $equipments[$key]->equipment_tag, // Adiciona a tag do equipamento + 'reason' => '' // Adiciona uma razão vazia por padrão que será atualizada mais tarde + ]; + + // Busca o equipamento para ver se já está associado a algum projeto + $findEquipment = Equipment::find($equipments[$key]->equipment_id); + + if ($findEquipment->company_projects_id != null && $findEquipment->company_projects_id == $company_projects_id) { + $equipmentPendingLogs[count($equipmentPendingLogs) - 1]['reason'] = 'Equipamento já associado a esta obra'; + $equipmentPendingLogs[count($equipmentPendingLogs) - 1]['typePendingLog'] = 2.1; + + } elseif ($findEquipment->company_projects_id != null && $findEquipment->company_projects_id != $company_projects_id) { + $findOtherCompanyProject = CompanyProject::find($findEquipment->company_projects_id); + $equipmentPendingLogs[count($equipmentPendingLogs) - 1]['reason'] = 'Equipamento associado a outra Obra: ' . $findOtherCompanyProject->company_project_description; + $equipmentPendingLogs[count($equipmentPendingLogs) - 1]['typePendingLog'] = 2.2; + + } else { + //equipamentos novos nao entram na equipmentPendingLogs, criar um proprio apenas para teste. + $equipmentPendingLogs[count($equipmentPendingLogs) - 1]['reason'] = 'Equipamento associado a obra com sucesso!'; + $equipmentPendingLogs[count($equipmentPendingLogs) - 1]['typePendingLog'] = 2.3; + + // Associar o equipamento à Obra atual + $findEquipment->company_projects_id = $company_projects_id; + $findEquipment->save(); + + //Apenas para indicar qtd de equipamentos criados $countEquipment++; - // Guardo os valores de 'id' e do 'tipo de equipamento' que nosso novo equipamento acabado de criar - $receveEquipment_ID = $existingEquipment->equipment_id; - $receveEquipament_type_ID = $existingEquipment->equipment_type_id; - - - - // Verifica se já existem registros com o mesmo 'equipment_id' e 'company_projects_id' - $existingRecords = EquipmentWorkHistory::where('company_projects_id', $company_projects_id) - ->orderBy('ispt_number', 'desc') // Ordena de forma decrescente - ->first(); // Pega o primeiro resultado, que seria o maior número - - - if ($existingRecords) { - // Se existirem registros, o próximo número será o maior número existente + 1 - $isptNumber = $existingRecords->ispt_number + 1; - } else { - // Se não existirem registros, começa com 1 - $isptNumber = 1; - } - + // Criar um equipment_work_historys $newEquipmentWorkHistory = new EquipmentWorkHistory; + $newEquipmentWorkHistory->equipment_id = $findEquipment->equipment_id; - $newEquipmentWorkHistory->equipment_id = $receveEquipment_ID; + $newEquipmentWorkHistory->ispt_number = $isptNumber++; $newEquipmentWorkHistory->company_projects_id = $company_projects_id; - // Continua com o processo de salvar o novo registro - $newEquipmentWorkHistory->ispt_number = $isptNumber; - $newEquipmentWorkHistory->save(); - // Recebe o Id do 'EquipmentWorkHistory' criado. - $recebeNewEquipmentWorkHistoryID = $newEquipmentWorkHistory->equipmentWorkHistorys_id; - - $isptNumber++; + //Adicionar Ambito e Tarefas para fazer. $ambit = AmbitsEquipment::where('ambits_description', $datas['ambit'])->first(); if ($ambit) { @@ -1256,7 +1359,7 @@ public function processStep2(Request $request) //Criar associacao do equipamento ao Âmbito $AssociationEquipmentAmbit = new EquipmentAssociationAmbit; - $AssociationEquipmentAmbit->equipment_type_id = $existingEquipment->equipment_type_id; + $AssociationEquipmentAmbit->equipment_type_id = $findEquipment->equipment_type_id; $AssociationEquipmentAmbit->ambits_id = $ambit_id; $AssociationEquipmentAmbit->equipmentWorkHistorys_id = $newEquipmentWorkHistory->equipmentWorkHistorys_id; @@ -1264,94 +1367,27 @@ public function processStep2(Request $request) //Recebe a tabela com as associoacoes entre Âmbitos e tarefas Elementares $TasksAssociationAmbits = TasksAssociationAmbits::all()->where('ambits_equipment_id', $AssociationEquipmentAmbit->ambits_id); - $execution_order = 1; foreach ($TasksAssociationAmbits as $TasksAssociationAmbit) { $JoinsEquipmentsWithTasks = new OrderEquipmentTasks; + $newEquipmentWorkHistory->ispt_number = $isptNumber++; $JoinsEquipmentsWithTasks->equipmentWorkHistorys_id = $newEquipmentWorkHistory->equipmentWorkHistorys_id; - $JoinsEquipmentsWithTasks->execution_order = $execution_order++; $JoinsEquipmentsWithTasks->elemental_tasks_id = $TasksAssociationAmbit->elemental_tasks_id; $JoinsEquipmentsWithTasks->further_tasks_id = null; $JoinsEquipmentsWithTasks->save(); } - // Separa o nome do arquivo para obter o tipo de documento e a data-hora - $parts = explode('_', $originalFileName); - $documentType = $parts[2]; // 98 - $timestamp = $parts[3]; // 2024-01-14_14-33 - - // Cria um array agrupado - $groupedArrayForPendingEquipments = [$documentType, [$timestamp, $equipmentPendingLogs]]; } - //Se nao existir deve retornar 'equipamentos nao encontrados, deve ser a mesma coisa que as linha ignoradas - $ignoredLines[] = [ - 'line' => $i + 1, - 'emptyFields' => ['Nenhum equipamento foi localizado que cumpra os requisitos especificados nesta linha.'] - ]; - continue; // Pula para a próxima linha + continue; // Pula para a próxima iteração + //----- Para equipamento novos, nao pendentes. --------- + // Caso a linha nao se enquadre em nenhuma das verificacoes anteriores, ele sera considerado um equipamento novo. + } else { - } elseif ($chooseAction == 'createEquipments') { - - if (!empty($emptyFields)) { - // Se houver campos vazios, adicione a linha e os campos vazios às linhas ignoradas - $ignoredLines[] = [ - 'line' => $i + 1, - 'emptyFields' => $emptyFields - ]; - continue; // Pula para a próxima linha - } - - if ($existingEquipment) { - - $foundInExcel = false; - $rowExcelDuplicated = null; - - // Verificar duplicatas no Excel - for ($j = 6; $j < $i; $j++) { - if ($data[$j][0] === $datas['unit'] && $data[$j][1] === $datas['equipment_tag'] && $data[$j][4] === $datas['equipment_description']) { - $foundInExcel = true; - $rowExcelDuplicated = $j; - break; - } - } - - // Se o equipamento existir, crie o novo equipamento na tabela pending_equipaments. - $pendingEquipament = new PendingEquipment; - - // Defina os atributos do pendingEquipament conforme necessário. - $pendingEquipament->pending_equipment_unit_id = $checkFactory->unit_id; - $pendingEquipament->pending_equipment_type_id = $equipmentType->equipment_type_id; - $pendingEquipament->pending_equipment_tag = $datas['equipment_tag']; - $pendingEquipament->pending_equipment_description = $datas['equipment_description']; - $pendingEquipament->pending_equipment_serial_number = $datas['serial_number']; - $pendingEquipament->pending_equipment_brand = $datas['model']; - $pendingEquipament->pending_company_projects_id = $company_projects_id; - $pendingEquipament->save(); - - // Incremente o contador de PendingEquipments - $countPendingEquipments++; - - // A variavel $pendenteLogs, na 'linhaExcel' vai recebe a linha do execel onde encontrou a duplicata em Array, vinda do primeiro $data, onde transforma toda o execel em array - // 'existingEquipmentId' vai ver qual o id do equipament que esta sendo duplicado. - //'duplicadoNoExcel' vai ser um boolean indicando que este valor duplicado veio da base de dados ou se foi de uma coluna anterior. - // linhaExcelDuplicada se o valor de duplicadoNoExcel for 'true' quer dizer que existe uma linha anterior com o mesmos dados, e essa variavel busco a o numero do array desta linha com base na variavel primeiro $data - $equipmentPendingLogs[] = [ - 'rowExecel' => $i + 1, - 'pendingEquipmentId' => $pendingEquipament->pending_equipment_id, - 'existingEquipmentId' => $existingEquipment->equipment_id, - 'foundInExcel' => $foundInExcel, - 'rowExcelDuplicated' => $rowExcelDuplicated - ]; - - // Continue com o próximo loop. - continue; - } - + //Novo equipamento $newEquipament = new Equipment; - - $newEquipament->unit_id = $checkFactory->unit_id; + $newEquipament->unit_id = $detailsUnit->unit_id; $newEquipament->equipment_type_id = $equipmentType->equipment_type_id; $newEquipament->equipment_Description = $datas['equipment_description']; $newEquipament->equipment_tag = $datas['equipment_tag']; @@ -1359,43 +1395,19 @@ public function processStep2(Request $request) $newEquipament->equipment_brand = $datas['brand']; $newEquipament->equipment_model = $datas['model']; $newEquipament->company_projects_id = $company_projects_id; - $newEquipament->save(); $countEquipment++; - // Guardo os valores de 'id' e do 'tipo de equipamento' que nosso novo equipamento acabado de criar - $receveEquipment_ID = $newEquipament->equipment_id; - $receveEquipament_type_ID = $newEquipament->equipment_type_id; - - - // Verifica se já existem registros com o mesmo 'equipment_id' e 'company_projects_id' - $existingRecords = EquipmentWorkHistory::where('company_projects_id', $company_projects_id) - ->orderBy('ispt_number', 'desc') // Ordena de forma decrescente - ->first(); // Pega o primeiro resultado, que seria o maior número - - - if ($existingRecords) { - // Se existirem registros, o próximo número será o maior número existente + 1 - $isptNumber = $existingRecords->ispt_number + 1; - } else { - // Se não existirem registros, começa com 1 - $isptNumber = 1; - } + //Deve adicionar tambem os outros atributos espesificos para o equipameto. + //Criar o equipment Work History $newEquipmentWorkHistory = new EquipmentWorkHistory; - - $newEquipmentWorkHistory->equipment_id = $receveEquipment_ID; - $newEquipmentWorkHistory->ispt_number = $isptNumber; + $newEquipmentWorkHistory->equipment_id = $newEquipament->equipment_id; + $newEquipmentWorkHistory->ispt_number = $isptNumber++; $newEquipmentWorkHistory->company_projects_id = $company_projects_id; - $newEquipmentWorkHistory->save(); - // Recebe o Id do 'EquipmentWorkHistory' criado. - $recebeNewEquipmentWorkHistoryID = $newEquipmentWorkHistory->equipmentWorkHistorys_id; - - $isptNumber++; - $ambit = AmbitsEquipment::where('ambits_description', $datas['ambit'])->first(); if ($ambit) { @@ -1412,51 +1424,79 @@ public function processStep2(Request $request) //Recebe a tabela com as associoacoes entre Âmbitos e tarefas Elementares $TasksAssociationAmbits = TasksAssociationAmbits::all()->where('ambits_equipment_id', $AssociationEquipmentAmbit->ambits_id); + $execution_order = 1; foreach ($TasksAssociationAmbits as $TasksAssociationAmbit) { $JoinsEquipmentsWithTasks = new OrderEquipmentTasks; + $JoinsEquipmentsWithTasks->execution_order = $execution_order++; $JoinsEquipmentsWithTasks->equipmentWorkHistorys_id = $newEquipmentWorkHistory->equipmentWorkHistorys_id; $JoinsEquipmentsWithTasks->elemental_tasks_id = $TasksAssociationAmbit->elemental_tasks_id; $JoinsEquipmentsWithTasks->further_tasks_id = null; $JoinsEquipmentsWithTasks->save(); } - // Separa o nome do arquivo para obter o tipo de documento e a data-hora - $parts = explode('_', $originalFileName); - $documentType = $parts[2]; // 98 - $timestamp = $parts[3]; // 2024-01-14_14-33 - // Cria um array agrupado $groupedArrayForPendingEquipments = [$documentType, [$timestamp, $equipmentPendingLogs]]; // Armazenar $groupedArrayForPendingEquipments na sessão + //------- Porem agora nao deve ser guardado em uma sessao em sim em uma tabela da Db ate terminar(concluir) a Obra session(['groupedArrayForPendingEquipments' => $groupedArrayForPendingEquipments]); - $pendingEquipments = PendingEquipment::where('pending_company_projects_id', $request->numberProject)->get(); + // $pendingEquipments = PendingEquipment::where('pending_company_projects_id', $request->numberProject)->get(); + $equipmentPendingLogs[] = [ + 'typePendingLog' => 3, + 'line' => $i + 1, + 'reason' => 'Equipamento Novo' // Adiciona uma razão vazia por padrão que será atualizada mais tarde + ]; + continue; } + + // Se a linha não for duplicada nem no Excel nem na base de dados, + // a linha é considerada para a criação de um novo equipamento. + // Sua lógica para criar um novo equipamento pode ser inserida aqui. + } - if ($countPendingEquipments != 0 && !empty($equipmentPendingLogs)) { - // Se houver equipamentos pendentes, redirecione com essa informação e inclua os $linhasIgnoradas se não estiverem vazios - return redirect()->route('articulated_2', ['id' => $request->numberProject]) - ->with('danger', 'Equipamentos Pendentes criados: ' . $countPendingEquipments) - ->with('dangerLogs', $ignoredLines) - ->with('equipmentPendingLogs', $equipmentPendingLogs); - // ->with('pendingEquipments', $pendingEquipments); - } else { - // Se não houver equipamentos pendentes, redirecione com uma mensagem de sucesso e inclua os $linhasIgnoradas se não estiverem vazios - return redirect()->route('articulated_2', ['id' => $request->numberProject]) - ->with('success', 'Equipamentos Criados: ' . $countEquipment) - ->with('dangerLogs', $ignoredLines); - } - // return redirect()->route('articulated_2', ['id' => $request->numberProject]) + $countEquipment; //Qtd de equipamentos novos criados + $countPendingEquipments; // Qtd de equipamentos pendentes criados + + + $createProjectLogs = new ProjectExcelLog; + $createProjectLogs->company_projects_id = $detailsCompanyProject->company_projects_id; + $createProjectLogs->excel_name = $originalFileName; + $createProjectLogs->excel_logs = $equipmentPendingLogs; + + $createProjectLogs->save(); + + + return redirect()->route('articulated_2', ['projectID' => $request->numberProject]) + ->with('success', 'Equipamentos criados com sucesso !'); + + + // if ($countPendingEquipments != 0 && !empty($equipmentPendingLogs)) { + // // Se houver equipamentos pendentes, redirecione com essa informação e inclua os $linhasIgnoradas se não estiverem vazios + // return redirect()->route('articulated_2', ['projectID' => $request->numberProject]) + // ->with('danger', 'Equipamentos Pendentes criados: ' . $countPendingEquipments) + // ->with('dangerLogs', $ignoredLines) + // ->with('equipmentPendingLogs', $equipmentPendingLogs); + // // ->with('pendingEquipments', $pendingEquipments); + // } else { + // // Se não houver equipamentos pendentes, redirecione com uma mensagem de sucesso e inclua os $linhasIgnoradas se não estiverem vazios + // return redirect()->route('articulated_2', ['projectID' => $request->numberProject]) + // ->with('success', 'Equipamentos Criados: ' . $countEquipment) + // ->with('dangerLogs', $ignoredLines); + // } + // return redirect()->route('articulated_2', ['projectID' => $request->numberProject]) // ->with('success', 'Equipamentos Adicionados a Obra com sucesso: ' . $countEquipment); + } else { + return redirect()->route('articulated_2', ['projectID' => $request->numberProject]) + ->with('danger', 'Arquivo ignorado , por nao ser compativel com a template 4.0'); + // Nenhum arquivo enviado para verificacao do excel. } - //Nao chega aqui ainda pois volta para a pagina com dados ja carregados. + // //Nao chega aqui ainda pois volta para a pagina com dados ja carregados. + // session(['form_data.step2' => $request->all()]); - session(['form_data.step2' => $request->all()]); - - // Redirecione o Utilizador para a próxima etapa - return redirect('/workStation_3'); + // // Redirecione o Utilizador para a próxima etapa + // return redirect('/workStation_3'); } public function showStep3($company_projects_id) diff --git a/app/Http/Controllers/ProjectoDatacontroller.php b/app/Http/Controllers/ProjectoDatacontroller.php index 6999f6ce..861d2324 100755 --- a/app/Http/Controllers/ProjectoDatacontroller.php +++ b/app/Http/Controllers/ProjectoDatacontroller.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use App\Models\AmbitsEquipment; +use App\Models\Company; use App\Models\ControlEquipmentWorkstation; use App\Models\ElementalTasks; use App\Models\EquipmentAssociationAmbit; @@ -294,18 +295,20 @@ public function showAmbitDetailsProjectHistory($projectID, $equipmentID) public function showAllClientsForProjectReportsTable() { // Buscamos todos os clientes com type_users = 3 - $allClientsQuery = User::where('type_users', 3); + // $allClientsQuery = User::where('type_users', 3); + + $allClientsQuery = Company::all(); // Retornamos o objeto DataTables return DataTables::of($allClientsQuery) - ->addColumn('client', function ($client) { + ->addColumn('company', function ($client) { // Aqui você pode retornar o ID do cliente ou algum outro identificador - return $client->user_name; + return $client->company_name; }) ->addColumn('amount_of_projects_completed', function ($client) { // Para cada cliente, obtemos os plant_ids associados - $plantIds = Plant::where('user_id', $client->user_id)->pluck('plant_id'); + $plantIds = Plant::where('company_id', $client->company_id)->pluck('plant_id'); // Contamos os CompanyProjects associados com datas de início e fim não nulas $projectCount = CompanyProject::whereIn('plant_id', $plantIds) @@ -318,7 +321,7 @@ public function showAllClientsForProjectReportsTable() }) ->addColumn('action', function ($client) { // Geramos o botão de ação - $actionBtn = ''; + $actionBtn = ''; return $actionBtn; }) ->rawColumns(['action']) // Isso permite que o HTML seja renderizado @@ -345,6 +348,7 @@ public function testRelatorio() public function receiveUnitsManageAssets($receivePlantClientRelated) { + $UnitsData = Unit::where('plant_id', $receivePlantClientRelated)->get(); @@ -609,8 +613,8 @@ public function ManageAssets() $units = DB::table('plants') ->join('units', 'plants.plant_id', '=', 'units.plant_id') - ->join('users', 'plants.user_id', '=', 'users.user_id') - ->select('plants.*', 'units.unit_name', 'users.user_name as user_name') + ->join('companies', 'plants.company_id', '=', 'companies.company_id') + ->select('plants.*', 'units.unit_name', 'companies.company_name as company_name') ->get(); $equipments = Equipment::all(); @@ -623,7 +627,7 @@ public function ManageAssets() $allEquipmentType = EquipmentType::all(); - $allClients = User::where('type_users', 3)->get(); + $allClients = Company::all(); return view('Admin/DataManagement/manageassets', compact('units', 'equipments', 'allEquipmentType', 'allClients')); } diff --git a/app/Http/Middleware/CheckUserType.php b/app/Http/Middleware/CheckUserType.php index 32cf4ea9..698513c6 100755 --- a/app/Http/Middleware/CheckUserType.php +++ b/app/Http/Middleware/CheckUserType.php @@ -56,7 +56,7 @@ protected function getAllowedRoutesForUserType($userType) case 5: // Técnico return ['enterWorkstation', 'getEquipmentData', 'receiveAnswersEquipment']; case 3: // Empresa - return ['dashboardClient','reportingDataClient', 'manageAssetsClient', + return ['dashboardClient','reportingDataClient', 'manageAssetsClient','usersProfiles', // Obras em Execussao 'ExecutionProject', //Relatorios diff --git a/app/Models/Equipment.php b/app/Models/Equipment.php index 1117ef67..360531c2 100755 --- a/app/Models/Equipment.php +++ b/app/Models/Equipment.php @@ -20,6 +20,7 @@ class Equipment extends Model protected $primaryKey = 'equipment_id'; + public function unit() { return $this->belongsTo(Unit::class, 'unit_id', 'unit_id'); diff --git a/app/Models/ProjectExcelLog.php b/app/Models/ProjectExcelLog.php new file mode 100644 index 00000000..019c6b11 --- /dev/null +++ b/app/Models/ProjectExcelLog.php @@ -0,0 +1,20 @@ + 'array' + ]; +} diff --git a/resources/views/Admin/CrudCompanies/showCompanyDetails.blade.php b/resources/views/Admin/CrudCompanies/showCompanyDetails.blade.php index b09127fc..b21f7a76 100644 --- a/resources/views/Admin/CrudCompanies/showCompanyDetails.blade.php +++ b/resources/views/Admin/CrudCompanies/showCompanyDetails.blade.php @@ -30,6 +30,15 @@