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:
- FILE_OR_DOMAIN =
REPORTS
- ACTION = mesmo valor usado no campo NAME da tabela nfs_reports
- CODETYPE =
PHP
- 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:
- FILE_OR_DOMAIN =
PANEL
- ACTION = mesmo valor usado no campo NAME da tabela nfs_qig_panels
- CODETYPE = PHP
- 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]
- 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).
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
ecor
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';
LINK PARA RELATÓRIO
É 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
-
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;"> 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;"> 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>";