ispt4.0_laravel/app/Http/Controllers/ClientController.php

443 lines
21 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\AmbitsEquipment;
use App\Models\Equipment;
use App\Models\EquipmentAssociationAmbit;
use App\Models\EquipmentWorkHistory;
use App\Models\SpecificAttributesEquipmentType;
use App\Models\Unit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\CompanyProject;
use App\Models\EquipmentType;
use App\Models\Plant;
use Carbon\Carbon;
use Yajra\DataTables\Facades\DataTables;
use PDF;
class ClientController extends Controller
{
public function showReportingForAmbitsProject($ambitId, $projectId)
{
$dataAmbit = AmbitsEquipment::where('ambits_id', $ambitId)->first();
// $receiveDataEquipments = Equipment::where('company_projects_id', $projectId)->get();
return view('userClient.showReportingAllEquipmentsForAmbitProject', compact('ambitId', 'projectId', 'dataAmbit'));
}
public function getEquipmentsOfAmbit(Request $request)
{
$projectId = $request->get('projectId');
$ambitId = $request->get('ambitId');
// $dataAmbit = AmbitsEquipment::where('ambits_id', $ambitId)->first();
// $receiveDataEquipments = Equipment::where('company_projects_id', $projectId)->get();
// $filteredAssociations = EquipmentAssociationAmbit::where('ambits_id', $dataAmbit->ambits_id)
// ->whereIn('equipment_id', $receiveDataEquipments->pluck('equipment_id'))
// ->get();
// $query = Equipment::whereIn('equipment_id', $filteredAssociations->pluck('equipment_id'))->get();
$dataAmbit = AmbitsEquipment::where('ambits_id', $ambitId)->first();
$receiveDataEquipments = Equipment::where('equipments.company_projects_id', $projectId)
->join('equipment_work_historys', 'equipments.equipment_id', '=', 'equipment_work_historys.equipment_id')
->select('equipment_work_historys.equipmentWorkHistorys_id', 'equipment_work_historys.ispt_number') // Adicionei 'equipment_work_historys.ispt_number' aqui
->pluck('equipmentWorkHistorys_id');
$filteredAssociations = EquipmentAssociationAmbit::where('ambits_id', $dataAmbit->ambits_id)
->whereIn('equipmentWorkHistorys_id', $receiveDataEquipments)
->get();
$equipmentWorkHistoryIds = $filteredAssociations->pluck('equipmentWorkHistorys_id');
$query = EquipmentWorkHistory::whereIn('equipmentWorkHistorys_id', $equipmentWorkHistoryIds)
->join('equipments', 'equipment_work_historys.equipment_id', '=', 'equipments.equipment_id')
->select('equipments.*', 'equipment_work_historys.ispt_number as ispt_number') // Adicionei 'equipment_work_historys.ispt_number as ispt_number' aqui
->get();
return DataTables::of($query)
// Adicione aqui qualquer manipulação de dados ou colunas adicionais que você precise
->make(true);
}
public function showReportingForAmbitsProjectPdf($ambitId, $projectId)
{
// Obter o caminho da imagem do usuário ou uma imagem padrão
// Primeiro precisa identificar se quem esta a visualizar o relatorio e o Admin ou o Cliente
$userLogoPath = Auth::user()->user_logo ? public_path('user_logos/' . Auth::user()->user_logo) : public_path('user_logos/logoISPT4.0.jpg');
// Pega a data e hora atual
$dataAtual = Carbon::now();
// Se quiser formatar a data, pode fazer assim:
$dataFormatada = $dataAtual->format('Y-m-d H:i:s');
$dataAmbit = AmbitsEquipment::where('ambits_id', $ambitId)->first();
$receiveDataEquipments = Equipment::where('equipments.company_projects_id', $projectId) // Adicionado 'equipments.' para remover a ambiguidade
->join('equipment_work_historys', 'equipments.equipment_id', '=', 'equipment_work_historys.equipment_id')
->select('equipment_work_historys.equipmentWorkHistorys_id', 'equipments.*') // Pegando o ID da tabela equipment_work_historys e todos os campos da tabela equipments
->get();
$filteredAssociations = EquipmentAssociationAmbit::where('ambits_id', $dataAmbit->ambits_id)
->whereIn('equipmentWorkHistorys_id', $receiveDataEquipments->pluck('equipmentWorkHistorys_id')) // Usando equipmentWorkHistorys_id em vez de equipment_id
->get();
$equipmentWorkHistoryIds = $filteredAssociations->pluck('equipmentWorkHistorys_id');
// Agora, em vez de buscar diretamente em Equipment, vamos pegar os detalhes via EquipmentWorkHistory
$equipmentDetails = EquipmentWorkHistory::whereIn('equipmentWorkHistorys_id', $equipmentWorkHistoryIds)
->join('equipments', 'equipment_work_historys.equipment_id', '=', 'equipments.equipment_id')
->select('equipments.*', 'equipment_work_historys.*') // Seleciona todos os campos das tabelas equipments e equipment_work_historys
->get();
// $equipmentDetails = EquipmentWorkHistory::whereIn('equipmentWorkHistorys_id', $equipmentWorkHistoryIds)
// ->join('equipments', 'equipment_work_historys.equipment_id', '=', 'equipments.equipment_id')
// ->leftJoin('specific_attributes_equipment_types', 'equipments.equipment_id', '=', 'specific_attributes_equipment_types.equipment_id') // Fazendo a junção com a tabela 'specific_attributes_equipment_types'
// ->select(
// 'equipments.*',
// 'equipment_work_historys.*',
// 'specific_attributes_equipment_types.general_attributes_equipment_id',
// 'specific_attributes_equipment_types.specific_attributes_value'
// )
// ->get()
// // Junta os dados obtidos na tabela : specific_attributes_equipment_types, e como os dados na colecao de cada equipamento.
// ->transform(function ($item) {
// // Aqui você transforma cada item da coleção, adicionando o novo par de chave-valor
// $item->specific_attributes = [
// $item->general_attributes_equipment_id => $item->specific_attributes_value
// ];
// // Remove as colunas desnecessárias para evitar duplicação
// unset($item->general_attributes_equipment_id, $item->specific_attributes_value);
// return $item;
// });
$detalsProject = CompanyProject::where('company_projects_id', $projectId)->first();
$pdf = PDF::loadView('userClient.pdfReportings.equipmentsForAmbitPdf', [
'equipmentDetails' => $equipmentDetails,
'userLogoPath' => $userLogoPath,
'dataAmbit' => $dataAmbit,
'projectId' => $projectId,
'detalsProject' => $detalsProject,
'dataFormatada' => $dataFormatada
])->setPaper('a4', 'landscape');
return $pdf->stream('relatorio_teste.pdf');
// return view('userClient.pdfReportings.showReportingAllEquipmentsForAmbitProject', [
// 'userLogoPath' => $userLogoPath,
// 'dataAmbit' => $dataAmbit,
// 'projectId' => $projectId
// ]);
}
public function getDataAllEquipmentsForAmbitOfProject(Request $request)
{
$projectId = $request->get('projectId');
$dataAmbit = $request->get('dataAmbit');
// // Construa a consulta para buscar os equipamentos associados ao âmbito e projeto especificados
// $query = Equipment::whereHas('ambits', function ($q) use ($dataAmbit) {
// $q->where('id', $dataAmbit); // Aqui, 'id' deve ser o campo que identifica unicamente um âmbito na tabela de âmbitos
// })->whereHas('projects', function ($q) use ($projectId) {
// $q->where('id', $projectId); // Aqui, 'id' deve ser o campo que identifica unicamente um projeto na tabela de projetos
// });
// // Utilize o Yajra DataTables para formatar a resposta
// return DataTables::of($query)
// // Adicione aqui qualquer coluna ou manipulação de dados adicionais que você precise
// ->make(true);
// Primeiro, vamos filtrar os equipamentos que pertencem ao projeto especificado.
$equipmentsOfProject = Equipment::where('company_projects_id', $projectId)->pluck('equipment_id');
// Em seguida, vamos filtrar esses equipamentos para obter apenas aqueles associados ao âmbito especificado.
$equipmentsQuery = Equipment::whereIn('equipment_id', $equipmentsOfProject)
->whereHas('equipmentAssociationAmbit', function ($q) use ($dataAmbit) {
$q->where('ambits_id', $dataAmbit);
})
->select(['equipment_id', 'ispt_number', 'unit_id', 'equipment_tag']); // Selecionar apenas as colunas necessárias
// Utilize o Yajra DataTables para formatar a resposta
return DataTables::of($equipmentsQuery)
// Adicione aqui qualquer manipulação de dados ou colunas adicionais que você precise
->make(true);
}
public function getDataAmbitsOfProject(Request $request)
{
// Recebe o id do Projecto atual
$projectId = $request->get('projectId');
// Recebe os IDS passados de todos os âmbitos do projeto atual
$AmbitsIdString = $request->get('AmbitsIdString');
$AmbitsIdArray = explode(",", $AmbitsIdString); // Converter de string para Array
$query = AmbitsEquipment::whereIn('ambits_id', $AmbitsIdArray)
->select(['ambits_id', 'ambits_description']);
return Datatables::of($query)
->addColumn('amountEquipment', function ($ambitsEquipment) use ($projectId) {
// Contar quantos equipamentos estão associados a este âmbito para o projeto específico
return EquipmentAssociationAmbit::where('ambits_id', $ambitsEquipment->ambits_id)
// Primeiro, juntar-se com equipment_work_historys
->join('equipment_work_historys', 'equipment_association_ambits.equipmentWorkHistorys_id', '=', 'equipment_work_historys.equipmentWorkHistorys_id')
// Depois, juntar-se com equipments
->join('equipments', 'equipment_work_historys.equipment_id', '=', 'equipments.equipment_id')
// Agora, podemos filtrar pela company_projects_id
->where('equipments.company_projects_id', $projectId)
->count();
})
->addColumn('action', function ($dataAmbitProject) use ($projectId) {
$actionBtn = '<a title="Detalhes do equipamento" href="' . route('showReportingForAmbitsProject', ['ambitId' => $dataAmbitProject->ambits_id, 'projectId' => $projectId]) . '"><i class="fa-solid fa-eye text-primary"></i></a>';
return $actionBtn;
})
->make(true);
}
public function showReportingEquipmentProject($dataEquipment)
{
dd($dataEquipment);
// return view('showReportingEquipmentProject');
}
public function getDataEquipmentsOfProject(Request $request)
{
$projectId = $request->get('projectId');
$query = Equipment::join('equipment_work_historys', 'equipments.equipment_id', '=', 'equipment_work_historys.equipment_id')
// Juntar-se com equipment_association_ambits usando equipment_work_historys
->join('equipment_association_ambits', 'equipment_work_historys.equipmentWorkHistorys_id', '=', 'equipment_association_ambits.equipmentWorkHistorys_id')
// Juntar-se com ambits_equipments
->join('ambits_equipments', 'equipment_association_ambits.ambits_id', '=', 'ambits_equipments.ambits_id')
// Filtrar por company_projects_id
->where('equipments.company_projects_id', $projectId)
// Selecionar os campos desejados
->select([
'equipments.equipment_id',
'equipments.unit_id',
'equipments.equipment_tag',
'equipments.equipment_type_id',
'ambits_equipments.ambits_description as ambits_description'
]);
$dataEquipentProject = $query->get();
// // Retornar a resposta para o DataTables
// return Datatables::of($dataEquipentProject)
// // ->addColumn('action', function ($dataEquipment) {
// // $actionBtn = '<a title="Detalhes do equipamento" href="' . route('showReportingEquipmentProject', ['dataEquipment' => $dataEquipment->equipment_id]) . '"><i class="fa-solid fa-eye text-primary"></i></a>';
// // return $actionBtn;
// // })
// ->addColumn('action', function ($dataEquipment) {
// $actionBtn = '<a title="Detalhes do equipamento" href="' . route('showAmbitDetailsProjectHistory', ['projectID' => $projectId,'equipmentID' => $dataEquipment->equipment_id]) . '"><i class="fa-solid fa-eye text-primary"></i></a>';
// return $actionBtn;
// })
// ->make(true);
return Datatables::of($dataEquipentProject)
->addColumn('action', function ($dataEquipment) use ($projectId) { // Use a palavra-chave 'use' para passar $projectId
$actionBtn = '<a title="Detalhes do equipamento" href="' . route('showAmbitDetailsProjectHistory', ['projectID' => $projectId,'equipmentID' => $dataEquipment->equipment_id]) . '"><i class="fa-solid fa-eye text-primary"></i></a>';
return $actionBtn;
})
->make(true);
}
public function showDataDetailsProjectClient($projectID)
{
// Recebe os detalhes do Projecto.
$receiveDataProject = CompanyProject::where('company_projects_id', $projectID)->first();
// Recebe todas as Fabricas relacionadas a intalacao do Projecto recebido.
$receiveUnitsOfProject = Unit::where('plant_id', $receiveDataProject->plant_id)->get();
//Recebe todos os tipos de equipamentos
$receiveAllTypeEquipments = EquipmentType::all();
$receiveAllEquipmentsOfProject = EquipmentWorkHistory::where('company_projects_id', $projectID)->get();
// Obtendo todos os IDs de equipmentWorkHistorys
$equipmentWorkHistoryIds = $receiveAllEquipmentsOfProject->pluck('equipmentWorkHistorys_id');
// para a variavel obter o valor esperado precisamos separar os id como na varaivel acima, ele nao funciona diretamente com a variavel receiveAllEquipmentsOfProject, pois e uma colecao !!
$receiveEquipmentAssociatedAmbit = EquipmentAssociationAmbit::whereIn('equipmentWorkHistorys_id', $equipmentWorkHistoryIds)->get();
// Recebe os todos os ambitos do projecto
$AmbitsId = $receiveEquipmentAssociatedAmbit->pluck('ambits_id')->unique()->toArray();
// Vamos passar os ids dos Ambitos para a view, para envialos para a Tabela Yajra. e carregar com base nos Ambitos
$AmbitsIdString = implode(",", $AmbitsId);
// Recebe os dados de cada Ambito
$receiveDataAmbitsProject = AmbitsEquipment::whereIn('ambits_id', $AmbitsId)->get();
return view('userClient.showDataDetailsProjectClient', compact('receiveDataProject', 'receiveUnitsOfProject', 'receiveAllTypeEquipments', 'receiveDataAmbitsProject', 'AmbitsIdString'));
}
public function getDataProjectsClient(Request $request)
{
// Filtros ...
$allPlantsClient = $request->get('allPlantsClient');
$receiveAllPlants = $request->get('receiveAllPlants');
$receiveAllUnits = $request->get('receiveAllUnits');
$receiveEquipmentsType = $request->get('receiveEquipmentsType');
$clientID = $request->get('clientID');
//Criar Filtros para Atualizar os dados com base neles.
$allPlantsClient = Plant::where('user_id', $clientID)->pluck('plant_id')->toArray();
$query = CompanyProject::with('plant') // Assegure-se de que a relação está correta.
->whereIn('plant_id', $allPlantsClient)
->whereNotNull('end_date')
->select(['company_projects_id', 'plant_id', 'project_company_number', 'company_project_description', 'project_company_responsible', 'date_started', 'end_date']);
$dataProjectsClient = $query->get();
return Datatables::of($dataProjectsClient)
->addColumn('plant_name', function ($item) { // Ajuste na função anônima
return $item->plant ? $item->plant->plant_name : 'N/A'; // Acessando plant_name
})
->addColumn('action', function ($projectClient) {
$actionBtn = '<a title="Detalhes do equipamento" href="' . route('showDataDetailsProjectClient', ['projectID' => $projectClient->company_projects_id]) . '"><i class="fa-solid fa-eye text-primary"></i></a>';
return $actionBtn;
})
->make(true);
}
public function receiveProjectsClient()
{
$client = Auth::user()->user_id;
$recevePlantClient = Plant::where('user_id', $client)->get();
// Extrai os plant_id da coleção $recevePlantClient
$plantsIds = $recevePlantClient->pluck('plant_id');
// Busca todos os CompanyProject que têm um plant_id dentro da lista $plantIds
$allProjectsClient = CompanyProject::whereIn('plant_id', $plantsIds)->get();
return view('userClient.dashboardClient', compact('allProjectsClient'));
}
public function receiveManageAssetsClient()
{
$client = Auth::user()->user_id;
$allPlantsClient = Plant::where('user_id', $client)->get();
// Extrai os plant_id da coleção $recevePlantClient
$plantsIds = $allPlantsClient->pluck('plant_id');
// Busca todas as fabricas referente a plantas recebidas, guardamos o id de cada fabrica em $unitsIds
$allUnitsClient = Unit::whereIn('plant_id', $plantsIds)->get();
$unitsIds = $allUnitsClient->pluck('unit_id');
// Recebemos todos os equipamentos do cliente logado.
$allEquipmentsClient = Equipment::whereIn('unit_id', $unitsIds)->get();
// Recebe todos os tipos de equipamento
$allEquipmentType = EquipmentType::all();
return view('userClient.manageAssetsClient', compact('client', 'allPlantsClient', 'allUnitsClient', 'allEquipmentType', 'allEquipmentsClient'));
}
public function reportingDataClient($clientID = null)
{
// Se clientID não foi passado, usamos o ID do usuário autenticado
if (is_null($clientID)) {
$clientID = Auth::user()->user_id;
}
// Busca todas as Instalacoes com base no id do CLIENTE
$allPlantsClient = Plant::where('user_id', $clientID)->get();
// Extrai os plant_id da coleção $recevePlantClient
$plantsIds = $allPlantsClient->pluck('plant_id');
$allProjectsClient = CompanyProject::whereIn('plant_id', $plantsIds)->get();
// Obtém todos os anos distintos da coluna 'date_started'
$yearsProjects = CompanyProject::selectRaw('YEAR(date_started) as year')
->distinct()
->orderBy('year', 'desc')
->pluck('year');
return view('userClient.reportingDataClient', compact('clientID', 'allPlantsClient', 'yearsProjects'));
}
public function receiveMonths($yearsProjects)
{
// Obtenha todos os meses distintos da coluna 'date_started' para o ano especificado
$monthsData = CompanyProject::selectRaw('MONTH(date_started) as month')
->whereYear('date_started', $yearsProjects)
->distinct()
->orderBy('month', 'asc')
->get();
// Formatar os dados para enviar como JSON
$formattedData = $monthsData->map(function ($item) {
$monthName = date("F", mktime(0, 0, 0, $item->month, 1)); // Converta o número do mês para o nome do mês
return [
'id' => $item->month, // Você pode optar por enviar o número do mês
'name' => $monthName // ou o nome do mês, dependendo do que a sua aplicação necessita
];
});
// Retorna os dados em formato JSON
return response()->json($formattedData);
}
public function receiveDays($yearProjects, $monthsProjects)
{
// Obtenha todos os dias distintos para o mês e ano especificados
$daysData = CompanyProject::selectRaw('DAY(date_started) as day')
->whereYear('date_started', $yearProjects)
->whereMonth('date_started', $monthsProjects)
->distinct()
->orderBy('day', 'asc')
->get();
// Formatar os dados para enviar como JSON
$formattedData = $daysData->map(function ($item) {
return [
'id' => $item->day, // O número do dia
'name' => $item->day // O nome do dia, que neste caso é apenas o número
];
});
// Retorna os dados em formato JSON
return response()->json($formattedData);
}
}