Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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;