update
|
|
@ -301,7 +301,6 @@ public function showAmbitDetailsProjectHistory($equipmentStatus, $projectID, $eq
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Cria uma coleção para armazenar todas as tarefas, concluídas e não concluídas
|
// Cria uma coleção para armazenar todas as tarefas, concluídas e não concluídas
|
||||||
$receiveAllTasksHistiory = collect();
|
$receiveAllTasksHistiory = collect();
|
||||||
|
|
||||||
|
|
@ -339,7 +338,6 @@ public function showAmbitDetailsProjectHistory($equipmentStatus, $projectID, $eq
|
||||||
$taskHistory->image_paths = [];
|
$taskHistory->image_paths = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!is_null($taskHistory->entry_date) && !is_null($taskHistory->departure_date)) {
|
if (!is_null($taskHistory->entry_date) && !is_null($taskHistory->departure_date)) {
|
||||||
// Converte para instâncias de Carbon
|
// Converte para instâncias de Carbon
|
||||||
$entryDate = \Carbon\Carbon::parse($taskHistory->entry_date);
|
$entryDate = \Carbon\Carbon::parse($taskHistory->entry_date);
|
||||||
|
|
@ -372,8 +370,6 @@ public function showAmbitDetailsProjectHistory($equipmentStatus, $projectID, $eq
|
||||||
$receiveAllTasksHistiory->push($taskHistory);
|
$receiveAllTasksHistiory->push($taskHistory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Agrupa e ordena as tarefas concluídas por elemental_tasks_id e departure_date
|
// Agrupa e ordena as tarefas concluídas por elemental_tasks_id e departure_date
|
||||||
$receiveAllTasksHistiory = $receiveAllTasksHistiory->groupBy(function ($item) {
|
$receiveAllTasksHistiory = $receiveAllTasksHistiory->groupBy(function ($item) {
|
||||||
return $item->elemental_tasks_id;
|
return $item->elemental_tasks_id;
|
||||||
|
|
@ -391,13 +387,6 @@ public function showAmbitDetailsProjectHistory($equipmentStatus, $projectID, $eq
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
|
|
||||||
// ->map(function ($group) {
|
|
||||||
// return [
|
|
||||||
// 'latest' => $group->sortByDesc('departure_date')->first(),
|
|
||||||
// 'history' => $group->sortByDesc('departure_date')->slice(1)->values()
|
|
||||||
// ];
|
|
||||||
// });
|
|
||||||
|
|
||||||
// Adiciona as tarefas não concluídas à coleção principal
|
// Adiciona as tarefas não concluídas à coleção principal
|
||||||
$incompleteTasks = $equipmentTasksIds->diff($completedTasksHistory->pluck('elemental_tasks_id'));
|
$incompleteTasks = $equipmentTasksIds->diff($completedTasksHistory->pluck('elemental_tasks_id'));
|
||||||
|
|
||||||
|
|
@ -415,6 +404,8 @@ public function showAmbitDetailsProjectHistory($equipmentStatus, $projectID, $eq
|
||||||
'formatted_answers' => [],
|
'formatted_answers' => [],
|
||||||
'entry_date' => 'N/A',
|
'entry_date' => 'N/A',
|
||||||
'runtime' => 'N/A',
|
'runtime' => 'N/A',
|
||||||
|
'statusHistory' => 'N/A',
|
||||||
|
'typeStatusHistory' => 'N/A',
|
||||||
'elementalTask' => (object) [
|
'elementalTask' => (object) [
|
||||||
'elemental_tasks_code' => $elementalTask ? $elementalTask->elemental_tasks_code : null,
|
'elemental_tasks_code' => $elementalTask ? $elementalTask->elemental_tasks_code : null,
|
||||||
'elemental_tasks_description' => $elementalTask ? $elementalTask->elemental_tasks_description : null
|
'elemental_tasks_description' => $elementalTask ? $elementalTask->elemental_tasks_description : null
|
||||||
|
|
@ -424,7 +415,7 @@ public function showAmbitDetailsProjectHistory($equipmentStatus, $projectID, $eq
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// dd($receiveAllTasksHistiory);
|
// dd($receiveAllTasksHistiory);
|
||||||
|
|
||||||
//recebe normalmente, porem os checkbox nao conseguem buscar valor, execepto o ultimo dado.
|
//recebe normalmente, porem os checkbox nao conseguem buscar valor, execepto o ultimo dado.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,6 @@ public function showPercentageEquipments()
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public function refreshDataEquipments($datasProject)
|
public function refreshDataEquipments($datasProject)
|
||||||
{
|
{
|
||||||
// Inicializa a zero o contador para toda a vez que atualizar.
|
// Inicializa a zero o contador para toda a vez que atualizar.
|
||||||
|
|
@ -95,7 +94,7 @@ public function refreshDataEquipments($datasProject)
|
||||||
$this->equivalentInProgress = 0;
|
$this->equivalentInProgress = 0;
|
||||||
$this->equivalentUnstarted = 0;
|
$this->equivalentUnstarted = 0;
|
||||||
|
|
||||||
//recebe o total de equipamentos da Obra.
|
// Recebe o total de equipamentos da Obra.
|
||||||
$totalEquipments = EquipmentWorkHistory::where('company_projects_id', $datasProject->company_projects_id)->get();
|
$totalEquipments = EquipmentWorkHistory::where('company_projects_id', $datasProject->company_projects_id)->get();
|
||||||
|
|
||||||
// Busca o valor total de todos os equipamentos encontrados
|
// Busca o valor total de todos os equipamentos encontrados
|
||||||
|
|
@ -104,54 +103,56 @@ public function refreshDataEquipments($datasProject)
|
||||||
$equipmentCounts = [];
|
$equipmentCounts = [];
|
||||||
|
|
||||||
foreach ($totalEquipments as $equipment) {
|
foreach ($totalEquipments as $equipment) {
|
||||||
|
// Conta quantas vezes o equipamento aparece em OrderEquipmentTasks
|
||||||
// Conta quantas vezes o equipamento aparece em OrderEquipmentTasks - para saber o numero de tarefas que cada equipamento tem. (verificar se nao seria melhor colocar em um array)
|
|
||||||
$tasksCount = OrderEquipmentTasks::where('equipmentWorkHistorys_id', $equipment->equipmentWorkHistorys_id)->count();
|
$tasksCount = OrderEquipmentTasks::where('equipmentWorkHistorys_id', $equipment->equipmentWorkHistorys_id)->count();
|
||||||
|
|
||||||
|
|
||||||
// ira receber varios dados para o array sendo array[key:equipment_id,valor:quantidade de vezes que o equipment_id se repete na tabela 'OrderEquipmentTasks']
|
|
||||||
$equipmentCounts[$equipment->equipment_id] = $tasksCount;
|
$equipmentCounts[$equipment->equipment_id] = $tasksCount;
|
||||||
|
|
||||||
// Verifica primiero se tem pelos menos o mesmo numeros de tarefas feitas em relacao a tarefas por fazer(apenas este metodo nao garante , pois nao distingue historico de tarefa distinta)
|
// Verifica se o equipamento está concluído
|
||||||
// Apenas apos a 2 verificacao quando equipment_status_project = 3 significa que foi apravado e concluido.
|
if (
|
||||||
if (ControlEquipmentWorkstation::where('equipmentWorkHistorys_id', $equipment->equipmentWorkHistorys_id)
|
ControlEquipmentWorkstation::where('equipmentWorkHistorys_id', $equipment->equipmentWorkHistorys_id)
|
||||||
// apos receber ambos os numeros se as colunas 'entry_date' e 'departure_date' forem diferente de Null significa que o equipamento foi concluido
|
|
||||||
|
|
||||||
->whereNotNull('id_workstations')
|
->whereNotNull('id_workstations')
|
||||||
->whereNotNull('entry_date')
|
->whereNotNull('entry_date')
|
||||||
->whereNotNull('departure_date')
|
->whereNotNull('departure_date')
|
||||||
->count() >= $tasksCount
|
->count() >= $tasksCount
|
||||||
&& EquipmentWorkHistory::where('equipmentWorkHistorys_id',$equipment->equipmentWorkHistorys_id)
|
&& EquipmentWorkHistory::where('equipmentWorkHistorys_id', $equipment->equipmentWorkHistorys_id)
|
||||||
->where('equipment_status_project',3)
|
->where('equipment_status_project', 2)
|
||||||
) {
|
->exists()
|
||||||
|
) {
|
||||||
// se o equipamento foi considerado concluido, conta +1 para o completed e o equivalentCompleted busca no array equipmentCounts, quando a key for igual ao equipment_id atual e conta com + os valores da key encontrada
|
|
||||||
$this->completed++;
|
$this->completed++;
|
||||||
|
|
||||||
$this->completed1[] = $equipment->equipment_id; // Adiciona o equipment_id ao array
|
|
||||||
|
|
||||||
$this->equivalentCompleted += $equipmentCounts[$equipment->equipment_id];
|
$this->equivalentCompleted += $equipmentCounts[$equipment->equipment_id];
|
||||||
|
|
||||||
}
|
}
|
||||||
//Verica e devolve a quantidade de equipamentos para aprovar.
|
// Verifica se o equipamento está para aprovar
|
||||||
//Ao tentar descomentar os graficos de queijo somem.
|
elseif (
|
||||||
// elseif (EquipmentWorkHistory::where('equipmentWorkHistorys_id',$equipment->equipmentWorkHistorys_id)->where('equipment_status_project',2)){
|
EquipmentWorkHistory::where('equipmentWorkHistorys_id', $equipment->equipmentWorkHistorys_id)
|
||||||
// $this->toApprove++;
|
->where('equipment_status_project', 1)
|
||||||
// }
|
->exists()
|
||||||
|
) {
|
||||||
elseif (ControlEquipmentWorkstation::where('equipmentWorkHistorys_id', $equipment->equipmentWorkHistorys_id)->exists()) {
|
$this->toApprove++;
|
||||||
|
}
|
||||||
|
// Verifica se o equipamento está em progresso
|
||||||
|
elseif (
|
||||||
|
ControlEquipmentWorkstation::where('equipmentWorkHistorys_id', $equipment->equipmentWorkHistorys_id)
|
||||||
|
->exists()
|
||||||
|
) {
|
||||||
$this->inProgress++;
|
$this->inProgress++;
|
||||||
$this->equivalentInProgress += $equipmentCounts[$equipment->equipment_id];
|
$this->equivalentInProgress += $equipmentCounts[$equipment->equipment_id];
|
||||||
} else {
|
}
|
||||||
|
// Verifica se o equipamento está por iniciar
|
||||||
|
elseif (
|
||||||
|
EquipmentWorkHistory::where('equipmentWorkHistorys_id', $equipment->equipmentWorkHistorys_id)
|
||||||
|
->where('equipment_status_project', 0)
|
||||||
|
->exists()
|
||||||
|
&& !ControlEquipmentWorkstation::where('equipmentWorkHistorys_id', $equipment->equipmentWorkHistorys_id)
|
||||||
|
->exists()
|
||||||
|
) {
|
||||||
$this->unstarted++;
|
$this->unstarted++;
|
||||||
$this->equivalentUnstarted += $equipmentCounts[$equipment->equipment_id];
|
$this->equivalentUnstarted += $equipmentCounts[$equipment->equipment_id];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Busca o valor total de todas as ocorrências criadas na variavel equipmentCounts
|
// Busca o valor total de todas as ocorrências criadas na variável equipmentCounts
|
||||||
$this->totalEquivalentEquipment = array_sum($equipmentCounts);
|
$this->totalEquivalentEquipment = array_sum($equipmentCounts);
|
||||||
|
|
||||||
$this->completed1 = collect($this->completed1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
152
app/Livewire/Execução/TasksDashboard copy.php
Executable file
|
|
@ -0,0 +1,152 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Livewire\Execução;
|
||||||
|
|
||||||
|
use App\Models\EquipmentWorkHistory;
|
||||||
|
use App\Models\OrderEquipmentTasks;
|
||||||
|
use App\Models\ControlEquipmentWorkstation;
|
||||||
|
use App\Models\ElementalTasks;
|
||||||
|
|
||||||
|
use Livewire\Component;
|
||||||
|
|
||||||
|
|
||||||
|
class TasksDashboard extends Component
|
||||||
|
{
|
||||||
|
public $datasProject;
|
||||||
|
// protected $receiveTasksRepository;
|
||||||
|
|
||||||
|
public $receiveElementalTasks; // Recebe todas as acoes ja feitas atualmente por tarefa
|
||||||
|
public $receiveElementalTasksAll; // Recebe o total de tarefas que vamos fazer
|
||||||
|
public $countElementalTasksAll;
|
||||||
|
public $lastUpdated;
|
||||||
|
|
||||||
|
// Por enquanto nao ira usar, vamos deixar
|
||||||
|
// public $receiveAllFurtherTasks;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Deveria funcionar para receber o Repositorio.
|
||||||
|
// public function initialize()
|
||||||
|
// {
|
||||||
|
// // Injetar o repositório
|
||||||
|
// $this->receiveTasksRepository = app(ReceiveTasksRepository::class);
|
||||||
|
|
||||||
|
// // Agora você pode usar o repositório
|
||||||
|
// $this->receiveElementalTasks = $this->receiveTasksRepository->getElementalTasks();
|
||||||
|
// $this->receiveAllFurtherTasks = $this->receiveTasksRepository->getFurtherTasks();
|
||||||
|
// }
|
||||||
|
|
||||||
|
public function updateTimeGrafics()
|
||||||
|
{
|
||||||
|
// Data atual
|
||||||
|
$this->lastUpdated = now()->format('Y-m-d H:i');
|
||||||
|
|
||||||
|
// Chame o método para atualizar os dados dos gráficos
|
||||||
|
$this->refreshDataEquipments($this->datasProject);
|
||||||
|
|
||||||
|
// Disparar um evento com os dados atualizados
|
||||||
|
$this->dispatch('refreshData', [
|
||||||
|
'receiveElementalTasks' => $this->receiveElementalTasks,
|
||||||
|
'receiveElementalTasksAll' => $this->receiveElementalTasksAll,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Graficos de porcentagem entre o valor atual de finalizadas com valor final de quantas faltam
|
||||||
|
public function showPercentageElementalTasks()
|
||||||
|
{
|
||||||
|
// Disparar um evento com os dados atualizados
|
||||||
|
$this->dispatch('refreshPercentageElementalTasks', [
|
||||||
|
'receiveElementalTasks' => $this->receiveElementalTasks,
|
||||||
|
'receiveElementalTasksAll' => $this->receiveElementalTasksAll,
|
||||||
|
'countElementalTasksAll' => $this->countElementalTasksAll
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function mount($datasProject)
|
||||||
|
{
|
||||||
|
$this->datasProject = $datasProject;
|
||||||
|
|
||||||
|
// Obter todos os equipamentos relacionados ao projeto
|
||||||
|
$receiveEquipmentsProject = EquipmentWorkHistory::where('company_projects_id', $datasProject->company_projects_id)->get();
|
||||||
|
|
||||||
|
$elementalTasks = collect();
|
||||||
|
// $furtherTasks = collect();
|
||||||
|
|
||||||
|
// Total de tarefas na Obra.
|
||||||
|
$elementalTasksCountsAll = [];
|
||||||
|
|
||||||
|
foreach ($receiveEquipmentsProject as $equipment) {
|
||||||
|
// Obter todas as OrderEquipmentTasks relacionadas a este equipamento
|
||||||
|
$relatedTasks = OrderEquipmentTasks::where('equipmentWorkHistorys_id', $equipment->equipmentWorkHistorys_id)->get();
|
||||||
|
|
||||||
|
// Filtrar e armazenar os IDs únicos de elemental_tasks_id e further_tasks_id
|
||||||
|
$elementalTasks = $elementalTasks->merge($relatedTasks->whereNotNull('elemental_tasks_id')->pluck('elemental_tasks_id'))->unique();
|
||||||
|
|
||||||
|
// $furtherTasks = $furtherTasks->merge($relatedTasks->whereNotNull('further_tasks_id')->pluck('further_tasks_id'))->unique();
|
||||||
|
// Agrupar as tasks relacionadas por elemental_tasks_id e contar o número de ocorrências
|
||||||
|
$groupedTasks = $relatedTasks->whereNotNull('elemental_tasks_id')->groupBy('elemental_tasks_id');
|
||||||
|
|
||||||
|
foreach ($groupedTasks as $taskId => $tasksGroup) {
|
||||||
|
if (isset($elementalTasksCountsAll[$taskId])) {
|
||||||
|
$elementalTasksCountsAll[$taskId] += count($tasksGroup);
|
||||||
|
} else {
|
||||||
|
$elementalTasksCountsAll[$taskId] = count($tasksGroup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Neste ponto parece esta correto a quantidade de tarefas, pois nenhuma tarefa passa do maximo de equipamentos.
|
||||||
|
$this->receiveElementalTasksAll = $elementalTasksCountsAll;
|
||||||
|
|
||||||
|
// Contar o número de ocorrências de cada ID na tabela ControlEquipmentWorkstation
|
||||||
|
// $furtherTasksCount1 = ControlEquipmentWorkstation::whereIn('further_tasks_id', $furtherTasks)->get()->countBy('further_tasks_id');
|
||||||
|
|
||||||
|
// Filtrar as associações de tarefas por equipmentWorkHistorys_id que são do projeto específico
|
||||||
|
$tasksCount = ControlEquipmentWorkstation::whereIn('elemental_tasks_id', $elementalTasks)
|
||||||
|
->whereIn('equipmentWorkHistorys_id', $receiveEquipmentsProject->pluck('equipmentWorkHistorys_id')) // Garante que estamos contando apenas para o projeto específico
|
||||||
|
->get(['equipmentWorkHistorys_id', 'elemental_tasks_id'])
|
||||||
|
->groupBy('elemental_tasks_id')
|
||||||
|
->map(function ($group) {
|
||||||
|
return $group->unique('equipmentWorkHistorys_id')->count();
|
||||||
|
});
|
||||||
|
|
||||||
|
$newArray = [];
|
||||||
|
|
||||||
|
foreach ($tasksCount as $taskId => $count) {
|
||||||
|
$task = ElementalTasks::find($taskId);
|
||||||
|
if ($task) {
|
||||||
|
$newArray[$task->elemental_tasks_code] = $count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->receiveElementalTasks = $newArray;
|
||||||
|
|
||||||
|
$newArray1 = [];
|
||||||
|
|
||||||
|
foreach ($this->receiveElementalTasksAll as $taskId1 => $count) {
|
||||||
|
$task1 = ElementalTasks::find($taskId1);
|
||||||
|
if ($task1) {
|
||||||
|
$newArray1[$task1->elemental_tasks_code] = $count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Agora, $newArray contém a contagem de tasks por elemental_tasks_code
|
||||||
|
$this->receiveElementalTasksAll = $newArray1;
|
||||||
|
|
||||||
|
|
||||||
|
// Criar o contador para receber o valor total.
|
||||||
|
$this->countElementalTasksAll = array_sum($this->receiveElementalTasksAll);
|
||||||
|
|
||||||
|
|
||||||
|
$this->lastUpdated = now()->format('Y-m-d H:i');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function refreshDataEquipments($datasProject)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return view('livewire.execução.tasks-dashboard');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,92 +2,61 @@
|
||||||
|
|
||||||
namespace App\Livewire\Execução;
|
namespace App\Livewire\Execução;
|
||||||
|
|
||||||
use App\Models\Equipment;
|
|
||||||
use App\Models\EquipmentWorkHistory;
|
use App\Models\EquipmentWorkHistory;
|
||||||
use App\Models\OrderEquipmentTasks;
|
use App\Models\OrderEquipmentTasks;
|
||||||
use App\Models\ControlEquipmentWorkstation;
|
use App\Models\ControlEquipmentWorkstation;
|
||||||
use App\Models\ElementalTasks;
|
use App\Models\ElementalTasks;
|
||||||
|
|
||||||
use Livewire\Component;
|
use Livewire\Component;
|
||||||
|
|
||||||
use App\Repositories\ReceiveTasksRepository;
|
|
||||||
|
|
||||||
class TasksDashboard extends Component
|
class TasksDashboard extends Component
|
||||||
{
|
{
|
||||||
public $datasProject;
|
public $receiveElementalTasks;
|
||||||
// protected $receiveTasksRepository;
|
public $receiveElementalTasksAll;
|
||||||
|
|
||||||
public $receiveElementalTasks; // Recebe todas as acoes ja feitas atualmente por tarefa
|
|
||||||
public $receiveElementalTasksAll; // Recebe o total de tarefas que vamos fazer
|
|
||||||
|
|
||||||
public $countElementalTasks;
|
|
||||||
public $countElementalTasksAll;
|
public $countElementalTasksAll;
|
||||||
|
|
||||||
|
public $datasProject;
|
||||||
public $lastUpdated;
|
public $lastUpdated;
|
||||||
|
|
||||||
// Por enquanto nao ira usar, vamos deixar
|
|
||||||
// public $receiveAllFurtherTasks;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Deveria funcionar para receber o Repositorio.
|
|
||||||
// public function initialize()
|
|
||||||
// {
|
|
||||||
// // Injetar o repositório
|
|
||||||
// $this->receiveTasksRepository = app(ReceiveTasksRepository::class);
|
|
||||||
|
|
||||||
// // Agora você pode usar o repositório
|
|
||||||
// $this->receiveElementalTasks = $this->receiveTasksRepository->getElementalTasks();
|
|
||||||
// $this->receiveAllFurtherTasks = $this->receiveTasksRepository->getFurtherTasks();
|
|
||||||
// }
|
|
||||||
|
|
||||||
public function updateTimeGrafics()
|
|
||||||
{
|
|
||||||
// Data atual
|
|
||||||
$this->lastUpdated = now()->format('Y-m-d H:i');
|
|
||||||
|
|
||||||
// Chame o método para atualizar os dados dos gráficos
|
|
||||||
$this->refreshDataEquipments($this->datasProject);
|
|
||||||
|
|
||||||
// Disparar um evento com os dados atualizados
|
|
||||||
$this->dispatch('refreshData', [
|
|
||||||
'receiveElementalTasks' => $this->receiveElementalTasks,
|
|
||||||
'receiveElementalTasksAll' => $this->receiveElementalTasksAll,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Graficos de porcentagem entre o valor atual de finalizadas com valor final de quantas faltam
|
|
||||||
public function showPercentageElementalTasks()
|
|
||||||
{
|
|
||||||
// Disparar um evento com os dados atualizados
|
|
||||||
$this->dispatch('refreshPercentageElementalTasks', [
|
|
||||||
'receiveElementalTasks' => $this->receiveElementalTasks,
|
|
||||||
'receiveElementalTasksAll' => $this->receiveElementalTasksAll,
|
|
||||||
'countElementalTasksAll' => $this->countElementalTasksAll
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function mount($datasProject)
|
public function mount($datasProject)
|
||||||
{
|
{
|
||||||
$this->datasProject = $datasProject;
|
$this->datasProject = $datasProject;
|
||||||
|
$this->lastUpdated = now()->format('Y-m-d H:i');
|
||||||
|
|
||||||
// Obter todos os equipamentos relacionados ao projeto
|
// chama a funcao e envia a variavel datasProject recebido da view principal
|
||||||
|
$this->refreshDataEquipments($datasProject);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function refreshTaskGraph()
|
||||||
|
{
|
||||||
|
$this->lastUpdated = now()->format('Y-m-d H:i');
|
||||||
|
|
||||||
|
$this->refreshDataEquipments($this->datasProject);
|
||||||
|
|
||||||
|
$this->dispatch('refreshDataTasks', [
|
||||||
|
'receiveElementalTasks' => $this->receiveElementalTasks,
|
||||||
|
'receiveElementalTasksAll' => $this->receiveElementalTasksAll,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function showPercentageElementalTasks()
|
||||||
|
{
|
||||||
|
$this->dispatch('refreshPercentageElementalTasks', [
|
||||||
|
'receiveElementalTasks' => $this->receiveElementalTasks,
|
||||||
|
'receiveElementalTasksAll' => $this->receiveElementalTasksAll,
|
||||||
|
'countElementalTasksAll' => $this->countElementalTasksAll,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function refreshDataEquipments($datasProject)
|
||||||
|
{
|
||||||
$receiveEquipmentsProject = EquipmentWorkHistory::where('company_projects_id', $datasProject->company_projects_id)->get();
|
$receiveEquipmentsProject = EquipmentWorkHistory::where('company_projects_id', $datasProject->company_projects_id)->get();
|
||||||
|
|
||||||
$elementalTasks = collect();
|
$elementalTasks = collect();
|
||||||
// $furtherTasks = collect();
|
|
||||||
|
|
||||||
// Total de tarefas na Obra.
|
|
||||||
$elementalTasksCountsAll = [];
|
$elementalTasksCountsAll = [];
|
||||||
|
|
||||||
foreach ($receiveEquipmentsProject as $equipment) {
|
foreach ($receiveEquipmentsProject as $equipment) {
|
||||||
// Obter todas as OrderEquipmentTasks relacionadas a este equipamento
|
|
||||||
$relatedTasks = OrderEquipmentTasks::where('equipmentWorkHistorys_id', $equipment->equipmentWorkHistorys_id)->get();
|
$relatedTasks = OrderEquipmentTasks::where('equipmentWorkHistorys_id', $equipment->equipmentWorkHistorys_id)->get();
|
||||||
|
|
||||||
// Filtrar e armazenar os IDs únicos de elemental_tasks_id e further_tasks_id
|
|
||||||
$elementalTasks = $elementalTasks->merge($relatedTasks->whereNotNull('elemental_tasks_id')->pluck('elemental_tasks_id'))->unique();
|
$elementalTasks = $elementalTasks->merge($relatedTasks->whereNotNull('elemental_tasks_id')->pluck('elemental_tasks_id'))->unique();
|
||||||
|
|
||||||
// $furtherTasks = $furtherTasks->merge($relatedTasks->whereNotNull('further_tasks_id')->pluck('further_tasks_id'))->unique();
|
|
||||||
// Agrupar as tasks relacionadas por elemental_tasks_id e contar o número de ocorrências
|
|
||||||
$groupedTasks = $relatedTasks->whereNotNull('elemental_tasks_id')->groupBy('elemental_tasks_id');
|
$groupedTasks = $relatedTasks->whereNotNull('elemental_tasks_id')->groupBy('elemental_tasks_id');
|
||||||
|
|
||||||
foreach ($groupedTasks as $taskId => $tasksGroup) {
|
foreach ($groupedTasks as $taskId => $tasksGroup) {
|
||||||
|
|
@ -98,15 +67,10 @@ public function mount($datasProject)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Neste ponto parece esta correto a quantidade de tarefas, pois nenhuma tarefa passa do maximo de equipamentos.
|
|
||||||
$this->receiveElementalTasksAll = $elementalTasksCountsAll;
|
$this->receiveElementalTasksAll = $elementalTasksCountsAll;
|
||||||
|
|
||||||
// Contar o número de ocorrências de cada ID na tabela ControlEquipmentWorkstation
|
|
||||||
// $furtherTasksCount1 = ControlEquipmentWorkstation::whereIn('further_tasks_id', $furtherTasks)->get()->countBy('further_tasks_id');
|
|
||||||
|
|
||||||
// Filtrar as associações de tarefas por equipmentWorkHistorys_id que são do projeto específico
|
|
||||||
$tasksCount = ControlEquipmentWorkstation::whereIn('elemental_tasks_id', $elementalTasks)
|
$tasksCount = ControlEquipmentWorkstation::whereIn('elemental_tasks_id', $elementalTasks)
|
||||||
->whereIn('equipmentWorkHistorys_id', $receiveEquipmentsProject->pluck('equipmentWorkHistorys_id')) // Garante que estamos contando apenas para o projeto específico
|
->whereIn('equipmentWorkHistorys_id', $receiveEquipmentsProject->pluck('equipmentWorkHistorys_id'))
|
||||||
->get(['equipmentWorkHistorys_id', 'elemental_tasks_id'])
|
->get(['equipmentWorkHistorys_id', 'elemental_tasks_id'])
|
||||||
->groupBy('elemental_tasks_id')
|
->groupBy('elemental_tasks_id')
|
||||||
->map(function ($group) {
|
->map(function ($group) {
|
||||||
|
|
@ -114,39 +78,23 @@ public function mount($datasProject)
|
||||||
});
|
});
|
||||||
|
|
||||||
$newArray = [];
|
$newArray = [];
|
||||||
|
|
||||||
foreach ($tasksCount as $taskId => $count) {
|
foreach ($tasksCount as $taskId => $count) {
|
||||||
$task = ElementalTasks::find($taskId);
|
$task = ElementalTasks::find($taskId);
|
||||||
if ($task) {
|
if ($task) {
|
||||||
$newArray[$task->elemental_tasks_code] = $count;
|
$newArray[$task->elemental_tasks_code] = $count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->receiveElementalTasks = $newArray;
|
$this->receiveElementalTasks = $newArray;
|
||||||
|
|
||||||
$newArray1 = [];
|
$newArray1 = [];
|
||||||
|
|
||||||
foreach ($this->receiveElementalTasksAll as $taskId1 => $count) {
|
foreach ($this->receiveElementalTasksAll as $taskId1 => $count) {
|
||||||
$task1 = ElementalTasks::find($taskId1);
|
$task1 = ElementalTasks::find($taskId1);
|
||||||
if ($task1) {
|
if ($task1) {
|
||||||
$newArray1[$task1->elemental_tasks_code] = $count;
|
$newArray1[$task1->elemental_tasks_code] = $count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Agora, $newArray contém a contagem de tasks por elemental_tasks_code
|
|
||||||
$this->receiveElementalTasksAll = $newArray1;
|
$this->receiveElementalTasksAll = $newArray1;
|
||||||
|
|
||||||
|
|
||||||
// Criar o contador para receber o valor total.
|
|
||||||
$this->countElementalTasksAll = array_sum($this->receiveElementalTasksAll);
|
$this->countElementalTasksAll = array_sum($this->receiveElementalTasksAll);
|
||||||
|
|
||||||
|
|
||||||
$this->lastUpdated = now()->format('Y-m-d H:i');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public function refreshDataEquipments($datasProject)
|
|
||||||
{
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function render()
|
public function render()
|
||||||
|
|
|
||||||
|
After Width: | Height: | Size: 128 KiB |
|
After Width: | Height: | Size: 128 KiB |
|
After Width: | Height: | Size: 132 KiB |
|
After Width: | Height: | Size: 128 KiB |
|
After Width: | Height: | Size: 131 KiB |
|
After Width: | Height: | Size: 131 KiB |
|
After Width: | Height: | Size: 117 KiB |
|
After Width: | Height: | Size: 114 KiB |
|
After Width: | Height: | Size: 114 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
|
@ -127,7 +127,7 @@
|
||||||
/* Aumente para dar mais espaço para o cabeçalho */
|
/* Aumente para dar mais espaço para o cabeçalho */
|
||||||
margin-bottom: 50px;
|
margin-bottom: 50px;
|
||||||
/* Espaço para o rodapé */
|
/* Espaço para o rodapé */
|
||||||
padding: 0 20px;
|
/* padding: 0 5px; */
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
|
|
@ -141,7 +141,7 @@
|
||||||
compact('tag', 'numeroPanini', 'nObra', 'ambito', 'projectLogoPath', 'companyLogoPath'))
|
compact('tag', 'numeroPanini', 'nObra', 'ambito', 'projectLogoPath', 'companyLogoPath'))
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div class="content">
|
<div>
|
||||||
{{ $slot }}
|
{{ $slot }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,8 @@
|
||||||
<button class="btn btn-primary mb-2" wire:click="updateTimeGrafics">
|
<button class="btn btn-primary mb-2" wire:click="updateTimeGrafics">
|
||||||
<i class="fa-solid fa-arrows-rotate"></i>
|
<i class="fa-solid fa-arrows-rotate"></i>
|
||||||
</button>
|
</button>
|
||||||
<div style="font-size: 15px; color:#09255C; margin-left:4px; display: flex; align-items: center; justify-content: center; height: 50px;">
|
<div
|
||||||
|
style="font-size: 15px; color:#09255C; margin-left:4px; display: flex; align-items: center; justify-content: center; height: 50px;">
|
||||||
{{ $lastUpdated }}
|
{{ $lastUpdated }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -51,29 +52,25 @@
|
||||||
'Total: ' + data.totalEquipmentsCount,
|
'Total: ' + data.totalEquipmentsCount,
|
||||||
'Por Iniciar: ' + data.unstarted,
|
'Por Iniciar: ' + data.unstarted,
|
||||||
'Em Curso: ' + data.inProgress,
|
'Em Curso: ' + data.inProgress,
|
||||||
|
'Por aprovar: ' + data.toApprove,
|
||||||
'Concluídos: ' + data.completed
|
'Concluídos: ' + data.completed
|
||||||
],
|
],
|
||||||
datasets: [{
|
datasets: [{
|
||||||
data: [null, data.unstarted, data.inProgress, data.completed],
|
data: [null, data.unstarted, data.inProgress, data.toApprove, data
|
||||||
|
.completed
|
||||||
|
],
|
||||||
backgroundColor: [
|
backgroundColor: [
|
||||||
'rgba(0,80,0,0.5)', //green color
|
'rgba(0,80,0,0.5)', //green color
|
||||||
'rgb(9, 37, 92)', //Azul escuro ISPT
|
'rgb(9, 37, 92)', //Azul escuro ISPT
|
||||||
|
'rgb(9, 100, 192)', //Azul escuro ISPT (Por aprovar)
|
||||||
'rgb(0, 176, 234)', // Azull Claro ISPT
|
'rgb(0, 176, 234)', // Azull Claro ISPT
|
||||||
'rgb(5, 107, 163)', // Azul parecido
|
'rgb(5, 107, 163)', // Azul parecido
|
||||||
],
|
],
|
||||||
// borderColor: [
|
|
||||||
// '#FFFFFF', // Cor branca para o total (não será visível)
|
|
||||||
// 'rgba(255, 99, 132, 1)',
|
|
||||||
// 'rgba(54, 162, 235, 1)',
|
|
||||||
// 'rgba(255, 206, 86, 1)'
|
|
||||||
// ],
|
|
||||||
borderWidth: 1
|
borderWidth: 1
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
options: {
|
options: {
|
||||||
events: [],
|
events: [],
|
||||||
// responsive: true,
|
|
||||||
// maintainAspectRatio: false // Isso permite que você defina o tamanho do gráfico via CSS
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -102,19 +99,11 @@
|
||||||
'rgb(0, 176, 234)', // Azull Claro ISPT
|
'rgb(0, 176, 234)', // Azull Claro ISPT
|
||||||
'rgb(5, 107, 163)', // Azul parecido
|
'rgb(5, 107, 163)', // Azul parecido
|
||||||
],
|
],
|
||||||
// borderColor: [
|
|
||||||
// 'rgba(0,80,0,0.5)',
|
|
||||||
// 'rgba(255, 99, 132, 1)',
|
|
||||||
// 'rgba(54, 162, 235, 1)',
|
|
||||||
// 'rgba(255, 206, 86, 1)'
|
|
||||||
// ],
|
|
||||||
borderWidth: 1.
|
borderWidth: 1.
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
options: {
|
options: {
|
||||||
events: [],
|
events: [],
|
||||||
// responsive: true,
|
|
||||||
// maintainAspectRatio: false // Isso permite que você defina o tamanho do gráfico via CSS
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
@ -127,6 +116,7 @@
|
||||||
var unstarted = {{ $unstarted }};
|
var unstarted = {{ $unstarted }};
|
||||||
var inProgress = {{ $inProgress }};
|
var inProgress = {{ $inProgress }};
|
||||||
var completed = {{ $completed }};
|
var completed = {{ $completed }};
|
||||||
|
var toApprove = {{ $toApprove }};
|
||||||
|
|
||||||
|
|
||||||
// Crie um novo gráfico circular
|
// Crie um novo gráfico circular
|
||||||
|
|
@ -137,39 +127,33 @@
|
||||||
'Total: ' + totalEquipmentsCount,
|
'Total: ' + totalEquipmentsCount,
|
||||||
'Por Iniciar: ' + unstarted,
|
'Por Iniciar: ' + unstarted,
|
||||||
'Em Curso: ' + inProgress,
|
'Em Curso: ' + inProgress,
|
||||||
|
'Por aprovar: ' + toApprove,
|
||||||
'Concluídos: ' + completed
|
'Concluídos: ' + completed
|
||||||
],
|
],
|
||||||
datasets: [{
|
datasets: [{
|
||||||
data: [null, unstarted, inProgress, completed],
|
data: [null, unstarted, inProgress, toApprove, completed],
|
||||||
backgroundColor: [
|
backgroundColor: [
|
||||||
'rgba(0,80,0,0.5)', //green color
|
'rgba(0,80,0,0.5)', //green color
|
||||||
'rgb(9, 37, 92)', //Azul escuro ISPT
|
'rgb(9, 37, 92)', //Azul escuro ISPT
|
||||||
|
'rgb(9, 100, 192)', //Azul escuro ISPT (Por aprovar)
|
||||||
'rgb(0, 176, 234)', // Azull Claro ISPT
|
'rgb(0, 176, 234)', // Azull Claro ISPT
|
||||||
'rgb(5, 107, 163)', // Azul parecido
|
'rgb(5, 107, 163)', // Azul parecido
|
||||||
],
|
],
|
||||||
// borderColor: [
|
|
||||||
// '#FFFFFF', // Cor branca para o total (não será visível)
|
|
||||||
// 'rgba(255, 99, 132, 1)',
|
|
||||||
// 'rgba(54, 162, 235, 1)',
|
|
||||||
// 'rgba(255, 206, 86, 1)'
|
|
||||||
// ],
|
|
||||||
borderWidth: 1
|
borderWidth: 1
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
options: {
|
options: {
|
||||||
events: [],
|
events: [],
|
||||||
// responsive: true,
|
|
||||||
// maintainAspectRatio: false // Isso permite que você defina o tamanho do gráfico via CSS
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var grafico2 = document.getElementById('myPieChart1').getContext('2d');
|
var grafico2 = document.getElementById('myPieChart1').getContext('2d');
|
||||||
|
|
||||||
// Dados do componente Livewire
|
// Dados do componente Livewire
|
||||||
var totalEquivalentEquipment = {{ $totalEquivalentEquipment }}
|
var totalEquivalentEquipment = {{ $totalEquivalentEquipment }};
|
||||||
var equivalentUnstarted = {{ $equivalentUnstarted }}
|
var equivalentUnstarted = {{ $equivalentUnstarted }};
|
||||||
var equivalentInProgress = {{ $equivalentInProgress }}
|
var equivalentInProgress = {{ $equivalentInProgress }};
|
||||||
var equivalentCompleted = {{ $equivalentCompleted }}
|
var equivalentCompleted = {{ $equivalentCompleted }};
|
||||||
|
|
||||||
var myPieChart1 = new Chart(grafico2, {
|
var myPieChart1 = new Chart(grafico2, {
|
||||||
type: 'doughnut',
|
type: 'doughnut',
|
||||||
|
|
@ -181,21 +165,13 @@
|
||||||
'Concluídos: ' + equivalentCompleted
|
'Concluídos: ' + equivalentCompleted
|
||||||
],
|
],
|
||||||
datasets: [{
|
datasets: [{
|
||||||
data: [null, equivalentUnstarted, equivalentInProgress,
|
data: [null, equivalentUnstarted, equivalentInProgress, equivalentCompleted],
|
||||||
equivalentCompleted
|
|
||||||
], // Dados do componente Livewire
|
|
||||||
backgroundColor: [
|
backgroundColor: [
|
||||||
'rgba(0,80,0,0.5)', //green color
|
'rgba(0,80,0,0.5)', //green color
|
||||||
'rgb(9, 37, 92)', //Azul escuro ISPT
|
'rgb(9, 37, 92)', //Azul escuro ISPT
|
||||||
'rgb(0, 176, 234)', // Azull Claro ISPT
|
'rgb(0, 176, 234)', // Azull Claro ISPT
|
||||||
'rgb(5, 107, 163)', // Azul parecido
|
'rgb(5, 107, 163)', // Azul parecido
|
||||||
],
|
],
|
||||||
// borderColor: [
|
|
||||||
// 'rgba(0,80,0,0.5)',
|
|
||||||
// 'rgba(255, 99, 132, 1)',
|
|
||||||
// 'rgba(54, 162, 235, 1)',
|
|
||||||
// 'rgba(255, 206, 86, 1)'
|
|
||||||
// ],
|
|
||||||
borderWidth: 1
|
borderWidth: 1
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
|
|
@ -205,6 +181,7 @@
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
window.addEventListener('refreshPercentageEquipments', event => {
|
window.addEventListener('refreshPercentageEquipments', event => {
|
||||||
// Obter dados do evento
|
// Obter dados do evento
|
||||||
|
|
@ -213,12 +190,12 @@
|
||||||
// Calcular porcentagens
|
// Calcular porcentagens
|
||||||
var unstartedPercentage = ((data.unstarted / data.totalEquipmentsCount) * 100).toFixed(2);
|
var unstartedPercentage = ((data.unstarted / data.totalEquipmentsCount) * 100).toFixed(2);
|
||||||
var inProgressPercentage = ((data.inProgress / data.totalEquipmentsCount) * 100).toFixed(2);
|
var inProgressPercentage = ((data.inProgress / data.totalEquipmentsCount) * 100).toFixed(2);
|
||||||
|
var toApprovePercentage = ((data.toApprove / data.totalEquipmentsCount) * 100).toFixed(2);
|
||||||
var completedPercentage = ((data.completed / data.totalEquipmentsCount) * 100).toFixed(2);
|
var completedPercentage = ((data.completed / data.totalEquipmentsCount) * 100).toFixed(2);
|
||||||
|
|
||||||
|
|
||||||
var totalEquivalentEquipmentPercentage = ((data.equivalentUnstarted / data.totalEquivalentEquipment) *
|
var totalEquivalentEquipmentPercentage = ((data.equivalentUnstarted / data.totalEquivalentEquipment) *
|
||||||
100).toFixed(
|
100).toFixed(2);
|
||||||
2);
|
|
||||||
var equivalentInProgressPercentage = ((data.equivalentInProgress / data.totalEquivalentEquipment) * 100)
|
var equivalentInProgressPercentage = ((data.equivalentInProgress / data.totalEquivalentEquipment) * 100)
|
||||||
.toFixed(2);
|
.toFixed(2);
|
||||||
var equivalentCompletedPercentage = ((data.equivalentCompleted / data.totalEquivalentEquipment) * 100)
|
var equivalentCompletedPercentage = ((data.equivalentCompleted / data.totalEquivalentEquipment) * 100)
|
||||||
|
|
@ -238,13 +215,16 @@
|
||||||
'Total: ' + data.totalEquipmentsCount,
|
'Total: ' + data.totalEquipmentsCount,
|
||||||
'Por Iniciar: ' + unstartedPercentage + '%',
|
'Por Iniciar: ' + unstartedPercentage + '%',
|
||||||
'Em Curso: ' + inProgressPercentage + '%',
|
'Em Curso: ' + inProgressPercentage + '%',
|
||||||
|
'Por aprovar: ' + toApprovePercentage + '%',
|
||||||
'Concluídos: ' + completedPercentage + '%'
|
'Concluídos: ' + completedPercentage + '%'
|
||||||
],
|
],
|
||||||
datasets: [{
|
datasets: [{
|
||||||
data: [null, data.unstarted, data.inProgress, data.completed],
|
data: [null, data.unstarted, data.inProgress, data.toApprove, data
|
||||||
|
.completed],
|
||||||
backgroundColor: [
|
backgroundColor: [
|
||||||
'rgba(0,80,0,0.5)', //green color
|
'rgba(0,80,0,0.5)', //green color
|
||||||
'rgb(9, 37, 92)', //Azul escuro ISPT
|
'rgb(9, 37, 92)', //Azul escuro ISPT
|
||||||
|
'rgb(9, 100, 192)', //Azul escuro ISPT (Por aprovar)
|
||||||
'rgb(0, 176, 234)', // Azull Claro ISPT
|
'rgb(0, 176, 234)', // Azull Claro ISPT
|
||||||
'rgb(5, 107, 163)', // Azul parecido
|
'rgb(5, 107, 163)', // Azul parecido
|
||||||
],
|
],
|
||||||
|
|
@ -255,6 +235,7 @@
|
||||||
events: [],
|
events: [],
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (myPieChart1) {
|
if (myPieChart1) {
|
||||||
myPieChart1.destroy(); // Destrua o gráfico antigo antes de criar um novo
|
myPieChart1.destroy(); // Destrua o gráfico antigo antes de criar um novo
|
||||||
}
|
}
|
||||||
|
|
@ -280,19 +261,11 @@
|
||||||
'rgb(0, 176, 234)', // Azull Claro ISPT
|
'rgb(0, 176, 234)', // Azull Claro ISPT
|
||||||
'rgb(5, 107, 163)', // Azul parecido
|
'rgb(5, 107, 163)', // Azul parecido
|
||||||
],
|
],
|
||||||
// borderColor: [
|
|
||||||
// 'rgba(0,80,0,0.5)',
|
|
||||||
// 'rgba(255, 99, 132, 1)',
|
|
||||||
// 'rgba(54, 162, 235, 1)',
|
|
||||||
// 'rgba(255, 206, 86, 1)'
|
|
||||||
// ],
|
|
||||||
borderWidth: 1.
|
borderWidth: 1.
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
options: {
|
options: {
|
||||||
events: [],
|
events: [],
|
||||||
// responsive: true,
|
|
||||||
// maintainAspectRatio: false // Isso permite que você defina o tamanho do gráfico via CSS
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
295
resources/views/livewire/execução/tasks-dashboard.blade copy.php
Executable file
|
|
@ -0,0 +1,295 @@
|
||||||
|
<div>
|
||||||
|
{{-- Proxima implementacao --}}
|
||||||
|
{{-- <div class="row">
|
||||||
|
<div class="col-sm">
|
||||||
|
<button wire:click="showPercentageElementalTasks">Grafico em porcentagem</button>
|
||||||
|
</div>
|
||||||
|
</div> --}}
|
||||||
|
|
||||||
|
{{-- Botao de fazer reload ao grafico sem recarregar a pagina , Atualmente nao funciona --}}
|
||||||
|
{{-- <div class="row">
|
||||||
|
<div class="col-sm d-flex justify-content-end">
|
||||||
|
<button class="btn btn-primary mb-2" wire:click="updateTimeGrafics">
|
||||||
|
<i class="fa-solid fa-arrows-rotate"></i>
|
||||||
|
</button>
|
||||||
|
<div
|
||||||
|
style="font-size: 15px; color:#09255C; margin-left:4px; display: flex; align-items: center; justify-content: center; height: 50px;">
|
||||||
|
{{ $lastUpdated }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div> --}}
|
||||||
|
|
||||||
|
{{-- <div class="row text-center">
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<h6>Quantidade Tarefas Concluidas</h6>
|
||||||
|
<p style="color:gray; font-size:13px">Total de acções já realizadas de acordo com a tarefa.</p>
|
||||||
|
<canvas id="myPieChart2" width="50" height="50"></canvas>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<h6>Quantidade tarefas Acumuladas</h6>
|
||||||
|
<p style="color:gray; font-size:13px"> Total de acções a serem realizadas por tarefa.</p>
|
||||||
|
<canvas id="myPieChart3" width="50" height="50"></canvas>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div> --}}
|
||||||
|
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm d-flex justify-content-end">
|
||||||
|
<button class="btn btn-primary mr-2 mb-2" wire:click="showPercentageEquipments">
|
||||||
|
<i class="fa-solid fa-percent"></i>
|
||||||
|
</button>
|
||||||
|
<button class="btn btn-primary mr-2 mb-2" wire:click="updateTimeGrafics">
|
||||||
|
<i class=" fa fa-bar-chart fa-rotate-270"></i>
|
||||||
|
</button>
|
||||||
|
<button class="btn btn-primary mb-2" wire:click="updateTimeGrafics">
|
||||||
|
<i class="fa-solid fa-arrows-rotate"></i>
|
||||||
|
</button>
|
||||||
|
<div
|
||||||
|
style="font-size: 15px; color:#09255C; margin-left:4px; display: flex; align-items: center; justify-content: center; height: 50px;">
|
||||||
|
{{ $lastUpdated }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="row text-center">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<h6>Quantidade Tarefas</h6>
|
||||||
|
<p style="color:gray; font-size:13px">Total de ações realizadas e a serem realizadas por tarefa.</p>
|
||||||
|
<canvas id="stackedBarChart" width="100" height="50"></canvas>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// Suponha que as variáveis abaixo estão corretamente definidas em PHP e passadas para o JavaScript
|
||||||
|
var elementalTasksCountAll = @json($receiveElementalTasksAll);
|
||||||
|
var elementalTasksCount = @json($receiveElementalTasks);
|
||||||
|
|
||||||
|
// Inicializa as variáveis para os dados concluídos e restantes
|
||||||
|
var dataConcluidas = [];
|
||||||
|
var dataRestantes = [];
|
||||||
|
var labels = Object.keys(elementalTasksCountAll);
|
||||||
|
|
||||||
|
// Preenche os arrays de dados
|
||||||
|
labels.forEach(function(label) {
|
||||||
|
// Se existir um valor para a label em 'elementalTasksCount', usa-o, caso contrário, usa 0
|
||||||
|
var valorConcluido = elementalTasksCount[label] || 0;
|
||||||
|
dataConcluidas.push(valorConcluido);
|
||||||
|
|
||||||
|
// Calcula o valor restante
|
||||||
|
var valorTotal = elementalTasksCountAll[label];
|
||||||
|
dataRestantes.push(valorTotal - valorConcluido);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Elemento canvas onde o gráfico será renderizado
|
||||||
|
var canvas = document.getElementById('stackedBarChart').getContext('2d');
|
||||||
|
|
||||||
|
// Destrói o gráfico anterior se ele existir
|
||||||
|
if (window.stackedBarChartInstance) {
|
||||||
|
window.stackedBarChartInstance.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cria o gráfico de barras empilhadas
|
||||||
|
window.stackedBarChartInstance = new Chart(canvas, {
|
||||||
|
type: 'bar',
|
||||||
|
data: {
|
||||||
|
labels: labels,
|
||||||
|
datasets: [{
|
||||||
|
label: 'Concluídas',
|
||||||
|
data: dataConcluidas,
|
||||||
|
backgroundColor: 'rgb(9,37,92)' // Cor para as concluídas
|
||||||
|
}, {
|
||||||
|
label: 'Restantes',
|
||||||
|
data: dataRestantes,
|
||||||
|
backgroundColor: 'rgba(168,168,168)' // Cor para as restantes
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
scales: {
|
||||||
|
x: {
|
||||||
|
stacked: true
|
||||||
|
},
|
||||||
|
y: {
|
||||||
|
stacked: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
plugins: {
|
||||||
|
legend: {
|
||||||
|
display: true
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
enabled: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
window.addEventListener('refreshData', event => {
|
||||||
|
// Obter os dados detalhados do evento
|
||||||
|
var data = event.detail[0];
|
||||||
|
var elementalTasksCount = data.receiveElementalTasks;
|
||||||
|
var elementalTasksCountAll = data.receiveElementalTasksAll;
|
||||||
|
|
||||||
|
// Inicializa as variáveis para os dados concluídos e restantes
|
||||||
|
var dataConcluidas = [];
|
||||||
|
var dataRestantes = [];
|
||||||
|
var labels = Object.keys(elementalTasksCountAll);
|
||||||
|
|
||||||
|
// Preenche os arrays de dados
|
||||||
|
labels.forEach(function(label) {
|
||||||
|
// Se existir um valor para a label em 'elementalTasksCount', usa-o, caso contrário, usa 0
|
||||||
|
var valorConcluido = elementalTasksCount[label] || 0;
|
||||||
|
dataConcluidas.push(valorConcluido);
|
||||||
|
|
||||||
|
// Calcula o valor restante
|
||||||
|
var valorTotal = elementalTasksCountAll[label] || 0;
|
||||||
|
dataRestantes.push(valorTotal - valorConcluido);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Elemento canvas onde o gráfico será renderizado
|
||||||
|
var canvas = document.getElementById('stackedBarChart').getContext('2d');
|
||||||
|
|
||||||
|
// Destrói o gráfico anterior se ele existir
|
||||||
|
if (window.stackedBarChartInstance) {
|
||||||
|
window.stackedBarChartInstance.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cria o gráfico de barras empilhadas com os novos dados
|
||||||
|
window.stackedBarChartInstance = new Chart(canvas, {
|
||||||
|
type: 'bar',
|
||||||
|
data: {
|
||||||
|
labels: labels,
|
||||||
|
datasets: [{
|
||||||
|
label: 'Concluídas',
|
||||||
|
data: dataConcluidas,
|
||||||
|
backgroundColor: 'rgb(9,37,92)' // Cor para as concluídas
|
||||||
|
}, {
|
||||||
|
label: 'Restantes',
|
||||||
|
data: dataRestantes,
|
||||||
|
backgroundColor: 'rgba(168,168,168)' // Cor para as restantes
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
scales: {
|
||||||
|
x: {
|
||||||
|
stacked: true
|
||||||
|
},
|
||||||
|
y: {
|
||||||
|
stacked: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
plugins: {
|
||||||
|
legend: {
|
||||||
|
display: true
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
enabled: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{{-- Scrip de atualizacao da tabela --}}
|
||||||
|
{{-- <script>
|
||||||
|
window.addEventListener('refreshData', event => {
|
||||||
|
|
||||||
|
var data = event.detail[0];
|
||||||
|
var elementalTasksCount = data.receiveElementalTasks;
|
||||||
|
|
||||||
|
var labels = Object.keys(elementalTasksCount);
|
||||||
|
var dataValues = Object.values(elementalTasksCount);
|
||||||
|
|
||||||
|
var baseColors = [
|
||||||
|
'rgb(117,210,240)', //green color
|
||||||
|
'rgb(9, 37, 92)', //Azul escuro ISPT
|
||||||
|
'rgb(0, 176, 234)', // Azull Claro ISPT
|
||||||
|
'rgb(5, 107, 163)', // Azul parecido
|
||||||
|
];
|
||||||
|
|
||||||
|
// Atribuir cores aos dados de forma cíclica
|
||||||
|
var backgroundColors = dataValues.map((_, index) => baseColors[index % baseColors.length]);
|
||||||
|
|
||||||
|
var grafico2 = document.getElementById('myPieChart2').getContext('2d');
|
||||||
|
|
||||||
|
window.myPieChart2 = new Chart(grafico2, {
|
||||||
|
type: 'bar',
|
||||||
|
data: {
|
||||||
|
labels: labels,
|
||||||
|
datasets: [{
|
||||||
|
data: dataValues,
|
||||||
|
backgroundColor: backgroundColors, // Usar o array de cores gerado
|
||||||
|
borderColor: backgroundColors.map(color => color.replace('0.5',
|
||||||
|
'1')), // Ajustar a opacidade para as bordas
|
||||||
|
borderWidth: 1
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
animation: false,
|
||||||
|
plugins: {
|
||||||
|
legend: {
|
||||||
|
display: false
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
var elementalTasksCountAll = data.receiveElementalTasksAll;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var labelsTasksCountAll = Object.keys(elementalTasksCountAll);
|
||||||
|
var dataValuesTasksCountAll = Object.values(elementalTasksCountAll);
|
||||||
|
|
||||||
|
var grafico3 = document.getElementById('myPieChart3').getContext('2d');
|
||||||
|
|
||||||
|
window.myPieChart3 = new Chart(grafico3, {
|
||||||
|
type: 'bar',
|
||||||
|
data: {
|
||||||
|
labels: labelsTasksCountAll,
|
||||||
|
datasets: [{
|
||||||
|
data: dataValuesTasksCountAll,
|
||||||
|
backgroundColor: backgroundColors, // Usar o array de cores gerado
|
||||||
|
borderColor: backgroundColors.map(color => color.replace('0.5',
|
||||||
|
'1')), // Ajustar a opacidade para as bordas
|
||||||
|
borderWidth: 1
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
animation: false,
|
||||||
|
plugins: {
|
||||||
|
legend: {
|
||||||
|
display: false
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script> --}}
|
||||||
|
|
||||||
|
{{-- Script de Gradico em porcentagem , para proxima implementacao e ADD+ Esforco --}}
|
||||||
|
{{-- <script>
|
||||||
|
window.addEventListener('refreshPercentageElementalTasks', event => {
|
||||||
|
var data = event.detail[0];
|
||||||
|
// Tarefas ja feitas
|
||||||
|
if (myPieChart2) {
|
||||||
|
myPieChart2.destroy(); // Destrua o gráfico antigo antes de criar um novo
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script> --}}
|
||||||
|
|
@ -1,78 +1,55 @@
|
||||||
<div>
|
{{-- <div>
|
||||||
{{-- Proxima implementacao --}}
|
<div class="row">
|
||||||
{{-- <div class="row">
|
|
||||||
<div class="col-sm">
|
|
||||||
<button wire:click="showPercentageElementalTasks">Grafico em porcentagem</button>
|
|
||||||
</div>
|
|
||||||
</div> --}}
|
|
||||||
|
|
||||||
{{-- Botao de fazer reload ao grafico sem recarregar a pagina , Atualmente nao funciona --}}
|
|
||||||
{{-- <div class="row">
|
|
||||||
<div class="col-sm d-flex justify-content-end">
|
<div class="col-sm d-flex justify-content-end">
|
||||||
<button class="btn btn-primary mb-2" wire:click="updateTimeGrafics">
|
<button class="btn btn-primary mr-2 mb-2" wire:click="showPercentageElementalTasks">
|
||||||
|
<i class="fa-solid fa-percent"></i>
|
||||||
|
</button>
|
||||||
|
<button class="btn btn-primary mr-2 mb-2" wire:click="refreshTaskGraph">
|
||||||
|
<i class="fa fa-bar-chart fa-rotate-270"></i>
|
||||||
|
</button>
|
||||||
|
<button class="btn btn-primary mb-2" wire:click="refreshTaskGraph">
|
||||||
<i class="fa-solid fa-arrows-rotate"></i>
|
<i class="fa-solid fa-arrows-rotate"></i>
|
||||||
</button>
|
</button>
|
||||||
<div
|
<div style="font-size: 15px; color:#09255C; margin-left:4px; display: flex; align-items: center; justify-content: center; height: 50px;">
|
||||||
style="font-size: 15px; color:#09255C; margin-left:4px; display: flex; align-items: center; justify-content: center; height: 50px;">
|
|
||||||
{{ $lastUpdated }}
|
{{ $lastUpdated }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div> --}}
|
|
||||||
|
|
||||||
{{-- <div class="row text-center">
|
|
||||||
<div class="col-sm-6">
|
|
||||||
<h6>Quantidade Tarefas Concluidas</h6>
|
|
||||||
<p style="color:gray; font-size:13px">Total de acções já realizadas de acordo com a tarefa.</p>
|
|
||||||
<canvas id="myPieChart2" width="50" height="50"></canvas>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-6">
|
|
||||||
<h6>Quantidade tarefas Acumuladas</h6>
|
|
||||||
<p style="color:gray; font-size:13px"> Total de acções a serem realizadas por tarefa.</p>
|
|
||||||
<canvas id="myPieChart3" width="50" height="50"></canvas>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div> --}}
|
|
||||||
|
|
||||||
|
|
||||||
<div class="row text-center">
|
<div class="row text-center">
|
||||||
<div class="col-sm-12">
|
<div class="col-sm-12">
|
||||||
<h6>Quantidade Tarefas</h6>
|
<h6>Quantidade Tarefas</h6>
|
||||||
<p style="color:gray; font-size:13px">Total de ações realizadas e a serem realizadas por tarefa.</p>
|
<p style="color:gray; font-size:13px">Total de ações realizadas e a serem realizadas por tarefa.</p>
|
||||||
<canvas id="stackedBarChart" width="100" height="50"></canvas>
|
<canvas id="stackedBarChart" width="800" height="400"></canvas>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div> --}}
|
||||||
|
|
||||||
|
|
||||||
<script>
|
{{-- <script>
|
||||||
// Suponha que as variáveis abaixo estão corretamente definidas em PHP e passadas para o JavaScript
|
// Atualização do gráfico quando os dados são atualizados via Livewire
|
||||||
var elementalTasksCountAll = @json($receiveElementalTasksAll);
|
window.addEventListener('refreshDataTasks', event => {
|
||||||
var elementalTasksCount = @json($receiveElementalTasks);
|
var data = event.detail[0];
|
||||||
|
var elementalTasksCount = data.receiveElementalTasks;
|
||||||
|
var elementalTasksCountAll = data.receiveElementalTasksAll;
|
||||||
|
|
||||||
// Inicializa as variáveis para os dados concluídos e restantes
|
|
||||||
var dataConcluidas = [];
|
var dataConcluidas = [];
|
||||||
var dataRestantes = [];
|
var dataRestantes = [];
|
||||||
var labels = Object.keys(elementalTasksCountAll);
|
var labels = Object.keys(elementalTasksCountAll);
|
||||||
|
|
||||||
// Preenche os arrays de dados
|
|
||||||
labels.forEach(function(label) {
|
labels.forEach(function(label) {
|
||||||
// Se existir um valor para a label em 'elementalTasksCount', usa-o, caso contrário, usa 0
|
|
||||||
var valorConcluido = elementalTasksCount[label] || 0;
|
var valorConcluido = elementalTasksCount[label] || 0;
|
||||||
dataConcluidas.push(valorConcluido);
|
dataConcluidas.push(valorConcluido);
|
||||||
|
var valorTotal = elementalTasksCountAll[label] || 0;
|
||||||
// Calcula o valor restante
|
|
||||||
var valorTotal = elementalTasksCountAll[label];
|
|
||||||
dataRestantes.push(valorTotal - valorConcluido);
|
dataRestantes.push(valorTotal - valorConcluido);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Elemento canvas onde o gráfico será renderizado
|
|
||||||
var canvas = document.getElementById('stackedBarChart').getContext('2d');
|
var canvas = document.getElementById('stackedBarChart').getContext('2d');
|
||||||
|
|
||||||
// Destrói o gráfico anterior se ele existir
|
|
||||||
if (window.stackedBarChartInstance) {
|
if (window.stackedBarChartInstance) {
|
||||||
window.stackedBarChartInstance.destroy();
|
window.stackedBarChartInstance.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cria o gráfico de barras empilhadas
|
|
||||||
window.stackedBarChartInstance = new Chart(canvas, {
|
window.stackedBarChartInstance = new Chart(canvas, {
|
||||||
type: 'bar',
|
type: 'bar',
|
||||||
data: {
|
data: {
|
||||||
|
|
@ -80,11 +57,11 @@
|
||||||
datasets: [{
|
datasets: [{
|
||||||
label: 'Concluídas',
|
label: 'Concluídas',
|
||||||
data: dataConcluidas,
|
data: dataConcluidas,
|
||||||
backgroundColor: 'rgb(9,37,92)' // Cor para as concluídas
|
backgroundColor: 'rgb(9,37,92)'
|
||||||
}, {
|
}, {
|
||||||
label: 'Restantes',
|
label: 'Restantes',
|
||||||
data: dataRestantes,
|
data: dataRestantes,
|
||||||
backgroundColor: 'rgba(168,168,168)' // Cor para as restantes
|
backgroundColor: 'rgba(168,168,168)'
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
options: {
|
options: {
|
||||||
|
|
@ -106,171 +83,217 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
});
|
||||||
|
|
||||||
<script>
|
// Função para inicializar o gráfico pela primeira vez
|
||||||
window.addEventListener('refreshData', event => {
|
function initializeChart() {
|
||||||
// Obter os dados detalhados do evento
|
var elementalTasksCountAll = @json($receiveElementalTasksAll);
|
||||||
var data = event.detail[0];
|
var elementalTasksCount = @json($receiveElementalTasks);
|
||||||
var elementalTasksCount = data.receiveElementalTasks;
|
|
||||||
var elementalTasksCountAll = data.receiveElementalTasksAll;
|
|
||||||
|
|
||||||
// Inicializa as variáveis para os dados concluídos e restantes
|
var dataConcluidas = [];
|
||||||
var dataConcluidas = [];
|
var dataRestantes = [];
|
||||||
var dataRestantes = [];
|
var labels = Object.keys(elementalTasksCountAll);
|
||||||
var labels = Object.keys(elementalTasksCountAll);
|
|
||||||
|
|
||||||
// Preenche os arrays de dados
|
labels.forEach(function(label) {
|
||||||
labels.forEach(function(label) {
|
var valorConcluido = elementalTasksCount[label] || 0;
|
||||||
// Se existir um valor para a label em 'elementalTasksCount', usa-o, caso contrário, usa 0
|
dataConcluidas.push(valorConcluido);
|
||||||
var valorConcluido = elementalTasksCount[label] || 0;
|
var valorTotal = elementalTasksCountAll[label];
|
||||||
dataConcluidas.push(valorConcluido);
|
dataRestantes.push(valorTotal - valorConcluido);
|
||||||
|
});
|
||||||
|
|
||||||
// Calcula o valor restante
|
var canvas = document.getElementById('stackedBarChart').getContext('2d');
|
||||||
var valorTotal = elementalTasksCountAll[label] || 0;
|
|
||||||
dataRestantes.push(valorTotal - valorConcluido);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Elemento canvas onde o gráfico será renderizado
|
if (window.stackedBarChartInstance) {
|
||||||
var canvas = document.getElementById('stackedBarChart').getContext('2d');
|
window.stackedBarChartInstance.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
// Destrói o gráfico anterior se ele existir
|
window.stackedBarChartInstance = new Chart(canvas, {
|
||||||
if (window.stackedBarChartInstance) {
|
type: 'bar',
|
||||||
window.stackedBarChartInstance.destroy();
|
data: {
|
||||||
}
|
labels: labels,
|
||||||
|
datasets: [{
|
||||||
// Cria o gráfico de barras empilhadas com os novos dados
|
label: 'Concluídas',
|
||||||
window.stackedBarChartInstance = new Chart(canvas, {
|
data: dataConcluidas,
|
||||||
type: 'bar',
|
backgroundColor: 'rgb(9,37,92)'
|
||||||
data: {
|
}, {
|
||||||
labels: labels,
|
label: 'Restantes',
|
||||||
datasets: [{
|
data: dataRestantes,
|
||||||
label: 'Concluídas',
|
backgroundColor: 'rgba(168,168,168)'
|
||||||
data: dataConcluidas,
|
}]
|
||||||
backgroundColor: 'rgb(9,37,92)' // Cor para as concluídas
|
},
|
||||||
}, {
|
options: {
|
||||||
label: 'Restantes',
|
scales: {
|
||||||
data: dataRestantes,
|
x: {
|
||||||
backgroundColor: 'rgba(168,168,168)' // Cor para as restantes
|
stacked: true
|
||||||
}]
|
|
||||||
},
|
|
||||||
options: {
|
|
||||||
scales: {
|
|
||||||
x: {
|
|
||||||
stacked: true
|
|
||||||
},
|
|
||||||
y: {
|
|
||||||
stacked: true
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
plugins: {
|
y: {
|
||||||
legend: {
|
stacked: true
|
||||||
display: true
|
}
|
||||||
},
|
},
|
||||||
tooltip: {
|
plugins: {
|
||||||
enabled: true
|
legend: {
|
||||||
}
|
display: true
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
enabled: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
});
|
});
|
||||||
</script>
|
}
|
||||||
|
|
||||||
|
// Inicialização inicial do gráfico
|
||||||
|
initializeChart();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{{-- Scrip de atualizacao da tabela --}}
|
|
||||||
{{-- <script>
|
|
||||||
window.addEventListener('refreshData', event => {
|
|
||||||
|
|
||||||
var data = event.detail[0];
|
|
||||||
var elementalTasksCount = data.receiveElementalTasks;
|
|
||||||
|
|
||||||
var labels = Object.keys(elementalTasksCount);
|
|
||||||
var dataValues = Object.values(elementalTasksCount);
|
|
||||||
|
|
||||||
var baseColors = [
|
|
||||||
'rgb(117,210,240)', //green color
|
|
||||||
'rgb(9, 37, 92)', //Azul escuro ISPT
|
|
||||||
'rgb(0, 176, 234)', // Azull Claro ISPT
|
|
||||||
'rgb(5, 107, 163)', // Azul parecido
|
|
||||||
];
|
|
||||||
|
|
||||||
// Atribuir cores aos dados de forma cíclica
|
|
||||||
var backgroundColors = dataValues.map((_, index) => baseColors[index % baseColors.length]);
|
|
||||||
|
|
||||||
var grafico2 = document.getElementById('myPieChart2').getContext('2d');
|
|
||||||
|
|
||||||
window.myPieChart2 = new Chart(grafico2, {
|
|
||||||
type: 'bar',
|
|
||||||
data: {
|
|
||||||
labels: labels,
|
|
||||||
datasets: [{
|
|
||||||
data: dataValues,
|
|
||||||
backgroundColor: backgroundColors, // Usar o array de cores gerado
|
|
||||||
borderColor: backgroundColors.map(color => color.replace('0.5',
|
|
||||||
'1')), // Ajustar a opacidade para as bordas
|
|
||||||
borderWidth: 1
|
|
||||||
}]
|
|
||||||
},
|
|
||||||
options: {
|
|
||||||
animation: false,
|
|
||||||
plugins: {
|
|
||||||
legend: {
|
|
||||||
display: false
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
enabled: false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
var elementalTasksCountAll = data.receiveElementalTasksAll;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var labelsTasksCountAll = Object.keys(elementalTasksCountAll);
|
|
||||||
var dataValuesTasksCountAll = Object.values(elementalTasksCountAll);
|
|
||||||
|
|
||||||
var grafico3 = document.getElementById('myPieChart3').getContext('2d');
|
|
||||||
|
|
||||||
window.myPieChart3 = new Chart(grafico3, {
|
|
||||||
type: 'bar',
|
|
||||||
data: {
|
|
||||||
labels: labelsTasksCountAll,
|
|
||||||
datasets: [{
|
|
||||||
data: dataValuesTasksCountAll,
|
|
||||||
backgroundColor: backgroundColors, // Usar o array de cores gerado
|
|
||||||
borderColor: backgroundColors.map(color => color.replace('0.5',
|
|
||||||
'1')), // Ajustar a opacidade para as bordas
|
|
||||||
borderWidth: 1
|
|
||||||
}]
|
|
||||||
},
|
|
||||||
options: {
|
|
||||||
animation: false,
|
|
||||||
plugins: {
|
|
||||||
legend: {
|
|
||||||
display: false
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
enabled: false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script> --}}
|
|
||||||
|
|
||||||
{{-- Script de Gradico em porcentagem , para proxima implementacao e ADD+ Esforco --}}
|
|
||||||
{{-- <script>
|
|
||||||
window.addEventListener('refreshPercentageElementalTasks', event => {
|
|
||||||
var data = event.detail[0];
|
|
||||||
// Tarefas ja feitas
|
|
||||||
if (myPieChart2) {
|
|
||||||
myPieChart2.destroy(); // Destrua o gráfico antigo antes de criar um novo
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script> --}}
|
</script> --}}
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm d-flex justify-content-end">
|
||||||
|
<button class="btn btn-primary mr-2 mb-2" wire:click="showPercentageElementalTasks">
|
||||||
|
<i class="fa-solid fa-arrows-rotate"></i>
|
||||||
|
{{-- <i class="fa-solid fa-percent"></i> --}}
|
||||||
|
</button>
|
||||||
|
{{-- <button class="btn btn-primary mr-2 mb-2" wire:click="refreshTaskGraph">
|
||||||
|
<i class="fa fa-bar-chart fa-rotate-270"></i>
|
||||||
|
</button>
|
||||||
|
<button class="btn btn-primary mb-2" wire:click="refreshTaskGraph">
|
||||||
|
<i class="fa-solid fa-arrows-rotate"></i>
|
||||||
|
</button> --}}
|
||||||
|
<div
|
||||||
|
style="font-size: 15px; color:#09255C; margin-left:4px; display: flex; align-items: center; justify-content: center; height: 50px;">
|
||||||
|
{{ $lastUpdated }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row text-center">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<h6>Quantidade Tarefas</h6>
|
||||||
|
<p style="color:gray; font-size:13px">Total de ações realizadas e a serem realizadas por tarefa.</p>
|
||||||
|
<canvas id="stackedBarChart" width="800" height="400"></canvas>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// Atualização do gráfico quando os dados são atualizados via Livewire
|
||||||
|
window.addEventListener('refreshDataTasks', event => {
|
||||||
|
var data = event.detail[0];
|
||||||
|
var elementalTasksCount = data.receiveElementalTasks;
|
||||||
|
var elementalTasksCountAll = data.receiveElementalTasksAll;
|
||||||
|
|
||||||
|
var dataConcluidas = [];
|
||||||
|
var dataRestantes = [];
|
||||||
|
var labels = Object.keys(elementalTasksCountAll);
|
||||||
|
|
||||||
|
labels.forEach(function(label) {
|
||||||
|
var valorConcluido = elementalTasksCount[label] || 0;
|
||||||
|
dataConcluidas.push(valorConcluido);
|
||||||
|
var valorTotal = elementalTasksCountAll[label] || 0;
|
||||||
|
dataRestantes.push(valorTotal - valorConcluido);
|
||||||
|
});
|
||||||
|
|
||||||
|
var canvas = document.getElementById('stackedBarChart').getContext('2d');
|
||||||
|
|
||||||
|
if (window.stackedBarChartInstance) {
|
||||||
|
window.stackedBarChartInstance.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
window.stackedBarChartInstance = new Chart(canvas, {
|
||||||
|
type: 'bar',
|
||||||
|
data: {
|
||||||
|
labels: labels,
|
||||||
|
datasets: [{
|
||||||
|
label: 'Concluídas',
|
||||||
|
data: dataConcluidas,
|
||||||
|
backgroundColor: 'rgb(9,37,92)'
|
||||||
|
}, {
|
||||||
|
label: 'Restantes',
|
||||||
|
data: dataRestantes,
|
||||||
|
backgroundColor: 'rgba(168,168,168)'
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
scales: {
|
||||||
|
x: {
|
||||||
|
stacked: true
|
||||||
|
},
|
||||||
|
y: {
|
||||||
|
stacked: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
plugins: {
|
||||||
|
legend: {
|
||||||
|
display: true
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
enabled: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Função para inicializar o gráfico pela primeira vez
|
||||||
|
function initializeChart() {
|
||||||
|
var elementalTasksCountAll = @json($receiveElementalTasksAll);
|
||||||
|
var elementalTasksCount = @json($receiveElementalTasks);
|
||||||
|
|
||||||
|
var dataConcluidas = [];
|
||||||
|
var dataRestantes = [];
|
||||||
|
var labels = Object.keys(elementalTasksCountAll);
|
||||||
|
|
||||||
|
labels.forEach(function(label) {
|
||||||
|
var valorConcluido = elementalTasksCount[label] || 0;
|
||||||
|
dataConcluidas.push(valorConcluido);
|
||||||
|
var valorTotal = elementalTasksCountAll[label];
|
||||||
|
dataRestantes.push(valorTotal - valorConcluido);
|
||||||
|
});
|
||||||
|
|
||||||
|
var canvas = document.getElementById('stackedBarChart').getContext('2d');
|
||||||
|
|
||||||
|
if (window.stackedBarChartInstance) {
|
||||||
|
window.stackedBarChartInstance.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
window.stackedBarChartInstance = new Chart(canvas, {
|
||||||
|
type: 'bar',
|
||||||
|
data: {
|
||||||
|
labels: labels,
|
||||||
|
datasets: [{
|
||||||
|
label: 'Concluídas',
|
||||||
|
data: dataConcluidas,
|
||||||
|
backgroundColor: 'rgb(9,37,92)'
|
||||||
|
}, {
|
||||||
|
label: 'Restantes',
|
||||||
|
data: dataRestantes,
|
||||||
|
backgroundColor: 'rgba(168,168,168)'
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
scales: {
|
||||||
|
x: {
|
||||||
|
stacked: true
|
||||||
|
},
|
||||||
|
y: {
|
||||||
|
stacked: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
plugins: {
|
||||||
|
legend: {
|
||||||
|
display: true
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
enabled: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inicialização inicial do gráfico
|
||||||
|
initializeChart();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
<!-- Logo -->
|
<!-- Logo -->
|
||||||
<div class="row" style="height: 70px; margin-bottom: 15px;">
|
<div class="row" style="height: 70px; margin-bottom: 15px;">
|
||||||
<!-- Imagem no extremo esquerdo -->
|
<!-- Imagem no extremo esquerdo -->
|
||||||
<div class="col d-flex justify-content-start align-items-center" style="height: 100%;">
|
<div class="col d-flex justify-content-start align-items-center" style="height: 100%; ">
|
||||||
<img src="{{ public_path($projectLogoPath) }}" alt="Project Logo" class="img-fluid"
|
<img src="{{ public_path($projectLogoPath) }}" alt="Project Logo" class="img-fluid"
|
||||||
style="max-width: 70px; max-height: 70px;">
|
style="max-width: 70px; max-height: 70px;">
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -25,7 +25,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row ">
|
||||||
<div class="col-sm">
|
<div class="col-sm">
|
||||||
<p class="mb-0" style="border-style: double;"><strong>N. Obra:</strong> {{ $nObra ?? 'N/A' }}</p>
|
<p class="mb-0" style="border-style: double;"><strong>N. Obra:</strong> {{ $nObra ?? 'N/A' }}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,8 @@
|
||||||
compact('tag', 'numeroPanini', 'nObra', 'ambito', 'projectLogoPath', 'companyLogoPath'))
|
compact('tag', 'numeroPanini', 'nObra', 'ambito', 'projectLogoPath', 'companyLogoPath'))
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div class="content">
|
<div class="content mr-4">
|
||||||
|
{{-- <h1>Lorem ipsum dolor sit amet consectetur adipisicing elit. Amet quas eligendi pariatur eum alias, aliquam distinctio cumque ut corporis. Vero illo omnis rem eligendi laudantium sunt? Autem dolores alias officiis.</h1> --}}
|
||||||
@include('components.elemental-tasks', ['task_todo' => $task_todo])
|
@include('components.elemental-tasks', ['task_todo' => $task_todo])
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
|
|
||||||
|
|
@ -151,12 +151,15 @@ class="fas fa-plus"></i></button>
|
||||||
@php
|
@php
|
||||||
$task_todo = $tasks['latest'];
|
$task_todo = $tasks['latest'];
|
||||||
@endphp
|
@endphp
|
||||||
|
|
||||||
@include('components.elemental-tasks', ['task_todo' => $task_todo])
|
@include('components.elemental-tasks', ['task_todo' => $task_todo])
|
||||||
|
|
||||||
@endif
|
@endif
|
||||||
@endforeach
|
@endforeach
|
||||||
|
|
||||||
|
{{-- ESTA modal recebe corretamento os historicos para cada tarefa ja executada, porem a questao e que da forma que esta atualmente se tirar de comentario, os valores do tipo radio simplemente não aparecem --}}
|
||||||
<!-- Modal -->
|
<!-- Modal -->
|
||||||
<div class="modal fade" id="taskModal" tabindex="-1" role="dialog" aria-labelledby="taskModalLabel"
|
{{-- <div class="modal fade" id="taskModal" tabindex="-1" role="dialog" aria-labelledby="taskModalLabel"
|
||||||
aria-hidden="true">
|
aria-hidden="true">
|
||||||
<div class="modal-dialog modal-xl" role="document">
|
<div class="modal-dialog modal-xl" role="document">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
|
|
@ -187,12 +190,20 @@ class="fas fa-plus"></i></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div> --}}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- ./card-body -->
|
<!-- ./card-body -->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- ./card card-primary -->
|
<!-- ./card card-primary -->
|
||||||
|
|
||||||
|
|
|
||||||