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

508 lines
25 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\GeneralAttributesEquipment;
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 Illuminate\Support\Facades\DB;
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');
//Recebe os dados do Ambito
$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',
DB::raw("COALESCE((SELECT specific_attributes_value FROM specific_attributes_equipament_types WHERE specific_attributes_equipament_types.equipment_id = equipments.equipment_id AND general_attributes_equipment_id = 9), 'n/a') as dn"),
DB::raw("COALESCE((SELECT specific_attributes_value FROM specific_attributes_equipament_types WHERE specific_attributes_equipament_types.equipment_id = equipments.equipment_id AND general_attributes_equipment_id = 10), 'n/a') as dim"),
DB::raw("COALESCE((SELECT specific_attributes_value FROM specific_attributes_equipament_types WHERE specific_attributes_equipament_types.equipment_id = equipments.equipment_id AND general_attributes_equipment_id = 11), 'n/a') as pid"),
DB::raw("COALESCE((SELECT specific_attributes_value FROM specific_attributes_equipament_types WHERE specific_attributes_equipament_types.equipment_id = equipments.equipment_id AND general_attributes_equipment_id = 13), 'n/a') as isolation"),
DB::raw("COALESCE((SELECT specific_attributes_value FROM specific_attributes_equipament_types WHERE specific_attributes_equipament_types.equipment_id = equipments.equipment_id AND general_attributes_equipment_id = 15), 'n/a') as crane"),
DB::raw("COALESCE((SELECT specific_attributes_value FROM specific_attributes_equipament_types WHERE specific_attributes_equipament_types.equipment_id = equipments.equipment_id AND general_attributes_equipment_id = 23), 'n/a') as scaffold"),
])
->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.*',
DB::raw("COALESCE((SELECT specific_attributes_value FROM specific_attributes_equipament_types WHERE equipment_id = equipments.equipment_id AND general_attributes_equipment_id = 10), 'n/a') as dim"),
DB::raw("COALESCE((SELECT specific_attributes_value FROM specific_attributes_equipament_types WHERE equipment_id = equipments.equipment_id AND general_attributes_equipment_id = 9), 'n/a') as dn"),
DB::raw("COALESCE((SELECT specific_attributes_value FROM specific_attributes_equipament_types WHERE equipment_id = equipments.equipment_id AND general_attributes_equipment_id = 11), 'n/a') as pid"),
DB::raw("COALESCE((SELECT specific_attributes_value FROM specific_attributes_equipament_types WHERE equipment_id = equipments.equipment_id AND general_attributes_equipment_id = 23), 'n/a') as scaffold"),
DB::raw("COALESCE((SELECT specific_attributes_value FROM specific_attributes_equipament_types WHERE equipment_id = equipments.equipment_id AND general_attributes_equipment_id = 13), 'n/a') as isolation"),
DB::raw("COALESCE((SELECT specific_attributes_value FROM specific_attributes_equipament_types WHERE equipment_id = equipments.equipment_id AND general_attributes_equipment_id = 15), 'n/a') as crane"),
])
->get();
$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 getDataProjects(Request $request)
// {
// $receiveAllClients = $request->get('receiveAllClients');
// $receiveAllPlants = $request->get('receiveAllPlants');
// $projectOrder = $request->get('projectOrder');
// $query = CompanyProject::with(['plant.user']) // Garante que ambas as relações sejam carregadas
// ->where('order_project', $projectOrder)
// ->select(['company_projects.*']); // Seleciona todos os campos de CompanyProject, ajuste conforme necessário
// return DataTables::of($query)
// ->addColumn('plant_id', function ($item) {
// // Acessando plant_name diretamente através da relação 'plant'
// return $item->plant ? $item->plant->plant_name : 'N/A';
// })
// ->addColumn('client', function ($item) {
// // Acessando user_name através das relações encadeadas 'plant' seguido por 'user'
// return $item->plant && $item->plant->user ? $item->plant->user->user_name : 'N/A';
// })
// ->addColumn('action', function ($projectClient) {
// $actionBtn = '<a title="Detalhes da Obra" href="' . route('articulated_2', ['id' => $projectClient->company_projects_id]) . '"><i class="fa-solid fa-eye text-primary"></i></a>';
// return $actionBtn;
// })
// ->make(true);
// }
public function getDataProjects(Request $request)
{
$receiveAllClients = $request->get('receiveAllClients');
$receiveAllPlants = $request->get('receiveAllPlants');
$projectOrder = $request->get('projectOrder');
$query = CompanyProject::with(['plant.user']) // Carrega as relações plant e user
->where('order_project', $projectOrder)
->whereHas('plant', function ($query) use ($receiveAllPlants, $receiveAllClients) {
if ($receiveAllPlants !== '#') {
$query->where('plant_id', $receiveAllPlants);
}
if ($receiveAllClients !== '#') {
// Filtra por user_id dentro da relação plant->user
$query->whereHas('user', function ($query) use ($receiveAllClients) {
$query->where('user_id', $receiveAllClients);
});
}
})
->select(['company_projects.*']); // Ajuste conforme necessário para os campos específicos que deseja selecionar
return DataTables::of($query)
->addColumn('plant_id', function ($item) {
return $item->plant ? $item->plant->plant_name : 'N/A';
})
->addColumn('client', function ($item) {
return $item->plant && $item->plant->user ? $item->plant->user->user_name : 'N/A';
})
->addColumn('action', function ($projectClient) use ($projectOrder) {
$routeName = 'articulated_2';
if ($projectOrder == 2) {
$routeName = 'preparedProject';
} elseif ($projectOrder == 3) {
$routeName = 'ExecutionProject';
}
$actionBtn = '<a title="Detalhes da Obra" href="' . route($routeName, ['projectID' => $projectClient->company_projects_id]) . '"><i class="fa-solid fa-eye text-primary"></i></a>';
return $actionBtn;
})
->make(true);
// preparedProject
//ExecutionProject
}
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);
}
}