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

Relatório por EntryPoint

Configurações

  • As consultas configuradas na coluna QUERIES, podem ser removidas dessa coluna e configuradas no entry_point do tipo PHP
{
	"teste": {
		"table": "chave_acesso"
	}
}

Na coluna QUERIES da tabela nfs_reports, pode ser inserido o valor "ENTRY_POINT" ao invés de uma configuração obrigatória como era feito antigamente, isso fará com que o relatório utilize apenas os valores vindos do entry_point {.is-info}

  • O entry_point deve ter a seguinte configuração nas colunas:
  1. FILE_OR_DOMAIN = REPORTS
  2. ACTION = mesmo valor usado no campo NAME da tabela nfs_reports
  3. CODETYPE = PHP
  4. CODE = ver exemplo abaixo:

4.1 - Para debugar o entryPoint pelo Test Code, adicionar as 2 linhas abaixo no inicio do entry_point

$_SESSION['DEBUG_MODE'] = 1;
$this->inputValues = $_SESSION['DEBUG_PARAMS'];

4.2 - Para executar: a. Clicar em Testar b. Abrir o relatório em uma segunda aba e executar c. Voltar no Test Code e clicar em Testar novamente

  • Os filtros serão retornados no campo $this->inputValues Exemplo de retorno para os campos de data:
Array
(
    [inicio] => 01/02/2021
    [inicioIni] => 01/02/2021 00:00:00
    [inicioFim] => 01/02/2021 23:59:59
    [inicioDb] => 2021-02-01
    [inicioIniDb] => 2021-02-01 00:00:00
    [inicioFimDb] => 2021-02-01 23:59:59
    [fim] => 25/08/2021
    [fimIni] => 25/08/2021 00:00:00
    [fimFim] => 25/08/2021 23:59:59
    [fimDb] => 2021-08-25
    [fimIniDb] => 2021-08-25 00:00:00
    [fimFimDb] => 2021-08-25 23:59:59
    [eqp] => 1
    [eqpSqlIn] => 1
    [eqp_fk] => Array
        (
            [0] => 1 :: EQP 1001
        )

)

Os valores retornados podem ser acessados da seguinte maneira:

$inicioIniDb = $this->inputValues['inicioIniDb'] ?? NULL;
$fimFimDb = $this->inputValues['fimFimDb'] ?? NULL;
$eqp = $this->inputValues['eqp'] ?? NULL;

Desta forma o valor poderá ser usado para passar como variável nas consultas

//Consulta na tabela de apontamentos
$listaAptFull = Dao::table('eqp_apt','a')
->select(
	"a.SEQ_DB",
	"a.INI_DH",
	"a.OPER_SEQ_DB",
)
->whereBetween('a.INI_DH', $inicioIniDb, $fimFimDb);
->orderBy('a.INI_DH','ASC')
->get();

A lista com os dados devem ser enviados para o template através do $this->queryData

$this->queryData['apontamento_list'] = $listaApt;

Exemplo completo de entry_point:

//Para debugar o entryPoint pelo Test Code, adicionar as 2 linhas abaixo no inicio do entry_point
//$_SESSION['DEBUG_MODE'] = 1;
//$this->inputValues = $_SESSION['DEBUG_PARAMS'];

//Os filtros serão retornados no campo **$this->inputValues**
$inicioIniDb = $this->inputValues['inicioIniDb'] ?? NULL;
$fimFimDb = $this->inputValues['fimFimDb'] ?? NULL;
$eqp = $this->inputValues['eqp'] ?? NULL;

//Consulta na tabela de apontamentos
$queryBuilder = Dao::table('eqp_apt','a')
->select(
	"a.SEQ_DB",
	"a.SEQ_DB_DEVICE_MASTER_SEQ_DB",
	"a.INI_DH",
	"a.OPER_SEQ_DB",
)
->whereBetween('a.INI_DH', $inicioIniDb, $fimFimDb);
//Caso exista filtro por equipamento
if (isset($eqp)) {
	$queryBuilder		
	->whereIn('a.EQP_SEQ_DB', $eqp);
}
$listaAptFull = $queryBuilder
->orderBy('a.INI_DH','ASC')
->get();

//Adiciona SEQ_DB como indice do array
$listaApt = [];
$listaApt = array_column($listaAptFull,null,'SEQ_DB');

//Pegar o campo OPER_SEQ_DB de cada Apontamento, e agrupar por Equipamento (SEQ_DB)
//Fazer a consulta fora do foreach, para evitar fazer a mesma consulta mais de uma vez
$listaOperFK = array_column($listaAptFull,"OPER_SEQ_DB","OPER_SEQ_DB");

//Retorna a lista com todas as Operações, filtras pelos apontamentos
$listaOperFull = Dao::table('OPER')->select(['SEQ_DB','CODIGO','DESCRICAO'])->whereIn('SEQ_DB', $listaOperFK)->get();
$listaOper = [];
$listaOper = array_column($listaOperFull,null,'SEQ_DB');

foreach ($listaApt as $row) {
	$seqApt = $row['SEQ_DB'];
	//Converter o formato de apresentação da DATA, não fazer a conversão diretamente pela consulta SQL (DAO)
	$listaApt[$seqApt]['DATA'] = date('d/m/Y H:i:s', strtotime($row['INI_DH']));
	
	//Pegar o valor de DISPLAY de um campo do tipo FK. Evitar fazer inner join pela consulta SQL (DAO)
	$oper_row = $listaOper[$row['OPER_SEQ_DB']] ?? null;
	if (!empty($oper_row)) {
		$listaApt[$seqApt]['OPERACAO'] = $oper_row['CODIGO'].' - '.$oper_row['DESCRICAO'];					
	}
}
//A lista com os dados devem ser enviados para o template através do **$this->queryData**
$this->queryData['apontamento_list'] = $listaApt;

Painel

Configurações

Para configurar um painel QIG (Quadro de Indicador Geral) + QII (Quadro de Indicador Individual) através do entry_point, é necessário criar um registro na tabela nfs_qig_panels com os seguintes campos:

O nfs_qig_panels deve ter a seguinte configuração nas colunas:

NAME = usar um valor único que deverá ser usado no entry_point DISPLAY_NAME = Nome do Painel REFRESH_INTERVAL = valor será multiplicado por 20 segundos (ex.: 3 = 60 segundos), usado para definir o tempo de atualização do painel MAIN_TABLE = Tabela que será usada para apresentar o QII (ex.: EQP) SECONDARY_TABLE = Tabela que tem relacionamento direto com a MAIN_TABLE (ex.: EQP_BOLETIM) SCRIPT_PHP = ENTRY_POINT SECONDARY_TABLE_OPTIONS = {} OPTIONS = {"signal": {"online": 30, "standby": 120, "offline":240}} ENABLE = 1

O entry_point deve ter a seguinte configuração nas colunas:

  1. FILE_OR_DOMAIN = PANEL
  2. ACTION = mesmo valor usado no campo NAME da tabela nfs_qig_panels
  3. CODETYPE = PHP
  4. CODE = ver exemplo abaixo:

4.1 - Para debugar o entryPoint pelo Test Code

  • adicionar as 3 linhas abaixo no inicio do entry_point:
$_SESSION['DEBUG_MODE'] = 1;
$dadosPainel = $_SESSION['DEBUG_DATA'];
$mainTable = $_SESSION['DEBUG_RAW_DATA']['main_table'];
  • e remover as linhas:
$dadosPainel = $this->inputValues;
$mainTable = $this->defaultQigRawData['main_table'];

4.2 - Para executar: a. Clicar em Testar b. Abrir o painel em uma segunda aba e executar c. Voltar no Test Code e clicar em Testar novamente

POSIÇÕES [F1 .. F11]

img30.png

  • Nas posições de F1 à F11 (exceto F7), é possível definir: FIELD = Campo LABEL = Descrição do campo que será apresentado antes do valor TOOLTIP = Descrição do campo ao passar o mouse sobre ele COLOR = Cor do campo ICON = Icone do campo (somente para os campos de F8 à F11)
$qii['F1']['LABEL'] = 'Equipamento:';
$qii['F1']['TOOLTIP'] = 'Equipamento';
$qii['F1']['FIELD'] = $mainTable[$index]['CODIGO'];
$qii['F1']['COLOR'] = 'black';
$qii['F8']['ICON'] = 'fa-battery-full';
  • Na posição F7 é possível definir uma imagem do servidor:
$qii['F7'] = 'assets/img/painel/colhedorajd.png';
  • Além das posições de F1 à F11, é possível definir um FOOTER, onde é possível criar um link para uma url
$qii['FOOTER']['FIELD'] = DateUtils::formatFromTable('now','d/m/Y H:i:s');

Campo F12

No F12 é possível utilizar a propriedade CLASS, que aceita receber o valor 'blink-icon', quando essa propriedade é adicionada aplica um efeito de "pisca" no ícone.

  • Exemplos de configuração:
$qii['F12'] = [	
	  'FIELD' => 'Atenção',
	'TOOLTIP' => 'Tempo expirado',
	  'COLOR' => '#000',
 'ICON_COLOR' => '#FF0000', 
       'ICON' => 'fa-exclamation-triangle',
      'CLICK' => "url",
       'COLS' => '',
	  'CLASS' => 'blink-icon'
	];
	$qii['F12'] = ['FIELD' => 'Caution',
		'ICON_COLOR' => '#FF0000',
		'ICON' => 'fa-exclamation',
		'CLASS' => 'blink-icon'
   ];
  • O mínimo de configuração esperada para apresentação do icone é:
$qii['F12'] = ['FIELD' => 'Caution',
	'ICON' => 'fa-exclamation-triangle'
 ];
  • Posição: Campo está posicionado no canto inferior direito do card nos 3 painéis (P1, P2 e Kanban).

_f12.png

SUBTITLE

Por padrão todo painel tem um filtro/legenda por Boletim Fechado

  • Desabilitar legenda:
unset($dadosPainel['SUBTITLE']['BOLETIM_FECHADO']);
  • Inserir nova legenda:
$dadosPainel['SUBTITLE']['PRODUTIVO'] =['color' => "green", 'textColor' => "black", 'subtitle' => "Serviço", 'id' => "PRODUTIVO", 'panel_seq_db' => 1];
  • Adicionar id e cor da legenda no QII
$qii['SUBTITLE']['id'] = 'PRODUTIVO';
$qii['SUBTITLE']['color'] = $dadosPainel['SUBTITLE']['PRODUTIVO']['color'];

ICON

  • Somente para os campos de F8 à F11

Utilizar icones disponíveis em: METRONIC

$qii['F8']['ICON'] = 'fa-battery-full';

ORDEM DO QII

$qii['ORDER'] = 10005;

COLOR

COR DE FUNDO

$qii['BG_COLOR'] = 'yellow';

COR DO CAMPO

$qii['BG_COLOR'] = 'yellow';

É necessário montar um link para o relatório já com os parametros passados no filtro. Veja o vídeo de como pegar a url:

  • Pagar a URL do relatório que deseja apresentar img29.png

  • Montar a URL do relatório, passando os filtros de acordo com o QII

$REPORTS_NAME = 'relatorio_pdf';

$form_default = 'form%5B';
$igual = '%5D=';
$data_inicio = date('d/m/Y');
$data_fim = date('d/m/Y', strtotime('+1 days'));

$inicio_formatado = str_replace("/", "%2F",$data_inicio);
$fim_formatado = str_replace("/", "%2F",$data_inicio);

$filtro_inicio = $form_default.'inicio'.$igual.$inicio_formatado;
$filtro_fim = $form_default.'fim'.$igual.$fim_formatado;

$EQP_SEQ_DB = $mainTable[$index]['SEQ_DB'];
$filtro_eqp = $form_default.'eqp'.$igual.$EQP_SEQ_DB;
$filtro_relatorio = $filtro_inicio.'&'.$filtro_fim.'&'.$filtro_eqp;

$reportLink = "nfsui.newWindow({url:'reports/".$REPORTS_NAME."?$filtro_relatorio'});";

$reportAHref = '<a class="" href="javascript:;"  onclick="'.$reportLink.'">'.$mainTable[$index]['CODIGO'].'</a>';

O link pode ser configurado apenas nas posições FI_LINK ou FOOTER A posição F1 deve ser oculta ao usar o FI_LINK

unset($qii['F1']);

EXEMPLO

  • Exemplo simples de entry_point:
$dadosPainel = $this->inputValues;
$mainTable = $this->defaultQigRawData['main_table'];

foreach ($dadosPainel['QII'] as $index => $qii) {
	$qii['F1']['TOOLTIP'] = 'Código do Equipamento';
	$qii['F1']['FIELD'] = $mainTable[$index]['CODIGO'];	
	
	$qii['F2']['LABEL'] = 'Placa do Equipamento';
	$qii['F2']['TOOLTIP'] = 'Placa';
	$qii['F2']['FIELD'] = $mainTable[$index]['PLACA'];
	
	$dadosPainel['QII'][$index] = $qii;
}
$this->outputValues = $dadosPainel;
  • Exemplo completo de entry_point:
//Habilitar campos abaixo para teste (TestCode)
//$_SESSION['DEBUG_MODE'] = 1;
//$dadosPainel = $_SESSION['DEBUG_DATA'];
//$mainTable = $_SESSION['DEBUG_RAW_DATA']['main_table'];


//Habilitar campos abaixo ao adicionar no entryPoint
$dadosPainel = $this->inputValues;
$mainTable = $this->defaultQigRawData['main_table'];

//Desabilita o legenda de Boletim Fechado
unset($dadosPainel['SUBTITLE']['BOLETIM_FECHADO']);
//Inserir nova legenda
$dadosPainel['SUBTITLE']['PRODUTIVO'] =['color' => "green", 'subtitle' => "Serviço", 'id' => "PRODUTIVO", 'panel_seq_db' => 1];
$dadosPainel['SUBTITLE']['IMPRODUTIVO'] =['color' => "red", 'subtitle' => "Parada", 'id' => "IMPRODUTIVO", 'panel_seq_db' => 1];

//Pegar o campo EQP_APT_FKL de cada Equipamento, e agrupar por Equipamento (SEQ_DB)
$listaDasFKL = array_column($mainTable,"EQP_APT_FKL","SEQ_DB");
//print_r($listaDasFKL);

//Obter apontamentos relacionados ao equipamento através do campo de EQP_APT_FKL(FK do último apontamento)
$apt_list = Dao::table('EQP_APT')->select(['SEQ_DB','TIPO_OPERACAO','INI_DH','EQP_SEQ_DB'])->whereIn('SEQ_DB', $listaDasFKL)->get();
//print_r($apt_list);

//Agrupar apontamentos por Equipamento, retorna apenas o ultimo registro de cada apontamento por equipamento
$apt_array = [];
if(!empty($apt_list)) {
	$apt_array = array_column($apt_list, null,'EQP_SEQ_DB');
}

//Inicia montagem da URL do relatório
$REPORTS_NAME = 'relatorio_pdf';

$form_default = 'form%5B';
$igual = '%5D=';
$data_inicio = date('d/m/Y');
$data_fim = date('d/m/Y', strtotime('+1 days'));

$inicio_formatado = str_replace("/", "%2F",$data_inicio);
$fim_formatado = str_replace("/", "%2F",$data_inicio);

$filtro_inicio = $form_default.'inicio'.$igual.$inicio_formatado;
$filtro_fim = $form_default.'fim'.$igual.$fim_formatado;


//Para cada item do painel (QII)
$qii_array = [];


$qtdEQPComApontamento = 0;
$qtdEQPSemApontamento = 0;
foreach ($dadosPainel['QII'] as $index => $qii) {
	
	//Obtem o SEQ_DB do Equipamento
	$EQP_SEQ_DB = $mainTable[$index]['SEQ_DB'];
	
	//Verifica se o equipamento tem apontamento
	$apt_rec = $apt_array[$EQP_SEQ_DB] ?? null;	
	if(!empty($apt_rec)) {
		$qtdEQPComApontamento ++;
		
		//Cria link para o relatório		
		$filtro_eqp = $form_default.'eqp'.$igual.$EQP_SEQ_DB;
		$filtro_relatorio = $filtro_inicio.'&'.$filtro_fim.'&'.$filtro_eqp;
		
		$reportLink = "nfsui.newWindow({url:'reports/".$REPORTS_NAME."?$filtro_relatorio'});";
		//print_r($reportLink);
		
		//$reportLink = "nfsui.newWindow({url:'reports/".$REPORTS_NAME."?form%5Beqp%5D=".$EQP_SEQ_DB."'});";	
		$reportAHref = '<a class="" href="javascript:;"  onclick="'.$reportLink.'">'.$mainTable[$index]['CODIGO'].'</a>';

		unset($qii['F1']);/*se usar o LINK, remover o campo F1 (só usar link no F1_LINK ou no FOOTER)*/
		$qii['F1_LINK']['TOOLTIP'] = 'Código do Equipamento';
		$qii['F1_LINK']['FIELD'] = $reportAHref;
		
		//Apresenta a descrição do Equipamento
		$qii['F3']['LABEL'] = 'Equipamento:';
		$qii['F3']['TOOLTIP'] = 'Equipamento';
		$qii['F3']['FIELD'] = $mainTable[$index]['DESCRICAO'];
		
		//Apresenta a data do ultimo apontamento relacionado ao equipamento, através do campo FKL
		$qii['F4']['LABEL'] = 'Data:';
		$qii['F4']['TOOLTIP'] = 'Data do último apontamento';
		$qii['F4']['FIELD'] = DateUtils::formatFromTable($apt_rec['INI_DH'],'d/m/Y H:i:s');		
		
		//unset($qii['F5']);
		//unset($qii['F6']);
		
		//Utiliza imagens gravadas no servidor
		$qii['F7'] = 'assets/img/painel/colhedorajd.png';
		$qii['F8']['ICON'] = 'fa-battery-full';
		
		//unset($qii['F9']);
		//unset($qii['F10']);
		//unset($qii['F11']);
		
		if ($apt_rec['TIPO_OPERACAO'] == 1) {
			//SERVIÇO
			//Adiciona cor e id da legenda no QII
			$qii['SUBTITLE']['id'] = 'PRODUTIVO';
			$qii['SUBTITLE']['color'] = $dadosPainel['SUBTITLE']['PRODUTIVO']['color'];
			
			//Cria uma barra e um link 
			$qii['FOOTER']['FIELD'] = '<div style="background-color:#bbffc0;">&nbsp;Ver: '.$reportAHref.'</div>';
			//Altera a cor do fundo
			$qii['BG_COLOR'] = '#bbffc0';
		} else {
			//PARADA
			$qii['SUBTITLE']['id'] = 'IMPRODUTIVO';
			$qii['SUBTITLE']['color'] = $dadosPainel['SUBTITLE']['IMPRODUTIVO']['color'];
			$qii['FOOTER']['FIELD'] = '<div style="background-color:#ffacac;">&nbsp;Ver: '.$reportAHref.'</div>';
			$qii['BG_COLOR'] = '#ffacac';
		}
		//Cria um link 
		//$qii['FOOTER']['FIELD'] = 'Ver: '.$reportAHref;
		
		//Define a ordem do registro
		$qii['ORDER'] = $EQP_SEQ_DB;
		
		
		$qii_array[$index] = $qii;
	} else { 
		$qtdEQPSemApontamento ++;
	}
}
$dadosPainel['QII'] = $qii_array;
$this->outputValues = $dadosPainel; 
$this->indicatorsValues['EQP_COM_APONTAMENTO'] = $qtdEQPComApontamento;
$this->indicatorsValues['EQP_SEM_APONTAMENTO'] = $qtdEQPSemApontamento;
//echo "<pre>";
//print_r($qii_array);
//echo "</pre>";