Indicadores
No RPO ou EntryPoint busque ou crie um entry point com número 502 e com name de home_indicator . Exemplo:
INSERT INTO nfs_cloud.nfs_rpo ( `NAME`, `FILE_OR_DOMAIN`, `ACTION`, `XMOVA_INSTALLCODE`, `XMOVA_INSTALLCODE_VERSION`, `TABELA`, `ENTRY_NUM`, `CODE`, `VERSION`, `BUILD`, `ATIVO`, `CODETYPE`, `FIELD`, `DESCRIPTION`, `INS_DH`, `UPD_DH`) VALUES('home_indicator', 'SYSTEM', 'IndicatorHome', NULL, NULL, NULL, 502, '{
"osIntegracao": {
"label": "OS''s com Faturamento liberado",
"color": "red-mint",
"icon": "fa fa-file",
"display": "[result]",
"queryBuilder": {
"osIntegracao": {
"select": [
"count(c.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'')"
]
}
},
"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'')"
]
}
},
"report":{
"displayColumns": [
"Codigo",
"Cliente",
"Status"
],
"links" : {
"Codigo" : "/t/os/edit/%seq_db%"
}
}
},
"mais9Horas": {
"label": "Boletim com mais de 9 Horas",
"color": "yellow-gold",
"icon": "fa fa-clock-o",
"display": "[result]",
"queryBuilder": {
"mais9Horas": {
"select": [
"count(b.seq_db) result"
],
"from": "boletim b",
"where": [
"b.INI_DH > date_sub(now(), interval 180 DAY)",
"b.INI_FIM_DIFF_SEC >= ((3600) * 9)"
]
}
}, "queryBuilderData": {
"mais9Horas": {
"select": [
"b.SEQ_DB seq_db",
"b.FUNCIONARIO_SEQ_DB funcionario_seq_db",
"concat(f.CRACHA, '' :: '',f.NOME) Funcionário",
"b.INI_DH Início",
"b.FIM_DH Término",
"(b.INI_FIM_DIFF_SEC)/3600 Total"
],
"from": "boletim b",
"inner_join": [
[
"b",
"funcionario",
"f",
"f.SEQ_DB = b.FUNCIONARIO_SEQ_DB"
]
],
"where": [
"b.INI_DH > date_sub(now(), interval 180 DAY)",
"b.INI_FIM_DIFF_SEC >= ((3600) * 9)"
]
}
},
"report":{
"displayColumns": [
"Funcionário",
"Início",
"Término",
"Total"
],
"links" : {
"Funcionário" : "/details/1/%funcionario_seq_db%/1"
}
}
}
}', 1, 16, 1, 'JSON', NULL, NULL, '2019-07-02 17:11:04.000', '2019-08-15 16:01:42.000');
Gráfico
No RPO ou noEntryPoint Local buscar pelo entry point com número 500 e name igual a home_chart, que é a configuração do gráfico de acordo com Highcharts e o 501 e name igual a home_chart_data que é os dados que serão exibidos e usados no 500. Exemplo:
INSERT INTO nfs_cloud.nfs_rpo (`NAME`, `FILE_OR_DOMAIN`, `ACTION`, `XMOVA_INSTALLCODE`, `XMOVA_INSTALLCODE_VERSION`, `TABELA`, `ENTRY_NUM`, `CODE`, `VERSION`, `BUILD`, `ATIVO`, `CODETYPE`, `FIELD`, `DESCRIPTION`, `INS_DH`, `UPD_DH`) VALUES('home_chart_data', 'SYSTEM', 'ChartHomeData', NULL, NULL, NULL, 501, '
$data = [];
$data["categories"] = [''Jan'', ''Feb'', ''Mar'',''Apr'', ''May''];
$data["servico"] = [5216, 4380, 3176, 3798, 3109];
$data["parada"] = [2745, 3345, 3546, 3390, 2905];
$data["total"] = [7962, 7725, 6722, 7189, 6014];
$data["series"] =[
[ "x"=> 95, "y"=> 95, z=> 13.8, "name"=> ''BE'', "country"=> ''Belgium''],
["x"=> 86.5, "y"=> 102.9, z=> 14.7, "name"=> ''DE'', "country"=> ''Germany''],
["x"=> 80.8, "y"=> 91.5, z=> 15.8, "name"=> ''FI'', "country"=> ''Finland''],
["x"=> 80.4, "y"=> 102.5, z=> 12, "name"=> ''NL'', "country"=> ''Netherlands''],
["x"=> 80.3, "y"=> 86.1, z=> 11.8, "name"=> ''SE'', "country"=> ''Sweden''],
["x"=> 78.4, "y"=> 70.1, z=> 16.6, "name"=> ''ES'', "country"=> ''Spain''],
["x"=> 74.2, "y"=> 68.5, z=> 14.5, "name"=> ''FR'', "country"=> ''France''],
["x"=> 73.5, "y"=> 83.1, z=> 10, "name"=> ''NO'', "country"=> ''Norway''],
["x"=> 71, "y"=> 93.2, z=> 24.7, "name"=> ''UK'', "country"=> ''United Kingdom''],
["x"=> 69.2, "y"=> 57.6, z=> 10.4, "name"=> ''IT'', "country"=> ''Italy''],
["x"=> 68.6, "y"=> 20, z=> 16, "name"=> ''RU'', "country"=> ''Russia''],
["x"=> 65.5, "y"=> 126.4, z=> 35.3, "name"=> ''US'', "country"=> ''United States''],
["x"=> 65.4, "y"=> 50.8, z=> 28.5, "name"=> ''HU'', "country"=> ''Hungary''],
["x"=> 63.4, "y"=> 51.8, z=> 15.4, "name"=> ''PT'', "country"=> ''Portugal''],
["x"=> 64, "y"=> 82.9, z=> 31.3, "name"=> ''NZ'', "country"=> ''New Zealand'']
];
$data["pointFormatData"] = "<tr><th colspan=''2''><h3>{point.country}</h3></th></tr>
<tr><th>Fat intake:</th><td>{point.x}g</td></tr>
<tr><th>Sugar intake:</th><td>{point.y}g</td></tr>
<tr><th>Obesity (adults):</th><td>{point.z}%</td></tr>";
$this->param = $data;', 1, 10, 1, 'PHP', NULL, NULL, '2019-03-01 15:48:16.000', '2019-07-18 11:56:44.000');
INSERT INTO nfs_cloud.nfs_rpo (`NAME`, `FILE_OR_DOMAIN`, `ACTION`, `XMOVA_INSTALLCODE`, `XMOVA_INSTALLCODE_VERSION`, `TABELA`, `ENTRY_NUM`, `CODE`, `VERSION`, `BUILD`, `ATIVO`, `CODETYPE`, `FIELD`, `DESCRIPTION`, `INS_DH`, `UPD_DH`) VALUES('home_chart', 'SYSTEM', 'SetupChart', NULL, NULL, NULL, 500, '{
"chart": {
"type": "bubble",
"plotBorderWidth": 1,
"zoomType": "xy",
"borderColor": "#EBBA95",
"borderWidth": 2,
"plotBorderWidth": 1
},
"legend": {
"enabled": false
},
"title": {
"text": "Eficiência"
},
"xAxis": {
"min": 40,
"max": 160,
"tickInterval": 10,
"minorTickInterval": 1,
"minorTickColor": "#BCBCBC",
"gridLineWidth": 1,
"gridLineColor": "rgba(0,0,0,0.5)",
"minorGridLineColor": "rgba(188,188,188,0.5)",
"title": {
"text": "Eficiência"
},
"labels": {
"format": "{value} %"
},
"plotLines": [{
"color": "rgba(0,0,0,0.5)",
"dashStyle": "solid",
"width": 2,
"value": 100,
"zIndex": 3,
"label": {
"rotation": 0,
"y": 15,
"style": {
"fontStyle": "italic"
},
"text": "100% de Eficiência"
}
}]
},
"yAxis": {
"min": 25,
"max": 100,
"tickInterval": 5,
"tickColor": "#000000",
"tickWidth": 1,
"minorTickInterval": 1,
"minorTickColor": "#BCBCBC",
"gridLineColor": "rgba(0,0,0,0.5)",
"gridLineWidth": 1,
"minorGridLineColor": "rgba(188,188,188,0.5)",
"startOnTick": false,
"endOnTick": false,
"title": {
"text": "Produtividade"
},
"labels": {
"format": "{value} %"
},
"maxPadding": 1,
"plotLines": [{
"color": "rgba(0,0,0,0.5)",
"dashStyle": "solid",
"width": 2,
"value": 85,
"zIndex": 3,
"label": {
"align": "right",
"style": {
"fontStyle": "italic"
},
"text": "85% de Produtividade",
"x": -10
}
}]
},
"tooltip": {
"useHTML": true,
"headerFormat": "<table>",
"pointFormat": "%pointFormatData%",
"footerFormat": "</table>",
"followPointer": true
},
"plotOptions": {
"bubble": {
"minSize": 30
},
"series": {
"dataLabels": {
"enabled": true,
"allowOverlap": true,
"format": "{point.name}"
}
}
},
"series": [{
"data": "%series%"
}]
}', 1, 36, 1, 'JS', NULL, NULL, '2019-03-01 15:48:16.000', '2019-07-18 15:04:41.000');
Logo ou nome da Empresa no div header/topo
Se o campo nfs_org_empresa.LOGO_EMPRESA não contém uma imagem base64 começando com "data:", será apresentado o conteúdo do campo NOME (do cliente) no lugar do logo.
QRCode dos SimovaApps
Adicionar o parâmetro CORE_SIMOVAAPPS_LIST na tabela nfs_core_par_parametros
INSERT INTO `nfs_core_par_parametros` (`EMPRESA`, `FILIAL`, `LOCAL`, `NOME`, `CONTEUDO`, `TIPO`)
VALUES (1, 9999, 9999
, 'CORE_SIMOVAAPPS_LIST'
, '[{"item":"BoB.Agro",\r\n "desc" :"Módulo Equipamento",\r\n "installCodeStr": "101 000 000",\r\n "qrcode":"{\\"installCode\\":\\"20603\\",\\"idEmpresa\\":\\"1\\",\\"descricaoEmpresa\\":\\"BEVAP\\",\\"idFilial\\":\\"1\\",\\"idLocal\\":\\"1\\",\\"idChaveAcesso\\":\\"123456\\"}"\r\n},{"item":"MECANICA",\r\n "desc" :"Módulo INSUMOS",\r\n "installCodeStr": "101 ASASA ASASASA",\r\n "qrcode":"{\\"installCode\\":\\"20603\\",\\"idEmpresa\\":\\"1\\",\\"descricaoEmpresa\\":\\"BEVAP\\",\\"idFilial\\":\\"1\\",\\"idLocal\\":\\"1\\"}"\r\n},{"item":"SMARTOS",\r\n "desc" :"Módulo INSUMOS",\r\n "installCodeStr": "101 ASASA ASASASA",\r\n "qrcode":"{\\"installCode\\":\\"20603\\",\\"idEmpresa\\":\\"1\\",\\"descricaoEmpresa\\":\\"BEVAP\\",\\"idFilial\\":\\"1\\",\\"idLocal\\":\\"1\\"}"\r\n}]'
, 1);
O JSON deve seguir o modelo abaixo.
ATENÇÃO!!! O conteúdo do campo qrcode deve ser JSON com encode (usar ferramenta no NFS->Admin Console). Os parâmetros do JSON do qrcode devem representar as informações esperadas pelo AuthInput do fluxo SimovaApps. {.is-danger}
Exemplo para configurar
[{"item":"BoB.Agro",
"desc" :"Módulo Equipamento",
"installCodeStr": "101 000 000",
"qrcode":"{\"installCode\":\"20603\",\"idEmpresa\":\"1\",\"descricaoEmpresa\":\"BEVAP\",\"idFilial\":\"1\",\"idLocal\":\"1\",\"idChaveAcesso\":\"123456\"}"
},{"item":"MECANICA",
"desc" :"Módulo INSUMOS",
"installCodeStr": "101 ASASA ASASASA",
"qrcode":"{\"installCode\":\"20603\",\"idEmpresa\":\"1\",\"descricaoEmpresa\":\"BEVAP\",\"idFilial\":\"1\",\"idLocal\":\"1\"}"
},{"item":"SMARTOS",
"desc" :"Módulo INSUMOS",
"installCodeStr": "101 ASASA ASASASA",
"qrcode":"{\"installCode\":\"20603\",\"idEmpresa\":\"1\",\"descricaoEmpresa\":\"BEVAP\",\"idFilial\":\"1\",\"idLocal\":\"1\"}"
}]
Galeria de Fotos - EntryPoint 400
Criar um EntryPoint 400, tipo PHP
INSERT INTO `nfs_entry_point` (`FILE_OR_DOMAIN`, `ACTION`, `XMOVA_INSTALLCODE`, `XMOVA_INSTALLCODE_VERSION`, `EMPRESA`, `FILIAL`, `LOCAL`, `TABELA`, `ENTRY_NUM`, `CODE`, `VERSION`, `BUILD`, `ATIVO`, `CODETYPE`, `FIELD`, `DESCRIPTION`, `INS_DH`, `UPD_DH`) VALUES ('SYSTEM', NULL, NULL, NULL, 9999, 9999, 9999, NULL, 400, '$fotos = \\core\\TabelaBO::getFilteredToArray(\'APONTAMENTO_FOTO\', "INI_DH DESC", "", "SEQ_DB",10);\n$itens = [];\n$count = 0;\nforeach ($fotos as $seqBoletim => $foto) { \n if (!empty($foto[\'FOTO\'])) {\n $itens[$seqBoletim][\'image\'] = $foto[\'FOTO\'];\n $itens[$seqBoletim][\'text\'] = $foto[\'INI_DH_STR\'].\' OS:\'.$foto[\'CODIGO_OS\'];\n $itens[$seqBoletim][\'link\'] = \'/t/boletim/edit/\'.$seqBoletim;\n \n //if ($count == 2) {\n // $itens[$seqBoletim][\'style\'] = "max-height: 500px;";\n //}\n }\n $count++;\n}\n\n$gallery = new \\stdClass;\n$gallery->imgStyle = "height: 500px;";\n$gallery->title = "Últimas 10 fotos";\n$gallery->itens = $itens;\n\n$this->param = $gallery;\n', 0, 22, 1, 'PHP', NULL, NULL, '2018-05-09 09:50:01', '2018-05-09 15:25:00');
Opções
É possível definir o tamanho de uma imagem específica:
$itens[$seqBoletim]['style'] = "max-height: 500px;";
ou para toda a galeria de fotos (RECOMENDÁVEL)
$gallery->imgStyle = "height: 500px;";
Exemplo (SmartOS Dealer JD)
Registros da tabela apontamento_foto e apresentando as 10 (último parâmetro do método) fotos mais recentes (INI_DH DESC) enviadas pelos técnicos e qual o número de OS. Intenção é fazer um link para OS.
$fotos = \core\TabelaBO::getFilteredToArray('APONTAMENTO_FOTO', "INI_DH DESC", "", "SEQ_DB",10);
$itens = [];
$count = 0;
foreach ($fotos as $seqBoletim => $foto) {
if (!empty($foto['FOTO'])) {
$itens[$seqBoletim]['image'] = $foto['FOTO'];
$itens[$seqBoletim]['text'] = $foto['INI_DH_STR'].' OS:'.$foto['CODIGO_OS'];
$itens[$seqBoletim]['link'] = '/t/boletim/edit/'.$seqBoletim;
//if ($count == 2) {
// $itens[$seqBoletim]['style'] = "max-height: 500px;";
//}
}
$count++;
}
$gallery = new \stdClass;
$gallery->imgStyle = "height: 500px;";
$gallery->title = "Últimas 10 fotos";
$gallery->itens = $itens;
$this->param = $gallery;
Carrossel de Informações/Dicas
A funcionalidade 'CARROSSEL DE INFORMAÇÕES/DICAS' quando habilitada permite a inserção de Cards de Dicas que irão aparecer na Home Page da aplicação.
Configuração:
Para habilitar a funcionalidade na aplicação do cliente, é preciso definir o parâmetro 'TIPS_CAROUSEL' na tabela 'nfs_core_par_parametros', onde na coluna "CONTEUDO" o seguinte json deve ser informado: { "enabled": true, "time_interval": 3.5 } , de forma que a key "enabled" habilita a feature do carressel na págin home do cliente, e, a key "time_interval" define a velocidade do carrosel, estipulando o tempo em segundos da exibição de cada card.
Abaixo segue um exemplo de SQL INSERT de como configurar a tabela 'nfs_core_par_parametros':
INSERT INTO nfs_homol_abengoa_construmobil.nfs_core_par_parametros
(EMPRESA, FILIAL, `LOCAL`, NOME, CONTEUDO, TIPO)
VALUES(9999, 9999, 9999, 'TIPS_CAROUSEL',
'{
"enabled": true,
"time_interval": 3.5
}',
1);
Cards de dicas:
Para ter acesso a tabela de configuração dos cards, é precisar acessar e rodar em 'Admin console -> NFS ENVIRONMENT > DS/DDL (Full)' para criação da tabela 'APP_TIPS_CAROUSEL' e realizar a configuração dos novos cards.
Ao inserir um novo registro na tabela 'APP_TIPS_CAROUSEL', um novo card será renderizado na página Home da aplicação, caso este esteja marcado como 'ATIVO'.
Segue abaixo um exemplo simplificado:
INSERT INTO nfs_homol_abengoa_construmobil.app_tips_carousel
(SEQ_DB, EMPRESA, FILIAL, `LOCAL`, INS_DH, INS_USUARIO_SEQ_DB, UPD_DH, UPD_USUARIO_SEQ_DB, ATIVO, DELETED, ID, TITULO, DESCRICAO, IMAGEM, LINK, COR, SOURCE, IMAGEM_SEQ_DB, RO)
VALUES(5, 1, 1, 1, '2024-02-16 15:24:05', 3, '2024-02-16 15:56:40', 3, 1, 0, 4, 'CARD TESTE', 'TESTANDO CARD - AVISO RANDOM', NULL, 'https://simova.atlassian.net/browse/NFSCORE-666', '#efdada', NULL, 4998, 0);
Os CARDs possuem um layout padrão e fixo, novas colunas se criadas não serão utilizadas/renderizadas.
É possível adicionar uma imagem diretamente através de uma string base64 no campo IMAGEM, porém, se houver um valor no campo IMAGEM_SEQ_DB referenciando uma imagem adicionada via upload, esta terá prioridade na renderização;
As colunas 'SOURCE', 'IMAGEM_SEQ_DB' e 'RO' são criadas/utilizadas pelo CORE quando configurado o tipo UPLOAD para inserção de IMAGENS na tabela nfs_core_ds_tabela_campo;
Notas:
-
O campo 'ID' é único para cada card dentro de uma mesma 'EMPRESA-FILIAL-LOCAL';
-
O campo 'IMAGEM' é usado como uma Thumbnail para representar a informação do card. Armazena uma imagem Base64, podendo ser inserida manualmente ou via UPLOAD caso a tabela seja configurada no CRUD.
-
O campo 'COR' define o backgroud-color do Card. Recebe uma string contendo o código HEXADECIMA, ou via COLOR caso a tabela seja configurada no CRUD.
-
O campo 'LINK' define a URL do vídeo que contem mais detalhes sobre a informação do card, uma janela popup é aberta ao ser clickado.
-
O carrosel somente é renderizado se o parâmetro 'TIPS_CAROUSEL' estiver devidamente configurado e se houver cards preenchidos e sinalizados como 'ATIVO'.