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

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');

Como configurar indicadores

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'.