Olá, Fluiger! Neste post, vamos aprender como configurar Atividade Conjunta, para garantir que todas as pessoas participem do processo de decisão com consenso.
Passo a Passo:
Seleção da Atividade: Começamos escolhendo a atividade “Aprovação de Gestores”.
Definição do Mecanismo de Atribuição: Usamos a opção “atribuição por grupo”.
Configuração da Atividade Conjunta: Marcamos a opção “atividade conjunta” e definimos o consenso, que para este exemplo será de 100%.
Exportação das Alterações: Exportamos as configurações para o servidor.
Criação e Envio de Solicitação: Criamos uma solicitação e enviamos, podendo visualizar o histórico e os detalhes das decisões tomadas.
Resultados:
A atividade é finalizada quando todas as pessoas do grupo tomam uma decisão.
Confira o vídeo completo abaixo para um tutorial detalhado:
Gostou do conteúdo? Deixe seu comentário, curta o vídeo e inscreva-se no canal para mais dicas sobre TOTVS Fluig e tecnologia! Forte abraço!!!
Olá, Fluiger! Se você é iniciante ou experiente, com certeza já se deparou com o erro DatasetFactory is not defined ao tentar invocar um dataset em um script de formulário, e corrigiu referenciando o arquivo vcXMLRPC.js.
Você já se perguntou por que devemos referenciar esse arquivo? O vcXMLRPC.js é uma biblioteca que tem como principal objetivo, abstair e facilitar requisições http à api /ecm/dataset/datasets do Fluig, utilizando o conceito de factory.
A principal factory desta biblioteca, é a DatasetFactory. É nela que encontramos as funções que utilizamos em nossas chamadas, como getDataset e createConstraint.
Vamos entender o que acontece por debaixo dos panos, quando chamamos essas funções? Inspecione a página do formulário, e na aba Sources do navegador, pesquise e acesse o arquivo vcXMLRPC.js.
O arquivo possui diversas funções, mas vamos concentrar nas principais:
DatasetFactory.createConstraint
Essa é a função que chamamos quando queremos invocar um dataset, com uma ou mais restrições (filtros). A createConstraint, cria e retorna um novo objeto chamado SearchConstraint. Na linha 216, temos a definição de SearchConstraint que recebe os argumentos que informamos (field, initialValue, finalValue, type, e likeSearch). Para initialValue e finalValue, há ainda, validações os para garantir que não sejam nulos. Se forem nulos, são substituídos por uma string especial “NULL___VALUE“.
DatasetFactory.getDataset
Essa é a função que de fato invoca um dataset. Assim como a createConstraint, também precisamos passar alguns argumentos (name, fields, constraints, order, callback), que no final serão adicionados ao objeto data.
Logo em seguida, temos uma requisição AJAX, com alguns parâmetros (url, data, async), no final, se tudo ocorrer bem, os registros do dataset serão adicionados à variável result, e retornados ao usuário.
Obs: Um dos parâmetros da requisição AJAX realizada acima, é o datasetsUrl. Trata-se de uma propriedade do objeto fluigXMLRPC, definido na linha 80. Esta propriedade é a concatenação de:
window.location.protocol: http ou https
window.location.host: endereço do seu Fluig
/api/public/ecm/data/datasets/: endpoint da API Fluig de Datasets.
É isso, Fluigers! Concluo esse post, querendo saber o que vocês acharam desse tipo de conteúdo mais voltado pra curiosidades do desenvolvimento Fluig? Deixe um comentário ou sugestão!
Olá, Fluiger! Bora aprender de uma vez por todas, a utilizar as APIs do Fluig?
Estas são recursos importantíssimos para expandir as possibilidades de desenvolvimentos em seus processos, formulários e widgets.
Eu estruturei esse tutorial em 3 tópicos:
Documentação das APIs
Como consumir dentro da plataforma
Como consumir fora da plataforma
1 – DOCUMENTAÇÃO DAS API’s
As APIs do Fluig estão disponíveis em 2 versões: ANTIGA e a NOVA, que detalharei abaixo.
1.1 – Documentação API ANTIGA Para acessar a API ANTIGA: Clique aqui
O link te levará para essa página abaixo. Podemos visualizar os nomes dos recursos (que são separados por contextos), e os seus respectivos endpoints e métodos.
Se clicarmos em um recurso, como por exemplo o DatasetServiceRest, podemos ver os endpoints e métodos desse recurso, e o que cada endpoint retornará ao usuário.
Consumo: para consumir qualquer endpoint da API ANTIGA, a url deverá ser composta pela seguinte estrutura: SERVIDOR_FLUIG + BASE_URL + ENDPOINT Exemplo: https://fluig.minhaempresa.com.br/api/public/ecm/dataset/availableDatasets
1.2 – Documentação API NOVA Para acessar a API NOVA: Clique aqui
O link te levará para essa página abaixo. Podemos visualizar os nomes dos recursos (que também são separados por contextos).
Se clicarmos em um recurso, como por exemplo o Dataset, podemos ver os endpoints e métodos desse recurso, e o que cada endpoint retornará ao usuário.
Consumo: para consumir qualquer endpoint da API NOVA, a url deverá ser composta pela seguinte estrutura: SERVIDOR + BASE_URL + ENDPOINT Exemplo: https://fluig.minhaempresa.com.br/dataset/api/v2/datasets
Informação importante: Diferente da API antiga, a BASE_URL é dinâmica, e muda conforme o recurso. Para saber qual é a BASE_URL referente ao endpoint que você usará, confira na pagina do recurso, logo abaixo o título, conforme imagem abaixo.
2 – COMO CONSUMIR AS APIs, POR DENTRO DA PLATAFORMA
Para consumirmos as APIs do Fluig, dentro da plataforma, precisaremos criar um serviço. Para isso, acesse PAINEL DE CONTROLE >> SERVIÇOS >> NOVO.
Preencha o formulário: 1 – Selecione o serviço “REST”. 2 – Informe “api-fluig” tanto para o Nome quanto para a Descrição. 3 – Informe o domínio do seu Fluig. 4 – Selecione “Fluig API” no Tipo de Autenticação. 5 – Insira no campo URL para Teste, o base_url + um endpoint do tipo GET, para testarmos esse novo serviço. 6 – Clique em salvar.
Podemos testar esse novo serviço, clicando no último ícone do respectivo serviço.
Clique em TESTAR SERVIÇO, e o retorno da API será exibido logo abaixo.
Agora, podemos consumir as APIs em eventos de processo, datasets, e widgets, usando o script abaixo. Os itens que você deverá alterar nesse script, são: o endpoint, e o method, conforme o recurso que você for usar. O resultado da requisição retornará na variável vo.
var clientService = fluigAPI.getAuthorizeClientService();
var data = {
companyId: getValue("WKCompany") + '',
serviceCode: 'api-fluig',
endpoint: '/dataset/api/v2/datasets',
method: 'get',
params: {
},
options: {
encoding: 'UTF-8',
mediaType: 'application/json',
},
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
}
//retorno
var vo = clientService.invoke(JSON.stringify(data));
3 – COMO CONSUMIR AS APIs, POR FORA DA PLATAFORMA
É possível consumir as APIs do Fluig a partir de qualquer sistema que realize requisições HTTP. Neste exemplo, consumiremos o endpoint /v2/datasets, no Postman. Se você ainda não o possui, pode baixar aqui.
Faremos a requisição, usando como método de autorização, o OAuth 1.0. Este, exige algumas informações, como: Signature Method, Consumer Key, Consumer Secret, Access Token, e Token Secret.
Para conseguir os dados de Signature Method, acesse no Fluig, PAINEL DE CONTROLE >> PARÂMETROS TÉCNICOS >> OAUTH PROVIDER. Marque o registro, e clique em Editar.
A tela a seguir será exibida, com as informações desejadas.
Agora, para conseguir os dados de Consumer Key, Consumer Secret, Access Token, eToken Secret, acesse no Fluig, PAINEL DE CONTROLE >> PARÂMETROS TÉCNICOS >> OAUTH APPLICATION.
Vamos primeiro pegar Consumer Key e Consumer Secret. Marque o registro, e clique em Editar.
Os dados serão apresentados conforme imagem abaixo.
Agora, vamos pegar Access TokeneToken Secret. Marque o registro, e clique em Usuário Aplicativo.
Os dados serão apresentados conforme imagem abaixo.
Agora que temos todos os dados em mãos, vamos para o Postman! Abra uma nova aba, e insira a url. Lembre-se de se atentar ao método, ao base_url e ao endpoint que você usará. Neste exemplo, usarei o /v2/datasets da api nova.
Em seguida, clique na aba AUTH, logo abaixo da url. Selecione o type OAUTH 1.0, e preencha os campos ao lado direito, com as informações que coletamos no painel de controle do Fluig.
Agora, é só realizarmos a requisição, clicando em SEND. A resposta será exibida abaixo:
Fique atento ao colar os dados do OAuth, pois erros como este abaixo, podem ocorrer se você inserir algo divergente:
Esse tutorial te ajudou? Então, deixe um comentário ou sugestão! Forte abraço!
Neste tutorial, vou te ensinar a criar um dataset que te retorna todos os papéis de um usuário.
O primeiro passo é acessar PAINEL DE CONTROLE >> DESENVOLVIMENTO >> DATASETS. Na tela a seguir, clique em NOVO DATASET >> SIMPLES.
Agora, informe o Código e a Descrição do dataset conforme desejado. No campo Serviço, escolha a opção AppDS.
No campo Tabela, clique no ícone da lupa.
Um modal será exibido. Clique no campo de pesquisa, escreva fdn_userrole , eclique no ícone de lupa. O resultado será exibido, clique nesta linha. Fdn_userrole é o nome da tabela que contém os registros que necessitamos.
Agora, voltamos para a tela de configuração. Se desejar, é possível remover colunas, definir um filtro, e até escolher qual a ordenação. Quando terminar, clique em Salvar.
Agora que criamos o dataset, podemos consumi-lo. Neste tutorial, mostrarei o resultado consumindo pelo Eclipse. Clique em CONSULTAR DATASET.
Filtre pelo código do dataset que você definiu, e clique em FINISH.
Todos os resultados do dataset serão exibidos. Clique em CONFIGURAR FILTRO.
Clique em NEXT até exibir a tela abaixo. Escolha a coluna LOGIN, informe a matrícula do usuário no campo VALOR INICIAL e VALOR FINAL, e clique em ADICIONAR. O filtro será exibido na caixa abaixo. Clique em FINISH.
Agora, podemos ver os registros conforme o filtro. O meu usuário nesta base, está atribuído a todos esses papéis, na coluna ROLE_CODE.
Esse tutorial te ajudou? Então, deixe um comentário ou sugestão! Forte abraço!
No post de hoje, te ajudarei a criar uma função para exportar dados de uma widget, para uma planilha excel (Isso também serve para dados que estão em um formulário).
O primeiro passo, é criar uma widget no Eclipse, acessar o arquivo view.ftl, substituir o código existente por este trecho a seguir, e salvar. Podemos observar os principais itens desse arquivo: – Linha 7: Título da nossa tabela. – Linha 11: Nossa tabela com 3 colunas. – Linha 27: O botão que acionaremos sempre que quisermos exportar os dados da nossa widget.
O segundo passo, é acessar o arquivo javascript, criado na pasta SRC>>MAIN>>WEBAPP>>RESOURCES>>JS. Agora, substitua todo o código existente por este trecho a seguir, e salve o arquivo. Podemos observar os principais itens desse arquivo:
Linha 3: Nossa fonte de dados, um array de objetos, para popular nossa tabela, e também alimentar a Planilha Excel que exportaremos. (Neste exemplo, a váriavel previsões possui dados fixos, mas poderia também receber dados de um dataset, ou de uma API externa).
Linha 36: Função que percorre todos os objetos do nosso array, e os insere nas linhas da tabela.
Linha 43: Binding para escutar o clique no botão Exportar, e chamar a função de exportação.
Linha 50: Definição da função gerarPlanilha().
Linha 56: Definição da variável csv, e a primeira atribuição de valor, com os nomes das colunas conforme desejamos na planilha, separados por ponto e vírgula, e uma quebra de linha no final.
Linha 58: Função que percorre todos os objetos do nosso array, e os concatena na variável csv, caso sejam verdadeiros, senão, é adicionado um “–“. Novamente cada valor de cada coluna inserida é separado por ponto e vírgula, seguido de uma quebra de linha “/n”, ao final de cada iteração do FOR.
Linha 85: Caso o array tenha registros
Definimos o tipo do arquivo de exportação, em hiddenElement.href
Definimos o nome do arquivo final, em hiddenElement.download
Linha 105: Executamos a função gerarPlanilha(), e o navegador iniciará o download do nosso arquivo de exportação.
var MyWidget = SuperWidget.extend({
//variáveis da widget
previsoes: [
{
'data': '13/05/2024',
'min': '18',
'max': '33'
},
{
'data': '14/05/2024',
'min': '18',
'max': '29'
},
{
'data': '15/05/2024',
'min': '16',
'max': '27'
},
{
'data': '16/05/2024',
'min': '15',
'max': '30'
},
{
'data': '17/05/2024',
'min': '20',
'max': '32'
},
],
//método iniciado quando a widget é carregada
init: function() {
for(i in this.previsoes){
$('#tbPrevisoes').append('<tr><td>'+ this.previsoes[i].data +'</td><td>'+ this.previsoes[i].min +'</td><td>'+this.previsoes[i].max +'</td></tr>');
}
},
//BIND de eventos
bindings: {
local: {
'exportar-dados': ['click_exportarDados']
},
global: {}
},
exportarDados: function () {
var gerarPlanilha = function () {
// encode
var universalBOM = "\uFEFF";
// cabeçalh
var csv = "DATA;TEMPERATURA MINIMA;TEMPERATURA MAXIMA;\n";
for (j in this.MyWidget.previsoes) {
var prev = this.MyWidget.previsoes[j]
if (!!prev.data) {
csv += `${prev.data};`
} else {
csv += "--;"
}
if (!!prev.min) {
csv += `${prev.min};`
} else {
csv += "--;"
}
if (!!prev.max) {
csv += `${prev.max};`
} else {
csv += "--;"
}
csv += "\n"
console.log("CSV FINAL: " + csv)
}
if (this.MyWidget.previsoes.length > 0) {
var hiddenElement = document.createElement("a");
hiddenElement.href = "data:text/csv; charset=ISO-8859-1," + encodeURIComponent(universalBOM + csv)
hiddenElement.target = "_blank";
hiddenElement.download = "previsoes.csv";
hiddenElement.click();
csv = "";
} else {
FLUIGC.message.alert({
message: "Não foi possível baixar o relatório, não há registros.",
title: "Mensagem",
label: "OK",
});
}
};
gerarPlanilha();
},
});
Após executar os passos acima, exporte a widget para o servidor, anexe-a em uma página, e acesse-a.
Esta é a nossa widget após o seu carregamento:
Ao clicar no botão EXPORTAR, escolha o local de salvamento.
E visualize o resultado da planilha com os dados da nossa widget!