Indicadores QII
Foi criado os indicadores para cada QII do painel.
Pode ser configurado por enquanto até 4 indicadores e cada indicador tem 4 campos que são:
- FIELD: Nome do Apelido que foi criado no Query Builder, esse valor também será exibido ao lado ícone.
- ICON: Icone de acordo com icon awesome Galeria de Ícones.
- TOOLTIP: Uma legenda.
- COLOR: Cor do ícone e do texto, as opções podem ser encontradas em Color Library.
Sua configuração é parecida com a dos indicadores do painel, basta no query builder colocar o valor que queria que seja exibido, esse valor deve ter um apelido igual ao F8 até F11 do display fields.
Ex.:
DISPLAY_FIELDS
...
"F8": [
{
"FIELD": "NOT_WORKING",
"ICON": "fa-circle",
"TOOLTIP": "Em Perda",
"COLOR": "red",
"VALUE_DEFAULT": "00:00"
}
],
"F9": [
{
"FIELD": "PAUSE",
"ICON": "fa-pause",
"TOOLTIP": "Em Almoço",
"COLOR": "blue"
}
],
"F10": [
{
"FIELD": "WORKING",
"ICON": "fa-check-square-o",
"TOOLTIP": "Em Serviço",
"COLOR": "#1dff5d"
}
],
"F11": [
{
"FIELD": "DO_NOTHING",
"ICON": "fa-circle-o",
"TOOLTIP": "Sem Apontamento",
"COLOR": "yellow-crusta"
}
...
- VALUE_DEFAULT : Caso o valor seja nulo irá exibir o valor padrão se estiver configurado, caso o mesmo não esteja configurado irá exibir zero. O valor default é útil quando o FIELD é valor em horas, então pode ser configurado o valor padrão como 00:00 ao invés de 0.
QUERY_BUILDER
{
"QUERY_BUILDER": {
"main_table": {
"select": [
"FUNCIONARIO.seq_db SEQ_DB",
"FUNCIONARIO.cracha CRACHA"
],
"from": "FUNCIONARIO FUNCIONARIO",
"where": [
"FUNCIONARIO.QIG_DISPLAY = 1"
],
"group_result_by": "SEQ_DB",
"order_by": [
[
"FUNCIONARIO.CRACHA",
"ASC"
]
]
},
"secondary_table": {
"select": [
"IF(BOLETIM_RH.FIM_DH IS NULL, 1, 0) DAY_OFF",
"BOLETIM_RH.FIM_DH FIM_DH",
"BOLETIM_RH.FUNCIONARIO_SEQ_DB",
"FUNCIONARIO.NOME NOME",
"FUNCIONARIO.FOTO_SEQ_DB FOTO_SEQ_DB",
"BOLETIM_RH.SEQ_DB BOLETIM_RH_SEQ_DB"
],
"from": "BOLETIM_RH",
"inner_join": [
[
"BOLETIM_RH",
"FUNCIONARIO",
"FUNCIONARIO",
"BOLETIM_RH.FUNCIONARIO_SEQ_DB = FUNCIONARIO.SEQ_DB"
]
],
"left_join": [
[
"FUNCIONARIO",
"RESPONSAVEL",
"RESPONSAVEL",
"FUNCIONARIO.RESPONSAVEL_SEQ_DB = RESPONSAVEL.SEQ_DB"
]
],
"where": [
"BOLETIM_RH.FIM_DH is NULL",
"FUNCIONARIO.RESPONSAVEL_SEQ_DB IN (:responsavel)",
"RESPONSAVEL.GERENCIA_SEQ_DB IN (:gerencia)"
],
"group_result_by": "FUNCIONARIO_SEQ_DB"
},
"additional_tables": {
"apontamento_rh": {
"select": [
"(select (sum(time_to_sec( timeDIFF(IF(rh.fim_dh IS NULL or rh.fim_dh = '', NOW() , rh.fim_dh), rh.ini_dh)))) from app_apontamento_rh rh inner join app_operacao o on o.SEQ_DB = rh.OPERACAO_SEQ_DB where rh.SEQ_DB_DEVICE_MASTER_SEQ_DB = APONTAMENTO_RH.SEQ_DB_DEVICE_MASTER_SEQ_DB and o.FLAG_PRODUTIVA =1 ) as horasProdutivas",
"(select (sum(time_to_sec( timeDIFF(IF(rh.fim_dh IS NULL or rh.fim_dh = '', NOW() , rh.fim_dh), rh.ini_dh)))) from app_apontamento_rh rh inner join app_operacao o on o.SEQ_DB = rh.OPERACAO_SEQ_DB where rh.SEQ_DB_DEVICE_MASTER_SEQ_DB = APONTAMENTO_RH.SEQ_DB_DEVICE_MASTER_SEQ_DB and o.FLAG_PRODUTIVA =0 ) as horasImprodutivas",
" (((select (sum(time_to_sec( timeDIFF(IF(rh.fim_dh IS NULL or rh.fim_dh = '', NOW() , rh.fim_dh), rh.ini_dh)))) from app_apontamento_rh rh inner join app_operacao o on o.SEQ_DB = rh.OPERACAO_SEQ_DB where rh.SEQ_DB_DEVICE_MASTER_SEQ_DB = APONTAMENTO_RH.SEQ_DB_DEVICE_MASTER_SEQ_DB and o.FLAG_PRODUTIVA =1 ) - (select (sum(time_to_sec( timeDIFF(IF(rh.fim_dh IS NULL or rh.fim_dh = '', NOW() , rh.fim_dh), rh.ini_dh)))) from app_apontamento_rh rh inner join app_operacao o on o.SEQ_DB = rh.OPERACAO_SEQ_DB where rh.SEQ_DB_DEVICE_MASTER_SEQ_DB = APONTAMENTO_RH.SEQ_DB_DEVICE_MASTER_SEQ_DB and o.FLAG_PRODUTIVA =0 )) / (select (sum(time_to_sec( timeDIFF(IF(rh.fim_dh IS NULL or rh.fim_dh = '', NOW() , rh.fim_dh), rh.ini_dh)))) from app_apontamento_rh rh inner join app_operacao o on o.SEQ_DB = rh.OPERACAO_SEQ_DB where rh.SEQ_DB_DEVICE_MASTER_SEQ_DB = APONTAMENTO_RH.SEQ_DB_DEVICE_MASTER_SEQ_DB ) * 100 )eficiencia ",
"APONTAMENTO_RH.SEQ_DB SEQ_DB",
"APONTAMENTO_RH.INI_DH INI_DH",
"APONTAMENTO_RH.FIM_DH APT_FIM_DH",
"concat(OPERACAO.CODIGO, ' - ', OPERACAO.DESCRICAO) OPERACAO",
"OPERACAO.QII_COLOR QII_COLOR",
"APONTAMENTO_RH.SEQ_DB_DEVICE_MASTER_SEQ_DB BOLETIM_RH_SEQ_DB",
"APONTAMENTO_RH.TIPO_APONTAMENTO TIPO_APONTAMENTO",
"(select COUNT(rh.SEQ_DB) from app_apontamento_rh rh inner join app_operacao o on o.SEQ_DB = rh.OPERACAO_SEQ_DB where rh.SEQ_DB_DEVICE_MASTER_SEQ_DB = APONTAMENTO_RH.SEQ_DB_DEVICE_MASTER_SEQ_DB and o.FLAG_PRODUTIVA =1 ) as WORKING",
"(select concat (COUNT(rh.SEQ_DB), ' %') from app_apontamento_rh rh inner join app_operacao o on o.SEQ_DB = rh.OPERACAO_SEQ_DB where rh.SEQ_DB_DEVICE_MASTER_SEQ_DB = APONTAMENTO_RH.SEQ_DB_DEVICE_MASTER_SEQ_DB and o.FLAG_PRODUTIVA =0 ) as NOT_WORKING",
"0 as PAUSE",
"0 as DO_NOTHING"
],
"from": "APONTAMENTO_RH APONTAMENTO_RH",
"where": [
"APONTAMENTO_RH.OPERACAO_SEQ_DB IN (:operacao)"
],
"left_join": [
[
"APONTAMENTO_RH",
"OPERACAO",
"OPERACAO",
"OPERACAO.SEQ_DB = APONTAMENTO_RH.OPERACAO_SEQ_DB"
],
[
"APONTAMENTO_RH",
"CONTRATO",
"CONTRATO",
"CONTRATO.SEQ_DB = APONTAMENTO_RH.CONTRATO_SEQ_DB"
]
],
"group_result_by": "BOLETIM_RH_SEQ_DB"
}
}
}
}
Intervalo de Atualização
O card atualiza a cada minuto por padrão, caso deseja alterar esse valor basta adicionar a chave interval no json, seu valor é em milisegundos, lembrando que cada segundo corresponde a mil milisegundos
1s = 1000ms
Exemplo de uso
No caso abaixo a atualização está para ser feita a cada 2 minutos.
{
"osIntegracao": {
"label": "OS's com Faturamento liberado",
"color": "",
"icon": "fa fa-signal",
"display": "[result]",
"interval" : "120000",
"decimalPlace": "2",
"queryBuilder": {
"osIntegracao": {
"select": [
"count(os.seq_db) result"
],
"from": "os os",
"inner_join": [
[
"os",
"status_os",
"st",
"st.SEQ_DB = os.STATUS_OS_SEQ_DB"
],
[
"os",
"cliente",
"c",
"c.SEQ_DB = os.CLIENTE_SEQ_DB"
]
],
"where": [
"st.DESCRICAO in ('Liberada Faturamento')"
]
}
}
}
}
Indicador Relatório
O indicador pode servir de link para seu relatório, se tiver um indicador que exibe a quantidade de Ordens de Serviço que estão no estado de Aguardando Faturamento, ao configurar o relatório e clicar no indicador vai levar para um tela onde é possível mostrar as colunas, Código da OS, Nome do Cliente, Estado da OS, Técnico, entre outras informações.
Funcionalidade do Relatório:
- Imprimir
- Exportação PDF/Excel
- Colunas podem se tornar link para outros lugares do sistema como por exemplo edição do crud.
Essa configuração é feita em duas partes primeiro o NFS Query Builder, no caso a chave deve chamar queryBuilderData, é o query onde tratá todas as colunas necessárias, exemplo:
"queryBuilderData": {
"osIntegracao": {
"select": [
"os.seq_db seq_db",
"os.codigo Codigo",
"c.DESCRICAO Cliente",
"st.DESCRICAO Status"
],
"from": "os os",
"inner_join": [
[
"os",
"status_os",
"st",
"st.SEQ_DB = os.STATUS_OS_SEQ_DB"
],
[
"os",
"cliente",
"c",
"c.SEQ_DB = os.CLIENTE_SEQ_DB"
]
],
"where": [
"st.DESCRICAO in ('Liberada Faturamento')"
]
}
}
Dentro do queryBuilderData o nome da query deve ser o mesmo do indicador por questões de relacionamento.
O segundo passo é configurar o relatório, para isso foi criada a chave report, dentro dela teremos displayColumns que é um array das colunas que devem ser mostradas no relatório, se não for configurada vai mostrar todas. A outra chave é links, onde é necessário passar o nome da coluna que deseja o link junto com o link propriamente configurado.
No link se quiser adicionar uma variável no endereço basta colocar entre porcentagem assim,%seq_db%, supode que o nome da coluna seja seq_db, se fosse Código, seria %Código% e etc.
É possível passar um field action (Botão de Ação) dentro da configuração do relatório, a chave fieldAction dentro da chave report, nela é passado o nome da coluna que vai exibir e o NAME do field action.
Exemplo de acordo com a consulta anterior, só desejamos exibir as colunas Codigo, Cliente e Status e na coluna Código terá um link direcionando a edição da OS:
"report":{
"displayColumns": [
"Codigo",
"Cliente",
"Status"
],
"links" : {
"Codigo" : "/t/os/edit/%seq_db%"
},
"fieldAction":{
"Integrar" : "INDICATOR_FAT"
}
}
Tabela nfs_qig_details:
{.align-center}
- Crie ou duplique uma linha;
- A coluna PANEL_QIG_SEQ_DB faz conexão com a tabela nfs_qig_panels (as chaves tem que ser a mesma);
- Na coluna DISPLAY_NAME (que será o nome que aparece no menu lateral), adicione o nome adequado;
- A coluna MAIN_TABLE_OPTIONS exibe as informações no cabeçalho da Tela de Detalhes;
- A coluna SECONDARY_TABLE_OPTIONS exibe as informações no cabeçalho do bloco diário da Tela de Detalhes;
- A coluna ADDITIONAL_TABLES exibe informações do apontamento do item dentro do bloco diário;
- A coluna FILTERS permite criar um filtro dentro da Tela de Detalhes.
MAIN_TABLE_OPTIONS
{.align-center}
Exemplo de preenchimento:
{
"TABLE": "EQP",
"FILTER": "",
"ORDER": "",
"DISPLAY_FIELDS": [
"CODIGO",
"DESCRICAO",
"EQP_CLASSE_FK",
"EQP_MARCA_FK",
"EQP_MODELO_FK"
]
}
SECONDARY_TABLE_OPTIONS
{.align-center}
Exemplo de preenchimento:
{
"TABLE": "EQP_BOLETIM",
"FILTER": "FIM_DH IS NULL",
"ORDER": "INI_DH DESC",
"DISPLAY_FIELDS": [
"INI_DH",
"FIM_DH",
"FUNCIONARIO_FK"
]
}
ADDITIONAL_TABLES
{.align-center}
Exemplo de preenchimento:
{
"TABLES": [{
"NAME": "EQP_APT",
"FILTER": "",
"ORDER": "INI_DH ASC",
"DISPLAY_FIELDS": [
"FIM_DH",
"INI_FIM_DIFF_STR",
"HR_MARTE",
"HR_MARTE_FIM",
"MEDICAO_GE",
"MEDICAO_GE_FINAL",
"PERDA_FK",
"EQP_OS_FK",
"ENCARREGADO_FK",
"FASE_CICLO_FK",
"EQP_MATERIAL_FK"
]
},
{
"NAME": "EQP_APT_PRODUCAO",
"FILTER": "",
"ORDER": "INI_DH ASC",
"DISPLAY_FIELDS": [
"EQP_OS_FK",
"PRODUCAO",
"EQP_MATERIAL_FK"
]
}]
}
FILTERS
{.align-center}
Exemplo de preenchimento:
{
"inicio": {
"type": "Date",
"options": {
"label": "De",
"required": false,
"attr": {
"data-filter": "EQP_BOLETIM.INI_DH"
}
}
},
"fim": {
"type": "Date",
"options": {
"label": "Até",
"required": false,
"attr": {
"data-filter": "EQP_BOLETIM.INI_DH"
}
}
}
}
Tabela nfs_entry_point:
- Crie ou duplique uma linha;
- Na coluna FILE_OR_DOMAIN informe a qual domínio ele pertence (PANEL);
- Na coluna ACTION adicione o nome que foi inserido na tabela nfs_qig_panels no campo NAME;
- Na coluna CODE é inserido o código de execução dos valores apresentados nos quadros;
- Na coluna CODE_TYPE informa a linguagem do código utilizado na coluna CODE.
CODE
Exemplo de preenchimento:
$dadosPainel = $this->inputValues;
$countYM = 0;
$countPD = 0;
$countPDF = 0;
$mainTable = $this->defaultQigRawData['main_table'];
foreach ($dadosPainel['QII'] as $index => $qii) {
$equipamento = $mainTable[$index][0];
if($equipamento['STATUS'] == 'Y_M')
{
$countYM++;
}
if($qii['SUBTITLE']['color'] == '#FFFF00')
{
$countPD++;
}
else
$countPDF++;
$qii['F4']['FIELD'] = 'Status: '.$equipamento['STATUS'];
$dadosPainel['QII'][$index] = $qii;
}
$this->outputValues = $dadosPainel;
$this->indicatorsValues['Y_M'] = $countYM;
$this->indicatorsValues['COM_PD'] = $countPD;
$this->indicatorsValues['BOLETIM_FECHADO'] = $countPDF;