Painel MO
*Recurso disponivel em homol - fase de testes
Sobre
Painel possibilita visualizar informações dos boletins abertos e seus apontamentos.
Requisitos e configurações
O Painel MO necessita de uma tabela auxiliar que vai ajudar na questão do desempenho, ao invés de buscarmos dentro da tabela mo_boletim onde teoricamente teríamos uma consulta mais lenta por se tratar de uma tabela bem populada vamos buscar os boletins abertos nessa tabela auxiliar que terá apenas o registro do último boletim aberto de cada encarregado.
Essa tabela auxiliar funciona da seguinte forma, a cada boletim aberto por um encarregado essa tabela é atualizada para termos sempre os dados atualizados dos ultimos boletins.
Abaixo temos o SQL para criação da tabela e seus campos via tabela nfs_core_ds_tabela
e nfs_core_ds_tabela_campo
:
INSERT INTO nfs_core_ds_tabela
(NOME, TABELA_REAL, DESCRICAO, UNQ, DISPLAY, TIPO, MOBILE_TABLE, MOBILE_MESSAGE, MOBILE_MESSAGE_FK, FILTRO_USER, MAX_ROWS_WO_FILTER, `OPTIONS`, ORDER_BY, INDICATORS)
VALUES('MO_BOLETIM_ENCARREGADO', 'APP_MO_BOLETIM_ENCARREGADO', 'Último boletim', NULL, 'SEQ_DB', 1, 0, 0, NULL, 0, 1000, NULL, NULL, NULL);
INSERT INTO nfs_core_ds_tabela_campo
(TABELA_NOME, NOME, SEQ, SYS, SEND_XMOVA, GRID, GRID_MOBILE, DESCRICAO, DESCRICAO_RESUMIDA, TIPO, OBRIGATORIO, TAMANHO, TAMANHO_DECIMAL, MASCARA, INSERT_UPDATE, DISABLED, HINT, LINK, VALIDACAO, OPCOES, VALOR_DEFAULT, VALIDACAO_VIEW, FILTRO_VIEW, TOOLTIP_MESSAGE, PROPERTIES)
VALUES('MO_BOLETIM_ENCARREGADO', 'BOLETIM', NULL, 0, 1, 1, 1, 'Seq Boletim', 'Seq Boletim', 'FK', 1, NULL, NULL, NULL, 'IU', '0', NULL, 'MO_BOLETIM', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO nfs_core_ds_tabela_campo
(TABELA_NOME, NOME, SEQ, SYS, SEND_XMOVA, GRID, GRID_MOBILE, DESCRICAO, DESCRICAO_RESUMIDA, TIPO, OBRIGATORIO, TAMANHO, TAMANHO_DECIMAL, MASCARA, INSERT_UPDATE, DISABLED, HINT, LINK, VALIDACAO, OPCOES, VALOR_DEFAULT, VALIDACAO_VIEW, FILTRO_VIEW, TOOLTIP_MESSAGE, PROPERTIES)
VALUES('MO_BOLETIM_ENCARREGADO', 'ENCARREGADO', NULL, 0, 1, 1, 1, 'Seq Encarregado', 'Seq Encarregado', 'FK', 1, NULL, NULL, NULL, 'IU', '0', NULL, 'EFETIVO_FUNCIONARIO', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
Configs
Parametros nfs_core_par_parametros
INSERT INTO nfs_homol_civilmaster_mo_construmobil.nfs_core_par_parametros
(EMPRESA, FILIAL, `LOCAL`, NOME, CONTEUDO, TIPO)
VALUES(9999, 9999, 9999, 'PAINEL_MO', '{
"ENABLE": true,
"BOLETIM_TABLE": "MO_BOLETIM",
"BOLETIM_ENTITY_KEY": "EFETIVO_FUNCIONARIO_SEQ_DB",
"STATUS_TABLE": {
"ALIAS": "mo_boletim_encarregado",
"NAME": "app_mo_boletim_encarregado",
"BOLETIM_FIELD": "BOLETIM_SEQ_DB",
"ENTITY_FIELD": "ENCARREGADO_SEQ_DB",
"ENTITY_KEY": "EFETIVO_FUNCIONARIO_SEQ_DB"
}
}', 1);
Tabela de configuração dos paineis MO
Na tabela nfs_mo_panels
poderão ser criados multiplos painéis, temos alguns parametros iniciais que precisam ser configurados para o funcionamento.
MAIN_TABLE
e SECONDARY_TABLE
Usados para identificar as tabelas principais do painel. Como exemplo estamos usando a estrutura da civilmaster-mo
onde MAIN_TABLE
é app_efetivo_funcionario
e SECONDARY_TABLE
é app_mo_boletim
.
RELATIONSHIPS
Guarda um json com as tabelas utilizadas categorizadas e seus respectivos campos que são utilizados no recurso.
- Exemplo:
{
"TABLE_MAIN": {
"NAME": "app_efetivo_funcionario",
"FIELDS": {
"NOME": "NOME",
"FUNCAO": "EFETIVO_FUNCAO_SEQ_DB",
"FLAG": "FLAG_ENCARREGADO",
"QDISPLAY": "QIG_DISPLAY",
"CRACHA": "CRACHA",
"ENCARREGADO": "ENCARREGADO_SEQ_DB"
}
},
"TABLE_SECONDARY": {
"NAME": "app_mo_boletim",
"FIELDS": {
"ENTITY": "EFETIVO_FUNCIONARIO_SEQ_DB"
}
},
"TABLE_FUNCAO": {
"NAME": "app_efetivo_funcao",
"FIELDS": {
"DESC": "DESCRICAO"
}
},
"TABLE_MENSAGEM": {
"NAME": "app_apontamento_mo_mensagem",
"FIELDS": {
"DESC": "DESCRICAO",
"ENTITY_SEQ": "EFETIVO_FUNCIONARIO_SEQ_DB",
"DEVICEMASTER": "SEQ_DB_DEVICE_MASTER_SEQ_DB",
"INS_DH": "INS_DH"
}
},
"TABLE_APT": {
"NAME": "app_mo_apt",
"FIELDS": {
"ENTITY": "EFETIVO_FUNCIONARIO_SEQ_DB",
"TIPO": "TIPO_APONTAMENTO",
"OPERACAO": "OPER_SEQ_DB",
"OPERADOR": "OPERADOR_SEQ_DB",
"DEVICEMASTER": "SEQ_DB_DEVICE_MASTER_SEQ_DB",
"LAST_UPD": "UPD_DH"
}
},
"TABLE_OPERACAO": {
"NAME": "app_oper",
"FIELDS": {
"DESC": "DESCRICAO",
"SUBATIVIDADE": "SUBATIVIDADE_PRODUCAO_SEQ_DB"
}
},
"TABLE_SUBATIVIDADE": {
"NAME": "app_subatividade",
"FIELDS": {
"DESC": "DESCRICAO"
}
}
}
STATUS_TABLE
Guarda um json com a configuração da tabela auxiliar, e seus campos.
- Exemplo:
{
"NAME": "app_mo_boletim_encarregado",
"BOLETIM_FIELD": "BOLETIM_SEQ_DB",
"ENTITY_FIELD": "ENCARREGADO_SEQ_DB"
}
CONFIG
Configurações gerais.
- Exemplo:
{
"ENCARREGADO_ORDEM": "CRACHA"
}
INDICATORS
e INDICATORS_OPTIONS
É possível adicionar o recurso de indicadores padrão do NFS também no Painel MO, o funcionamento é o mesmo já utilizado em outras partes do sistema.
REFRESH_INTERVAL
Controla o intervalo que o painel é atualizado, valor em segundos.
SQL da configuração completa do painel
INSERT INTO nfs_mo_panels
(SEQ_DB, EMPRESA, FILIAL, `LOCAL`, NAME, DISPLAY_NAME, SHORT_NAME, MAIN_TABLE, RELATIONSHIPS, SECONDARY_TABLE, REFRESH_INTERVAL, SCROLL_TIME, INDICATORS, INDICATORS_OPTIONS, INS_DH, UPD_DH, CONFIG, STATUS_TABLE)
VALUES(1, 1, 1, 1, NULL, NULL, NULL, 'app_efetivo_funcionario', '{
"TABLE_MAIN": {
"NAME": "app_efetivo_funcionario",
"FIELDS": {
"NOME": "NOME",
"FUNCAO": "EFETIVO_FUNCAO_SEQ_DB",
"FLAG": "FLAG_ENCARREGADO",
"QDISPLAY": "QIG_DISPLAY",
"CRACHA": "CRACHA",
"ENCARREGADO": "ENCARREGADO_SEQ_DB"
}
},
"TABLE_SECONDARY": {
"NAME": "app_mo_boletim",
"FIELDS": {
"ENTITY": "EFETIVO_FUNCIONARIO_SEQ_DB"
}
},
"TABLE_FUNCAO": {
"NAME": "app_efetivo_funcao",
"FIELDS": {
"DESC": "DESCRICAO"
}
},
"TABLE_MENSAGEM": {
"NAME": "app_apontamento_mo_mensagem",
"FIELDS": {
"DESC": "DESCRICAO",
"ENTITY_SEQ": "EFETIVO_FUNCIONARIO_SEQ_DB",
"DEVICEMASTER": "SEQ_DB_DEVICE_MASTER_SEQ_DB",
"INS_DH": "INS_DH"
}
},
"TABLE_APT": {
"NAME": "app_mo_apt",
"FIELDS": {
"ENTITY": "EFETIVO_FUNCIONARIO_SEQ_DB",
"TIPO": "TIPO_APONTAMENTO",
"OPERACAO": "OPER_SEQ_DB",
"OPERADOR": "OPERADOR_SEQ_DB",
"DEVICEMASTER": "SEQ_DB_DEVICE_MASTER_SEQ_DB",
"LAST_UPD": "UPD_DH"
}
},
"TABLE_OPERACAO": {
"NAME": "app_oper",
"FIELDS": {
"DESC": "DESCRICAO",
"SUBATIVIDADE": "SUBATIVIDADE_PRODUCAO_SEQ_DB"
}
},
"TABLE_SUBATIVIDADE": {
"NAME": "app_subatividade",
"FIELDS": {
"DESC": "DESCRICAO"
}
}
}', 'app_mo_boletim', 10, 5, '{
"TOTALSERVICO": {
"label": "Serviço",
"color": "green",
"icon": "fa fa-users",
"display": "[result]",
"decimalPlace": "0",
"queryBuilder": {}
},
"TOTALPERDA": {
"label": "Perda",
"color": "red",
"icon": "fa fa-window-close-o",
"display": "[result]",
"decimalPlace": "0",
"queryBuilder": {}
},
"SEMAPONTAMENTO": {
"label": "Sem Apontamento",
"color": "blue",
"icon": "fa fa-clock-o",
"display": "[result]",
"decimalPlace": "0",
"queryBuilder": {}
},
"TOTALGERAL": {
"label": "Total",
"color": "yellow",
"icon": "fa fa-calendar-times-o",
"display": "[result]",
"decimalPlace": "0",
"queryBuilder": {}
}
}', NULL, '2024-06-28 09:09:32', '2024-07-05 16:16:39', '{
"ENCARREGADO_ORDEM": "CRACHA"
}', '{
"NAME": "app_mo_boletim_encarregado",
"BOLETIM_FIELD": "BOLETIM_SEQ_DB",
"ENTITY_FIELD": "ENCARREGADO_SEQ_DB"
}');
Visão geral
O recurso possui filtros, lista de encarregados e um painel onde são exibidos em formato de cards os dados por encarregado.

Filtros
Inicialmente o recurso possui 3 filtros, por encarregados, por atividades, e se exibe atividades improdutivas ou não.

Indicadores
O componente de indicadores é o mesmo que temos em outras partes do sistema, para configurá-lo, basta seguir os passos de configuração padrão no campo INDICATORS
da tabela nfs_core_ds_tabela
para a tabela EFETIVO_FUNCIONARIO
.
A documentação dos indicadores pode ser acessada clicando aqui.
Exemplo inicial:
{
"TOTALSERVICO": {
"label": "Serviço",
"color": "green",
"icon": "fa fa-users",
"display": "[result]",
"decimalPlace": "0",
"queryBuilder": {}
},
"TOTALPERDA": {
"label": "Perda",
"color": "red",
"icon": "fa fa-window-close-o",
"display": "[result]",
"decimalPlace": "0",
"queryBuilder": {}
},
"SEMAPONTAMENTO": {
"label": "Sem Apontamento",
"color": "blue",
"icon": "fa fa-clock-o",
"display": "[result]",
"decimalPlace": "0",
"queryBuilder": {}
},
"TOTALGERAL": {
"label": "Total",
"color": "yellow",
"icon": "fa fa-calendar-times-o",
"display": "[result]",
"decimalPlace": "0",
"queryBuilder": {}
}
}
Lista de encarregados
A lista de encarregados irá mostrar todos os encarregados (EFETIVO_FUNCIONARIO com o campo QIG_DISPLAY == 1), encarregados com o ícone colorido estão com boletim aberto. O click no encarregado abre um pop-up de detalhes.

Painel - Cards encarregados
No painel são exibidos para cada encarregado um card contendo informações relacionadas ao boletim aberto.

Cards

Dentro de cada card teremos algumas informações e diferentes ações, vamos ver cada uma delas abaixo:
(1) Encarregado: Abre a tela de detalhes do encarregado.

(2) Contagem de atividades: Abre a tela de detalhes por status, "em serviço", "perda", e "sem apontamento" exibindo todos técnicos agrupados pela atividadde.

(3) Detalhes da atividade: Abre a tela de detalhes de uma atividade.

(4) Exibe a quantidade de tecnicos na equipe: Considera os técnicos relacionados ao encarregado e técnicos apontados pelo encarregado.
(5) Botões auxiliares:
-
Mapa: Abre o mapa (trajeto).
Implementando recurso
Ao liberar o recurso precisamos entender que a tabela de status será populada conforme os boletins são abertos. Caso seja necessário trazer para a tabela de status os boletins que já foram abertos, pode ser utilizado o script abaixo para trazer esses retroativos.
SET @id = (SELECT IFNULL(MAX(ID), 0) FROM app_mo_boletim_encarregado);
INSERT INTO app_mo_boletim_encarregado (EMPRESA, FILIAL, LOCAL, INS_USUARIO_SEQ_DB, BOLETIM_SEQ_DB, ENCARREGADO_SEQ_DB, ID)
SELECT
latest_boletim.EMPRESA,
latest_boletim.FILIAL,
latest_boletim.LOCAL,
latest_boletim.INS_USUARIO_SEQ_DB,
latest_boletim.SEQ_DB,
latest_boletim.EFETIVO_FUNCIONARIO_SEQ_DB,
(@id := @id + 1)
FROM
(SELECT
b.EMPRESA,
b.FILIAL,
b.LOCAL,
b.INS_USUARIO_SEQ_DB,
b.SEQ_DB,
b.EFETIVO_FUNCIONARIO_SEQ_DB,
b.INI_DH,
ROW_NUMBER() OVER (PARTITION BY b.EFETIVO_FUNCIONARIO_SEQ_DB ORDER BY b.INI_DH DESC) as rn
FROM
app_mo_boletim b
WHERE
b.FIM_DH IS NULL
AND b.EFETIVO_FUNCIONARIO_SEQ_DB IS NOT NULL) as latest_boletim
LEFT JOIN
app_mo_boletim_encarregado e
ON
latest_boletim.EFETIVO_FUNCIONARIO_SEQ_DB = e.ENCARREGADO_SEQ_DB
INNER JOIN
app_efetivo_funcionario f
ON
latest_boletim.EFETIVO_FUNCIONARIO_SEQ_DB = f.SEQ_DB
WHERE
latest_boletim.rn = 1
AND e.ENCARREGADO_SEQ_DB IS NULL;