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

Indicadores QII

An image

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;