Painel Completo Por Entry Point
Uma terceira opção para criar um Painel é ser feito totalmente por entry point, nesse tipo o Dev tem total controle do que está sendo criado, como:
- Ordenação na forma que achar melhor
- Montar os QII
- Poder otimizar as consultas do painel
Ponto importante nessa configuração é necessário no options ter o seguinte atributo:
{
"panel-full-entry-point": true
}
Se não tiver o panel-full-entry-point ele é false por padrão.
Vou passar um exemplo comentado que foi feito pela Paloma e depois modifiquei alguns pontos para atender todas as condições do painel.
// dados que vem do filtro
$decode = json_decode($this->filters, true);
$equipamento = [];
$tipoEquipamento = [];
$classeOperacional = [];
$atividade = [];
$fazenda = [];
$setor = [];
$frente = [];
// funcão que vai para o core, mas é para monstar os itens do card/qii
function buildItemCard(string $pos, string $tooltip ='', $field, string $label = ''){
$item =[];
$item[$pos]['TOOLTIP'] =$tooltip;
$item[$pos]['FIELD'] =$field;
$item[$pos]['LABEL'] =$label;
return $item;
}
// função para montar os indicadores
function buildIndicatorsCard(string $pos, string $tooltip ='', $field=0 , string $color ='', string $icon = 'fa fa-circle'){
$item =[];
$item[$pos]['TOOLTIP'] =$tooltip;
$item[$pos]['FIELD'] =strval($field);
$item[$pos]['COLOR'] =$color;
$item[$pos]['ICON'] =$icon;
return $item;
}
// função para montar as legendas dos qii
function buildSubtitle(string $color = 'gray', string $textColor = '#fff', string $subtitle = 'sem subtitle', $id = "sem_id", $panel,$total = 1,array $img = []){
$sub =[];
$sub['color'] = $color;
$sub['textColor'] = $textColor;
$sub['subtitle'] = $subtitle;
$sub['id'] = $id;
$sub['panel_seq_db'] = $panel;
$sub['total'] = $total;
if (!empty($img)){
$sub['img']['seqDB']= $img['SEQ_DB'] ?? '';
$sub['img']['tableName']= $img['column'] ?? '';
}
return $sub;
}
// função para montar as legendas que fazem parte do filtro
function buildSubtitleCard(string $color = 'gray',string $subtitle = 'VAZIO', $id = "sem_id", int $panel ){
$sub =[];
$sub['color'] = $color;
$sub['subtitle'] = $subtitle;
$sub['id'] = Utils::transformStringToKebabPattern($id);
$sub['panel_seq_db'] = $panel;
return $sub;
}
// funcão para criar uma nova legenda ou contar se já existe
function addSubtitle(array $subtitles, array $subs, $id){
if(isset($subtitles) && !empty($subtitles[$id])){
$subtitles[$id]['total'] = $subtitles[$id]['total'] + 1;
} else {
$subtitles[$id] = buildSubtitle($subs['color'],'#fff', $subs['subtitle'], $subs['id'], $subs['panel_seq_db']);
}
return $subtitles;
}
// funcão para obter os valores do filtro
function getValueOfFilter(string $key, array $filters): array {
$result = [];
if (isset($filters[$key])){
foreach ($filters[$key]["value"] as $val){
$result[] = $val;
}
}
return $result;
}
// se tiver filtro sendo usado deve mudar para true
$hasFilter = false;
// condição que cria um flag para que se tiver algum filtros
// sendo utilizado marcar ela como true
if (!empty($decode)){
$equipamento = getValueOfFilter('EQUIPAMENTO', $decode);
$tipoEquipamento = getValueOfFilter('TIPO_EQUIPAMENTO', $decode);
$classeOperacional = getValueOfFilter('CLASSE_OPERACIONAL', $decode);
$atividade = getValueOfFilter('ATIVIDADE', $decode);
$fazenda = getValueOfFilter('FAZENDA', $decode);
$setor= getValueOfFilter('SETOR', $decode);
$frente = getValueOfFilter('FRENTE', $decode);
if ( !empty($equipamento) ||
!empty($tipoEquipamento) ||
!empty($classeOperacional) ||
!empty($atividade) ||
!empty($fazenda) ||
!empty($setor) ||
!empty($frente) )
{
$hasFilter = true;
}
}
$subtitles = [];
// subtituir pelo valor do painel que está na nfs_qig_panels
$panelSeqDb = 30;
// subtituir pelo valor do painel que está na nfs_qig_details
$detailSeqDb = 2;
// busca pelo os equipamentos com boletim aberto
$eqp = Dao::table('EQUIPAMENTO','e')
->select(['distinct e.SEQ_DB', 'e.CODIGO','e.FOTO_SEQ_DB','e.FLAG_SATELITAL'])
->leftJoin('e','BOLETIM_MAQUINA','b','e.SEQ_DB = b.EQUIPAMENTO_SEQ_DB')
->leftJoin('b','APONTAMENTO_MAQUINA','a','b.SEQ_DB = a.SEQ_DB_DEVICE_MASTER_SEQ_DB')
->leftJoin('b','FRENTE','f','f.SEQ_DB = b.FRENTE_SEQ_DB')
->where(['e.QIG_DISPLAY'=> 1,'b.ATIVO'=> 1])
->whereIsNull('b.FIM_DH')
->whereIn('e.SEQ_DB', $equipamento)
->whereIn('e.CLASSE_OPERACIONAL_SEQ_DB', $classeOperacional)
->whereIn('e.TIPO_EQUIPAMENTO_SEQ_DB', $tipoEquipamento)
->whereIn('a.ATIVIDADE_SEQ_DB', $atividade)
->whereIn('a.SETOR_SEQ_DB', $setor)
->whereIn('a.FAZENDA_SEQ_DB', $fazenda)
->whereIn('b.FRENTE_SEQ_DB', $frente)
->orderBy('f.DESCRICAO', 'ASC')
->orderBy('e.CODIGO', 'ASC')
->get();
// Se tiver filtro não busca pelos boletins fechados que não estão abertos
if (!$hasFilter){
$openBulletins = array_column($eqp, 'SEQ_DB');
$closedBulletins = Dao::table('EQUIPAMENTO','e')
->select(['distinct e.SEQ_DB', 'e.CODIGO','e.FOTO_SEQ_DB','e.FLAG_SATELITAL'])
->where(['e.QIG_DISPLAY'=> 1,'e.ATIVO'=> 1])
->whereNotIn('e.SEQ_DB', $openBulletins)
->orderBy('e.CODIGO', 'ASC')
->get();
$eqp = array_merge($eqp, $closedBulletins);
}
$newPanelData = [];
$newPanelData['QII'] = [];
$seqDbsEqps = array_column($eqp, 'SEQ_DB');
$boletins = Dao::table('BOLETIM_MAQUINA')
->select([
"INI_DH DATA_ABERTURA_BOLETIM",
"FIM_DH",
"EQUIPAMENTO_SEQ_DB",
"SEQ_DB",
"FRENTE_SEQ_DB"
])
->whereIn('EQUIPAMENTO_SEQ_DB', $seqDbsEqps)
->whereIn('FRENTE_SEQ_DB', $frente)
->whereIsNull('FIM_DH')
->get();
$listaBols = array_column($boletins, null, 'SEQ_DB');
$lastsBols = array_column($boletins, 'SEQ_DB');
$bol_eqp = array_column($boletins, null, 'EQUIPAMENTO_SEQ_DB');
$lastApts = Dao::table('APONTAMENTO_MAQUINA')
->select([
'SEQ_DB',
'SEQ_DB_DEVICE_MASTER_SEQ_DB',
'TIPO_ATIVIDADE',
'INI_DH',
'EQUIPAMENTO_SEQ_DB',
'OPERADOR_SEQ_DB',
'ATIVIDADE_SEQ_DB',
'TIPO_ATIVIDADE',
'SETOR_SEQ_DB',
'FAZENDA_SEQ_DB',
'FRENTE_SEQ_DB',
'OS_SEQ_DB'
])
->whereIn('SEQ_DB_DEVICE_MASTER_SEQ_DB', $lastsBols)
->whereIn('EQUIPAMENTO_SEQ_DB', $equipamento)
->whereIn('ATIVIDADE_SEQ_DB', $atividade)
->whereIn('SETOR_SEQ_DB', $setor)
->whereIn('FAZENDA_SEQ_DB', $fazenda)
->whereIsNull('FIM_DH')
->get();
$fil_frente = array_unique(array_column($bol_eqp, 'FRENTE_SEQ_DB'), SORT_REGULAR);
$apt_eqp = array_column($lastApts, null, 'EQUIPAMENTO_SEQ_DB');
$fil_atividade = array_unique(array_column($lastApts, 'ATIVIDADE_SEQ_DB'), SORT_REGULAR);
$fil_setor = array_unique(array_column($lastApts, 'SETOR_SEQ_DB'), SORT_REGULAR);
$fil_fazenda = array_unique(array_column($lastApts, 'FAZENDA_SEQ_DB'), SORT_REGULAR);
$fil_os = array_unique(array_column($lastApts, 'OS_SEQ_DB'), SORT_REGULAR);
$fil_seqApt = array_column($lastApts,'SEQ_DB');
foreach($listaBols as $key => $bol){
$ltem_apt = 'N';
foreach($apt_eqp as $key1 => $apt){
if($key == $apt['SEQ_DB_DEVICE_MASTER_SEQ_DB'] && $key1 == $bol['EQUIPAMENTO_SEQ_DB']){
$ltem_apt = 'S';
}else{
$ltem_apt = 'N';
}
}
$listaBols[$key]['FLAG_TEM_APT'] = $ltem_apt;
}
$atividade_list = Dao::table('ATIVIDADE')->select(['SEQ_DB','CODIGO','DESCRICAO','QII_COLOR','FLAG_PRODUTIVA'])->all()->get();
$listTasks = array_column($atividade_list, null, 'SEQ_DB');
$setor_list = Dao::table('SETOR')->select(['SEQ_DB','CODIGO','DESCRICAO'])->whereIn('SEQ_DB', $fil_setor)->all()->get();
$lista_setores = array_column($setor_list,null,'SEQ_DB');
$fazenda_list = Dao::table('FAZENDA')->select(['SEQ_DB','CODIGO','DESCRICAO'])->whereIn('SEQ_DB', $fil_fazenda)->all()->get();
$lista_fazendas = array_column($fazenda_list,null,'SEQ_DB');
$frente_list = Dao::table('FRENTE')->select(['SEQ_DB','CODIGO','DESCRICAO'])->whereIn('SEQ_DB', $fil_frente)->all()->get();
$lista_frentes = array_column($frente_list,null,'SEQ_DB');
$osList = Dao::table('OS')->select(['SEQ_DB','CODIGO','DESCRICAO'])->whereIn('SEQ_DB', $fil_os)->all()->get();
$lista_OSs = array_column($osList,null,'SEQ_DB');
$aptTalhao_list = Dao::table('APONTAMENTO_MAQUINA_TALHAO','a')->select(['a.SEQ_DB','a.APONTAMENTO_MAQUINA_SEQ_DB',"a.TALHAO_SEQ_DB"])
->whereIn('a.APONTAMENTO_MAQUINA_SEQ_DB', $fil_seqApt)->get();
$fil_aptsTalhoes = array_unique(array_column($aptTalhao_list, 'TALHAO_SEQ_DB'), SORT_REGULAR);
$talhao_list = Dao::table('TALHAO')->select(['SEQ_DB','CODIGO','DESCRICAO'])->whereIn('SEQ_DB', $fil_aptsTalhoes)->all()->get();
$lista_Talhoes = array_column($talhao_list,null,'SEQ_DB');
$antenaDados_list = Dao::table('EQP_ANTENA_DADOS')->select(['SEQ_DB', 'EQUIPAMENTO_SEQ_DB', 'MAX(DATA_TRANSMISSAO) DATA_TRANSMISSAO','TIPO_COMUNICACAO'])->groupBy('EQUIPAMENTO_SEQ_DB')->get();
$lista_antenaDados = array_column($antenaDados_list,null,'EQUIPAMENTO_SEQ_DB');
$date = DateUtils::getDate(0,'BR');
$apts = Dao::table('APONTAMENTO_MAQUINA')
->select([
'SEQ_DB',
'SEQ_DB_DEVICE_MASTER_SEQ_DB',
'TIPO_ATIVIDADE',
'INI_DH',
'EQUIPAMENTO_SEQ_DB',
'OPERADOR_SEQ_DB',
'ATIVIDADE_SEQ_DB',
'TIPO_ATIVIDADE',
'SETOR_SEQ_DB',
'FAZENDA_SEQ_DB',
'FRENTE_SEQ_DB',
'OS_SEQ_DB'
])
->whereIn('SEQ_DB_DEVICE_MASTER_SEQ_DB', $lastsBols)
->whereIn('EQUIPAMENTO_SEQ_DB', $equipamento)
->whereIn('ATIVIDADE_SEQ_DB', $atividade)
->whereIn('SETOR_SEQ_DB', $setor)
->whereIn('FAZENDA_SEQ_DB', $fazenda)
->whereIn('FRENTE_SEQ_DB', $frente)
->whereDate('INI_DH', $date)
->get();
$aux = [];
foreach($apts as $apt){
if(!array_key_exists($apt['EQUIPAMENTO_SEQ_DB'],$aux)){
$aux[$apt['EQUIPAMENTO_SEQ_DB']]=[
'WORKING' => [],
'NOT_WORKING' => []
];
}
if($apt['TIPO_ATIVIDADE'] == 1){
$aux[$apt['EQUIPAMENTO_SEQ_DB']]['WORKING'][] = $apt['ATIVIDADE_SEQ_DB'];
}elseif($apt['TIPO_ATIVIDADE'] == 0){
$aux[$apt['EQUIPAMENTO_SEQ_DB']]['NOT_WORKING'][] = $apt['ATIVIDADE_SEQ_DB'];
}
}
// busca os ultimos apontamentos
$lastAptsByBol = [];
foreach($lastApts as $apt) {
$seqBol = $apt['SEQ_DB_DEVICE_MASTER_SEQ_DB'];
if (empty($lastAptsByBol[$seqBol])){
$lastAptsByBol[$seqBol] = $apt;
} else {
$lastDate = DateTime::createFromFormat('Y-m-d H:i:s', $lastAptsByBol[$seqBol]['INI_DH']);
$currDate = DateTime::createFromFormat('Y-m-d H:i:s', $apt['INI_DH']);
if ($lastDate->getTimestamp() < $currDate->getTimestamp()){
$lastAptsByBol[$seqBol] = null;
$lastAptsByBol[$seqBol] = $apt;
}
}
}
$lastElement = 0;
$count = 0;
$totAberto = 0;
$totFechado = 0;
// Loop importante onde vai montar o QII
foreach ($eqp as $e) {
$qii = [];
$working = 0;
$not_working = 0;
$apt = $apt_eqp[$e['SEQ_DB']] ?? null;
$bol = $bol_eqp[$e['SEQ_DB']] ?? null;
// ponto importante onde o qii devem ter os campos abaixo
$qii['QII_SEQ_DB'] = $e['SEQ_DB'];
$qii['PANEL_SEQ_DB'] = $panelSeqDb;
$qii['DETAILS_SEQ_DB'] = $detailSeqDb;
$qii['ORDER'] = $count++;
$qii['DISPLAY'] = true;
$qii['MAIN_TABLE'] = 'EQUIPAMENTO'; // Aqui podemos ter a main table, só na configuração do banco que não
$qii['MESSAGE_TABLE'] = 'APONTAMENTO_MAQUINA_MENSAGEM';
// Obter o total de mensagens não lidas, os parametros são:
// seqDb da entidade do qii, logo se for um painel por equipamento, vai ser o seq_Db dele
// Nome da tabela que é vai ser usando para obter os dados de mensagem
// Nome da tabela que recebe mensagens do mobile
$qii['MESSAGE'] = $this->panelFactory->getTotalMessage($e['SEQ_DB'], 'EQUIPAMENTO', 'APONTAMENTO_MAQUINA_MENSAGEM');
$qii['MAPS'] = true; // Lembrando que tem que ter a configuração de tracking no entry point e lat/long no Equipamento ou dono do painel
$qii['UPDATED'] = false;
$qii["COMMSIGNAL"]= "signal-offline";
$qii += buildItemCard('F1', 'Equipamento', $e['CODIGO']);
// Importante, sempre trazer a imagem numa consulta isolado ao invés de trazer na consulta principal
$image = ImageService::getThumbnailFromUpload($e['FOTO_SEQ_DB']);
if (isset($image) && !empty($image)) {
$qii['F7'] = $image;
} else {
$qii["F7"] = "assets/img/painel/colhedora.png";
}
// parte importante preenche alguns dados dentro do QII somente se tiver apontamento com boletim aberto
if(!empty($apt)){
// Aqui dentro vcs podem colocar a lógica necessário para montar os dados do qii
// Tente sempre tratar os valores nulos ou chaves que não existem
$ati = isset($apt['ATIVIDADE_SEQ_DB']) && array_key_exists($apt['ATIVIDADE_SEQ_DB'], $listTasks) ? $listTasks[$apt['ATIVIDADE_SEQ_DB']] : null;
$set = isset($apt['SETOR_SEQ_DB']) ? $lista_setores[$apt['SETOR_SEQ_DB']] : null;
$faz = isset($apt['FAZENDA_SEQ_DB']) ? $lista_fazendas[$apt['FAZENDA_SEQ_DB']] : null;
$fre = isset($apt['FRENTE_SEQ_DB']) ? $lista_frentes[$bol['FRENTE_SEQ_DB']] : null;
$separador = null;
$satelitalComunication = isset($apt['EQUIPAMENTO_SEQ_DB']) ? ($e['FLAG_SATELITAL'] == true ? $lista_antenaDados[$apt['EQUIPAMENTO_SEQ_DB']] : null) : null;
$dateApt = isset($apt['INI_DH']) ? DateUtils::formatFromTable($apt['INI_DH'],'d/m/Y H:i:s') : null;
$talhoes = null;
foreach($aptTalhao_list as $aptTalhao){
if(isset($apt['SEQ_DB']) && $apt['SEQ_DB'] == $aptTalhao['APONTAMENTO_MAQUINA_SEQ_DB']){
$talhaoApontado = $lista_Talhoes[$aptTalhao['TALHAO_SEQ_DB']] ?? null;
if(!empty($talhaoApontado)){
$talhoes = !empty($talhoes) ? $talhoes.'::'.$talhaoApontado['CODIGO'] : $talhaoApontado['CODIGO'];
}
}
}
$atividade = $ati ? $ati['CODIGO'].'::'.$ati['DESCRICAO'] : "";
$frente = $fre ? $fre['DESCRICAO'] : "";
$setor = $set ? $set['CODIGO'].'::'.$set['DESCRICAO'] : "";
$fazenda = $faz ? $faz['CODIGO'].'::'.$faz['DESCRICAO'] : "";
$separador = !empty($set) && !empty($faz) ? ' | ' : "";
// buildItemCard é bastente usando para montar os valores do F1, F2, ...F7
$qii += buildItemCard('F2', 'Frente de Trabalho', $frente, 'Módulo: ');
$qii += buildItemCard('F3', 'Projeto', $fazenda.$separador.$setor, 'Projeto'.' | '.'Setor:');
$qii += buildItemCard('F4', 'Up', $talhoes, 'Up: ');
$qii += buildItemCard('F5', 'Operação', $atividade, 'Operação: ');
$qii += buildItemCard('F6', 'Data do último apontamento', $dateApt, 'Apontado em:');
if(!empty($satelitalComunication)){
$qii['TIME_LAST_NOTE'] = $satelitalComunication['DATA_TRANSMISSAO'];
}
$subtitleID = $ati['DESCRICAO'] ?? "vazio";
$typeTask = $apt['TIPO_ATIVIDADE'] ?? 3;
if($typeTask == 1){
$color = $ati['QII_COLOR'] ?? ($ati['FLAG_PRODUTIVA'] == true ? '#05ed38' : '#f50505');
}elseif($typeTask == 0){
$color = $ati['QII_COLOR'] ?? ($ati['FLAG_PRODUTIVA'] == false ? '#f50505' : '#05ed38');
}
$working =0; //isset($aux[$e['SEQ_DB']]) ? count($aux[$e['SEQ_DB']]['WORKING']) : 0;
$qii += buildIndicatorsCard('F8', 'Produtiva', $working, 'green');
$not_working = 0;
$not_working = 1;//isset($aux[$e['SEQ_DB']]) ? count($aux[$e['SEQ_DB']]['NOT_WORKING']) : 0;
$qii += buildIndicatorsCard('F9', 'Improdutiva', $not_working, 'red');
$total = $working+$not_working;
$qii += buildIndicatorsCard('F11', 'Totalizador', $total, 'blue');
}else{
// Se tem boletim e não tem apontamento o turno do equipamento ou outro objeto está aberto
// Se não ele está fechado
if(!empty($bol)){
$atividade = 'Boletim Aberto';
$subtitleID = 'Boletim Aberto';
$color = '#C09B28';
$totAberto++;
}else{
$atividade = 'Boletim Fechado';
$subtitleID = 'Boletim Fechado';
$color = '#3C3C3C';
$totFechado++;
}
}
// Importante parte para montar as legendas do QII e do QIG
$qii['SUBTITLE'] = buildSubtitleCard($color, $atividade, $subtitleID, $panelSeqDb);
$subtitles = addSubtitle($subtitles, $qii['SUBTITLE'],$subtitleID);
$newPanelData['QII'][$e['SEQ_DB']] = $qii;
$lastElement = $e['SEQ_DB'];
}
if (!empty($eqp)){
$aptFull = DAO::table('APONTAMENTO_MAQUINA', 'a')
->select(['SUM(if(a.FIM_DH is not null, a.INI_FIM_DIFF_SEC, (NOW() - a.INI_DH))) TOTAL',
'SUM(if(atv.FLAG_MANUTENCAO = 1,if(a.FIM_DH is not null, a.INI_FIM_DIFF_SEC, (NOW() - a.INI_DH)),0)) TOTAL_MANUTENCAO',
'SUM(if(atv.FLAG_PRODUTIVA = 1,if(a.FIM_DH is not null, a.INI_FIM_DIFF_SEC, (NOW() - a.INI_DH)),0)) TOTAL_PRODUTIVA',
'SUM(if(atv.FLAG_PRODUTIVA = 0 AND ga.FLAG_PARADA_PROCESSO = 1, if(a.INI_FIM_DIFF_SEC IS NULL, TIMESTAMPDIFF(SECOND,a.INI_DH, NOW()), a.INI_FIM_DIFF_SEC),0))TOTAL_PROCESSO',
'SUM(if(atv.FLAG_PRODUTIVA = 0 AND ga.FLAG_PARADA_OPERACIONAL = 1, if(a.INI_FIM_DIFF_SEC IS NULL, TIMESTAMPDIFF(SECOND,a.INI_DH, NOW()), a.INI_FIM_DIFF_SEC),0))TOTAL_OPERACIONAL'
])
->innerJoin('a','BOLETIM_MAQUINA','b','a.SEQ_DB_DEVICE_MASTER_SEQ_DB = b.SEQ_DB')
->innerJoin('a', 'EQUIPAMENTO', 'e', 'a.EQUIPAMENTO_SEQ_DB = e.SEQ_DB')
->innerJoin('a', 'ATIVIDADE', 'atv', 'a.ATIVIDADE_SEQ_DB = atv.SEQ_DB')
->innerJoin('a', 'GRUPO_ATIVIDADE', 'ga', 'a.GRUPO_ATIVIDADE_SEQ_DB = ga.SEQ_DB')
->where(['atv.FLAG_CALCULO_INDICADOR' => 1,'e.QIG_DISPLAY'=> 1,'b.ATIVO'=> 1,'a.ATIVO'=> 1])
->whereIsNull('b.FIM_DH')->get();
$totalDiff = 0;
$totalManut = 0;
$totalProd = 0;
$totalProcesso = 0;
$totalOperacional = 0;
foreach($aptFull as $aptTotal){
$totalDiff += $aptTotal['TOTAL'];
$totalManut += $aptTotal['TOTAL_MANUTENCAO'];
$totalProd += $aptTotal['TOTAL_PRODUTIVA'];
$totalProcesso += $aptTotal['TOTAL_PROCESSO'];
$totalOperacional += $aptTotal['TOTAL_OPERACIONAL'];
}
$dm = ($totalDiff - $totalProcesso) > 0 ? ((($totalDiff - $totalProcesso) - $totalManut)/($totalDiff - $totalProcesso))*100 : 0;
$eo = ($totalDiff - $totalProcesso - $totalManut) > 0 ? (($totalDiff - $totalProcesso - $totalManut - $totalOperacional) / ($totalDiff - $totalProcesso - $totalManut))*100 : 0;
$tu = ($totalDiff - $totalProcesso) > 0 ? (($totalDiff - $totalProcesso - $totalManut - $totalOperacional) / ($totalDiff - $totalProcesso))*100 : 0;
$newPanelData['QII'][$lastElement]['INDICATORS_OPTIONS']['DISPONIBILIDADE_MECANICA'] = $dm;
$newPanelData['QII'][$lastElement]['INDICATORS_OPTIONS']['EFICIENCIA_OPERACIONAL'] = $eo;
$newPanelData['QII'][$lastElement]['INDICATORS_OPTIONS']['TAXA_UTILIZACAO'] = $tu;
}
$newPanelData['MAIN_TABLE'] = 'EQUIPAMENTO';
$newPanelData['MESSAGE_TABLE'] = 'APONTAMENTO_MAQUINA_MENSAGEM';
$newPanelData['SUBTITLE'] = $subtitles;
$this->outputValues = $newPanelData;